From bb5bd857166032e89040655445ebc8f2b610c14f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 25 Nov 2025 22:01:50 +1100 Subject: [PATCH 01/76] chore(deps): bump pypdf from 6.3.0 to 6.4.0 in /src/backend (#10905) * chore(deps): bump pypdf from 6.3.0 to 6.4.0 in /src/backend Bumps [pypdf](https://github.com/py-pdf/pypdf) from 6.3.0 to 6.4.0. - [Release notes](https://github.com/py-pdf/pypdf/releases) - [Changelog](https://github.com/py-pdf/pypdf/blob/main/CHANGELOG.md) - [Commits](https://github.com/py-pdf/pypdf/compare/6.3.0...6.4.0) --- updated-dependencies: - dependency-name: pypdf dependency-version: 6.4.0 dependency-type: direct:production ... Signed-off-by: dependabot[bot] * fix style --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Matthias Mair --- src/backend/requirements.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/backend/requirements.txt b/src/backend/requirements.txt index 9d26df6989..bfaeac6648 100644 --- a/src/backend/requirements.txt +++ b/src/backend/requirements.txt @@ -1482,9 +1482,9 @@ pynacl==1.6.0 \ --hash=sha256:f46386c24a65383a9081d68e9c2de909b1834ec74ff3013271f1bca9c2d233eb \ --hash=sha256:f4b3824920e206b4f52abd7de621ea7a44fd3cb5c8daceb7c3612345dfc54f2e # via paramiko -pypdf==6.3.0 \ - --hash=sha256:2d5f9741e851e378908692d571374b3cbd94582fdd1c740fcf7c029ec35ac0e6 \ - --hash=sha256:d066a2fdf8195e1811ae5a9d5a2f97f5bed0e1e7954297295eadee6357e76c5d +pypdf==6.4.0 \ + --hash=sha256:4769d471f8ddc3341193ecc5d6560fa44cf8cd0abfabf21af4e195cc0c224072 \ + --hash=sha256:55ab9837ed97fd7fcc5c131d52fcc2223bc5c6b8a1488bbf7c0e27f1f0023a79 # via -r src/backend/requirements.in pyphen==0.17.2 \ --hash=sha256:3a07fb017cb2341e1d9ff31b8634efb1ae4dc4b130468c7c39dd3d32e7c3affd \ From 0542f0608d7a54171d0b111682652e1a3722b777 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 25 Nov 2025 22:02:18 +1100 Subject: [PATCH 02/76] chore(deps): bump the dependencies group with 4 updates (#10903) Bumps the dependencies group with 4 updates: [actions/checkout](https://github.com/actions/checkout), [github/codeql-action](https://github.com/github/codeql-action), [anchore/sbom-action](https://github.com/anchore/sbom-action) and [svenstaro/upload-release-action](https://github.com/svenstaro/upload-release-action). Updates `actions/checkout` from 5.0.0 to 6.0.0 - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/08c6903cd8c0fde910a37f88322edcfb5dd907a8...1af3b93b6815bc44a9784bd300feb67ff0d1eeb3) Updates `github/codeql-action` from 4.31.2 to 4.31.5 - [Release notes](https://github.com/github/codeql-action/releases) - [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/github/codeql-action/compare/0499de31b99561a6d14a36a5f662c2a54f91beee...fdbfb4d2750291e159f0156def62b853c2798ca2) Updates `anchore/sbom-action` from 0.20.9 to 0.20.10 - [Release notes](https://github.com/anchore/sbom-action/releases) - [Changelog](https://github.com/anchore/sbom-action/blob/main/RELEASE.md) - [Commits](https://github.com/anchore/sbom-action/compare/8e94d75ddd33f69f691467e42275782e4bfefe84...fbfd9c6c189226748411491745178e0c2017392d) Updates `svenstaro/upload-release-action` from 2.11.2 to 2.11.3 - [Release notes](https://github.com/svenstaro/upload-release-action/releases) - [Changelog](https://github.com/svenstaro/upload-release-action/blob/master/CHANGELOG.md) - [Commits](https://github.com/svenstaro/upload-release-action/compare/81c65b7cd4de9b2570615ce3aad67a41de5b1a13...6b7fa9f267e90b50a19fef07b3596790bb941741) --- updated-dependencies: - dependency-name: actions/checkout dependency-version: 6.0.0 dependency-type: direct:production update-type: version-update:semver-major dependency-group: dependencies - dependency-name: github/codeql-action dependency-version: 4.31.5 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: anchore/sbom-action dependency-version: 0.20.10 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: svenstaro/upload-release-action dependency-version: 2.11.3 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/check_translations.yaml | 2 +- .github/workflows/docker.yaml | 8 +++--- .github/workflows/qc_checks.yaml | 32 +++++++++++------------ .github/workflows/release.yaml | 14 +++++----- .github/workflows/scorecard.yaml | 4 +-- .github/workflows/translations.yaml | 2 +- 6 files changed, 31 insertions(+), 31 deletions(-) diff --git a/.github/workflows/check_translations.yaml b/.github/workflows/check_translations.yaml index d16bff66f3..e41cc7befe 100644 --- a/.github/workflows/check_translations.yaml +++ b/.github/workflows/check_translations.yaml @@ -31,7 +31,7 @@ jobs: steps: - name: Checkout Code - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # pin@v5.0.0 + uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # pin@v6.0.0 with: persist-credentials: false diff --git a/.github/workflows/docker.yaml b/.github/workflows/docker.yaml index 166246ba65..9e839da766 100644 --- a/.github/workflows/docker.yaml +++ b/.github/workflows/docker.yaml @@ -39,7 +39,7 @@ jobs: docker: ${{ steps.filter.outputs.docker }} steps: - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # pin@v5.0.0 + - uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # pin@v6.0.0 with: persist-credentials: false - uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # pin@v3.0.2 @@ -67,7 +67,7 @@ jobs: steps: - name: Check out repo - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # pin@v5.0.0 + uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # pin@v6.0.0 with: persist-credentials: false - name: Test Docker Image @@ -129,7 +129,7 @@ jobs: steps: - name: Check out repo - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # pin@v5.0.0 + uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # pin@v6.0.0 with: persist-credentials: false - name: Run Migration Tests @@ -153,7 +153,7 @@ jobs: steps: - name: Check out repo - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # pin@v5.0.0 + uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # pin@v6.0.0 with: persist-credentials: false - name: Set Up Python ${{ env.python_version }} diff --git a/.github/workflows/qc_checks.yaml b/.github/workflows/qc_checks.yaml index dbc78523a1..07ef26a5b0 100644 --- a/.github/workflows/qc_checks.yaml +++ b/.github/workflows/qc_checks.yaml @@ -41,7 +41,7 @@ jobs: requirements: ${{ steps.filter.outputs.requirements }} steps: - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # pin@v5.0.0 + - uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # pin@v6.0.0 with: persist-credentials: false - uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # pin@v3.0.2 @@ -82,7 +82,7 @@ jobs: if: needs.paths-filter.outputs.cicd == 'true' || needs.paths-filter.outputs.server == 'true' || needs.paths-filter.outputs.frontend == 'true' || needs.paths-filter.outputs.requirements == 'true' || needs.paths-filter.outputs.force == 'true' steps: - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # pin@v5.0.0 + - uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # pin@v6.0.0 with: persist-credentials: false - name: Set up Python ${{ env.python_version }} @@ -104,7 +104,7 @@ jobs: if: needs.paths-filter.outputs.server == 'true' || needs.paths-filter.outputs.requirements == 'true' || needs.paths-filter.outputs.force == 'true' steps: - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # pin@v5.0.0 + - uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # pin@v6.0.0 with: persist-credentials: false - name: Environment Setup @@ -126,7 +126,7 @@ jobs: steps: - name: Checkout Code - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # pin@v5.0.0 + uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # pin@v6.0.0 with: persist-credentials: false - name: Set up Python ${{ env.python_version }} @@ -164,7 +164,7 @@ jobs: version: ${{ steps.version.outputs.version }} steps: - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # pin@v5.0.0 + - uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # pin@v6.0.0 with: persist-credentials: false - name: Environment Setup @@ -249,7 +249,7 @@ jobs: version: ${{ needs.schema.outputs.version }} steps: - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # pin@v5.0.0 + - uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # pin@v6.0.0 name: Checkout Code with: repository: inventree/schema @@ -302,7 +302,7 @@ jobs: INVENTREE_LOG_LEVEL: WARNING steps: - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # pin@v5.0.0 + - uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # pin@v6.0.0 with: persist-credentials: true - name: Environment Setup @@ -346,7 +346,7 @@ jobs: python_version: ${{ matrix.python_version }} steps: - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # pin@v5.0.0 + - uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # pin@v6.0.0 with: persist-credentials: false - name: Environment Setup @@ -410,7 +410,7 @@ jobs: - 6379:6379 steps: - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # pin@v5.0.0 + - uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # pin@v6.0.0 with: persist-credentials: false - name: Environment Setup @@ -458,7 +458,7 @@ jobs: - 3306:3306 steps: - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # pin@v5.0.0 + - uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # pin@v6.0.0 with: persist-credentials: false - name: Environment Setup @@ -500,7 +500,7 @@ jobs: - 5432:5432 steps: - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # pin@v5.0.0 + - uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # pin@v6.0.0 with: persist-credentials: false - name: Environment Setup @@ -534,7 +534,7 @@ jobs: INVENTREE_PLUGINS_ENABLED: false steps: - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # pin@v5.0.0 + - uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # pin@v6.0.0 with: persist-credentials: false name: Checkout Code @@ -613,7 +613,7 @@ jobs: VITE_COVERAGE_BUILD: true steps: - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # pin@v5.0.0 + - uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # pin@v6.0.0 with: persist-credentials: false - name: Environment Setup @@ -663,7 +663,7 @@ jobs: timeout-minutes: 60 steps: - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # pin@v5.0.0 + - uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # pin@v6.0.0 with: persist-credentials: false - name: Environment Setup @@ -696,7 +696,7 @@ jobs: security-events: write steps: - name: Checkout repository - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # pin@v5.0.0 + uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # pin@v6.0.0 with: persist-credentials: false - uses: hynek/setup-cached-uv@757bedc3f972eb7227a1aa657651f15a8527c817 # pin@v2 @@ -705,7 +705,7 @@ jobs: env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Upload SARIF file - uses: github/codeql-action/upload-sarif@0499de31b99561a6d14a36a5f662c2a54f91beee # pin@v3 + uses: github/codeql-action/upload-sarif@fdbfb4d2750291e159f0156def62b853c2798ca2 # pin@v3 with: sarif_file: results.sarif category: zizmor diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 00f20bb4a1..fb8161dc80 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -20,7 +20,7 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} steps: - name: Checkout Code - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # pin@v5.0.0 + uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # pin@v6.0.0 with: persist-credentials: false - name: Version Check @@ -43,7 +43,7 @@ jobs: contents: write attestations: write steps: - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # pin@v5.0.0 + - uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # pin@v6.0.0 with: persist-credentials: false - name: Environment Setup @@ -55,7 +55,7 @@ jobs: - name: Build frontend run: cd src/frontend && npm run compile && npm run build - name: Create SBOM for frontend - uses: anchore/sbom-action@8e94d75ddd33f69f691467e42275782e4bfefe84 # pin@v0 + uses: anchore/sbom-action@fbfd9c6c189226748411491745178e0c2017392d # pin@v0 with: artifact-name: frontend-build.spdx path: src/frontend @@ -76,7 +76,7 @@ jobs: subject-path: "${{ github.workspace }}/src/backend/InvenTree/web/static/frontend-build.zip" - name: Upload frontend - uses: svenstaro/upload-release-action@81c65b7cd4de9b2570615ce3aad67a41de5b1a13 # pin@2.11.2 + uses: svenstaro/upload-release-action@6b7fa9f267e90b50a19fef07b3596790bb941741 # pin@2.11.3 with: repo_token: ${{ secrets.GITHUB_TOKEN }} file: src/backend/InvenTree/web/static/frontend-build.zip @@ -84,7 +84,7 @@ jobs: tag: ${{ github.ref }} overwrite: true - name: Upload Attestation - uses: svenstaro/upload-release-action@81c65b7cd4de9b2570615ce3aad67a41de5b1a13 # pin@2.11.2 + uses: svenstaro/upload-release-action@6b7fa9f267e90b50a19fef07b3596790bb941741 # pin@2.11.3 with: repo_token: ${{ secrets.GITHUB_TOKEN }} asset_name: frontend-build.intoto.jsonl @@ -107,7 +107,7 @@ jobs: INVENTREE_DEBUG: true steps: - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # pin@v5.0.0 + - uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # pin@v6.0.0 with: persist-credentials: false - name: Environment Setup @@ -127,7 +127,7 @@ jobs: cd docs/site zip -r docs-html.zip * - name: Publish documentation - uses: svenstaro/upload-release-action@81c65b7cd4de9b2570615ce3aad67a41de5b1a13 # pin@2.11.2 + uses: svenstaro/upload-release-action@6b7fa9f267e90b50a19fef07b3596790bb941741 # pin@2.11.3 with: repo_token: ${{ secrets.GITHUB_TOKEN }} file: docs/site/docs-html.zip diff --git a/.github/workflows/scorecard.yaml b/.github/workflows/scorecard.yaml index 8925802f8f..ddfb5c3f3e 100644 --- a/.github/workflows/scorecard.yaml +++ b/.github/workflows/scorecard.yaml @@ -32,7 +32,7 @@ jobs: steps: - name: "Checkout code" - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0 with: persist-credentials: false @@ -67,6 +67,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: "Upload to code-scanning" - uses: github/codeql-action/upload-sarif@0499de31b99561a6d14a36a5f662c2a54f91beee # v4.31.2 + uses: github/codeql-action/upload-sarif@fdbfb4d2750291e159f0156def62b853c2798ca2 # v4.31.5 with: sarif_file: results.sarif diff --git a/.github/workflows/translations.yaml b/.github/workflows/translations.yaml index f27dc5932c..2da438acd6 100644 --- a/.github/workflows/translations.yaml +++ b/.github/workflows/translations.yaml @@ -32,7 +32,7 @@ jobs: steps: - name: Checkout Code - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # pin@v5.0.0 + uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # pin@v6.0.0 with: persist-credentials: true - name: Environment Setup From df6cbca197a2fea9ab961d9387dbe90b8ea40768 Mon Sep 17 00:00:00 2001 From: Oliver Date: Tue, 25 Nov 2025 23:19:18 +1100 Subject: [PATCH 03/76] Check / uncheck shipments from table (#10907) --- src/frontend/src/forms/SalesOrderForms.tsx | 65 ++++++++++++++++++- .../pages/sales/SalesOrderShipmentDetail.tsx | 48 +++----------- .../tables/sales/SalesOrderShipmentTable.tsx | 50 +++++++++++++- 3 files changed, 121 insertions(+), 42 deletions(-) diff --git a/src/frontend/src/forms/SalesOrderForms.tsx b/src/frontend/src/forms/SalesOrderForms.tsx index 36a0963e7f..7550534dc0 100644 --- a/src/frontend/src/forms/SalesOrderForms.tsx +++ b/src/frontend/src/forms/SalesOrderForms.tsx @@ -1,8 +1,10 @@ import { t } from '@lingui/core/macro'; -import { Table } from '@mantine/core'; +import { Alert, Table, Text } from '@mantine/core'; import { IconAddressBook, IconCalendar, + IconCircleCheck, + IconCircleX, IconCoins, IconUser, IconUsers @@ -23,8 +25,9 @@ import type { ApiFormFieldType } from '@lib/types/Forms'; import type { TableFieldRowProps } from '../components/forms/fields/TableField'; -import { useCreateApiFormModal } from '../hooks/UseForm'; +import { useCreateApiFormModal, useEditApiFormModal } from '../hooks/UseForm'; import { useGlobalSettingsState } from '../states/SettingsStates'; +import { useUserState } from '../states/UserState'; import { RenderPartColumn } from '../tables/ColumnRenderers'; export function useSalesOrderFields({ @@ -190,6 +193,64 @@ export function useSalesOrderLineItemFields({ }, [salePrice, partCurrency, orderId, create]); } +export function useCheckShipmentForm({ + shipmentId, + onSuccess +}: { + shipmentId: number; + onSuccess: (response: any) => void; +}) { + const user = useUserState(); + + return useEditApiFormModal({ + url: ApiEndpoints.sales_order_shipment_list, + pk: shipmentId, + title: t`Check Shipment`, + preFormContent: ( + } title={t`Check Shipment`}> + {t`Marking the shipment as checked indicates that you have verified that all items included in this shipment are correct`} + + ), + fetchInitialData: false, + fields: { + checked_by: { + hidden: true, + value: user.getUser()?.pk + } + }, + successMessage: t`Shipment marked as checked`, + onFormSuccess: onSuccess + }); +} + +export function useUncheckShipmentForm({ + shipmentId, + onSuccess +}: { + shipmentId: number; + onSuccess: (response: any) => void; +}) { + return useEditApiFormModal({ + url: ApiEndpoints.sales_order_shipment_list, + pk: shipmentId, + title: t`Uncheck Shipment`, + preFormContent: ( + } title={t`Uncheck Shipment`}> + {t`Marking the shipment as unchecked indicates that the shipment requires further verification`} + + ), + fetchInitialData: false, + fields: { + checked_by: { + hidden: true, + value: null + } + }, + successMessage: t`Shipment marked as unchecked`, + onFormSuccess: onSuccess + }); +} + function SalesOrderAllocateLineRow({ props, record, diff --git a/src/frontend/src/pages/sales/SalesOrderShipmentDetail.tsx b/src/frontend/src/pages/sales/SalesOrderShipmentDetail.tsx index 3353b44278..153933dac9 100644 --- a/src/frontend/src/pages/sales/SalesOrderShipmentDetail.tsx +++ b/src/frontend/src/pages/sales/SalesOrderShipmentDetail.tsx @@ -1,5 +1,5 @@ import { t } from '@lingui/core/macro'; -import { Alert, Grid, Skeleton, Stack, Text } from '@mantine/core'; +import { Grid, Skeleton, Stack, Text } from '@mantine/core'; import { IconBookmark, IconCircleCheck, @@ -39,8 +39,10 @@ import { RenderAddress } from '../../components/render/Company'; import { RenderUser } from '../../components/render/User'; import { formatDate } from '../../defaults/formatters'; import { + useCheckShipmentForm, useSalesOrderShipmentCompleteFields, - useSalesOrderShipmentFields + useSalesOrderShipmentFields, + useUncheckShipmentForm } from '../../forms/SalesOrderForms'; import { useCreateApiFormModal, @@ -320,44 +322,14 @@ export default function SalesOrderShipmentDetail() { onFormSuccess: refreshShipment }); - const checkShipment = useEditApiFormModal({ - url: ApiEndpoints.sales_order_shipment_list, - pk: shipment.pk, - title: t`Check Shipment`, - preFormContent: ( - } title={t`Check Shipment`}> - {t`Marking the shipment as checked indicates that you have verified that all items included in this shipment are correct`} - - ), - fetchInitialData: false, - fields: { - checked_by: { - hidden: true, - value: userId - } - }, - successMessage: t`Shipment marked as checked`, - onFormSuccess: refreshShipment + const checkShipment = useCheckShipmentForm({ + shipmentId: shipment.pk, + onSuccess: refreshShipment }); - const uncheckShipment = useEditApiFormModal({ - url: ApiEndpoints.sales_order_shipment_list, - pk: shipment.pk, - title: t`Uncheck Shipment`, - preFormContent: ( - } title={t`Uncheck Shipment`}> - {t`Marking the shipment as unchecked indicates that the shipment requires further verification`} - - ), - fetchInitialData: false, - fields: { - checked_by: { - hidden: true, - value: null - } - }, - successMessage: t`Shipment marked as unchecked`, - onFormSuccess: refreshShipment + const uncheckShipment = useUncheckShipmentForm({ + shipmentId: shipment.pk, + onSuccess: refreshShipment }); const shipmentBadges = useMemo(() => { diff --git a/src/frontend/src/tables/sales/SalesOrderShipmentTable.tsx b/src/frontend/src/tables/sales/SalesOrderShipmentTable.tsx index 7834c79e4c..1727cad418 100644 --- a/src/frontend/src/tables/sales/SalesOrderShipmentTable.tsx +++ b/src/frontend/src/tables/sales/SalesOrderShipmentTable.tsx @@ -1,5 +1,9 @@ import { t } from '@lingui/core/macro'; -import { IconTruckDelivery } from '@tabler/icons-react'; +import { + IconCircleCheck, + IconCircleX, + IconTruckDelivery +} from '@tabler/icons-react'; import { useCallback, useMemo, useState } from 'react'; import { useNavigate } from 'react-router-dom'; @@ -19,8 +23,10 @@ import type { TableFilter } from '@lib/types/Filters'; import type { TableColumn } from '@lib/types/Tables'; import dayjs from 'dayjs'; import { + useCheckShipmentForm, useSalesOrderShipmentCompleteFields, - useSalesOrderShipmentFields + useSalesOrderShipmentFields, + useUncheckShipmentForm } from '../../forms/SalesOrderForms'; import { useCreateApiFormModal, @@ -91,6 +97,20 @@ export default function SalesOrderShipmentTable({ table: table }); + const checkShipment = useCheckShipmentForm({ + shipmentId: selectedShipment.pk, + onSuccess: () => { + table.refreshTable(); + } + }); + + const uncheckShipment = useUncheckShipmentForm({ + shipmentId: selectedShipment.pk, + onSuccess: () => { + table.refreshTable(); + } + }); + const completeShipment = useCreateApiFormModal({ url: ApiEndpoints.sales_order_shipment_complete, pk: selectedShipment.pk, @@ -188,6 +208,30 @@ export default function SalesOrderShipmentTable({ const shipped: boolean = !!record.shipment_date; return [ + { + hidden: + !!record.checked_by || !user.hasChangeRole(UserRoles.sales_order), + title: t`Check Shipment`, + color: 'blue', + icon: , + onClick: () => { + setSelectedShipment(record); + checkShipment.open(); + } + }, + { + hidden: + shipped || + !record.checked_by || + !user.hasChangeRole(UserRoles.sales_order), + title: t`Uncheck Shipment`, + color: 'red', + icon: , + onClick: () => { + setSelectedShipment(record); + uncheckShipment.open(); + } + }, { hidden: shipped || !user.hasChangeRole(UserRoles.sales_order), title: t`Complete Shipment`, @@ -271,7 +315,9 @@ export default function SalesOrderShipmentTable({ <> {newShipment.modal} {editShipment.modal} + {checkShipment.modal} {deleteShipment.modal} + {uncheckShipment.modal} {completeShipment.modal} Date: Tue, 25 Nov 2025 19:26:14 -0800 Subject: [PATCH 04/76] docs: brief writeup for env-vars on webserver in Dockerfile (#10906) * docs: brief writeup for env-vars on webserver in Dockerfile Mates with https://github.com/inventree/InvenTree/pull/10900 nit, fix: spacing 2 -> 1 * docs: relocate And simplify --------- Co-authored-by: Karl Quinsland --- docs/docs/start/docker_install.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/docs/docs/start/docker_install.md b/docs/docs/start/docker_install.md index 3ae72c5082..0e53c85f7d 100644 --- a/docs/docs/start/docker_install.md +++ b/docs/docs/start/docker_install.md @@ -235,6 +235,20 @@ The [Caddy](./docker.md#ssl-certificates) container will automatically generate Any persistent files generated by the Caddy container (such as certificates, etc) will be stored in the `caddy` directory within the external volume. +### Web Server Bind Address + +By default, the Dockerized InvenTree web server binds to all available network interfaces and listens for IPv4 traffic on port 8000. +This can be adjusted using the following environment variables: + +| Environment Variable | Default | +| --- | --- | --- | --- | +| INVENTREE_WEB_ADDR | 0.0.0.0 | +| INVENTREE_WEB_PORT | 8000 | + +These variables are combined in the [Dockerfile](../../../contrib/container/Dockerfile) to build the bind string passed to the InvenTree server on startup. + +To enable IPv6/Dual Stack support, set `INVENTREE_WEB_ADDR` to `[::]` when you create/start the container. + ### Demo Dataset To quickly get started with a [demo dataset](../demo.md), you can run the following command: From 16b600af88738629ceae9323e09ab702014ef90b Mon Sep 17 00:00:00 2001 From: Oliver Date: Wed, 26 Nov 2025 21:27:13 +1100 Subject: [PATCH 05/76] Docs updates (#10912) - Small tweaks / additions --- docs/docs/faq.md | 4 ++-- docs/docs/start/index.md | 7 +++++-- docs/docs/troubleshooting.md | 6 ++++++ 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/docs/docs/faq.md b/docs/docs/faq.md index 47617dadc6..3f3bbe01f3 100644 --- a/docs/docs/faq.md +++ b/docs/docs/faq.md @@ -98,7 +98,7 @@ Sometimes, users may encounter unexpected error messages when updating their Inv The most common problem here is that the correct sequence of steps has not been followed: -1. Ensure that the InvenTree web server and background worker processes are *halted* +1. Ensure that the InvenTree [web server](./start/processes.md#web-server) and [background worker](./start/processes.md#background-worker) processes are *halted* 1. Update the InvenTree software (e.g. using git or docker, depending on installation method) 1. Run the `invoke update` command 1. Restart the web server and background worker processes @@ -150,7 +150,7 @@ or ### Background Worker "Not Running" -The background worker process must be started separately to the web-server application. +The [background worker process](./start/processes.md#background-worker) must be started separately to the web-server application. From the top-level source directory, run the following command from a separate terminal, while the server is already running: diff --git a/docs/docs/start/index.md b/docs/docs/start/index.md index 9a5b6b8937..c88c642976 100644 --- a/docs/docs/start/index.md +++ b/docs/docs/start/index.md @@ -123,11 +123,14 @@ By default, a production InvenTree installation is configured to run with [DEBUG Running in DEBUG mode provides many handy development features, however it is strongly recommended *NOT* to run in DEBUG mode in a production environment. This recommendation is made because DEBUG mode leaks a lot of information about your installation and may pose a security risk. -So, for a production setup, you should set `INVENTREE_DEBUG=false` in the [configuration options](./config.md). +So, for a production setup, you should ensure that `INVENTREE_DEBUG=false` in the [configuration options](./config.md). + +!!! warning "Security Risk" + Running InvenTree in DEBUG mode in a production environment is a significant security risk, and should be avoided at all costs. ### Turning Debug Mode off -When running in DEBUG mode, the InvenTree web server natively manages *static* and *media* files, which means that when DEBUG mode is *disabled*, the proxy setup has to be configured to handle this. +When running in DEBUG mode, the InvenTree web server natively manages *static* and *media* files, which means that when DEBUG mode is *disabled* (which is the default for a production setup), the proxy setup has to be configured to handle this. !!! info "Read More" Refer to the [proxy server documentation](./processes.md#proxy-server) for more details diff --git a/docs/docs/troubleshooting.md b/docs/docs/troubleshooting.md index c2b5b7f71e..1c34fd02f7 100644 --- a/docs/docs/troubleshooting.md +++ b/docs/docs/troubleshooting.md @@ -9,6 +9,12 @@ If you are struggling with an issue which is not covered in the FAQ above, pleas Even if you cannot immediately resolve the issue, the information below will be very useful when reporting the issue on GitHub. +## Error Codes + +InvenTree uses a system of error codes to help identify specific issues. Each error code is prefixed with `INVE-`, followed by a letter indicating the error type, and a number. + +Refer to the [error code documentation](./settings/error_codes.md) for more information on specific error codes. + ## Recent Update If you have recently updated your InvenTree instance, please ensure that you have followed all update instructions carefully. In particular, make sure that you have run any required database migrations using the `invoke update` command. From 5713cff1cbc2b66b875ae70eecfc979326043d56 Mon Sep 17 00:00:00 2001 From: Oliver Date: Wed, 26 Nov 2025 22:32:57 +1100 Subject: [PATCH 06/76] [bug] Stock adjust (#10914) * Extra checks on backend * Bug fix for adjustment forms - Set default quantity of zero * Additional unit testing (to ensure no regression) --- src/backend/InvenTree/stock/serializers.py | 8 ++++++++ src/frontend/src/forms/StockForms.tsx | 22 +++++++++++++++++++--- src/frontend/tests/pages/pui_stock.spec.ts | 10 ++++++++++ 3 files changed, 37 insertions(+), 3 deletions(-) diff --git a/src/backend/InvenTree/stock/serializers.py b/src/backend/InvenTree/stock/serializers.py index 421d943cf2..490ee2dc87 100644 --- a/src/backend/InvenTree/stock/serializers.py +++ b/src/backend/InvenTree/stock/serializers.py @@ -1678,6 +1678,10 @@ class StockAddSerializer(StockAdjustmentSerializer): stock_item = item['pk'] quantity = item['quantity'] + if quantity is None or quantity <= 0: + # Ignore in this case - no stock to add + continue + # Optional fields extra = {} @@ -1703,6 +1707,10 @@ class StockRemoveSerializer(StockAdjustmentSerializer): stock_item = item['pk'] quantity = item['quantity'] + # Ignore in this case - no stock to remove + if quantity is None or quantity <= 0: + continue + # Optional fields extra = {} diff --git a/src/frontend/src/forms/StockForms.tsx b/src/frontend/src/forms/StockForms.tsx index 508d7415c3..70476d591e 100644 --- a/src/frontend/src/forms/StockForms.tsx +++ b/src/frontend/src/forms/StockForms.tsx @@ -862,10 +862,17 @@ function stockRemoveFields(items: any[]): ApiFormFieldSet { const records = Object.fromEntries(items.map((item) => [item.pk, item])); + const initialValue = mapAdjustmentItems(items).map((elem) => { + return { + ...elem, + quantity: 0 + }; + }); + const fields: ApiFormFieldSet = { items: { field_type: 'table', - value: mapAdjustmentItems(items), + value: initialValue, modelRenderer: (row: TableFieldRowProps) => { const record = records[row.item.pk]; @@ -902,10 +909,17 @@ function stockAddFields(items: any[]): ApiFormFieldSet { const records = Object.fromEntries(items.map((item) => [item.pk, item])); + const initialValue = mapAdjustmentItems(items).map((elem) => { + return { + ...elem, + quantity: 0 + }; + }); + const fields: ApiFormFieldSet = { items: { field_type: 'table', - value: mapAdjustmentItems(items), + value: initialValue, modelRenderer: (row: TableFieldRowProps) => { const record = records[row.item.pk]; @@ -941,10 +955,12 @@ function stockCountFields(items: any[]): ApiFormFieldSet { const records = Object.fromEntries(items.map((item) => [item.pk, item])); + const initialValue = mapAdjustmentItems(items); + const fields: ApiFormFieldSet = { items: { field_type: 'table', - value: mapAdjustmentItems(items), + value: initialValue, modelRenderer: (row: TableFieldRowProps) => { return ( { await page.getByRole('button', { name: 'Scan', exact: true }).click(); await page.getByText('Scanned stock item into location').waitFor(); + // Add "zero" stock - ensure the quantity stays the same + await launchStockAction('add'); + await page.getByRole('button', { name: 'Submit' }).click(); + await page.getByText('Quantity: 123').first().waitFor(); + // Add stock, and change status await launchStockAction('add'); await page.getByLabel('number-field-quantity').fill('12'); @@ -342,6 +347,11 @@ test('Stock - Stock Actions', async ({ browser }) => { await page.getByText('Unavailable').first().waitFor(); await page.getByText('135').first().waitFor(); + // Remove "zero" stock - ensure the quantity stays the same + await launchStockAction('remove'); + await page.getByRole('button', { name: 'Submit' }).click(); + await page.getByText('Quantity: 135').first().waitFor(); + // Remove stock, and change status await launchStockAction('remove'); await page.getByLabel('number-field-quantity').fill('99'); From 3a4981056ba7c28b401f3ca8d0aea78212d84575 Mon Sep 17 00:00:00 2001 From: Oliver Date: Fri, 28 Nov 2025 09:05:47 +1100 Subject: [PATCH 07/76] Add note regarding redis password restrictions (#10925) --- docs/docs/start/config.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docs/docs/start/config.md b/docs/docs/start/config.md index 2dec53c44f..ef4cd5ca5a 100644 --- a/docs/docs/start/config.md +++ b/docs/docs/start/config.md @@ -266,6 +266,9 @@ The following database options can be configured: | INVENTREE_DB_HOST | database.HOST | Database host address (if required) | *Not specified* | | INVENTREE_DB_PORT | database.PORT | Database host port (if required) | *Not specified* | +!!! tip "Database Password" + The value specified for `INVENTREE_DB_PASSWORD` should not contain comma `,` or colon `:` characters, otherwise the connection to the database may fail. + ### PostgreSQL Settings If running with a PostgreSQL database backend, the following additional options are available: @@ -318,6 +321,9 @@ The following cache settings are available: | INVENTREE_CACHE_KEEPALIVE_INTERVAL | cache.keepalive_interval | Cache keepalive interval | 1 | | INVENTREE_CACHE_USER_TIMEOUT | cache.user_timeout | Cache user timeout | 1000 | +!!! tip "Cache Password" + The value specified for `INVENTREE_CACHE_PASSWORD` should not contain comma `,` or colon `:` characters, otherwise the connection to the cache server may fail. + ## Email Settings To enable [email functionality](../settings/email.md), email settings must be configured here, either via environment variables or within the configuration file. From 3b6b702bd5ffee3cc33ca0be34e4ec6f001b8254 Mon Sep 17 00:00:00 2001 From: Oliver Date: Fri, 28 Nov 2025 12:54:16 +1100 Subject: [PATCH 08/76] Stock availability docs (#10927) * Add deficit stock badge * screenshots * Add "stock availability" page * Update stock index page --- .../images/stock/build_order_allocations.png | Bin 0 -> 104279 bytes .../images/stock/sales_order_allocations.png | Bin 0 -> 56896 bytes .../docs/assets/images/stock/stock_detail.png | Bin 0 -> 42195 bytes .../assets/images/stock/stock_overview.png | Bin 0 -> 19743 bytes docs/docs/stock/availability.md | 88 ++++++++++++++++++ docs/docs/stock/index.md | 12 ++- docs/mkdocs.yml | 3 +- src/frontend/src/pages/part/PartDetail.tsx | 8 ++ 8 files changed, 105 insertions(+), 6 deletions(-) create mode 100644 docs/docs/assets/images/stock/build_order_allocations.png create mode 100644 docs/docs/assets/images/stock/sales_order_allocations.png create mode 100644 docs/docs/assets/images/stock/stock_detail.png create mode 100644 docs/docs/assets/images/stock/stock_overview.png create mode 100644 docs/docs/stock/availability.md diff --git a/docs/docs/assets/images/stock/build_order_allocations.png b/docs/docs/assets/images/stock/build_order_allocations.png new file mode 100644 index 0000000000000000000000000000000000000000..d5a32d9eec52d6bea878c653b82dfa94602f5c2e GIT binary patch literal 104279 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�x;Rfw{;h-m1C|2#8$XVh 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 literal 0 HcmV?d00001 diff --git a/docs/docs/assets/images/stock/sales_order_allocations.png b/docs/docs/assets/images/stock/sales_order_allocations.png new file mode 100644 index 0000000000000000000000000000000000000000..1b50d86ff2f98a1923e7a22531894e22cd87949b GIT binary patch literal 56896 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 a50*i@Qx=Sb>jR`QC`;t1R`$6ub0}O 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 Yt4EIw?~_$>Z0FoU8JZcC>EW;c8~tV%Bme*a literal 0 HcmV?d00001 diff --git a/docs/docs/assets/images/stock/stock_overview.png b/docs/docs/assets/images/stock/stock_overview.png new file mode 100644 index 0000000000000000000000000000000000000000..5efbf9927cd111c9ee6693f532c826cfb0a661b2 GIT binary patch literal 19743 zcmbTe2UJr_7e9&>3&>S3C|v|ZKtSm|D$=F*5)df?LXloWKonG(Ql*9t0YZn+5s}_o zAcQKNP^5&CknqC&zI(mjdhh+$TkotjaAwZTIaBuD^P4@t$wy6fMe1t|*C;3`sFjso zXj4#7J|*9$U%5>F8%GD7CI36;rmgs#qPU-FjU2fMdZzY_f}$+y`iaFQa{THWB_lTq ziW{wG;arDvz7++<%Sz=J&vd=bHm803Z+nnBb`G=GTC^S>a3#1$4^L^n z_r15+PsRB?-NpR*-g6N}coTt!r_+~i(rD6s#$D9C_(JR5wTHR}iw_mKbywr80-(K% zNe}FXFHGWnWm$%n2}B#g7-dzdZGV7yR({QoKgqTE?=^akA9UgG2nEHc{>Aj)v308R zn!jTnAz$kK1i*pk|4GWfO*JBX_362P5=O7aemiUGe=beXAOFrQbmiYU>HiNOx_s{8 z-|wIZlx%&hHsUVY9zFNwpF|3!4;FX(b8F%l1LH@ieQ$ig&o?Yfs-+h_w7UWyXu^EwvTPA>kF z;XSb&~6QuuMRceV8u|}}JqZAbO1-rYwg8%A;|MS57Z+`_-{2t$@sn7oPq4fTH z6#pKcySa8r8PueDmMBGed3hBL4Vq2bu^o{Kk~<7FW=~AkZNk5-p?!$jlM5ttQP8m(Jlfz^N;TH&G$*TT^CuLdA;JZy;>3#S=jd)7$AxaUKtxwbzKK+PKI(-3=85$S`SiTP~bKpi*(Ly%ZPz7-K z__A+GU$k@*$!rN_BlG9wDNXY|XC+V3aoNoncNHBSlj;yr-%4);_tJ5txbU~BpCbZ- z?(Tldn>r$!AAK37WwVT1T7ob&C_ zkvFb~y9!a)d$_J;l-cz!zw;-5wGqW5Kf+(VPGOQGCu0u<%S1St7buG*tn;4E-P!F&IW}q(HD^w!l0((s2Fy8Zv79)U5XO7}9Sp_Tp9xbNO-30(S2W>b~ zFZ)#GgpL91UL-BgCS~ip+D+Z|^g;2p`P#xQrlFZl%jRGH+@14gMqtwzb79W(#n<_L z4Ou1Yd3y&}gZLphvrfqvlTWzG%L(|9igNcYRklPZx>;9ej|l=;vLgpR?3w z=)xvThE8}*yMe|GrU~T@<6V17O)OUGRv^V#tq<1>0*k0nr6Sd{M%l%3>2d!{@!d3opirR45=~tAgn?T9$ z&;Wh!;FgAwGnJ@ymtWnP{aj=g!UYX zt$<@1zMyAz_q?TYkV2iit9hyOY&)Nm&t#fbVc9__C%*Xe_@kR~{t(Bq!wma0b{^;- zzQ+O#enW47Z)UYuKGZOcbeEoQx_-hmSJ&Id?vK{kQA}8fU6grhmCKZn__ul_9kJ6D6xRl9pd`tihpLq9=Qi z_^WBYZZ7`)@HQ8AdPM=A<@WTgr0Ir!3ALFT3_E0yxb@jXhBzfzmov(%sUYf|JgT@p zi28iq+W5AXd`ZdcO}Q}{MR&kj+mlw0mKg9TR-gj6HBC&p@N+l=sfrNw7JY`{hMf>UX`^iW@3^3`X5i`i4Y zJw~dhsTIpAIJ?XWN`pV&UrY;`6r(q#yA4;s75FNzwJXQ_#;ZF5zj(yn4Db*c zt7ov+qGr0TQ+l$|noZQ?tnolv6=T3jW3f`a+4W5% za)CxhD28mOEw+Qdu6V1K5zR#1=Mgyf{kMaz-}@nFxb?3~T>9FzYq9b150IE{02Mp_ zMX@Af;Q3}XYdNRCvjk3Vm0nJ#xWNjp&THva`#V`PkBsn|Z(4U_w5#dYHaAi-MKQ|VGXFdG=g%+B zYvjGV@Gr2Q4}bgK?RTfA$E$i@wtd_BJLMkRnDKdJ%0DAaL6NWj@nWXd1x;whz{>T? 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 literal 0 HcmV?d00001 diff --git a/docs/docs/stock/availability.md b/docs/docs/stock/availability.md new file mode 100644 index 0000000000..d1cef5c8d1 --- /dev/null +++ b/docs/docs/stock/availability.md @@ -0,0 +1,88 @@ +--- +title: Stock Availability +--- + +## Stock Availability + +Each stock item represents a physical quantity of a particular part in a specific location. Given the complexities of tracking stock across multiple locations, reservations, and allocations, it is important to understand whether a stock item is actually available for use. + +There are multiple terms used in InvenTree to describe stock availability: + +### Required + +The *Required* quantity indicates the total number of a certain [part](../part/index.md) that is needed to fulfill all current orders, builds, or other commitments. This is independent of the actual stock levels. + +### In Stock + +The *In Stock* quantity represents the total number of items physically present in the stock location, regardless of their allocation or reservation status. + +For example, if a stock item has a quantity of 100, it means there are 100 units of that part physically present in the specified location. + +### Allocated + +The *Allocated* quantity indicates the number of stock items that have been reserved for specific orders, builds, or other commitments. This number is specified against each stock item when it is allocated. + +Note that the *Allocated* quantity is always less than or equal to the *In Stock* quantity. + +For example, if a stock item has an *In Stock* quantity of 100, and 30 units have been allocated to fulfill orders, then the *Allocated* quantity is 30. In this case the *In Stock* quantity remains 100, until the alloacted quantity is actually consumed. + +### Available + +The *Available* quantity for a given stock item is the difference between the *In Stock* quantity and the *Allocated* quantity. + +For example, if a stock item has an *In Stock* quantity of 100, and 30 units have been allocated, then the *Available* quantity is 70. + +## Consumed or Depleted Stock + +Once allocated stock quantities are consumed (e.g. when fulfilling an order or completing a build), the *In Stock* quantity of the stock item is reduced accordingly. This means that the *Available* quantity is also reduced. + +### Delete on Deplete + +Stock items can be designated with the `Delete on Deplete` flag. When this flag is set, if the stock quantity of the item reaches zero, the stock item will be automatically deleted from the system. + +## Part Stock Levels + +There are multiple ways to view the overall stock levels for a given part across all stock items and locations. + +### Stock Overview + +Each [part](../part/index.md) page displays an overview of the stocktotal stock levels across all locations. This page shows the total *In Stock*, *Allocated*, and *Available* quantities for the part, aggregated across all stock items: + +{{ image("stock/stock_overview.png", title="Stock overview") }} + +In the example above, the "Red Widget" part has the following stock levels: + +| Metric | Quantity | Description | +| ------ | -------- | ----------- | +| In Stock | 138 | There are 138 physical units of the Red Widget part across all stock locations. | +| Available | 123 | Only 123 units are available for allocation, as 15 units have already been allocated to fulfill orders. | +| Required | 657 | A total of 657 units of the Red Widget part are needed to fulfill all current orders and builds. | +| Deficit | 519 | There is a deficit of 519 units, meaning that the current available stock is insufficient to meet the required quantity. | + +### Stock Details + +The *Part Detail* view displays additional information regarding the stock levels for the part: + +{{ image("stock/stock_detail.png", title="Stock detail") }} + +Here we can see that: + +- There are 138 units of the Red Widget part physically in stock across all locations. +- Of this quantity, 15 units have been allocated to fulfill orders, leaving 123 units available for allocation. +- A total of 657 units are required to fulfill all current orders and builds. +- 645 units are required to fulfil outstanding build orders, of which 15 units have already been allocated. +- 12 units are required to fulfil outstanding sales orders, none of which have been allocated yet. + +### Allocations Tab + +To view further details regarding which stock items have been allocated, the *Allocations* tab on the part view can be used. + +This tab displays a complete overview of where the stock items for this part are allocated, against any open orders: + +#### Build Order Allocations + +{{ image("stock/build_order_allocations.png", title="Build order allocations") }} + +#### Sales Order Allocations + +{{ image("stock/sales_order_allocations.png", title="Sales order allocations") }} diff --git a/docs/docs/stock/index.md b/docs/docs/stock/index.md index beb9525280..d020dd67d1 100644 --- a/docs/docs/stock/index.md +++ b/docs/docs/stock/index.md @@ -26,11 +26,15 @@ The *Stock Item* detail view shows information regarding the particular stock it **Status** - Status of this stock item +### Stock Availability + +InvenTree has a number of different mechanisms to determine whether stock is available for use. See the [Stock Availability](./availability.md) page for more information. + ### Stock Tracking Every time a *Stock Item* is adjusted, a *Stock Tracking* entry is automatically created. This ensures a complete history of the *Stock Item* is maintained as long as the item is in the system. -Each stock tracking historical item records the user who performed the action. +Each stock tracking historical item records the user who performed the action. [Read more about stock tracking here](./tracking.md). ## Stock Location @@ -49,12 +53,10 @@ If there are some icons missing in the tabler icons package, users can even inst A stock location type represents a specific type of location (e.g. one specific size of drawer, shelf, ... or box) which can be assigned to multiple stock locations. In the first place, it is used to specify an icon and having the icon in sync for all locations that use this location type, but it also serves as a data field to quickly see what type of location this is. It is planned to add e.g. drawer dimension information to the location type to add a "find a matching, empty stock location" tool. ## External Stock Location -An external stock location can be used to indicate that items in there might not be available -for immediate usage. Stock items in an external location are marked with an additional icon + +It may be useful to mark certain stock locations as *external*. An external stock location can be used to indicate that items in there might not be available for immediate usage. Stock items in an external location are marked with an additional icon in the build order line items view where the material is allocated. {{ image("stock/stock_external_icon.png", title="External stock indication") }} -Anyhow there is no limitation on the stock item. It can be allocated as usual. - The external flag does not get inherited to sublocations. diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml index 1d8096cc23..132dc41b2e 100644 --- a/docs/mkdocs.yml +++ b/docs/mkdocs.yml @@ -134,8 +134,9 @@ nav: - Notifications: part/notification.md - Stock: - Stock Items: stock/index.md - - Stock Status: stock/status.md + - Availability: stock/availability.md - Stock Tracking: stock/tracking.md + - Stock Status: stock/status.md - Adjusting Stock: stock/adjust.md - Stock Expiry: stock/expiry.md - Stock Ownership: stock/owner.md diff --git a/src/frontend/src/pages/part/PartDetail.tsx b/src/frontend/src/pages/part/PartDetail.tsx index a539b51078..927d6ac978 100644 --- a/src/frontend/src/pages/part/PartDetail.tsx +++ b/src/frontend/src/pages/part/PartDetail.tsx @@ -979,6 +979,8 @@ export default function PartDetail() { partRequirements.required_for_build_orders + partRequirements.required_for_sales_orders; + const shortfall = Math.max(required - partRequirements.total_stock, 0); + return [ 0} key='in_production' />, + 0} + key='deficit' + />, Date: Fri, 28 Nov 2025 20:03:02 +0000 Subject: [PATCH 09/76] refactor(backend): port typo fixes from #10699 (#10926) * typo fxes from #10699 * bump api version --- src/backend/InvenTree/InvenTree/api_version.py | 9 ++++++--- src/backend/InvenTree/InvenTree/serializers.py | 10 +++++----- src/backend/InvenTree/build/models.py | 2 +- src/backend/InvenTree/company/api.py | 2 +- src/backend/InvenTree/company/models.py | 6 +++--- src/backend/InvenTree/order/api.py | 8 ++++---- src/backend/InvenTree/order/models.py | 2 +- src/backend/InvenTree/part/models.py | 2 +- 8 files changed, 22 insertions(+), 19 deletions(-) diff --git a/src/backend/InvenTree/InvenTree/api_version.py b/src/backend/InvenTree/InvenTree/api_version.py index bc0d0c5bcd..f198138e53 100644 --- a/src/backend/InvenTree/InvenTree/api_version.py +++ b/src/backend/InvenTree/InvenTree/api_version.py @@ -1,11 +1,14 @@ """InvenTree API version information.""" # InvenTree API version -INVENTREE_API_VERSION = 427 +INVENTREE_API_VERSION = 428 """Increment this API version number whenever there is a significant change to the API that any clients need to know about.""" INVENTREE_API_TEXT = """ +v428 -> 2025-11-28 : https://github.com/inventree/InvenTree/pull/10926 + - Various typo fixes in API - no functional changes + v427 -> 2025-11-24 : https://github.com/inventree/InvenTree/pull/10896 - Fixes a spelling mistake in the API field labels @@ -42,7 +45,7 @@ v418 -> 2025-10-24 : https://github.com/inventree/InvenTree/pull/10657 v417 -> 2025-10-22 : https://github.com/inventree/InvenTree/pull/10654 - Adds "checked" filter to SalesOrderShipment API endpoint - - Adds "order_status" filter to SalesOrdereShipment API endpoint + - Adds "order_status" filter to SalesOrderShipment API endpoint - Adds "order_outstanding" filter to SalesOrderShipment API endpoint v416 -> 2025-10-22 : https://github.com/inventree/InvenTree/pull/10651 @@ -100,7 +103,7 @@ v401 -> 2025-10-05 : https://github.com/inventree/InvenTree/pull/10381 - Adds machine properties to machine API endpoints v400 -> 2025-10-05 : https://github.com/inventree/InvenTree/pull/10486 - - Adds return datatypes for admin/config and flags entpoints + - Adds return datatypes for admin/config and flags endpoints v399 -> 2025-10-05 : https://github.com/inventree/InvenTree/pull/10445 - Refactors 'customer_detail' param in SalesOrder API endpoint diff --git a/src/backend/InvenTree/InvenTree/serializers.py b/src/backend/InvenTree/InvenTree/serializers.py index ee707f27ff..dd1e096de7 100644 --- a/src/backend/InvenTree/InvenTree/serializers.py +++ b/src/backend/InvenTree/InvenTree/serializers.py @@ -69,7 +69,7 @@ def enable_filter( Returns: The decorated serializer field, marked as filterable. """ - # Ensure this function can be actually filteres + # Ensure this function can be actually filtered if not issubclass(func.__class__, FilterableSerializerField): raise TypeError( 'INVE-I2: `enable_filter` can only be applied to serializer fields / serializers that contain the `FilterableSerializerField` mixin!' @@ -132,11 +132,11 @@ class FilterableSerializerMixin: query_params = dict(getattr(context.get('request', {}), 'query_params', {})) # Remove filter args from kwargs to avoid issues with super().__init__ - poped_kwargs = {} # store popped kwargs as a arg might be reused for multiple fields + popped_kwargs = {} # store popped kwargs as a arg might be reused for multiple fields tgs_vals: dict[str, bool] = {} for k, v in self.filter_targets.items(): pop_ref = v['filter_name'] or k - val = kwargs.pop(pop_ref, poped_kwargs.get(pop_ref)) + val = kwargs.pop(pop_ref, popped_kwargs.get(pop_ref)) # Optionally also look in query parameters if val is None and self.filter_on_query and v.get('filter_by_query', True): @@ -145,13 +145,13 @@ class FilterableSerializerMixin: val = val[0] if val: # Save popped value for reuse - poped_kwargs[pop_ref] = val + popped_kwargs[pop_ref] = val tgs_vals[k] = ( str2bool(val) if isinstance(val, (str, int, float)) else val ) # Support for various filtering style for backwards compatibility self.filter_target_values = tgs_vals - # Ensure this mixin is not proadly applied as it is expensive on scale (total CI time increased by 21% when running all coverage tests) + # Ensure this mixin is not broadly applied as it is expensive on scale (total CI time increased by 21% when running all coverage tests) if len(self.filter_targets) == 0 and not self.no_filters: raise Exception( 'INVE-I2: No filter targets found in fields, remove `PathScopedMixin`' diff --git a/src/backend/InvenTree/build/models.py b/src/backend/InvenTree/build/models.py index e4c89c5d63..32bf0a951b 100644 --- a/src/backend/InvenTree/build/models.py +++ b/src/backend/InvenTree/build/models.py @@ -85,7 +85,7 @@ class Build( InvenTree.models.MetadataMixin, InvenTree.models.InvenTreeTree, ): - """A Build object organises the creation of new StockItem objects from other existing StockItem objects. + """A Build object organizes the creation of new StockItem objects from other existing StockItem objects. Attributes: part: The part to be built (from component BOM items) diff --git a/src/backend/InvenTree/company/api.py b/src/backend/InvenTree/company/api.py index cde689119e..42a58fef79 100644 --- a/src/backend/InvenTree/company/api.py +++ b/src/backend/InvenTree/company/api.py @@ -366,7 +366,7 @@ class SupplierPartMixin: serializer_class = SupplierPartSerializer def get_queryset(self, *args, **kwargs): - """Return annotated queryest object for the SupplierPart list.""" + """Return annotated queryset object for the SupplierPart list.""" queryset = super().get_queryset(*args, **kwargs) queryset = SupplierPartSerializer.annotate_queryset(queryset) diff --git a/src/backend/InvenTree/company/models.py b/src/backend/InvenTree/company/models.py index c60e82900c..013a6b011b 100644 --- a/src/backend/InvenTree/company/models.py +++ b/src/backend/InvenTree/company/models.py @@ -297,7 +297,7 @@ class Contact(InvenTree.models.InvenTreeMetadataModel): @staticmethod def get_api_url(): - """Return the API URL associated with the Contcat model.""" + """Return the API URL associated with the Contact model.""" return reverse('api-contact-list') company = models.ForeignKey( @@ -382,7 +382,7 @@ class Address(InvenTree.models.InvenTreeModel): @staticmethod def get_api_url(): - """Return the API URL associated with the Contcat model.""" + """Return the API URL associated with the Contact model.""" return reverse('api-address-list') company = models.ForeignKey( @@ -888,7 +888,7 @@ class SupplierPart( ) def base_quantity(self, quantity=1) -> Decimal: - """Calculate the base unit quantiy for a given quantity.""" + """Calculate the base unit quantity for a given quantity.""" q = Decimal(quantity) * Decimal(self.pack_quantity_native) q = round(q, 10).normalize() diff --git a/src/backend/InvenTree/order/api.py b/src/backend/InvenTree/order/api.py index ddf7dadb57..05f848f518 100644 --- a/src/backend/InvenTree/order/api.py +++ b/src/backend/InvenTree/order/api.py @@ -1323,7 +1323,7 @@ class SalesOrderAllocationList( class SalesOrderAllocationDetail(SalesOrderAllocationMixin, RetrieveUpdateDestroyAPI): - """API endpoint for detali view of a SalesOrderAllocation object.""" + """API endpoint for detail view of a SalesOrderAllocation object.""" class SalesOrderShipmentFilter(FilterSet): @@ -1374,7 +1374,7 @@ class SalesOrderShipmentFilter(FilterSet): ) def filter_order_status(self, queryset, name, value): - """Filter by linked SalesOrderrder status.""" + """Filter by linked SalesOrder status.""" q1 = Q(order__status=value, order__status_custom_key__isnull=True) q2 = Q(order__status_custom_key=value) @@ -1412,7 +1412,7 @@ class SalesOrderShipmentList(SalesOrderShipmentMixin, ListCreateAPI): class SalesOrderShipmentDetail(SalesOrderShipmentMixin, RetrieveUpdateDestroyAPI): - """API detail endpooint for SalesOrderShipment model.""" + """API detail endpoint for SalesOrderShipment model.""" class SalesOrderShipmentComplete(CreateAPI): @@ -1964,7 +1964,7 @@ order_api_urls = [ ), ]), ), - # API endpoints for sales ordesr + # API endpoints for sales orders path( 'so/', include([ diff --git a/src/backend/InvenTree/order/models.py b/src/backend/InvenTree/order/models.py index 4efa189e71..3030ade4fb 100644 --- a/src/backend/InvenTree/order/models.py +++ b/src/backend/InvenTree/order/models.py @@ -988,7 +988,7 @@ class PurchaseOrder(TotalPriceMixin, Order): # Before we continue, validate that each line item is valid # We validate this here because it is far more efficient, - # after we have fetched *all* line itemes in a single DB query + # after we have fetched *all* line items in a single DB query for line_item in line_item_map.values(): if line_item.order != self: raise ValidationError({_('Line item does not match purchase order')}) diff --git a/src/backend/InvenTree/part/models.py b/src/backend/InvenTree/part/models.py index e02602a90c..18840608fb 100644 --- a/src/backend/InvenTree/part/models.py +++ b/src/backend/InvenTree/part/models.py @@ -1027,7 +1027,7 @@ class Part( self.ensure_trackable() def ensure_trackable(self): - """Ensure that trackable is set correctly downline.""" + """Ensure that trackable is set correctly downstream.""" if self.trackable: for part in self.get_used_in(): if not part.trackable: From 7b592f157cf568c4c9ec3912d452b0aa5d02b0ee Mon Sep 17 00:00:00 2001 From: Matthias Mair Date: Fri, 28 Nov 2025 22:14:45 +0000 Subject: [PATCH 10/76] feat: add cooldown to dependabot (#10930) --- .github/dependabot.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index cc0b8cf14a..441ac9a7bb 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -4,6 +4,8 @@ updates: directory: / schedule: interval: weekly + cooldown: + default-days: 7 groups: dependencies: patterns: @@ -13,11 +15,15 @@ updates: directory: /contrib/container schedule: interval: weekly + cooldown: + default-days: 7 - package-ecosystem: docker directory: /.devcontainer schedule: interval: weekly + cooldown: + default-days: 7 - package-ecosystem: pip directories: @@ -28,6 +34,8 @@ updates: schedule: interval: weekly day: friday + cooldown: + default-days: 7 groups: dependencies: patterns: @@ -41,6 +49,8 @@ updates: - /src/frontend schedule: interval: weekly + cooldown: + default-days: 7 groups: dependencies: patterns: From 3958e10875f5d8dd5eb0bba04ea3689fb1606a71 Mon Sep 17 00:00:00 2001 From: Oliver Date: Sun, 30 Nov 2025 20:01:35 +1100 Subject: [PATCH 11/76] Fix for python bindings CI check (#10934) --- .github/workflows/qc_checks.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/qc_checks.yaml b/.github/workflows/qc_checks.yaml index 07ef26a5b0..c1b1dd0db4 100644 --- a/.github/workflows/qc_checks.yaml +++ b/.github/workflows/qc_checks.yaml @@ -304,7 +304,7 @@ jobs: steps: - uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # pin@v6.0.0 with: - persist-credentials: true + persist-credentials: false - name: Environment Setup uses: ./.github/actions/setup with: From bc5c306b6d0efd45da99b8e2483d86419af9378d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 30 Nov 2025 21:03:53 +1100 Subject: [PATCH 12/76] New Crowdin translations by GitHub Action (#10871) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Oliver --- .../InvenTree/locale/ar/LC_MESSAGES/django.po | 280 +- .../InvenTree/locale/bg/LC_MESSAGES/django.po | 280 +- .../InvenTree/locale/cs/LC_MESSAGES/django.po | 280 +- .../InvenTree/locale/da/LC_MESSAGES/django.po | 280 +- .../InvenTree/locale/de/LC_MESSAGES/django.po | 280 +- .../InvenTree/locale/el/LC_MESSAGES/django.po | 290 +- .../InvenTree/locale/en/LC_MESSAGES/django.po | 278 +- .../InvenTree/locale/es/LC_MESSAGES/django.po | 280 +- .../locale/es_MX/LC_MESSAGES/django.po | 280 +- .../InvenTree/locale/et/LC_MESSAGES/django.po | 280 +- .../InvenTree/locale/fa/LC_MESSAGES/django.po | 280 +- .../InvenTree/locale/fi/LC_MESSAGES/django.po | 280 +- .../InvenTree/locale/fr/LC_MESSAGES/django.po | 282 +- .../InvenTree/locale/he/LC_MESSAGES/django.po | 280 +- .../InvenTree/locale/hi/LC_MESSAGES/django.po | 280 +- .../InvenTree/locale/hu/LC_MESSAGES/django.po | 282 +- .../InvenTree/locale/id/LC_MESSAGES/django.po | 280 +- .../InvenTree/locale/it/LC_MESSAGES/django.po | 282 +- .../InvenTree/locale/ja/LC_MESSAGES/django.po | 280 +- .../InvenTree/locale/ko/LC_MESSAGES/django.po | 280 +- .../InvenTree/locale/lt/LC_MESSAGES/django.po | 280 +- .../InvenTree/locale/lv/LC_MESSAGES/django.po | 280 +- .../InvenTree/locale/nl/LC_MESSAGES/django.po | 282 +- .../InvenTree/locale/no/LC_MESSAGES/django.po | 280 +- .../InvenTree/locale/pl/LC_MESSAGES/django.po | 282 +- .../InvenTree/locale/pt/LC_MESSAGES/django.po | 280 +- .../locale/pt_BR/LC_MESSAGES/django.po | 282 +- .../InvenTree/locale/ro/LC_MESSAGES/django.po | 294 +- .../InvenTree/locale/ru/LC_MESSAGES/django.po | 280 +- .../InvenTree/locale/sk/LC_MESSAGES/django.po | 280 +- .../InvenTree/locale/sl/LC_MESSAGES/django.po | 280 +- .../InvenTree/locale/sr/LC_MESSAGES/django.po | 280 +- .../InvenTree/locale/sv/LC_MESSAGES/django.po | 282 +- .../InvenTree/locale/th/LC_MESSAGES/django.po | 280 +- .../InvenTree/locale/tr/LC_MESSAGES/django.po | 282 +- .../InvenTree/locale/uk/LC_MESSAGES/django.po | 280 +- .../InvenTree/locale/vi/LC_MESSAGES/django.po | 280 +- .../locale/zh_Hans/LC_MESSAGES/django.po | 282 +- .../locale/zh_Hant/LC_MESSAGES/django.po | 282 +- src/frontend/src/locales/ar/messages.po | 426 +- src/frontend/src/locales/bg/messages.po | 426 +- src/frontend/src/locales/cs/messages.po | 434 +- src/frontend/src/locales/da/messages.po | 426 +- src/frontend/src/locales/de/messages.po | 436 +- src/frontend/src/locales/el/messages.po | 4410 +++++++++-------- src/frontend/src/locales/en/messages.po | 432 +- src/frontend/src/locales/es/messages.po | 434 +- src/frontend/src/locales/es_MX/messages.po | 434 +- src/frontend/src/locales/et/messages.po | 434 +- src/frontend/src/locales/fa/messages.po | 426 +- src/frontend/src/locales/fi/messages.po | 426 +- src/frontend/src/locales/fr/messages.po | 434 +- src/frontend/src/locales/he/messages.po | 426 +- src/frontend/src/locales/hi/messages.po | 426 +- src/frontend/src/locales/hu/messages.po | 432 +- src/frontend/src/locales/id/messages.po | 428 +- src/frontend/src/locales/it/messages.po | 436 +- src/frontend/src/locales/ja/messages.po | 434 +- src/frontend/src/locales/ko/messages.po | 426 +- src/frontend/src/locales/lt/messages.po | 426 +- src/frontend/src/locales/lv/messages.po | 426 +- src/frontend/src/locales/nl/messages.po | 434 +- src/frontend/src/locales/no/messages.po | 426 +- src/frontend/src/locales/pl/messages.po | 432 +- src/frontend/src/locales/pt/messages.po | 436 +- src/frontend/src/locales/pt_BR/messages.po | 436 +- src/frontend/src/locales/ro/messages.po | 434 +- src/frontend/src/locales/ru/messages.po | 436 +- src/frontend/src/locales/sk/messages.po | 426 +- src/frontend/src/locales/sl/messages.po | 426 +- src/frontend/src/locales/sr/messages.po | 434 +- src/frontend/src/locales/sv/messages.po | 432 +- src/frontend/src/locales/th/messages.po | 426 +- src/frontend/src/locales/tr/messages.po | 436 +- src/frontend/src/locales/uk/messages.po | 430 +- src/frontend/src/locales/vi/messages.po | 436 +- src/frontend/src/locales/zh_Hans/messages.po | 434 +- src/frontend/src/locales/zh_Hant/messages.po | 436 +- 78 files changed, 16655 insertions(+), 15095 deletions(-) diff --git a/src/backend/InvenTree/locale/ar/LC_MESSAGES/django.po b/src/backend/InvenTree/locale/ar/LC_MESSAGES/django.po index 0afd69cdf0..66b4ef4ea5 100644 --- a/src/backend/InvenTree/locale/ar/LC_MESSAGES/django.po +++ b/src/backend/InvenTree/locale/ar/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: inventree\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-11-19 04:55+0000\n" -"PO-Revision-Date: 2025-11-19 04:59\n" +"POT-Creation-Date: 2025-11-24 06:50+0000\n" +"PO-Revision-Date: 2025-11-24 06:53\n" "Last-Translator: \n" "Language-Team: Arabic\n" "Language: ar_SA\n" @@ -81,21 +81,21 @@ msgstr "عنوان البريد الإلكتروني الرئيسي المقدم msgid "The provided email domain is not approved." msgstr "لم تتم الموافقة على نطاق البريد الإلكتروني المقدم." -#: InvenTree/conversion.py:166 +#: InvenTree/conversion.py:240 #, python-brace-format msgid "Invalid unit provided ({unit})" msgstr "الوحدة المقدمة غير صالحة ({unit})" -#: InvenTree/conversion.py:183 +#: InvenTree/conversion.py:257 msgid "No value provided" msgstr "لم يتم تقديم قيمة" -#: InvenTree/conversion.py:210 +#: InvenTree/conversion.py:284 #, python-brace-format msgid "Could not convert {original} to {unit}" msgstr "تعذّر تحويل {original} إلى {unit}" -#: InvenTree/conversion.py:212 InvenTree/conversion.py:226 +#: InvenTree/conversion.py:286 InvenTree/conversion.py:300 #: InvenTree/helpers.py:597 order/models.py:720 order/models.py:1015 msgid "Invalid quantity provided" msgstr "الكمية المقدمة غير صحيحة" @@ -116,7 +116,7 @@ msgstr "" #: build/serializers.py:580 build/serializers.py:1788 company/models.py:857 #: order/models.py:1780 #: report/templates/report/inventree_build_order_report.html:172 -#: stock/models.py:2848 stock/models.py:2972 stock/serializers.py:717 +#: stock/models.py:2865 stock/models.py:2989 stock/serializers.py:717 #: stock/serializers.py:893 stock/serializers.py:1035 stock/serializers.py:1336 #: stock/serializers.py:1425 stock/serializers.py:1624 msgid "Notes" @@ -345,7 +345,7 @@ msgstr "" msgid "Currency" msgstr "" -#: InvenTree/serializers.py:298 part/serializers.py:1385 +#: InvenTree/serializers.py:298 part/serializers.py:1357 msgid "Select currency from available options" msgstr "" @@ -553,14 +553,14 @@ msgstr "" #: build/api.py:100 build/api.py:466 build/api.py:845 build/models.py:270 #: build/serializers.py:1225 build/serializers.py:1356 -#: build/serializers.py:1427 company/models.py:1067 company/serializers.py:445 +#: build/serializers.py:1427 company/models.py:1067 company/serializers.py:491 #: order/api.py:298 order/api.py:302 order/api.py:929 order/api.py:1187 #: order/api.py:1190 order/models.py:1941 order/models.py:2108 #: order/models.py:2109 part/api.py:1233 part/api.py:1236 part/api.py:1302 #: part/api.py:1589 part/models.py:472 part/models.py:3296 part/models.py:3439 #: part/models.py:3497 part/models.py:3518 part/models.py:3540 #: part/models.py:3679 part/models.py:4046 part/models.py:4368 -#: part/models.py:4787 part/serializers.py:1928 +#: part/models.py:4787 part/serializers.py:1900 #: report/templates/report/inventree_bill_of_materials_report.html:110 #: report/templates/report/inventree_bill_of_materials_report.html:137 #: report/templates/report/inventree_build_order_report.html:109 @@ -582,7 +582,7 @@ msgstr "" #: build/api.py:120 build/api.py:123 build/serializers.py:1438 part/api.py:980 #: part/api.py:1316 part/api.py:1600 part/models.py:1080 part/models.py:3568 -#: part/models.py:4162 part/serializers.py:1752 stock/api.py:869 +#: part/models.py:4162 part/serializers.py:1724 stock/api.py:869 msgid "Category" msgstr "" @@ -663,7 +663,7 @@ msgid "Optional" msgstr "" #: build/api.py:455 build/serializers.py:1415 common/setting/system.py:456 -#: part/models.py:1202 part/serializers.py:1714 part/serializers.py:1725 +#: part/models.py:1202 part/serializers.py:1686 part/serializers.py:1697 #: stock/api.py:639 msgid "Assembly" msgstr "" @@ -688,16 +688,16 @@ msgstr "" msgid "Consumed" msgstr "" -#: build/api.py:499 company/models.py:912 company/serializers.py:440 +#: build/api.py:499 company/models.py:912 company/serializers.py:474 #: templates/email/build_order_required_stock.html:19 #: templates/email/low_stock_notification.html:17 #: templates/email/part_event_notification.html:18 msgid "Available" msgstr "" -#: build/api.py:523 build/serializers.py:1466 company/serializers.py:437 -#: order/serializers.py:1281 part/serializers.py:959 part/serializers.py:1306 -#: part/serializers.py:1761 +#: build/api.py:523 build/serializers.py:1466 company/serializers.py:471 +#: order/serializers.py:1281 part/serializers.py:931 part/serializers.py:1278 +#: part/serializers.py:1733 msgid "On Order" msgstr "" @@ -963,7 +963,7 @@ msgstr "" #: build/models.py:1136 build/models.py:1234 build/serializers.py:285 #: build/serializers.py:335 build/serializers.py:965 build/serializers.py:1739 #: order/models.py:717 order/serializers.py:658 order/serializers.py:844 -#: part/serializers.py:1708 stock/models.py:940 stock/models.py:1430 +#: part/serializers.py:1680 stock/models.py:940 stock/models.py:1430 #: stock/models.py:1878 stock/serializers.py:688 stock/serializers.py:1580 msgid "Quantity must be greater than zero" msgstr "" @@ -1385,20 +1385,20 @@ msgstr "" msgid "BOM Item" msgstr "" -#: build/serializers.py:1467 order/serializers.py:1282 part/serializers.py:1310 -#: part/serializers.py:1765 +#: build/serializers.py:1467 order/serializers.py:1282 part/serializers.py:1282 +#: part/serializers.py:1737 msgid "In Production" msgstr "" -#: build/serializers.py:1469 part/serializers.py:950 part/serializers.py:1314 +#: build/serializers.py:1469 part/serializers.py:922 part/serializers.py:1286 msgid "Scheduled to Build" msgstr "" -#: build/serializers.py:1472 part/serializers.py:987 +#: build/serializers.py:1472 part/serializers.py:959 msgid "External Stock" msgstr "" -#: build/serializers.py:1473 part/serializers.py:1300 part/serializers.py:1808 +#: build/serializers.py:1473 part/serializers.py:1272 part/serializers.py:1780 msgid "Available Stock" msgstr "" @@ -1588,7 +1588,7 @@ msgstr "" msgid "Price break quantity" msgstr "" -#: common/models.py:1348 company/serializers.py:564 order/models.py:1842 +#: common/models.py:1348 company/serializers.py:357 order/models.py:1842 #: order/models.py:3043 msgid "Price" msgstr "" @@ -1760,7 +1760,7 @@ msgstr "" msgid "Unit definition" msgstr "" -#: common/models.py:1911 common/models.py:1974 stock/models.py:2967 +#: common/models.py:1911 common/models.py:1974 stock/models.py:2984 #: stock/serializers.py:247 msgid "Attachment" msgstr "" @@ -1839,7 +1839,7 @@ msgstr "" #: common/models.py:2090 common/models.py:2329 company/models.py:622 #: machine/serializers.py:27 -#: report/templates/report/inventree_test_report.html:104 stock/models.py:2959 +#: report/templates/report/inventree_test_report.html:104 stock/models.py:2976 msgid "Value" msgstr "" @@ -2048,7 +2048,7 @@ msgid "Response data from the barcode scan" msgstr "" #: common/models.py:2417 report/templates/report/inventree_test_report.html:103 -#: stock/models.py:2953 +#: stock/models.py:2970 msgid "Result" msgstr "" @@ -2141,7 +2141,7 @@ msgid "Linked thread for this message" msgstr "" #: common/models.py:2656 -msgid "Prioriy" +msgid "Priority" msgstr "" #: common/models.py:2698 @@ -2671,8 +2671,8 @@ msgstr "" msgid "Parts can be assembled from other components by default" msgstr "" -#: common/setting/system.py:462 part/models.py:1208 part/serializers.py:1734 -#: part/serializers.py:1741 +#: common/setting/system.py:462 part/models.py:1208 part/serializers.py:1706 +#: part/serializers.py:1713 msgid "Component" msgstr "" @@ -3772,7 +3772,7 @@ msgstr "" msgid "Supplier is Active" msgstr "" -#: company/api.py:307 company/models.py:520 company/serializers.py:457 +#: company/api.py:307 company/models.py:520 company/serializers.py:503 #: part/serializers.py:566 msgid "Manufacturer" msgstr "" @@ -3964,7 +3964,7 @@ msgid "Link to address information (external)" msgstr "" #: company/models.py:492 company/models.py:609 company/models.py:832 -#: company/serializers.py:471 stock/api.py:561 +#: company/serializers.py:517 stock/api.py:561 msgid "Manufacturer Part" msgstr "" @@ -3981,7 +3981,7 @@ msgstr "" msgid "Select manufacturer" msgstr "" -#: company/models.py:527 company/serializers.py:479 order/serializers.py:734 +#: company/models.py:527 company/serializers.py:525 order/serializers.py:734 #: part/serializers.py:576 msgid "MPN" msgstr "" @@ -4030,7 +4030,7 @@ msgstr "" msgid "Linked manufacturer part must reference the same base part" msgstr "" -#: company/models.py:810 company/serializers.py:449 company/serializers.py:467 +#: company/models.py:810 company/serializers.py:495 company/serializers.py:513 #: order/models.py:639 part/serializers.py:550 #: plugin/builtin/suppliers/digikey.py:26 plugin/builtin/suppliers/lcsc.py:27 #: plugin/builtin/suppliers/mouser.py:25 plugin/builtin/suppliers/tme.py:27 @@ -4134,10 +4134,14 @@ msgstr "" msgid "Company Name" msgstr "" -#: company/serializers.py:433 part/serializers.py:955 stock/serializers.py:428 +#: company/serializers.py:467 part/serializers.py:927 stock/serializers.py:428 msgid "In Stock" msgstr "" +#: company/serializers.py:484 +msgid "Price Breaks" +msgstr "" + #: data_exporter/mixins.py:325 data_exporter/mixins.py:403 msgid "Error occurred during data export" msgstr "" @@ -4290,7 +4294,7 @@ msgstr "" msgid "Errors" msgstr "" -#: importer/models.py:550 part/serializers.py:1268 +#: importer/models.py:550 part/serializers.py:1240 msgid "Valid" msgstr "" @@ -5677,7 +5681,7 @@ msgstr "" msgid "Part category" msgstr "" -#: part/models.py:1088 part/serializers.py:929 +#: part/models.py:1088 part/serializers.py:901 #: report/templates/report/inventree_stock_location_report.html:103 msgid "IPN" msgstr "" @@ -5718,7 +5722,7 @@ msgstr "" msgid "Expiry time (in days) for stock items of this part" msgstr "" -#: part/models.py:1186 part/serializers.py:1003 +#: part/models.py:1186 part/serializers.py:975 msgid "Minimum Stock" msgstr "" @@ -6418,203 +6422,203 @@ msgstr "" msgid "Supplier part matching this SKU already exists" msgstr "" -#: part/serializers.py:914 +#: part/serializers.py:886 msgid "Category Name" msgstr "" -#: part/serializers.py:943 +#: part/serializers.py:915 msgid "Building" msgstr "" -#: part/serializers.py:944 +#: part/serializers.py:916 msgid "Quantity of this part currently being in production" msgstr "" -#: part/serializers.py:951 +#: part/serializers.py:923 msgid "Outstanding quantity of this part scheduled to be built" msgstr "" -#: part/serializers.py:971 stock/serializers.py:1019 stock/serializers.py:1189 +#: part/serializers.py:943 stock/serializers.py:1019 stock/serializers.py:1189 #: users/ruleset.py:30 msgid "Stock Items" msgstr "" -#: part/serializers.py:975 +#: part/serializers.py:947 msgid "Revisions" msgstr "" -#: part/serializers.py:979 +#: part/serializers.py:951 msgid "Suppliers" msgstr "" -#: part/serializers.py:983 part/serializers.py:1297 +#: part/serializers.py:955 part/serializers.py:1269 #: templates/email/low_stock_notification.html:16 #: templates/email/part_event_notification.html:17 msgid "Total Stock" msgstr "" -#: part/serializers.py:991 +#: part/serializers.py:963 msgid "Unallocated Stock" msgstr "" -#: part/serializers.py:999 +#: part/serializers.py:971 msgid "Variant Stock" msgstr "" -#: part/serializers.py:1054 +#: part/serializers.py:1026 msgid "Duplicate Part" msgstr "" -#: part/serializers.py:1055 +#: part/serializers.py:1027 msgid "Copy initial data from another Part" msgstr "" -#: part/serializers.py:1061 +#: part/serializers.py:1033 msgid "Initial Stock" msgstr "" -#: part/serializers.py:1062 +#: part/serializers.py:1034 msgid "Create Part with initial stock quantity" msgstr "" -#: part/serializers.py:1068 +#: part/serializers.py:1040 msgid "Supplier Information" msgstr "" -#: part/serializers.py:1069 +#: part/serializers.py:1041 msgid "Add initial supplier information for this part" msgstr "" -#: part/serializers.py:1077 +#: part/serializers.py:1049 msgid "Copy Category Parameters" msgstr "" -#: part/serializers.py:1078 +#: part/serializers.py:1050 msgid "Copy parameter templates from selected part category" msgstr "" -#: part/serializers.py:1083 +#: part/serializers.py:1055 msgid "Existing Image" msgstr "" -#: part/serializers.py:1084 +#: part/serializers.py:1056 msgid "Filename of an existing part image" msgstr "" -#: part/serializers.py:1101 +#: part/serializers.py:1073 msgid "Image file does not exist" msgstr "" -#: part/serializers.py:1269 +#: part/serializers.py:1241 msgid "Validate entire Bill of Materials" msgstr "" -#: part/serializers.py:1303 part/serializers.py:1769 +#: part/serializers.py:1275 part/serializers.py:1741 msgid "Can Build" msgstr "" -#: part/serializers.py:1320 +#: part/serializers.py:1292 msgid "Required for Build Orders" msgstr "" -#: part/serializers.py:1325 +#: part/serializers.py:1297 msgid "Allocated to Build Orders" msgstr "" -#: part/serializers.py:1332 +#: part/serializers.py:1304 msgid "Required for Sales Orders" msgstr "" -#: part/serializers.py:1336 +#: part/serializers.py:1308 msgid "Allocated to Sales Orders" msgstr "" -#: part/serializers.py:1475 +#: part/serializers.py:1447 msgid "Minimum Price" msgstr "" -#: part/serializers.py:1476 +#: part/serializers.py:1448 msgid "Override calculated value for minimum price" msgstr "" -#: part/serializers.py:1483 +#: part/serializers.py:1455 msgid "Minimum price currency" msgstr "" -#: part/serializers.py:1490 +#: part/serializers.py:1462 msgid "Maximum Price" msgstr "" -#: part/serializers.py:1491 +#: part/serializers.py:1463 msgid "Override calculated value for maximum price" msgstr "" -#: part/serializers.py:1498 +#: part/serializers.py:1470 msgid "Maximum price currency" msgstr "" -#: part/serializers.py:1527 +#: part/serializers.py:1499 msgid "Update" msgstr "" -#: part/serializers.py:1528 +#: part/serializers.py:1500 msgid "Update pricing for this part" msgstr "" -#: part/serializers.py:1551 +#: part/serializers.py:1523 #, python-brace-format msgid "Could not convert from provided currencies to {default_currency}" msgstr "" -#: part/serializers.py:1558 +#: part/serializers.py:1530 msgid "Minimum price must not be greater than maximum price" msgstr "" -#: part/serializers.py:1561 +#: part/serializers.py:1533 msgid "Maximum price must not be less than minimum price" msgstr "" -#: part/serializers.py:1715 +#: part/serializers.py:1687 msgid "Select the parent assembly" msgstr "" -#: part/serializers.py:1735 +#: part/serializers.py:1707 msgid "Select the component part" msgstr "" -#: part/serializers.py:1929 +#: part/serializers.py:1901 msgid "Select part to copy BOM from" msgstr "" -#: part/serializers.py:1937 +#: part/serializers.py:1909 msgid "Remove Existing Data" msgstr "" -#: part/serializers.py:1938 +#: part/serializers.py:1910 msgid "Remove existing BOM items before copying" msgstr "" -#: part/serializers.py:1943 +#: part/serializers.py:1915 msgid "Include Inherited" msgstr "" -#: part/serializers.py:1944 +#: part/serializers.py:1916 msgid "Include BOM items which are inherited from templated parts" msgstr "" -#: part/serializers.py:1949 +#: part/serializers.py:1921 msgid "Skip Invalid Rows" msgstr "" -#: part/serializers.py:1950 +#: part/serializers.py:1922 msgid "Enable this option to skip invalid rows" msgstr "" -#: part/serializers.py:1955 +#: part/serializers.py:1927 msgid "Copy Substitute Parts" msgstr "" -#: part/serializers.py:1956 +#: part/serializers.py:1928 msgid "Copy substitute parts when duplicate BOM items" msgstr "" @@ -8455,115 +8459,119 @@ msgstr "" msgid "Quantity does not match serial numbers" msgstr "" -#: stock/models.py:2012 stock/models.py:2917 +#: stock/models.py:1912 +msgid "Cannot assign stock to structural location" +msgstr "" + +#: stock/models.py:2029 stock/models.py:2934 msgid "Test template does not exist" msgstr "" -#: stock/models.py:2030 +#: stock/models.py:2047 msgid "Stock item has been assigned to a sales order" msgstr "" -#: stock/models.py:2034 +#: stock/models.py:2051 msgid "Stock item is installed in another item" msgstr "" -#: stock/models.py:2037 +#: stock/models.py:2054 msgid "Stock item contains other items" msgstr "" -#: stock/models.py:2040 +#: stock/models.py:2057 msgid "Stock item has been assigned to a customer" msgstr "" -#: stock/models.py:2043 stock/models.py:2226 +#: stock/models.py:2060 stock/models.py:2243 msgid "Stock item is currently in production" msgstr "" -#: stock/models.py:2046 +#: stock/models.py:2063 msgid "Serialized stock cannot be merged" msgstr "" -#: stock/models.py:2053 stock/serializers.py:1462 +#: stock/models.py:2070 stock/serializers.py:1462 msgid "Duplicate stock items" msgstr "" -#: stock/models.py:2057 +#: stock/models.py:2074 msgid "Stock items must refer to the same part" msgstr "" -#: stock/models.py:2065 +#: stock/models.py:2082 msgid "Stock items must refer to the same supplier part" msgstr "" -#: stock/models.py:2070 +#: stock/models.py:2087 msgid "Stock status codes must match" msgstr "" -#: stock/models.py:2349 +#: stock/models.py:2366 msgid "StockItem cannot be moved as it is not in stock" msgstr "" -#: stock/models.py:2818 +#: stock/models.py:2835 msgid "Stock Item Tracking" msgstr "" -#: stock/models.py:2849 +#: stock/models.py:2866 msgid "Entry notes" msgstr "" -#: stock/models.py:2889 +#: stock/models.py:2906 msgid "Stock Item Test Result" msgstr "" -#: stock/models.py:2920 +#: stock/models.py:2937 msgid "Value must be provided for this test" msgstr "" -#: stock/models.py:2924 +#: stock/models.py:2941 msgid "Attachment must be uploaded for this test" msgstr "" -#: stock/models.py:2929 +#: stock/models.py:2946 msgid "Invalid value for this test" msgstr "" -#: stock/models.py:2953 +#: stock/models.py:2970 msgid "Test result" msgstr "" -#: stock/models.py:2960 +#: stock/models.py:2977 msgid "Test output value" msgstr "" -#: stock/models.py:2968 stock/serializers.py:248 +#: stock/models.py:2985 stock/serializers.py:248 msgid "Test result attachment" msgstr "" -#: stock/models.py:2972 +#: stock/models.py:2989 msgid "Test notes" msgstr "" -#: stock/models.py:2980 +#: stock/models.py:2997 msgid "Test station" msgstr "" -#: stock/models.py:2981 +#: stock/models.py:2998 msgid "The identifier of the test station where the test was performed" msgstr "" -#: stock/models.py:2987 +#: stock/models.py:3004 msgid "Started" msgstr "" -#: stock/models.py:2988 +#: stock/models.py:3005 msgid "The timestamp of the test start" msgstr "" -#: stock/models.py:2994 +#: stock/models.py:3011 msgid "Finished" msgstr "" -#: stock/models.py:2995 +#: stock/models.py:3012 msgid "The timestamp of the test finish" msgstr "" @@ -8902,83 +8910,87 @@ msgstr "" msgid "Stock manually removed" msgstr "" -#: stock/status_codes.py:57 +#: stock/status_codes.py:56 +msgid "Serialized stock items" +msgstr "" + +#: stock/status_codes.py:58 msgid "Returned to stock" msgstr "" -#: stock/status_codes.py:60 +#: stock/status_codes.py:61 msgid "Location changed" msgstr "" -#: stock/status_codes.py:61 +#: stock/status_codes.py:62 msgid "Stock updated" msgstr "" -#: stock/status_codes.py:64 +#: stock/status_codes.py:65 msgid "Installed into assembly" msgstr "" -#: stock/status_codes.py:65 +#: stock/status_codes.py:66 msgid "Removed from assembly" msgstr "" -#: stock/status_codes.py:67 +#: stock/status_codes.py:68 msgid "Installed component item" msgstr "" -#: stock/status_codes.py:68 +#: stock/status_codes.py:69 msgid "Removed component item" msgstr "" -#: stock/status_codes.py:71 +#: stock/status_codes.py:72 msgid "Split from parent item" msgstr "" -#: stock/status_codes.py:72 +#: stock/status_codes.py:73 msgid "Split child item" msgstr "" -#: stock/status_codes.py:75 +#: stock/status_codes.py:76 msgid "Merged stock items" msgstr "" -#: stock/status_codes.py:78 +#: stock/status_codes.py:79 msgid "Converted to variant" msgstr "" -#: stock/status_codes.py:81 +#: stock/status_codes.py:82 msgid "Build order output created" msgstr "" -#: stock/status_codes.py:82 +#: stock/status_codes.py:83 msgid "Build order output completed" msgstr "" -#: stock/status_codes.py:83 +#: stock/status_codes.py:84 msgid "Build order output rejected" msgstr "" -#: stock/status_codes.py:84 +#: stock/status_codes.py:85 msgid "Consumed by build order" msgstr "" -#: stock/status_codes.py:87 +#: stock/status_codes.py:88 msgid "Shipped against Sales Order" msgstr "" -#: stock/status_codes.py:90 +#: stock/status_codes.py:91 msgid "Received against Purchase Order" msgstr "" -#: stock/status_codes.py:93 +#: stock/status_codes.py:94 msgid "Returned against Return Order" msgstr "" -#: stock/status_codes.py:96 +#: stock/status_codes.py:97 msgid "Sent to customer" msgstr "" -#: stock/status_codes.py:97 +#: stock/status_codes.py:98 msgid "Returned from customer" msgstr "" diff --git a/src/backend/InvenTree/locale/bg/LC_MESSAGES/django.po b/src/backend/InvenTree/locale/bg/LC_MESSAGES/django.po index e72f42a53a..53f10e8791 100644 --- a/src/backend/InvenTree/locale/bg/LC_MESSAGES/django.po +++ b/src/backend/InvenTree/locale/bg/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: inventree\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-11-19 04:55+0000\n" -"PO-Revision-Date: 2025-11-19 04:59\n" +"POT-Creation-Date: 2025-11-24 06:50+0000\n" +"PO-Revision-Date: 2025-11-24 06:53\n" "Last-Translator: \n" "Language-Team: Bulgarian\n" "Language: bg_BG\n" @@ -81,21 +81,21 @@ msgstr "Въведената основна електронна поща е н msgid "The provided email domain is not approved." msgstr "Въведеният домейн на електронната поща не е утвърден." -#: InvenTree/conversion.py:166 +#: InvenTree/conversion.py:240 #, python-brace-format msgid "Invalid unit provided ({unit})" msgstr "" -#: InvenTree/conversion.py:183 +#: InvenTree/conversion.py:257 msgid "No value provided" msgstr "Не е зададена стойност" -#: InvenTree/conversion.py:210 +#: InvenTree/conversion.py:284 #, python-brace-format msgid "Could not convert {original} to {unit}" msgstr "Преобразуването на {original} в {unit} не беше успешно" -#: InvenTree/conversion.py:212 InvenTree/conversion.py:226 +#: InvenTree/conversion.py:286 InvenTree/conversion.py:300 #: InvenTree/helpers.py:597 order/models.py:720 order/models.py:1015 msgid "Invalid quantity provided" msgstr "Въведена е недопустима стойност" @@ -116,7 +116,7 @@ msgstr "" #: build/serializers.py:580 build/serializers.py:1788 company/models.py:857 #: order/models.py:1780 #: report/templates/report/inventree_build_order_report.html:172 -#: stock/models.py:2848 stock/models.py:2972 stock/serializers.py:717 +#: stock/models.py:2865 stock/models.py:2989 stock/serializers.py:717 #: stock/serializers.py:893 stock/serializers.py:1035 stock/serializers.py:1336 #: stock/serializers.py:1425 stock/serializers.py:1624 msgid "Notes" @@ -345,7 +345,7 @@ msgstr "" msgid "Currency" msgstr "" -#: InvenTree/serializers.py:298 part/serializers.py:1385 +#: InvenTree/serializers.py:298 part/serializers.py:1357 msgid "Select currency from available options" msgstr "" @@ -553,14 +553,14 @@ msgstr "" #: build/api.py:100 build/api.py:466 build/api.py:845 build/models.py:270 #: build/serializers.py:1225 build/serializers.py:1356 -#: build/serializers.py:1427 company/models.py:1067 company/serializers.py:445 +#: build/serializers.py:1427 company/models.py:1067 company/serializers.py:491 #: order/api.py:298 order/api.py:302 order/api.py:929 order/api.py:1187 #: order/api.py:1190 order/models.py:1941 order/models.py:2108 #: order/models.py:2109 part/api.py:1233 part/api.py:1236 part/api.py:1302 #: part/api.py:1589 part/models.py:472 part/models.py:3296 part/models.py:3439 #: part/models.py:3497 part/models.py:3518 part/models.py:3540 #: part/models.py:3679 part/models.py:4046 part/models.py:4368 -#: part/models.py:4787 part/serializers.py:1928 +#: part/models.py:4787 part/serializers.py:1900 #: report/templates/report/inventree_bill_of_materials_report.html:110 #: report/templates/report/inventree_bill_of_materials_report.html:137 #: report/templates/report/inventree_build_order_report.html:109 @@ -582,7 +582,7 @@ msgstr "Част" #: build/api.py:120 build/api.py:123 build/serializers.py:1438 part/api.py:980 #: part/api.py:1316 part/api.py:1600 part/models.py:1080 part/models.py:3568 -#: part/models.py:4162 part/serializers.py:1752 stock/api.py:869 +#: part/models.py:4162 part/serializers.py:1724 stock/api.py:869 msgid "Category" msgstr "" @@ -663,7 +663,7 @@ msgid "Optional" msgstr "" #: build/api.py:455 build/serializers.py:1415 common/setting/system.py:456 -#: part/models.py:1202 part/serializers.py:1714 part/serializers.py:1725 +#: part/models.py:1202 part/serializers.py:1686 part/serializers.py:1697 #: stock/api.py:639 msgid "Assembly" msgstr "" @@ -688,16 +688,16 @@ msgstr "" msgid "Consumed" msgstr "" -#: build/api.py:499 company/models.py:912 company/serializers.py:440 +#: build/api.py:499 company/models.py:912 company/serializers.py:474 #: templates/email/build_order_required_stock.html:19 #: templates/email/low_stock_notification.html:17 #: templates/email/part_event_notification.html:18 msgid "Available" msgstr "" -#: build/api.py:523 build/serializers.py:1466 company/serializers.py:437 -#: order/serializers.py:1281 part/serializers.py:959 part/serializers.py:1306 -#: part/serializers.py:1761 +#: build/api.py:523 build/serializers.py:1466 company/serializers.py:471 +#: order/serializers.py:1281 part/serializers.py:931 part/serializers.py:1278 +#: part/serializers.py:1733 msgid "On Order" msgstr "" @@ -963,7 +963,7 @@ msgstr "" #: build/models.py:1136 build/models.py:1234 build/serializers.py:285 #: build/serializers.py:335 build/serializers.py:965 build/serializers.py:1739 #: order/models.py:717 order/serializers.py:658 order/serializers.py:844 -#: part/serializers.py:1708 stock/models.py:940 stock/models.py:1430 +#: part/serializers.py:1680 stock/models.py:940 stock/models.py:1430 #: stock/models.py:1878 stock/serializers.py:688 stock/serializers.py:1580 msgid "Quantity must be greater than zero" msgstr "" @@ -1385,20 +1385,20 @@ msgstr "" msgid "BOM Item" msgstr "" -#: build/serializers.py:1467 order/serializers.py:1282 part/serializers.py:1310 -#: part/serializers.py:1765 +#: build/serializers.py:1467 order/serializers.py:1282 part/serializers.py:1282 +#: part/serializers.py:1737 msgid "In Production" msgstr "" -#: build/serializers.py:1469 part/serializers.py:950 part/serializers.py:1314 +#: build/serializers.py:1469 part/serializers.py:922 part/serializers.py:1286 msgid "Scheduled to Build" msgstr "" -#: build/serializers.py:1472 part/serializers.py:987 +#: build/serializers.py:1472 part/serializers.py:959 msgid "External Stock" msgstr "" -#: build/serializers.py:1473 part/serializers.py:1300 part/serializers.py:1808 +#: build/serializers.py:1473 part/serializers.py:1272 part/serializers.py:1780 msgid "Available Stock" msgstr "" @@ -1588,7 +1588,7 @@ msgstr "Потребител" msgid "Price break quantity" msgstr "" -#: common/models.py:1348 company/serializers.py:564 order/models.py:1842 +#: common/models.py:1348 company/serializers.py:357 order/models.py:1842 #: order/models.py:3043 msgid "Price" msgstr "" @@ -1760,7 +1760,7 @@ msgstr "" msgid "Unit definition" msgstr "" -#: common/models.py:1911 common/models.py:1974 stock/models.py:2967 +#: common/models.py:1911 common/models.py:1974 stock/models.py:2984 #: stock/serializers.py:247 msgid "Attachment" msgstr "" @@ -1839,7 +1839,7 @@ msgstr "" #: common/models.py:2090 common/models.py:2329 company/models.py:622 #: machine/serializers.py:27 -#: report/templates/report/inventree_test_report.html:104 stock/models.py:2959 +#: report/templates/report/inventree_test_report.html:104 stock/models.py:2976 msgid "Value" msgstr "" @@ -2048,7 +2048,7 @@ msgid "Response data from the barcode scan" msgstr "" #: common/models.py:2417 report/templates/report/inventree_test_report.html:103 -#: stock/models.py:2953 +#: stock/models.py:2970 msgid "Result" msgstr "" @@ -2141,7 +2141,7 @@ msgid "Linked thread for this message" msgstr "" #: common/models.py:2656 -msgid "Prioriy" +msgid "Priority" msgstr "" #: common/models.py:2698 @@ -2671,8 +2671,8 @@ msgstr "" msgid "Parts can be assembled from other components by default" msgstr "" -#: common/setting/system.py:462 part/models.py:1208 part/serializers.py:1734 -#: part/serializers.py:1741 +#: common/setting/system.py:462 part/models.py:1208 part/serializers.py:1706 +#: part/serializers.py:1713 msgid "Component" msgstr "" @@ -3772,7 +3772,7 @@ msgstr "" msgid "Supplier is Active" msgstr "" -#: company/api.py:307 company/models.py:520 company/serializers.py:457 +#: company/api.py:307 company/models.py:520 company/serializers.py:503 #: part/serializers.py:566 msgid "Manufacturer" msgstr "" @@ -3964,7 +3964,7 @@ msgid "Link to address information (external)" msgstr "" #: company/models.py:492 company/models.py:609 company/models.py:832 -#: company/serializers.py:471 stock/api.py:561 +#: company/serializers.py:517 stock/api.py:561 msgid "Manufacturer Part" msgstr "" @@ -3981,7 +3981,7 @@ msgstr "" msgid "Select manufacturer" msgstr "" -#: company/models.py:527 company/serializers.py:479 order/serializers.py:734 +#: company/models.py:527 company/serializers.py:525 order/serializers.py:734 #: part/serializers.py:576 msgid "MPN" msgstr "" @@ -4030,7 +4030,7 @@ msgstr "" msgid "Linked manufacturer part must reference the same base part" msgstr "" -#: company/models.py:810 company/serializers.py:449 company/serializers.py:467 +#: company/models.py:810 company/serializers.py:495 company/serializers.py:513 #: order/models.py:639 part/serializers.py:550 #: plugin/builtin/suppliers/digikey.py:26 plugin/builtin/suppliers/lcsc.py:27 #: plugin/builtin/suppliers/mouser.py:25 plugin/builtin/suppliers/tme.py:27 @@ -4134,10 +4134,14 @@ msgstr "" msgid "Company Name" msgstr "" -#: company/serializers.py:433 part/serializers.py:955 stock/serializers.py:428 +#: company/serializers.py:467 part/serializers.py:927 stock/serializers.py:428 msgid "In Stock" msgstr "" +#: company/serializers.py:484 +msgid "Price Breaks" +msgstr "" + #: data_exporter/mixins.py:325 data_exporter/mixins.py:403 msgid "Error occurred during data export" msgstr "" @@ -4290,7 +4294,7 @@ msgstr "" msgid "Errors" msgstr "" -#: importer/models.py:550 part/serializers.py:1268 +#: importer/models.py:550 part/serializers.py:1240 msgid "Valid" msgstr "" @@ -5677,7 +5681,7 @@ msgstr "" msgid "Part category" msgstr "" -#: part/models.py:1088 part/serializers.py:929 +#: part/models.py:1088 part/serializers.py:901 #: report/templates/report/inventree_stock_location_report.html:103 msgid "IPN" msgstr "" @@ -5718,7 +5722,7 @@ msgstr "" msgid "Expiry time (in days) for stock items of this part" msgstr "" -#: part/models.py:1186 part/serializers.py:1003 +#: part/models.py:1186 part/serializers.py:975 msgid "Minimum Stock" msgstr "" @@ -6418,203 +6422,203 @@ msgstr "" msgid "Supplier part matching this SKU already exists" msgstr "" -#: part/serializers.py:914 +#: part/serializers.py:886 msgid "Category Name" msgstr "" -#: part/serializers.py:943 +#: part/serializers.py:915 msgid "Building" msgstr "" -#: part/serializers.py:944 +#: part/serializers.py:916 msgid "Quantity of this part currently being in production" msgstr "" -#: part/serializers.py:951 +#: part/serializers.py:923 msgid "Outstanding quantity of this part scheduled to be built" msgstr "" -#: part/serializers.py:971 stock/serializers.py:1019 stock/serializers.py:1189 +#: part/serializers.py:943 stock/serializers.py:1019 stock/serializers.py:1189 #: users/ruleset.py:30 msgid "Stock Items" msgstr "" -#: part/serializers.py:975 +#: part/serializers.py:947 msgid "Revisions" msgstr "" -#: part/serializers.py:979 +#: part/serializers.py:951 msgid "Suppliers" msgstr "" -#: part/serializers.py:983 part/serializers.py:1297 +#: part/serializers.py:955 part/serializers.py:1269 #: templates/email/low_stock_notification.html:16 #: templates/email/part_event_notification.html:17 msgid "Total Stock" msgstr "Цялостна наличност" -#: part/serializers.py:991 +#: part/serializers.py:963 msgid "Unallocated Stock" msgstr "" -#: part/serializers.py:999 +#: part/serializers.py:971 msgid "Variant Stock" msgstr "" -#: part/serializers.py:1054 +#: part/serializers.py:1026 msgid "Duplicate Part" msgstr "" -#: part/serializers.py:1055 +#: part/serializers.py:1027 msgid "Copy initial data from another Part" msgstr "" -#: part/serializers.py:1061 +#: part/serializers.py:1033 msgid "Initial Stock" msgstr "" -#: part/serializers.py:1062 +#: part/serializers.py:1034 msgid "Create Part with initial stock quantity" msgstr "" -#: part/serializers.py:1068 +#: part/serializers.py:1040 msgid "Supplier Information" msgstr "" -#: part/serializers.py:1069 +#: part/serializers.py:1041 msgid "Add initial supplier information for this part" msgstr "" -#: part/serializers.py:1077 +#: part/serializers.py:1049 msgid "Copy Category Parameters" msgstr "" -#: part/serializers.py:1078 +#: part/serializers.py:1050 msgid "Copy parameter templates from selected part category" msgstr "" -#: part/serializers.py:1083 +#: part/serializers.py:1055 msgid "Existing Image" msgstr "" -#: part/serializers.py:1084 +#: part/serializers.py:1056 msgid "Filename of an existing part image" msgstr "" -#: part/serializers.py:1101 +#: part/serializers.py:1073 msgid "Image file does not exist" msgstr "" -#: part/serializers.py:1269 +#: part/serializers.py:1241 msgid "Validate entire Bill of Materials" msgstr "" -#: part/serializers.py:1303 part/serializers.py:1769 +#: part/serializers.py:1275 part/serializers.py:1741 msgid "Can Build" msgstr "" -#: part/serializers.py:1320 +#: part/serializers.py:1292 msgid "Required for Build Orders" msgstr "" -#: part/serializers.py:1325 +#: part/serializers.py:1297 msgid "Allocated to Build Orders" msgstr "" -#: part/serializers.py:1332 +#: part/serializers.py:1304 msgid "Required for Sales Orders" msgstr "" -#: part/serializers.py:1336 +#: part/serializers.py:1308 msgid "Allocated to Sales Orders" msgstr "" -#: part/serializers.py:1475 +#: part/serializers.py:1447 msgid "Minimum Price" msgstr "" -#: part/serializers.py:1476 +#: part/serializers.py:1448 msgid "Override calculated value for minimum price" msgstr "" -#: part/serializers.py:1483 +#: part/serializers.py:1455 msgid "Minimum price currency" msgstr "" -#: part/serializers.py:1490 +#: part/serializers.py:1462 msgid "Maximum Price" msgstr "" -#: part/serializers.py:1491 +#: part/serializers.py:1463 msgid "Override calculated value for maximum price" msgstr "" -#: part/serializers.py:1498 +#: part/serializers.py:1470 msgid "Maximum price currency" msgstr "" -#: part/serializers.py:1527 +#: part/serializers.py:1499 msgid "Update" msgstr "" -#: part/serializers.py:1528 +#: part/serializers.py:1500 msgid "Update pricing for this part" msgstr "" -#: part/serializers.py:1551 +#: part/serializers.py:1523 #, python-brace-format msgid "Could not convert from provided currencies to {default_currency}" msgstr "" -#: part/serializers.py:1558 +#: part/serializers.py:1530 msgid "Minimum price must not be greater than maximum price" msgstr "" -#: part/serializers.py:1561 +#: part/serializers.py:1533 msgid "Maximum price must not be less than minimum price" msgstr "" -#: part/serializers.py:1715 +#: part/serializers.py:1687 msgid "Select the parent assembly" msgstr "" -#: part/serializers.py:1735 +#: part/serializers.py:1707 msgid "Select the component part" msgstr "" -#: part/serializers.py:1929 +#: part/serializers.py:1901 msgid "Select part to copy BOM from" msgstr "" -#: part/serializers.py:1937 +#: part/serializers.py:1909 msgid "Remove Existing Data" msgstr "" -#: part/serializers.py:1938 +#: part/serializers.py:1910 msgid "Remove existing BOM items before copying" msgstr "" -#: part/serializers.py:1943 +#: part/serializers.py:1915 msgid "Include Inherited" msgstr "" -#: part/serializers.py:1944 +#: part/serializers.py:1916 msgid "Include BOM items which are inherited from templated parts" msgstr "" -#: part/serializers.py:1949 +#: part/serializers.py:1921 msgid "Skip Invalid Rows" msgstr "" -#: part/serializers.py:1950 +#: part/serializers.py:1922 msgid "Enable this option to skip invalid rows" msgstr "" -#: part/serializers.py:1955 +#: part/serializers.py:1927 msgid "Copy Substitute Parts" msgstr "" -#: part/serializers.py:1956 +#: part/serializers.py:1928 msgid "Copy substitute parts when duplicate BOM items" msgstr "" @@ -8455,115 +8459,119 @@ msgstr "" msgid "Quantity does not match serial numbers" msgstr "" -#: stock/models.py:2012 stock/models.py:2917 +#: stock/models.py:1912 +msgid "Cannot assign stock to structural location" +msgstr "" + +#: stock/models.py:2029 stock/models.py:2934 msgid "Test template does not exist" msgstr "" -#: stock/models.py:2030 +#: stock/models.py:2047 msgid "Stock item has been assigned to a sales order" msgstr "" -#: stock/models.py:2034 +#: stock/models.py:2051 msgid "Stock item is installed in another item" msgstr "" -#: stock/models.py:2037 +#: stock/models.py:2054 msgid "Stock item contains other items" msgstr "" -#: stock/models.py:2040 +#: stock/models.py:2057 msgid "Stock item has been assigned to a customer" msgstr "" -#: stock/models.py:2043 stock/models.py:2226 +#: stock/models.py:2060 stock/models.py:2243 msgid "Stock item is currently in production" msgstr "" -#: stock/models.py:2046 +#: stock/models.py:2063 msgid "Serialized stock cannot be merged" msgstr "" -#: stock/models.py:2053 stock/serializers.py:1462 +#: stock/models.py:2070 stock/serializers.py:1462 msgid "Duplicate stock items" msgstr "" -#: stock/models.py:2057 +#: stock/models.py:2074 msgid "Stock items must refer to the same part" msgstr "" -#: stock/models.py:2065 +#: stock/models.py:2082 msgid "Stock items must refer to the same supplier part" msgstr "" -#: stock/models.py:2070 +#: stock/models.py:2087 msgid "Stock status codes must match" msgstr "" -#: stock/models.py:2349 +#: stock/models.py:2366 msgid "StockItem cannot be moved as it is not in stock" msgstr "" -#: stock/models.py:2818 +#: stock/models.py:2835 msgid "Stock Item Tracking" msgstr "" -#: stock/models.py:2849 +#: stock/models.py:2866 msgid "Entry notes" msgstr "" -#: stock/models.py:2889 +#: stock/models.py:2906 msgid "Stock Item Test Result" msgstr "" -#: stock/models.py:2920 +#: stock/models.py:2937 msgid "Value must be provided for this test" msgstr "" -#: stock/models.py:2924 +#: stock/models.py:2941 msgid "Attachment must be uploaded for this test" msgstr "" -#: stock/models.py:2929 +#: stock/models.py:2946 msgid "Invalid value for this test" msgstr "" -#: stock/models.py:2953 +#: stock/models.py:2970 msgid "Test result" msgstr "" -#: stock/models.py:2960 +#: stock/models.py:2977 msgid "Test output value" msgstr "" -#: stock/models.py:2968 stock/serializers.py:248 +#: stock/models.py:2985 stock/serializers.py:248 msgid "Test result attachment" msgstr "" -#: stock/models.py:2972 +#: stock/models.py:2989 msgid "Test notes" msgstr "" -#: stock/models.py:2980 +#: stock/models.py:2997 msgid "Test station" msgstr "" -#: stock/models.py:2981 +#: stock/models.py:2998 msgid "The identifier of the test station where the test was performed" msgstr "" -#: stock/models.py:2987 +#: stock/models.py:3004 msgid "Started" msgstr "" -#: stock/models.py:2988 +#: stock/models.py:3005 msgid "The timestamp of the test start" msgstr "" -#: stock/models.py:2994 +#: stock/models.py:3011 msgid "Finished" msgstr "" -#: stock/models.py:2995 +#: stock/models.py:3012 msgid "The timestamp of the test finish" msgstr "" @@ -8902,83 +8910,87 @@ msgstr "" msgid "Stock manually removed" msgstr "" -#: stock/status_codes.py:57 +#: stock/status_codes.py:56 +msgid "Serialized stock items" +msgstr "" + +#: stock/status_codes.py:58 msgid "Returned to stock" msgstr "" -#: stock/status_codes.py:60 +#: stock/status_codes.py:61 msgid "Location changed" msgstr "" -#: stock/status_codes.py:61 +#: stock/status_codes.py:62 msgid "Stock updated" msgstr "" -#: stock/status_codes.py:64 +#: stock/status_codes.py:65 msgid "Installed into assembly" msgstr "" -#: stock/status_codes.py:65 +#: stock/status_codes.py:66 msgid "Removed from assembly" msgstr "" -#: stock/status_codes.py:67 +#: stock/status_codes.py:68 msgid "Installed component item" msgstr "" -#: stock/status_codes.py:68 +#: stock/status_codes.py:69 msgid "Removed component item" msgstr "" -#: stock/status_codes.py:71 +#: stock/status_codes.py:72 msgid "Split from parent item" msgstr "" -#: stock/status_codes.py:72 +#: stock/status_codes.py:73 msgid "Split child item" msgstr "" -#: stock/status_codes.py:75 +#: stock/status_codes.py:76 msgid "Merged stock items" msgstr "" -#: stock/status_codes.py:78 +#: stock/status_codes.py:79 msgid "Converted to variant" msgstr "" -#: stock/status_codes.py:81 +#: stock/status_codes.py:82 msgid "Build order output created" msgstr "" -#: stock/status_codes.py:82 +#: stock/status_codes.py:83 msgid "Build order output completed" msgstr "" -#: stock/status_codes.py:83 +#: stock/status_codes.py:84 msgid "Build order output rejected" msgstr "" -#: stock/status_codes.py:84 +#: stock/status_codes.py:85 msgid "Consumed by build order" msgstr "" -#: stock/status_codes.py:87 +#: stock/status_codes.py:88 msgid "Shipped against Sales Order" msgstr "" -#: stock/status_codes.py:90 +#: stock/status_codes.py:91 msgid "Received against Purchase Order" msgstr "" -#: stock/status_codes.py:93 +#: stock/status_codes.py:94 msgid "Returned against Return Order" msgstr "" -#: stock/status_codes.py:96 +#: stock/status_codes.py:97 msgid "Sent to customer" msgstr "" -#: stock/status_codes.py:97 +#: stock/status_codes.py:98 msgid "Returned from customer" msgstr "" diff --git a/src/backend/InvenTree/locale/cs/LC_MESSAGES/django.po b/src/backend/InvenTree/locale/cs/LC_MESSAGES/django.po index 11f8f3fd4c..61fb188686 100644 --- a/src/backend/InvenTree/locale/cs/LC_MESSAGES/django.po +++ b/src/backend/InvenTree/locale/cs/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: inventree\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-11-19 04:55+0000\n" -"PO-Revision-Date: 2025-11-19 19:39\n" +"POT-Creation-Date: 2025-11-24 06:50+0000\n" +"PO-Revision-Date: 2025-11-25 11:06\n" "Last-Translator: \n" "Language-Team: Czech\n" "Language: cs_CZ\n" @@ -81,21 +81,21 @@ msgstr "Zadaná primární e-mailová adresa je neplatná." msgid "The provided email domain is not approved." msgstr "Zadaná e-mailová doména není povolena." -#: InvenTree/conversion.py:166 +#: InvenTree/conversion.py:240 #, python-brace-format msgid "Invalid unit provided ({unit})" msgstr "Zadána neplatná jednotka ({unit})" -#: InvenTree/conversion.py:183 +#: InvenTree/conversion.py:257 msgid "No value provided" msgstr "Není k dispozici žádná hodnota" -#: InvenTree/conversion.py:210 +#: InvenTree/conversion.py:284 #, python-brace-format msgid "Could not convert {original} to {unit}" msgstr "Nelze převést {original} na {unit}" -#: InvenTree/conversion.py:212 InvenTree/conversion.py:226 +#: InvenTree/conversion.py:286 InvenTree/conversion.py:300 #: InvenTree/helpers.py:597 order/models.py:720 order/models.py:1015 msgid "Invalid quantity provided" msgstr "Vyplněno neplatné množství" @@ -116,7 +116,7 @@ msgstr "Neplaté desetinné číslo" #: build/serializers.py:580 build/serializers.py:1788 company/models.py:857 #: order/models.py:1780 #: report/templates/report/inventree_build_order_report.html:172 -#: stock/models.py:2848 stock/models.py:2972 stock/serializers.py:717 +#: stock/models.py:2865 stock/models.py:2989 stock/serializers.py:717 #: stock/serializers.py:893 stock/serializers.py:1035 stock/serializers.py:1336 #: stock/serializers.py:1425 stock/serializers.py:1624 msgid "Notes" @@ -345,7 +345,7 @@ msgstr "Musí být platné číslo" msgid "Currency" msgstr "Měna" -#: InvenTree/serializers.py:298 part/serializers.py:1385 +#: InvenTree/serializers.py:298 part/serializers.py:1357 msgid "Select currency from available options" msgstr "Vyberte měnu z dostupných možností" @@ -553,14 +553,14 @@ msgstr "Zahrnout varianty" #: build/api.py:100 build/api.py:466 build/api.py:845 build/models.py:270 #: build/serializers.py:1225 build/serializers.py:1356 -#: build/serializers.py:1427 company/models.py:1067 company/serializers.py:445 +#: build/serializers.py:1427 company/models.py:1067 company/serializers.py:491 #: order/api.py:298 order/api.py:302 order/api.py:929 order/api.py:1187 #: order/api.py:1190 order/models.py:1941 order/models.py:2108 #: order/models.py:2109 part/api.py:1233 part/api.py:1236 part/api.py:1302 #: part/api.py:1589 part/models.py:472 part/models.py:3296 part/models.py:3439 #: part/models.py:3497 part/models.py:3518 part/models.py:3540 #: part/models.py:3679 part/models.py:4046 part/models.py:4368 -#: part/models.py:4787 part/serializers.py:1928 +#: part/models.py:4787 part/serializers.py:1900 #: report/templates/report/inventree_bill_of_materials_report.html:110 #: report/templates/report/inventree_bill_of_materials_report.html:137 #: report/templates/report/inventree_build_order_report.html:109 @@ -582,7 +582,7 @@ msgstr "Díl" #: build/api.py:120 build/api.py:123 build/serializers.py:1438 part/api.py:980 #: part/api.py:1316 part/api.py:1600 part/models.py:1080 part/models.py:3568 -#: part/models.py:4162 part/serializers.py:1752 stock/api.py:869 +#: part/models.py:4162 part/serializers.py:1724 stock/api.py:869 msgid "Category" msgstr "Kategorie" @@ -663,7 +663,7 @@ msgid "Optional" msgstr "Volitelné" #: build/api.py:455 build/serializers.py:1415 common/setting/system.py:456 -#: part/models.py:1202 part/serializers.py:1714 part/serializers.py:1725 +#: part/models.py:1202 part/serializers.py:1686 part/serializers.py:1697 #: stock/api.py:639 msgid "Assembly" msgstr "Sestava" @@ -688,16 +688,16 @@ msgstr "Přiděleno" msgid "Consumed" msgstr "Spotřebováno" -#: build/api.py:499 company/models.py:912 company/serializers.py:440 +#: build/api.py:499 company/models.py:912 company/serializers.py:474 #: templates/email/build_order_required_stock.html:19 #: templates/email/low_stock_notification.html:17 #: templates/email/part_event_notification.html:18 msgid "Available" msgstr "Dostupné" -#: build/api.py:523 build/serializers.py:1466 company/serializers.py:437 -#: order/serializers.py:1281 part/serializers.py:959 part/serializers.py:1306 -#: part/serializers.py:1761 +#: build/api.py:523 build/serializers.py:1466 company/serializers.py:471 +#: order/serializers.py:1281 part/serializers.py:931 part/serializers.py:1278 +#: part/serializers.py:1733 msgid "On Order" msgstr "Na objednávku" @@ -963,7 +963,7 @@ msgstr "Výstup neodpovídá výrobnímu příkazu" #: build/models.py:1136 build/models.py:1234 build/serializers.py:285 #: build/serializers.py:335 build/serializers.py:965 build/serializers.py:1739 #: order/models.py:717 order/serializers.py:658 order/serializers.py:844 -#: part/serializers.py:1708 stock/models.py:940 stock/models.py:1430 +#: part/serializers.py:1680 stock/models.py:940 stock/models.py:1430 #: stock/models.py:1878 stock/serializers.py:688 stock/serializers.py:1580 msgid "Quantity must be greater than zero" msgstr "Množství musí být vyšší než nula" @@ -1385,20 +1385,20 @@ msgstr "Povolit varianty" msgid "BOM Item" msgstr "Položka kusovníku" -#: build/serializers.py:1467 order/serializers.py:1282 part/serializers.py:1310 -#: part/serializers.py:1765 +#: build/serializers.py:1467 order/serializers.py:1282 part/serializers.py:1282 +#: part/serializers.py:1737 msgid "In Production" msgstr "Ve výrobě" -#: build/serializers.py:1469 part/serializers.py:950 part/serializers.py:1314 +#: build/serializers.py:1469 part/serializers.py:922 part/serializers.py:1286 msgid "Scheduled to Build" msgstr "Naplánováno na sestavení" -#: build/serializers.py:1472 part/serializers.py:987 +#: build/serializers.py:1472 part/serializers.py:959 msgid "External Stock" msgstr "Externí zásoby" -#: build/serializers.py:1473 part/serializers.py:1300 part/serializers.py:1808 +#: build/serializers.py:1473 part/serializers.py:1272 part/serializers.py:1780 msgid "Available Stock" msgstr "Dostupné zásoby" @@ -1588,7 +1588,7 @@ msgstr "Uživatel" msgid "Price break quantity" msgstr "Množství cenové slevy" -#: common/models.py:1348 company/serializers.py:564 order/models.py:1842 +#: common/models.py:1348 company/serializers.py:357 order/models.py:1842 #: order/models.py:3043 msgid "Price" msgstr "Cena" @@ -1760,7 +1760,7 @@ msgstr "Definice" msgid "Unit definition" msgstr "Definice jednotky" -#: common/models.py:1911 common/models.py:1974 stock/models.py:2967 +#: common/models.py:1911 common/models.py:1974 stock/models.py:2984 #: stock/serializers.py:247 msgid "Attachment" msgstr "Příloha" @@ -1839,7 +1839,7 @@ msgstr "Logický klíč statusu, který je rovný tomuto vlastnímu statusu v po #: common/models.py:2090 common/models.py:2329 company/models.py:622 #: machine/serializers.py:27 -#: report/templates/report/inventree_test_report.html:104 stock/models.py:2959 +#: report/templates/report/inventree_test_report.html:104 stock/models.py:2976 msgid "Value" msgstr "Hodnota" @@ -2048,7 +2048,7 @@ msgid "Response data from the barcode scan" msgstr "Data z odezvy z čárového kódu" #: common/models.py:2417 report/templates/report/inventree_test_report.html:103 -#: stock/models.py:2953 +#: stock/models.py:2970 msgid "Result" msgstr "Výsledek" @@ -2141,7 +2141,7 @@ msgid "Linked thread for this message" msgstr "Vlákno propojeno k této zprávě" #: common/models.py:2656 -msgid "Prioriy" +msgid "Priority" msgstr "Priorita" #: common/models.py:2698 @@ -2671,8 +2671,8 @@ msgstr "Díly jsou ve výchozím nastavení šablony" msgid "Parts can be assembled from other components by default" msgstr "Díly lze ve výchozím nastavení sestavit z jiných komponentů" -#: common/setting/system.py:462 part/models.py:1208 part/serializers.py:1734 -#: part/serializers.py:1741 +#: common/setting/system.py:462 part/models.py:1208 part/serializers.py:1706 +#: part/serializers.py:1713 msgid "Component" msgstr "Komponent" @@ -3772,7 +3772,7 @@ msgstr "Interní díl je aktivní" msgid "Supplier is Active" msgstr "Dodavatel je aktivní" -#: company/api.py:307 company/models.py:520 company/serializers.py:457 +#: company/api.py:307 company/models.py:520 company/serializers.py:503 #: part/serializers.py:566 msgid "Manufacturer" msgstr "Výrobce" @@ -3964,7 +3964,7 @@ msgid "Link to address information (external)" msgstr "Odkaz na informace o adrese (externí)" #: company/models.py:492 company/models.py:609 company/models.py:832 -#: company/serializers.py:471 stock/api.py:561 +#: company/serializers.py:517 stock/api.py:561 msgid "Manufacturer Part" msgstr "Výrobce dílu" @@ -3981,7 +3981,7 @@ msgstr "Zvolte díl" msgid "Select manufacturer" msgstr "Vyberte výrobce" -#: company/models.py:527 company/serializers.py:479 order/serializers.py:734 +#: company/models.py:527 company/serializers.py:525 order/serializers.py:734 #: part/serializers.py:576 msgid "MPN" msgstr "MPN" @@ -4030,7 +4030,7 @@ msgstr "Jednotky balení musí být větší než nula" msgid "Linked manufacturer part must reference the same base part" msgstr "Odkazovaný díl výrobce musí odkazovat na stejný základní díl" -#: company/models.py:810 company/serializers.py:449 company/serializers.py:467 +#: company/models.py:810 company/serializers.py:495 company/serializers.py:513 #: order/models.py:639 part/serializers.py:550 #: plugin/builtin/suppliers/digikey.py:26 plugin/builtin/suppliers/lcsc.py:27 #: plugin/builtin/suppliers/mouser.py:25 plugin/builtin/suppliers/tme.py:27 @@ -4134,10 +4134,14 @@ msgstr "Výchozí měna používaná pro tohoto dodavatele" msgid "Company Name" msgstr "Jméno společnosti" -#: company/serializers.py:433 part/serializers.py:955 stock/serializers.py:428 +#: company/serializers.py:467 part/serializers.py:927 stock/serializers.py:428 msgid "In Stock" msgstr "Skladem" +#: company/serializers.py:484 +msgid "Price Breaks" +msgstr "Množstevní sleva" + #: data_exporter/mixins.py:325 data_exporter/mixins.py:403 msgid "Error occurred during data export" msgstr "Při exportu dat došlo k chybě" @@ -4290,7 +4294,7 @@ msgstr "Původní data řádku" msgid "Errors" msgstr "Chyby" -#: importer/models.py:550 part/serializers.py:1268 +#: importer/models.py:550 part/serializers.py:1240 msgid "Valid" msgstr "Platné" @@ -5677,7 +5681,7 @@ msgstr "Klíčová slova dílu pro zlepšení vyhledávání" msgid "Part category" msgstr "Kategorie dílu" -#: part/models.py:1088 part/serializers.py:929 +#: part/models.py:1088 part/serializers.py:901 #: report/templates/report/inventree_stock_location_report.html:103 msgid "IPN" msgstr "Interní číslo dílu (IPN)" @@ -5718,7 +5722,7 @@ msgstr "Výchozí expirace" msgid "Expiry time (in days) for stock items of this part" msgstr "Expirační čas (ve dnech) pro zásoby tohoto dílu" -#: part/models.py:1186 part/serializers.py:1003 +#: part/models.py:1186 part/serializers.py:975 msgid "Minimum Stock" msgstr "Minimální zásoby na skladě" @@ -6418,203 +6422,203 @@ msgstr "Výrobce dílu se stejným MPN již existuje" msgid "Supplier part matching this SKU already exists" msgstr "Dodavatelský díl s tímto SKU již existuje" -#: part/serializers.py:914 +#: part/serializers.py:886 msgid "Category Name" msgstr "Název kategorie" -#: part/serializers.py:943 +#: part/serializers.py:915 msgid "Building" msgstr "Budova" -#: part/serializers.py:944 +#: part/serializers.py:916 msgid "Quantity of this part currently being in production" msgstr "Množství tohoto dílu, které je v současné době ve výrobě" -#: part/serializers.py:951 +#: part/serializers.py:923 msgid "Outstanding quantity of this part scheduled to be built" msgstr "Zbývající množství tohoto dílu, které má být postaveno" -#: part/serializers.py:971 stock/serializers.py:1019 stock/serializers.py:1189 +#: part/serializers.py:943 stock/serializers.py:1019 stock/serializers.py:1189 #: users/ruleset.py:30 msgid "Stock Items" msgstr "Skladové položky" -#: part/serializers.py:975 +#: part/serializers.py:947 msgid "Revisions" msgstr "Revize" -#: part/serializers.py:979 +#: part/serializers.py:951 msgid "Suppliers" msgstr "Dodavatelé" -#: part/serializers.py:983 part/serializers.py:1297 +#: part/serializers.py:955 part/serializers.py:1269 #: templates/email/low_stock_notification.html:16 #: templates/email/part_event_notification.html:17 msgid "Total Stock" msgstr "Celkem skladem" -#: part/serializers.py:991 +#: part/serializers.py:963 msgid "Unallocated Stock" msgstr "Nezařazené zásoby" -#: part/serializers.py:999 +#: part/serializers.py:971 msgid "Variant Stock" msgstr "Skladové varianty" -#: part/serializers.py:1054 +#: part/serializers.py:1026 msgid "Duplicate Part" msgstr "Duplikovat díl" -#: part/serializers.py:1055 +#: part/serializers.py:1027 msgid "Copy initial data from another Part" msgstr "Kopírovat počáteční data z jiného dílu" -#: part/serializers.py:1061 +#: part/serializers.py:1033 msgid "Initial Stock" msgstr "Počáteční zásoby" -#: part/serializers.py:1062 +#: part/serializers.py:1034 msgid "Create Part with initial stock quantity" msgstr "Vytvořit díl s počátečním množstvím zásob" -#: part/serializers.py:1068 +#: part/serializers.py:1040 msgid "Supplier Information" msgstr "Informace o dodavateli" -#: part/serializers.py:1069 +#: part/serializers.py:1041 msgid "Add initial supplier information for this part" msgstr "Přidat počáteční informace dodavatele pro tento díl" -#: part/serializers.py:1077 +#: part/serializers.py:1049 msgid "Copy Category Parameters" msgstr "Kopírovat parametry kategorie" -#: part/serializers.py:1078 +#: part/serializers.py:1050 msgid "Copy parameter templates from selected part category" msgstr "Kopírovat šablony parametrů z vybrané kategorie dilu" -#: part/serializers.py:1083 +#: part/serializers.py:1055 msgid "Existing Image" msgstr "Stávající obrázek" -#: part/serializers.py:1084 +#: part/serializers.py:1056 msgid "Filename of an existing part image" msgstr "Název souboru existujícího obrázku dílu" -#: part/serializers.py:1101 +#: part/serializers.py:1073 msgid "Image file does not exist" msgstr "Obrázek neexistuje" -#: part/serializers.py:1269 +#: part/serializers.py:1241 msgid "Validate entire Bill of Materials" msgstr "Schválit celý kusovník" -#: part/serializers.py:1303 part/serializers.py:1769 +#: part/serializers.py:1275 part/serializers.py:1741 msgid "Can Build" msgstr "Lze postavit" -#: part/serializers.py:1320 +#: part/serializers.py:1292 msgid "Required for Build Orders" msgstr "Vyžadováno pro výrobní objednávku" -#: part/serializers.py:1325 +#: part/serializers.py:1297 msgid "Allocated to Build Orders" msgstr "Přířazeno výrobním objednávkám" -#: part/serializers.py:1332 +#: part/serializers.py:1304 msgid "Required for Sales Orders" msgstr "Vyžadováno pro prodejní objednávky" -#: part/serializers.py:1336 +#: part/serializers.py:1308 msgid "Allocated to Sales Orders" msgstr "Přiřazeno prodejním objednávkám" -#: part/serializers.py:1475 +#: part/serializers.py:1447 msgid "Minimum Price" msgstr "Minimální cena" -#: part/serializers.py:1476 +#: part/serializers.py:1448 msgid "Override calculated value for minimum price" msgstr "Přespat vypočítanou hodnotu pro minimální cenu" -#: part/serializers.py:1483 +#: part/serializers.py:1455 msgid "Minimum price currency" msgstr "Měna minimální ceny" -#: part/serializers.py:1490 +#: part/serializers.py:1462 msgid "Maximum Price" msgstr "Maximální cena" -#: part/serializers.py:1491 +#: part/serializers.py:1463 msgid "Override calculated value for maximum price" msgstr "Přespat vypočítanou hodnotu pro maximální cenu" -#: part/serializers.py:1498 +#: part/serializers.py:1470 msgid "Maximum price currency" msgstr "Měna maximální ceny" -#: part/serializers.py:1527 +#: part/serializers.py:1499 msgid "Update" msgstr "Aktualizovat" -#: part/serializers.py:1528 +#: part/serializers.py:1500 msgid "Update pricing for this part" msgstr "Aktualizovat cenu pro díl" -#: part/serializers.py:1551 +#: part/serializers.py:1523 #, python-brace-format msgid "Could not convert from provided currencies to {default_currency}" msgstr "Nelze převést z poskytnutých měn na {default_currency}" -#: part/serializers.py:1558 +#: part/serializers.py:1530 msgid "Minimum price must not be greater than maximum price" msgstr "Minimální cena musí být vyšší než maximální cena" -#: part/serializers.py:1561 +#: part/serializers.py:1533 msgid "Maximum price must not be less than minimum price" msgstr "Maximální cena nesmí být nížší než minimální cena" -#: part/serializers.py:1715 +#: part/serializers.py:1687 msgid "Select the parent assembly" msgstr "Vybrat nadřazenou sestavu" -#: part/serializers.py:1735 +#: part/serializers.py:1707 msgid "Select the component part" msgstr "Vyberte komponentu dílu" -#: part/serializers.py:1929 +#: part/serializers.py:1901 msgid "Select part to copy BOM from" msgstr "Vyberte díl pro kopírování kusovníku z" -#: part/serializers.py:1937 +#: part/serializers.py:1909 msgid "Remove Existing Data" msgstr "Odstranit existující data" -#: part/serializers.py:1938 +#: part/serializers.py:1910 msgid "Remove existing BOM items before copying" msgstr "Odstranit existující položky kusovníku před kopírováním" -#: part/serializers.py:1943 +#: part/serializers.py:1915 msgid "Include Inherited" msgstr "Zahrnout zděděné" -#: part/serializers.py:1944 +#: part/serializers.py:1916 msgid "Include BOM items which are inherited from templated parts" msgstr "Zahrnout položky kusovníku které jsou zdědené z šablonových dílů" -#: part/serializers.py:1949 +#: part/serializers.py:1921 msgid "Skip Invalid Rows" msgstr "Přeskočit neplatné řádky" -#: part/serializers.py:1950 +#: part/serializers.py:1922 msgid "Enable this option to skip invalid rows" msgstr "Povolte tuto možnost pro přeskočení neplatných řádků" -#: part/serializers.py:1955 +#: part/serializers.py:1927 msgid "Copy Substitute Parts" msgstr "Kopírovat náhradní díly" -#: part/serializers.py:1956 +#: part/serializers.py:1928 msgid "Copy substitute parts when duplicate BOM items" msgstr "Kopírovat náhradní díly při duplikaci položek kusovníku" @@ -8455,115 +8459,119 @@ msgstr "Sériové čísla musí být poskytnuta jako seznam" msgid "Quantity does not match serial numbers" msgstr "Množství neodpovídá sériovým číslům" -#: stock/models.py:2012 stock/models.py:2917 +#: stock/models.py:1912 +msgid "Cannot assign stock to structural location" +msgstr "Nelze přiřadit zásoby ke strukturálnímu umístění" + +#: stock/models.py:2029 stock/models.py:2934 msgid "Test template does not exist" msgstr "Testovací šablona neexistuje" -#: stock/models.py:2030 +#: stock/models.py:2047 msgid "Stock item has been assigned to a sales order" msgstr "Skladová položka byla přidělena prodejní objednávce" -#: stock/models.py:2034 +#: stock/models.py:2051 msgid "Stock item is installed in another item" msgstr "Skladová položka je nainstalována v jiné položce" -#: stock/models.py:2037 +#: stock/models.py:2054 msgid "Stock item contains other items" msgstr "Skladová položka obsahuje jiné položky" -#: stock/models.py:2040 +#: stock/models.py:2057 msgid "Stock item has been assigned to a customer" msgstr "Skladová položka byla přidělena zákazníkovi" -#: stock/models.py:2043 stock/models.py:2226 +#: stock/models.py:2060 stock/models.py:2243 msgid "Stock item is currently in production" msgstr "Skladová položka je ve výrobě" -#: stock/models.py:2046 +#: stock/models.py:2063 msgid "Serialized stock cannot be merged" msgstr "Serializované zásoby nelze sloučit" -#: stock/models.py:2053 stock/serializers.py:1462 +#: stock/models.py:2070 stock/serializers.py:1462 msgid "Duplicate stock items" msgstr "Duplicitní skladové položky" -#: stock/models.py:2057 +#: stock/models.py:2074 msgid "Stock items must refer to the same part" msgstr "Skladové položky musí odkazovat na stejný díl" -#: stock/models.py:2065 +#: stock/models.py:2082 msgid "Stock items must refer to the same supplier part" msgstr "Skladové položky musí odkazovat na stejný díl dodavatele" -#: stock/models.py:2070 +#: stock/models.py:2087 msgid "Stock status codes must match" msgstr "Kódy stavu zásob se musí shodovat" -#: stock/models.py:2349 +#: stock/models.py:2366 msgid "StockItem cannot be moved as it is not in stock" msgstr "Zásobová položka nemůže být přesunuta, protože není skladem" -#: stock/models.py:2818 +#: stock/models.py:2835 msgid "Stock Item Tracking" msgstr "Sledování skladových položek" -#: stock/models.py:2849 +#: stock/models.py:2866 msgid "Entry notes" msgstr "Poznámky k záznamu" -#: stock/models.py:2889 +#: stock/models.py:2906 msgid "Stock Item Test Result" msgstr "Výsledek testu skladové položky" -#: stock/models.py:2920 +#: stock/models.py:2937 msgid "Value must be provided for this test" msgstr "Pro tuto zkoušku musí být uvedena hodnota" -#: stock/models.py:2924 +#: stock/models.py:2941 msgid "Attachment must be uploaded for this test" msgstr "Pro tento test musí být nahrána příloha" -#: stock/models.py:2929 +#: stock/models.py:2946 msgid "Invalid value for this test" msgstr "Neplatná hodnota pro tento test" -#: stock/models.py:2953 +#: stock/models.py:2970 msgid "Test result" msgstr "Výsledek testu" -#: stock/models.py:2960 +#: stock/models.py:2977 msgid "Test output value" msgstr "Výstupní hodnota testu" -#: stock/models.py:2968 stock/serializers.py:248 +#: stock/models.py:2985 stock/serializers.py:248 msgid "Test result attachment" msgstr "Příloha výsledků testu" -#: stock/models.py:2972 +#: stock/models.py:2989 msgid "Test notes" msgstr "Poznámky testu" -#: stock/models.py:2980 +#: stock/models.py:2997 msgid "Test station" msgstr "Testovací stanice" -#: stock/models.py:2981 +#: stock/models.py:2998 msgid "The identifier of the test station where the test was performed" msgstr "Identifikátor testovací stanice kde byl test proveden" -#: stock/models.py:2987 +#: stock/models.py:3004 msgid "Started" msgstr "Začátek" -#: stock/models.py:2988 +#: stock/models.py:3005 msgid "The timestamp of the test start" msgstr "Čas začátku testu" -#: stock/models.py:2994 +#: stock/models.py:3011 msgid "Finished" msgstr "Ukončeno" -#: stock/models.py:2995 +#: stock/models.py:3012 msgid "The timestamp of the test finish" msgstr "Čas dokončení testu" @@ -8902,83 +8910,87 @@ msgstr "Zásoba přidána ručně" msgid "Stock manually removed" msgstr "Zásoba odebrána ručně" -#: stock/status_codes.py:57 +#: stock/status_codes.py:56 +msgid "Serialized stock items" +msgstr "Serializované skladové položky" + +#: stock/status_codes.py:58 msgid "Returned to stock" msgstr "Vráceno na sklad" -#: stock/status_codes.py:60 +#: stock/status_codes.py:61 msgid "Location changed" msgstr "Umístění změněno" -#: stock/status_codes.py:61 +#: stock/status_codes.py:62 msgid "Stock updated" msgstr "Stav zásob byl aktualizován" -#: stock/status_codes.py:64 +#: stock/status_codes.py:65 msgid "Installed into assembly" msgstr "Nainstalováno do sestavy" -#: stock/status_codes.py:65 +#: stock/status_codes.py:66 msgid "Removed from assembly" msgstr "Odstraněno ze sestavy" -#: stock/status_codes.py:67 +#: stock/status_codes.py:68 msgid "Installed component item" msgstr "Instalovaná položka komponenty" -#: stock/status_codes.py:68 +#: stock/status_codes.py:69 msgid "Removed component item" msgstr "Odstraněná komponenta" -#: stock/status_codes.py:71 +#: stock/status_codes.py:72 msgid "Split from parent item" msgstr "Rozdělit od nadřazené položky" -#: stock/status_codes.py:72 +#: stock/status_codes.py:73 msgid "Split child item" msgstr "Rozdělit podřazený předmět" -#: stock/status_codes.py:75 +#: stock/status_codes.py:76 msgid "Merged stock items" msgstr "Skladové položky sloučeny" -#: stock/status_codes.py:78 +#: stock/status_codes.py:79 msgid "Converted to variant" msgstr "Převedeno na variantu" -#: stock/status_codes.py:81 +#: stock/status_codes.py:82 msgid "Build order output created" msgstr "Výstup výrobního příkazu vytvořen" -#: stock/status_codes.py:82 +#: stock/status_codes.py:83 msgid "Build order output completed" msgstr "Výstup výrobního příkazu dokončen" -#: stock/status_codes.py:83 +#: stock/status_codes.py:84 msgid "Build order output rejected" msgstr "Výstup výrobního příkazu odmítnut" -#: stock/status_codes.py:84 +#: stock/status_codes.py:85 msgid "Consumed by build order" msgstr "Spotřebováno výrobním příkazem" -#: stock/status_codes.py:87 +#: stock/status_codes.py:88 msgid "Shipped against Sales Order" msgstr "Odesláno na základě prodejní objednávky" -#: stock/status_codes.py:90 +#: stock/status_codes.py:91 msgid "Received against Purchase Order" msgstr "Přijato proti objednávce" -#: stock/status_codes.py:93 +#: stock/status_codes.py:94 msgid "Returned against Return Order" msgstr "Vráceno proti vratce" -#: stock/status_codes.py:96 +#: stock/status_codes.py:97 msgid "Sent to customer" msgstr "Odesláno zákazníkovi" -#: stock/status_codes.py:97 +#: stock/status_codes.py:98 msgid "Returned from customer" msgstr "Vráceno od zákazníka" diff --git a/src/backend/InvenTree/locale/da/LC_MESSAGES/django.po b/src/backend/InvenTree/locale/da/LC_MESSAGES/django.po index 288b2c25e3..e92d0030bc 100644 --- a/src/backend/InvenTree/locale/da/LC_MESSAGES/django.po +++ b/src/backend/InvenTree/locale/da/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: inventree\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-11-19 04:55+0000\n" -"PO-Revision-Date: 2025-11-19 04:59\n" +"POT-Creation-Date: 2025-11-24 06:50+0000\n" +"PO-Revision-Date: 2025-11-24 06:53\n" "Last-Translator: \n" "Language-Team: Danish\n" "Language: da_DK\n" @@ -81,21 +81,21 @@ msgstr "Den indtastede email adresse er ikke gyldig." msgid "The provided email domain is not approved." msgstr "Det angivne e-mail domæne er ikke godkendt." -#: InvenTree/conversion.py:166 +#: InvenTree/conversion.py:240 #, python-brace-format msgid "Invalid unit provided ({unit})" msgstr "" -#: InvenTree/conversion.py:183 +#: InvenTree/conversion.py:257 msgid "No value provided" msgstr "Ingen værdi angivet" -#: InvenTree/conversion.py:210 +#: InvenTree/conversion.py:284 #, python-brace-format msgid "Could not convert {original} to {unit}" msgstr "Kunne ikke konvertere {original} til {unit}" -#: InvenTree/conversion.py:212 InvenTree/conversion.py:226 +#: InvenTree/conversion.py:286 InvenTree/conversion.py:300 #: InvenTree/helpers.py:597 order/models.py:720 order/models.py:1015 msgid "Invalid quantity provided" msgstr "Ugyldigt antal angivet" @@ -116,7 +116,7 @@ msgstr "" #: build/serializers.py:580 build/serializers.py:1788 company/models.py:857 #: order/models.py:1780 #: report/templates/report/inventree_build_order_report.html:172 -#: stock/models.py:2848 stock/models.py:2972 stock/serializers.py:717 +#: stock/models.py:2865 stock/models.py:2989 stock/serializers.py:717 #: stock/serializers.py:893 stock/serializers.py:1035 stock/serializers.py:1336 #: stock/serializers.py:1425 stock/serializers.py:1624 msgid "Notes" @@ -345,7 +345,7 @@ msgstr "Skal være et gyldigt tal" msgid "Currency" msgstr "Valuta" -#: InvenTree/serializers.py:298 part/serializers.py:1385 +#: InvenTree/serializers.py:298 part/serializers.py:1357 msgid "Select currency from available options" msgstr "Vælg valuta fra tilgængelige muligheder" @@ -553,14 +553,14 @@ msgstr "" #: build/api.py:100 build/api.py:466 build/api.py:845 build/models.py:270 #: build/serializers.py:1225 build/serializers.py:1356 -#: build/serializers.py:1427 company/models.py:1067 company/serializers.py:445 +#: build/serializers.py:1427 company/models.py:1067 company/serializers.py:491 #: order/api.py:298 order/api.py:302 order/api.py:929 order/api.py:1187 #: order/api.py:1190 order/models.py:1941 order/models.py:2108 #: order/models.py:2109 part/api.py:1233 part/api.py:1236 part/api.py:1302 #: part/api.py:1589 part/models.py:472 part/models.py:3296 part/models.py:3439 #: part/models.py:3497 part/models.py:3518 part/models.py:3540 #: part/models.py:3679 part/models.py:4046 part/models.py:4368 -#: part/models.py:4787 part/serializers.py:1928 +#: part/models.py:4787 part/serializers.py:1900 #: report/templates/report/inventree_bill_of_materials_report.html:110 #: report/templates/report/inventree_bill_of_materials_report.html:137 #: report/templates/report/inventree_build_order_report.html:109 @@ -582,7 +582,7 @@ msgstr "Del" #: build/api.py:120 build/api.py:123 build/serializers.py:1438 part/api.py:980 #: part/api.py:1316 part/api.py:1600 part/models.py:1080 part/models.py:3568 -#: part/models.py:4162 part/serializers.py:1752 stock/api.py:869 +#: part/models.py:4162 part/serializers.py:1724 stock/api.py:869 msgid "Category" msgstr "" @@ -663,7 +663,7 @@ msgid "Optional" msgstr "Valgfri" #: build/api.py:455 build/serializers.py:1415 common/setting/system.py:456 -#: part/models.py:1202 part/serializers.py:1714 part/serializers.py:1725 +#: part/models.py:1202 part/serializers.py:1686 part/serializers.py:1697 #: stock/api.py:639 msgid "Assembly" msgstr "" @@ -688,16 +688,16 @@ msgstr "Allokeret" msgid "Consumed" msgstr "" -#: build/api.py:499 company/models.py:912 company/serializers.py:440 +#: build/api.py:499 company/models.py:912 company/serializers.py:474 #: templates/email/build_order_required_stock.html:19 #: templates/email/low_stock_notification.html:17 #: templates/email/part_event_notification.html:18 msgid "Available" msgstr "Tilgængelig" -#: build/api.py:523 build/serializers.py:1466 company/serializers.py:437 -#: order/serializers.py:1281 part/serializers.py:959 part/serializers.py:1306 -#: part/serializers.py:1761 +#: build/api.py:523 build/serializers.py:1466 company/serializers.py:471 +#: order/serializers.py:1281 part/serializers.py:931 part/serializers.py:1278 +#: part/serializers.py:1733 msgid "On Order" msgstr "" @@ -963,7 +963,7 @@ msgstr "" #: build/models.py:1136 build/models.py:1234 build/serializers.py:285 #: build/serializers.py:335 build/serializers.py:965 build/serializers.py:1739 #: order/models.py:717 order/serializers.py:658 order/serializers.py:844 -#: part/serializers.py:1708 stock/models.py:940 stock/models.py:1430 +#: part/serializers.py:1680 stock/models.py:940 stock/models.py:1430 #: stock/models.py:1878 stock/serializers.py:688 stock/serializers.py:1580 msgid "Quantity must be greater than zero" msgstr "" @@ -1385,20 +1385,20 @@ msgstr "" msgid "BOM Item" msgstr "" -#: build/serializers.py:1467 order/serializers.py:1282 part/serializers.py:1310 -#: part/serializers.py:1765 +#: build/serializers.py:1467 order/serializers.py:1282 part/serializers.py:1282 +#: part/serializers.py:1737 msgid "In Production" msgstr "" -#: build/serializers.py:1469 part/serializers.py:950 part/serializers.py:1314 +#: build/serializers.py:1469 part/serializers.py:922 part/serializers.py:1286 msgid "Scheduled to Build" msgstr "" -#: build/serializers.py:1472 part/serializers.py:987 +#: build/serializers.py:1472 part/serializers.py:959 msgid "External Stock" msgstr "" -#: build/serializers.py:1473 part/serializers.py:1300 part/serializers.py:1808 +#: build/serializers.py:1473 part/serializers.py:1272 part/serializers.py:1780 msgid "Available Stock" msgstr "" @@ -1588,7 +1588,7 @@ msgstr "Bruger" msgid "Price break quantity" msgstr "" -#: common/models.py:1348 company/serializers.py:564 order/models.py:1842 +#: common/models.py:1348 company/serializers.py:357 order/models.py:1842 #: order/models.py:3043 msgid "Price" msgstr "" @@ -1760,7 +1760,7 @@ msgstr "" msgid "Unit definition" msgstr "" -#: common/models.py:1911 common/models.py:1974 stock/models.py:2967 +#: common/models.py:1911 common/models.py:1974 stock/models.py:2984 #: stock/serializers.py:247 msgid "Attachment" msgstr "Vedhæftning" @@ -1839,7 +1839,7 @@ msgstr "" #: common/models.py:2090 common/models.py:2329 company/models.py:622 #: machine/serializers.py:27 -#: report/templates/report/inventree_test_report.html:104 stock/models.py:2959 +#: report/templates/report/inventree_test_report.html:104 stock/models.py:2976 msgid "Value" msgstr "" @@ -2048,7 +2048,7 @@ msgid "Response data from the barcode scan" msgstr "" #: common/models.py:2417 report/templates/report/inventree_test_report.html:103 -#: stock/models.py:2953 +#: stock/models.py:2970 msgid "Result" msgstr "" @@ -2141,7 +2141,7 @@ msgid "Linked thread for this message" msgstr "" #: common/models.py:2656 -msgid "Prioriy" +msgid "Priority" msgstr "" #: common/models.py:2698 @@ -2671,8 +2671,8 @@ msgstr "" msgid "Parts can be assembled from other components by default" msgstr "" -#: common/setting/system.py:462 part/models.py:1208 part/serializers.py:1734 -#: part/serializers.py:1741 +#: common/setting/system.py:462 part/models.py:1208 part/serializers.py:1706 +#: part/serializers.py:1713 msgid "Component" msgstr "" @@ -3772,7 +3772,7 @@ msgstr "" msgid "Supplier is Active" msgstr "" -#: company/api.py:307 company/models.py:520 company/serializers.py:457 +#: company/api.py:307 company/models.py:520 company/serializers.py:503 #: part/serializers.py:566 msgid "Manufacturer" msgstr "" @@ -3964,7 +3964,7 @@ msgid "Link to address information (external)" msgstr "" #: company/models.py:492 company/models.py:609 company/models.py:832 -#: company/serializers.py:471 stock/api.py:561 +#: company/serializers.py:517 stock/api.py:561 msgid "Manufacturer Part" msgstr "" @@ -3981,7 +3981,7 @@ msgstr "" msgid "Select manufacturer" msgstr "" -#: company/models.py:527 company/serializers.py:479 order/serializers.py:734 +#: company/models.py:527 company/serializers.py:525 order/serializers.py:734 #: part/serializers.py:576 msgid "MPN" msgstr "" @@ -4030,7 +4030,7 @@ msgstr "" msgid "Linked manufacturer part must reference the same base part" msgstr "" -#: company/models.py:810 company/serializers.py:449 company/serializers.py:467 +#: company/models.py:810 company/serializers.py:495 company/serializers.py:513 #: order/models.py:639 part/serializers.py:550 #: plugin/builtin/suppliers/digikey.py:26 plugin/builtin/suppliers/lcsc.py:27 #: plugin/builtin/suppliers/mouser.py:25 plugin/builtin/suppliers/tme.py:27 @@ -4134,10 +4134,14 @@ msgstr "" msgid "Company Name" msgstr "" -#: company/serializers.py:433 part/serializers.py:955 stock/serializers.py:428 +#: company/serializers.py:467 part/serializers.py:927 stock/serializers.py:428 msgid "In Stock" msgstr "" +#: company/serializers.py:484 +msgid "Price Breaks" +msgstr "" + #: data_exporter/mixins.py:325 data_exporter/mixins.py:403 msgid "Error occurred during data export" msgstr "" @@ -4290,7 +4294,7 @@ msgstr "" msgid "Errors" msgstr "" -#: importer/models.py:550 part/serializers.py:1268 +#: importer/models.py:550 part/serializers.py:1240 msgid "Valid" msgstr "" @@ -5677,7 +5681,7 @@ msgstr "" msgid "Part category" msgstr "" -#: part/models.py:1088 part/serializers.py:929 +#: part/models.py:1088 part/serializers.py:901 #: report/templates/report/inventree_stock_location_report.html:103 msgid "IPN" msgstr "" @@ -5718,7 +5722,7 @@ msgstr "" msgid "Expiry time (in days) for stock items of this part" msgstr "" -#: part/models.py:1186 part/serializers.py:1003 +#: part/models.py:1186 part/serializers.py:975 msgid "Minimum Stock" msgstr "" @@ -6418,203 +6422,203 @@ msgstr "" msgid "Supplier part matching this SKU already exists" msgstr "" -#: part/serializers.py:914 +#: part/serializers.py:886 msgid "Category Name" msgstr "" -#: part/serializers.py:943 +#: part/serializers.py:915 msgid "Building" msgstr "" -#: part/serializers.py:944 +#: part/serializers.py:916 msgid "Quantity of this part currently being in production" msgstr "" -#: part/serializers.py:951 +#: part/serializers.py:923 msgid "Outstanding quantity of this part scheduled to be built" msgstr "" -#: part/serializers.py:971 stock/serializers.py:1019 stock/serializers.py:1189 +#: part/serializers.py:943 stock/serializers.py:1019 stock/serializers.py:1189 #: users/ruleset.py:30 msgid "Stock Items" msgstr "" -#: part/serializers.py:975 +#: part/serializers.py:947 msgid "Revisions" msgstr "" -#: part/serializers.py:979 +#: part/serializers.py:951 msgid "Suppliers" msgstr "" -#: part/serializers.py:983 part/serializers.py:1297 +#: part/serializers.py:955 part/serializers.py:1269 #: templates/email/low_stock_notification.html:16 #: templates/email/part_event_notification.html:17 msgid "Total Stock" msgstr "" -#: part/serializers.py:991 +#: part/serializers.py:963 msgid "Unallocated Stock" msgstr "" -#: part/serializers.py:999 +#: part/serializers.py:971 msgid "Variant Stock" msgstr "" -#: part/serializers.py:1054 +#: part/serializers.py:1026 msgid "Duplicate Part" msgstr "" -#: part/serializers.py:1055 +#: part/serializers.py:1027 msgid "Copy initial data from another Part" msgstr "" -#: part/serializers.py:1061 +#: part/serializers.py:1033 msgid "Initial Stock" msgstr "" -#: part/serializers.py:1062 +#: part/serializers.py:1034 msgid "Create Part with initial stock quantity" msgstr "" -#: part/serializers.py:1068 +#: part/serializers.py:1040 msgid "Supplier Information" msgstr "" -#: part/serializers.py:1069 +#: part/serializers.py:1041 msgid "Add initial supplier information for this part" msgstr "" -#: part/serializers.py:1077 +#: part/serializers.py:1049 msgid "Copy Category Parameters" msgstr "" -#: part/serializers.py:1078 +#: part/serializers.py:1050 msgid "Copy parameter templates from selected part category" msgstr "" -#: part/serializers.py:1083 +#: part/serializers.py:1055 msgid "Existing Image" msgstr "" -#: part/serializers.py:1084 +#: part/serializers.py:1056 msgid "Filename of an existing part image" msgstr "" -#: part/serializers.py:1101 +#: part/serializers.py:1073 msgid "Image file does not exist" msgstr "" -#: part/serializers.py:1269 +#: part/serializers.py:1241 msgid "Validate entire Bill of Materials" msgstr "" -#: part/serializers.py:1303 part/serializers.py:1769 +#: part/serializers.py:1275 part/serializers.py:1741 msgid "Can Build" msgstr "" -#: part/serializers.py:1320 +#: part/serializers.py:1292 msgid "Required for Build Orders" msgstr "" -#: part/serializers.py:1325 +#: part/serializers.py:1297 msgid "Allocated to Build Orders" msgstr "" -#: part/serializers.py:1332 +#: part/serializers.py:1304 msgid "Required for Sales Orders" msgstr "" -#: part/serializers.py:1336 +#: part/serializers.py:1308 msgid "Allocated to Sales Orders" msgstr "" -#: part/serializers.py:1475 +#: part/serializers.py:1447 msgid "Minimum Price" msgstr "" -#: part/serializers.py:1476 +#: part/serializers.py:1448 msgid "Override calculated value for minimum price" msgstr "" -#: part/serializers.py:1483 +#: part/serializers.py:1455 msgid "Minimum price currency" msgstr "" -#: part/serializers.py:1490 +#: part/serializers.py:1462 msgid "Maximum Price" msgstr "" -#: part/serializers.py:1491 +#: part/serializers.py:1463 msgid "Override calculated value for maximum price" msgstr "" -#: part/serializers.py:1498 +#: part/serializers.py:1470 msgid "Maximum price currency" msgstr "" -#: part/serializers.py:1527 +#: part/serializers.py:1499 msgid "Update" msgstr "" -#: part/serializers.py:1528 +#: part/serializers.py:1500 msgid "Update pricing for this part" msgstr "" -#: part/serializers.py:1551 +#: part/serializers.py:1523 #, python-brace-format msgid "Could not convert from provided currencies to {default_currency}" msgstr "" -#: part/serializers.py:1558 +#: part/serializers.py:1530 msgid "Minimum price must not be greater than maximum price" msgstr "" -#: part/serializers.py:1561 +#: part/serializers.py:1533 msgid "Maximum price must not be less than minimum price" msgstr "" -#: part/serializers.py:1715 +#: part/serializers.py:1687 msgid "Select the parent assembly" msgstr "" -#: part/serializers.py:1735 +#: part/serializers.py:1707 msgid "Select the component part" msgstr "" -#: part/serializers.py:1929 +#: part/serializers.py:1901 msgid "Select part to copy BOM from" msgstr "" -#: part/serializers.py:1937 +#: part/serializers.py:1909 msgid "Remove Existing Data" msgstr "" -#: part/serializers.py:1938 +#: part/serializers.py:1910 msgid "Remove existing BOM items before copying" msgstr "" -#: part/serializers.py:1943 +#: part/serializers.py:1915 msgid "Include Inherited" msgstr "" -#: part/serializers.py:1944 +#: part/serializers.py:1916 msgid "Include BOM items which are inherited from templated parts" msgstr "" -#: part/serializers.py:1949 +#: part/serializers.py:1921 msgid "Skip Invalid Rows" msgstr "" -#: part/serializers.py:1950 +#: part/serializers.py:1922 msgid "Enable this option to skip invalid rows" msgstr "" -#: part/serializers.py:1955 +#: part/serializers.py:1927 msgid "Copy Substitute Parts" msgstr "" -#: part/serializers.py:1956 +#: part/serializers.py:1928 msgid "Copy substitute parts when duplicate BOM items" msgstr "" @@ -8455,115 +8459,119 @@ msgstr "" msgid "Quantity does not match serial numbers" msgstr "" -#: stock/models.py:2012 stock/models.py:2917 +#: stock/models.py:1912 +msgid "Cannot assign stock to structural location" +msgstr "" + +#: stock/models.py:2029 stock/models.py:2934 msgid "Test template does not exist" msgstr "" -#: stock/models.py:2030 +#: stock/models.py:2047 msgid "Stock item has been assigned to a sales order" msgstr "" -#: stock/models.py:2034 +#: stock/models.py:2051 msgid "Stock item is installed in another item" msgstr "" -#: stock/models.py:2037 +#: stock/models.py:2054 msgid "Stock item contains other items" msgstr "" -#: stock/models.py:2040 +#: stock/models.py:2057 msgid "Stock item has been assigned to a customer" msgstr "" -#: stock/models.py:2043 stock/models.py:2226 +#: stock/models.py:2060 stock/models.py:2243 msgid "Stock item is currently in production" msgstr "" -#: stock/models.py:2046 +#: stock/models.py:2063 msgid "Serialized stock cannot be merged" msgstr "" -#: stock/models.py:2053 stock/serializers.py:1462 +#: stock/models.py:2070 stock/serializers.py:1462 msgid "Duplicate stock items" msgstr "" -#: stock/models.py:2057 +#: stock/models.py:2074 msgid "Stock items must refer to the same part" msgstr "" -#: stock/models.py:2065 +#: stock/models.py:2082 msgid "Stock items must refer to the same supplier part" msgstr "" -#: stock/models.py:2070 +#: stock/models.py:2087 msgid "Stock status codes must match" msgstr "" -#: stock/models.py:2349 +#: stock/models.py:2366 msgid "StockItem cannot be moved as it is not in stock" msgstr "" -#: stock/models.py:2818 +#: stock/models.py:2835 msgid "Stock Item Tracking" msgstr "" -#: stock/models.py:2849 +#: stock/models.py:2866 msgid "Entry notes" msgstr "" -#: stock/models.py:2889 +#: stock/models.py:2906 msgid "Stock Item Test Result" msgstr "" -#: stock/models.py:2920 +#: stock/models.py:2937 msgid "Value must be provided for this test" msgstr "" -#: stock/models.py:2924 +#: stock/models.py:2941 msgid "Attachment must be uploaded for this test" msgstr "" -#: stock/models.py:2929 +#: stock/models.py:2946 msgid "Invalid value for this test" msgstr "" -#: stock/models.py:2953 +#: stock/models.py:2970 msgid "Test result" msgstr "" -#: stock/models.py:2960 +#: stock/models.py:2977 msgid "Test output value" msgstr "" -#: stock/models.py:2968 stock/serializers.py:248 +#: stock/models.py:2985 stock/serializers.py:248 msgid "Test result attachment" msgstr "" -#: stock/models.py:2972 +#: stock/models.py:2989 msgid "Test notes" msgstr "" -#: stock/models.py:2980 +#: stock/models.py:2997 msgid "Test station" msgstr "" -#: stock/models.py:2981 +#: stock/models.py:2998 msgid "The identifier of the test station where the test was performed" msgstr "" -#: stock/models.py:2987 +#: stock/models.py:3004 msgid "Started" msgstr "" -#: stock/models.py:2988 +#: stock/models.py:3005 msgid "The timestamp of the test start" msgstr "" -#: stock/models.py:2994 +#: stock/models.py:3011 msgid "Finished" msgstr "" -#: stock/models.py:2995 +#: stock/models.py:3012 msgid "The timestamp of the test finish" msgstr "" @@ -8902,83 +8910,87 @@ msgstr "Lagerbeholdning tilføjet manuelt" msgid "Stock manually removed" msgstr "Lagerbeholdning fjernet manuelt" -#: stock/status_codes.py:57 +#: stock/status_codes.py:56 +msgid "Serialized stock items" +msgstr "" + +#: stock/status_codes.py:58 msgid "Returned to stock" msgstr "" -#: stock/status_codes.py:60 +#: stock/status_codes.py:61 msgid "Location changed" msgstr "Lokation ændret" -#: stock/status_codes.py:61 +#: stock/status_codes.py:62 msgid "Stock updated" msgstr "Lager opdateret" -#: stock/status_codes.py:64 +#: stock/status_codes.py:65 msgid "Installed into assembly" msgstr "Monteret i samling" -#: stock/status_codes.py:65 +#: stock/status_codes.py:66 msgid "Removed from assembly" msgstr "Fjernet fra samling" -#: stock/status_codes.py:67 +#: stock/status_codes.py:68 msgid "Installed component item" msgstr "Installeret komponent element" -#: stock/status_codes.py:68 +#: stock/status_codes.py:69 msgid "Removed component item" msgstr "Fjernet komponent element" -#: stock/status_codes.py:71 +#: stock/status_codes.py:72 msgid "Split from parent item" msgstr "Opdel fra overordnet element" -#: stock/status_codes.py:72 +#: stock/status_codes.py:73 msgid "Split child item" msgstr "Opdel underordnet element" -#: stock/status_codes.py:75 +#: stock/status_codes.py:76 msgid "Merged stock items" msgstr "Flettede lagervarer" -#: stock/status_codes.py:78 +#: stock/status_codes.py:79 msgid "Converted to variant" msgstr "Konverteret til variant" -#: stock/status_codes.py:81 +#: stock/status_codes.py:82 msgid "Build order output created" msgstr "Byggeordre output genereret" -#: stock/status_codes.py:82 +#: stock/status_codes.py:83 msgid "Build order output completed" msgstr "Byggeorder output fuldført" -#: stock/status_codes.py:83 +#: stock/status_codes.py:84 msgid "Build order output rejected" msgstr "" -#: stock/status_codes.py:84 +#: stock/status_codes.py:85 msgid "Consumed by build order" msgstr "Brugt efter byggeordre" -#: stock/status_codes.py:87 +#: stock/status_codes.py:88 msgid "Shipped against Sales Order" msgstr "Afsendt mod salgsordre" -#: stock/status_codes.py:90 +#: stock/status_codes.py:91 msgid "Received against Purchase Order" msgstr "Modtaget mod indkøbsordre" -#: stock/status_codes.py:93 +#: stock/status_codes.py:94 msgid "Returned against Return Order" msgstr "Returneret mod returordre" -#: stock/status_codes.py:96 +#: stock/status_codes.py:97 msgid "Sent to customer" msgstr "Sendt til kunde" -#: stock/status_codes.py:97 +#: stock/status_codes.py:98 msgid "Returned from customer" msgstr "Returneret fra kunde" diff --git a/src/backend/InvenTree/locale/de/LC_MESSAGES/django.po b/src/backend/InvenTree/locale/de/LC_MESSAGES/django.po index 29a978ff2f..546c527ef9 100644 --- a/src/backend/InvenTree/locale/de/LC_MESSAGES/django.po +++ b/src/backend/InvenTree/locale/de/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: inventree\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-11-19 04:55+0000\n" -"PO-Revision-Date: 2025-11-19 04:59\n" +"POT-Creation-Date: 2025-11-24 06:50+0000\n" +"PO-Revision-Date: 2025-11-25 11:06\n" "Last-Translator: \n" "Language-Team: German\n" "Language: de_DE\n" @@ -81,21 +81,21 @@ msgstr "Die angegebene primäre E-Mail-Adresse ist ungültig." msgid "The provided email domain is not approved." msgstr "Die angegebene E-Mail-Domain ist nicht freigegeben." -#: InvenTree/conversion.py:166 +#: InvenTree/conversion.py:240 #, python-brace-format msgid "Invalid unit provided ({unit})" msgstr "Ungültige Einheit angegeben ({unit})" -#: InvenTree/conversion.py:183 +#: InvenTree/conversion.py:257 msgid "No value provided" msgstr "Kein Wert angegeben" -#: InvenTree/conversion.py:210 +#: InvenTree/conversion.py:284 #, python-brace-format msgid "Could not convert {original} to {unit}" msgstr "Konnte {original} nicht in {unit} umwandeln" -#: InvenTree/conversion.py:212 InvenTree/conversion.py:226 +#: InvenTree/conversion.py:286 InvenTree/conversion.py:300 #: InvenTree/helpers.py:597 order/models.py:720 order/models.py:1015 msgid "Invalid quantity provided" msgstr "Keine gültige Menge" @@ -116,7 +116,7 @@ msgstr "Ungültiger Dezimalwert" #: build/serializers.py:580 build/serializers.py:1788 company/models.py:857 #: order/models.py:1780 #: report/templates/report/inventree_build_order_report.html:172 -#: stock/models.py:2848 stock/models.py:2972 stock/serializers.py:717 +#: stock/models.py:2865 stock/models.py:2989 stock/serializers.py:717 #: stock/serializers.py:893 stock/serializers.py:1035 stock/serializers.py:1336 #: stock/serializers.py:1425 stock/serializers.py:1624 msgid "Notes" @@ -345,7 +345,7 @@ msgstr "Muss eine gültige Nummer sein" msgid "Currency" msgstr "Währung" -#: InvenTree/serializers.py:298 part/serializers.py:1385 +#: InvenTree/serializers.py:298 part/serializers.py:1357 msgid "Select currency from available options" msgstr "Währung aus verfügbaren Optionen auswählen" @@ -553,14 +553,14 @@ msgstr "Varianten einschließen" #: build/api.py:100 build/api.py:466 build/api.py:845 build/models.py:270 #: build/serializers.py:1225 build/serializers.py:1356 -#: build/serializers.py:1427 company/models.py:1067 company/serializers.py:445 +#: build/serializers.py:1427 company/models.py:1067 company/serializers.py:491 #: order/api.py:298 order/api.py:302 order/api.py:929 order/api.py:1187 #: order/api.py:1190 order/models.py:1941 order/models.py:2108 #: order/models.py:2109 part/api.py:1233 part/api.py:1236 part/api.py:1302 #: part/api.py:1589 part/models.py:472 part/models.py:3296 part/models.py:3439 #: part/models.py:3497 part/models.py:3518 part/models.py:3540 #: part/models.py:3679 part/models.py:4046 part/models.py:4368 -#: part/models.py:4787 part/serializers.py:1928 +#: part/models.py:4787 part/serializers.py:1900 #: report/templates/report/inventree_bill_of_materials_report.html:110 #: report/templates/report/inventree_bill_of_materials_report.html:137 #: report/templates/report/inventree_build_order_report.html:109 @@ -582,7 +582,7 @@ msgstr "Teil" #: build/api.py:120 build/api.py:123 build/serializers.py:1438 part/api.py:980 #: part/api.py:1316 part/api.py:1600 part/models.py:1080 part/models.py:3568 -#: part/models.py:4162 part/serializers.py:1752 stock/api.py:869 +#: part/models.py:4162 part/serializers.py:1724 stock/api.py:869 msgid "Category" msgstr "Kategorie" @@ -663,7 +663,7 @@ msgid "Optional" msgstr "Optional" #: build/api.py:455 build/serializers.py:1415 common/setting/system.py:456 -#: part/models.py:1202 part/serializers.py:1714 part/serializers.py:1725 +#: part/models.py:1202 part/serializers.py:1686 part/serializers.py:1697 #: stock/api.py:639 msgid "Assembly" msgstr "Baugruppe" @@ -688,16 +688,16 @@ msgstr "Zugeordnet" msgid "Consumed" msgstr "Verbraucht" -#: build/api.py:499 company/models.py:912 company/serializers.py:440 +#: build/api.py:499 company/models.py:912 company/serializers.py:474 #: templates/email/build_order_required_stock.html:19 #: templates/email/low_stock_notification.html:17 #: templates/email/part_event_notification.html:18 msgid "Available" msgstr "Verfügbar" -#: build/api.py:523 build/serializers.py:1466 company/serializers.py:437 -#: order/serializers.py:1281 part/serializers.py:959 part/serializers.py:1306 -#: part/serializers.py:1761 +#: build/api.py:523 build/serializers.py:1466 company/serializers.py:471 +#: order/serializers.py:1281 part/serializers.py:931 part/serializers.py:1278 +#: part/serializers.py:1733 msgid "On Order" msgstr "Bestellt" @@ -963,7 +963,7 @@ msgstr "Endprodukt stimmt nicht mit dem Bauauftrag überein" #: build/models.py:1136 build/models.py:1234 build/serializers.py:285 #: build/serializers.py:335 build/serializers.py:965 build/serializers.py:1739 #: order/models.py:717 order/serializers.py:658 order/serializers.py:844 -#: part/serializers.py:1708 stock/models.py:940 stock/models.py:1430 +#: part/serializers.py:1680 stock/models.py:940 stock/models.py:1430 #: stock/models.py:1878 stock/serializers.py:688 stock/serializers.py:1580 msgid "Quantity must be greater than zero" msgstr "Anzahl muss größer Null sein" @@ -1385,20 +1385,20 @@ msgstr "Varianten zulassen" msgid "BOM Item" msgstr "Stücklisten-Position" -#: build/serializers.py:1467 order/serializers.py:1282 part/serializers.py:1310 -#: part/serializers.py:1765 +#: build/serializers.py:1467 order/serializers.py:1282 part/serializers.py:1282 +#: part/serializers.py:1737 msgid "In Production" msgstr "In Produktion" -#: build/serializers.py:1469 part/serializers.py:950 part/serializers.py:1314 +#: build/serializers.py:1469 part/serializers.py:922 part/serializers.py:1286 msgid "Scheduled to Build" msgstr "" -#: build/serializers.py:1472 part/serializers.py:987 +#: build/serializers.py:1472 part/serializers.py:959 msgid "External Stock" msgstr "Externes Lager" -#: build/serializers.py:1473 part/serializers.py:1300 part/serializers.py:1808 +#: build/serializers.py:1473 part/serializers.py:1272 part/serializers.py:1780 msgid "Available Stock" msgstr "Verfügbarer Bestand" @@ -1588,7 +1588,7 @@ msgstr "Benutzer" msgid "Price break quantity" msgstr "Preisstaffelungs Anzahl" -#: common/models.py:1348 company/serializers.py:564 order/models.py:1842 +#: common/models.py:1348 company/serializers.py:357 order/models.py:1842 #: order/models.py:3043 msgid "Price" msgstr "Preis" @@ -1760,7 +1760,7 @@ msgstr "Definition" msgid "Unit definition" msgstr "Einheitsdefinition" -#: common/models.py:1911 common/models.py:1974 stock/models.py:2967 +#: common/models.py:1911 common/models.py:1974 stock/models.py:2984 #: stock/serializers.py:247 msgid "Attachment" msgstr "Anhang" @@ -1839,7 +1839,7 @@ msgstr "" #: common/models.py:2090 common/models.py:2329 company/models.py:622 #: machine/serializers.py:27 -#: report/templates/report/inventree_test_report.html:104 stock/models.py:2959 +#: report/templates/report/inventree_test_report.html:104 stock/models.py:2976 msgid "Value" msgstr "Wert" @@ -2048,7 +2048,7 @@ msgid "Response data from the barcode scan" msgstr "" #: common/models.py:2417 report/templates/report/inventree_test_report.html:103 -#: stock/models.py:2953 +#: stock/models.py:2970 msgid "Result" msgstr "Ergebnis" @@ -2141,7 +2141,7 @@ msgid "Linked thread for this message" msgstr "" #: common/models.py:2656 -msgid "Prioriy" +msgid "Priority" msgstr "" #: common/models.py:2698 @@ -2671,8 +2671,8 @@ msgstr "Teile sind standardmäßig Vorlagen" msgid "Parts can be assembled from other components by default" msgstr "Teile können standardmäßig aus anderen Teilen angefertigt werden" -#: common/setting/system.py:462 part/models.py:1208 part/serializers.py:1734 -#: part/serializers.py:1741 +#: common/setting/system.py:462 part/models.py:1208 part/serializers.py:1706 +#: part/serializers.py:1713 msgid "Component" msgstr "Komponente" @@ -3772,7 +3772,7 @@ msgstr "Internes Teil ist aktiv" msgid "Supplier is Active" msgstr "Lieferant ist aktiv" -#: company/api.py:307 company/models.py:520 company/serializers.py:457 +#: company/api.py:307 company/models.py:520 company/serializers.py:503 #: part/serializers.py:566 msgid "Manufacturer" msgstr "Hersteller" @@ -3964,7 +3964,7 @@ msgid "Link to address information (external)" msgstr "Link zu Adressinformationen (extern)" #: company/models.py:492 company/models.py:609 company/models.py:832 -#: company/serializers.py:471 stock/api.py:561 +#: company/serializers.py:517 stock/api.py:561 msgid "Manufacturer Part" msgstr "Herstellerteil" @@ -3981,7 +3981,7 @@ msgstr "Teil auswählen" msgid "Select manufacturer" msgstr "Hersteller auswählen" -#: company/models.py:527 company/serializers.py:479 order/serializers.py:734 +#: company/models.py:527 company/serializers.py:525 order/serializers.py:734 #: part/serializers.py:576 msgid "MPN" msgstr "MPN" @@ -4030,7 +4030,7 @@ msgstr "Packeinheiten müssen größer als Null sein" msgid "Linked manufacturer part must reference the same base part" msgstr "Verlinktes Herstellerteil muss dasselbe Basisteil referenzieren" -#: company/models.py:810 company/serializers.py:449 company/serializers.py:467 +#: company/models.py:810 company/serializers.py:495 company/serializers.py:513 #: order/models.py:639 part/serializers.py:550 #: plugin/builtin/suppliers/digikey.py:26 plugin/builtin/suppliers/lcsc.py:27 #: plugin/builtin/suppliers/mouser.py:25 plugin/builtin/suppliers/tme.py:27 @@ -4134,10 +4134,14 @@ msgstr "Standard-Währung für diesen Zulieferer" msgid "Company Name" msgstr "Firmenname" -#: company/serializers.py:433 part/serializers.py:955 stock/serializers.py:428 +#: company/serializers.py:467 part/serializers.py:927 stock/serializers.py:428 msgid "In Stock" msgstr "Auf Lager" +#: company/serializers.py:484 +msgid "Price Breaks" +msgstr "" + #: data_exporter/mixins.py:325 data_exporter/mixins.py:403 msgid "Error occurred during data export" msgstr "" @@ -4290,7 +4294,7 @@ msgstr "" msgid "Errors" msgstr "Fehler" -#: importer/models.py:550 part/serializers.py:1268 +#: importer/models.py:550 part/serializers.py:1240 msgid "Valid" msgstr "Gültig" @@ -5677,7 +5681,7 @@ msgstr "Schlüsselworte um die Sichtbarkeit in Suchergebnissen zu verbessern" msgid "Part category" msgstr "Teile-Kategorie" -#: part/models.py:1088 part/serializers.py:929 +#: part/models.py:1088 part/serializers.py:901 #: report/templates/report/inventree_stock_location_report.html:103 msgid "IPN" msgstr "IPN (Interne Produktnummer)" @@ -5718,7 +5722,7 @@ msgstr "Standard Ablaufzeit" msgid "Expiry time (in days) for stock items of this part" msgstr "Ablauf-Zeit (in Tagen) für Bestand dieses Teils" -#: part/models.py:1186 part/serializers.py:1003 +#: part/models.py:1186 part/serializers.py:975 msgid "Minimum Stock" msgstr "Minimaler Bestand" @@ -6418,203 +6422,203 @@ msgstr "Herstellerteil mit dieser MPN existiert bereits" msgid "Supplier part matching this SKU already exists" msgstr "Lieferantenteil mit dieser SKU existiert bereits" -#: part/serializers.py:914 +#: part/serializers.py:886 msgid "Category Name" msgstr "Kategoriename" -#: part/serializers.py:943 +#: part/serializers.py:915 msgid "Building" msgstr "Im Bau" -#: part/serializers.py:944 +#: part/serializers.py:916 msgid "Quantity of this part currently being in production" msgstr "" -#: part/serializers.py:951 +#: part/serializers.py:923 msgid "Outstanding quantity of this part scheduled to be built" msgstr "" -#: part/serializers.py:971 stock/serializers.py:1019 stock/serializers.py:1189 +#: part/serializers.py:943 stock/serializers.py:1019 stock/serializers.py:1189 #: users/ruleset.py:30 msgid "Stock Items" msgstr "Lagerartikel" -#: part/serializers.py:975 +#: part/serializers.py:947 msgid "Revisions" msgstr "" -#: part/serializers.py:979 +#: part/serializers.py:951 msgid "Suppliers" msgstr "Zulieferer" -#: part/serializers.py:983 part/serializers.py:1297 +#: part/serializers.py:955 part/serializers.py:1269 #: templates/email/low_stock_notification.html:16 #: templates/email/part_event_notification.html:17 msgid "Total Stock" msgstr "Gesamtbestand" -#: part/serializers.py:991 +#: part/serializers.py:963 msgid "Unallocated Stock" msgstr "Nicht zugewiesenes Lager" -#: part/serializers.py:999 +#: part/serializers.py:971 msgid "Variant Stock" msgstr "Alternatives Lager" -#: part/serializers.py:1054 +#: part/serializers.py:1026 msgid "Duplicate Part" msgstr "Teil duplizieren" -#: part/serializers.py:1055 +#: part/serializers.py:1027 msgid "Copy initial data from another Part" msgstr "Initiale Daten von anderem Teil kopieren" -#: part/serializers.py:1061 +#: part/serializers.py:1033 msgid "Initial Stock" msgstr "Initialer Lagerbestand" -#: part/serializers.py:1062 +#: part/serializers.py:1034 msgid "Create Part with initial stock quantity" msgstr "Erstelle Teil mit Ausgangsbestand" -#: part/serializers.py:1068 +#: part/serializers.py:1040 msgid "Supplier Information" msgstr "Lieferanteninformationen" -#: part/serializers.py:1069 +#: part/serializers.py:1041 msgid "Add initial supplier information for this part" msgstr "Lieferanteninformationen zu diesem Teil hinzufügen" -#: part/serializers.py:1077 +#: part/serializers.py:1049 msgid "Copy Category Parameters" msgstr "Kategorieparameter kopieren" -#: part/serializers.py:1078 +#: part/serializers.py:1050 msgid "Copy parameter templates from selected part category" msgstr "Parametervorlagen aus der ausgewählten Teilkategorie kopieren" -#: part/serializers.py:1083 +#: part/serializers.py:1055 msgid "Existing Image" msgstr "Vorhandenes Bild" -#: part/serializers.py:1084 +#: part/serializers.py:1056 msgid "Filename of an existing part image" msgstr "Dateiname eines vorhandenen Teilbildes" -#: part/serializers.py:1101 +#: part/serializers.py:1073 msgid "Image file does not exist" msgstr "Bilddatei existiert nicht" -#: part/serializers.py:1269 +#: part/serializers.py:1241 msgid "Validate entire Bill of Materials" msgstr "Gesamte Stückliste validieren" -#: part/serializers.py:1303 part/serializers.py:1769 +#: part/serializers.py:1275 part/serializers.py:1741 msgid "Can Build" msgstr "Herstellbar" -#: part/serializers.py:1320 +#: part/serializers.py:1292 msgid "Required for Build Orders" msgstr "" -#: part/serializers.py:1325 +#: part/serializers.py:1297 msgid "Allocated to Build Orders" msgstr "" -#: part/serializers.py:1332 +#: part/serializers.py:1304 msgid "Required for Sales Orders" msgstr "" -#: part/serializers.py:1336 +#: part/serializers.py:1308 msgid "Allocated to Sales Orders" msgstr "" -#: part/serializers.py:1475 +#: part/serializers.py:1447 msgid "Minimum Price" msgstr "Niedrigster Preis" -#: part/serializers.py:1476 +#: part/serializers.py:1448 msgid "Override calculated value for minimum price" msgstr "Berechneten Wert für Mindestpreis überschreiben" -#: part/serializers.py:1483 +#: part/serializers.py:1455 msgid "Minimum price currency" msgstr "Mindestpreis Währung" -#: part/serializers.py:1490 +#: part/serializers.py:1462 msgid "Maximum Price" msgstr "Höchster Preis" -#: part/serializers.py:1491 +#: part/serializers.py:1463 msgid "Override calculated value for maximum price" msgstr "Berechneten Wert für maximalen Preis überschreiben" -#: part/serializers.py:1498 +#: part/serializers.py:1470 msgid "Maximum price currency" msgstr "Maximalpreis Währung" -#: part/serializers.py:1527 +#: part/serializers.py:1499 msgid "Update" msgstr "Aktualisieren" -#: part/serializers.py:1528 +#: part/serializers.py:1500 msgid "Update pricing for this part" msgstr "Preis für dieses Teil aktualisieren" -#: part/serializers.py:1551 +#: part/serializers.py:1523 #, python-brace-format msgid "Could not convert from provided currencies to {default_currency}" msgstr "Konnte nicht von den angegebenen Währungen in {default_currency} umrechnen" -#: part/serializers.py:1558 +#: part/serializers.py:1530 msgid "Minimum price must not be greater than maximum price" msgstr "Mindestpreis darf nicht größer als der Maximalpreis sein" -#: part/serializers.py:1561 +#: part/serializers.py:1533 msgid "Maximum price must not be less than minimum price" msgstr "Der Maximalpreis darf nicht kleiner als der Mindestpreis sein" -#: part/serializers.py:1715 +#: part/serializers.py:1687 msgid "Select the parent assembly" msgstr "" -#: part/serializers.py:1735 +#: part/serializers.py:1707 msgid "Select the component part" msgstr "" -#: part/serializers.py:1929 +#: part/serializers.py:1901 msgid "Select part to copy BOM from" msgstr "Teil auswählen, von dem Stückliste kopiert wird" -#: part/serializers.py:1937 +#: part/serializers.py:1909 msgid "Remove Existing Data" msgstr "Bestehende Daten entfernen" -#: part/serializers.py:1938 +#: part/serializers.py:1910 msgid "Remove existing BOM items before copying" msgstr "Bestehende Stücklisten-Positionen vor dem Kopieren entfernen" -#: part/serializers.py:1943 +#: part/serializers.py:1915 msgid "Include Inherited" msgstr "Vererbtes einschließen" -#: part/serializers.py:1944 +#: part/serializers.py:1916 msgid "Include BOM items which are inherited from templated parts" msgstr "Stücklisten-Positionen einbeziehen, die von Vorlage-Teilen geerbt werden" -#: part/serializers.py:1949 +#: part/serializers.py:1921 msgid "Skip Invalid Rows" msgstr "Ungültige Zeilen überspringen" -#: part/serializers.py:1950 +#: part/serializers.py:1922 msgid "Enable this option to skip invalid rows" msgstr "Aktiviere diese Option, um ungültige Zeilen zu überspringen" -#: part/serializers.py:1955 +#: part/serializers.py:1927 msgid "Copy Substitute Parts" msgstr "Ersatzteile kopieren" -#: part/serializers.py:1956 +#: part/serializers.py:1928 msgid "Copy substitute parts when duplicate BOM items" msgstr "Ersatzteile beim Duplizieren von Stücklisten-Positionen kopieren" @@ -8455,115 +8459,119 @@ msgstr "" msgid "Quantity does not match serial numbers" msgstr "Anzahl stimmt nicht mit den Seriennummern überein" -#: stock/models.py:2012 stock/models.py:2917 +#: stock/models.py:1912 +msgid "Cannot assign stock to structural location" +msgstr "" + +#: stock/models.py:2029 stock/models.py:2934 msgid "Test template does not exist" msgstr "Testvorlage existiert nicht" -#: stock/models.py:2030 +#: stock/models.py:2047 msgid "Stock item has been assigned to a sales order" msgstr "Artikel wurde einem Kundenauftrag zugewiesen" -#: stock/models.py:2034 +#: stock/models.py:2051 msgid "Stock item is installed in another item" msgstr "Lagerartikel ist in anderem Element verbaut" -#: stock/models.py:2037 +#: stock/models.py:2054 msgid "Stock item contains other items" msgstr "Lagerartikel enthält andere Artikel" -#: stock/models.py:2040 +#: stock/models.py:2057 msgid "Stock item has been assigned to a customer" msgstr "Artikel wurde einem Kunden zugewiesen" -#: stock/models.py:2043 stock/models.py:2226 +#: stock/models.py:2060 stock/models.py:2243 msgid "Stock item is currently in production" msgstr "Lagerartikel wird aktuell produziert" -#: stock/models.py:2046 +#: stock/models.py:2063 msgid "Serialized stock cannot be merged" msgstr "Nachverfolgbare Lagerartikel können nicht zusammengeführt werden" -#: stock/models.py:2053 stock/serializers.py:1462 +#: stock/models.py:2070 stock/serializers.py:1462 msgid "Duplicate stock items" msgstr "Artikel duplizeren" -#: stock/models.py:2057 +#: stock/models.py:2074 msgid "Stock items must refer to the same part" msgstr "Lagerartikel müssen auf dasselbe Teil verweisen" -#: stock/models.py:2065 +#: stock/models.py:2082 msgid "Stock items must refer to the same supplier part" msgstr "Lagerartikel müssen auf dasselbe Lieferantenteil verweisen" -#: stock/models.py:2070 +#: stock/models.py:2087 msgid "Stock status codes must match" msgstr "Status-Codes müssen zusammenpassen" -#: stock/models.py:2349 +#: stock/models.py:2366 msgid "StockItem cannot be moved as it is not in stock" msgstr "Lagerartikel kann nicht bewegt werden, da kein Bestand vorhanden ist" -#: stock/models.py:2818 +#: stock/models.py:2835 msgid "Stock Item Tracking" msgstr "" -#: stock/models.py:2849 +#: stock/models.py:2866 msgid "Entry notes" msgstr "Eintrags-Notizen" -#: stock/models.py:2889 +#: stock/models.py:2906 msgid "Stock Item Test Result" msgstr "" -#: stock/models.py:2920 +#: stock/models.py:2937 msgid "Value must be provided for this test" msgstr "Wert muss für diesen Test angegeben werden" -#: stock/models.py:2924 +#: stock/models.py:2941 msgid "Attachment must be uploaded for this test" msgstr "Anhang muss für diesen Test hochgeladen werden" -#: stock/models.py:2929 +#: stock/models.py:2946 msgid "Invalid value for this test" msgstr "" -#: stock/models.py:2953 +#: stock/models.py:2970 msgid "Test result" msgstr "Testergebnis" -#: stock/models.py:2960 +#: stock/models.py:2977 msgid "Test output value" msgstr "Test Ausgabe Wert" -#: stock/models.py:2968 stock/serializers.py:248 +#: stock/models.py:2985 stock/serializers.py:248 msgid "Test result attachment" msgstr "Test Ergebnis Anhang" -#: stock/models.py:2972 +#: stock/models.py:2989 msgid "Test notes" msgstr "Test Notizen" -#: stock/models.py:2980 +#: stock/models.py:2997 msgid "Test station" msgstr "Teststation" -#: stock/models.py:2981 +#: stock/models.py:2998 msgid "The identifier of the test station where the test was performed" msgstr "Der Bezeichner der Teststation, in der der Test durchgeführt wurde" -#: stock/models.py:2987 +#: stock/models.py:3004 msgid "Started" msgstr "Gestartet" -#: stock/models.py:2988 +#: stock/models.py:3005 msgid "The timestamp of the test start" msgstr "Der Zeitstempel des Teststarts" -#: stock/models.py:2994 +#: stock/models.py:3011 msgid "Finished" msgstr "Fertiggestellt" -#: stock/models.py:2995 +#: stock/models.py:3012 msgid "The timestamp of the test finish" msgstr "Der Zeitstempel der Test-Beendigung" @@ -8902,83 +8910,87 @@ msgstr "Bestand manuell hinzugefügt" msgid "Stock manually removed" msgstr "Bestand manuell entfernt" -#: stock/status_codes.py:57 +#: stock/status_codes.py:56 +msgid "Serialized stock items" +msgstr "" + +#: stock/status_codes.py:58 msgid "Returned to stock" msgstr "" -#: stock/status_codes.py:60 +#: stock/status_codes.py:61 msgid "Location changed" msgstr "Standort geändert" -#: stock/status_codes.py:61 +#: stock/status_codes.py:62 msgid "Stock updated" msgstr "Lagerbestand aktualisiert" -#: stock/status_codes.py:64 +#: stock/status_codes.py:65 msgid "Installed into assembly" msgstr "In Baugruppe installiert" -#: stock/status_codes.py:65 +#: stock/status_codes.py:66 msgid "Removed from assembly" msgstr "Aus Baugruppe entfernt" -#: stock/status_codes.py:67 +#: stock/status_codes.py:68 msgid "Installed component item" msgstr "Komponente installiert" -#: stock/status_codes.py:68 +#: stock/status_codes.py:69 msgid "Removed component item" msgstr "Komponente entfernt" -#: stock/status_codes.py:71 +#: stock/status_codes.py:72 msgid "Split from parent item" msgstr "Vom übergeordneten Element geteilt" -#: stock/status_codes.py:72 +#: stock/status_codes.py:73 msgid "Split child item" msgstr "Unterobjekt geteilt" -#: stock/status_codes.py:75 +#: stock/status_codes.py:76 msgid "Merged stock items" msgstr "Lagerartikel zusammengeführt" -#: stock/status_codes.py:78 +#: stock/status_codes.py:79 msgid "Converted to variant" msgstr "In Variante umgewandelt" -#: stock/status_codes.py:81 +#: stock/status_codes.py:82 msgid "Build order output created" msgstr "Endprodukt erstellt" -#: stock/status_codes.py:82 +#: stock/status_codes.py:83 msgid "Build order output completed" msgstr "Endprodukt fertiggestellt" -#: stock/status_codes.py:83 +#: stock/status_codes.py:84 msgid "Build order output rejected" msgstr "Endprodukt abgelehnt" -#: stock/status_codes.py:84 +#: stock/status_codes.py:85 msgid "Consumed by build order" msgstr "Durch Bauauftrag verbraucht" -#: stock/status_codes.py:87 +#: stock/status_codes.py:88 msgid "Shipped against Sales Order" msgstr "Versandt gegen Verkaufsauftrag" -#: stock/status_codes.py:90 +#: stock/status_codes.py:91 msgid "Received against Purchase Order" msgstr "Gegen Bestellung empfangen" -#: stock/status_codes.py:93 +#: stock/status_codes.py:94 msgid "Returned against Return Order" msgstr "Zurückgeschickt gegen Rücksendeauftrag" -#: stock/status_codes.py:96 +#: stock/status_codes.py:97 msgid "Sent to customer" msgstr "Zum Kunden geschickt" -#: stock/status_codes.py:97 +#: stock/status_codes.py:98 msgid "Returned from customer" msgstr "Rücksendung vom Kunden" diff --git a/src/backend/InvenTree/locale/el/LC_MESSAGES/django.po b/src/backend/InvenTree/locale/el/LC_MESSAGES/django.po index 22613bdd90..d2a3402ceb 100644 --- a/src/backend/InvenTree/locale/el/LC_MESSAGES/django.po +++ b/src/backend/InvenTree/locale/el/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: inventree\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-11-19 04:55+0000\n" -"PO-Revision-Date: 2025-11-19 19:39\n" +"POT-Creation-Date: 2025-11-24 06:50+0000\n" +"PO-Revision-Date: 2025-11-24 06:54\n" "Last-Translator: \n" "Language-Team: Greek\n" "Language: el_GR\n" @@ -47,7 +47,7 @@ msgstr "Το φίλτρο all πρέπει να χρησιμοποιείται #: InvenTree/api.py:473 msgid "No items match the provided criteria" -msgstr "Κανένα Aντικειμένου δεν ταιριάζει στα κριτήρια που δόθηκαν" +msgstr "Κανένα Aντικείμενο δεν ταιριάζει στα κριτήρια που δόθηκαν" #: InvenTree/api.py:497 msgid "No data provided" @@ -81,21 +81,21 @@ msgstr "Η παρεχόμενη κύρια διεύθυνση ηλεκτρονι msgid "The provided email domain is not approved." msgstr "Ο παρεχόμενος τομέας ηλεκτρονικού ταχυδρομείου δεν έχει εγκριθεί." -#: InvenTree/conversion.py:166 +#: InvenTree/conversion.py:240 #, python-brace-format msgid "Invalid unit provided ({unit})" msgstr "Η μονάδα μέτρησης δεν είναι έγκυρη ({unit})" -#: InvenTree/conversion.py:183 +#: InvenTree/conversion.py:257 msgid "No value provided" msgstr "Δεν εισήχθη τιμή" -#: InvenTree/conversion.py:210 +#: InvenTree/conversion.py:284 #, python-brace-format msgid "Could not convert {original} to {unit}" msgstr "Δεν ήταν δυνατή η μετατροπή από {original} σε {unit}" -#: InvenTree/conversion.py:212 InvenTree/conversion.py:226 +#: InvenTree/conversion.py:286 InvenTree/conversion.py:300 #: InvenTree/helpers.py:597 order/models.py:720 order/models.py:1015 msgid "Invalid quantity provided" msgstr "Μη έγκυρη ποσότητα" @@ -116,7 +116,7 @@ msgstr "Μη έγκυρη δεκαδική τιμή" #: build/serializers.py:580 build/serializers.py:1788 company/models.py:857 #: order/models.py:1780 #: report/templates/report/inventree_build_order_report.html:172 -#: stock/models.py:2848 stock/models.py:2972 stock/serializers.py:717 +#: stock/models.py:2865 stock/models.py:2989 stock/serializers.py:717 #: stock/serializers.py:893 stock/serializers.py:1035 stock/serializers.py:1336 #: stock/serializers.py:1425 stock/serializers.py:1624 msgid "Notes" @@ -141,7 +141,7 @@ msgstr "Κενό σειριακό αριθμό συμβολοσειράς" #: InvenTree/helpers.py:636 msgid "Duplicate serial" -msgstr "Διπλότυπο serial number" +msgstr "Διπλότυπο ArialTTumblr" #: InvenTree/helpers.py:668 InvenTree/helpers.py:711 InvenTree/helpers.py:729 #: InvenTree/helpers.py:736 InvenTree/helpers.py:755 @@ -345,7 +345,7 @@ msgstr "Πρέπει να είναι αριθμός" msgid "Currency" msgstr "Νόμισμα" -#: InvenTree/serializers.py:298 part/serializers.py:1385 +#: InvenTree/serializers.py:298 part/serializers.py:1357 msgid "Select currency from available options" msgstr "Επιλέξτε νόμισμα από τις διαθέσιμες επιλογές" @@ -553,14 +553,14 @@ msgstr "Συμπερίληψη παραλλαγών" #: build/api.py:100 build/api.py:466 build/api.py:845 build/models.py:270 #: build/serializers.py:1225 build/serializers.py:1356 -#: build/serializers.py:1427 company/models.py:1067 company/serializers.py:445 +#: build/serializers.py:1427 company/models.py:1067 company/serializers.py:491 #: order/api.py:298 order/api.py:302 order/api.py:929 order/api.py:1187 #: order/api.py:1190 order/models.py:1941 order/models.py:2108 #: order/models.py:2109 part/api.py:1233 part/api.py:1236 part/api.py:1302 #: part/api.py:1589 part/models.py:472 part/models.py:3296 part/models.py:3439 #: part/models.py:3497 part/models.py:3518 part/models.py:3540 #: part/models.py:3679 part/models.py:4046 part/models.py:4368 -#: part/models.py:4787 part/serializers.py:1928 +#: part/models.py:4787 part/serializers.py:1900 #: report/templates/report/inventree_bill_of_materials_report.html:110 #: report/templates/report/inventree_bill_of_materials_report.html:137 #: report/templates/report/inventree_build_order_report.html:109 @@ -582,7 +582,7 @@ msgstr "Εξάρτημα" #: build/api.py:120 build/api.py:123 build/serializers.py:1438 part/api.py:980 #: part/api.py:1316 part/api.py:1600 part/models.py:1080 part/models.py:3568 -#: part/models.py:4162 part/serializers.py:1752 stock/api.py:869 +#: part/models.py:4162 part/serializers.py:1724 stock/api.py:869 msgid "Category" msgstr "Κατηγορία" @@ -663,7 +663,7 @@ msgid "Optional" msgstr "Προαιρετικό" #: build/api.py:455 build/serializers.py:1415 common/setting/system.py:456 -#: part/models.py:1202 part/serializers.py:1714 part/serializers.py:1725 +#: part/models.py:1202 part/serializers.py:1686 part/serializers.py:1697 #: stock/api.py:639 msgid "Assembly" msgstr "Συναρμολόγηση" @@ -688,16 +688,16 @@ msgstr "Κατανεμημένο" msgid "Consumed" msgstr "Καταναλωμένο" -#: build/api.py:499 company/models.py:912 company/serializers.py:440 +#: build/api.py:499 company/models.py:912 company/serializers.py:474 #: templates/email/build_order_required_stock.html:19 #: templates/email/low_stock_notification.html:17 #: templates/email/part_event_notification.html:18 msgid "Available" msgstr "Διαθέσιμο" -#: build/api.py:523 build/serializers.py:1466 company/serializers.py:437 -#: order/serializers.py:1281 part/serializers.py:959 part/serializers.py:1306 -#: part/serializers.py:1761 +#: build/api.py:523 build/serializers.py:1466 company/serializers.py:471 +#: order/serializers.py:1281 part/serializers.py:931 part/serializers.py:1278 +#: part/serializers.py:1733 msgid "On Order" msgstr "Σε παραγγελία" @@ -963,7 +963,7 @@ msgstr "Η έξοδος κατασκευής δεν ταιριάζει με τη #: build/models.py:1136 build/models.py:1234 build/serializers.py:285 #: build/serializers.py:335 build/serializers.py:965 build/serializers.py:1739 #: order/models.py:717 order/serializers.py:658 order/serializers.py:844 -#: part/serializers.py:1708 stock/models.py:940 stock/models.py:1430 +#: part/serializers.py:1680 stock/models.py:940 stock/models.py:1430 #: stock/models.py:1878 stock/serializers.py:688 stock/serializers.py:1580 msgid "Quantity must be greater than zero" msgstr "Η ποσότητα πρέπει να είναι μεγαλύτερη από 0" @@ -1385,20 +1385,20 @@ msgstr "Να επιτρέπονται παραλλαγές" msgid "BOM Item" msgstr "Στοιχείο BOM" -#: build/serializers.py:1467 order/serializers.py:1282 part/serializers.py:1310 -#: part/serializers.py:1765 +#: build/serializers.py:1467 order/serializers.py:1282 part/serializers.py:1282 +#: part/serializers.py:1737 msgid "In Production" msgstr "Σε παραγωγή" -#: build/serializers.py:1469 part/serializers.py:950 part/serializers.py:1314 +#: build/serializers.py:1469 part/serializers.py:922 part/serializers.py:1286 msgid "Scheduled to Build" msgstr "Προγραμματισμένο για κατασκευή" -#: build/serializers.py:1472 part/serializers.py:987 +#: build/serializers.py:1472 part/serializers.py:959 msgid "External Stock" msgstr "Εξωτερικό απόθεμα" -#: build/serializers.py:1473 part/serializers.py:1300 part/serializers.py:1808 +#: build/serializers.py:1473 part/serializers.py:1272 part/serializers.py:1780 msgid "Available Stock" msgstr "Διαθέσιμο απόθεμα" @@ -1588,7 +1588,7 @@ msgstr "Χρήστης" msgid "Price break quantity" msgstr "Ποσότητα κλιμακωτής τιμής" -#: common/models.py:1348 company/serializers.py:564 order/models.py:1842 +#: common/models.py:1348 company/serializers.py:357 order/models.py:1842 #: order/models.py:3043 msgid "Price" msgstr "Τιμή" @@ -1760,7 +1760,7 @@ msgstr "Ορισμός" msgid "Unit definition" msgstr "Ορισμός μονάδας" -#: common/models.py:1911 common/models.py:1974 stock/models.py:2967 +#: common/models.py:1911 common/models.py:1974 stock/models.py:2984 #: stock/serializers.py:247 msgid "Attachment" msgstr "Συνημμένο" @@ -1839,7 +1839,7 @@ msgstr "Λογικό κλειδί κατάστασης που είναι ισο #: common/models.py:2090 common/models.py:2329 company/models.py:622 #: machine/serializers.py:27 -#: report/templates/report/inventree_test_report.html:104 stock/models.py:2959 +#: report/templates/report/inventree_test_report.html:104 stock/models.py:2976 msgid "Value" msgstr "Τιμή" @@ -2048,7 +2048,7 @@ msgid "Response data from the barcode scan" msgstr "Δεδομένα απόκρισης από τη σάρωση barcode" #: common/models.py:2417 report/templates/report/inventree_test_report.html:103 -#: stock/models.py:2953 +#: stock/models.py:2970 msgid "Result" msgstr "Αποτέλεσμα" @@ -2141,8 +2141,8 @@ msgid "Linked thread for this message" msgstr "Συνδεδεμένο νήμα για αυτό το μήνυμα" #: common/models.py:2656 -msgid "Prioriy" -msgstr "Προτεραιότητα" +msgid "Priority" +msgstr "" #: common/models.py:2698 msgid "Email Thread" @@ -2362,11 +2362,11 @@ msgstr "Χρήση του ονόματος instance στη γραμμή τίτλ #: common/setting/system.py:218 msgid "Restrict showing `about`" -msgstr "" +msgstr "Περιορισμός εμφάνισης `about`" #: common/setting/system.py:219 msgid "Show the `about` modal only to superusers" -msgstr "" +msgstr "Εμφάνιση της λειτουργίας `about` μόνο σε superusers" #: common/setting/system.py:224 company/models.py:144 company/models.py:145 msgid "Company name" @@ -2671,8 +2671,8 @@ msgstr "Τα Προϊόντα είναι πρότυπα από προεπιλο msgid "Parts can be assembled from other components by default" msgstr "Τα Προϊόντα μπορούν να συναρμολογούνται από άλλα συστατικά από προεπιλογή" -#: common/setting/system.py:462 part/models.py:1208 part/serializers.py:1734 -#: part/serializers.py:1741 +#: common/setting/system.py:462 part/models.py:1208 part/serializers.py:1706 +#: part/serializers.py:1713 msgid "Component" msgstr "Συστατικό" @@ -3772,7 +3772,7 @@ msgstr "Το εσωτερικό προϊόν είναι ενεργό" msgid "Supplier is Active" msgstr "Ο προμηθευτής είναι ενεργός" -#: company/api.py:307 company/models.py:520 company/serializers.py:457 +#: company/api.py:307 company/models.py:520 company/serializers.py:503 #: part/serializers.py:566 msgid "Manufacturer" msgstr "Κατασκευαστής" @@ -3964,7 +3964,7 @@ msgid "Link to address information (external)" msgstr "Σύνδεσμος σε πληροφορίες διεύθυνσης (εξωτερικό)" #: company/models.py:492 company/models.py:609 company/models.py:832 -#: company/serializers.py:471 stock/api.py:561 +#: company/serializers.py:517 stock/api.py:561 msgid "Manufacturer Part" msgstr "Προϊόν κατασκευαστή" @@ -3981,7 +3981,7 @@ msgstr "Επιλογή προϊόντος" msgid "Select manufacturer" msgstr "Επιλογή κατασκευαστή" -#: company/models.py:527 company/serializers.py:479 order/serializers.py:734 +#: company/models.py:527 company/serializers.py:525 order/serializers.py:734 #: part/serializers.py:576 msgid "MPN" msgstr "MPN" @@ -4030,7 +4030,7 @@ msgstr "Οι μονάδες συσκευασίας πρέπει να είναι msgid "Linked manufacturer part must reference the same base part" msgstr "Το συνδεδεμένο προϊόν κατασκευαστή πρέπει να αναφέρεται στο ίδιο βασικό προϊόν" -#: company/models.py:810 company/serializers.py:449 company/serializers.py:467 +#: company/models.py:810 company/serializers.py:495 company/serializers.py:513 #: order/models.py:639 part/serializers.py:550 #: plugin/builtin/suppliers/digikey.py:26 plugin/builtin/suppliers/lcsc.py:27 #: plugin/builtin/suppliers/mouser.py:25 plugin/builtin/suppliers/tme.py:27 @@ -4134,10 +4134,14 @@ msgstr "Προεπιλεγμένο νόμισμα που χρησιμοποιε msgid "Company Name" msgstr "Όνομα εταιρείας" -#: company/serializers.py:433 part/serializers.py:955 stock/serializers.py:428 +#: company/serializers.py:467 part/serializers.py:927 stock/serializers.py:428 msgid "In Stock" msgstr "Σε απόθεμα" +#: company/serializers.py:484 +msgid "Price Breaks" +msgstr "Κλιμακωτές τιμές" + #: data_exporter/mixins.py:325 data_exporter/mixins.py:403 msgid "Error occurred during data export" msgstr "Προέκυψε σφάλμα κατά την εξαγωγή δεδομένων" @@ -4290,7 +4294,7 @@ msgstr "Αρχικά δεδομένα γραμμής" msgid "Errors" msgstr "Σφάλματα" -#: importer/models.py:550 part/serializers.py:1268 +#: importer/models.py:550 part/serializers.py:1240 msgid "Valid" msgstr "Έγκυρο" @@ -5677,7 +5681,7 @@ msgstr "Λέξεις-κλειδιά προϊόντος για βελτίωση msgid "Part category" msgstr "Κατηγορία προϊόντος" -#: part/models.py:1088 part/serializers.py:929 +#: part/models.py:1088 part/serializers.py:901 #: report/templates/report/inventree_stock_location_report.html:103 msgid "IPN" msgstr "IPN" @@ -5718,7 +5722,7 @@ msgstr "Προεπιλεγμένη λήξη" msgid "Expiry time (in days) for stock items of this part" msgstr "Χρόνος λήξης (σε ημέρες) για είδη αποθέματος αυτού του προϊόντος" -#: part/models.py:1186 part/serializers.py:1003 +#: part/models.py:1186 part/serializers.py:975 msgid "Minimum Stock" msgstr "Ελάχιστο απόθεμα" @@ -6418,203 +6422,203 @@ msgstr "Υπάρχει ήδη προϊόν κατασκευαστή με αυτ msgid "Supplier part matching this SKU already exists" msgstr "Υπάρχει ήδη προϊόν προμηθευτή με αυτό το SKU" -#: part/serializers.py:914 +#: part/serializers.py:886 msgid "Category Name" msgstr "Όνομα κατηγορίας" -#: part/serializers.py:943 +#: part/serializers.py:915 msgid "Building" msgstr "Σε παραγωγή" -#: part/serializers.py:944 +#: part/serializers.py:916 msgid "Quantity of this part currently being in production" msgstr "Ποσότητα αυτού του προϊόντος που βρίσκεται αυτή τη στιγμή σε παραγωγή" -#: part/serializers.py:951 +#: part/serializers.py:923 msgid "Outstanding quantity of this part scheduled to be built" msgstr "Εκκρεμής ποσότητα αυτού του προϊόντος που έχει προγραμματιστεί για παραγωγή" -#: part/serializers.py:971 stock/serializers.py:1019 stock/serializers.py:1189 +#: part/serializers.py:943 stock/serializers.py:1019 stock/serializers.py:1189 #: users/ruleset.py:30 msgid "Stock Items" msgstr "Είδη αποθέματος" -#: part/serializers.py:975 +#: part/serializers.py:947 msgid "Revisions" msgstr "Αναθεωρήσεις" -#: part/serializers.py:979 +#: part/serializers.py:951 msgid "Suppliers" msgstr "Προμηθευτές" -#: part/serializers.py:983 part/serializers.py:1297 +#: part/serializers.py:955 part/serializers.py:1269 #: templates/email/low_stock_notification.html:16 #: templates/email/part_event_notification.html:17 msgid "Total Stock" msgstr "Συνολικό απόθεμα" -#: part/serializers.py:991 +#: part/serializers.py:963 msgid "Unallocated Stock" msgstr "Μη δεσμευμένο απόθεμα" -#: part/serializers.py:999 +#: part/serializers.py:971 msgid "Variant Stock" msgstr "Απόθεμα παραλλαγών" -#: part/serializers.py:1054 +#: part/serializers.py:1026 msgid "Duplicate Part" msgstr "Αντιγραφή προϊόντος" -#: part/serializers.py:1055 +#: part/serializers.py:1027 msgid "Copy initial data from another Part" msgstr "Αντιγραφή αρχικών δεδομένων από άλλο προϊόν" -#: part/serializers.py:1061 +#: part/serializers.py:1033 msgid "Initial Stock" msgstr "Αρχικό απόθεμα" -#: part/serializers.py:1062 +#: part/serializers.py:1034 msgid "Create Part with initial stock quantity" msgstr "Δημιουργία προϊόντος με αρχική ποσότητα αποθέματος" -#: part/serializers.py:1068 +#: part/serializers.py:1040 msgid "Supplier Information" msgstr "Πληροφορίες προμηθευτή" -#: part/serializers.py:1069 +#: part/serializers.py:1041 msgid "Add initial supplier information for this part" msgstr "Προσθήκη αρχικών πληροφοριών προμηθευτή για αυτό το προϊόν" -#: part/serializers.py:1077 +#: part/serializers.py:1049 msgid "Copy Category Parameters" msgstr "Αντιγραφή παραμέτρων κατηγορίας" -#: part/serializers.py:1078 +#: part/serializers.py:1050 msgid "Copy parameter templates from selected part category" msgstr "Αντιγραφή προτύπων παραμέτρων από την επιλεγμένη κατηγορία προϊόντος" -#: part/serializers.py:1083 +#: part/serializers.py:1055 msgid "Existing Image" msgstr "Υπάρχουσα εικόνα" -#: part/serializers.py:1084 +#: part/serializers.py:1056 msgid "Filename of an existing part image" msgstr "Όνομα αρχείου υπάρχουσας εικόνας προϊόντος" -#: part/serializers.py:1101 +#: part/serializers.py:1073 msgid "Image file does not exist" msgstr "Το αρχείο εικόνας δεν υπάρχει" -#: part/serializers.py:1269 +#: part/serializers.py:1241 msgid "Validate entire Bill of Materials" msgstr "Επικύρωση ολόκληρης της λίστας υλικών (BOM)" -#: part/serializers.py:1303 part/serializers.py:1769 +#: part/serializers.py:1275 part/serializers.py:1741 msgid "Can Build" msgstr "Μπορεί να παραχθεί" -#: part/serializers.py:1320 +#: part/serializers.py:1292 msgid "Required for Build Orders" msgstr "Απαιτείται για εντολές παραγωγής" -#: part/serializers.py:1325 +#: part/serializers.py:1297 msgid "Allocated to Build Orders" msgstr "Δεσμευμένο σε εντολές παραγωγής" -#: part/serializers.py:1332 +#: part/serializers.py:1304 msgid "Required for Sales Orders" msgstr "Απαιτείται για εντολές πώλησης" -#: part/serializers.py:1336 +#: part/serializers.py:1308 msgid "Allocated to Sales Orders" msgstr "Δεσμευμένο σε εντολές πώλησης" -#: part/serializers.py:1475 +#: part/serializers.py:1447 msgid "Minimum Price" msgstr "Ελάχιστη τιμή" -#: part/serializers.py:1476 +#: part/serializers.py:1448 msgid "Override calculated value for minimum price" msgstr "Παράκαμψη υπολογισμένης τιμής για την ελάχιστη τιμή" -#: part/serializers.py:1483 +#: part/serializers.py:1455 msgid "Minimum price currency" msgstr "Νόμισμα ελάχιστης τιμής" -#: part/serializers.py:1490 +#: part/serializers.py:1462 msgid "Maximum Price" msgstr "Μέγιστη τιμή" -#: part/serializers.py:1491 +#: part/serializers.py:1463 msgid "Override calculated value for maximum price" msgstr "Παράκαμψη υπολογισμένης τιμής για τη μέγιστη τιμή" -#: part/serializers.py:1498 +#: part/serializers.py:1470 msgid "Maximum price currency" msgstr "Νόμισμα μέγιστης τιμής" -#: part/serializers.py:1527 +#: part/serializers.py:1499 msgid "Update" msgstr "Ενημέρωση" -#: part/serializers.py:1528 +#: part/serializers.py:1500 msgid "Update pricing for this part" msgstr "Ενημέρωση τιμολόγησης για αυτό το προϊόν" -#: part/serializers.py:1551 +#: part/serializers.py:1523 #, python-brace-format msgid "Could not convert from provided currencies to {default_currency}" msgstr "Δεν ήταν δυνατή η μετατροπή από τα δοθέντα νομίσματα σε {default_currency}" -#: part/serializers.py:1558 +#: part/serializers.py:1530 msgid "Minimum price must not be greater than maximum price" msgstr "Η ελάχιστη τιμή δεν πρέπει να είναι μεγαλύτερη από τη μέγιστη τιμή" -#: part/serializers.py:1561 +#: part/serializers.py:1533 msgid "Maximum price must not be less than minimum price" msgstr "Η μέγιστη τιμή δεν πρέπει να είναι μικρότερη από την ελάχιστη τιμή" -#: part/serializers.py:1715 +#: part/serializers.py:1687 msgid "Select the parent assembly" msgstr "Επιλέξτε τη γονική συναρμολόγηση" -#: part/serializers.py:1735 +#: part/serializers.py:1707 msgid "Select the component part" msgstr "Επιλέξτε το προϊόν Προϊόντος" -#: part/serializers.py:1929 +#: part/serializers.py:1901 msgid "Select part to copy BOM from" msgstr "Επιλέξτε προϊόν από το οποίο θα αντιγραφεί το BOM" -#: part/serializers.py:1937 +#: part/serializers.py:1909 msgid "Remove Existing Data" msgstr "Αφαίρεση υπαρχόντων δεδομένων" -#: part/serializers.py:1938 +#: part/serializers.py:1910 msgid "Remove existing BOM items before copying" msgstr "Αφαίρεση υπαρχόντων στοιχείων BOM πριν την αντιγραφή" -#: part/serializers.py:1943 +#: part/serializers.py:1915 msgid "Include Inherited" msgstr "Συμπερίληψη κληρονομημένων" -#: part/serializers.py:1944 +#: part/serializers.py:1916 msgid "Include BOM items which are inherited from templated parts" msgstr "Συμπερίληψη στοιχείων BOM που κληρονομούνται από προϊόντα προτύπων" -#: part/serializers.py:1949 +#: part/serializers.py:1921 msgid "Skip Invalid Rows" msgstr "Παράλειψη μη έγκυρων γραμμών" -#: part/serializers.py:1950 +#: part/serializers.py:1922 msgid "Enable this option to skip invalid rows" msgstr "Ενεργοποιήστε αυτή την επιλογή για να παραλείπονται οι μη έγκυρες γραμμές" -#: part/serializers.py:1955 +#: part/serializers.py:1927 msgid "Copy Substitute Parts" msgstr "Αντιγραφή εναλλακτικών προϊόντων" -#: part/serializers.py:1956 +#: part/serializers.py:1928 msgid "Copy substitute parts when duplicate BOM items" msgstr "Αντιγραφή εναλλακτικών προϊόντων κατά την αντιγραφή στοιχείων BOM" @@ -8455,115 +8459,119 @@ msgstr "Οι σειριακοί αριθμοί πρέπει να δοθούν ω msgid "Quantity does not match serial numbers" msgstr "Η ποσότητα δεν αντιστοιχεί στους σειριακούς αριθμούς" -#: stock/models.py:2012 stock/models.py:2917 +#: stock/models.py:1912 +msgid "Cannot assign stock to structural location" +msgstr "" + +#: stock/models.py:2029 stock/models.py:2934 msgid "Test template does not exist" msgstr "Το πρότυπο δοκιμής δεν υπάρχει" -#: stock/models.py:2030 +#: stock/models.py:2047 msgid "Stock item has been assigned to a sales order" msgstr "Το είδος αποθέματος έχει αντιστοιχιστεί σε εντολή πώλησης" -#: stock/models.py:2034 +#: stock/models.py:2051 msgid "Stock item is installed in another item" msgstr "Το είδος αποθέματος είναι εγκατεστημένο σε άλλο είδος" -#: stock/models.py:2037 +#: stock/models.py:2054 msgid "Stock item contains other items" msgstr "Το είδος αποθέματος περιέχει άλλα είδη" -#: stock/models.py:2040 +#: stock/models.py:2057 msgid "Stock item has been assigned to a customer" msgstr "Το είδος αποθέματος έχει αντιστοιχιστεί σε πελάτη" -#: stock/models.py:2043 stock/models.py:2226 +#: stock/models.py:2060 stock/models.py:2243 msgid "Stock item is currently in production" msgstr "Το είδος αποθέματος βρίσκεται αυτή τη στιγμή σε παραγωγή" -#: stock/models.py:2046 +#: stock/models.py:2063 msgid "Serialized stock cannot be merged" msgstr "Σειριακό απόθεμα δεν μπορεί να συγχωνευθεί" -#: stock/models.py:2053 stock/serializers.py:1462 +#: stock/models.py:2070 stock/serializers.py:1462 msgid "Duplicate stock items" msgstr "Διπλότυπα είδη αποθέματος" -#: stock/models.py:2057 +#: stock/models.py:2074 msgid "Stock items must refer to the same part" msgstr "Τα είδη αποθέματος πρέπει να αναφέρονται στο ίδιο προϊόν" -#: stock/models.py:2065 +#: stock/models.py:2082 msgid "Stock items must refer to the same supplier part" msgstr "Τα είδη αποθέματος πρέπει να αναφέρονται στο ίδιο προϊόν προμηθευτή" -#: stock/models.py:2070 +#: stock/models.py:2087 msgid "Stock status codes must match" msgstr "Οι κωδικοί κατάστασης αποθέματος πρέπει να ταιριάζουν" -#: stock/models.py:2349 +#: stock/models.py:2366 msgid "StockItem cannot be moved as it is not in stock" msgstr "Το StockItem δεν μπορεί να μετακινηθεί καθώς δεν βρίσκεται σε απόθεμα" -#: stock/models.py:2818 +#: stock/models.py:2835 msgid "Stock Item Tracking" msgstr "Ιχνηλάτηση είδους αποθέματος" -#: stock/models.py:2849 +#: stock/models.py:2866 msgid "Entry notes" msgstr "Σημειώσεις καταχώρησης" -#: stock/models.py:2889 +#: stock/models.py:2906 msgid "Stock Item Test Result" msgstr "Αποτέλεσμα δοκιμής είδους αποθέματος" -#: stock/models.py:2920 +#: stock/models.py:2937 msgid "Value must be provided for this test" msgstr "Πρέπει να δοθεί τιμή για αυτή τη δοκιμή" -#: stock/models.py:2924 +#: stock/models.py:2941 msgid "Attachment must be uploaded for this test" msgstr "Πρέπει να μεταφορτωθεί συνημμένο για αυτή τη δοκιμή" -#: stock/models.py:2929 +#: stock/models.py:2946 msgid "Invalid value for this test" msgstr "Μη έγκυρη τιμή για αυτή τη δοκιμή" -#: stock/models.py:2953 +#: stock/models.py:2970 msgid "Test result" msgstr "Αποτέλεσμα δοκιμής" -#: stock/models.py:2960 +#: stock/models.py:2977 msgid "Test output value" msgstr "Τιμή αποτελέσματος δοκιμής" -#: stock/models.py:2968 stock/serializers.py:248 +#: stock/models.py:2985 stock/serializers.py:248 msgid "Test result attachment" msgstr "Συνημμένο αποτελέσματος δοκιμής" -#: stock/models.py:2972 +#: stock/models.py:2989 msgid "Test notes" msgstr "Σημειώσεις δοκιμής" -#: stock/models.py:2980 +#: stock/models.py:2997 msgid "Test station" msgstr "Σταθμός δοκιμής" -#: stock/models.py:2981 +#: stock/models.py:2998 msgid "The identifier of the test station where the test was performed" msgstr "Ο αναγνωριστικός κωδικός του σταθμού δοκιμής όπου πραγματοποιήθηκε η δοκιμή" -#: stock/models.py:2987 +#: stock/models.py:3004 msgid "Started" msgstr "Έναρξη" -#: stock/models.py:2988 +#: stock/models.py:3005 msgid "The timestamp of the test start" msgstr "Χρονική σήμανση έναρξης της δοκιμής" -#: stock/models.py:2994 +#: stock/models.py:3011 msgid "Finished" msgstr "Ολοκλήρωση" -#: stock/models.py:2995 +#: stock/models.py:3012 msgid "The timestamp of the test finish" msgstr "Χρονική σήμανση λήξης της δοκιμής" @@ -8902,83 +8910,87 @@ msgstr "Προστέθηκε απόθεμα χειροκίνητα" msgid "Stock manually removed" msgstr "Αφαιρέθηκε απόθεμα χειροκίνητα" -#: stock/status_codes.py:57 +#: stock/status_codes.py:56 +msgid "Serialized stock items" +msgstr "" + +#: stock/status_codes.py:58 msgid "Returned to stock" msgstr "Επιστροφή στο απόθεμα" -#: stock/status_codes.py:60 +#: stock/status_codes.py:61 msgid "Location changed" msgstr "Η τοποθεσία τροποποιήθηκε" -#: stock/status_codes.py:61 +#: stock/status_codes.py:62 msgid "Stock updated" msgstr "Το απόθεμα ενημερώθηκε" -#: stock/status_codes.py:64 +#: stock/status_codes.py:65 msgid "Installed into assembly" msgstr "Εγκαταστάθηκε στη συναρμολόγηση" -#: stock/status_codes.py:65 +#: stock/status_codes.py:66 msgid "Removed from assembly" msgstr "Αφαιρέθηκε από τη συναρμολόγηση" -#: stock/status_codes.py:67 +#: stock/status_codes.py:68 msgid "Installed component item" msgstr "Εγκαταστάθηκε αντικείμενο" -#: stock/status_codes.py:68 +#: stock/status_codes.py:69 msgid "Removed component item" msgstr "Αφαιρέθηκε αντικείμενο" -#: stock/status_codes.py:71 +#: stock/status_codes.py:72 msgid "Split from parent item" msgstr "Έγινε διαχωρισμός από το γονεϊκό αρχείο" -#: stock/status_codes.py:72 +#: stock/status_codes.py:73 msgid "Split child item" msgstr "Διαχωρίστηκε θυγατρικό στοιχείο" -#: stock/status_codes.py:75 +#: stock/status_codes.py:76 msgid "Merged stock items" msgstr "Έγινε συγχώνευση αποθεμάτων" -#: stock/status_codes.py:78 +#: stock/status_codes.py:79 msgid "Converted to variant" msgstr "Μετατράπηκε σε παραλλαγή" -#: stock/status_codes.py:81 +#: stock/status_codes.py:82 msgid "Build order output created" msgstr "Δημιουργήθηκε η έξοδος παραγγελίας" -#: stock/status_codes.py:82 +#: stock/status_codes.py:83 msgid "Build order output completed" msgstr "Η έξοδος της σειράς κατασκευής ολοκληρώθηκε" -#: stock/status_codes.py:83 +#: stock/status_codes.py:84 msgid "Build order output rejected" msgstr "Η εντολή κατασκευής απορρίφθηκε" -#: stock/status_codes.py:84 +#: stock/status_codes.py:85 msgid "Consumed by build order" msgstr "Κατανάλωση με εντολή κατασκευής" -#: stock/status_codes.py:87 +#: stock/status_codes.py:88 msgid "Shipped against Sales Order" msgstr "Αποστολή έναντι Εντολής Πώλησης" -#: stock/status_codes.py:90 +#: stock/status_codes.py:91 msgid "Received against Purchase Order" msgstr "Λήφθηκε έναντι Εντολής Αγοράς" -#: stock/status_codes.py:93 +#: stock/status_codes.py:94 msgid "Returned against Return Order" msgstr "Επιστράφηκε έναντι Εντολής Αγοράς" -#: stock/status_codes.py:96 +#: stock/status_codes.py:97 msgid "Sent to customer" msgstr "Απεστάλη στον πελάτη" -#: stock/status_codes.py:97 +#: stock/status_codes.py:98 msgid "Returned from customer" msgstr "Επιστράφηκε από πελάτη" diff --git a/src/backend/InvenTree/locale/en/LC_MESSAGES/django.po b/src/backend/InvenTree/locale/en/LC_MESSAGES/django.po index f7d9f62550..a93c66933b 100644 --- a/src/backend/InvenTree/locale/en/LC_MESSAGES/django.po +++ b/src/backend/InvenTree/locale/en/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-11-19 19:35+0000\n" +"POT-Creation-Date: 2025-11-25 11:03+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -82,21 +82,21 @@ msgstr "" msgid "The provided email domain is not approved." msgstr "" -#: InvenTree/conversion.py:166 +#: InvenTree/conversion.py:240 #, python-brace-format msgid "Invalid unit provided ({unit})" msgstr "" -#: InvenTree/conversion.py:183 +#: InvenTree/conversion.py:257 msgid "No value provided" msgstr "" -#: InvenTree/conversion.py:210 +#: InvenTree/conversion.py:284 #, python-brace-format msgid "Could not convert {original} to {unit}" msgstr "" -#: InvenTree/conversion.py:212 InvenTree/conversion.py:226 +#: InvenTree/conversion.py:286 InvenTree/conversion.py:300 #: InvenTree/helpers.py:597 order/models.py:720 order/models.py:1015 msgid "Invalid quantity provided" msgstr "" @@ -117,7 +117,7 @@ msgstr "" #: build/serializers.py:580 build/serializers.py:1788 company/models.py:857 #: order/models.py:1780 #: report/templates/report/inventree_build_order_report.html:172 -#: stock/models.py:2848 stock/models.py:2972 stock/serializers.py:717 +#: stock/models.py:2865 stock/models.py:2989 stock/serializers.py:717 #: stock/serializers.py:893 stock/serializers.py:1035 stock/serializers.py:1336 #: stock/serializers.py:1425 stock/serializers.py:1624 msgid "Notes" @@ -346,7 +346,7 @@ msgstr "" msgid "Currency" msgstr "" -#: InvenTree/serializers.py:298 part/serializers.py:1385 +#: InvenTree/serializers.py:298 part/serializers.py:1357 msgid "Select currency from available options" msgstr "" @@ -554,14 +554,14 @@ msgstr "" #: build/api.py:100 build/api.py:466 build/api.py:845 build/models.py:270 #: build/serializers.py:1225 build/serializers.py:1356 -#: build/serializers.py:1427 company/models.py:1067 company/serializers.py:445 +#: build/serializers.py:1427 company/models.py:1067 company/serializers.py:491 #: order/api.py:298 order/api.py:302 order/api.py:929 order/api.py:1187 #: order/api.py:1190 order/models.py:1941 order/models.py:2108 #: order/models.py:2109 part/api.py:1233 part/api.py:1236 part/api.py:1302 #: part/api.py:1589 part/models.py:472 part/models.py:3296 part/models.py:3439 #: part/models.py:3497 part/models.py:3518 part/models.py:3540 #: part/models.py:3679 part/models.py:4046 part/models.py:4368 -#: part/models.py:4787 part/serializers.py:1928 +#: part/models.py:4787 part/serializers.py:1900 #: report/templates/report/inventree_bill_of_materials_report.html:110 #: report/templates/report/inventree_bill_of_materials_report.html:137 #: report/templates/report/inventree_build_order_report.html:109 @@ -583,7 +583,7 @@ msgstr "" #: build/api.py:120 build/api.py:123 build/serializers.py:1438 part/api.py:980 #: part/api.py:1316 part/api.py:1600 part/models.py:1080 part/models.py:3568 -#: part/models.py:4162 part/serializers.py:1752 stock/api.py:869 +#: part/models.py:4162 part/serializers.py:1724 stock/api.py:869 msgid "Category" msgstr "" @@ -664,7 +664,7 @@ msgid "Optional" msgstr "" #: build/api.py:455 build/serializers.py:1415 common/setting/system.py:456 -#: part/models.py:1202 part/serializers.py:1714 part/serializers.py:1725 +#: part/models.py:1202 part/serializers.py:1686 part/serializers.py:1697 #: stock/api.py:639 msgid "Assembly" msgstr "" @@ -689,16 +689,16 @@ msgstr "" msgid "Consumed" msgstr "" -#: build/api.py:499 company/models.py:912 company/serializers.py:440 +#: build/api.py:499 company/models.py:912 company/serializers.py:474 #: templates/email/build_order_required_stock.html:19 #: templates/email/low_stock_notification.html:17 #: templates/email/part_event_notification.html:18 msgid "Available" msgstr "" -#: build/api.py:523 build/serializers.py:1466 company/serializers.py:437 -#: order/serializers.py:1281 part/serializers.py:959 part/serializers.py:1306 -#: part/serializers.py:1761 +#: build/api.py:523 build/serializers.py:1466 company/serializers.py:471 +#: order/serializers.py:1281 part/serializers.py:931 part/serializers.py:1278 +#: part/serializers.py:1733 msgid "On Order" msgstr "" @@ -964,7 +964,7 @@ msgstr "" #: build/models.py:1136 build/models.py:1234 build/serializers.py:285 #: build/serializers.py:335 build/serializers.py:965 build/serializers.py:1739 #: order/models.py:717 order/serializers.py:658 order/serializers.py:844 -#: part/serializers.py:1708 stock/models.py:940 stock/models.py:1430 +#: part/serializers.py:1680 stock/models.py:940 stock/models.py:1430 #: stock/models.py:1878 stock/serializers.py:688 stock/serializers.py:1580 msgid "Quantity must be greater than zero" msgstr "" @@ -1386,20 +1386,20 @@ msgstr "" msgid "BOM Item" msgstr "" -#: build/serializers.py:1467 order/serializers.py:1282 part/serializers.py:1310 -#: part/serializers.py:1765 +#: build/serializers.py:1467 order/serializers.py:1282 part/serializers.py:1282 +#: part/serializers.py:1737 msgid "In Production" msgstr "" -#: build/serializers.py:1469 part/serializers.py:950 part/serializers.py:1314 +#: build/serializers.py:1469 part/serializers.py:922 part/serializers.py:1286 msgid "Scheduled to Build" msgstr "" -#: build/serializers.py:1472 part/serializers.py:987 +#: build/serializers.py:1472 part/serializers.py:959 msgid "External Stock" msgstr "" -#: build/serializers.py:1473 part/serializers.py:1300 part/serializers.py:1808 +#: build/serializers.py:1473 part/serializers.py:1272 part/serializers.py:1780 msgid "Available Stock" msgstr "" @@ -1589,7 +1589,7 @@ msgstr "" msgid "Price break quantity" msgstr "" -#: common/models.py:1348 company/serializers.py:564 order/models.py:1842 +#: common/models.py:1348 company/serializers.py:357 order/models.py:1842 #: order/models.py:3043 msgid "Price" msgstr "" @@ -1761,7 +1761,7 @@ msgstr "" msgid "Unit definition" msgstr "" -#: common/models.py:1911 common/models.py:1974 stock/models.py:2967 +#: common/models.py:1911 common/models.py:1974 stock/models.py:2984 #: stock/serializers.py:247 msgid "Attachment" msgstr "" @@ -1840,7 +1840,7 @@ msgstr "" #: common/models.py:2090 common/models.py:2329 company/models.py:622 #: machine/serializers.py:27 -#: report/templates/report/inventree_test_report.html:104 stock/models.py:2959 +#: report/templates/report/inventree_test_report.html:104 stock/models.py:2976 msgid "Value" msgstr "" @@ -2049,7 +2049,7 @@ msgid "Response data from the barcode scan" msgstr "" #: common/models.py:2417 report/templates/report/inventree_test_report.html:103 -#: stock/models.py:2953 +#: stock/models.py:2970 msgid "Result" msgstr "" @@ -2142,7 +2142,7 @@ msgid "Linked thread for this message" msgstr "" #: common/models.py:2656 -msgid "Prioriy" +msgid "Priority" msgstr "" #: common/models.py:2698 @@ -2672,8 +2672,8 @@ msgstr "" msgid "Parts can be assembled from other components by default" msgstr "" -#: common/setting/system.py:462 part/models.py:1208 part/serializers.py:1734 -#: part/serializers.py:1741 +#: common/setting/system.py:462 part/models.py:1208 part/serializers.py:1706 +#: part/serializers.py:1713 msgid "Component" msgstr "" @@ -3773,7 +3773,7 @@ msgstr "" msgid "Supplier is Active" msgstr "" -#: company/api.py:307 company/models.py:520 company/serializers.py:457 +#: company/api.py:307 company/models.py:520 company/serializers.py:503 #: part/serializers.py:566 msgid "Manufacturer" msgstr "" @@ -3965,7 +3965,7 @@ msgid "Link to address information (external)" msgstr "" #: company/models.py:492 company/models.py:609 company/models.py:832 -#: company/serializers.py:471 stock/api.py:561 +#: company/serializers.py:517 stock/api.py:561 msgid "Manufacturer Part" msgstr "" @@ -3982,7 +3982,7 @@ msgstr "" msgid "Select manufacturer" msgstr "" -#: company/models.py:527 company/serializers.py:479 order/serializers.py:734 +#: company/models.py:527 company/serializers.py:525 order/serializers.py:734 #: part/serializers.py:576 msgid "MPN" msgstr "" @@ -4031,7 +4031,7 @@ msgstr "" msgid "Linked manufacturer part must reference the same base part" msgstr "" -#: company/models.py:810 company/serializers.py:449 company/serializers.py:467 +#: company/models.py:810 company/serializers.py:495 company/serializers.py:513 #: order/models.py:639 part/serializers.py:550 #: plugin/builtin/suppliers/digikey.py:26 plugin/builtin/suppliers/lcsc.py:27 #: plugin/builtin/suppliers/mouser.py:25 plugin/builtin/suppliers/tme.py:27 @@ -4135,10 +4135,14 @@ msgstr "" msgid "Company Name" msgstr "" -#: company/serializers.py:433 part/serializers.py:955 stock/serializers.py:428 +#: company/serializers.py:467 part/serializers.py:927 stock/serializers.py:428 msgid "In Stock" msgstr "" +#: company/serializers.py:484 +msgid "Price Breaks" +msgstr "" + #: data_exporter/mixins.py:325 data_exporter/mixins.py:403 msgid "Error occurred during data export" msgstr "" @@ -4291,7 +4295,7 @@ msgstr "" msgid "Errors" msgstr "" -#: importer/models.py:550 part/serializers.py:1268 +#: importer/models.py:550 part/serializers.py:1240 msgid "Valid" msgstr "" @@ -5678,7 +5682,7 @@ msgstr "" msgid "Part category" msgstr "" -#: part/models.py:1088 part/serializers.py:929 +#: part/models.py:1088 part/serializers.py:901 #: report/templates/report/inventree_stock_location_report.html:103 msgid "IPN" msgstr "" @@ -5719,7 +5723,7 @@ msgstr "" msgid "Expiry time (in days) for stock items of this part" msgstr "" -#: part/models.py:1186 part/serializers.py:1003 +#: part/models.py:1186 part/serializers.py:975 msgid "Minimum Stock" msgstr "" @@ -6419,203 +6423,203 @@ msgstr "" msgid "Supplier part matching this SKU already exists" msgstr "" -#: part/serializers.py:914 +#: part/serializers.py:886 msgid "Category Name" msgstr "" -#: part/serializers.py:943 +#: part/serializers.py:915 msgid "Building" msgstr "" -#: part/serializers.py:944 +#: part/serializers.py:916 msgid "Quantity of this part currently being in production" msgstr "" -#: part/serializers.py:951 +#: part/serializers.py:923 msgid "Outstanding quantity of this part scheduled to be built" msgstr "" -#: part/serializers.py:971 stock/serializers.py:1019 stock/serializers.py:1189 +#: part/serializers.py:943 stock/serializers.py:1019 stock/serializers.py:1189 #: users/ruleset.py:30 msgid "Stock Items" msgstr "" -#: part/serializers.py:975 +#: part/serializers.py:947 msgid "Revisions" msgstr "" -#: part/serializers.py:979 +#: part/serializers.py:951 msgid "Suppliers" msgstr "" -#: part/serializers.py:983 part/serializers.py:1297 +#: part/serializers.py:955 part/serializers.py:1269 #: templates/email/low_stock_notification.html:16 #: templates/email/part_event_notification.html:17 msgid "Total Stock" msgstr "" -#: part/serializers.py:991 +#: part/serializers.py:963 msgid "Unallocated Stock" msgstr "" -#: part/serializers.py:999 +#: part/serializers.py:971 msgid "Variant Stock" msgstr "" -#: part/serializers.py:1054 +#: part/serializers.py:1026 msgid "Duplicate Part" msgstr "" -#: part/serializers.py:1055 +#: part/serializers.py:1027 msgid "Copy initial data from another Part" msgstr "" -#: part/serializers.py:1061 +#: part/serializers.py:1033 msgid "Initial Stock" msgstr "" -#: part/serializers.py:1062 +#: part/serializers.py:1034 msgid "Create Part with initial stock quantity" msgstr "" -#: part/serializers.py:1068 +#: part/serializers.py:1040 msgid "Supplier Information" msgstr "" -#: part/serializers.py:1069 +#: part/serializers.py:1041 msgid "Add initial supplier information for this part" msgstr "" -#: part/serializers.py:1077 +#: part/serializers.py:1049 msgid "Copy Category Parameters" msgstr "" -#: part/serializers.py:1078 +#: part/serializers.py:1050 msgid "Copy parameter templates from selected part category" msgstr "" -#: part/serializers.py:1083 +#: part/serializers.py:1055 msgid "Existing Image" msgstr "" -#: part/serializers.py:1084 +#: part/serializers.py:1056 msgid "Filename of an existing part image" msgstr "" -#: part/serializers.py:1101 +#: part/serializers.py:1073 msgid "Image file does not exist" msgstr "" -#: part/serializers.py:1269 +#: part/serializers.py:1241 msgid "Validate entire Bill of Materials" msgstr "" -#: part/serializers.py:1303 part/serializers.py:1769 +#: part/serializers.py:1275 part/serializers.py:1741 msgid "Can Build" msgstr "" -#: part/serializers.py:1320 +#: part/serializers.py:1292 msgid "Required for Build Orders" msgstr "" -#: part/serializers.py:1325 +#: part/serializers.py:1297 msgid "Allocated to Build Orders" msgstr "" -#: part/serializers.py:1332 +#: part/serializers.py:1304 msgid "Required for Sales Orders" msgstr "" -#: part/serializers.py:1336 +#: part/serializers.py:1308 msgid "Allocated to Sales Orders" msgstr "" -#: part/serializers.py:1475 +#: part/serializers.py:1447 msgid "Minimum Price" msgstr "" -#: part/serializers.py:1476 +#: part/serializers.py:1448 msgid "Override calculated value for minimum price" msgstr "" -#: part/serializers.py:1483 +#: part/serializers.py:1455 msgid "Minimum price currency" msgstr "" -#: part/serializers.py:1490 +#: part/serializers.py:1462 msgid "Maximum Price" msgstr "" -#: part/serializers.py:1491 +#: part/serializers.py:1463 msgid "Override calculated value for maximum price" msgstr "" -#: part/serializers.py:1498 +#: part/serializers.py:1470 msgid "Maximum price currency" msgstr "" -#: part/serializers.py:1527 +#: part/serializers.py:1499 msgid "Update" msgstr "" -#: part/serializers.py:1528 +#: part/serializers.py:1500 msgid "Update pricing for this part" msgstr "" -#: part/serializers.py:1551 +#: part/serializers.py:1523 #, python-brace-format msgid "Could not convert from provided currencies to {default_currency}" msgstr "" -#: part/serializers.py:1558 +#: part/serializers.py:1530 msgid "Minimum price must not be greater than maximum price" msgstr "" -#: part/serializers.py:1561 +#: part/serializers.py:1533 msgid "Maximum price must not be less than minimum price" msgstr "" -#: part/serializers.py:1715 +#: part/serializers.py:1687 msgid "Select the parent assembly" msgstr "" -#: part/serializers.py:1735 +#: part/serializers.py:1707 msgid "Select the component part" msgstr "" -#: part/serializers.py:1929 +#: part/serializers.py:1901 msgid "Select part to copy BOM from" msgstr "" -#: part/serializers.py:1937 +#: part/serializers.py:1909 msgid "Remove Existing Data" msgstr "" -#: part/serializers.py:1938 +#: part/serializers.py:1910 msgid "Remove existing BOM items before copying" msgstr "" -#: part/serializers.py:1943 +#: part/serializers.py:1915 msgid "Include Inherited" msgstr "" -#: part/serializers.py:1944 +#: part/serializers.py:1916 msgid "Include BOM items which are inherited from templated parts" msgstr "" -#: part/serializers.py:1949 +#: part/serializers.py:1921 msgid "Skip Invalid Rows" msgstr "" -#: part/serializers.py:1950 +#: part/serializers.py:1922 msgid "Enable this option to skip invalid rows" msgstr "" -#: part/serializers.py:1955 +#: part/serializers.py:1927 msgid "Copy Substitute Parts" msgstr "" -#: part/serializers.py:1956 +#: part/serializers.py:1928 msgid "Copy substitute parts when duplicate BOM items" msgstr "" @@ -8456,115 +8460,119 @@ msgstr "" msgid "Quantity does not match serial numbers" msgstr "" -#: stock/models.py:2012 stock/models.py:2917 +#: stock/models.py:1912 +msgid "Cannot assign stock to structural location" +msgstr "" + +#: stock/models.py:2029 stock/models.py:2934 msgid "Test template does not exist" msgstr "" -#: stock/models.py:2030 +#: stock/models.py:2047 msgid "Stock item has been assigned to a sales order" msgstr "" -#: stock/models.py:2034 +#: stock/models.py:2051 msgid "Stock item is installed in another item" msgstr "" -#: stock/models.py:2037 +#: stock/models.py:2054 msgid "Stock item contains other items" msgstr "" -#: stock/models.py:2040 +#: stock/models.py:2057 msgid "Stock item has been assigned to a customer" msgstr "" -#: stock/models.py:2043 stock/models.py:2226 +#: stock/models.py:2060 stock/models.py:2243 msgid "Stock item is currently in production" msgstr "" -#: stock/models.py:2046 +#: stock/models.py:2063 msgid "Serialized stock cannot be merged" msgstr "" -#: stock/models.py:2053 stock/serializers.py:1462 +#: stock/models.py:2070 stock/serializers.py:1462 msgid "Duplicate stock items" msgstr "" -#: stock/models.py:2057 +#: stock/models.py:2074 msgid "Stock items must refer to the same part" msgstr "" -#: stock/models.py:2065 +#: stock/models.py:2082 msgid "Stock items must refer to the same supplier part" msgstr "" -#: stock/models.py:2070 +#: stock/models.py:2087 msgid "Stock status codes must match" msgstr "" -#: stock/models.py:2349 +#: stock/models.py:2366 msgid "StockItem cannot be moved as it is not in stock" msgstr "" -#: stock/models.py:2818 +#: stock/models.py:2835 msgid "Stock Item Tracking" msgstr "" -#: stock/models.py:2849 +#: stock/models.py:2866 msgid "Entry notes" msgstr "" -#: stock/models.py:2889 +#: stock/models.py:2906 msgid "Stock Item Test Result" msgstr "" -#: stock/models.py:2920 +#: stock/models.py:2937 msgid "Value must be provided for this test" msgstr "" -#: stock/models.py:2924 +#: stock/models.py:2941 msgid "Attachment must be uploaded for this test" msgstr "" -#: stock/models.py:2929 +#: stock/models.py:2946 msgid "Invalid value for this test" msgstr "" -#: stock/models.py:2953 +#: stock/models.py:2970 msgid "Test result" msgstr "" -#: stock/models.py:2960 +#: stock/models.py:2977 msgid "Test output value" msgstr "" -#: stock/models.py:2968 stock/serializers.py:248 +#: stock/models.py:2985 stock/serializers.py:248 msgid "Test result attachment" msgstr "" -#: stock/models.py:2972 +#: stock/models.py:2989 msgid "Test notes" msgstr "" -#: stock/models.py:2980 +#: stock/models.py:2997 msgid "Test station" msgstr "" -#: stock/models.py:2981 +#: stock/models.py:2998 msgid "The identifier of the test station where the test was performed" msgstr "" -#: stock/models.py:2987 +#: stock/models.py:3004 msgid "Started" msgstr "" -#: stock/models.py:2988 +#: stock/models.py:3005 msgid "The timestamp of the test start" msgstr "" -#: stock/models.py:2994 +#: stock/models.py:3011 msgid "Finished" msgstr "" -#: stock/models.py:2995 +#: stock/models.py:3012 msgid "The timestamp of the test finish" msgstr "" @@ -8903,83 +8911,87 @@ msgstr "" msgid "Stock manually removed" msgstr "" -#: stock/status_codes.py:57 +#: stock/status_codes.py:56 +msgid "Serialized stock items" +msgstr "" + +#: stock/status_codes.py:58 msgid "Returned to stock" msgstr "" -#: stock/status_codes.py:60 +#: stock/status_codes.py:61 msgid "Location changed" msgstr "" -#: stock/status_codes.py:61 +#: stock/status_codes.py:62 msgid "Stock updated" msgstr "" -#: stock/status_codes.py:64 +#: stock/status_codes.py:65 msgid "Installed into assembly" msgstr "" -#: stock/status_codes.py:65 +#: stock/status_codes.py:66 msgid "Removed from assembly" msgstr "" -#: stock/status_codes.py:67 +#: stock/status_codes.py:68 msgid "Installed component item" msgstr "" -#: stock/status_codes.py:68 +#: stock/status_codes.py:69 msgid "Removed component item" msgstr "" -#: stock/status_codes.py:71 +#: stock/status_codes.py:72 msgid "Split from parent item" msgstr "" -#: stock/status_codes.py:72 +#: stock/status_codes.py:73 msgid "Split child item" msgstr "" -#: stock/status_codes.py:75 +#: stock/status_codes.py:76 msgid "Merged stock items" msgstr "" -#: stock/status_codes.py:78 +#: stock/status_codes.py:79 msgid "Converted to variant" msgstr "" -#: stock/status_codes.py:81 +#: stock/status_codes.py:82 msgid "Build order output created" msgstr "" -#: stock/status_codes.py:82 +#: stock/status_codes.py:83 msgid "Build order output completed" msgstr "" -#: stock/status_codes.py:83 +#: stock/status_codes.py:84 msgid "Build order output rejected" msgstr "" -#: stock/status_codes.py:84 +#: stock/status_codes.py:85 msgid "Consumed by build order" msgstr "" -#: stock/status_codes.py:87 +#: stock/status_codes.py:88 msgid "Shipped against Sales Order" msgstr "" -#: stock/status_codes.py:90 +#: stock/status_codes.py:91 msgid "Received against Purchase Order" msgstr "" -#: stock/status_codes.py:93 +#: stock/status_codes.py:94 msgid "Returned against Return Order" msgstr "" -#: stock/status_codes.py:96 +#: stock/status_codes.py:97 msgid "Sent to customer" msgstr "" -#: stock/status_codes.py:97 +#: stock/status_codes.py:98 msgid "Returned from customer" msgstr "" diff --git a/src/backend/InvenTree/locale/es/LC_MESSAGES/django.po b/src/backend/InvenTree/locale/es/LC_MESSAGES/django.po index 9f5ee05ca1..c04bcb9a74 100644 --- a/src/backend/InvenTree/locale/es/LC_MESSAGES/django.po +++ b/src/backend/InvenTree/locale/es/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: inventree\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-11-19 04:55+0000\n" -"PO-Revision-Date: 2025-11-19 04:59\n" +"POT-Creation-Date: 2025-11-24 06:50+0000\n" +"PO-Revision-Date: 2025-11-24 06:54\n" "Last-Translator: \n" "Language-Team: Spanish\n" "Language: es_ES\n" @@ -81,21 +81,21 @@ msgstr "La dirección de correo electrónico principal proporcionada no es váli msgid "The provided email domain is not approved." msgstr "El dominio de correo electrónico proporcionado no está aprobado." -#: InvenTree/conversion.py:166 +#: InvenTree/conversion.py:240 #, python-brace-format msgid "Invalid unit provided ({unit})" msgstr "Unidad proporcionada no válida ({unit})" -#: InvenTree/conversion.py:183 +#: InvenTree/conversion.py:257 msgid "No value provided" msgstr "Ningún valor proporcionado" -#: InvenTree/conversion.py:210 +#: InvenTree/conversion.py:284 #, python-brace-format msgid "Could not convert {original} to {unit}" msgstr "No se pudo convertir {original} a {unit}" -#: InvenTree/conversion.py:212 InvenTree/conversion.py:226 +#: InvenTree/conversion.py:286 InvenTree/conversion.py:300 #: InvenTree/helpers.py:597 order/models.py:720 order/models.py:1015 msgid "Invalid quantity provided" msgstr "Cantidad proporcionada no válida" @@ -116,7 +116,7 @@ msgstr "Número decimal no válido" #: build/serializers.py:580 build/serializers.py:1788 company/models.py:857 #: order/models.py:1780 #: report/templates/report/inventree_build_order_report.html:172 -#: stock/models.py:2848 stock/models.py:2972 stock/serializers.py:717 +#: stock/models.py:2865 stock/models.py:2989 stock/serializers.py:717 #: stock/serializers.py:893 stock/serializers.py:1035 stock/serializers.py:1336 #: stock/serializers.py:1425 stock/serializers.py:1624 msgid "Notes" @@ -345,7 +345,7 @@ msgstr "Debe ser un número válido" msgid "Currency" msgstr "Moneda" -#: InvenTree/serializers.py:298 part/serializers.py:1385 +#: InvenTree/serializers.py:298 part/serializers.py:1357 msgid "Select currency from available options" msgstr "Seleccionar moneda de las opciones disponibles" @@ -553,14 +553,14 @@ msgstr "Incluye Variantes" #: build/api.py:100 build/api.py:466 build/api.py:845 build/models.py:270 #: build/serializers.py:1225 build/serializers.py:1356 -#: build/serializers.py:1427 company/models.py:1067 company/serializers.py:445 +#: build/serializers.py:1427 company/models.py:1067 company/serializers.py:491 #: order/api.py:298 order/api.py:302 order/api.py:929 order/api.py:1187 #: order/api.py:1190 order/models.py:1941 order/models.py:2108 #: order/models.py:2109 part/api.py:1233 part/api.py:1236 part/api.py:1302 #: part/api.py:1589 part/models.py:472 part/models.py:3296 part/models.py:3439 #: part/models.py:3497 part/models.py:3518 part/models.py:3540 #: part/models.py:3679 part/models.py:4046 part/models.py:4368 -#: part/models.py:4787 part/serializers.py:1928 +#: part/models.py:4787 part/serializers.py:1900 #: report/templates/report/inventree_bill_of_materials_report.html:110 #: report/templates/report/inventree_bill_of_materials_report.html:137 #: report/templates/report/inventree_build_order_report.html:109 @@ -582,7 +582,7 @@ msgstr "Parte" #: build/api.py:120 build/api.py:123 build/serializers.py:1438 part/api.py:980 #: part/api.py:1316 part/api.py:1600 part/models.py:1080 part/models.py:3568 -#: part/models.py:4162 part/serializers.py:1752 stock/api.py:869 +#: part/models.py:4162 part/serializers.py:1724 stock/api.py:869 msgid "Category" msgstr "Categoría" @@ -663,7 +663,7 @@ msgid "Optional" msgstr "Opcional" #: build/api.py:455 build/serializers.py:1415 common/setting/system.py:456 -#: part/models.py:1202 part/serializers.py:1714 part/serializers.py:1725 +#: part/models.py:1202 part/serializers.py:1686 part/serializers.py:1697 #: stock/api.py:639 msgid "Assembly" msgstr "Montaje" @@ -688,16 +688,16 @@ msgstr "Asignadas" msgid "Consumed" msgstr "Agotado" -#: build/api.py:499 company/models.py:912 company/serializers.py:440 +#: build/api.py:499 company/models.py:912 company/serializers.py:474 #: templates/email/build_order_required_stock.html:19 #: templates/email/low_stock_notification.html:17 #: templates/email/part_event_notification.html:18 msgid "Available" msgstr "Disponible" -#: build/api.py:523 build/serializers.py:1466 company/serializers.py:437 -#: order/serializers.py:1281 part/serializers.py:959 part/serializers.py:1306 -#: part/serializers.py:1761 +#: build/api.py:523 build/serializers.py:1466 company/serializers.py:471 +#: order/serializers.py:1281 part/serializers.py:931 part/serializers.py:1278 +#: part/serializers.py:1733 msgid "On Order" msgstr "En pedido" @@ -963,7 +963,7 @@ msgstr "La salida de la construcción no coincide con el orden de construcción" #: build/models.py:1136 build/models.py:1234 build/serializers.py:285 #: build/serializers.py:335 build/serializers.py:965 build/serializers.py:1739 #: order/models.py:717 order/serializers.py:658 order/serializers.py:844 -#: part/serializers.py:1708 stock/models.py:940 stock/models.py:1430 +#: part/serializers.py:1680 stock/models.py:940 stock/models.py:1430 #: stock/models.py:1878 stock/serializers.py:688 stock/serializers.py:1580 msgid "Quantity must be greater than zero" msgstr "La cantidad debe ser mayor que cero" @@ -1385,20 +1385,20 @@ msgstr "Permitir variantes" msgid "BOM Item" msgstr "Item de Lista de Materiales" -#: build/serializers.py:1467 order/serializers.py:1282 part/serializers.py:1310 -#: part/serializers.py:1765 +#: build/serializers.py:1467 order/serializers.py:1282 part/serializers.py:1282 +#: part/serializers.py:1737 msgid "In Production" msgstr "En producción" -#: build/serializers.py:1469 part/serializers.py:950 part/serializers.py:1314 +#: build/serializers.py:1469 part/serializers.py:922 part/serializers.py:1286 msgid "Scheduled to Build" msgstr "" -#: build/serializers.py:1472 part/serializers.py:987 +#: build/serializers.py:1472 part/serializers.py:959 msgid "External Stock" msgstr "Stock externo" -#: build/serializers.py:1473 part/serializers.py:1300 part/serializers.py:1808 +#: build/serializers.py:1473 part/serializers.py:1272 part/serializers.py:1780 msgid "Available Stock" msgstr "Stock Disponible" @@ -1588,7 +1588,7 @@ msgstr "Usuario" msgid "Price break quantity" msgstr "Cantidad de salto de precio" -#: common/models.py:1348 company/serializers.py:564 order/models.py:1842 +#: common/models.py:1348 company/serializers.py:357 order/models.py:1842 #: order/models.py:3043 msgid "Price" msgstr "Precio" @@ -1760,7 +1760,7 @@ msgstr "Definición" msgid "Unit definition" msgstr "Definición de unidad" -#: common/models.py:1911 common/models.py:1974 stock/models.py:2967 +#: common/models.py:1911 common/models.py:1974 stock/models.py:2984 #: stock/serializers.py:247 msgid "Attachment" msgstr "Archivo adjunto" @@ -1839,7 +1839,7 @@ msgstr "" #: common/models.py:2090 common/models.py:2329 company/models.py:622 #: machine/serializers.py:27 -#: report/templates/report/inventree_test_report.html:104 stock/models.py:2959 +#: report/templates/report/inventree_test_report.html:104 stock/models.py:2976 msgid "Value" msgstr "Valor" @@ -2048,7 +2048,7 @@ msgid "Response data from the barcode scan" msgstr "Respuesta de datos del escaneo de código de barras" #: common/models.py:2417 report/templates/report/inventree_test_report.html:103 -#: stock/models.py:2953 +#: stock/models.py:2970 msgid "Result" msgstr "Resultado" @@ -2141,7 +2141,7 @@ msgid "Linked thread for this message" msgstr "" #: common/models.py:2656 -msgid "Prioriy" +msgid "Priority" msgstr "" #: common/models.py:2698 @@ -2671,8 +2671,8 @@ msgstr "Las partes son plantillas por defecto" msgid "Parts can be assembled from other components by default" msgstr "Las partes pueden ser ensambladas desde otros componentes por defecto" -#: common/setting/system.py:462 part/models.py:1208 part/serializers.py:1734 -#: part/serializers.py:1741 +#: common/setting/system.py:462 part/models.py:1208 part/serializers.py:1706 +#: part/serializers.py:1713 msgid "Component" msgstr "Componente" @@ -3772,7 +3772,7 @@ msgstr "" msgid "Supplier is Active" msgstr "" -#: company/api.py:307 company/models.py:520 company/serializers.py:457 +#: company/api.py:307 company/models.py:520 company/serializers.py:503 #: part/serializers.py:566 msgid "Manufacturer" msgstr "Fabricante" @@ -3964,7 +3964,7 @@ msgid "Link to address information (external)" msgstr "Enlace a información de dirección (externa)" #: company/models.py:492 company/models.py:609 company/models.py:832 -#: company/serializers.py:471 stock/api.py:561 +#: company/serializers.py:517 stock/api.py:561 msgid "Manufacturer Part" msgstr "Parte del fabricante" @@ -3981,7 +3981,7 @@ msgstr "Seleccionar parte" msgid "Select manufacturer" msgstr "Seleccionar fabricante" -#: company/models.py:527 company/serializers.py:479 order/serializers.py:734 +#: company/models.py:527 company/serializers.py:525 order/serializers.py:734 #: part/serializers.py:576 msgid "MPN" msgstr "" @@ -4030,7 +4030,7 @@ msgstr "Las unidades de paquete deben ser mayor que cero" msgid "Linked manufacturer part must reference the same base part" msgstr "La parte vinculada del fabricante debe hacer referencia a la misma parte base" -#: company/models.py:810 company/serializers.py:449 company/serializers.py:467 +#: company/models.py:810 company/serializers.py:495 company/serializers.py:513 #: order/models.py:639 part/serializers.py:550 #: plugin/builtin/suppliers/digikey.py:26 plugin/builtin/suppliers/lcsc.py:27 #: plugin/builtin/suppliers/mouser.py:25 plugin/builtin/suppliers/tme.py:27 @@ -4134,10 +4134,14 @@ msgstr "Moneda predeterminada utilizada para este proveedor" msgid "Company Name" msgstr "Nombre de la empresa" -#: company/serializers.py:433 part/serializers.py:955 stock/serializers.py:428 +#: company/serializers.py:467 part/serializers.py:927 stock/serializers.py:428 msgid "In Stock" msgstr "En Stock" +#: company/serializers.py:484 +msgid "Price Breaks" +msgstr "" + #: data_exporter/mixins.py:325 data_exporter/mixins.py:403 msgid "Error occurred during data export" msgstr "" @@ -4290,7 +4294,7 @@ msgstr "Datos de la fila original" msgid "Errors" msgstr "Errores" -#: importer/models.py:550 part/serializers.py:1268 +#: importer/models.py:550 part/serializers.py:1240 msgid "Valid" msgstr "Válido" @@ -5677,7 +5681,7 @@ msgstr "Palabras clave para mejorar la visibilidad en los resultados de búsqued msgid "Part category" msgstr "Categoría de parte" -#: part/models.py:1088 part/serializers.py:929 +#: part/models.py:1088 part/serializers.py:901 #: report/templates/report/inventree_stock_location_report.html:103 msgid "IPN" msgstr "IPN" @@ -5718,7 +5722,7 @@ msgstr "Expiración por defecto" msgid "Expiry time (in days) for stock items of this part" msgstr "Tiempo de expiración (en días) para los artículos de stock de esta parte" -#: part/models.py:1186 part/serializers.py:1003 +#: part/models.py:1186 part/serializers.py:975 msgid "Minimum Stock" msgstr "Stock mínimo" @@ -6418,203 +6422,203 @@ msgstr "" msgid "Supplier part matching this SKU already exists" msgstr "" -#: part/serializers.py:914 +#: part/serializers.py:886 msgid "Category Name" msgstr "Nombre de categoría" -#: part/serializers.py:943 +#: part/serializers.py:915 msgid "Building" msgstr "En construcción" -#: part/serializers.py:944 +#: part/serializers.py:916 msgid "Quantity of this part currently being in production" msgstr "" -#: part/serializers.py:951 +#: part/serializers.py:923 msgid "Outstanding quantity of this part scheduled to be built" msgstr "" -#: part/serializers.py:971 stock/serializers.py:1019 stock/serializers.py:1189 +#: part/serializers.py:943 stock/serializers.py:1019 stock/serializers.py:1189 #: users/ruleset.py:30 msgid "Stock Items" msgstr "Elementos de stock" -#: part/serializers.py:975 +#: part/serializers.py:947 msgid "Revisions" msgstr "" -#: part/serializers.py:979 +#: part/serializers.py:951 msgid "Suppliers" msgstr "Proveedores" -#: part/serializers.py:983 part/serializers.py:1297 +#: part/serializers.py:955 part/serializers.py:1269 #: templates/email/low_stock_notification.html:16 #: templates/email/part_event_notification.html:17 msgid "Total Stock" msgstr "Inventario Total" -#: part/serializers.py:991 +#: part/serializers.py:963 msgid "Unallocated Stock" msgstr "" -#: part/serializers.py:999 +#: part/serializers.py:971 msgid "Variant Stock" msgstr "" -#: part/serializers.py:1054 +#: part/serializers.py:1026 msgid "Duplicate Part" msgstr "Duplicar Parte" -#: part/serializers.py:1055 +#: part/serializers.py:1027 msgid "Copy initial data from another Part" msgstr "" -#: part/serializers.py:1061 +#: part/serializers.py:1033 msgid "Initial Stock" msgstr "Stock Inicial" -#: part/serializers.py:1062 +#: part/serializers.py:1034 msgid "Create Part with initial stock quantity" msgstr "Crear Parte con cantidad inicial de stock" -#: part/serializers.py:1068 +#: part/serializers.py:1040 msgid "Supplier Information" msgstr "Información del proveedor" -#: part/serializers.py:1069 +#: part/serializers.py:1041 msgid "Add initial supplier information for this part" msgstr "Añadir información inicial del proveedor para esta parte" -#: part/serializers.py:1077 +#: part/serializers.py:1049 msgid "Copy Category Parameters" msgstr "Copiar Parámetros de Categoría" -#: part/serializers.py:1078 +#: part/serializers.py:1050 msgid "Copy parameter templates from selected part category" msgstr "Copiar plantillas de parámetro de la categoría de partes seleccionada" -#: part/serializers.py:1083 +#: part/serializers.py:1055 msgid "Existing Image" msgstr "Imagen Existente" -#: part/serializers.py:1084 +#: part/serializers.py:1056 msgid "Filename of an existing part image" msgstr "" -#: part/serializers.py:1101 +#: part/serializers.py:1073 msgid "Image file does not exist" msgstr "El archivo de imagen no existe" -#: part/serializers.py:1269 +#: part/serializers.py:1241 msgid "Validate entire Bill of Materials" msgstr "Validación de Lista de Materiales" -#: part/serializers.py:1303 part/serializers.py:1769 +#: part/serializers.py:1275 part/serializers.py:1741 msgid "Can Build" msgstr "Puede construir" -#: part/serializers.py:1320 +#: part/serializers.py:1292 msgid "Required for Build Orders" msgstr "" -#: part/serializers.py:1325 +#: part/serializers.py:1297 msgid "Allocated to Build Orders" msgstr "" -#: part/serializers.py:1332 +#: part/serializers.py:1304 msgid "Required for Sales Orders" msgstr "" -#: part/serializers.py:1336 +#: part/serializers.py:1308 msgid "Allocated to Sales Orders" msgstr "" -#: part/serializers.py:1475 +#: part/serializers.py:1447 msgid "Minimum Price" msgstr "Precio mínimo" -#: part/serializers.py:1476 +#: part/serializers.py:1448 msgid "Override calculated value for minimum price" msgstr "Anular el valor calculado para precio mínimo" -#: part/serializers.py:1483 +#: part/serializers.py:1455 msgid "Minimum price currency" msgstr "Precio mínimo de moneda" -#: part/serializers.py:1490 +#: part/serializers.py:1462 msgid "Maximum Price" msgstr "Precio máximo" -#: part/serializers.py:1491 +#: part/serializers.py:1463 msgid "Override calculated value for maximum price" msgstr "" -#: part/serializers.py:1498 +#: part/serializers.py:1470 msgid "Maximum price currency" msgstr "Precio máximo de moneda" -#: part/serializers.py:1527 +#: part/serializers.py:1499 msgid "Update" msgstr "Actualizar" -#: part/serializers.py:1528 +#: part/serializers.py:1500 msgid "Update pricing for this part" msgstr "" -#: part/serializers.py:1551 +#: part/serializers.py:1523 #, python-brace-format msgid "Could not convert from provided currencies to {default_currency}" msgstr "" -#: part/serializers.py:1558 +#: part/serializers.py:1530 msgid "Minimum price must not be greater than maximum price" msgstr "El precio mínimo no debe ser mayor que el precio máximo" -#: part/serializers.py:1561 +#: part/serializers.py:1533 msgid "Maximum price must not be less than minimum price" msgstr "El precio máximo no debe ser inferior al precio mínimo" -#: part/serializers.py:1715 +#: part/serializers.py:1687 msgid "Select the parent assembly" msgstr "" -#: part/serializers.py:1735 +#: part/serializers.py:1707 msgid "Select the component part" msgstr "" -#: part/serializers.py:1929 +#: part/serializers.py:1901 msgid "Select part to copy BOM from" msgstr "Seleccionar parte de la que copiar BOM" -#: part/serializers.py:1937 +#: part/serializers.py:1909 msgid "Remove Existing Data" msgstr "Eliminar Datos Existentes" -#: part/serializers.py:1938 +#: part/serializers.py:1910 msgid "Remove existing BOM items before copying" msgstr "Eliminar artículos BOM existentes antes de copiar" -#: part/serializers.py:1943 +#: part/serializers.py:1915 msgid "Include Inherited" msgstr "Incluye Heredado" -#: part/serializers.py:1944 +#: part/serializers.py:1916 msgid "Include BOM items which are inherited from templated parts" msgstr "Incluye artículos BOM que son heredados de partes con plantillas" -#: part/serializers.py:1949 +#: part/serializers.py:1921 msgid "Skip Invalid Rows" msgstr "Omitir filas no válidas" -#: part/serializers.py:1950 +#: part/serializers.py:1922 msgid "Enable this option to skip invalid rows" msgstr "Activar esta opción para omitir filas inválidas" -#: part/serializers.py:1955 +#: part/serializers.py:1927 msgid "Copy Substitute Parts" msgstr "Copiar partes sustitutas" -#: part/serializers.py:1956 +#: part/serializers.py:1928 msgid "Copy substitute parts when duplicate BOM items" msgstr "" @@ -8455,115 +8459,119 @@ msgstr "Los números de serie deben ser proporcionados como una lista" msgid "Quantity does not match serial numbers" msgstr "La cantidad no coincide con los números de serie" -#: stock/models.py:2012 stock/models.py:2917 +#: stock/models.py:1912 +msgid "Cannot assign stock to structural location" +msgstr "" + +#: stock/models.py:2029 stock/models.py:2934 msgid "Test template does not exist" msgstr "" -#: stock/models.py:2030 +#: stock/models.py:2047 msgid "Stock item has been assigned to a sales order" msgstr "Artículo de stock ha sido asignado a un pedido de venta" -#: stock/models.py:2034 +#: stock/models.py:2051 msgid "Stock item is installed in another item" msgstr "Artículo de stock está instalado en otro artículo" -#: stock/models.py:2037 +#: stock/models.py:2054 msgid "Stock item contains other items" msgstr "Artículo de stock contiene otros artículos" -#: stock/models.py:2040 +#: stock/models.py:2057 msgid "Stock item has been assigned to a customer" msgstr "Artículo de stock ha sido asignado a un cliente" -#: stock/models.py:2043 stock/models.py:2226 +#: stock/models.py:2060 stock/models.py:2243 msgid "Stock item is currently in production" msgstr "El artículo de stock está en producción" -#: stock/models.py:2046 +#: stock/models.py:2063 msgid "Serialized stock cannot be merged" msgstr "Stock serializado no puede ser combinado" -#: stock/models.py:2053 stock/serializers.py:1462 +#: stock/models.py:2070 stock/serializers.py:1462 msgid "Duplicate stock items" msgstr "Artículos de Stock Duplicados" -#: stock/models.py:2057 +#: stock/models.py:2074 msgid "Stock items must refer to the same part" msgstr "Los artículos de stock deben referirse a la misma parte" -#: stock/models.py:2065 +#: stock/models.py:2082 msgid "Stock items must refer to the same supplier part" msgstr "Los artículos de stock deben referirse a la misma parte del proveedor" -#: stock/models.py:2070 +#: stock/models.py:2087 msgid "Stock status codes must match" msgstr "Los códigos de estado del stock deben coincidir" -#: stock/models.py:2349 +#: stock/models.py:2366 msgid "StockItem cannot be moved as it is not in stock" msgstr "Stock no se puede mover porque no está en stock" -#: stock/models.py:2818 +#: stock/models.py:2835 msgid "Stock Item Tracking" msgstr "" -#: stock/models.py:2849 +#: stock/models.py:2866 msgid "Entry notes" msgstr "Notas de entrada" -#: stock/models.py:2889 +#: stock/models.py:2906 msgid "Stock Item Test Result" msgstr "" -#: stock/models.py:2920 +#: stock/models.py:2937 msgid "Value must be provided for this test" msgstr "Debe proporcionarse un valor para esta prueba" -#: stock/models.py:2924 +#: stock/models.py:2941 msgid "Attachment must be uploaded for this test" msgstr "El archivo adjunto debe ser subido para esta prueba" -#: stock/models.py:2929 +#: stock/models.py:2946 msgid "Invalid value for this test" msgstr "" -#: stock/models.py:2953 +#: stock/models.py:2970 msgid "Test result" msgstr "Resultado de la prueba" -#: stock/models.py:2960 +#: stock/models.py:2977 msgid "Test output value" msgstr "Valor de salida de prueba" -#: stock/models.py:2968 stock/serializers.py:248 +#: stock/models.py:2985 stock/serializers.py:248 msgid "Test result attachment" msgstr "Adjunto de resultados de prueba" -#: stock/models.py:2972 +#: stock/models.py:2989 msgid "Test notes" msgstr "Notas de prueba" -#: stock/models.py:2980 +#: stock/models.py:2997 msgid "Test station" msgstr "" -#: stock/models.py:2981 +#: stock/models.py:2998 msgid "The identifier of the test station where the test was performed" msgstr "" -#: stock/models.py:2987 +#: stock/models.py:3004 msgid "Started" msgstr "" -#: stock/models.py:2988 +#: stock/models.py:3005 msgid "The timestamp of the test start" msgstr "" -#: stock/models.py:2994 +#: stock/models.py:3011 msgid "Finished" msgstr "Finalizó" -#: stock/models.py:2995 +#: stock/models.py:3012 msgid "The timestamp of the test finish" msgstr "" @@ -8902,83 +8910,87 @@ msgstr "Stock añadido manualmente" msgid "Stock manually removed" msgstr "Stock eliminado manualmente" -#: stock/status_codes.py:57 +#: stock/status_codes.py:56 +msgid "Serialized stock items" +msgstr "" + +#: stock/status_codes.py:58 msgid "Returned to stock" msgstr "" -#: stock/status_codes.py:60 +#: stock/status_codes.py:61 msgid "Location changed" msgstr "Ubicación cambiada" -#: stock/status_codes.py:61 +#: stock/status_codes.py:62 msgid "Stock updated" msgstr "Existencia actualizada" -#: stock/status_codes.py:64 +#: stock/status_codes.py:65 msgid "Installed into assembly" msgstr "Instalado en el ensamblaje" -#: stock/status_codes.py:65 +#: stock/status_codes.py:66 msgid "Removed from assembly" msgstr "Retirado del ensamblaje" -#: stock/status_codes.py:67 +#: stock/status_codes.py:68 msgid "Installed component item" msgstr "Artículo del componente instalado" -#: stock/status_codes.py:68 +#: stock/status_codes.py:69 msgid "Removed component item" msgstr "Elemento de componente eliminado" -#: stock/status_codes.py:71 +#: stock/status_codes.py:72 msgid "Split from parent item" msgstr "Separar del artículo principal" -#: stock/status_codes.py:72 +#: stock/status_codes.py:73 msgid "Split child item" msgstr "Dividir artículo secundario" -#: stock/status_codes.py:75 +#: stock/status_codes.py:76 msgid "Merged stock items" msgstr "Artículos de stock combinados" -#: stock/status_codes.py:78 +#: stock/status_codes.py:79 msgid "Converted to variant" msgstr "Convertir a variante" -#: stock/status_codes.py:81 +#: stock/status_codes.py:82 msgid "Build order output created" msgstr "Trabajo de ensamblaje creado" -#: stock/status_codes.py:82 +#: stock/status_codes.py:83 msgid "Build order output completed" msgstr "Construir orden de salida completado" -#: stock/status_codes.py:83 +#: stock/status_codes.py:84 msgid "Build order output rejected" msgstr "Orden de ensamble rechazada" -#: stock/status_codes.py:84 +#: stock/status_codes.py:85 msgid "Consumed by build order" msgstr "Consumido por orden de construcción" -#: stock/status_codes.py:87 +#: stock/status_codes.py:88 msgid "Shipped against Sales Order" msgstr "Enviado contra orden de venta" -#: stock/status_codes.py:90 +#: stock/status_codes.py:91 msgid "Received against Purchase Order" msgstr "Recibido contra la orden de compra" -#: stock/status_codes.py:93 +#: stock/status_codes.py:94 msgid "Returned against Return Order" msgstr "Devuelto contra orden de devolución" -#: stock/status_codes.py:96 +#: stock/status_codes.py:97 msgid "Sent to customer" msgstr "Enviar al cliente" -#: stock/status_codes.py:97 +#: stock/status_codes.py:98 msgid "Returned from customer" msgstr "Devolución del cliente" diff --git a/src/backend/InvenTree/locale/es_MX/LC_MESSAGES/django.po b/src/backend/InvenTree/locale/es_MX/LC_MESSAGES/django.po index 0356f020a9..9c1816de87 100644 --- a/src/backend/InvenTree/locale/es_MX/LC_MESSAGES/django.po +++ b/src/backend/InvenTree/locale/es_MX/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: inventree\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-11-19 04:55+0000\n" -"PO-Revision-Date: 2025-11-19 04:59\n" +"POT-Creation-Date: 2025-11-24 06:50+0000\n" +"PO-Revision-Date: 2025-11-24 06:54\n" "Last-Translator: \n" "Language-Team: Spanish, Mexico\n" "Language: es_MX\n" @@ -81,21 +81,21 @@ msgstr "La dirección de correo electrónico principal proporcionada no es váli msgid "The provided email domain is not approved." msgstr "El dominio de correo electrónico proporcionado no está aprobado." -#: InvenTree/conversion.py:166 +#: InvenTree/conversion.py:240 #, python-brace-format msgid "Invalid unit provided ({unit})" msgstr "Unidad proporcionada no válida ({unit})" -#: InvenTree/conversion.py:183 +#: InvenTree/conversion.py:257 msgid "No value provided" msgstr "Ningún valor proporcionado" -#: InvenTree/conversion.py:210 +#: InvenTree/conversion.py:284 #, python-brace-format msgid "Could not convert {original} to {unit}" msgstr "No se pudo convertir {original} a {unit}" -#: InvenTree/conversion.py:212 InvenTree/conversion.py:226 +#: InvenTree/conversion.py:286 InvenTree/conversion.py:300 #: InvenTree/helpers.py:597 order/models.py:720 order/models.py:1015 msgid "Invalid quantity provided" msgstr "Cantidad proporcionada no válida" @@ -116,7 +116,7 @@ msgstr "Número decimal inválido" #: build/serializers.py:580 build/serializers.py:1788 company/models.py:857 #: order/models.py:1780 #: report/templates/report/inventree_build_order_report.html:172 -#: stock/models.py:2848 stock/models.py:2972 stock/serializers.py:717 +#: stock/models.py:2865 stock/models.py:2989 stock/serializers.py:717 #: stock/serializers.py:893 stock/serializers.py:1035 stock/serializers.py:1336 #: stock/serializers.py:1425 stock/serializers.py:1624 msgid "Notes" @@ -345,7 +345,7 @@ msgstr "Debe ser un número válido" msgid "Currency" msgstr "Moneda" -#: InvenTree/serializers.py:298 part/serializers.py:1385 +#: InvenTree/serializers.py:298 part/serializers.py:1357 msgid "Select currency from available options" msgstr "Seleccionar moneda de las opciones disponibles" @@ -553,14 +553,14 @@ msgstr "Incluye Variantes" #: build/api.py:100 build/api.py:466 build/api.py:845 build/models.py:270 #: build/serializers.py:1225 build/serializers.py:1356 -#: build/serializers.py:1427 company/models.py:1067 company/serializers.py:445 +#: build/serializers.py:1427 company/models.py:1067 company/serializers.py:491 #: order/api.py:298 order/api.py:302 order/api.py:929 order/api.py:1187 #: order/api.py:1190 order/models.py:1941 order/models.py:2108 #: order/models.py:2109 part/api.py:1233 part/api.py:1236 part/api.py:1302 #: part/api.py:1589 part/models.py:472 part/models.py:3296 part/models.py:3439 #: part/models.py:3497 part/models.py:3518 part/models.py:3540 #: part/models.py:3679 part/models.py:4046 part/models.py:4368 -#: part/models.py:4787 part/serializers.py:1928 +#: part/models.py:4787 part/serializers.py:1900 #: report/templates/report/inventree_bill_of_materials_report.html:110 #: report/templates/report/inventree_bill_of_materials_report.html:137 #: report/templates/report/inventree_build_order_report.html:109 @@ -582,7 +582,7 @@ msgstr "Parte" #: build/api.py:120 build/api.py:123 build/serializers.py:1438 part/api.py:980 #: part/api.py:1316 part/api.py:1600 part/models.py:1080 part/models.py:3568 -#: part/models.py:4162 part/serializers.py:1752 stock/api.py:869 +#: part/models.py:4162 part/serializers.py:1724 stock/api.py:869 msgid "Category" msgstr "Categoría" @@ -663,7 +663,7 @@ msgid "Optional" msgstr "Opcional" #: build/api.py:455 build/serializers.py:1415 common/setting/system.py:456 -#: part/models.py:1202 part/serializers.py:1714 part/serializers.py:1725 +#: part/models.py:1202 part/serializers.py:1686 part/serializers.py:1697 #: stock/api.py:639 msgid "Assembly" msgstr "Montaje" @@ -688,16 +688,16 @@ msgstr "Asignadas" msgid "Consumed" msgstr "" -#: build/api.py:499 company/models.py:912 company/serializers.py:440 +#: build/api.py:499 company/models.py:912 company/serializers.py:474 #: templates/email/build_order_required_stock.html:19 #: templates/email/low_stock_notification.html:17 #: templates/email/part_event_notification.html:18 msgid "Available" msgstr "Disponible" -#: build/api.py:523 build/serializers.py:1466 company/serializers.py:437 -#: order/serializers.py:1281 part/serializers.py:959 part/serializers.py:1306 -#: part/serializers.py:1761 +#: build/api.py:523 build/serializers.py:1466 company/serializers.py:471 +#: order/serializers.py:1281 part/serializers.py:931 part/serializers.py:1278 +#: part/serializers.py:1733 msgid "On Order" msgstr "En pedido" @@ -963,7 +963,7 @@ msgstr "La salida de la construcción no coincide con el orden de construcción" #: build/models.py:1136 build/models.py:1234 build/serializers.py:285 #: build/serializers.py:335 build/serializers.py:965 build/serializers.py:1739 #: order/models.py:717 order/serializers.py:658 order/serializers.py:844 -#: part/serializers.py:1708 stock/models.py:940 stock/models.py:1430 +#: part/serializers.py:1680 stock/models.py:940 stock/models.py:1430 #: stock/models.py:1878 stock/serializers.py:688 stock/serializers.py:1580 msgid "Quantity must be greater than zero" msgstr "La cantidad debe ser mayor que cero" @@ -1385,20 +1385,20 @@ msgstr "Permitir variantes" msgid "BOM Item" msgstr "Item de Lista de Materiales" -#: build/serializers.py:1467 order/serializers.py:1282 part/serializers.py:1310 -#: part/serializers.py:1765 +#: build/serializers.py:1467 order/serializers.py:1282 part/serializers.py:1282 +#: part/serializers.py:1737 msgid "In Production" msgstr "En producción" -#: build/serializers.py:1469 part/serializers.py:950 part/serializers.py:1314 +#: build/serializers.py:1469 part/serializers.py:922 part/serializers.py:1286 msgid "Scheduled to Build" msgstr "" -#: build/serializers.py:1472 part/serializers.py:987 +#: build/serializers.py:1472 part/serializers.py:959 msgid "External Stock" msgstr "Stock externo" -#: build/serializers.py:1473 part/serializers.py:1300 part/serializers.py:1808 +#: build/serializers.py:1473 part/serializers.py:1272 part/serializers.py:1780 msgid "Available Stock" msgstr "Stock Disponible" @@ -1588,7 +1588,7 @@ msgstr "Usuario" msgid "Price break quantity" msgstr "Cantidad de salto de precio" -#: common/models.py:1348 company/serializers.py:564 order/models.py:1842 +#: common/models.py:1348 company/serializers.py:357 order/models.py:1842 #: order/models.py:3043 msgid "Price" msgstr "Precio" @@ -1760,7 +1760,7 @@ msgstr "Definición" msgid "Unit definition" msgstr "Definición de unidad" -#: common/models.py:1911 common/models.py:1974 stock/models.py:2967 +#: common/models.py:1911 common/models.py:1974 stock/models.py:2984 #: stock/serializers.py:247 msgid "Attachment" msgstr "Archivo adjunto" @@ -1839,7 +1839,7 @@ msgstr "Clave lógica del estado que es igual a este estado personalizado en la #: common/models.py:2090 common/models.py:2329 company/models.py:622 #: machine/serializers.py:27 -#: report/templates/report/inventree_test_report.html:104 stock/models.py:2959 +#: report/templates/report/inventree_test_report.html:104 stock/models.py:2976 msgid "Value" msgstr "Valor" @@ -2048,7 +2048,7 @@ msgid "Response data from the barcode scan" msgstr "Respuesta de datos del escaneo de código de barras" #: common/models.py:2417 report/templates/report/inventree_test_report.html:103 -#: stock/models.py:2953 +#: stock/models.py:2970 msgid "Result" msgstr "Resultado" @@ -2141,7 +2141,7 @@ msgid "Linked thread for this message" msgstr "" #: common/models.py:2656 -msgid "Prioriy" +msgid "Priority" msgstr "" #: common/models.py:2698 @@ -2671,8 +2671,8 @@ msgstr "Las partes son plantillas por defecto" msgid "Parts can be assembled from other components by default" msgstr "Las partes pueden ser ensambladas desde otros componentes por defecto" -#: common/setting/system.py:462 part/models.py:1208 part/serializers.py:1734 -#: part/serializers.py:1741 +#: common/setting/system.py:462 part/models.py:1208 part/serializers.py:1706 +#: part/serializers.py:1713 msgid "Component" msgstr "Componente" @@ -3772,7 +3772,7 @@ msgstr "" msgid "Supplier is Active" msgstr "" -#: company/api.py:307 company/models.py:520 company/serializers.py:457 +#: company/api.py:307 company/models.py:520 company/serializers.py:503 #: part/serializers.py:566 msgid "Manufacturer" msgstr "Fabricante" @@ -3964,7 +3964,7 @@ msgid "Link to address information (external)" msgstr "Enlace a información de dirección (externa)" #: company/models.py:492 company/models.py:609 company/models.py:832 -#: company/serializers.py:471 stock/api.py:561 +#: company/serializers.py:517 stock/api.py:561 msgid "Manufacturer Part" msgstr "Parte del fabricante" @@ -3981,7 +3981,7 @@ msgstr "Seleccionar parte" msgid "Select manufacturer" msgstr "Seleccionar fabricante" -#: company/models.py:527 company/serializers.py:479 order/serializers.py:734 +#: company/models.py:527 company/serializers.py:525 order/serializers.py:734 #: part/serializers.py:576 msgid "MPN" msgstr "" @@ -4030,7 +4030,7 @@ msgstr "Las unidades de paquete deben ser mayor que cero" msgid "Linked manufacturer part must reference the same base part" msgstr "La parte vinculada del fabricante debe hacer referencia a la misma parte base" -#: company/models.py:810 company/serializers.py:449 company/serializers.py:467 +#: company/models.py:810 company/serializers.py:495 company/serializers.py:513 #: order/models.py:639 part/serializers.py:550 #: plugin/builtin/suppliers/digikey.py:26 plugin/builtin/suppliers/lcsc.py:27 #: plugin/builtin/suppliers/mouser.py:25 plugin/builtin/suppliers/tme.py:27 @@ -4134,10 +4134,14 @@ msgstr "Moneda predeterminada utilizada para este proveedor" msgid "Company Name" msgstr "Nombre de la empresa" -#: company/serializers.py:433 part/serializers.py:955 stock/serializers.py:428 +#: company/serializers.py:467 part/serializers.py:927 stock/serializers.py:428 msgid "In Stock" msgstr "En Stock" +#: company/serializers.py:484 +msgid "Price Breaks" +msgstr "" + #: data_exporter/mixins.py:325 data_exporter/mixins.py:403 msgid "Error occurred during data export" msgstr "" @@ -4290,7 +4294,7 @@ msgstr "Datos de la fila original" msgid "Errors" msgstr "Errores" -#: importer/models.py:550 part/serializers.py:1268 +#: importer/models.py:550 part/serializers.py:1240 msgid "Valid" msgstr "Válido" @@ -5677,7 +5681,7 @@ msgstr "Palabras clave para mejorar la visibilidad en los resultados de búsqued msgid "Part category" msgstr "Categoría de parte" -#: part/models.py:1088 part/serializers.py:929 +#: part/models.py:1088 part/serializers.py:901 #: report/templates/report/inventree_stock_location_report.html:103 msgid "IPN" msgstr "IPN" @@ -5718,7 +5722,7 @@ msgstr "Expiración por defecto" msgid "Expiry time (in days) for stock items of this part" msgstr "Tiempo de expiración (en días) para los artículos de stock de esta parte" -#: part/models.py:1186 part/serializers.py:1003 +#: part/models.py:1186 part/serializers.py:975 msgid "Minimum Stock" msgstr "Stock mínimo" @@ -6418,203 +6422,203 @@ msgstr "" msgid "Supplier part matching this SKU already exists" msgstr "" -#: part/serializers.py:914 +#: part/serializers.py:886 msgid "Category Name" msgstr "Nombre de categoría" -#: part/serializers.py:943 +#: part/serializers.py:915 msgid "Building" msgstr "En construcción" -#: part/serializers.py:944 +#: part/serializers.py:916 msgid "Quantity of this part currently being in production" msgstr "" -#: part/serializers.py:951 +#: part/serializers.py:923 msgid "Outstanding quantity of this part scheduled to be built" msgstr "" -#: part/serializers.py:971 stock/serializers.py:1019 stock/serializers.py:1189 +#: part/serializers.py:943 stock/serializers.py:1019 stock/serializers.py:1189 #: users/ruleset.py:30 msgid "Stock Items" msgstr "Elementos de stock" -#: part/serializers.py:975 +#: part/serializers.py:947 msgid "Revisions" msgstr "" -#: part/serializers.py:979 +#: part/serializers.py:951 msgid "Suppliers" msgstr "Proveedores" -#: part/serializers.py:983 part/serializers.py:1297 +#: part/serializers.py:955 part/serializers.py:1269 #: templates/email/low_stock_notification.html:16 #: templates/email/part_event_notification.html:17 msgid "Total Stock" msgstr "Inventario Total" -#: part/serializers.py:991 +#: part/serializers.py:963 msgid "Unallocated Stock" msgstr "" -#: part/serializers.py:999 +#: part/serializers.py:971 msgid "Variant Stock" msgstr "" -#: part/serializers.py:1054 +#: part/serializers.py:1026 msgid "Duplicate Part" msgstr "Duplicar Parte" -#: part/serializers.py:1055 +#: part/serializers.py:1027 msgid "Copy initial data from another Part" msgstr "" -#: part/serializers.py:1061 +#: part/serializers.py:1033 msgid "Initial Stock" msgstr "Stock Inicial" -#: part/serializers.py:1062 +#: part/serializers.py:1034 msgid "Create Part with initial stock quantity" msgstr "Crear Parte con cantidad inicial de stock" -#: part/serializers.py:1068 +#: part/serializers.py:1040 msgid "Supplier Information" msgstr "Información del proveedor" -#: part/serializers.py:1069 +#: part/serializers.py:1041 msgid "Add initial supplier information for this part" msgstr "Añadir información inicial del proveedor para esta parte" -#: part/serializers.py:1077 +#: part/serializers.py:1049 msgid "Copy Category Parameters" msgstr "Copiar Parámetros de Categoría" -#: part/serializers.py:1078 +#: part/serializers.py:1050 msgid "Copy parameter templates from selected part category" msgstr "Copiar plantillas de parámetro de la categoría de partes seleccionada" -#: part/serializers.py:1083 +#: part/serializers.py:1055 msgid "Existing Image" msgstr "Imagen Existente" -#: part/serializers.py:1084 +#: part/serializers.py:1056 msgid "Filename of an existing part image" msgstr "" -#: part/serializers.py:1101 +#: part/serializers.py:1073 msgid "Image file does not exist" msgstr "El archivo de imagen no existe" -#: part/serializers.py:1269 +#: part/serializers.py:1241 msgid "Validate entire Bill of Materials" msgstr "Validación de Lista de Materiales" -#: part/serializers.py:1303 part/serializers.py:1769 +#: part/serializers.py:1275 part/serializers.py:1741 msgid "Can Build" msgstr "Puede construir" -#: part/serializers.py:1320 +#: part/serializers.py:1292 msgid "Required for Build Orders" msgstr "" -#: part/serializers.py:1325 +#: part/serializers.py:1297 msgid "Allocated to Build Orders" msgstr "" -#: part/serializers.py:1332 +#: part/serializers.py:1304 msgid "Required for Sales Orders" msgstr "" -#: part/serializers.py:1336 +#: part/serializers.py:1308 msgid "Allocated to Sales Orders" msgstr "" -#: part/serializers.py:1475 +#: part/serializers.py:1447 msgid "Minimum Price" msgstr "Precio mínimo" -#: part/serializers.py:1476 +#: part/serializers.py:1448 msgid "Override calculated value for minimum price" msgstr "Anular el valor calculado para precio mínimo" -#: part/serializers.py:1483 +#: part/serializers.py:1455 msgid "Minimum price currency" msgstr "Precio mínimo de moneda" -#: part/serializers.py:1490 +#: part/serializers.py:1462 msgid "Maximum Price" msgstr "Precio máximo" -#: part/serializers.py:1491 +#: part/serializers.py:1463 msgid "Override calculated value for maximum price" msgstr "" -#: part/serializers.py:1498 +#: part/serializers.py:1470 msgid "Maximum price currency" msgstr "Precio máximo de moneda" -#: part/serializers.py:1527 +#: part/serializers.py:1499 msgid "Update" msgstr "Actualizar" -#: part/serializers.py:1528 +#: part/serializers.py:1500 msgid "Update pricing for this part" msgstr "" -#: part/serializers.py:1551 +#: part/serializers.py:1523 #, python-brace-format msgid "Could not convert from provided currencies to {default_currency}" msgstr "" -#: part/serializers.py:1558 +#: part/serializers.py:1530 msgid "Minimum price must not be greater than maximum price" msgstr "El precio mínimo no debe ser mayor que el precio máximo" -#: part/serializers.py:1561 +#: part/serializers.py:1533 msgid "Maximum price must not be less than minimum price" msgstr "El precio máximo no debe ser inferior al precio mínimo" -#: part/serializers.py:1715 +#: part/serializers.py:1687 msgid "Select the parent assembly" msgstr "" -#: part/serializers.py:1735 +#: part/serializers.py:1707 msgid "Select the component part" msgstr "" -#: part/serializers.py:1929 +#: part/serializers.py:1901 msgid "Select part to copy BOM from" msgstr "Seleccionar parte de la que copiar BOM" -#: part/serializers.py:1937 +#: part/serializers.py:1909 msgid "Remove Existing Data" msgstr "Eliminar Datos Existentes" -#: part/serializers.py:1938 +#: part/serializers.py:1910 msgid "Remove existing BOM items before copying" msgstr "Eliminar artículos BOM existentes antes de copiar" -#: part/serializers.py:1943 +#: part/serializers.py:1915 msgid "Include Inherited" msgstr "Incluye Heredado" -#: part/serializers.py:1944 +#: part/serializers.py:1916 msgid "Include BOM items which are inherited from templated parts" msgstr "Incluye artículos BOM que son heredados de partes con plantillas" -#: part/serializers.py:1949 +#: part/serializers.py:1921 msgid "Skip Invalid Rows" msgstr "Omitir filas no válidas" -#: part/serializers.py:1950 +#: part/serializers.py:1922 msgid "Enable this option to skip invalid rows" msgstr "Activar esta opción para omitir filas inválidas" -#: part/serializers.py:1955 +#: part/serializers.py:1927 msgid "Copy Substitute Parts" msgstr "Copiar partes sustitutas" -#: part/serializers.py:1956 +#: part/serializers.py:1928 msgid "Copy substitute parts when duplicate BOM items" msgstr "" @@ -8455,115 +8459,119 @@ msgstr "Los números de serie deben ser proporcionados como una lista" msgid "Quantity does not match serial numbers" msgstr "La cantidad no coincide con los números de serie" -#: stock/models.py:2012 stock/models.py:2917 +#: stock/models.py:1912 +msgid "Cannot assign stock to structural location" +msgstr "" + +#: stock/models.py:2029 stock/models.py:2934 msgid "Test template does not exist" msgstr "" -#: stock/models.py:2030 +#: stock/models.py:2047 msgid "Stock item has been assigned to a sales order" msgstr "Artículo de stock ha sido asignado a un pedido de venta" -#: stock/models.py:2034 +#: stock/models.py:2051 msgid "Stock item is installed in another item" msgstr "Artículo de stock está instalado en otro artículo" -#: stock/models.py:2037 +#: stock/models.py:2054 msgid "Stock item contains other items" msgstr "Artículo de stock contiene otros artículos" -#: stock/models.py:2040 +#: stock/models.py:2057 msgid "Stock item has been assigned to a customer" msgstr "Artículo de stock ha sido asignado a un cliente" -#: stock/models.py:2043 stock/models.py:2226 +#: stock/models.py:2060 stock/models.py:2243 msgid "Stock item is currently in production" msgstr "El artículo de stock está en producción" -#: stock/models.py:2046 +#: stock/models.py:2063 msgid "Serialized stock cannot be merged" msgstr "Stock serializado no puede ser combinado" -#: stock/models.py:2053 stock/serializers.py:1462 +#: stock/models.py:2070 stock/serializers.py:1462 msgid "Duplicate stock items" msgstr "Artículos de Stock Duplicados" -#: stock/models.py:2057 +#: stock/models.py:2074 msgid "Stock items must refer to the same part" msgstr "Los artículos de stock deben referirse a la misma parte" -#: stock/models.py:2065 +#: stock/models.py:2082 msgid "Stock items must refer to the same supplier part" msgstr "Los artículos de stock deben referirse a la misma parte del proveedor" -#: stock/models.py:2070 +#: stock/models.py:2087 msgid "Stock status codes must match" msgstr "Los códigos de estado del stock deben coincidir" -#: stock/models.py:2349 +#: stock/models.py:2366 msgid "StockItem cannot be moved as it is not in stock" msgstr "Stock no se puede mover porque no está en stock" -#: stock/models.py:2818 +#: stock/models.py:2835 msgid "Stock Item Tracking" msgstr "" -#: stock/models.py:2849 +#: stock/models.py:2866 msgid "Entry notes" msgstr "Notas de entrada" -#: stock/models.py:2889 +#: stock/models.py:2906 msgid "Stock Item Test Result" msgstr "" -#: stock/models.py:2920 +#: stock/models.py:2937 msgid "Value must be provided for this test" msgstr "Debe proporcionarse un valor para esta prueba" -#: stock/models.py:2924 +#: stock/models.py:2941 msgid "Attachment must be uploaded for this test" msgstr "El archivo adjunto debe ser subido para esta prueba" -#: stock/models.py:2929 +#: stock/models.py:2946 msgid "Invalid value for this test" msgstr "" -#: stock/models.py:2953 +#: stock/models.py:2970 msgid "Test result" msgstr "Resultado de la prueba" -#: stock/models.py:2960 +#: stock/models.py:2977 msgid "Test output value" msgstr "Valor de salida de prueba" -#: stock/models.py:2968 stock/serializers.py:248 +#: stock/models.py:2985 stock/serializers.py:248 msgid "Test result attachment" msgstr "Adjunto de resultados de prueba" -#: stock/models.py:2972 +#: stock/models.py:2989 msgid "Test notes" msgstr "Notas de prueba" -#: stock/models.py:2980 +#: stock/models.py:2997 msgid "Test station" msgstr "" -#: stock/models.py:2981 +#: stock/models.py:2998 msgid "The identifier of the test station where the test was performed" msgstr "" -#: stock/models.py:2987 +#: stock/models.py:3004 msgid "Started" msgstr "" -#: stock/models.py:2988 +#: stock/models.py:3005 msgid "The timestamp of the test start" msgstr "" -#: stock/models.py:2994 +#: stock/models.py:3011 msgid "Finished" msgstr "Finalizó" -#: stock/models.py:2995 +#: stock/models.py:3012 msgid "The timestamp of the test finish" msgstr "" @@ -8902,83 +8910,87 @@ msgstr "Stock añadido manualmente" msgid "Stock manually removed" msgstr "Stock eliminado manualmente" -#: stock/status_codes.py:57 +#: stock/status_codes.py:56 +msgid "Serialized stock items" +msgstr "" + +#: stock/status_codes.py:58 msgid "Returned to stock" msgstr "" -#: stock/status_codes.py:60 +#: stock/status_codes.py:61 msgid "Location changed" msgstr "Ubicación cambiada" -#: stock/status_codes.py:61 +#: stock/status_codes.py:62 msgid "Stock updated" msgstr "Existencia actualizada" -#: stock/status_codes.py:64 +#: stock/status_codes.py:65 msgid "Installed into assembly" msgstr "Instalado en el ensamblaje" -#: stock/status_codes.py:65 +#: stock/status_codes.py:66 msgid "Removed from assembly" msgstr "Retirado del ensamblaje" -#: stock/status_codes.py:67 +#: stock/status_codes.py:68 msgid "Installed component item" msgstr "Artículo del componente instalado" -#: stock/status_codes.py:68 +#: stock/status_codes.py:69 msgid "Removed component item" msgstr "Elemento de componente eliminado" -#: stock/status_codes.py:71 +#: stock/status_codes.py:72 msgid "Split from parent item" msgstr "Separar del artículo principal" -#: stock/status_codes.py:72 +#: stock/status_codes.py:73 msgid "Split child item" msgstr "Dividir artículo secundario" -#: stock/status_codes.py:75 +#: stock/status_codes.py:76 msgid "Merged stock items" msgstr "Artículos de stock combinados" -#: stock/status_codes.py:78 +#: stock/status_codes.py:79 msgid "Converted to variant" msgstr "Convertir a variante" -#: stock/status_codes.py:81 +#: stock/status_codes.py:82 msgid "Build order output created" msgstr "Trabajo de ensamblaje creado" -#: stock/status_codes.py:82 +#: stock/status_codes.py:83 msgid "Build order output completed" msgstr "Construir orden de salida completado" -#: stock/status_codes.py:83 +#: stock/status_codes.py:84 msgid "Build order output rejected" msgstr "Orden de ensamble rechazada" -#: stock/status_codes.py:84 +#: stock/status_codes.py:85 msgid "Consumed by build order" msgstr "Consumido por orden de construcción" -#: stock/status_codes.py:87 +#: stock/status_codes.py:88 msgid "Shipped against Sales Order" msgstr "Enviado contra orden de venta" -#: stock/status_codes.py:90 +#: stock/status_codes.py:91 msgid "Received against Purchase Order" msgstr "Recibido contra la orden de compra" -#: stock/status_codes.py:93 +#: stock/status_codes.py:94 msgid "Returned against Return Order" msgstr "Devuelto contra orden de devolución" -#: stock/status_codes.py:96 +#: stock/status_codes.py:97 msgid "Sent to customer" msgstr "Enviar al cliente" -#: stock/status_codes.py:97 +#: stock/status_codes.py:98 msgid "Returned from customer" msgstr "Devolución del cliente" diff --git a/src/backend/InvenTree/locale/et/LC_MESSAGES/django.po b/src/backend/InvenTree/locale/et/LC_MESSAGES/django.po index eb634aed55..22d869a7c7 100644 --- a/src/backend/InvenTree/locale/et/LC_MESSAGES/django.po +++ b/src/backend/InvenTree/locale/et/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: inventree\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-11-19 04:55+0000\n" -"PO-Revision-Date: 2025-11-19 04:59\n" +"POT-Creation-Date: 2025-11-24 06:50+0000\n" +"PO-Revision-Date: 2025-11-24 06:54\n" "Last-Translator: \n" "Language-Team: Estonian\n" "Language: et_EE\n" @@ -81,21 +81,21 @@ msgstr "" msgid "The provided email domain is not approved." msgstr "" -#: InvenTree/conversion.py:166 +#: InvenTree/conversion.py:240 #, python-brace-format msgid "Invalid unit provided ({unit})" msgstr "" -#: InvenTree/conversion.py:183 +#: InvenTree/conversion.py:257 msgid "No value provided" msgstr "Ei tohi tühi olla" -#: InvenTree/conversion.py:210 +#: InvenTree/conversion.py:284 #, python-brace-format msgid "Could not convert {original} to {unit}" msgstr "" -#: InvenTree/conversion.py:212 InvenTree/conversion.py:226 +#: InvenTree/conversion.py:286 InvenTree/conversion.py:300 #: InvenTree/helpers.py:597 order/models.py:720 order/models.py:1015 msgid "Invalid quantity provided" msgstr "" @@ -116,7 +116,7 @@ msgstr "" #: build/serializers.py:580 build/serializers.py:1788 company/models.py:857 #: order/models.py:1780 #: report/templates/report/inventree_build_order_report.html:172 -#: stock/models.py:2848 stock/models.py:2972 stock/serializers.py:717 +#: stock/models.py:2865 stock/models.py:2989 stock/serializers.py:717 #: stock/serializers.py:893 stock/serializers.py:1035 stock/serializers.py:1336 #: stock/serializers.py:1425 stock/serializers.py:1624 msgid "Notes" @@ -345,7 +345,7 @@ msgstr "" msgid "Currency" msgstr "Valuuta" -#: InvenTree/serializers.py:298 part/serializers.py:1385 +#: InvenTree/serializers.py:298 part/serializers.py:1357 msgid "Select currency from available options" msgstr "" @@ -553,14 +553,14 @@ msgstr "" #: build/api.py:100 build/api.py:466 build/api.py:845 build/models.py:270 #: build/serializers.py:1225 build/serializers.py:1356 -#: build/serializers.py:1427 company/models.py:1067 company/serializers.py:445 +#: build/serializers.py:1427 company/models.py:1067 company/serializers.py:491 #: order/api.py:298 order/api.py:302 order/api.py:929 order/api.py:1187 #: order/api.py:1190 order/models.py:1941 order/models.py:2108 #: order/models.py:2109 part/api.py:1233 part/api.py:1236 part/api.py:1302 #: part/api.py:1589 part/models.py:472 part/models.py:3296 part/models.py:3439 #: part/models.py:3497 part/models.py:3518 part/models.py:3540 #: part/models.py:3679 part/models.py:4046 part/models.py:4368 -#: part/models.py:4787 part/serializers.py:1928 +#: part/models.py:4787 part/serializers.py:1900 #: report/templates/report/inventree_bill_of_materials_report.html:110 #: report/templates/report/inventree_bill_of_materials_report.html:137 #: report/templates/report/inventree_build_order_report.html:109 @@ -582,7 +582,7 @@ msgstr "Osa" #: build/api.py:120 build/api.py:123 build/serializers.py:1438 part/api.py:980 #: part/api.py:1316 part/api.py:1600 part/models.py:1080 part/models.py:3568 -#: part/models.py:4162 part/serializers.py:1752 stock/api.py:869 +#: part/models.py:4162 part/serializers.py:1724 stock/api.py:869 msgid "Category" msgstr "" @@ -663,7 +663,7 @@ msgid "Optional" msgstr "Valikuline" #: build/api.py:455 build/serializers.py:1415 common/setting/system.py:456 -#: part/models.py:1202 part/serializers.py:1714 part/serializers.py:1725 +#: part/models.py:1202 part/serializers.py:1686 part/serializers.py:1697 #: stock/api.py:639 msgid "Assembly" msgstr "" @@ -688,16 +688,16 @@ msgstr "" msgid "Consumed" msgstr "" -#: build/api.py:499 company/models.py:912 company/serializers.py:440 +#: build/api.py:499 company/models.py:912 company/serializers.py:474 #: templates/email/build_order_required_stock.html:19 #: templates/email/low_stock_notification.html:17 #: templates/email/part_event_notification.html:18 msgid "Available" msgstr "Saadaval" -#: build/api.py:523 build/serializers.py:1466 company/serializers.py:437 -#: order/serializers.py:1281 part/serializers.py:959 part/serializers.py:1306 -#: part/serializers.py:1761 +#: build/api.py:523 build/serializers.py:1466 company/serializers.py:471 +#: order/serializers.py:1281 part/serializers.py:931 part/serializers.py:1278 +#: part/serializers.py:1733 msgid "On Order" msgstr "" @@ -963,7 +963,7 @@ msgstr "" #: build/models.py:1136 build/models.py:1234 build/serializers.py:285 #: build/serializers.py:335 build/serializers.py:965 build/serializers.py:1739 #: order/models.py:717 order/serializers.py:658 order/serializers.py:844 -#: part/serializers.py:1708 stock/models.py:940 stock/models.py:1430 +#: part/serializers.py:1680 stock/models.py:940 stock/models.py:1430 #: stock/models.py:1878 stock/serializers.py:688 stock/serializers.py:1580 msgid "Quantity must be greater than zero" msgstr "" @@ -1385,20 +1385,20 @@ msgstr "" msgid "BOM Item" msgstr "" -#: build/serializers.py:1467 order/serializers.py:1282 part/serializers.py:1310 -#: part/serializers.py:1765 +#: build/serializers.py:1467 order/serializers.py:1282 part/serializers.py:1282 +#: part/serializers.py:1737 msgid "In Production" msgstr "" -#: build/serializers.py:1469 part/serializers.py:950 part/serializers.py:1314 +#: build/serializers.py:1469 part/serializers.py:922 part/serializers.py:1286 msgid "Scheduled to Build" msgstr "" -#: build/serializers.py:1472 part/serializers.py:987 +#: build/serializers.py:1472 part/serializers.py:959 msgid "External Stock" msgstr "" -#: build/serializers.py:1473 part/serializers.py:1300 part/serializers.py:1808 +#: build/serializers.py:1473 part/serializers.py:1272 part/serializers.py:1780 msgid "Available Stock" msgstr "Saadaval laos" @@ -1588,7 +1588,7 @@ msgstr "" msgid "Price break quantity" msgstr "" -#: common/models.py:1348 company/serializers.py:564 order/models.py:1842 +#: common/models.py:1348 company/serializers.py:357 order/models.py:1842 #: order/models.py:3043 msgid "Price" msgstr "" @@ -1760,7 +1760,7 @@ msgstr "Definitsioon" msgid "Unit definition" msgstr "Ühiku definitsioon" -#: common/models.py:1911 common/models.py:1974 stock/models.py:2967 +#: common/models.py:1911 common/models.py:1974 stock/models.py:2984 #: stock/serializers.py:247 msgid "Attachment" msgstr "Manus" @@ -1839,7 +1839,7 @@ msgstr "" #: common/models.py:2090 common/models.py:2329 company/models.py:622 #: machine/serializers.py:27 -#: report/templates/report/inventree_test_report.html:104 stock/models.py:2959 +#: report/templates/report/inventree_test_report.html:104 stock/models.py:2976 msgid "Value" msgstr "" @@ -2048,7 +2048,7 @@ msgid "Response data from the barcode scan" msgstr "" #: common/models.py:2417 report/templates/report/inventree_test_report.html:103 -#: stock/models.py:2953 +#: stock/models.py:2970 msgid "Result" msgstr "Tulemus" @@ -2141,7 +2141,7 @@ msgid "Linked thread for this message" msgstr "" #: common/models.py:2656 -msgid "Prioriy" +msgid "Priority" msgstr "" #: common/models.py:2698 @@ -2671,8 +2671,8 @@ msgstr "" msgid "Parts can be assembled from other components by default" msgstr "" -#: common/setting/system.py:462 part/models.py:1208 part/serializers.py:1734 -#: part/serializers.py:1741 +#: common/setting/system.py:462 part/models.py:1208 part/serializers.py:1706 +#: part/serializers.py:1713 msgid "Component" msgstr "Komponent" @@ -3772,7 +3772,7 @@ msgstr "" msgid "Supplier is Active" msgstr "" -#: company/api.py:307 company/models.py:520 company/serializers.py:457 +#: company/api.py:307 company/models.py:520 company/serializers.py:503 #: part/serializers.py:566 msgid "Manufacturer" msgstr "Tootja" @@ -3964,7 +3964,7 @@ msgid "Link to address information (external)" msgstr "" #: company/models.py:492 company/models.py:609 company/models.py:832 -#: company/serializers.py:471 stock/api.py:561 +#: company/serializers.py:517 stock/api.py:561 msgid "Manufacturer Part" msgstr "" @@ -3981,7 +3981,7 @@ msgstr "" msgid "Select manufacturer" msgstr "" -#: company/models.py:527 company/serializers.py:479 order/serializers.py:734 +#: company/models.py:527 company/serializers.py:525 order/serializers.py:734 #: part/serializers.py:576 msgid "MPN" msgstr "" @@ -4030,7 +4030,7 @@ msgstr "" msgid "Linked manufacturer part must reference the same base part" msgstr "" -#: company/models.py:810 company/serializers.py:449 company/serializers.py:467 +#: company/models.py:810 company/serializers.py:495 company/serializers.py:513 #: order/models.py:639 part/serializers.py:550 #: plugin/builtin/suppliers/digikey.py:26 plugin/builtin/suppliers/lcsc.py:27 #: plugin/builtin/suppliers/mouser.py:25 plugin/builtin/suppliers/tme.py:27 @@ -4134,10 +4134,14 @@ msgstr "" msgid "Company Name" msgstr "" -#: company/serializers.py:433 part/serializers.py:955 stock/serializers.py:428 +#: company/serializers.py:467 part/serializers.py:927 stock/serializers.py:428 msgid "In Stock" msgstr "" +#: company/serializers.py:484 +msgid "Price Breaks" +msgstr "" + #: data_exporter/mixins.py:325 data_exporter/mixins.py:403 msgid "Error occurred during data export" msgstr "" @@ -4290,7 +4294,7 @@ msgstr "" msgid "Errors" msgstr "" -#: importer/models.py:550 part/serializers.py:1268 +#: importer/models.py:550 part/serializers.py:1240 msgid "Valid" msgstr "" @@ -5677,7 +5681,7 @@ msgstr "" msgid "Part category" msgstr "Osa kategooria" -#: part/models.py:1088 part/serializers.py:929 +#: part/models.py:1088 part/serializers.py:901 #: report/templates/report/inventree_stock_location_report.html:103 msgid "IPN" msgstr "" @@ -5718,7 +5722,7 @@ msgstr "" msgid "Expiry time (in days) for stock items of this part" msgstr "" -#: part/models.py:1186 part/serializers.py:1003 +#: part/models.py:1186 part/serializers.py:975 msgid "Minimum Stock" msgstr "Minimaalne laoseis" @@ -6418,203 +6422,203 @@ msgstr "" msgid "Supplier part matching this SKU already exists" msgstr "" -#: part/serializers.py:914 +#: part/serializers.py:886 msgid "Category Name" msgstr "Kategooria nimi" -#: part/serializers.py:943 +#: part/serializers.py:915 msgid "Building" msgstr "Ehitamine" -#: part/serializers.py:944 +#: part/serializers.py:916 msgid "Quantity of this part currently being in production" msgstr "" -#: part/serializers.py:951 +#: part/serializers.py:923 msgid "Outstanding quantity of this part scheduled to be built" msgstr "" -#: part/serializers.py:971 stock/serializers.py:1019 stock/serializers.py:1189 +#: part/serializers.py:943 stock/serializers.py:1019 stock/serializers.py:1189 #: users/ruleset.py:30 msgid "Stock Items" msgstr "" -#: part/serializers.py:975 +#: part/serializers.py:947 msgid "Revisions" msgstr "" -#: part/serializers.py:979 +#: part/serializers.py:951 msgid "Suppliers" msgstr "Tarnijad" -#: part/serializers.py:983 part/serializers.py:1297 +#: part/serializers.py:955 part/serializers.py:1269 #: templates/email/low_stock_notification.html:16 #: templates/email/part_event_notification.html:17 msgid "Total Stock" msgstr "" -#: part/serializers.py:991 +#: part/serializers.py:963 msgid "Unallocated Stock" msgstr "" -#: part/serializers.py:999 +#: part/serializers.py:971 msgid "Variant Stock" msgstr "" -#: part/serializers.py:1054 +#: part/serializers.py:1026 msgid "Duplicate Part" msgstr "" -#: part/serializers.py:1055 +#: part/serializers.py:1027 msgid "Copy initial data from another Part" msgstr "" -#: part/serializers.py:1061 +#: part/serializers.py:1033 msgid "Initial Stock" msgstr "" -#: part/serializers.py:1062 +#: part/serializers.py:1034 msgid "Create Part with initial stock quantity" msgstr "" -#: part/serializers.py:1068 +#: part/serializers.py:1040 msgid "Supplier Information" msgstr "Tarnija info" -#: part/serializers.py:1069 +#: part/serializers.py:1041 msgid "Add initial supplier information for this part" msgstr "" -#: part/serializers.py:1077 +#: part/serializers.py:1049 msgid "Copy Category Parameters" msgstr "" -#: part/serializers.py:1078 +#: part/serializers.py:1050 msgid "Copy parameter templates from selected part category" msgstr "" -#: part/serializers.py:1083 +#: part/serializers.py:1055 msgid "Existing Image" msgstr "" -#: part/serializers.py:1084 +#: part/serializers.py:1056 msgid "Filename of an existing part image" msgstr "" -#: part/serializers.py:1101 +#: part/serializers.py:1073 msgid "Image file does not exist" msgstr "" -#: part/serializers.py:1269 +#: part/serializers.py:1241 msgid "Validate entire Bill of Materials" msgstr "" -#: part/serializers.py:1303 part/serializers.py:1769 +#: part/serializers.py:1275 part/serializers.py:1741 msgid "Can Build" msgstr "" -#: part/serializers.py:1320 +#: part/serializers.py:1292 msgid "Required for Build Orders" msgstr "" -#: part/serializers.py:1325 +#: part/serializers.py:1297 msgid "Allocated to Build Orders" msgstr "" -#: part/serializers.py:1332 +#: part/serializers.py:1304 msgid "Required for Sales Orders" msgstr "" -#: part/serializers.py:1336 +#: part/serializers.py:1308 msgid "Allocated to Sales Orders" msgstr "" -#: part/serializers.py:1475 +#: part/serializers.py:1447 msgid "Minimum Price" msgstr "Minimaalne hind" -#: part/serializers.py:1476 +#: part/serializers.py:1448 msgid "Override calculated value for minimum price" msgstr "" -#: part/serializers.py:1483 +#: part/serializers.py:1455 msgid "Minimum price currency" msgstr "" -#: part/serializers.py:1490 +#: part/serializers.py:1462 msgid "Maximum Price" msgstr "Maksimaalne hind" -#: part/serializers.py:1491 +#: part/serializers.py:1463 msgid "Override calculated value for maximum price" msgstr "" -#: part/serializers.py:1498 +#: part/serializers.py:1470 msgid "Maximum price currency" msgstr "" -#: part/serializers.py:1527 +#: part/serializers.py:1499 msgid "Update" msgstr "Uuenda" -#: part/serializers.py:1528 +#: part/serializers.py:1500 msgid "Update pricing for this part" msgstr "" -#: part/serializers.py:1551 +#: part/serializers.py:1523 #, python-brace-format msgid "Could not convert from provided currencies to {default_currency}" msgstr "" -#: part/serializers.py:1558 +#: part/serializers.py:1530 msgid "Minimum price must not be greater than maximum price" msgstr "" -#: part/serializers.py:1561 +#: part/serializers.py:1533 msgid "Maximum price must not be less than minimum price" msgstr "" -#: part/serializers.py:1715 +#: part/serializers.py:1687 msgid "Select the parent assembly" msgstr "" -#: part/serializers.py:1735 +#: part/serializers.py:1707 msgid "Select the component part" msgstr "" -#: part/serializers.py:1929 +#: part/serializers.py:1901 msgid "Select part to copy BOM from" msgstr "" -#: part/serializers.py:1937 +#: part/serializers.py:1909 msgid "Remove Existing Data" msgstr "" -#: part/serializers.py:1938 +#: part/serializers.py:1910 msgid "Remove existing BOM items before copying" msgstr "" -#: part/serializers.py:1943 +#: part/serializers.py:1915 msgid "Include Inherited" msgstr "" -#: part/serializers.py:1944 +#: part/serializers.py:1916 msgid "Include BOM items which are inherited from templated parts" msgstr "" -#: part/serializers.py:1949 +#: part/serializers.py:1921 msgid "Skip Invalid Rows" msgstr "" -#: part/serializers.py:1950 +#: part/serializers.py:1922 msgid "Enable this option to skip invalid rows" msgstr "" -#: part/serializers.py:1955 +#: part/serializers.py:1927 msgid "Copy Substitute Parts" msgstr "" -#: part/serializers.py:1956 +#: part/serializers.py:1928 msgid "Copy substitute parts when duplicate BOM items" msgstr "" @@ -8455,115 +8459,119 @@ msgstr "" msgid "Quantity does not match serial numbers" msgstr "" -#: stock/models.py:2012 stock/models.py:2917 +#: stock/models.py:1912 +msgid "Cannot assign stock to structural location" +msgstr "" + +#: stock/models.py:2029 stock/models.py:2934 msgid "Test template does not exist" msgstr "" -#: stock/models.py:2030 +#: stock/models.py:2047 msgid "Stock item has been assigned to a sales order" msgstr "" -#: stock/models.py:2034 +#: stock/models.py:2051 msgid "Stock item is installed in another item" msgstr "" -#: stock/models.py:2037 +#: stock/models.py:2054 msgid "Stock item contains other items" msgstr "" -#: stock/models.py:2040 +#: stock/models.py:2057 msgid "Stock item has been assigned to a customer" msgstr "" -#: stock/models.py:2043 stock/models.py:2226 +#: stock/models.py:2060 stock/models.py:2243 msgid "Stock item is currently in production" msgstr "" -#: stock/models.py:2046 +#: stock/models.py:2063 msgid "Serialized stock cannot be merged" msgstr "" -#: stock/models.py:2053 stock/serializers.py:1462 +#: stock/models.py:2070 stock/serializers.py:1462 msgid "Duplicate stock items" msgstr "" -#: stock/models.py:2057 +#: stock/models.py:2074 msgid "Stock items must refer to the same part" msgstr "" -#: stock/models.py:2065 +#: stock/models.py:2082 msgid "Stock items must refer to the same supplier part" msgstr "" -#: stock/models.py:2070 +#: stock/models.py:2087 msgid "Stock status codes must match" msgstr "" -#: stock/models.py:2349 +#: stock/models.py:2366 msgid "StockItem cannot be moved as it is not in stock" msgstr "" -#: stock/models.py:2818 +#: stock/models.py:2835 msgid "Stock Item Tracking" msgstr "" -#: stock/models.py:2849 +#: stock/models.py:2866 msgid "Entry notes" msgstr "" -#: stock/models.py:2889 +#: stock/models.py:2906 msgid "Stock Item Test Result" msgstr "" -#: stock/models.py:2920 +#: stock/models.py:2937 msgid "Value must be provided for this test" msgstr "" -#: stock/models.py:2924 +#: stock/models.py:2941 msgid "Attachment must be uploaded for this test" msgstr "" -#: stock/models.py:2929 +#: stock/models.py:2946 msgid "Invalid value for this test" msgstr "" -#: stock/models.py:2953 +#: stock/models.py:2970 msgid "Test result" msgstr "Testitulemused" -#: stock/models.py:2960 +#: stock/models.py:2977 msgid "Test output value" msgstr "" -#: stock/models.py:2968 stock/serializers.py:248 +#: stock/models.py:2985 stock/serializers.py:248 msgid "Test result attachment" msgstr "" -#: stock/models.py:2972 +#: stock/models.py:2989 msgid "Test notes" msgstr "" -#: stock/models.py:2980 +#: stock/models.py:2997 msgid "Test station" msgstr "" -#: stock/models.py:2981 +#: stock/models.py:2998 msgid "The identifier of the test station where the test was performed" msgstr "" -#: stock/models.py:2987 +#: stock/models.py:3004 msgid "Started" msgstr "" -#: stock/models.py:2988 +#: stock/models.py:3005 msgid "The timestamp of the test start" msgstr "" -#: stock/models.py:2994 +#: stock/models.py:3011 msgid "Finished" msgstr "" -#: stock/models.py:2995 +#: stock/models.py:3012 msgid "The timestamp of the test finish" msgstr "" @@ -8902,83 +8910,87 @@ msgstr "" msgid "Stock manually removed" msgstr "" -#: stock/status_codes.py:57 +#: stock/status_codes.py:56 +msgid "Serialized stock items" +msgstr "" + +#: stock/status_codes.py:58 msgid "Returned to stock" msgstr "" -#: stock/status_codes.py:60 +#: stock/status_codes.py:61 msgid "Location changed" msgstr "" -#: stock/status_codes.py:61 +#: stock/status_codes.py:62 msgid "Stock updated" msgstr "" -#: stock/status_codes.py:64 +#: stock/status_codes.py:65 msgid "Installed into assembly" msgstr "" -#: stock/status_codes.py:65 +#: stock/status_codes.py:66 msgid "Removed from assembly" msgstr "" -#: stock/status_codes.py:67 +#: stock/status_codes.py:68 msgid "Installed component item" msgstr "" -#: stock/status_codes.py:68 +#: stock/status_codes.py:69 msgid "Removed component item" msgstr "" -#: stock/status_codes.py:71 +#: stock/status_codes.py:72 msgid "Split from parent item" msgstr "" -#: stock/status_codes.py:72 +#: stock/status_codes.py:73 msgid "Split child item" msgstr "" -#: stock/status_codes.py:75 +#: stock/status_codes.py:76 msgid "Merged stock items" msgstr "" -#: stock/status_codes.py:78 +#: stock/status_codes.py:79 msgid "Converted to variant" msgstr "" -#: stock/status_codes.py:81 +#: stock/status_codes.py:82 msgid "Build order output created" msgstr "" -#: stock/status_codes.py:82 +#: stock/status_codes.py:83 msgid "Build order output completed" msgstr "" -#: stock/status_codes.py:83 +#: stock/status_codes.py:84 msgid "Build order output rejected" msgstr "" -#: stock/status_codes.py:84 +#: stock/status_codes.py:85 msgid "Consumed by build order" msgstr "" -#: stock/status_codes.py:87 +#: stock/status_codes.py:88 msgid "Shipped against Sales Order" msgstr "" -#: stock/status_codes.py:90 +#: stock/status_codes.py:91 msgid "Received against Purchase Order" msgstr "" -#: stock/status_codes.py:93 +#: stock/status_codes.py:94 msgid "Returned against Return Order" msgstr "" -#: stock/status_codes.py:96 +#: stock/status_codes.py:97 msgid "Sent to customer" msgstr "" -#: stock/status_codes.py:97 +#: stock/status_codes.py:98 msgid "Returned from customer" msgstr "" diff --git a/src/backend/InvenTree/locale/fa/LC_MESSAGES/django.po b/src/backend/InvenTree/locale/fa/LC_MESSAGES/django.po index 970e0aa61b..fd581171e3 100644 --- a/src/backend/InvenTree/locale/fa/LC_MESSAGES/django.po +++ b/src/backend/InvenTree/locale/fa/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: inventree\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-11-19 04:55+0000\n" -"PO-Revision-Date: 2025-11-19 04:59\n" +"POT-Creation-Date: 2025-11-24 06:50+0000\n" +"PO-Revision-Date: 2025-11-24 06:54\n" "Last-Translator: \n" "Language-Team: Persian\n" "Language: fa_IR\n" @@ -81,21 +81,21 @@ msgstr "آدرس ایمیل اصلی ارائه شده معتبر نیست." msgid "The provided email domain is not approved." msgstr "دامنه ایمیل ارائه شده تایید نشده است." -#: InvenTree/conversion.py:166 +#: InvenTree/conversion.py:240 #, python-brace-format msgid "Invalid unit provided ({unit})" msgstr "واحد نامعتبر ارائه شده ({unit})" -#: InvenTree/conversion.py:183 +#: InvenTree/conversion.py:257 msgid "No value provided" msgstr "مقداری افزوده نشده" -#: InvenTree/conversion.py:210 +#: InvenTree/conversion.py:284 #, python-brace-format msgid "Could not convert {original} to {unit}" msgstr "نمی‌توان {original} را به {unit} تبدیل کرد" -#: InvenTree/conversion.py:212 InvenTree/conversion.py:226 +#: InvenTree/conversion.py:286 InvenTree/conversion.py:300 #: InvenTree/helpers.py:597 order/models.py:720 order/models.py:1015 msgid "Invalid quantity provided" msgstr "مقدار ارائه شده نامعتبر است" @@ -116,7 +116,7 @@ msgstr "مقدار اعشاری نامعتبر است" #: build/serializers.py:580 build/serializers.py:1788 company/models.py:857 #: order/models.py:1780 #: report/templates/report/inventree_build_order_report.html:172 -#: stock/models.py:2848 stock/models.py:2972 stock/serializers.py:717 +#: stock/models.py:2865 stock/models.py:2989 stock/serializers.py:717 #: stock/serializers.py:893 stock/serializers.py:1035 stock/serializers.py:1336 #: stock/serializers.py:1425 stock/serializers.py:1624 msgid "Notes" @@ -345,7 +345,7 @@ msgstr "باید یک عدد معتبر باشد" msgid "Currency" msgstr "ارز" -#: InvenTree/serializers.py:298 part/serializers.py:1385 +#: InvenTree/serializers.py:298 part/serializers.py:1357 msgid "Select currency from available options" msgstr "ارز را از گزینه های موجود انتخاب کنید" @@ -553,14 +553,14 @@ msgstr "" #: build/api.py:100 build/api.py:466 build/api.py:845 build/models.py:270 #: build/serializers.py:1225 build/serializers.py:1356 -#: build/serializers.py:1427 company/models.py:1067 company/serializers.py:445 +#: build/serializers.py:1427 company/models.py:1067 company/serializers.py:491 #: order/api.py:298 order/api.py:302 order/api.py:929 order/api.py:1187 #: order/api.py:1190 order/models.py:1941 order/models.py:2108 #: order/models.py:2109 part/api.py:1233 part/api.py:1236 part/api.py:1302 #: part/api.py:1589 part/models.py:472 part/models.py:3296 part/models.py:3439 #: part/models.py:3497 part/models.py:3518 part/models.py:3540 #: part/models.py:3679 part/models.py:4046 part/models.py:4368 -#: part/models.py:4787 part/serializers.py:1928 +#: part/models.py:4787 part/serializers.py:1900 #: report/templates/report/inventree_bill_of_materials_report.html:110 #: report/templates/report/inventree_bill_of_materials_report.html:137 #: report/templates/report/inventree_build_order_report.html:109 @@ -582,7 +582,7 @@ msgstr "قطعه" #: build/api.py:120 build/api.py:123 build/serializers.py:1438 part/api.py:980 #: part/api.py:1316 part/api.py:1600 part/models.py:1080 part/models.py:3568 -#: part/models.py:4162 part/serializers.py:1752 stock/api.py:869 +#: part/models.py:4162 part/serializers.py:1724 stock/api.py:869 msgid "Category" msgstr "دسته" @@ -663,7 +663,7 @@ msgid "Optional" msgstr "اختیاری" #: build/api.py:455 build/serializers.py:1415 common/setting/system.py:456 -#: part/models.py:1202 part/serializers.py:1714 part/serializers.py:1725 +#: part/models.py:1202 part/serializers.py:1686 part/serializers.py:1697 #: stock/api.py:639 msgid "Assembly" msgstr "مونتاژ" @@ -688,16 +688,16 @@ msgstr "اختصاص داده شده" msgid "Consumed" msgstr "" -#: build/api.py:499 company/models.py:912 company/serializers.py:440 +#: build/api.py:499 company/models.py:912 company/serializers.py:474 #: templates/email/build_order_required_stock.html:19 #: templates/email/low_stock_notification.html:17 #: templates/email/part_event_notification.html:18 msgid "Available" msgstr "در دسترس" -#: build/api.py:523 build/serializers.py:1466 company/serializers.py:437 -#: order/serializers.py:1281 part/serializers.py:959 part/serializers.py:1306 -#: part/serializers.py:1761 +#: build/api.py:523 build/serializers.py:1466 company/serializers.py:471 +#: order/serializers.py:1281 part/serializers.py:931 part/serializers.py:1278 +#: part/serializers.py:1733 msgid "On Order" msgstr "" @@ -963,7 +963,7 @@ msgstr "" #: build/models.py:1136 build/models.py:1234 build/serializers.py:285 #: build/serializers.py:335 build/serializers.py:965 build/serializers.py:1739 #: order/models.py:717 order/serializers.py:658 order/serializers.py:844 -#: part/serializers.py:1708 stock/models.py:940 stock/models.py:1430 +#: part/serializers.py:1680 stock/models.py:940 stock/models.py:1430 #: stock/models.py:1878 stock/serializers.py:688 stock/serializers.py:1580 msgid "Quantity must be greater than zero" msgstr "" @@ -1385,20 +1385,20 @@ msgstr "" msgid "BOM Item" msgstr "" -#: build/serializers.py:1467 order/serializers.py:1282 part/serializers.py:1310 -#: part/serializers.py:1765 +#: build/serializers.py:1467 order/serializers.py:1282 part/serializers.py:1282 +#: part/serializers.py:1737 msgid "In Production" msgstr "" -#: build/serializers.py:1469 part/serializers.py:950 part/serializers.py:1314 +#: build/serializers.py:1469 part/serializers.py:922 part/serializers.py:1286 msgid "Scheduled to Build" msgstr "" -#: build/serializers.py:1472 part/serializers.py:987 +#: build/serializers.py:1472 part/serializers.py:959 msgid "External Stock" msgstr "" -#: build/serializers.py:1473 part/serializers.py:1300 part/serializers.py:1808 +#: build/serializers.py:1473 part/serializers.py:1272 part/serializers.py:1780 msgid "Available Stock" msgstr "" @@ -1588,7 +1588,7 @@ msgstr "" msgid "Price break quantity" msgstr "" -#: common/models.py:1348 company/serializers.py:564 order/models.py:1842 +#: common/models.py:1348 company/serializers.py:357 order/models.py:1842 #: order/models.py:3043 msgid "Price" msgstr "" @@ -1760,7 +1760,7 @@ msgstr "" msgid "Unit definition" msgstr "" -#: common/models.py:1911 common/models.py:1974 stock/models.py:2967 +#: common/models.py:1911 common/models.py:1974 stock/models.py:2984 #: stock/serializers.py:247 msgid "Attachment" msgstr "" @@ -1839,7 +1839,7 @@ msgstr "" #: common/models.py:2090 common/models.py:2329 company/models.py:622 #: machine/serializers.py:27 -#: report/templates/report/inventree_test_report.html:104 stock/models.py:2959 +#: report/templates/report/inventree_test_report.html:104 stock/models.py:2976 msgid "Value" msgstr "" @@ -2048,7 +2048,7 @@ msgid "Response data from the barcode scan" msgstr "" #: common/models.py:2417 report/templates/report/inventree_test_report.html:103 -#: stock/models.py:2953 +#: stock/models.py:2970 msgid "Result" msgstr "" @@ -2141,7 +2141,7 @@ msgid "Linked thread for this message" msgstr "" #: common/models.py:2656 -msgid "Prioriy" +msgid "Priority" msgstr "" #: common/models.py:2698 @@ -2671,8 +2671,8 @@ msgstr "" msgid "Parts can be assembled from other components by default" msgstr "" -#: common/setting/system.py:462 part/models.py:1208 part/serializers.py:1734 -#: part/serializers.py:1741 +#: common/setting/system.py:462 part/models.py:1208 part/serializers.py:1706 +#: part/serializers.py:1713 msgid "Component" msgstr "" @@ -3772,7 +3772,7 @@ msgstr "" msgid "Supplier is Active" msgstr "" -#: company/api.py:307 company/models.py:520 company/serializers.py:457 +#: company/api.py:307 company/models.py:520 company/serializers.py:503 #: part/serializers.py:566 msgid "Manufacturer" msgstr "" @@ -3964,7 +3964,7 @@ msgid "Link to address information (external)" msgstr "" #: company/models.py:492 company/models.py:609 company/models.py:832 -#: company/serializers.py:471 stock/api.py:561 +#: company/serializers.py:517 stock/api.py:561 msgid "Manufacturer Part" msgstr "" @@ -3981,7 +3981,7 @@ msgstr "" msgid "Select manufacturer" msgstr "" -#: company/models.py:527 company/serializers.py:479 order/serializers.py:734 +#: company/models.py:527 company/serializers.py:525 order/serializers.py:734 #: part/serializers.py:576 msgid "MPN" msgstr "" @@ -4030,7 +4030,7 @@ msgstr "" msgid "Linked manufacturer part must reference the same base part" msgstr "" -#: company/models.py:810 company/serializers.py:449 company/serializers.py:467 +#: company/models.py:810 company/serializers.py:495 company/serializers.py:513 #: order/models.py:639 part/serializers.py:550 #: plugin/builtin/suppliers/digikey.py:26 plugin/builtin/suppliers/lcsc.py:27 #: plugin/builtin/suppliers/mouser.py:25 plugin/builtin/suppliers/tme.py:27 @@ -4134,10 +4134,14 @@ msgstr "" msgid "Company Name" msgstr "" -#: company/serializers.py:433 part/serializers.py:955 stock/serializers.py:428 +#: company/serializers.py:467 part/serializers.py:927 stock/serializers.py:428 msgid "In Stock" msgstr "" +#: company/serializers.py:484 +msgid "Price Breaks" +msgstr "" + #: data_exporter/mixins.py:325 data_exporter/mixins.py:403 msgid "Error occurred during data export" msgstr "" @@ -4290,7 +4294,7 @@ msgstr "" msgid "Errors" msgstr "" -#: importer/models.py:550 part/serializers.py:1268 +#: importer/models.py:550 part/serializers.py:1240 msgid "Valid" msgstr "" @@ -5677,7 +5681,7 @@ msgstr "" msgid "Part category" msgstr "" -#: part/models.py:1088 part/serializers.py:929 +#: part/models.py:1088 part/serializers.py:901 #: report/templates/report/inventree_stock_location_report.html:103 msgid "IPN" msgstr "" @@ -5718,7 +5722,7 @@ msgstr "" msgid "Expiry time (in days) for stock items of this part" msgstr "" -#: part/models.py:1186 part/serializers.py:1003 +#: part/models.py:1186 part/serializers.py:975 msgid "Minimum Stock" msgstr "" @@ -6418,203 +6422,203 @@ msgstr "" msgid "Supplier part matching this SKU already exists" msgstr "" -#: part/serializers.py:914 +#: part/serializers.py:886 msgid "Category Name" msgstr "" -#: part/serializers.py:943 +#: part/serializers.py:915 msgid "Building" msgstr "" -#: part/serializers.py:944 +#: part/serializers.py:916 msgid "Quantity of this part currently being in production" msgstr "" -#: part/serializers.py:951 +#: part/serializers.py:923 msgid "Outstanding quantity of this part scheduled to be built" msgstr "" -#: part/serializers.py:971 stock/serializers.py:1019 stock/serializers.py:1189 +#: part/serializers.py:943 stock/serializers.py:1019 stock/serializers.py:1189 #: users/ruleset.py:30 msgid "Stock Items" msgstr "" -#: part/serializers.py:975 +#: part/serializers.py:947 msgid "Revisions" msgstr "" -#: part/serializers.py:979 +#: part/serializers.py:951 msgid "Suppliers" msgstr "" -#: part/serializers.py:983 part/serializers.py:1297 +#: part/serializers.py:955 part/serializers.py:1269 #: templates/email/low_stock_notification.html:16 #: templates/email/part_event_notification.html:17 msgid "Total Stock" msgstr "" -#: part/serializers.py:991 +#: part/serializers.py:963 msgid "Unallocated Stock" msgstr "" -#: part/serializers.py:999 +#: part/serializers.py:971 msgid "Variant Stock" msgstr "" -#: part/serializers.py:1054 +#: part/serializers.py:1026 msgid "Duplicate Part" msgstr "" -#: part/serializers.py:1055 +#: part/serializers.py:1027 msgid "Copy initial data from another Part" msgstr "" -#: part/serializers.py:1061 +#: part/serializers.py:1033 msgid "Initial Stock" msgstr "" -#: part/serializers.py:1062 +#: part/serializers.py:1034 msgid "Create Part with initial stock quantity" msgstr "" -#: part/serializers.py:1068 +#: part/serializers.py:1040 msgid "Supplier Information" msgstr "" -#: part/serializers.py:1069 +#: part/serializers.py:1041 msgid "Add initial supplier information for this part" msgstr "" -#: part/serializers.py:1077 +#: part/serializers.py:1049 msgid "Copy Category Parameters" msgstr "" -#: part/serializers.py:1078 +#: part/serializers.py:1050 msgid "Copy parameter templates from selected part category" msgstr "" -#: part/serializers.py:1083 +#: part/serializers.py:1055 msgid "Existing Image" msgstr "" -#: part/serializers.py:1084 +#: part/serializers.py:1056 msgid "Filename of an existing part image" msgstr "" -#: part/serializers.py:1101 +#: part/serializers.py:1073 msgid "Image file does not exist" msgstr "" -#: part/serializers.py:1269 +#: part/serializers.py:1241 msgid "Validate entire Bill of Materials" msgstr "" -#: part/serializers.py:1303 part/serializers.py:1769 +#: part/serializers.py:1275 part/serializers.py:1741 msgid "Can Build" msgstr "" -#: part/serializers.py:1320 +#: part/serializers.py:1292 msgid "Required for Build Orders" msgstr "" -#: part/serializers.py:1325 +#: part/serializers.py:1297 msgid "Allocated to Build Orders" msgstr "" -#: part/serializers.py:1332 +#: part/serializers.py:1304 msgid "Required for Sales Orders" msgstr "" -#: part/serializers.py:1336 +#: part/serializers.py:1308 msgid "Allocated to Sales Orders" msgstr "" -#: part/serializers.py:1475 +#: part/serializers.py:1447 msgid "Minimum Price" msgstr "" -#: part/serializers.py:1476 +#: part/serializers.py:1448 msgid "Override calculated value for minimum price" msgstr "" -#: part/serializers.py:1483 +#: part/serializers.py:1455 msgid "Minimum price currency" msgstr "" -#: part/serializers.py:1490 +#: part/serializers.py:1462 msgid "Maximum Price" msgstr "" -#: part/serializers.py:1491 +#: part/serializers.py:1463 msgid "Override calculated value for maximum price" msgstr "" -#: part/serializers.py:1498 +#: part/serializers.py:1470 msgid "Maximum price currency" msgstr "" -#: part/serializers.py:1527 +#: part/serializers.py:1499 msgid "Update" msgstr "" -#: part/serializers.py:1528 +#: part/serializers.py:1500 msgid "Update pricing for this part" msgstr "" -#: part/serializers.py:1551 +#: part/serializers.py:1523 #, python-brace-format msgid "Could not convert from provided currencies to {default_currency}" msgstr "" -#: part/serializers.py:1558 +#: part/serializers.py:1530 msgid "Minimum price must not be greater than maximum price" msgstr "" -#: part/serializers.py:1561 +#: part/serializers.py:1533 msgid "Maximum price must not be less than minimum price" msgstr "" -#: part/serializers.py:1715 +#: part/serializers.py:1687 msgid "Select the parent assembly" msgstr "" -#: part/serializers.py:1735 +#: part/serializers.py:1707 msgid "Select the component part" msgstr "" -#: part/serializers.py:1929 +#: part/serializers.py:1901 msgid "Select part to copy BOM from" msgstr "" -#: part/serializers.py:1937 +#: part/serializers.py:1909 msgid "Remove Existing Data" msgstr "" -#: part/serializers.py:1938 +#: part/serializers.py:1910 msgid "Remove existing BOM items before copying" msgstr "" -#: part/serializers.py:1943 +#: part/serializers.py:1915 msgid "Include Inherited" msgstr "" -#: part/serializers.py:1944 +#: part/serializers.py:1916 msgid "Include BOM items which are inherited from templated parts" msgstr "" -#: part/serializers.py:1949 +#: part/serializers.py:1921 msgid "Skip Invalid Rows" msgstr "" -#: part/serializers.py:1950 +#: part/serializers.py:1922 msgid "Enable this option to skip invalid rows" msgstr "" -#: part/serializers.py:1955 +#: part/serializers.py:1927 msgid "Copy Substitute Parts" msgstr "" -#: part/serializers.py:1956 +#: part/serializers.py:1928 msgid "Copy substitute parts when duplicate BOM items" msgstr "" @@ -8455,115 +8459,119 @@ msgstr "" msgid "Quantity does not match serial numbers" msgstr "" -#: stock/models.py:2012 stock/models.py:2917 +#: stock/models.py:1912 +msgid "Cannot assign stock to structural location" +msgstr "" + +#: stock/models.py:2029 stock/models.py:2934 msgid "Test template does not exist" msgstr "" -#: stock/models.py:2030 +#: stock/models.py:2047 msgid "Stock item has been assigned to a sales order" msgstr "" -#: stock/models.py:2034 +#: stock/models.py:2051 msgid "Stock item is installed in another item" msgstr "" -#: stock/models.py:2037 +#: stock/models.py:2054 msgid "Stock item contains other items" msgstr "" -#: stock/models.py:2040 +#: stock/models.py:2057 msgid "Stock item has been assigned to a customer" msgstr "" -#: stock/models.py:2043 stock/models.py:2226 +#: stock/models.py:2060 stock/models.py:2243 msgid "Stock item is currently in production" msgstr "" -#: stock/models.py:2046 +#: stock/models.py:2063 msgid "Serialized stock cannot be merged" msgstr "" -#: stock/models.py:2053 stock/serializers.py:1462 +#: stock/models.py:2070 stock/serializers.py:1462 msgid "Duplicate stock items" msgstr "" -#: stock/models.py:2057 +#: stock/models.py:2074 msgid "Stock items must refer to the same part" msgstr "" -#: stock/models.py:2065 +#: stock/models.py:2082 msgid "Stock items must refer to the same supplier part" msgstr "" -#: stock/models.py:2070 +#: stock/models.py:2087 msgid "Stock status codes must match" msgstr "" -#: stock/models.py:2349 +#: stock/models.py:2366 msgid "StockItem cannot be moved as it is not in stock" msgstr "" -#: stock/models.py:2818 +#: stock/models.py:2835 msgid "Stock Item Tracking" msgstr "" -#: stock/models.py:2849 +#: stock/models.py:2866 msgid "Entry notes" msgstr "" -#: stock/models.py:2889 +#: stock/models.py:2906 msgid "Stock Item Test Result" msgstr "" -#: stock/models.py:2920 +#: stock/models.py:2937 msgid "Value must be provided for this test" msgstr "" -#: stock/models.py:2924 +#: stock/models.py:2941 msgid "Attachment must be uploaded for this test" msgstr "" -#: stock/models.py:2929 +#: stock/models.py:2946 msgid "Invalid value for this test" msgstr "" -#: stock/models.py:2953 +#: stock/models.py:2970 msgid "Test result" msgstr "" -#: stock/models.py:2960 +#: stock/models.py:2977 msgid "Test output value" msgstr "" -#: stock/models.py:2968 stock/serializers.py:248 +#: stock/models.py:2985 stock/serializers.py:248 msgid "Test result attachment" msgstr "" -#: stock/models.py:2972 +#: stock/models.py:2989 msgid "Test notes" msgstr "" -#: stock/models.py:2980 +#: stock/models.py:2997 msgid "Test station" msgstr "" -#: stock/models.py:2981 +#: stock/models.py:2998 msgid "The identifier of the test station where the test was performed" msgstr "" -#: stock/models.py:2987 +#: stock/models.py:3004 msgid "Started" msgstr "" -#: stock/models.py:2988 +#: stock/models.py:3005 msgid "The timestamp of the test start" msgstr "" -#: stock/models.py:2994 +#: stock/models.py:3011 msgid "Finished" msgstr "" -#: stock/models.py:2995 +#: stock/models.py:3012 msgid "The timestamp of the test finish" msgstr "" @@ -8902,83 +8910,87 @@ msgstr "" msgid "Stock manually removed" msgstr "" -#: stock/status_codes.py:57 +#: stock/status_codes.py:56 +msgid "Serialized stock items" +msgstr "" + +#: stock/status_codes.py:58 msgid "Returned to stock" msgstr "" -#: stock/status_codes.py:60 +#: stock/status_codes.py:61 msgid "Location changed" msgstr "" -#: stock/status_codes.py:61 +#: stock/status_codes.py:62 msgid "Stock updated" msgstr "" -#: stock/status_codes.py:64 +#: stock/status_codes.py:65 msgid "Installed into assembly" msgstr "" -#: stock/status_codes.py:65 +#: stock/status_codes.py:66 msgid "Removed from assembly" msgstr "" -#: stock/status_codes.py:67 +#: stock/status_codes.py:68 msgid "Installed component item" msgstr "" -#: stock/status_codes.py:68 +#: stock/status_codes.py:69 msgid "Removed component item" msgstr "" -#: stock/status_codes.py:71 +#: stock/status_codes.py:72 msgid "Split from parent item" msgstr "" -#: stock/status_codes.py:72 +#: stock/status_codes.py:73 msgid "Split child item" msgstr "" -#: stock/status_codes.py:75 +#: stock/status_codes.py:76 msgid "Merged stock items" msgstr "" -#: stock/status_codes.py:78 +#: stock/status_codes.py:79 msgid "Converted to variant" msgstr "" -#: stock/status_codes.py:81 +#: stock/status_codes.py:82 msgid "Build order output created" msgstr "" -#: stock/status_codes.py:82 +#: stock/status_codes.py:83 msgid "Build order output completed" msgstr "" -#: stock/status_codes.py:83 +#: stock/status_codes.py:84 msgid "Build order output rejected" msgstr "" -#: stock/status_codes.py:84 +#: stock/status_codes.py:85 msgid "Consumed by build order" msgstr "" -#: stock/status_codes.py:87 +#: stock/status_codes.py:88 msgid "Shipped against Sales Order" msgstr "" -#: stock/status_codes.py:90 +#: stock/status_codes.py:91 msgid "Received against Purchase Order" msgstr "" -#: stock/status_codes.py:93 +#: stock/status_codes.py:94 msgid "Returned against Return Order" msgstr "" -#: stock/status_codes.py:96 +#: stock/status_codes.py:97 msgid "Sent to customer" msgstr "" -#: stock/status_codes.py:97 +#: stock/status_codes.py:98 msgid "Returned from customer" msgstr "" diff --git a/src/backend/InvenTree/locale/fi/LC_MESSAGES/django.po b/src/backend/InvenTree/locale/fi/LC_MESSAGES/django.po index 009922ad84..d5dbbe117c 100644 --- a/src/backend/InvenTree/locale/fi/LC_MESSAGES/django.po +++ b/src/backend/InvenTree/locale/fi/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: inventree\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-11-19 04:55+0000\n" -"PO-Revision-Date: 2025-11-19 04:59\n" +"POT-Creation-Date: 2025-11-24 06:50+0000\n" +"PO-Revision-Date: 2025-11-24 06:54\n" "Last-Translator: \n" "Language-Team: Finnish\n" "Language: fi_FI\n" @@ -81,21 +81,21 @@ msgstr "Annettu ensisijainen sähköpostiosoite ei kelpaa." msgid "The provided email domain is not approved." msgstr "Annetun sähköpostiosoitteen verkkotunnusta ei hyväksytä." -#: InvenTree/conversion.py:166 +#: InvenTree/conversion.py:240 #, python-brace-format msgid "Invalid unit provided ({unit})" msgstr "" -#: InvenTree/conversion.py:183 +#: InvenTree/conversion.py:257 msgid "No value provided" msgstr "Arvoa ei annettu" -#: InvenTree/conversion.py:210 +#: InvenTree/conversion.py:284 #, python-brace-format msgid "Could not convert {original} to {unit}" msgstr "" -#: InvenTree/conversion.py:212 InvenTree/conversion.py:226 +#: InvenTree/conversion.py:286 InvenTree/conversion.py:300 #: InvenTree/helpers.py:597 order/models.py:720 order/models.py:1015 msgid "Invalid quantity provided" msgstr "Annettu määrä on virheellinen" @@ -116,7 +116,7 @@ msgstr "" #: build/serializers.py:580 build/serializers.py:1788 company/models.py:857 #: order/models.py:1780 #: report/templates/report/inventree_build_order_report.html:172 -#: stock/models.py:2848 stock/models.py:2972 stock/serializers.py:717 +#: stock/models.py:2865 stock/models.py:2989 stock/serializers.py:717 #: stock/serializers.py:893 stock/serializers.py:1035 stock/serializers.py:1336 #: stock/serializers.py:1425 stock/serializers.py:1624 msgid "Notes" @@ -345,7 +345,7 @@ msgstr "Täytyy olla kelvollinen luku" msgid "Currency" msgstr "Valuutta" -#: InvenTree/serializers.py:298 part/serializers.py:1385 +#: InvenTree/serializers.py:298 part/serializers.py:1357 msgid "Select currency from available options" msgstr "Valitse valuutta käytettävissä olevista vaihtoehdoista" @@ -553,14 +553,14 @@ msgstr "" #: build/api.py:100 build/api.py:466 build/api.py:845 build/models.py:270 #: build/serializers.py:1225 build/serializers.py:1356 -#: build/serializers.py:1427 company/models.py:1067 company/serializers.py:445 +#: build/serializers.py:1427 company/models.py:1067 company/serializers.py:491 #: order/api.py:298 order/api.py:302 order/api.py:929 order/api.py:1187 #: order/api.py:1190 order/models.py:1941 order/models.py:2108 #: order/models.py:2109 part/api.py:1233 part/api.py:1236 part/api.py:1302 #: part/api.py:1589 part/models.py:472 part/models.py:3296 part/models.py:3439 #: part/models.py:3497 part/models.py:3518 part/models.py:3540 #: part/models.py:3679 part/models.py:4046 part/models.py:4368 -#: part/models.py:4787 part/serializers.py:1928 +#: part/models.py:4787 part/serializers.py:1900 #: report/templates/report/inventree_bill_of_materials_report.html:110 #: report/templates/report/inventree_bill_of_materials_report.html:137 #: report/templates/report/inventree_build_order_report.html:109 @@ -582,7 +582,7 @@ msgstr "Osa" #: build/api.py:120 build/api.py:123 build/serializers.py:1438 part/api.py:980 #: part/api.py:1316 part/api.py:1600 part/models.py:1080 part/models.py:3568 -#: part/models.py:4162 part/serializers.py:1752 stock/api.py:869 +#: part/models.py:4162 part/serializers.py:1724 stock/api.py:869 msgid "Category" msgstr "Kategoria" @@ -663,7 +663,7 @@ msgid "Optional" msgstr "" #: build/api.py:455 build/serializers.py:1415 common/setting/system.py:456 -#: part/models.py:1202 part/serializers.py:1714 part/serializers.py:1725 +#: part/models.py:1202 part/serializers.py:1686 part/serializers.py:1697 #: stock/api.py:639 msgid "Assembly" msgstr "" @@ -688,16 +688,16 @@ msgstr "" msgid "Consumed" msgstr "" -#: build/api.py:499 company/models.py:912 company/serializers.py:440 +#: build/api.py:499 company/models.py:912 company/serializers.py:474 #: templates/email/build_order_required_stock.html:19 #: templates/email/low_stock_notification.html:17 #: templates/email/part_event_notification.html:18 msgid "Available" msgstr "Saatavilla" -#: build/api.py:523 build/serializers.py:1466 company/serializers.py:437 -#: order/serializers.py:1281 part/serializers.py:959 part/serializers.py:1306 -#: part/serializers.py:1761 +#: build/api.py:523 build/serializers.py:1466 company/serializers.py:471 +#: order/serializers.py:1281 part/serializers.py:931 part/serializers.py:1278 +#: part/serializers.py:1733 msgid "On Order" msgstr "" @@ -963,7 +963,7 @@ msgstr "" #: build/models.py:1136 build/models.py:1234 build/serializers.py:285 #: build/serializers.py:335 build/serializers.py:965 build/serializers.py:1739 #: order/models.py:717 order/serializers.py:658 order/serializers.py:844 -#: part/serializers.py:1708 stock/models.py:940 stock/models.py:1430 +#: part/serializers.py:1680 stock/models.py:940 stock/models.py:1430 #: stock/models.py:1878 stock/serializers.py:688 stock/serializers.py:1580 msgid "Quantity must be greater than zero" msgstr "" @@ -1385,20 +1385,20 @@ msgstr "" msgid "BOM Item" msgstr "" -#: build/serializers.py:1467 order/serializers.py:1282 part/serializers.py:1310 -#: part/serializers.py:1765 +#: build/serializers.py:1467 order/serializers.py:1282 part/serializers.py:1282 +#: part/serializers.py:1737 msgid "In Production" msgstr "" -#: build/serializers.py:1469 part/serializers.py:950 part/serializers.py:1314 +#: build/serializers.py:1469 part/serializers.py:922 part/serializers.py:1286 msgid "Scheduled to Build" msgstr "" -#: build/serializers.py:1472 part/serializers.py:987 +#: build/serializers.py:1472 part/serializers.py:959 msgid "External Stock" msgstr "" -#: build/serializers.py:1473 part/serializers.py:1300 part/serializers.py:1808 +#: build/serializers.py:1473 part/serializers.py:1272 part/serializers.py:1780 msgid "Available Stock" msgstr "" @@ -1588,7 +1588,7 @@ msgstr "Käyttäjä" msgid "Price break quantity" msgstr "" -#: common/models.py:1348 company/serializers.py:564 order/models.py:1842 +#: common/models.py:1348 company/serializers.py:357 order/models.py:1842 #: order/models.py:3043 msgid "Price" msgstr "Hinta" @@ -1760,7 +1760,7 @@ msgstr "" msgid "Unit definition" msgstr "" -#: common/models.py:1911 common/models.py:1974 stock/models.py:2967 +#: common/models.py:1911 common/models.py:1974 stock/models.py:2984 #: stock/serializers.py:247 msgid "Attachment" msgstr "Liite" @@ -1839,7 +1839,7 @@ msgstr "" #: common/models.py:2090 common/models.py:2329 company/models.py:622 #: machine/serializers.py:27 -#: report/templates/report/inventree_test_report.html:104 stock/models.py:2959 +#: report/templates/report/inventree_test_report.html:104 stock/models.py:2976 msgid "Value" msgstr "Arvo" @@ -2048,7 +2048,7 @@ msgid "Response data from the barcode scan" msgstr "" #: common/models.py:2417 report/templates/report/inventree_test_report.html:103 -#: stock/models.py:2953 +#: stock/models.py:2970 msgid "Result" msgstr "" @@ -2141,7 +2141,7 @@ msgid "Linked thread for this message" msgstr "" #: common/models.py:2656 -msgid "Prioriy" +msgid "Priority" msgstr "" #: common/models.py:2698 @@ -2671,8 +2671,8 @@ msgstr "" msgid "Parts can be assembled from other components by default" msgstr "" -#: common/setting/system.py:462 part/models.py:1208 part/serializers.py:1734 -#: part/serializers.py:1741 +#: common/setting/system.py:462 part/models.py:1208 part/serializers.py:1706 +#: part/serializers.py:1713 msgid "Component" msgstr "Komponentti" @@ -3772,7 +3772,7 @@ msgstr "" msgid "Supplier is Active" msgstr "" -#: company/api.py:307 company/models.py:520 company/serializers.py:457 +#: company/api.py:307 company/models.py:520 company/serializers.py:503 #: part/serializers.py:566 msgid "Manufacturer" msgstr "Valmistaja" @@ -3964,7 +3964,7 @@ msgid "Link to address information (external)" msgstr "" #: company/models.py:492 company/models.py:609 company/models.py:832 -#: company/serializers.py:471 stock/api.py:561 +#: company/serializers.py:517 stock/api.py:561 msgid "Manufacturer Part" msgstr "" @@ -3981,7 +3981,7 @@ msgstr "" msgid "Select manufacturer" msgstr "Valitse valmistaja" -#: company/models.py:527 company/serializers.py:479 order/serializers.py:734 +#: company/models.py:527 company/serializers.py:525 order/serializers.py:734 #: part/serializers.py:576 msgid "MPN" msgstr "" @@ -4030,7 +4030,7 @@ msgstr "" msgid "Linked manufacturer part must reference the same base part" msgstr "" -#: company/models.py:810 company/serializers.py:449 company/serializers.py:467 +#: company/models.py:810 company/serializers.py:495 company/serializers.py:513 #: order/models.py:639 part/serializers.py:550 #: plugin/builtin/suppliers/digikey.py:26 plugin/builtin/suppliers/lcsc.py:27 #: plugin/builtin/suppliers/mouser.py:25 plugin/builtin/suppliers/tme.py:27 @@ -4134,10 +4134,14 @@ msgstr "" msgid "Company Name" msgstr "" -#: company/serializers.py:433 part/serializers.py:955 stock/serializers.py:428 +#: company/serializers.py:467 part/serializers.py:927 stock/serializers.py:428 msgid "In Stock" msgstr "" +#: company/serializers.py:484 +msgid "Price Breaks" +msgstr "" + #: data_exporter/mixins.py:325 data_exporter/mixins.py:403 msgid "Error occurred during data export" msgstr "" @@ -4290,7 +4294,7 @@ msgstr "" msgid "Errors" msgstr "" -#: importer/models.py:550 part/serializers.py:1268 +#: importer/models.py:550 part/serializers.py:1240 msgid "Valid" msgstr "" @@ -5677,7 +5681,7 @@ msgstr "" msgid "Part category" msgstr "" -#: part/models.py:1088 part/serializers.py:929 +#: part/models.py:1088 part/serializers.py:901 #: report/templates/report/inventree_stock_location_report.html:103 msgid "IPN" msgstr "" @@ -5718,7 +5722,7 @@ msgstr "" msgid "Expiry time (in days) for stock items of this part" msgstr "" -#: part/models.py:1186 part/serializers.py:1003 +#: part/models.py:1186 part/serializers.py:975 msgid "Minimum Stock" msgstr "" @@ -6418,203 +6422,203 @@ msgstr "" msgid "Supplier part matching this SKU already exists" msgstr "" -#: part/serializers.py:914 +#: part/serializers.py:886 msgid "Category Name" msgstr "" -#: part/serializers.py:943 +#: part/serializers.py:915 msgid "Building" msgstr "" -#: part/serializers.py:944 +#: part/serializers.py:916 msgid "Quantity of this part currently being in production" msgstr "" -#: part/serializers.py:951 +#: part/serializers.py:923 msgid "Outstanding quantity of this part scheduled to be built" msgstr "" -#: part/serializers.py:971 stock/serializers.py:1019 stock/serializers.py:1189 +#: part/serializers.py:943 stock/serializers.py:1019 stock/serializers.py:1189 #: users/ruleset.py:30 msgid "Stock Items" msgstr "" -#: part/serializers.py:975 +#: part/serializers.py:947 msgid "Revisions" msgstr "" -#: part/serializers.py:979 +#: part/serializers.py:951 msgid "Suppliers" msgstr "" -#: part/serializers.py:983 part/serializers.py:1297 +#: part/serializers.py:955 part/serializers.py:1269 #: templates/email/low_stock_notification.html:16 #: templates/email/part_event_notification.html:17 msgid "Total Stock" msgstr "" -#: part/serializers.py:991 +#: part/serializers.py:963 msgid "Unallocated Stock" msgstr "" -#: part/serializers.py:999 +#: part/serializers.py:971 msgid "Variant Stock" msgstr "" -#: part/serializers.py:1054 +#: part/serializers.py:1026 msgid "Duplicate Part" msgstr "" -#: part/serializers.py:1055 +#: part/serializers.py:1027 msgid "Copy initial data from another Part" msgstr "" -#: part/serializers.py:1061 +#: part/serializers.py:1033 msgid "Initial Stock" msgstr "" -#: part/serializers.py:1062 +#: part/serializers.py:1034 msgid "Create Part with initial stock quantity" msgstr "" -#: part/serializers.py:1068 +#: part/serializers.py:1040 msgid "Supplier Information" msgstr "" -#: part/serializers.py:1069 +#: part/serializers.py:1041 msgid "Add initial supplier information for this part" msgstr "" -#: part/serializers.py:1077 +#: part/serializers.py:1049 msgid "Copy Category Parameters" msgstr "" -#: part/serializers.py:1078 +#: part/serializers.py:1050 msgid "Copy parameter templates from selected part category" msgstr "" -#: part/serializers.py:1083 +#: part/serializers.py:1055 msgid "Existing Image" msgstr "" -#: part/serializers.py:1084 +#: part/serializers.py:1056 msgid "Filename of an existing part image" msgstr "" -#: part/serializers.py:1101 +#: part/serializers.py:1073 msgid "Image file does not exist" msgstr "" -#: part/serializers.py:1269 +#: part/serializers.py:1241 msgid "Validate entire Bill of Materials" msgstr "" -#: part/serializers.py:1303 part/serializers.py:1769 +#: part/serializers.py:1275 part/serializers.py:1741 msgid "Can Build" msgstr "" -#: part/serializers.py:1320 +#: part/serializers.py:1292 msgid "Required for Build Orders" msgstr "" -#: part/serializers.py:1325 +#: part/serializers.py:1297 msgid "Allocated to Build Orders" msgstr "" -#: part/serializers.py:1332 +#: part/serializers.py:1304 msgid "Required for Sales Orders" msgstr "" -#: part/serializers.py:1336 +#: part/serializers.py:1308 msgid "Allocated to Sales Orders" msgstr "" -#: part/serializers.py:1475 +#: part/serializers.py:1447 msgid "Minimum Price" msgstr "" -#: part/serializers.py:1476 +#: part/serializers.py:1448 msgid "Override calculated value for minimum price" msgstr "" -#: part/serializers.py:1483 +#: part/serializers.py:1455 msgid "Minimum price currency" msgstr "" -#: part/serializers.py:1490 +#: part/serializers.py:1462 msgid "Maximum Price" msgstr "" -#: part/serializers.py:1491 +#: part/serializers.py:1463 msgid "Override calculated value for maximum price" msgstr "" -#: part/serializers.py:1498 +#: part/serializers.py:1470 msgid "Maximum price currency" msgstr "" -#: part/serializers.py:1527 +#: part/serializers.py:1499 msgid "Update" msgstr "" -#: part/serializers.py:1528 +#: part/serializers.py:1500 msgid "Update pricing for this part" msgstr "" -#: part/serializers.py:1551 +#: part/serializers.py:1523 #, python-brace-format msgid "Could not convert from provided currencies to {default_currency}" msgstr "" -#: part/serializers.py:1558 +#: part/serializers.py:1530 msgid "Minimum price must not be greater than maximum price" msgstr "" -#: part/serializers.py:1561 +#: part/serializers.py:1533 msgid "Maximum price must not be less than minimum price" msgstr "" -#: part/serializers.py:1715 +#: part/serializers.py:1687 msgid "Select the parent assembly" msgstr "" -#: part/serializers.py:1735 +#: part/serializers.py:1707 msgid "Select the component part" msgstr "" -#: part/serializers.py:1929 +#: part/serializers.py:1901 msgid "Select part to copy BOM from" msgstr "" -#: part/serializers.py:1937 +#: part/serializers.py:1909 msgid "Remove Existing Data" msgstr "" -#: part/serializers.py:1938 +#: part/serializers.py:1910 msgid "Remove existing BOM items before copying" msgstr "" -#: part/serializers.py:1943 +#: part/serializers.py:1915 msgid "Include Inherited" msgstr "" -#: part/serializers.py:1944 +#: part/serializers.py:1916 msgid "Include BOM items which are inherited from templated parts" msgstr "" -#: part/serializers.py:1949 +#: part/serializers.py:1921 msgid "Skip Invalid Rows" msgstr "" -#: part/serializers.py:1950 +#: part/serializers.py:1922 msgid "Enable this option to skip invalid rows" msgstr "" -#: part/serializers.py:1955 +#: part/serializers.py:1927 msgid "Copy Substitute Parts" msgstr "" -#: part/serializers.py:1956 +#: part/serializers.py:1928 msgid "Copy substitute parts when duplicate BOM items" msgstr "" @@ -8455,115 +8459,119 @@ msgstr "" msgid "Quantity does not match serial numbers" msgstr "" -#: stock/models.py:2012 stock/models.py:2917 +#: stock/models.py:1912 +msgid "Cannot assign stock to structural location" +msgstr "" + +#: stock/models.py:2029 stock/models.py:2934 msgid "Test template does not exist" msgstr "" -#: stock/models.py:2030 +#: stock/models.py:2047 msgid "Stock item has been assigned to a sales order" msgstr "" -#: stock/models.py:2034 +#: stock/models.py:2051 msgid "Stock item is installed in another item" msgstr "" -#: stock/models.py:2037 +#: stock/models.py:2054 msgid "Stock item contains other items" msgstr "" -#: stock/models.py:2040 +#: stock/models.py:2057 msgid "Stock item has been assigned to a customer" msgstr "" -#: stock/models.py:2043 stock/models.py:2226 +#: stock/models.py:2060 stock/models.py:2243 msgid "Stock item is currently in production" msgstr "" -#: stock/models.py:2046 +#: stock/models.py:2063 msgid "Serialized stock cannot be merged" msgstr "" -#: stock/models.py:2053 stock/serializers.py:1462 +#: stock/models.py:2070 stock/serializers.py:1462 msgid "Duplicate stock items" msgstr "" -#: stock/models.py:2057 +#: stock/models.py:2074 msgid "Stock items must refer to the same part" msgstr "" -#: stock/models.py:2065 +#: stock/models.py:2082 msgid "Stock items must refer to the same supplier part" msgstr "" -#: stock/models.py:2070 +#: stock/models.py:2087 msgid "Stock status codes must match" msgstr "" -#: stock/models.py:2349 +#: stock/models.py:2366 msgid "StockItem cannot be moved as it is not in stock" msgstr "" -#: stock/models.py:2818 +#: stock/models.py:2835 msgid "Stock Item Tracking" msgstr "" -#: stock/models.py:2849 +#: stock/models.py:2866 msgid "Entry notes" msgstr "" -#: stock/models.py:2889 +#: stock/models.py:2906 msgid "Stock Item Test Result" msgstr "" -#: stock/models.py:2920 +#: stock/models.py:2937 msgid "Value must be provided for this test" msgstr "" -#: stock/models.py:2924 +#: stock/models.py:2941 msgid "Attachment must be uploaded for this test" msgstr "" -#: stock/models.py:2929 +#: stock/models.py:2946 msgid "Invalid value for this test" msgstr "" -#: stock/models.py:2953 +#: stock/models.py:2970 msgid "Test result" msgstr "" -#: stock/models.py:2960 +#: stock/models.py:2977 msgid "Test output value" msgstr "" -#: stock/models.py:2968 stock/serializers.py:248 +#: stock/models.py:2985 stock/serializers.py:248 msgid "Test result attachment" msgstr "" -#: stock/models.py:2972 +#: stock/models.py:2989 msgid "Test notes" msgstr "" -#: stock/models.py:2980 +#: stock/models.py:2997 msgid "Test station" msgstr "" -#: stock/models.py:2981 +#: stock/models.py:2998 msgid "The identifier of the test station where the test was performed" msgstr "" -#: stock/models.py:2987 +#: stock/models.py:3004 msgid "Started" msgstr "" -#: stock/models.py:2988 +#: stock/models.py:3005 msgid "The timestamp of the test start" msgstr "" -#: stock/models.py:2994 +#: stock/models.py:3011 msgid "Finished" msgstr "" -#: stock/models.py:2995 +#: stock/models.py:3012 msgid "The timestamp of the test finish" msgstr "" @@ -8902,83 +8910,87 @@ msgstr "" msgid "Stock manually removed" msgstr "" -#: stock/status_codes.py:57 +#: stock/status_codes.py:56 +msgid "Serialized stock items" +msgstr "" + +#: stock/status_codes.py:58 msgid "Returned to stock" msgstr "" -#: stock/status_codes.py:60 +#: stock/status_codes.py:61 msgid "Location changed" msgstr "Sijainti muutettu" -#: stock/status_codes.py:61 +#: stock/status_codes.py:62 msgid "Stock updated" msgstr "Varasto päivitetty" -#: stock/status_codes.py:64 +#: stock/status_codes.py:65 msgid "Installed into assembly" msgstr "" -#: stock/status_codes.py:65 +#: stock/status_codes.py:66 msgid "Removed from assembly" msgstr "" -#: stock/status_codes.py:67 +#: stock/status_codes.py:68 msgid "Installed component item" msgstr "" -#: stock/status_codes.py:68 +#: stock/status_codes.py:69 msgid "Removed component item" msgstr "" -#: stock/status_codes.py:71 +#: stock/status_codes.py:72 msgid "Split from parent item" msgstr "" -#: stock/status_codes.py:72 +#: stock/status_codes.py:73 msgid "Split child item" msgstr "" -#: stock/status_codes.py:75 +#: stock/status_codes.py:76 msgid "Merged stock items" msgstr "" -#: stock/status_codes.py:78 +#: stock/status_codes.py:79 msgid "Converted to variant" msgstr "" -#: stock/status_codes.py:81 +#: stock/status_codes.py:82 msgid "Build order output created" msgstr "" -#: stock/status_codes.py:82 +#: stock/status_codes.py:83 msgid "Build order output completed" msgstr "" -#: stock/status_codes.py:83 +#: stock/status_codes.py:84 msgid "Build order output rejected" msgstr "" -#: stock/status_codes.py:84 +#: stock/status_codes.py:85 msgid "Consumed by build order" msgstr "" -#: stock/status_codes.py:87 +#: stock/status_codes.py:88 msgid "Shipped against Sales Order" msgstr "" -#: stock/status_codes.py:90 +#: stock/status_codes.py:91 msgid "Received against Purchase Order" msgstr "" -#: stock/status_codes.py:93 +#: stock/status_codes.py:94 msgid "Returned against Return Order" msgstr "" -#: stock/status_codes.py:96 +#: stock/status_codes.py:97 msgid "Sent to customer" msgstr "" -#: stock/status_codes.py:97 +#: stock/status_codes.py:98 msgid "Returned from customer" msgstr "" diff --git a/src/backend/InvenTree/locale/fr/LC_MESSAGES/django.po b/src/backend/InvenTree/locale/fr/LC_MESSAGES/django.po index 18294d64e7..463bf86671 100644 --- a/src/backend/InvenTree/locale/fr/LC_MESSAGES/django.po +++ b/src/backend/InvenTree/locale/fr/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: inventree\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-11-19 04:55+0000\n" -"PO-Revision-Date: 2025-11-19 04:59\n" +"POT-Creation-Date: 2025-11-24 06:50+0000\n" +"PO-Revision-Date: 2025-11-24 06:54\n" "Last-Translator: \n" "Language-Team: French\n" "Language: fr_FR\n" @@ -81,21 +81,21 @@ msgstr "L'adresse e-mail principale fournie n'est pas valide." msgid "The provided email domain is not approved." msgstr "Le domaine e-mail fourni n'est pas approuvé." -#: InvenTree/conversion.py:166 +#: InvenTree/conversion.py:240 #, python-brace-format msgid "Invalid unit provided ({unit})" msgstr "Unité fournie invalide ({unit})" -#: InvenTree/conversion.py:183 +#: InvenTree/conversion.py:257 msgid "No value provided" msgstr "Pas de valeur renseignée" -#: InvenTree/conversion.py:210 +#: InvenTree/conversion.py:284 #, python-brace-format msgid "Could not convert {original} to {unit}" msgstr "Impossible de convertir {original} en {unit}" -#: InvenTree/conversion.py:212 InvenTree/conversion.py:226 +#: InvenTree/conversion.py:286 InvenTree/conversion.py:300 #: InvenTree/helpers.py:597 order/models.py:720 order/models.py:1015 msgid "Invalid quantity provided" msgstr "Quantité fournie invalide" @@ -116,7 +116,7 @@ msgstr "Valeur décimale invalide" #: build/serializers.py:580 build/serializers.py:1788 company/models.py:857 #: order/models.py:1780 #: report/templates/report/inventree_build_order_report.html:172 -#: stock/models.py:2848 stock/models.py:2972 stock/serializers.py:717 +#: stock/models.py:2865 stock/models.py:2989 stock/serializers.py:717 #: stock/serializers.py:893 stock/serializers.py:1035 stock/serializers.py:1336 #: stock/serializers.py:1425 stock/serializers.py:1624 msgid "Notes" @@ -345,7 +345,7 @@ msgstr "Doit être un nombre valide" msgid "Currency" msgstr "Devise" -#: InvenTree/serializers.py:298 part/serializers.py:1385 +#: InvenTree/serializers.py:298 part/serializers.py:1357 msgid "Select currency from available options" msgstr "Sélectionnez la devise à partir des options disponibles" @@ -553,14 +553,14 @@ msgstr "Inclure les variantes" #: build/api.py:100 build/api.py:466 build/api.py:845 build/models.py:270 #: build/serializers.py:1225 build/serializers.py:1356 -#: build/serializers.py:1427 company/models.py:1067 company/serializers.py:445 +#: build/serializers.py:1427 company/models.py:1067 company/serializers.py:491 #: order/api.py:298 order/api.py:302 order/api.py:929 order/api.py:1187 #: order/api.py:1190 order/models.py:1941 order/models.py:2108 #: order/models.py:2109 part/api.py:1233 part/api.py:1236 part/api.py:1302 #: part/api.py:1589 part/models.py:472 part/models.py:3296 part/models.py:3439 #: part/models.py:3497 part/models.py:3518 part/models.py:3540 #: part/models.py:3679 part/models.py:4046 part/models.py:4368 -#: part/models.py:4787 part/serializers.py:1928 +#: part/models.py:4787 part/serializers.py:1900 #: report/templates/report/inventree_bill_of_materials_report.html:110 #: report/templates/report/inventree_bill_of_materials_report.html:137 #: report/templates/report/inventree_build_order_report.html:109 @@ -582,7 +582,7 @@ msgstr "Pièce" #: build/api.py:120 build/api.py:123 build/serializers.py:1438 part/api.py:980 #: part/api.py:1316 part/api.py:1600 part/models.py:1080 part/models.py:3568 -#: part/models.py:4162 part/serializers.py:1752 stock/api.py:869 +#: part/models.py:4162 part/serializers.py:1724 stock/api.py:869 msgid "Category" msgstr "Catégorie" @@ -663,7 +663,7 @@ msgid "Optional" msgstr "Facultatif" #: build/api.py:455 build/serializers.py:1415 common/setting/system.py:456 -#: part/models.py:1202 part/serializers.py:1714 part/serializers.py:1725 +#: part/models.py:1202 part/serializers.py:1686 part/serializers.py:1697 #: stock/api.py:639 msgid "Assembly" msgstr "Assemblage" @@ -688,16 +688,16 @@ msgstr "Allouée" msgid "Consumed" msgstr "Consommé" -#: build/api.py:499 company/models.py:912 company/serializers.py:440 +#: build/api.py:499 company/models.py:912 company/serializers.py:474 #: templates/email/build_order_required_stock.html:19 #: templates/email/low_stock_notification.html:17 #: templates/email/part_event_notification.html:18 msgid "Available" msgstr "Disponible" -#: build/api.py:523 build/serializers.py:1466 company/serializers.py:437 -#: order/serializers.py:1281 part/serializers.py:959 part/serializers.py:1306 -#: part/serializers.py:1761 +#: build/api.py:523 build/serializers.py:1466 company/serializers.py:471 +#: order/serializers.py:1281 part/serializers.py:931 part/serializers.py:1278 +#: part/serializers.py:1733 msgid "On Order" msgstr "En Commande" @@ -963,7 +963,7 @@ msgstr "L'ordre de production de correspond pas à l'ordre de commande" #: build/models.py:1136 build/models.py:1234 build/serializers.py:285 #: build/serializers.py:335 build/serializers.py:965 build/serializers.py:1739 #: order/models.py:717 order/serializers.py:658 order/serializers.py:844 -#: part/serializers.py:1708 stock/models.py:940 stock/models.py:1430 +#: part/serializers.py:1680 stock/models.py:940 stock/models.py:1430 #: stock/models.py:1878 stock/serializers.py:688 stock/serializers.py:1580 msgid "Quantity must be greater than zero" msgstr "La quantité doit être supérieure à zéro" @@ -1385,20 +1385,20 @@ msgstr "Autoriser les variantes" msgid "BOM Item" msgstr "Article du BOM" -#: build/serializers.py:1467 order/serializers.py:1282 part/serializers.py:1310 -#: part/serializers.py:1765 +#: build/serializers.py:1467 order/serializers.py:1282 part/serializers.py:1282 +#: part/serializers.py:1737 msgid "In Production" msgstr "En Production" -#: build/serializers.py:1469 part/serializers.py:950 part/serializers.py:1314 +#: build/serializers.py:1469 part/serializers.py:922 part/serializers.py:1286 msgid "Scheduled to Build" msgstr "Planifié pour fabrication" -#: build/serializers.py:1472 part/serializers.py:987 +#: build/serializers.py:1472 part/serializers.py:959 msgid "External Stock" msgstr "Stock externe" -#: build/serializers.py:1473 part/serializers.py:1300 part/serializers.py:1808 +#: build/serializers.py:1473 part/serializers.py:1272 part/serializers.py:1780 msgid "Available Stock" msgstr "Stock disponible" @@ -1588,7 +1588,7 @@ msgstr "Utilisateur" msgid "Price break quantity" msgstr "Quantité de rupture de prix" -#: common/models.py:1348 company/serializers.py:564 order/models.py:1842 +#: common/models.py:1348 company/serializers.py:357 order/models.py:1842 #: order/models.py:3043 msgid "Price" msgstr "Prix" @@ -1760,7 +1760,7 @@ msgstr "Définition" msgid "Unit definition" msgstr "Définition de l'unité" -#: common/models.py:1911 common/models.py:1974 stock/models.py:2967 +#: common/models.py:1911 common/models.py:1974 stock/models.py:2984 #: stock/serializers.py:247 msgid "Attachment" msgstr "Pièce jointe" @@ -1839,7 +1839,7 @@ msgstr "Clé logique de l'état qui est égale à cet état personnalisé dans l #: common/models.py:2090 common/models.py:2329 company/models.py:622 #: machine/serializers.py:27 -#: report/templates/report/inventree_test_report.html:104 stock/models.py:2959 +#: report/templates/report/inventree_test_report.html:104 stock/models.py:2976 msgid "Value" msgstr "Valeur" @@ -2048,7 +2048,7 @@ msgid "Response data from the barcode scan" msgstr "Données de réponse provenant de la lecture du code-barres" #: common/models.py:2417 report/templates/report/inventree_test_report.html:103 -#: stock/models.py:2953 +#: stock/models.py:2970 msgid "Result" msgstr "Résultat" @@ -2141,8 +2141,8 @@ msgid "Linked thread for this message" msgstr "Fil lié à ce message" #: common/models.py:2656 -msgid "Prioriy" -msgstr "Priorité" +msgid "Priority" +msgstr "" #: common/models.py:2698 msgid "Email Thread" @@ -2671,8 +2671,8 @@ msgstr "Les pièces sont des templates par défaut" msgid "Parts can be assembled from other components by default" msgstr "Les pièces peuvent être assemblées à partir d'autres composants par défaut" -#: common/setting/system.py:462 part/models.py:1208 part/serializers.py:1734 -#: part/serializers.py:1741 +#: common/setting/system.py:462 part/models.py:1208 part/serializers.py:1706 +#: part/serializers.py:1713 msgid "Component" msgstr "Composant" @@ -3772,7 +3772,7 @@ msgstr "La pièce interne est active" msgid "Supplier is Active" msgstr "Le fournisseur est actif" -#: company/api.py:307 company/models.py:520 company/serializers.py:457 +#: company/api.py:307 company/models.py:520 company/serializers.py:503 #: part/serializers.py:566 msgid "Manufacturer" msgstr "Fabricant" @@ -3964,7 +3964,7 @@ msgid "Link to address information (external)" msgstr "Lien vers les informations de l'adresse (externe)" #: company/models.py:492 company/models.py:609 company/models.py:832 -#: company/serializers.py:471 stock/api.py:561 +#: company/serializers.py:517 stock/api.py:561 msgid "Manufacturer Part" msgstr "Pièces du fabricant" @@ -3981,7 +3981,7 @@ msgstr "Sélectionner une partie" msgid "Select manufacturer" msgstr "Sélectionner un fabricant" -#: company/models.py:527 company/serializers.py:479 order/serializers.py:734 +#: company/models.py:527 company/serializers.py:525 order/serializers.py:734 #: part/serializers.py:576 msgid "MPN" msgstr "Référence fabricant" @@ -4030,7 +4030,7 @@ msgstr "Les unités d'emballage doivent être supérieures à zéro" msgid "Linked manufacturer part must reference the same base part" msgstr "La pièce du fabricant liée doit faire référence à la même pièce de base" -#: company/models.py:810 company/serializers.py:449 company/serializers.py:467 +#: company/models.py:810 company/serializers.py:495 company/serializers.py:513 #: order/models.py:639 part/serializers.py:550 #: plugin/builtin/suppliers/digikey.py:26 plugin/builtin/suppliers/lcsc.py:27 #: plugin/builtin/suppliers/mouser.py:25 plugin/builtin/suppliers/tme.py:27 @@ -4134,10 +4134,14 @@ msgstr "Devise par défaut utilisée pour ce fournisseur" msgid "Company Name" msgstr "Nom de l'entreprise" -#: company/serializers.py:433 part/serializers.py:955 stock/serializers.py:428 +#: company/serializers.py:467 part/serializers.py:927 stock/serializers.py:428 msgid "In Stock" msgstr "En Stock" +#: company/serializers.py:484 +msgid "Price Breaks" +msgstr "" + #: data_exporter/mixins.py:325 data_exporter/mixins.py:403 msgid "Error occurred during data export" msgstr "Une erreur s'est produite lors de l'exportation des données" @@ -4290,7 +4294,7 @@ msgstr "Données de la ligne d'origine" msgid "Errors" msgstr "Erreurs" -#: importer/models.py:550 part/serializers.py:1268 +#: importer/models.py:550 part/serializers.py:1240 msgid "Valid" msgstr "Valide" @@ -5677,7 +5681,7 @@ msgstr "Les mots-clés partiels pour améliorer la visibilité dans les résulta msgid "Part category" msgstr "Catégorie de la pièce" -#: part/models.py:1088 part/serializers.py:929 +#: part/models.py:1088 part/serializers.py:901 #: report/templates/report/inventree_stock_location_report.html:103 msgid "IPN" msgstr "IPN" @@ -5718,7 +5722,7 @@ msgstr "Expiration par défaut" msgid "Expiry time (in days) for stock items of this part" msgstr "Délai d'expiration (en jours) pour les articles en stock de cette pièce" -#: part/models.py:1186 part/serializers.py:1003 +#: part/models.py:1186 part/serializers.py:975 msgid "Minimum Stock" msgstr "Stock Minimum" @@ -6418,203 +6422,203 @@ msgstr "La pièce du fabricant correspondant à ce MPN existe déjà" msgid "Supplier part matching this SKU already exists" msgstr "La pièce du fournisseur correspondant à cette UGS existe déjà" -#: part/serializers.py:914 +#: part/serializers.py:886 msgid "Category Name" msgstr "Nom catégorie" -#: part/serializers.py:943 +#: part/serializers.py:915 msgid "Building" msgstr "Construction" -#: part/serializers.py:944 +#: part/serializers.py:916 msgid "Quantity of this part currently being in production" msgstr "Quantité de cette pièce actuellement en production" -#: part/serializers.py:951 +#: part/serializers.py:923 msgid "Outstanding quantity of this part scheduled to be built" msgstr "Quantité exceptionnelle de cette pièce sont planifié à la fabrication" -#: part/serializers.py:971 stock/serializers.py:1019 stock/serializers.py:1189 +#: part/serializers.py:943 stock/serializers.py:1019 stock/serializers.py:1189 #: users/ruleset.py:30 msgid "Stock Items" msgstr "Éléments en stock" -#: part/serializers.py:975 +#: part/serializers.py:947 msgid "Revisions" msgstr "Révisions" -#: part/serializers.py:979 +#: part/serializers.py:951 msgid "Suppliers" msgstr "Fournisseurs" -#: part/serializers.py:983 part/serializers.py:1297 +#: part/serializers.py:955 part/serializers.py:1269 #: templates/email/low_stock_notification.html:16 #: templates/email/part_event_notification.html:17 msgid "Total Stock" msgstr "Stock total" -#: part/serializers.py:991 +#: part/serializers.py:963 msgid "Unallocated Stock" msgstr "Stock non attribué" -#: part/serializers.py:999 +#: part/serializers.py:971 msgid "Variant Stock" msgstr "Variante Stock" -#: part/serializers.py:1054 +#: part/serializers.py:1026 msgid "Duplicate Part" msgstr "Dupliquer une pièce" -#: part/serializers.py:1055 +#: part/serializers.py:1027 msgid "Copy initial data from another Part" msgstr "Copier les données initiales d'une autre partie" -#: part/serializers.py:1061 +#: part/serializers.py:1033 msgid "Initial Stock" msgstr "Stock initial" -#: part/serializers.py:1062 +#: part/serializers.py:1034 msgid "Create Part with initial stock quantity" msgstr "Créer une pièce avec une quantité de stock initiale" -#: part/serializers.py:1068 +#: part/serializers.py:1040 msgid "Supplier Information" msgstr "Informations sur le fournisseur" -#: part/serializers.py:1069 +#: part/serializers.py:1041 msgid "Add initial supplier information for this part" msgstr "Ajouter les informations initiales du fournisseur pour cette pièce" -#: part/serializers.py:1077 +#: part/serializers.py:1049 msgid "Copy Category Parameters" msgstr "Copier les paramètres de la catégorie" -#: part/serializers.py:1078 +#: part/serializers.py:1050 msgid "Copy parameter templates from selected part category" msgstr "Copier les modèles de paramètres de la catégorie de pièces sélectionnée" -#: part/serializers.py:1083 +#: part/serializers.py:1055 msgid "Existing Image" msgstr "Image existante" -#: part/serializers.py:1084 +#: part/serializers.py:1056 msgid "Filename of an existing part image" msgstr "Nom de fichier d'une image de pièce existante" -#: part/serializers.py:1101 +#: part/serializers.py:1073 msgid "Image file does not exist" msgstr "Le fichier image n'existe pas" -#: part/serializers.py:1269 +#: part/serializers.py:1241 msgid "Validate entire Bill of Materials" msgstr "Valider l'ensemble de la nomenclature" -#: part/serializers.py:1303 part/serializers.py:1769 +#: part/serializers.py:1275 part/serializers.py:1741 msgid "Can Build" msgstr "Peut construire" -#: part/serializers.py:1320 +#: part/serializers.py:1292 msgid "Required for Build Orders" msgstr "Nécessaire pour fabrication" -#: part/serializers.py:1325 +#: part/serializers.py:1297 msgid "Allocated to Build Orders" msgstr "Alloué à la fabrication" -#: part/serializers.py:1332 +#: part/serializers.py:1304 msgid "Required for Sales Orders" msgstr "Nécessaire pour les commandes" -#: part/serializers.py:1336 +#: part/serializers.py:1308 msgid "Allocated to Sales Orders" msgstr "Alloué aux commandes" -#: part/serializers.py:1475 +#: part/serializers.py:1447 msgid "Minimum Price" msgstr "Prix Minimum" -#: part/serializers.py:1476 +#: part/serializers.py:1448 msgid "Override calculated value for minimum price" msgstr "Remplacer la valeur calculée pour le prix minimum" -#: part/serializers.py:1483 +#: part/serializers.py:1455 msgid "Minimum price currency" msgstr "Prix minimum monnaie" -#: part/serializers.py:1490 +#: part/serializers.py:1462 msgid "Maximum Price" msgstr "Prix Maximum" -#: part/serializers.py:1491 +#: part/serializers.py:1463 msgid "Override calculated value for maximum price" msgstr "Remplacer la valeur calculée pour le prix maximum" -#: part/serializers.py:1498 +#: part/serializers.py:1470 msgid "Maximum price currency" msgstr "Devise du prix maximum" -#: part/serializers.py:1527 +#: part/serializers.py:1499 msgid "Update" msgstr "Mise à jour" -#: part/serializers.py:1528 +#: part/serializers.py:1500 msgid "Update pricing for this part" msgstr "Mise à jour des prix pour cette pièce" -#: part/serializers.py:1551 +#: part/serializers.py:1523 #, python-brace-format msgid "Could not convert from provided currencies to {default_currency}" msgstr "Impossible de convertir les devises fournies en {default_currency}" -#: part/serializers.py:1558 +#: part/serializers.py:1530 msgid "Minimum price must not be greater than maximum price" msgstr "Le prix minimum ne doit pas être supérieur au prix maximum" -#: part/serializers.py:1561 +#: part/serializers.py:1533 msgid "Maximum price must not be less than minimum price" msgstr "Le prix maximum ne doit pas être inférieur au prix minimum" -#: part/serializers.py:1715 +#: part/serializers.py:1687 msgid "Select the parent assembly" msgstr "Sélectionner l'assemblage parent" -#: part/serializers.py:1735 +#: part/serializers.py:1707 msgid "Select the component part" msgstr "Sélectionner le composant" -#: part/serializers.py:1929 +#: part/serializers.py:1901 msgid "Select part to copy BOM from" msgstr "Sélectionner la pièce à partir de laquelle copier la nomenclature" -#: part/serializers.py:1937 +#: part/serializers.py:1909 msgid "Remove Existing Data" msgstr "Supprimer les données existantes" -#: part/serializers.py:1938 +#: part/serializers.py:1910 msgid "Remove existing BOM items before copying" msgstr "Supprimer les postes de nomenclature existants avant de les copier" -#: part/serializers.py:1943 +#: part/serializers.py:1915 msgid "Include Inherited" msgstr "Inclure l'héritage" -#: part/serializers.py:1944 +#: part/serializers.py:1916 msgid "Include BOM items which are inherited from templated parts" msgstr "Inclure les éléments de nomenclature hérités des pièces modélisées" -#: part/serializers.py:1949 +#: part/serializers.py:1921 msgid "Skip Invalid Rows" msgstr "Sauter les lignes non valides" -#: part/serializers.py:1950 +#: part/serializers.py:1922 msgid "Enable this option to skip invalid rows" msgstr "Activez cette option pour ignorer les lignes non valides" -#: part/serializers.py:1955 +#: part/serializers.py:1927 msgid "Copy Substitute Parts" msgstr "Copier les pièces de remplacement" -#: part/serializers.py:1956 +#: part/serializers.py:1928 msgid "Copy substitute parts when duplicate BOM items" msgstr "Copie de pièces de rechange en cas de duplication de postes de nomenclature" @@ -8455,115 +8459,119 @@ msgstr "Les numéros de série doivent être fournis sous forme de liste" msgid "Quantity does not match serial numbers" msgstr "La quantité ne correspond pas au nombre de numéros de série" -#: stock/models.py:2012 stock/models.py:2917 +#: stock/models.py:1912 +msgid "Cannot assign stock to structural location" +msgstr "" + +#: stock/models.py:2029 stock/models.py:2934 msgid "Test template does not exist" msgstr "Le modèle de test n'existe pas" -#: stock/models.py:2030 +#: stock/models.py:2047 msgid "Stock item has been assigned to a sales order" msgstr "Un article de stock a été affecté à une commande client" -#: stock/models.py:2034 +#: stock/models.py:2051 msgid "Stock item is installed in another item" msgstr "L'article de stock est installé dans un autre article" -#: stock/models.py:2037 +#: stock/models.py:2054 msgid "Stock item contains other items" msgstr "L'article de stock contient d'autres articles" -#: stock/models.py:2040 +#: stock/models.py:2057 msgid "Stock item has been assigned to a customer" msgstr "Un article de stock a été affecté à un client" -#: stock/models.py:2043 stock/models.py:2226 +#: stock/models.py:2060 stock/models.py:2243 msgid "Stock item is currently in production" msgstr "L'article de stock est actuellement en production" -#: stock/models.py:2046 +#: stock/models.py:2063 msgid "Serialized stock cannot be merged" msgstr "Le stock sérialisé ne peut pas être fusionné" -#: stock/models.py:2053 stock/serializers.py:1462 +#: stock/models.py:2070 stock/serializers.py:1462 msgid "Duplicate stock items" msgstr "Articles de stock en double" -#: stock/models.py:2057 +#: stock/models.py:2074 msgid "Stock items must refer to the same part" msgstr "Les articles en stock doivent se référer à la même pièce" -#: stock/models.py:2065 +#: stock/models.py:2082 msgid "Stock items must refer to the same supplier part" msgstr "Les articles en stock doivent se référer à la même pièce du fournisseur" -#: stock/models.py:2070 +#: stock/models.py:2087 msgid "Stock status codes must match" msgstr "Les codes d'état des stocks doivent correspondre" -#: stock/models.py:2349 +#: stock/models.py:2366 msgid "StockItem cannot be moved as it is not in stock" msgstr "StockItem ne peut pas être déplacé car il n'est pas en stock" -#: stock/models.py:2818 +#: stock/models.py:2835 msgid "Stock Item Tracking" msgstr "Suivi des articles en stock" -#: stock/models.py:2849 +#: stock/models.py:2866 msgid "Entry notes" msgstr "Notes d'entrée" -#: stock/models.py:2889 +#: stock/models.py:2906 msgid "Stock Item Test Result" msgstr "Résultat du test de l'article en stock" -#: stock/models.py:2920 +#: stock/models.py:2937 msgid "Value must be provided for this test" msgstr "Une valeur doit être fournie pour ce test" -#: stock/models.py:2924 +#: stock/models.py:2941 msgid "Attachment must be uploaded for this test" msgstr "La pièce jointe doit être téléchargée pour ce test" -#: stock/models.py:2929 +#: stock/models.py:2946 msgid "Invalid value for this test" msgstr "Valeur non valide pour ce test" -#: stock/models.py:2953 +#: stock/models.py:2970 msgid "Test result" msgstr "Résultat du test" -#: stock/models.py:2960 +#: stock/models.py:2977 msgid "Test output value" msgstr "Valeur de sortie du test" -#: stock/models.py:2968 stock/serializers.py:248 +#: stock/models.py:2985 stock/serializers.py:248 msgid "Test result attachment" msgstr "Pièce jointe au résultat du test" -#: stock/models.py:2972 +#: stock/models.py:2989 msgid "Test notes" msgstr "Notes de test" -#: stock/models.py:2980 +#: stock/models.py:2997 msgid "Test station" msgstr "Station de test" -#: stock/models.py:2981 +#: stock/models.py:2998 msgid "The identifier of the test station where the test was performed" msgstr "L'identifiant de la station de test où le test a été effectué" -#: stock/models.py:2987 +#: stock/models.py:3004 msgid "Started" msgstr "Commencé" -#: stock/models.py:2988 +#: stock/models.py:3005 msgid "The timestamp of the test start" msgstr "Horodatage du début du test" -#: stock/models.py:2994 +#: stock/models.py:3011 msgid "Finished" msgstr "Fini" -#: stock/models.py:2995 +#: stock/models.py:3012 msgid "The timestamp of the test finish" msgstr "Horodatage de la fin du test" @@ -8902,83 +8910,87 @@ msgstr "Stock ajouté manuellement" msgid "Stock manually removed" msgstr "Stock supprimé manuellement" -#: stock/status_codes.py:57 +#: stock/status_codes.py:56 +msgid "Serialized stock items" +msgstr "" + +#: stock/status_codes.py:58 msgid "Returned to stock" msgstr "" -#: stock/status_codes.py:60 +#: stock/status_codes.py:61 msgid "Location changed" msgstr "Emplacement modifié" -#: stock/status_codes.py:61 +#: stock/status_codes.py:62 msgid "Stock updated" msgstr "Stock mis à jour" -#: stock/status_codes.py:64 +#: stock/status_codes.py:65 msgid "Installed into assembly" msgstr "Installé dans l'assemblage" -#: stock/status_codes.py:65 +#: stock/status_codes.py:66 msgid "Removed from assembly" msgstr "Retiré de l'assemblage" -#: stock/status_codes.py:67 +#: stock/status_codes.py:68 msgid "Installed component item" msgstr "Composant installé" -#: stock/status_codes.py:68 +#: stock/status_codes.py:69 msgid "Removed component item" msgstr "Composant retiré" -#: stock/status_codes.py:71 +#: stock/status_codes.py:72 msgid "Split from parent item" msgstr "Séparer de l'élément parent" -#: stock/status_codes.py:72 +#: stock/status_codes.py:73 msgid "Split child item" msgstr "Fractionner l'élément enfant" -#: stock/status_codes.py:75 +#: stock/status_codes.py:76 msgid "Merged stock items" msgstr "Articles de stock fusionnés" -#: stock/status_codes.py:78 +#: stock/status_codes.py:79 msgid "Converted to variant" msgstr "Converti en variante" -#: stock/status_codes.py:81 +#: stock/status_codes.py:82 msgid "Build order output created" msgstr "La sortie de l'ordre de construction a été créée" -#: stock/status_codes.py:82 +#: stock/status_codes.py:83 msgid "Build order output completed" msgstr "Sortie de l'ordre de construction terminée" -#: stock/status_codes.py:83 +#: stock/status_codes.py:84 msgid "Build order output rejected" msgstr "La sortie de l'ordre de construction a été refusée" -#: stock/status_codes.py:84 +#: stock/status_codes.py:85 msgid "Consumed by build order" msgstr "Consommé par ordre de construction" -#: stock/status_codes.py:87 +#: stock/status_codes.py:88 msgid "Shipped against Sales Order" msgstr "Commandes expédiées vs. ventes" -#: stock/status_codes.py:90 +#: stock/status_codes.py:91 msgid "Received against Purchase Order" msgstr "Livraisons reçues vs. commandes réalisées" -#: stock/status_codes.py:93 +#: stock/status_codes.py:94 msgid "Returned against Return Order" msgstr "Livraisons retournées vs. commandes retournées" -#: stock/status_codes.py:96 +#: stock/status_codes.py:97 msgid "Sent to customer" msgstr "Envoyé au client" -#: stock/status_codes.py:97 +#: stock/status_codes.py:98 msgid "Returned from customer" msgstr "Retourné par le client" diff --git a/src/backend/InvenTree/locale/he/LC_MESSAGES/django.po b/src/backend/InvenTree/locale/he/LC_MESSAGES/django.po index 3b08493316..7578116755 100644 --- a/src/backend/InvenTree/locale/he/LC_MESSAGES/django.po +++ b/src/backend/InvenTree/locale/he/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: inventree\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-11-19 04:55+0000\n" -"PO-Revision-Date: 2025-11-19 04:59\n" +"POT-Creation-Date: 2025-11-24 06:50+0000\n" +"PO-Revision-Date: 2025-11-24 06:54\n" "Last-Translator: \n" "Language-Team: Hebrew\n" "Language: he_IL\n" @@ -81,21 +81,21 @@ msgstr "" msgid "The provided email domain is not approved." msgstr "" -#: InvenTree/conversion.py:166 +#: InvenTree/conversion.py:240 #, python-brace-format msgid "Invalid unit provided ({unit})" msgstr "סופקה יחידה שלא קיימת ({unit})" -#: InvenTree/conversion.py:183 +#: InvenTree/conversion.py:257 msgid "No value provided" msgstr "לא צוין ערך" -#: InvenTree/conversion.py:210 +#: InvenTree/conversion.py:284 #, python-brace-format msgid "Could not convert {original} to {unit}" msgstr "" -#: InvenTree/conversion.py:212 InvenTree/conversion.py:226 +#: InvenTree/conversion.py:286 InvenTree/conversion.py:300 #: InvenTree/helpers.py:597 order/models.py:720 order/models.py:1015 msgid "Invalid quantity provided" msgstr "" @@ -116,7 +116,7 @@ msgstr "" #: build/serializers.py:580 build/serializers.py:1788 company/models.py:857 #: order/models.py:1780 #: report/templates/report/inventree_build_order_report.html:172 -#: stock/models.py:2848 stock/models.py:2972 stock/serializers.py:717 +#: stock/models.py:2865 stock/models.py:2989 stock/serializers.py:717 #: stock/serializers.py:893 stock/serializers.py:1035 stock/serializers.py:1336 #: stock/serializers.py:1425 stock/serializers.py:1624 msgid "Notes" @@ -345,7 +345,7 @@ msgstr "המספר חייב להיות תקין" msgid "Currency" msgstr "מטבע" -#: InvenTree/serializers.py:298 part/serializers.py:1385 +#: InvenTree/serializers.py:298 part/serializers.py:1357 msgid "Select currency from available options" msgstr "בחר מטבע מהאפשרויות הזמינות" @@ -553,14 +553,14 @@ msgstr "" #: build/api.py:100 build/api.py:466 build/api.py:845 build/models.py:270 #: build/serializers.py:1225 build/serializers.py:1356 -#: build/serializers.py:1427 company/models.py:1067 company/serializers.py:445 +#: build/serializers.py:1427 company/models.py:1067 company/serializers.py:491 #: order/api.py:298 order/api.py:302 order/api.py:929 order/api.py:1187 #: order/api.py:1190 order/models.py:1941 order/models.py:2108 #: order/models.py:2109 part/api.py:1233 part/api.py:1236 part/api.py:1302 #: part/api.py:1589 part/models.py:472 part/models.py:3296 part/models.py:3439 #: part/models.py:3497 part/models.py:3518 part/models.py:3540 #: part/models.py:3679 part/models.py:4046 part/models.py:4368 -#: part/models.py:4787 part/serializers.py:1928 +#: part/models.py:4787 part/serializers.py:1900 #: report/templates/report/inventree_bill_of_materials_report.html:110 #: report/templates/report/inventree_bill_of_materials_report.html:137 #: report/templates/report/inventree_build_order_report.html:109 @@ -582,7 +582,7 @@ msgstr "רכיב" #: build/api.py:120 build/api.py:123 build/serializers.py:1438 part/api.py:980 #: part/api.py:1316 part/api.py:1600 part/models.py:1080 part/models.py:3568 -#: part/models.py:4162 part/serializers.py:1752 stock/api.py:869 +#: part/models.py:4162 part/serializers.py:1724 stock/api.py:869 msgid "Category" msgstr "" @@ -663,7 +663,7 @@ msgid "Optional" msgstr "" #: build/api.py:455 build/serializers.py:1415 common/setting/system.py:456 -#: part/models.py:1202 part/serializers.py:1714 part/serializers.py:1725 +#: part/models.py:1202 part/serializers.py:1686 part/serializers.py:1697 #: stock/api.py:639 msgid "Assembly" msgstr "" @@ -688,16 +688,16 @@ msgstr "" msgid "Consumed" msgstr "" -#: build/api.py:499 company/models.py:912 company/serializers.py:440 +#: build/api.py:499 company/models.py:912 company/serializers.py:474 #: templates/email/build_order_required_stock.html:19 #: templates/email/low_stock_notification.html:17 #: templates/email/part_event_notification.html:18 msgid "Available" msgstr "" -#: build/api.py:523 build/serializers.py:1466 company/serializers.py:437 -#: order/serializers.py:1281 part/serializers.py:959 part/serializers.py:1306 -#: part/serializers.py:1761 +#: build/api.py:523 build/serializers.py:1466 company/serializers.py:471 +#: order/serializers.py:1281 part/serializers.py:931 part/serializers.py:1278 +#: part/serializers.py:1733 msgid "On Order" msgstr "" @@ -963,7 +963,7 @@ msgstr "" #: build/models.py:1136 build/models.py:1234 build/serializers.py:285 #: build/serializers.py:335 build/serializers.py:965 build/serializers.py:1739 #: order/models.py:717 order/serializers.py:658 order/serializers.py:844 -#: part/serializers.py:1708 stock/models.py:940 stock/models.py:1430 +#: part/serializers.py:1680 stock/models.py:940 stock/models.py:1430 #: stock/models.py:1878 stock/serializers.py:688 stock/serializers.py:1580 msgid "Quantity must be greater than zero" msgstr "" @@ -1385,20 +1385,20 @@ msgstr "" msgid "BOM Item" msgstr "" -#: build/serializers.py:1467 order/serializers.py:1282 part/serializers.py:1310 -#: part/serializers.py:1765 +#: build/serializers.py:1467 order/serializers.py:1282 part/serializers.py:1282 +#: part/serializers.py:1737 msgid "In Production" msgstr "" -#: build/serializers.py:1469 part/serializers.py:950 part/serializers.py:1314 +#: build/serializers.py:1469 part/serializers.py:922 part/serializers.py:1286 msgid "Scheduled to Build" msgstr "" -#: build/serializers.py:1472 part/serializers.py:987 +#: build/serializers.py:1472 part/serializers.py:959 msgid "External Stock" msgstr "" -#: build/serializers.py:1473 part/serializers.py:1300 part/serializers.py:1808 +#: build/serializers.py:1473 part/serializers.py:1272 part/serializers.py:1780 msgid "Available Stock" msgstr "" @@ -1588,7 +1588,7 @@ msgstr "משתמש" msgid "Price break quantity" msgstr "" -#: common/models.py:1348 company/serializers.py:564 order/models.py:1842 +#: common/models.py:1348 company/serializers.py:357 order/models.py:1842 #: order/models.py:3043 msgid "Price" msgstr "" @@ -1760,7 +1760,7 @@ msgstr "" msgid "Unit definition" msgstr "" -#: common/models.py:1911 common/models.py:1974 stock/models.py:2967 +#: common/models.py:1911 common/models.py:1974 stock/models.py:2984 #: stock/serializers.py:247 msgid "Attachment" msgstr "קובץ מצורף" @@ -1839,7 +1839,7 @@ msgstr "" #: common/models.py:2090 common/models.py:2329 company/models.py:622 #: machine/serializers.py:27 -#: report/templates/report/inventree_test_report.html:104 stock/models.py:2959 +#: report/templates/report/inventree_test_report.html:104 stock/models.py:2976 msgid "Value" msgstr "" @@ -2048,7 +2048,7 @@ msgid "Response data from the barcode scan" msgstr "" #: common/models.py:2417 report/templates/report/inventree_test_report.html:103 -#: stock/models.py:2953 +#: stock/models.py:2970 msgid "Result" msgstr "" @@ -2141,7 +2141,7 @@ msgid "Linked thread for this message" msgstr "" #: common/models.py:2656 -msgid "Prioriy" +msgid "Priority" msgstr "" #: common/models.py:2698 @@ -2671,8 +2671,8 @@ msgstr "" msgid "Parts can be assembled from other components by default" msgstr "" -#: common/setting/system.py:462 part/models.py:1208 part/serializers.py:1734 -#: part/serializers.py:1741 +#: common/setting/system.py:462 part/models.py:1208 part/serializers.py:1706 +#: part/serializers.py:1713 msgid "Component" msgstr "" @@ -3772,7 +3772,7 @@ msgstr "" msgid "Supplier is Active" msgstr "" -#: company/api.py:307 company/models.py:520 company/serializers.py:457 +#: company/api.py:307 company/models.py:520 company/serializers.py:503 #: part/serializers.py:566 msgid "Manufacturer" msgstr "" @@ -3964,7 +3964,7 @@ msgid "Link to address information (external)" msgstr "" #: company/models.py:492 company/models.py:609 company/models.py:832 -#: company/serializers.py:471 stock/api.py:561 +#: company/serializers.py:517 stock/api.py:561 msgid "Manufacturer Part" msgstr "" @@ -3981,7 +3981,7 @@ msgstr "" msgid "Select manufacturer" msgstr "" -#: company/models.py:527 company/serializers.py:479 order/serializers.py:734 +#: company/models.py:527 company/serializers.py:525 order/serializers.py:734 #: part/serializers.py:576 msgid "MPN" msgstr "" @@ -4030,7 +4030,7 @@ msgstr "" msgid "Linked manufacturer part must reference the same base part" msgstr "" -#: company/models.py:810 company/serializers.py:449 company/serializers.py:467 +#: company/models.py:810 company/serializers.py:495 company/serializers.py:513 #: order/models.py:639 part/serializers.py:550 #: plugin/builtin/suppliers/digikey.py:26 plugin/builtin/suppliers/lcsc.py:27 #: plugin/builtin/suppliers/mouser.py:25 plugin/builtin/suppliers/tme.py:27 @@ -4134,10 +4134,14 @@ msgstr "" msgid "Company Name" msgstr "" -#: company/serializers.py:433 part/serializers.py:955 stock/serializers.py:428 +#: company/serializers.py:467 part/serializers.py:927 stock/serializers.py:428 msgid "In Stock" msgstr "" +#: company/serializers.py:484 +msgid "Price Breaks" +msgstr "" + #: data_exporter/mixins.py:325 data_exporter/mixins.py:403 msgid "Error occurred during data export" msgstr "" @@ -4290,7 +4294,7 @@ msgstr "" msgid "Errors" msgstr "" -#: importer/models.py:550 part/serializers.py:1268 +#: importer/models.py:550 part/serializers.py:1240 msgid "Valid" msgstr "" @@ -5677,7 +5681,7 @@ msgstr "" msgid "Part category" msgstr "" -#: part/models.py:1088 part/serializers.py:929 +#: part/models.py:1088 part/serializers.py:901 #: report/templates/report/inventree_stock_location_report.html:103 msgid "IPN" msgstr "" @@ -5718,7 +5722,7 @@ msgstr "" msgid "Expiry time (in days) for stock items of this part" msgstr "" -#: part/models.py:1186 part/serializers.py:1003 +#: part/models.py:1186 part/serializers.py:975 msgid "Minimum Stock" msgstr "" @@ -6418,203 +6422,203 @@ msgstr "" msgid "Supplier part matching this SKU already exists" msgstr "" -#: part/serializers.py:914 +#: part/serializers.py:886 msgid "Category Name" msgstr "" -#: part/serializers.py:943 +#: part/serializers.py:915 msgid "Building" msgstr "" -#: part/serializers.py:944 +#: part/serializers.py:916 msgid "Quantity of this part currently being in production" msgstr "" -#: part/serializers.py:951 +#: part/serializers.py:923 msgid "Outstanding quantity of this part scheduled to be built" msgstr "" -#: part/serializers.py:971 stock/serializers.py:1019 stock/serializers.py:1189 +#: part/serializers.py:943 stock/serializers.py:1019 stock/serializers.py:1189 #: users/ruleset.py:30 msgid "Stock Items" msgstr "" -#: part/serializers.py:975 +#: part/serializers.py:947 msgid "Revisions" msgstr "" -#: part/serializers.py:979 +#: part/serializers.py:951 msgid "Suppliers" msgstr "" -#: part/serializers.py:983 part/serializers.py:1297 +#: part/serializers.py:955 part/serializers.py:1269 #: templates/email/low_stock_notification.html:16 #: templates/email/part_event_notification.html:17 msgid "Total Stock" msgstr "" -#: part/serializers.py:991 +#: part/serializers.py:963 msgid "Unallocated Stock" msgstr "" -#: part/serializers.py:999 +#: part/serializers.py:971 msgid "Variant Stock" msgstr "" -#: part/serializers.py:1054 +#: part/serializers.py:1026 msgid "Duplicate Part" msgstr "" -#: part/serializers.py:1055 +#: part/serializers.py:1027 msgid "Copy initial data from another Part" msgstr "" -#: part/serializers.py:1061 +#: part/serializers.py:1033 msgid "Initial Stock" msgstr "" -#: part/serializers.py:1062 +#: part/serializers.py:1034 msgid "Create Part with initial stock quantity" msgstr "" -#: part/serializers.py:1068 +#: part/serializers.py:1040 msgid "Supplier Information" msgstr "" -#: part/serializers.py:1069 +#: part/serializers.py:1041 msgid "Add initial supplier information for this part" msgstr "" -#: part/serializers.py:1077 +#: part/serializers.py:1049 msgid "Copy Category Parameters" msgstr "" -#: part/serializers.py:1078 +#: part/serializers.py:1050 msgid "Copy parameter templates from selected part category" msgstr "" -#: part/serializers.py:1083 +#: part/serializers.py:1055 msgid "Existing Image" msgstr "" -#: part/serializers.py:1084 +#: part/serializers.py:1056 msgid "Filename of an existing part image" msgstr "" -#: part/serializers.py:1101 +#: part/serializers.py:1073 msgid "Image file does not exist" msgstr "" -#: part/serializers.py:1269 +#: part/serializers.py:1241 msgid "Validate entire Bill of Materials" msgstr "" -#: part/serializers.py:1303 part/serializers.py:1769 +#: part/serializers.py:1275 part/serializers.py:1741 msgid "Can Build" msgstr "" -#: part/serializers.py:1320 +#: part/serializers.py:1292 msgid "Required for Build Orders" msgstr "" -#: part/serializers.py:1325 +#: part/serializers.py:1297 msgid "Allocated to Build Orders" msgstr "" -#: part/serializers.py:1332 +#: part/serializers.py:1304 msgid "Required for Sales Orders" msgstr "" -#: part/serializers.py:1336 +#: part/serializers.py:1308 msgid "Allocated to Sales Orders" msgstr "" -#: part/serializers.py:1475 +#: part/serializers.py:1447 msgid "Minimum Price" msgstr "" -#: part/serializers.py:1476 +#: part/serializers.py:1448 msgid "Override calculated value for minimum price" msgstr "" -#: part/serializers.py:1483 +#: part/serializers.py:1455 msgid "Minimum price currency" msgstr "" -#: part/serializers.py:1490 +#: part/serializers.py:1462 msgid "Maximum Price" msgstr "" -#: part/serializers.py:1491 +#: part/serializers.py:1463 msgid "Override calculated value for maximum price" msgstr "" -#: part/serializers.py:1498 +#: part/serializers.py:1470 msgid "Maximum price currency" msgstr "" -#: part/serializers.py:1527 +#: part/serializers.py:1499 msgid "Update" msgstr "" -#: part/serializers.py:1528 +#: part/serializers.py:1500 msgid "Update pricing for this part" msgstr "" -#: part/serializers.py:1551 +#: part/serializers.py:1523 #, python-brace-format msgid "Could not convert from provided currencies to {default_currency}" msgstr "" -#: part/serializers.py:1558 +#: part/serializers.py:1530 msgid "Minimum price must not be greater than maximum price" msgstr "" -#: part/serializers.py:1561 +#: part/serializers.py:1533 msgid "Maximum price must not be less than minimum price" msgstr "" -#: part/serializers.py:1715 +#: part/serializers.py:1687 msgid "Select the parent assembly" msgstr "" -#: part/serializers.py:1735 +#: part/serializers.py:1707 msgid "Select the component part" msgstr "" -#: part/serializers.py:1929 +#: part/serializers.py:1901 msgid "Select part to copy BOM from" msgstr "" -#: part/serializers.py:1937 +#: part/serializers.py:1909 msgid "Remove Existing Data" msgstr "" -#: part/serializers.py:1938 +#: part/serializers.py:1910 msgid "Remove existing BOM items before copying" msgstr "" -#: part/serializers.py:1943 +#: part/serializers.py:1915 msgid "Include Inherited" msgstr "" -#: part/serializers.py:1944 +#: part/serializers.py:1916 msgid "Include BOM items which are inherited from templated parts" msgstr "" -#: part/serializers.py:1949 +#: part/serializers.py:1921 msgid "Skip Invalid Rows" msgstr "" -#: part/serializers.py:1950 +#: part/serializers.py:1922 msgid "Enable this option to skip invalid rows" msgstr "" -#: part/serializers.py:1955 +#: part/serializers.py:1927 msgid "Copy Substitute Parts" msgstr "" -#: part/serializers.py:1956 +#: part/serializers.py:1928 msgid "Copy substitute parts when duplicate BOM items" msgstr "" @@ -8455,115 +8459,119 @@ msgstr "" msgid "Quantity does not match serial numbers" msgstr "" -#: stock/models.py:2012 stock/models.py:2917 +#: stock/models.py:1912 +msgid "Cannot assign stock to structural location" +msgstr "" + +#: stock/models.py:2029 stock/models.py:2934 msgid "Test template does not exist" msgstr "" -#: stock/models.py:2030 +#: stock/models.py:2047 msgid "Stock item has been assigned to a sales order" msgstr "" -#: stock/models.py:2034 +#: stock/models.py:2051 msgid "Stock item is installed in another item" msgstr "" -#: stock/models.py:2037 +#: stock/models.py:2054 msgid "Stock item contains other items" msgstr "" -#: stock/models.py:2040 +#: stock/models.py:2057 msgid "Stock item has been assigned to a customer" msgstr "" -#: stock/models.py:2043 stock/models.py:2226 +#: stock/models.py:2060 stock/models.py:2243 msgid "Stock item is currently in production" msgstr "" -#: stock/models.py:2046 +#: stock/models.py:2063 msgid "Serialized stock cannot be merged" msgstr "" -#: stock/models.py:2053 stock/serializers.py:1462 +#: stock/models.py:2070 stock/serializers.py:1462 msgid "Duplicate stock items" msgstr "" -#: stock/models.py:2057 +#: stock/models.py:2074 msgid "Stock items must refer to the same part" msgstr "" -#: stock/models.py:2065 +#: stock/models.py:2082 msgid "Stock items must refer to the same supplier part" msgstr "" -#: stock/models.py:2070 +#: stock/models.py:2087 msgid "Stock status codes must match" msgstr "" -#: stock/models.py:2349 +#: stock/models.py:2366 msgid "StockItem cannot be moved as it is not in stock" msgstr "" -#: stock/models.py:2818 +#: stock/models.py:2835 msgid "Stock Item Tracking" msgstr "" -#: stock/models.py:2849 +#: stock/models.py:2866 msgid "Entry notes" msgstr "" -#: stock/models.py:2889 +#: stock/models.py:2906 msgid "Stock Item Test Result" msgstr "" -#: stock/models.py:2920 +#: stock/models.py:2937 msgid "Value must be provided for this test" msgstr "" -#: stock/models.py:2924 +#: stock/models.py:2941 msgid "Attachment must be uploaded for this test" msgstr "" -#: stock/models.py:2929 +#: stock/models.py:2946 msgid "Invalid value for this test" msgstr "" -#: stock/models.py:2953 +#: stock/models.py:2970 msgid "Test result" msgstr "" -#: stock/models.py:2960 +#: stock/models.py:2977 msgid "Test output value" msgstr "" -#: stock/models.py:2968 stock/serializers.py:248 +#: stock/models.py:2985 stock/serializers.py:248 msgid "Test result attachment" msgstr "" -#: stock/models.py:2972 +#: stock/models.py:2989 msgid "Test notes" msgstr "" -#: stock/models.py:2980 +#: stock/models.py:2997 msgid "Test station" msgstr "" -#: stock/models.py:2981 +#: stock/models.py:2998 msgid "The identifier of the test station where the test was performed" msgstr "" -#: stock/models.py:2987 +#: stock/models.py:3004 msgid "Started" msgstr "" -#: stock/models.py:2988 +#: stock/models.py:3005 msgid "The timestamp of the test start" msgstr "" -#: stock/models.py:2994 +#: stock/models.py:3011 msgid "Finished" msgstr "" -#: stock/models.py:2995 +#: stock/models.py:3012 msgid "The timestamp of the test finish" msgstr "" @@ -8902,83 +8910,87 @@ msgstr "" msgid "Stock manually removed" msgstr "" -#: stock/status_codes.py:57 +#: stock/status_codes.py:56 +msgid "Serialized stock items" +msgstr "" + +#: stock/status_codes.py:58 msgid "Returned to stock" msgstr "" -#: stock/status_codes.py:60 +#: stock/status_codes.py:61 msgid "Location changed" msgstr "מיקום שונה" -#: stock/status_codes.py:61 +#: stock/status_codes.py:62 msgid "Stock updated" msgstr "" -#: stock/status_codes.py:64 +#: stock/status_codes.py:65 msgid "Installed into assembly" msgstr "" -#: stock/status_codes.py:65 +#: stock/status_codes.py:66 msgid "Removed from assembly" msgstr "" -#: stock/status_codes.py:67 +#: stock/status_codes.py:68 msgid "Installed component item" msgstr "" -#: stock/status_codes.py:68 +#: stock/status_codes.py:69 msgid "Removed component item" msgstr "" -#: stock/status_codes.py:71 +#: stock/status_codes.py:72 msgid "Split from parent item" msgstr "" -#: stock/status_codes.py:72 +#: stock/status_codes.py:73 msgid "Split child item" msgstr "" -#: stock/status_codes.py:75 +#: stock/status_codes.py:76 msgid "Merged stock items" msgstr "" -#: stock/status_codes.py:78 +#: stock/status_codes.py:79 msgid "Converted to variant" msgstr "" -#: stock/status_codes.py:81 +#: stock/status_codes.py:82 msgid "Build order output created" msgstr "" -#: stock/status_codes.py:82 +#: stock/status_codes.py:83 msgid "Build order output completed" msgstr "" -#: stock/status_codes.py:83 +#: stock/status_codes.py:84 msgid "Build order output rejected" msgstr "" -#: stock/status_codes.py:84 +#: stock/status_codes.py:85 msgid "Consumed by build order" msgstr "" -#: stock/status_codes.py:87 +#: stock/status_codes.py:88 msgid "Shipped against Sales Order" msgstr "" -#: stock/status_codes.py:90 +#: stock/status_codes.py:91 msgid "Received against Purchase Order" msgstr "" -#: stock/status_codes.py:93 +#: stock/status_codes.py:94 msgid "Returned against Return Order" msgstr "" -#: stock/status_codes.py:96 +#: stock/status_codes.py:97 msgid "Sent to customer" msgstr "נשלח ללקוח" -#: stock/status_codes.py:97 +#: stock/status_codes.py:98 msgid "Returned from customer" msgstr "הוחזר מלקוח" diff --git a/src/backend/InvenTree/locale/hi/LC_MESSAGES/django.po b/src/backend/InvenTree/locale/hi/LC_MESSAGES/django.po index ce18ceb12d..515d6e858d 100644 --- a/src/backend/InvenTree/locale/hi/LC_MESSAGES/django.po +++ b/src/backend/InvenTree/locale/hi/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: inventree\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-11-19 04:55+0000\n" -"PO-Revision-Date: 2025-11-19 04:59\n" +"POT-Creation-Date: 2025-11-24 06:50+0000\n" +"PO-Revision-Date: 2025-11-24 06:54\n" "Last-Translator: \n" "Language-Team: Hindi\n" "Language: hi_IN\n" @@ -81,21 +81,21 @@ msgstr "" msgid "The provided email domain is not approved." msgstr "" -#: InvenTree/conversion.py:166 +#: InvenTree/conversion.py:240 #, python-brace-format msgid "Invalid unit provided ({unit})" msgstr "" -#: InvenTree/conversion.py:183 +#: InvenTree/conversion.py:257 msgid "No value provided" msgstr "" -#: InvenTree/conversion.py:210 +#: InvenTree/conversion.py:284 #, python-brace-format msgid "Could not convert {original} to {unit}" msgstr "" -#: InvenTree/conversion.py:212 InvenTree/conversion.py:226 +#: InvenTree/conversion.py:286 InvenTree/conversion.py:300 #: InvenTree/helpers.py:597 order/models.py:720 order/models.py:1015 msgid "Invalid quantity provided" msgstr "" @@ -116,7 +116,7 @@ msgstr "" #: build/serializers.py:580 build/serializers.py:1788 company/models.py:857 #: order/models.py:1780 #: report/templates/report/inventree_build_order_report.html:172 -#: stock/models.py:2848 stock/models.py:2972 stock/serializers.py:717 +#: stock/models.py:2865 stock/models.py:2989 stock/serializers.py:717 #: stock/serializers.py:893 stock/serializers.py:1035 stock/serializers.py:1336 #: stock/serializers.py:1425 stock/serializers.py:1624 msgid "Notes" @@ -345,7 +345,7 @@ msgstr "" msgid "Currency" msgstr "" -#: InvenTree/serializers.py:298 part/serializers.py:1385 +#: InvenTree/serializers.py:298 part/serializers.py:1357 msgid "Select currency from available options" msgstr "" @@ -553,14 +553,14 @@ msgstr "" #: build/api.py:100 build/api.py:466 build/api.py:845 build/models.py:270 #: build/serializers.py:1225 build/serializers.py:1356 -#: build/serializers.py:1427 company/models.py:1067 company/serializers.py:445 +#: build/serializers.py:1427 company/models.py:1067 company/serializers.py:491 #: order/api.py:298 order/api.py:302 order/api.py:929 order/api.py:1187 #: order/api.py:1190 order/models.py:1941 order/models.py:2108 #: order/models.py:2109 part/api.py:1233 part/api.py:1236 part/api.py:1302 #: part/api.py:1589 part/models.py:472 part/models.py:3296 part/models.py:3439 #: part/models.py:3497 part/models.py:3518 part/models.py:3540 #: part/models.py:3679 part/models.py:4046 part/models.py:4368 -#: part/models.py:4787 part/serializers.py:1928 +#: part/models.py:4787 part/serializers.py:1900 #: report/templates/report/inventree_bill_of_materials_report.html:110 #: report/templates/report/inventree_bill_of_materials_report.html:137 #: report/templates/report/inventree_build_order_report.html:109 @@ -582,7 +582,7 @@ msgstr "" #: build/api.py:120 build/api.py:123 build/serializers.py:1438 part/api.py:980 #: part/api.py:1316 part/api.py:1600 part/models.py:1080 part/models.py:3568 -#: part/models.py:4162 part/serializers.py:1752 stock/api.py:869 +#: part/models.py:4162 part/serializers.py:1724 stock/api.py:869 msgid "Category" msgstr "" @@ -663,7 +663,7 @@ msgid "Optional" msgstr "" #: build/api.py:455 build/serializers.py:1415 common/setting/system.py:456 -#: part/models.py:1202 part/serializers.py:1714 part/serializers.py:1725 +#: part/models.py:1202 part/serializers.py:1686 part/serializers.py:1697 #: stock/api.py:639 msgid "Assembly" msgstr "" @@ -688,16 +688,16 @@ msgstr "" msgid "Consumed" msgstr "" -#: build/api.py:499 company/models.py:912 company/serializers.py:440 +#: build/api.py:499 company/models.py:912 company/serializers.py:474 #: templates/email/build_order_required_stock.html:19 #: templates/email/low_stock_notification.html:17 #: templates/email/part_event_notification.html:18 msgid "Available" msgstr "" -#: build/api.py:523 build/serializers.py:1466 company/serializers.py:437 -#: order/serializers.py:1281 part/serializers.py:959 part/serializers.py:1306 -#: part/serializers.py:1761 +#: build/api.py:523 build/serializers.py:1466 company/serializers.py:471 +#: order/serializers.py:1281 part/serializers.py:931 part/serializers.py:1278 +#: part/serializers.py:1733 msgid "On Order" msgstr "" @@ -963,7 +963,7 @@ msgstr "" #: build/models.py:1136 build/models.py:1234 build/serializers.py:285 #: build/serializers.py:335 build/serializers.py:965 build/serializers.py:1739 #: order/models.py:717 order/serializers.py:658 order/serializers.py:844 -#: part/serializers.py:1708 stock/models.py:940 stock/models.py:1430 +#: part/serializers.py:1680 stock/models.py:940 stock/models.py:1430 #: stock/models.py:1878 stock/serializers.py:688 stock/serializers.py:1580 msgid "Quantity must be greater than zero" msgstr "" @@ -1385,20 +1385,20 @@ msgstr "" msgid "BOM Item" msgstr "" -#: build/serializers.py:1467 order/serializers.py:1282 part/serializers.py:1310 -#: part/serializers.py:1765 +#: build/serializers.py:1467 order/serializers.py:1282 part/serializers.py:1282 +#: part/serializers.py:1737 msgid "In Production" msgstr "" -#: build/serializers.py:1469 part/serializers.py:950 part/serializers.py:1314 +#: build/serializers.py:1469 part/serializers.py:922 part/serializers.py:1286 msgid "Scheduled to Build" msgstr "" -#: build/serializers.py:1472 part/serializers.py:987 +#: build/serializers.py:1472 part/serializers.py:959 msgid "External Stock" msgstr "" -#: build/serializers.py:1473 part/serializers.py:1300 part/serializers.py:1808 +#: build/serializers.py:1473 part/serializers.py:1272 part/serializers.py:1780 msgid "Available Stock" msgstr "" @@ -1588,7 +1588,7 @@ msgstr "" msgid "Price break quantity" msgstr "" -#: common/models.py:1348 company/serializers.py:564 order/models.py:1842 +#: common/models.py:1348 company/serializers.py:357 order/models.py:1842 #: order/models.py:3043 msgid "Price" msgstr "" @@ -1760,7 +1760,7 @@ msgstr "" msgid "Unit definition" msgstr "" -#: common/models.py:1911 common/models.py:1974 stock/models.py:2967 +#: common/models.py:1911 common/models.py:1974 stock/models.py:2984 #: stock/serializers.py:247 msgid "Attachment" msgstr "" @@ -1839,7 +1839,7 @@ msgstr "" #: common/models.py:2090 common/models.py:2329 company/models.py:622 #: machine/serializers.py:27 -#: report/templates/report/inventree_test_report.html:104 stock/models.py:2959 +#: report/templates/report/inventree_test_report.html:104 stock/models.py:2976 msgid "Value" msgstr "" @@ -2048,7 +2048,7 @@ msgid "Response data from the barcode scan" msgstr "" #: common/models.py:2417 report/templates/report/inventree_test_report.html:103 -#: stock/models.py:2953 +#: stock/models.py:2970 msgid "Result" msgstr "" @@ -2141,7 +2141,7 @@ msgid "Linked thread for this message" msgstr "" #: common/models.py:2656 -msgid "Prioriy" +msgid "Priority" msgstr "" #: common/models.py:2698 @@ -2671,8 +2671,8 @@ msgstr "" msgid "Parts can be assembled from other components by default" msgstr "" -#: common/setting/system.py:462 part/models.py:1208 part/serializers.py:1734 -#: part/serializers.py:1741 +#: common/setting/system.py:462 part/models.py:1208 part/serializers.py:1706 +#: part/serializers.py:1713 msgid "Component" msgstr "" @@ -3772,7 +3772,7 @@ msgstr "" msgid "Supplier is Active" msgstr "" -#: company/api.py:307 company/models.py:520 company/serializers.py:457 +#: company/api.py:307 company/models.py:520 company/serializers.py:503 #: part/serializers.py:566 msgid "Manufacturer" msgstr "" @@ -3964,7 +3964,7 @@ msgid "Link to address information (external)" msgstr "" #: company/models.py:492 company/models.py:609 company/models.py:832 -#: company/serializers.py:471 stock/api.py:561 +#: company/serializers.py:517 stock/api.py:561 msgid "Manufacturer Part" msgstr "" @@ -3981,7 +3981,7 @@ msgstr "" msgid "Select manufacturer" msgstr "" -#: company/models.py:527 company/serializers.py:479 order/serializers.py:734 +#: company/models.py:527 company/serializers.py:525 order/serializers.py:734 #: part/serializers.py:576 msgid "MPN" msgstr "" @@ -4030,7 +4030,7 @@ msgstr "" msgid "Linked manufacturer part must reference the same base part" msgstr "" -#: company/models.py:810 company/serializers.py:449 company/serializers.py:467 +#: company/models.py:810 company/serializers.py:495 company/serializers.py:513 #: order/models.py:639 part/serializers.py:550 #: plugin/builtin/suppliers/digikey.py:26 plugin/builtin/suppliers/lcsc.py:27 #: plugin/builtin/suppliers/mouser.py:25 plugin/builtin/suppliers/tme.py:27 @@ -4134,10 +4134,14 @@ msgstr "" msgid "Company Name" msgstr "" -#: company/serializers.py:433 part/serializers.py:955 stock/serializers.py:428 +#: company/serializers.py:467 part/serializers.py:927 stock/serializers.py:428 msgid "In Stock" msgstr "" +#: company/serializers.py:484 +msgid "Price Breaks" +msgstr "" + #: data_exporter/mixins.py:325 data_exporter/mixins.py:403 msgid "Error occurred during data export" msgstr "" @@ -4290,7 +4294,7 @@ msgstr "" msgid "Errors" msgstr "" -#: importer/models.py:550 part/serializers.py:1268 +#: importer/models.py:550 part/serializers.py:1240 msgid "Valid" msgstr "" @@ -5677,7 +5681,7 @@ msgstr "" msgid "Part category" msgstr "" -#: part/models.py:1088 part/serializers.py:929 +#: part/models.py:1088 part/serializers.py:901 #: report/templates/report/inventree_stock_location_report.html:103 msgid "IPN" msgstr "" @@ -5718,7 +5722,7 @@ msgstr "" msgid "Expiry time (in days) for stock items of this part" msgstr "" -#: part/models.py:1186 part/serializers.py:1003 +#: part/models.py:1186 part/serializers.py:975 msgid "Minimum Stock" msgstr "" @@ -6418,203 +6422,203 @@ msgstr "" msgid "Supplier part matching this SKU already exists" msgstr "" -#: part/serializers.py:914 +#: part/serializers.py:886 msgid "Category Name" msgstr "" -#: part/serializers.py:943 +#: part/serializers.py:915 msgid "Building" msgstr "" -#: part/serializers.py:944 +#: part/serializers.py:916 msgid "Quantity of this part currently being in production" msgstr "" -#: part/serializers.py:951 +#: part/serializers.py:923 msgid "Outstanding quantity of this part scheduled to be built" msgstr "" -#: part/serializers.py:971 stock/serializers.py:1019 stock/serializers.py:1189 +#: part/serializers.py:943 stock/serializers.py:1019 stock/serializers.py:1189 #: users/ruleset.py:30 msgid "Stock Items" msgstr "" -#: part/serializers.py:975 +#: part/serializers.py:947 msgid "Revisions" msgstr "" -#: part/serializers.py:979 +#: part/serializers.py:951 msgid "Suppliers" msgstr "" -#: part/serializers.py:983 part/serializers.py:1297 +#: part/serializers.py:955 part/serializers.py:1269 #: templates/email/low_stock_notification.html:16 #: templates/email/part_event_notification.html:17 msgid "Total Stock" msgstr "" -#: part/serializers.py:991 +#: part/serializers.py:963 msgid "Unallocated Stock" msgstr "" -#: part/serializers.py:999 +#: part/serializers.py:971 msgid "Variant Stock" msgstr "" -#: part/serializers.py:1054 +#: part/serializers.py:1026 msgid "Duplicate Part" msgstr "" -#: part/serializers.py:1055 +#: part/serializers.py:1027 msgid "Copy initial data from another Part" msgstr "" -#: part/serializers.py:1061 +#: part/serializers.py:1033 msgid "Initial Stock" msgstr "" -#: part/serializers.py:1062 +#: part/serializers.py:1034 msgid "Create Part with initial stock quantity" msgstr "" -#: part/serializers.py:1068 +#: part/serializers.py:1040 msgid "Supplier Information" msgstr "" -#: part/serializers.py:1069 +#: part/serializers.py:1041 msgid "Add initial supplier information for this part" msgstr "" -#: part/serializers.py:1077 +#: part/serializers.py:1049 msgid "Copy Category Parameters" msgstr "" -#: part/serializers.py:1078 +#: part/serializers.py:1050 msgid "Copy parameter templates from selected part category" msgstr "" -#: part/serializers.py:1083 +#: part/serializers.py:1055 msgid "Existing Image" msgstr "" -#: part/serializers.py:1084 +#: part/serializers.py:1056 msgid "Filename of an existing part image" msgstr "" -#: part/serializers.py:1101 +#: part/serializers.py:1073 msgid "Image file does not exist" msgstr "" -#: part/serializers.py:1269 +#: part/serializers.py:1241 msgid "Validate entire Bill of Materials" msgstr "" -#: part/serializers.py:1303 part/serializers.py:1769 +#: part/serializers.py:1275 part/serializers.py:1741 msgid "Can Build" msgstr "" -#: part/serializers.py:1320 +#: part/serializers.py:1292 msgid "Required for Build Orders" msgstr "" -#: part/serializers.py:1325 +#: part/serializers.py:1297 msgid "Allocated to Build Orders" msgstr "" -#: part/serializers.py:1332 +#: part/serializers.py:1304 msgid "Required for Sales Orders" msgstr "" -#: part/serializers.py:1336 +#: part/serializers.py:1308 msgid "Allocated to Sales Orders" msgstr "" -#: part/serializers.py:1475 +#: part/serializers.py:1447 msgid "Minimum Price" msgstr "" -#: part/serializers.py:1476 +#: part/serializers.py:1448 msgid "Override calculated value for minimum price" msgstr "" -#: part/serializers.py:1483 +#: part/serializers.py:1455 msgid "Minimum price currency" msgstr "" -#: part/serializers.py:1490 +#: part/serializers.py:1462 msgid "Maximum Price" msgstr "" -#: part/serializers.py:1491 +#: part/serializers.py:1463 msgid "Override calculated value for maximum price" msgstr "" -#: part/serializers.py:1498 +#: part/serializers.py:1470 msgid "Maximum price currency" msgstr "" -#: part/serializers.py:1527 +#: part/serializers.py:1499 msgid "Update" msgstr "" -#: part/serializers.py:1528 +#: part/serializers.py:1500 msgid "Update pricing for this part" msgstr "" -#: part/serializers.py:1551 +#: part/serializers.py:1523 #, python-brace-format msgid "Could not convert from provided currencies to {default_currency}" msgstr "" -#: part/serializers.py:1558 +#: part/serializers.py:1530 msgid "Minimum price must not be greater than maximum price" msgstr "" -#: part/serializers.py:1561 +#: part/serializers.py:1533 msgid "Maximum price must not be less than minimum price" msgstr "" -#: part/serializers.py:1715 +#: part/serializers.py:1687 msgid "Select the parent assembly" msgstr "" -#: part/serializers.py:1735 +#: part/serializers.py:1707 msgid "Select the component part" msgstr "" -#: part/serializers.py:1929 +#: part/serializers.py:1901 msgid "Select part to copy BOM from" msgstr "" -#: part/serializers.py:1937 +#: part/serializers.py:1909 msgid "Remove Existing Data" msgstr "" -#: part/serializers.py:1938 +#: part/serializers.py:1910 msgid "Remove existing BOM items before copying" msgstr "" -#: part/serializers.py:1943 +#: part/serializers.py:1915 msgid "Include Inherited" msgstr "" -#: part/serializers.py:1944 +#: part/serializers.py:1916 msgid "Include BOM items which are inherited from templated parts" msgstr "" -#: part/serializers.py:1949 +#: part/serializers.py:1921 msgid "Skip Invalid Rows" msgstr "" -#: part/serializers.py:1950 +#: part/serializers.py:1922 msgid "Enable this option to skip invalid rows" msgstr "" -#: part/serializers.py:1955 +#: part/serializers.py:1927 msgid "Copy Substitute Parts" msgstr "" -#: part/serializers.py:1956 +#: part/serializers.py:1928 msgid "Copy substitute parts when duplicate BOM items" msgstr "" @@ -8455,115 +8459,119 @@ msgstr "" msgid "Quantity does not match serial numbers" msgstr "" -#: stock/models.py:2012 stock/models.py:2917 +#: stock/models.py:1912 +msgid "Cannot assign stock to structural location" +msgstr "" + +#: stock/models.py:2029 stock/models.py:2934 msgid "Test template does not exist" msgstr "" -#: stock/models.py:2030 +#: stock/models.py:2047 msgid "Stock item has been assigned to a sales order" msgstr "" -#: stock/models.py:2034 +#: stock/models.py:2051 msgid "Stock item is installed in another item" msgstr "" -#: stock/models.py:2037 +#: stock/models.py:2054 msgid "Stock item contains other items" msgstr "" -#: stock/models.py:2040 +#: stock/models.py:2057 msgid "Stock item has been assigned to a customer" msgstr "" -#: stock/models.py:2043 stock/models.py:2226 +#: stock/models.py:2060 stock/models.py:2243 msgid "Stock item is currently in production" msgstr "" -#: stock/models.py:2046 +#: stock/models.py:2063 msgid "Serialized stock cannot be merged" msgstr "" -#: stock/models.py:2053 stock/serializers.py:1462 +#: stock/models.py:2070 stock/serializers.py:1462 msgid "Duplicate stock items" msgstr "" -#: stock/models.py:2057 +#: stock/models.py:2074 msgid "Stock items must refer to the same part" msgstr "" -#: stock/models.py:2065 +#: stock/models.py:2082 msgid "Stock items must refer to the same supplier part" msgstr "" -#: stock/models.py:2070 +#: stock/models.py:2087 msgid "Stock status codes must match" msgstr "" -#: stock/models.py:2349 +#: stock/models.py:2366 msgid "StockItem cannot be moved as it is not in stock" msgstr "" -#: stock/models.py:2818 +#: stock/models.py:2835 msgid "Stock Item Tracking" msgstr "" -#: stock/models.py:2849 +#: stock/models.py:2866 msgid "Entry notes" msgstr "" -#: stock/models.py:2889 +#: stock/models.py:2906 msgid "Stock Item Test Result" msgstr "" -#: stock/models.py:2920 +#: stock/models.py:2937 msgid "Value must be provided for this test" msgstr "" -#: stock/models.py:2924 +#: stock/models.py:2941 msgid "Attachment must be uploaded for this test" msgstr "" -#: stock/models.py:2929 +#: stock/models.py:2946 msgid "Invalid value for this test" msgstr "" -#: stock/models.py:2953 +#: stock/models.py:2970 msgid "Test result" msgstr "" -#: stock/models.py:2960 +#: stock/models.py:2977 msgid "Test output value" msgstr "" -#: stock/models.py:2968 stock/serializers.py:248 +#: stock/models.py:2985 stock/serializers.py:248 msgid "Test result attachment" msgstr "" -#: stock/models.py:2972 +#: stock/models.py:2989 msgid "Test notes" msgstr "" -#: stock/models.py:2980 +#: stock/models.py:2997 msgid "Test station" msgstr "" -#: stock/models.py:2981 +#: stock/models.py:2998 msgid "The identifier of the test station where the test was performed" msgstr "" -#: stock/models.py:2987 +#: stock/models.py:3004 msgid "Started" msgstr "" -#: stock/models.py:2988 +#: stock/models.py:3005 msgid "The timestamp of the test start" msgstr "" -#: stock/models.py:2994 +#: stock/models.py:3011 msgid "Finished" msgstr "" -#: stock/models.py:2995 +#: stock/models.py:3012 msgid "The timestamp of the test finish" msgstr "" @@ -8902,83 +8910,87 @@ msgstr "" msgid "Stock manually removed" msgstr "" -#: stock/status_codes.py:57 +#: stock/status_codes.py:56 +msgid "Serialized stock items" +msgstr "" + +#: stock/status_codes.py:58 msgid "Returned to stock" msgstr "" -#: stock/status_codes.py:60 +#: stock/status_codes.py:61 msgid "Location changed" msgstr "" -#: stock/status_codes.py:61 +#: stock/status_codes.py:62 msgid "Stock updated" msgstr "" -#: stock/status_codes.py:64 +#: stock/status_codes.py:65 msgid "Installed into assembly" msgstr "" -#: stock/status_codes.py:65 +#: stock/status_codes.py:66 msgid "Removed from assembly" msgstr "" -#: stock/status_codes.py:67 +#: stock/status_codes.py:68 msgid "Installed component item" msgstr "" -#: stock/status_codes.py:68 +#: stock/status_codes.py:69 msgid "Removed component item" msgstr "" -#: stock/status_codes.py:71 +#: stock/status_codes.py:72 msgid "Split from parent item" msgstr "" -#: stock/status_codes.py:72 +#: stock/status_codes.py:73 msgid "Split child item" msgstr "" -#: stock/status_codes.py:75 +#: stock/status_codes.py:76 msgid "Merged stock items" msgstr "" -#: stock/status_codes.py:78 +#: stock/status_codes.py:79 msgid "Converted to variant" msgstr "" -#: stock/status_codes.py:81 +#: stock/status_codes.py:82 msgid "Build order output created" msgstr "" -#: stock/status_codes.py:82 +#: stock/status_codes.py:83 msgid "Build order output completed" msgstr "" -#: stock/status_codes.py:83 +#: stock/status_codes.py:84 msgid "Build order output rejected" msgstr "" -#: stock/status_codes.py:84 +#: stock/status_codes.py:85 msgid "Consumed by build order" msgstr "" -#: stock/status_codes.py:87 +#: stock/status_codes.py:88 msgid "Shipped against Sales Order" msgstr "" -#: stock/status_codes.py:90 +#: stock/status_codes.py:91 msgid "Received against Purchase Order" msgstr "" -#: stock/status_codes.py:93 +#: stock/status_codes.py:94 msgid "Returned against Return Order" msgstr "" -#: stock/status_codes.py:96 +#: stock/status_codes.py:97 msgid "Sent to customer" msgstr "" -#: stock/status_codes.py:97 +#: stock/status_codes.py:98 msgid "Returned from customer" msgstr "" diff --git a/src/backend/InvenTree/locale/hu/LC_MESSAGES/django.po b/src/backend/InvenTree/locale/hu/LC_MESSAGES/django.po index fc4ccc8334..ebe6c17f7b 100644 --- a/src/backend/InvenTree/locale/hu/LC_MESSAGES/django.po +++ b/src/backend/InvenTree/locale/hu/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: inventree\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-11-19 04:55+0000\n" -"PO-Revision-Date: 2025-11-19 04:59\n" +"POT-Creation-Date: 2025-11-24 06:50+0000\n" +"PO-Revision-Date: 2025-11-24 06:54\n" "Last-Translator: \n" "Language-Team: Hungarian\n" "Language: hu_HU\n" @@ -81,21 +81,21 @@ msgstr "A megadott elsődleges email cím nem valós." msgid "The provided email domain is not approved." msgstr "A megadott email domain nincs jóváhagyva." -#: InvenTree/conversion.py:166 +#: InvenTree/conversion.py:240 #, python-brace-format msgid "Invalid unit provided ({unit})" msgstr "Érvénytelen mennyiségi egység ({unit})" -#: InvenTree/conversion.py:183 +#: InvenTree/conversion.py:257 msgid "No value provided" msgstr "Nincs érték megadva" -#: InvenTree/conversion.py:210 +#: InvenTree/conversion.py:284 #, python-brace-format msgid "Could not convert {original} to {unit}" msgstr "{original} átváltása {unit}-ra sikertelen" -#: InvenTree/conversion.py:212 InvenTree/conversion.py:226 +#: InvenTree/conversion.py:286 InvenTree/conversion.py:300 #: InvenTree/helpers.py:597 order/models.py:720 order/models.py:1015 msgid "Invalid quantity provided" msgstr "Nem megfelelő mennyiség" @@ -116,7 +116,7 @@ msgstr "Érvénytelen decimális érték" #: build/serializers.py:580 build/serializers.py:1788 company/models.py:857 #: order/models.py:1780 #: report/templates/report/inventree_build_order_report.html:172 -#: stock/models.py:2848 stock/models.py:2972 stock/serializers.py:717 +#: stock/models.py:2865 stock/models.py:2989 stock/serializers.py:717 #: stock/serializers.py:893 stock/serializers.py:1035 stock/serializers.py:1336 #: stock/serializers.py:1425 stock/serializers.py:1624 msgid "Notes" @@ -345,7 +345,7 @@ msgstr "Érvényes számnak kell lennie" msgid "Currency" msgstr "Pénznem" -#: InvenTree/serializers.py:298 part/serializers.py:1385 +#: InvenTree/serializers.py:298 part/serializers.py:1357 msgid "Select currency from available options" msgstr "Válassz pénznemet a lehetőségek közül" @@ -553,14 +553,14 @@ msgstr "Változatokkal együtt" #: build/api.py:100 build/api.py:466 build/api.py:845 build/models.py:270 #: build/serializers.py:1225 build/serializers.py:1356 -#: build/serializers.py:1427 company/models.py:1067 company/serializers.py:445 +#: build/serializers.py:1427 company/models.py:1067 company/serializers.py:491 #: order/api.py:298 order/api.py:302 order/api.py:929 order/api.py:1187 #: order/api.py:1190 order/models.py:1941 order/models.py:2108 #: order/models.py:2109 part/api.py:1233 part/api.py:1236 part/api.py:1302 #: part/api.py:1589 part/models.py:472 part/models.py:3296 part/models.py:3439 #: part/models.py:3497 part/models.py:3518 part/models.py:3540 #: part/models.py:3679 part/models.py:4046 part/models.py:4368 -#: part/models.py:4787 part/serializers.py:1928 +#: part/models.py:4787 part/serializers.py:1900 #: report/templates/report/inventree_bill_of_materials_report.html:110 #: report/templates/report/inventree_bill_of_materials_report.html:137 #: report/templates/report/inventree_build_order_report.html:109 @@ -582,7 +582,7 @@ msgstr "Alkatrész" #: build/api.py:120 build/api.py:123 build/serializers.py:1438 part/api.py:980 #: part/api.py:1316 part/api.py:1600 part/models.py:1080 part/models.py:3568 -#: part/models.py:4162 part/serializers.py:1752 stock/api.py:869 +#: part/models.py:4162 part/serializers.py:1724 stock/api.py:869 msgid "Category" msgstr "Kategória" @@ -663,7 +663,7 @@ msgid "Optional" msgstr "Opcionális" #: build/api.py:455 build/serializers.py:1415 common/setting/system.py:456 -#: part/models.py:1202 part/serializers.py:1714 part/serializers.py:1725 +#: part/models.py:1202 part/serializers.py:1686 part/serializers.py:1697 #: stock/api.py:639 msgid "Assembly" msgstr "Gyártmány" @@ -688,16 +688,16 @@ msgstr "Lefoglalva" msgid "Consumed" msgstr "Felhasználva" -#: build/api.py:499 company/models.py:912 company/serializers.py:440 +#: build/api.py:499 company/models.py:912 company/serializers.py:474 #: templates/email/build_order_required_stock.html:19 #: templates/email/low_stock_notification.html:17 #: templates/email/part_event_notification.html:18 msgid "Available" msgstr "Elérhető" -#: build/api.py:523 build/serializers.py:1466 company/serializers.py:437 -#: order/serializers.py:1281 part/serializers.py:959 part/serializers.py:1306 -#: part/serializers.py:1761 +#: build/api.py:523 build/serializers.py:1466 company/serializers.py:471 +#: order/serializers.py:1281 part/serializers.py:931 part/serializers.py:1278 +#: part/serializers.py:1733 msgid "On Order" msgstr "Rendelve" @@ -963,7 +963,7 @@ msgstr "Gyártási kimenet nem egyezik a gyártási utasítással" #: build/models.py:1136 build/models.py:1234 build/serializers.py:285 #: build/serializers.py:335 build/serializers.py:965 build/serializers.py:1739 #: order/models.py:717 order/serializers.py:658 order/serializers.py:844 -#: part/serializers.py:1708 stock/models.py:940 stock/models.py:1430 +#: part/serializers.py:1680 stock/models.py:940 stock/models.py:1430 #: stock/models.py:1878 stock/serializers.py:688 stock/serializers.py:1580 msgid "Quantity must be greater than zero" msgstr "Mennyiségnek nullánál többnek kell lennie" @@ -1386,20 +1386,20 @@ msgstr "Változatok" msgid "BOM Item" msgstr "Alkatrészjegyzék tétel" -#: build/serializers.py:1467 order/serializers.py:1282 part/serializers.py:1310 -#: part/serializers.py:1765 +#: build/serializers.py:1467 order/serializers.py:1282 part/serializers.py:1282 +#: part/serializers.py:1737 msgid "In Production" msgstr "Gyártásban" -#: build/serializers.py:1469 part/serializers.py:950 part/serializers.py:1314 +#: build/serializers.py:1469 part/serializers.py:922 part/serializers.py:1286 msgid "Scheduled to Build" msgstr "Gyártás Ütemezve" -#: build/serializers.py:1472 part/serializers.py:987 +#: build/serializers.py:1472 part/serializers.py:959 msgid "External Stock" msgstr "Külső raktárkészlet" -#: build/serializers.py:1473 part/serializers.py:1300 part/serializers.py:1808 +#: build/serializers.py:1473 part/serializers.py:1272 part/serializers.py:1780 msgid "Available Stock" msgstr "Elérhető készlet" @@ -1589,7 +1589,7 @@ msgstr "Felhasználó" msgid "Price break quantity" msgstr "Ársáv mennyiség" -#: common/models.py:1348 company/serializers.py:564 order/models.py:1842 +#: common/models.py:1348 company/serializers.py:357 order/models.py:1842 #: order/models.py:3043 msgid "Price" msgstr "Ár" @@ -1761,7 +1761,7 @@ msgstr "Definíció" msgid "Unit definition" msgstr "Mértékegység definíció" -#: common/models.py:1911 common/models.py:1974 stock/models.py:2967 +#: common/models.py:1911 common/models.py:1974 stock/models.py:2984 #: stock/serializers.py:247 msgid "Attachment" msgstr "Melléklet" @@ -1840,7 +1840,7 @@ msgstr "Az állapot logikai kulcsa amely megegyezik az üzleti logika egyedi ál #: common/models.py:2090 common/models.py:2329 company/models.py:622 #: machine/serializers.py:27 -#: report/templates/report/inventree_test_report.html:104 stock/models.py:2959 +#: report/templates/report/inventree_test_report.html:104 stock/models.py:2976 msgid "Value" msgstr "Érték" @@ -2049,7 +2049,7 @@ msgid "Response data from the barcode scan" msgstr "Vonalkód olvasó válasz adat" #: common/models.py:2417 report/templates/report/inventree_test_report.html:103 -#: stock/models.py:2953 +#: stock/models.py:2970 msgid "Result" msgstr "Eredmény" @@ -2142,8 +2142,8 @@ msgid "Linked thread for this message" msgstr "Ehhez az üzenethez kapcsolódó üzenet-lánc" #: common/models.py:2656 -msgid "Prioriy" -msgstr "Prioritás" +msgid "Priority" +msgstr "" #: common/models.py:2698 msgid "Email Thread" @@ -2672,8 +2672,8 @@ msgstr "Alkatrészek alapból sablon alkatrészek legyenek" msgid "Parts can be assembled from other components by default" msgstr "Alkatrészeket alapból lehessen gyártani másik alkatrészekből" -#: common/setting/system.py:462 part/models.py:1208 part/serializers.py:1734 -#: part/serializers.py:1741 +#: common/setting/system.py:462 part/models.py:1208 part/serializers.py:1706 +#: part/serializers.py:1713 msgid "Component" msgstr "Összetevő" @@ -3773,7 +3773,7 @@ msgstr "A saját alkatrész Aktív" msgid "Supplier is Active" msgstr "A Beszállító Aktív" -#: company/api.py:307 company/models.py:520 company/serializers.py:457 +#: company/api.py:307 company/models.py:520 company/serializers.py:503 #: part/serializers.py:566 msgid "Manufacturer" msgstr "Gyártó" @@ -3965,7 +3965,7 @@ msgid "Link to address information (external)" msgstr "Link a címinformációkhoz (külső)" #: company/models.py:492 company/models.py:609 company/models.py:832 -#: company/serializers.py:471 stock/api.py:561 +#: company/serializers.py:517 stock/api.py:561 msgid "Manufacturer Part" msgstr "Gyártói alkatrész" @@ -3982,7 +3982,7 @@ msgstr "Válassz alkatrészt" msgid "Select manufacturer" msgstr "Gyártó kiválasztása" -#: company/models.py:527 company/serializers.py:479 order/serializers.py:734 +#: company/models.py:527 company/serializers.py:525 order/serializers.py:734 #: part/serializers.py:576 msgid "MPN" msgstr "MPN (Gyártói cikkszám)" @@ -4031,7 +4031,7 @@ msgstr "Csomagolási mennyiségnek nullánál többnek kell lennie" msgid "Linked manufacturer part must reference the same base part" msgstr "Kapcsolódó gyártói alkatrésznek ugyanarra a kiindulási alkatrészre kell hivatkoznia" -#: company/models.py:810 company/serializers.py:449 company/serializers.py:467 +#: company/models.py:810 company/serializers.py:495 company/serializers.py:513 #: order/models.py:639 part/serializers.py:550 #: plugin/builtin/suppliers/digikey.py:26 plugin/builtin/suppliers/lcsc.py:27 #: plugin/builtin/suppliers/mouser.py:25 plugin/builtin/suppliers/tme.py:27 @@ -4135,10 +4135,14 @@ msgstr "Beszállító által használt alapértelmezett pénznem" msgid "Company Name" msgstr "Cégnév" -#: company/serializers.py:433 part/serializers.py:955 stock/serializers.py:428 +#: company/serializers.py:467 part/serializers.py:927 stock/serializers.py:428 msgid "In Stock" msgstr "Készleten" +#: company/serializers.py:484 +msgid "Price Breaks" +msgstr "" + #: data_exporter/mixins.py:325 data_exporter/mixins.py:403 msgid "Error occurred during data export" msgstr "Hiba történt adatexportálás közben" @@ -4291,7 +4295,7 @@ msgstr "Eredeti sor adat" msgid "Errors" msgstr "Hibák" -#: importer/models.py:550 part/serializers.py:1268 +#: importer/models.py:550 part/serializers.py:1240 msgid "Valid" msgstr "Érvényes" @@ -5678,7 +5682,7 @@ msgstr "Alkatrész kulcsszavak amik segítik a megjelenést a keresési eredmén msgid "Part category" msgstr "Alkatrész kategória" -#: part/models.py:1088 part/serializers.py:929 +#: part/models.py:1088 part/serializers.py:901 #: report/templates/report/inventree_stock_location_report.html:103 msgid "IPN" msgstr "IPN (Belső Cikkszám)" @@ -5719,7 +5723,7 @@ msgstr "Alapértelmezett lejárat" msgid "Expiry time (in days) for stock items of this part" msgstr "Lejárati idő (napban) ennek az alkatrésznek a készleteire" -#: part/models.py:1186 part/serializers.py:1003 +#: part/models.py:1186 part/serializers.py:975 msgid "Minimum Stock" msgstr "Minimális készlet" @@ -6419,203 +6423,203 @@ msgstr "Van már ilyen gyártói alkatrész" msgid "Supplier part matching this SKU already exists" msgstr "Van már ilyen beszállítói alkatrész" -#: part/serializers.py:914 +#: part/serializers.py:886 msgid "Category Name" msgstr "Kategória neve" -#: part/serializers.py:943 +#: part/serializers.py:915 msgid "Building" msgstr "Gyártásban" -#: part/serializers.py:944 +#: part/serializers.py:916 msgid "Quantity of this part currently being in production" msgstr "Az alkatrészből jelenleg ennyi van gyártás alatt" -#: part/serializers.py:951 +#: part/serializers.py:923 msgid "Outstanding quantity of this part scheduled to be built" msgstr "Már beütemezett de még nem kész gyártási mennyiség" -#: part/serializers.py:971 stock/serializers.py:1019 stock/serializers.py:1189 +#: part/serializers.py:943 stock/serializers.py:1019 stock/serializers.py:1189 #: users/ruleset.py:30 msgid "Stock Items" msgstr "Készlet tételek" -#: part/serializers.py:975 +#: part/serializers.py:947 msgid "Revisions" msgstr "Verziók" -#: part/serializers.py:979 +#: part/serializers.py:951 msgid "Suppliers" msgstr "Beszállítók" -#: part/serializers.py:983 part/serializers.py:1297 +#: part/serializers.py:955 part/serializers.py:1269 #: templates/email/low_stock_notification.html:16 #: templates/email/part_event_notification.html:17 msgid "Total Stock" msgstr "Teljes készlet" -#: part/serializers.py:991 +#: part/serializers.py:963 msgid "Unallocated Stock" msgstr "Nem lefoglalt készlet" -#: part/serializers.py:999 +#: part/serializers.py:971 msgid "Variant Stock" msgstr "Variánsok Raktárkészlet" -#: part/serializers.py:1054 +#: part/serializers.py:1026 msgid "Duplicate Part" msgstr "Alkatrész másolása" -#: part/serializers.py:1055 +#: part/serializers.py:1027 msgid "Copy initial data from another Part" msgstr "Kezdeti adatok másolása egy másik alkatrészről" -#: part/serializers.py:1061 +#: part/serializers.py:1033 msgid "Initial Stock" msgstr "Kezdeti készlet" -#: part/serializers.py:1062 +#: part/serializers.py:1034 msgid "Create Part with initial stock quantity" msgstr "Kezdeti készlet mennyiség létrehozása" -#: part/serializers.py:1068 +#: part/serializers.py:1040 msgid "Supplier Information" msgstr "Beszállító információ" -#: part/serializers.py:1069 +#: part/serializers.py:1041 msgid "Add initial supplier information for this part" msgstr "Kezdeti beszállító adatok hozzáadása" -#: part/serializers.py:1077 +#: part/serializers.py:1049 msgid "Copy Category Parameters" msgstr "Kategória paraméterek másolása" -#: part/serializers.py:1078 +#: part/serializers.py:1050 msgid "Copy parameter templates from selected part category" msgstr "Paraméter sablonok másolása a kiválasztott alkatrész kategóriából" -#: part/serializers.py:1083 +#: part/serializers.py:1055 msgid "Existing Image" msgstr "Meglévő kép" -#: part/serializers.py:1084 +#: part/serializers.py:1056 msgid "Filename of an existing part image" msgstr "A meglévő alkatrész képfájl neve" -#: part/serializers.py:1101 +#: part/serializers.py:1073 msgid "Image file does not exist" msgstr "A képfájl nem létezik" -#: part/serializers.py:1269 +#: part/serializers.py:1241 msgid "Validate entire Bill of Materials" msgstr "Teljes alkatrészjegyzék jóváhagyása" -#: part/serializers.py:1303 part/serializers.py:1769 +#: part/serializers.py:1275 part/serializers.py:1741 msgid "Can Build" msgstr "Gyártható" -#: part/serializers.py:1320 +#: part/serializers.py:1292 msgid "Required for Build Orders" msgstr "Gyártásokhoz szükséges" -#: part/serializers.py:1325 +#: part/serializers.py:1297 msgid "Allocated to Build Orders" msgstr "Gyártási rendelésekhez foglalva" -#: part/serializers.py:1332 +#: part/serializers.py:1304 msgid "Required for Sales Orders" msgstr "Értékesítési rendeléshez szükséges" -#: part/serializers.py:1336 +#: part/serializers.py:1308 msgid "Allocated to Sales Orders" msgstr "Értékesítési rendeléshez lefoglalva" -#: part/serializers.py:1475 +#: part/serializers.py:1447 msgid "Minimum Price" msgstr "Minimum ár" -#: part/serializers.py:1476 +#: part/serializers.py:1448 msgid "Override calculated value for minimum price" msgstr "Számított minimum ár felülbírálása" -#: part/serializers.py:1483 +#: part/serializers.py:1455 msgid "Minimum price currency" msgstr "Minimum ár pénzneme" -#: part/serializers.py:1490 +#: part/serializers.py:1462 msgid "Maximum Price" msgstr "Maximum ár" -#: part/serializers.py:1491 +#: part/serializers.py:1463 msgid "Override calculated value for maximum price" msgstr "Számított maximum ár felülbírálása" -#: part/serializers.py:1498 +#: part/serializers.py:1470 msgid "Maximum price currency" msgstr "Maximum ár pénzneme" -#: part/serializers.py:1527 +#: part/serializers.py:1499 msgid "Update" msgstr "Frissítés" -#: part/serializers.py:1528 +#: part/serializers.py:1500 msgid "Update pricing for this part" msgstr "Alkatrész árak frissítése" -#: part/serializers.py:1551 +#: part/serializers.py:1523 #, python-brace-format msgid "Could not convert from provided currencies to {default_currency}" msgstr "Megadott pénznem átváltása {default_currency}-re sikertelen" -#: part/serializers.py:1558 +#: part/serializers.py:1530 msgid "Minimum price must not be greater than maximum price" msgstr "A Minimum ár nem lehet nagyobb mint a Maximum ár" -#: part/serializers.py:1561 +#: part/serializers.py:1533 msgid "Maximum price must not be less than minimum price" msgstr "A Maximum ár nem lehet kisebb mint a Minimum ár" -#: part/serializers.py:1715 +#: part/serializers.py:1687 msgid "Select the parent assembly" msgstr "Szülő összeállítás kiválasztása" -#: part/serializers.py:1735 +#: part/serializers.py:1707 msgid "Select the component part" msgstr "Összetevő alkatrész kijelölése" -#: part/serializers.py:1929 +#: part/serializers.py:1901 msgid "Select part to copy BOM from" msgstr "Válassz alkatrészt ahonnan az alkatrészjegyzéket másoljuk" -#: part/serializers.py:1937 +#: part/serializers.py:1909 msgid "Remove Existing Data" msgstr "Létező adat törlése" -#: part/serializers.py:1938 +#: part/serializers.py:1910 msgid "Remove existing BOM items before copying" msgstr "Meglévő alkatrészjegyzék tételek törlése a másolás előtt" -#: part/serializers.py:1943 +#: part/serializers.py:1915 msgid "Include Inherited" msgstr "Örököltekkel együtt" -#: part/serializers.py:1944 +#: part/serializers.py:1916 msgid "Include BOM items which are inherited from templated parts" msgstr "Sablon alkatrészektől örökölt alkatrészjegyzék tételek használata" -#: part/serializers.py:1949 +#: part/serializers.py:1921 msgid "Skip Invalid Rows" msgstr "Hibás sorok kihagyása" -#: part/serializers.py:1950 +#: part/serializers.py:1922 msgid "Enable this option to skip invalid rows" msgstr "Engedély a hibás sorok kihagyására" -#: part/serializers.py:1955 +#: part/serializers.py:1927 msgid "Copy Substitute Parts" msgstr "Helyettesítő alkatrészek másolása" -#: part/serializers.py:1956 +#: part/serializers.py:1928 msgid "Copy substitute parts when duplicate BOM items" msgstr "Helyettesítő alkatrészek másolása az alkatrészjegyzék tételek másolásakor" @@ -8456,115 +8460,119 @@ msgstr "Sorozatszámokat listában kell megadni" msgid "Quantity does not match serial numbers" msgstr "A mennyiség nem egyezik a megadott sorozatszámok számával" -#: stock/models.py:2012 stock/models.py:2917 +#: stock/models.py:1912 +msgid "Cannot assign stock to structural location" +msgstr "" + +#: stock/models.py:2029 stock/models.py:2934 msgid "Test template does not exist" msgstr "Ez a Teszt sablon nem létezik" -#: stock/models.py:2030 +#: stock/models.py:2047 msgid "Stock item has been assigned to a sales order" msgstr "Készlet tétel hozzárendelve egy vevői rendeléshez" -#: stock/models.py:2034 +#: stock/models.py:2051 msgid "Stock item is installed in another item" msgstr "Készlet tétel beépül egy másikba" -#: stock/models.py:2037 +#: stock/models.py:2054 msgid "Stock item contains other items" msgstr "A készlet tétel más tételeket tartalmaz" -#: stock/models.py:2040 +#: stock/models.py:2057 msgid "Stock item has been assigned to a customer" msgstr "Készlet tétel hozzárendelve egy vevőhöz" -#: stock/models.py:2043 stock/models.py:2226 +#: stock/models.py:2060 stock/models.py:2243 msgid "Stock item is currently in production" msgstr "Készlet tétel gyártás alatt" -#: stock/models.py:2046 +#: stock/models.py:2063 msgid "Serialized stock cannot be merged" msgstr "Követésre kötelezett készlet nem vonható össze" -#: stock/models.py:2053 stock/serializers.py:1462 +#: stock/models.py:2070 stock/serializers.py:1462 msgid "Duplicate stock items" msgstr "Duplikált készlet tételek vannak" -#: stock/models.py:2057 +#: stock/models.py:2074 msgid "Stock items must refer to the same part" msgstr "A készlet tétel ugyanarra az alkatrészre kell vonatkozzon" -#: stock/models.py:2065 +#: stock/models.py:2082 msgid "Stock items must refer to the same supplier part" msgstr "A készlet tétel ugyanarra a beszállítói alkatrészre kell vonatkozzon" -#: stock/models.py:2070 +#: stock/models.py:2087 msgid "Stock status codes must match" msgstr "Készlet tételek állapotainak egyeznie kell" -#: stock/models.py:2349 +#: stock/models.py:2366 msgid "StockItem cannot be moved as it is not in stock" msgstr "Készlet tétel nem mozgatható mivel nincs készleten" -#: stock/models.py:2818 +#: stock/models.py:2835 msgid "Stock Item Tracking" msgstr "Készlettörténet" -#: stock/models.py:2849 +#: stock/models.py:2866 msgid "Entry notes" msgstr "Bejegyzés megjegyzései" -#: stock/models.py:2889 +#: stock/models.py:2906 msgid "Stock Item Test Result" msgstr "Készlet Tétel Ellenőrzés Eredménye" -#: stock/models.py:2920 +#: stock/models.py:2937 msgid "Value must be provided for this test" msgstr "Ehhez a teszthez meg kell adni értéket" -#: stock/models.py:2924 +#: stock/models.py:2941 msgid "Attachment must be uploaded for this test" msgstr "Ehhez a teszthez fel kell tölteni mellékletet" -#: stock/models.py:2929 +#: stock/models.py:2946 msgid "Invalid value for this test" msgstr "A teszt eredménye érvénytelen" -#: stock/models.py:2953 +#: stock/models.py:2970 msgid "Test result" msgstr "Teszt eredménye" -#: stock/models.py:2960 +#: stock/models.py:2977 msgid "Test output value" msgstr "Teszt kimeneti értéke" -#: stock/models.py:2968 stock/serializers.py:248 +#: stock/models.py:2985 stock/serializers.py:248 msgid "Test result attachment" msgstr "Teszt eredmény melléklet" -#: stock/models.py:2972 +#: stock/models.py:2989 msgid "Test notes" msgstr "Tesztek megjegyzései" -#: stock/models.py:2980 +#: stock/models.py:2997 msgid "Test station" msgstr "Teszt állomás" -#: stock/models.py:2981 +#: stock/models.py:2998 msgid "The identifier of the test station where the test was performed" msgstr "A tesztet elvégző tesztállomás azonosítója" -#: stock/models.py:2987 +#: stock/models.py:3004 msgid "Started" msgstr "Elkezdődött" -#: stock/models.py:2988 +#: stock/models.py:3005 msgid "The timestamp of the test start" msgstr "A teszt indításának időpontja" -#: stock/models.py:2994 +#: stock/models.py:3011 msgid "Finished" msgstr "Befejezve" -#: stock/models.py:2995 +#: stock/models.py:3012 msgid "The timestamp of the test finish" msgstr "A teszt befejezésének időpontja" @@ -8903,83 +8911,87 @@ msgstr "Készlet manuálisan hozzáadva" msgid "Stock manually removed" msgstr "Készlet manuálisan elvéve" -#: stock/status_codes.py:57 +#: stock/status_codes.py:56 +msgid "Serialized stock items" +msgstr "" + +#: stock/status_codes.py:58 msgid "Returned to stock" msgstr "Készletre visszatéve" -#: stock/status_codes.py:60 +#: stock/status_codes.py:61 msgid "Location changed" msgstr "Hely megváltozott" -#: stock/status_codes.py:61 +#: stock/status_codes.py:62 msgid "Stock updated" msgstr "Készletadatok frissítve" -#: stock/status_codes.py:64 +#: stock/status_codes.py:65 msgid "Installed into assembly" msgstr "Gyártmányba beépült" -#: stock/status_codes.py:65 +#: stock/status_codes.py:66 msgid "Removed from assembly" msgstr "Gyártmányból eltávolítva" -#: stock/status_codes.py:67 +#: stock/status_codes.py:68 msgid "Installed component item" msgstr "Beépült összetevő tétel" -#: stock/status_codes.py:68 +#: stock/status_codes.py:69 msgid "Removed component item" msgstr "Eltávolított összetevő tétel" -#: stock/status_codes.py:71 +#: stock/status_codes.py:72 msgid "Split from parent item" msgstr "Szülő tételből szétválasztva" -#: stock/status_codes.py:72 +#: stock/status_codes.py:73 msgid "Split child item" msgstr "Szétválasztott gyermek tétel" -#: stock/status_codes.py:75 +#: stock/status_codes.py:76 msgid "Merged stock items" msgstr "Összevont készlet tétel" -#: stock/status_codes.py:78 +#: stock/status_codes.py:79 msgid "Converted to variant" msgstr "Alkatrészváltozattá alakítva" -#: stock/status_codes.py:81 +#: stock/status_codes.py:82 msgid "Build order output created" msgstr "Gyártási utasítás kimenete elkészült" -#: stock/status_codes.py:82 +#: stock/status_codes.py:83 msgid "Build order output completed" msgstr "Gyártási utasítás kimenete kész" -#: stock/status_codes.py:83 +#: stock/status_codes.py:84 msgid "Build order output rejected" msgstr "Gyártási utasítás kimenete elutasítva" -#: stock/status_codes.py:84 +#: stock/status_codes.py:85 msgid "Consumed by build order" msgstr "Gyártásra felhasználva" -#: stock/status_codes.py:87 +#: stock/status_codes.py:88 msgid "Shipped against Sales Order" msgstr "Vevői rendelésre kiszállítva" -#: stock/status_codes.py:90 +#: stock/status_codes.py:91 msgid "Received against Purchase Order" msgstr "Megrendelésre érkezett" -#: stock/status_codes.py:93 +#: stock/status_codes.py:94 msgid "Returned against Return Order" msgstr "Visszavéve" -#: stock/status_codes.py:96 +#: stock/status_codes.py:97 msgid "Sent to customer" msgstr "Vevőnek kiszállítva" -#: stock/status_codes.py:97 +#: stock/status_codes.py:98 msgid "Returned from customer" msgstr "Vevőtől visszaérkezett" diff --git a/src/backend/InvenTree/locale/id/LC_MESSAGES/django.po b/src/backend/InvenTree/locale/id/LC_MESSAGES/django.po index 63e669f8a5..7ee1440390 100644 --- a/src/backend/InvenTree/locale/id/LC_MESSAGES/django.po +++ b/src/backend/InvenTree/locale/id/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: inventree\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-11-19 04:55+0000\n" -"PO-Revision-Date: 2025-11-19 04:59\n" +"POT-Creation-Date: 2025-11-24 06:50+0000\n" +"PO-Revision-Date: 2025-11-24 06:54\n" "Last-Translator: \n" "Language-Team: Indonesian\n" "Language: id_ID\n" @@ -81,21 +81,21 @@ msgstr "Alamat surel utama yang diberikan tidak valid." msgid "The provided email domain is not approved." msgstr "Domain surel yang diberikan tidak perbolehkan." -#: InvenTree/conversion.py:166 +#: InvenTree/conversion.py:240 #, python-brace-format msgid "Invalid unit provided ({unit})" msgstr "" -#: InvenTree/conversion.py:183 +#: InvenTree/conversion.py:257 msgid "No value provided" msgstr "Nilai tidak tersedia" -#: InvenTree/conversion.py:210 +#: InvenTree/conversion.py:284 #, python-brace-format msgid "Could not convert {original} to {unit}" msgstr "" -#: InvenTree/conversion.py:212 InvenTree/conversion.py:226 +#: InvenTree/conversion.py:286 InvenTree/conversion.py:300 #: InvenTree/helpers.py:597 order/models.py:720 order/models.py:1015 msgid "Invalid quantity provided" msgstr "Jumlah yang diberikan tidak valid" @@ -116,7 +116,7 @@ msgstr "" #: build/serializers.py:580 build/serializers.py:1788 company/models.py:857 #: order/models.py:1780 #: report/templates/report/inventree_build_order_report.html:172 -#: stock/models.py:2848 stock/models.py:2972 stock/serializers.py:717 +#: stock/models.py:2865 stock/models.py:2989 stock/serializers.py:717 #: stock/serializers.py:893 stock/serializers.py:1035 stock/serializers.py:1336 #: stock/serializers.py:1425 stock/serializers.py:1624 msgid "Notes" @@ -345,7 +345,7 @@ msgstr "Harus berupa angka yang valid" msgid "Currency" msgstr "Mata Uang" -#: InvenTree/serializers.py:298 part/serializers.py:1385 +#: InvenTree/serializers.py:298 part/serializers.py:1357 msgid "Select currency from available options" msgstr "" @@ -553,14 +553,14 @@ msgstr "" #: build/api.py:100 build/api.py:466 build/api.py:845 build/models.py:270 #: build/serializers.py:1225 build/serializers.py:1356 -#: build/serializers.py:1427 company/models.py:1067 company/serializers.py:445 +#: build/serializers.py:1427 company/models.py:1067 company/serializers.py:491 #: order/api.py:298 order/api.py:302 order/api.py:929 order/api.py:1187 #: order/api.py:1190 order/models.py:1941 order/models.py:2108 #: order/models.py:2109 part/api.py:1233 part/api.py:1236 part/api.py:1302 #: part/api.py:1589 part/models.py:472 part/models.py:3296 part/models.py:3439 #: part/models.py:3497 part/models.py:3518 part/models.py:3540 #: part/models.py:3679 part/models.py:4046 part/models.py:4368 -#: part/models.py:4787 part/serializers.py:1928 +#: part/models.py:4787 part/serializers.py:1900 #: report/templates/report/inventree_bill_of_materials_report.html:110 #: report/templates/report/inventree_bill_of_materials_report.html:137 #: report/templates/report/inventree_build_order_report.html:109 @@ -582,7 +582,7 @@ msgstr "Bagian" #: build/api.py:120 build/api.py:123 build/serializers.py:1438 part/api.py:980 #: part/api.py:1316 part/api.py:1600 part/models.py:1080 part/models.py:3568 -#: part/models.py:4162 part/serializers.py:1752 stock/api.py:869 +#: part/models.py:4162 part/serializers.py:1724 stock/api.py:869 msgid "Category" msgstr "" @@ -663,7 +663,7 @@ msgid "Optional" msgstr "" #: build/api.py:455 build/serializers.py:1415 common/setting/system.py:456 -#: part/models.py:1202 part/serializers.py:1714 part/serializers.py:1725 +#: part/models.py:1202 part/serializers.py:1686 part/serializers.py:1697 #: stock/api.py:639 msgid "Assembly" msgstr "" @@ -688,16 +688,16 @@ msgstr "" msgid "Consumed" msgstr "" -#: build/api.py:499 company/models.py:912 company/serializers.py:440 +#: build/api.py:499 company/models.py:912 company/serializers.py:474 #: templates/email/build_order_required_stock.html:19 #: templates/email/low_stock_notification.html:17 #: templates/email/part_event_notification.html:18 msgid "Available" msgstr "Tersedia" -#: build/api.py:523 build/serializers.py:1466 company/serializers.py:437 -#: order/serializers.py:1281 part/serializers.py:959 part/serializers.py:1306 -#: part/serializers.py:1761 +#: build/api.py:523 build/serializers.py:1466 company/serializers.py:471 +#: order/serializers.py:1281 part/serializers.py:931 part/serializers.py:1278 +#: part/serializers.py:1733 msgid "On Order" msgstr "" @@ -963,7 +963,7 @@ msgstr "Hasil produksi tidak sesuai dengan order produksi" #: build/models.py:1136 build/models.py:1234 build/serializers.py:285 #: build/serializers.py:335 build/serializers.py:965 build/serializers.py:1739 #: order/models.py:717 order/serializers.py:658 order/serializers.py:844 -#: part/serializers.py:1708 stock/models.py:940 stock/models.py:1430 +#: part/serializers.py:1680 stock/models.py:940 stock/models.py:1430 #: stock/models.py:1878 stock/serializers.py:688 stock/serializers.py:1580 msgid "Quantity must be greater than zero" msgstr "Jumlah harus lebih besar daripada nol" @@ -1385,20 +1385,20 @@ msgstr "" msgid "BOM Item" msgstr "Item tagihan material" -#: build/serializers.py:1467 order/serializers.py:1282 part/serializers.py:1310 -#: part/serializers.py:1765 +#: build/serializers.py:1467 order/serializers.py:1282 part/serializers.py:1282 +#: part/serializers.py:1737 msgid "In Production" msgstr "" -#: build/serializers.py:1469 part/serializers.py:950 part/serializers.py:1314 +#: build/serializers.py:1469 part/serializers.py:922 part/serializers.py:1286 msgid "Scheduled to Build" msgstr "" -#: build/serializers.py:1472 part/serializers.py:987 +#: build/serializers.py:1472 part/serializers.py:959 msgid "External Stock" msgstr "" -#: build/serializers.py:1473 part/serializers.py:1300 part/serializers.py:1808 +#: build/serializers.py:1473 part/serializers.py:1272 part/serializers.py:1780 msgid "Available Stock" msgstr "" @@ -1588,7 +1588,7 @@ msgstr "Pengguna" msgid "Price break quantity" msgstr "" -#: common/models.py:1348 company/serializers.py:564 order/models.py:1842 +#: common/models.py:1348 company/serializers.py:357 order/models.py:1842 #: order/models.py:3043 msgid "Price" msgstr "Harga" @@ -1760,7 +1760,7 @@ msgstr "" msgid "Unit definition" msgstr "" -#: common/models.py:1911 common/models.py:1974 stock/models.py:2967 +#: common/models.py:1911 common/models.py:1974 stock/models.py:2984 #: stock/serializers.py:247 msgid "Attachment" msgstr "Lampiran" @@ -1839,7 +1839,7 @@ msgstr "" #: common/models.py:2090 common/models.py:2329 company/models.py:622 #: machine/serializers.py:27 -#: report/templates/report/inventree_test_report.html:104 stock/models.py:2959 +#: report/templates/report/inventree_test_report.html:104 stock/models.py:2976 msgid "Value" msgstr "" @@ -2048,7 +2048,7 @@ msgid "Response data from the barcode scan" msgstr "" #: common/models.py:2417 report/templates/report/inventree_test_report.html:103 -#: stock/models.py:2953 +#: stock/models.py:2970 msgid "Result" msgstr "" @@ -2141,7 +2141,7 @@ msgid "Linked thread for this message" msgstr "" #: common/models.py:2656 -msgid "Prioriy" +msgid "Priority" msgstr "" #: common/models.py:2698 @@ -2671,8 +2671,8 @@ msgstr "" msgid "Parts can be assembled from other components by default" msgstr "" -#: common/setting/system.py:462 part/models.py:1208 part/serializers.py:1734 -#: part/serializers.py:1741 +#: common/setting/system.py:462 part/models.py:1208 part/serializers.py:1706 +#: part/serializers.py:1713 msgid "Component" msgstr "Komponen" @@ -3772,7 +3772,7 @@ msgstr "" msgid "Supplier is Active" msgstr "" -#: company/api.py:307 company/models.py:520 company/serializers.py:457 +#: company/api.py:307 company/models.py:520 company/serializers.py:503 #: part/serializers.py:566 msgid "Manufacturer" msgstr "" @@ -3964,7 +3964,7 @@ msgid "Link to address information (external)" msgstr "" #: company/models.py:492 company/models.py:609 company/models.py:832 -#: company/serializers.py:471 stock/api.py:561 +#: company/serializers.py:517 stock/api.py:561 msgid "Manufacturer Part" msgstr "" @@ -3981,7 +3981,7 @@ msgstr "" msgid "Select manufacturer" msgstr "" -#: company/models.py:527 company/serializers.py:479 order/serializers.py:734 +#: company/models.py:527 company/serializers.py:525 order/serializers.py:734 #: part/serializers.py:576 msgid "MPN" msgstr "" @@ -4030,7 +4030,7 @@ msgstr "" msgid "Linked manufacturer part must reference the same base part" msgstr "" -#: company/models.py:810 company/serializers.py:449 company/serializers.py:467 +#: company/models.py:810 company/serializers.py:495 company/serializers.py:513 #: order/models.py:639 part/serializers.py:550 #: plugin/builtin/suppliers/digikey.py:26 plugin/builtin/suppliers/lcsc.py:27 #: plugin/builtin/suppliers/mouser.py:25 plugin/builtin/suppliers/tme.py:27 @@ -4134,10 +4134,14 @@ msgstr "" msgid "Company Name" msgstr "" -#: company/serializers.py:433 part/serializers.py:955 stock/serializers.py:428 +#: company/serializers.py:467 part/serializers.py:927 stock/serializers.py:428 msgid "In Stock" msgstr "" +#: company/serializers.py:484 +msgid "Price Breaks" +msgstr "" + #: data_exporter/mixins.py:325 data_exporter/mixins.py:403 msgid "Error occurred during data export" msgstr "" @@ -4290,7 +4294,7 @@ msgstr "" msgid "Errors" msgstr "" -#: importer/models.py:550 part/serializers.py:1268 +#: importer/models.py:550 part/serializers.py:1240 msgid "Valid" msgstr "" @@ -5677,7 +5681,7 @@ msgstr "" msgid "Part category" msgstr "" -#: part/models.py:1088 part/serializers.py:929 +#: part/models.py:1088 part/serializers.py:901 #: report/templates/report/inventree_stock_location_report.html:103 msgid "IPN" msgstr "" @@ -5718,7 +5722,7 @@ msgstr "" msgid "Expiry time (in days) for stock items of this part" msgstr "" -#: part/models.py:1186 part/serializers.py:1003 +#: part/models.py:1186 part/serializers.py:975 msgid "Minimum Stock" msgstr "" @@ -6418,203 +6422,203 @@ msgstr "" msgid "Supplier part matching this SKU already exists" msgstr "" -#: part/serializers.py:914 +#: part/serializers.py:886 msgid "Category Name" msgstr "" -#: part/serializers.py:943 +#: part/serializers.py:915 msgid "Building" msgstr "" -#: part/serializers.py:944 +#: part/serializers.py:916 msgid "Quantity of this part currently being in production" msgstr "" -#: part/serializers.py:951 +#: part/serializers.py:923 msgid "Outstanding quantity of this part scheduled to be built" msgstr "" -#: part/serializers.py:971 stock/serializers.py:1019 stock/serializers.py:1189 +#: part/serializers.py:943 stock/serializers.py:1019 stock/serializers.py:1189 #: users/ruleset.py:30 msgid "Stock Items" msgstr "" -#: part/serializers.py:975 +#: part/serializers.py:947 msgid "Revisions" msgstr "" -#: part/serializers.py:979 +#: part/serializers.py:951 msgid "Suppliers" msgstr "" -#: part/serializers.py:983 part/serializers.py:1297 +#: part/serializers.py:955 part/serializers.py:1269 #: templates/email/low_stock_notification.html:16 #: templates/email/part_event_notification.html:17 msgid "Total Stock" msgstr "" -#: part/serializers.py:991 +#: part/serializers.py:963 msgid "Unallocated Stock" msgstr "" -#: part/serializers.py:999 +#: part/serializers.py:971 msgid "Variant Stock" msgstr "" -#: part/serializers.py:1054 +#: part/serializers.py:1026 msgid "Duplicate Part" msgstr "" -#: part/serializers.py:1055 +#: part/serializers.py:1027 msgid "Copy initial data from another Part" msgstr "" -#: part/serializers.py:1061 +#: part/serializers.py:1033 msgid "Initial Stock" msgstr "" -#: part/serializers.py:1062 +#: part/serializers.py:1034 msgid "Create Part with initial stock quantity" msgstr "" -#: part/serializers.py:1068 +#: part/serializers.py:1040 msgid "Supplier Information" msgstr "" -#: part/serializers.py:1069 +#: part/serializers.py:1041 msgid "Add initial supplier information for this part" msgstr "" -#: part/serializers.py:1077 +#: part/serializers.py:1049 msgid "Copy Category Parameters" msgstr "" -#: part/serializers.py:1078 +#: part/serializers.py:1050 msgid "Copy parameter templates from selected part category" msgstr "" -#: part/serializers.py:1083 +#: part/serializers.py:1055 msgid "Existing Image" msgstr "" -#: part/serializers.py:1084 +#: part/serializers.py:1056 msgid "Filename of an existing part image" msgstr "" -#: part/serializers.py:1101 +#: part/serializers.py:1073 msgid "Image file does not exist" msgstr "" -#: part/serializers.py:1269 +#: part/serializers.py:1241 msgid "Validate entire Bill of Materials" msgstr "" -#: part/serializers.py:1303 part/serializers.py:1769 +#: part/serializers.py:1275 part/serializers.py:1741 msgid "Can Build" msgstr "" -#: part/serializers.py:1320 +#: part/serializers.py:1292 msgid "Required for Build Orders" msgstr "" -#: part/serializers.py:1325 +#: part/serializers.py:1297 msgid "Allocated to Build Orders" msgstr "" -#: part/serializers.py:1332 +#: part/serializers.py:1304 msgid "Required for Sales Orders" msgstr "" -#: part/serializers.py:1336 +#: part/serializers.py:1308 msgid "Allocated to Sales Orders" msgstr "" -#: part/serializers.py:1475 +#: part/serializers.py:1447 msgid "Minimum Price" msgstr "Harga Minimal" -#: part/serializers.py:1476 +#: part/serializers.py:1448 msgid "Override calculated value for minimum price" msgstr "" -#: part/serializers.py:1483 +#: part/serializers.py:1455 msgid "Minimum price currency" msgstr "" -#: part/serializers.py:1490 +#: part/serializers.py:1462 msgid "Maximum Price" msgstr "Harga Maksimal" -#: part/serializers.py:1491 +#: part/serializers.py:1463 msgid "Override calculated value for maximum price" msgstr "" -#: part/serializers.py:1498 +#: part/serializers.py:1470 msgid "Maximum price currency" msgstr "" -#: part/serializers.py:1527 +#: part/serializers.py:1499 msgid "Update" msgstr "Perbarui" -#: part/serializers.py:1528 +#: part/serializers.py:1500 msgid "Update pricing for this part" msgstr "" -#: part/serializers.py:1551 +#: part/serializers.py:1523 #, python-brace-format msgid "Could not convert from provided currencies to {default_currency}" msgstr "" -#: part/serializers.py:1558 +#: part/serializers.py:1530 msgid "Minimum price must not be greater than maximum price" msgstr "" -#: part/serializers.py:1561 +#: part/serializers.py:1533 msgid "Maximum price must not be less than minimum price" msgstr "" -#: part/serializers.py:1715 +#: part/serializers.py:1687 msgid "Select the parent assembly" msgstr "" -#: part/serializers.py:1735 +#: part/serializers.py:1707 msgid "Select the component part" msgstr "" -#: part/serializers.py:1929 +#: part/serializers.py:1901 msgid "Select part to copy BOM from" msgstr "" -#: part/serializers.py:1937 +#: part/serializers.py:1909 msgid "Remove Existing Data" msgstr "" -#: part/serializers.py:1938 +#: part/serializers.py:1910 msgid "Remove existing BOM items before copying" msgstr "" -#: part/serializers.py:1943 +#: part/serializers.py:1915 msgid "Include Inherited" msgstr "" -#: part/serializers.py:1944 +#: part/serializers.py:1916 msgid "Include BOM items which are inherited from templated parts" msgstr "" -#: part/serializers.py:1949 +#: part/serializers.py:1921 msgid "Skip Invalid Rows" msgstr "" -#: part/serializers.py:1950 +#: part/serializers.py:1922 msgid "Enable this option to skip invalid rows" msgstr "" -#: part/serializers.py:1955 +#: part/serializers.py:1927 msgid "Copy Substitute Parts" msgstr "" -#: part/serializers.py:1956 +#: part/serializers.py:1928 msgid "Copy substitute parts when duplicate BOM items" msgstr "" @@ -8455,115 +8459,119 @@ msgstr "" msgid "Quantity does not match serial numbers" msgstr "" -#: stock/models.py:2012 stock/models.py:2917 +#: stock/models.py:1912 +msgid "Cannot assign stock to structural location" +msgstr "" + +#: stock/models.py:2029 stock/models.py:2934 msgid "Test template does not exist" msgstr "" -#: stock/models.py:2030 +#: stock/models.py:2047 msgid "Stock item has been assigned to a sales order" msgstr "" -#: stock/models.py:2034 +#: stock/models.py:2051 msgid "Stock item is installed in another item" msgstr "" -#: stock/models.py:2037 +#: stock/models.py:2054 msgid "Stock item contains other items" msgstr "" -#: stock/models.py:2040 +#: stock/models.py:2057 msgid "Stock item has been assigned to a customer" msgstr "" -#: stock/models.py:2043 stock/models.py:2226 +#: stock/models.py:2060 stock/models.py:2243 msgid "Stock item is currently in production" msgstr "" -#: stock/models.py:2046 +#: stock/models.py:2063 msgid "Serialized stock cannot be merged" msgstr "" -#: stock/models.py:2053 stock/serializers.py:1462 +#: stock/models.py:2070 stock/serializers.py:1462 msgid "Duplicate stock items" msgstr "" -#: stock/models.py:2057 +#: stock/models.py:2074 msgid "Stock items must refer to the same part" msgstr "" -#: stock/models.py:2065 +#: stock/models.py:2082 msgid "Stock items must refer to the same supplier part" msgstr "" -#: stock/models.py:2070 +#: stock/models.py:2087 msgid "Stock status codes must match" msgstr "" -#: stock/models.py:2349 +#: stock/models.py:2366 msgid "StockItem cannot be moved as it is not in stock" msgstr "" -#: stock/models.py:2818 +#: stock/models.py:2835 msgid "Stock Item Tracking" msgstr "" -#: stock/models.py:2849 +#: stock/models.py:2866 msgid "Entry notes" msgstr "" -#: stock/models.py:2889 +#: stock/models.py:2906 msgid "Stock Item Test Result" msgstr "" -#: stock/models.py:2920 +#: stock/models.py:2937 msgid "Value must be provided for this test" msgstr "" -#: stock/models.py:2924 +#: stock/models.py:2941 msgid "Attachment must be uploaded for this test" msgstr "Lampiran perlu diunggah untuk tes ini" -#: stock/models.py:2929 +#: stock/models.py:2946 msgid "Invalid value for this test" msgstr "" -#: stock/models.py:2953 +#: stock/models.py:2970 msgid "Test result" msgstr "" -#: stock/models.py:2960 +#: stock/models.py:2977 msgid "Test output value" msgstr "" -#: stock/models.py:2968 stock/serializers.py:248 +#: stock/models.py:2985 stock/serializers.py:248 msgid "Test result attachment" msgstr "" -#: stock/models.py:2972 +#: stock/models.py:2989 msgid "Test notes" msgstr "" -#: stock/models.py:2980 +#: stock/models.py:2997 msgid "Test station" msgstr "" -#: stock/models.py:2981 +#: stock/models.py:2998 msgid "The identifier of the test station where the test was performed" msgstr "" -#: stock/models.py:2987 +#: stock/models.py:3004 msgid "Started" msgstr "" -#: stock/models.py:2988 +#: stock/models.py:3005 msgid "The timestamp of the test start" msgstr "" -#: stock/models.py:2994 +#: stock/models.py:3011 msgid "Finished" msgstr "" -#: stock/models.py:2995 +#: stock/models.py:3012 msgid "The timestamp of the test finish" msgstr "" @@ -8902,83 +8910,87 @@ msgstr "Stok yang ditambahkan manual" msgid "Stock manually removed" msgstr "Stok yang dikurangi manual" -#: stock/status_codes.py:57 +#: stock/status_codes.py:56 +msgid "Serialized stock items" +msgstr "" + +#: stock/status_codes.py:58 msgid "Returned to stock" msgstr "" -#: stock/status_codes.py:60 +#: stock/status_codes.py:61 msgid "Location changed" msgstr "Lokasi berubah" -#: stock/status_codes.py:61 +#: stock/status_codes.py:62 msgid "Stock updated" msgstr "" -#: stock/status_codes.py:64 +#: stock/status_codes.py:65 msgid "Installed into assembly" msgstr "Dirakit ke" -#: stock/status_codes.py:65 +#: stock/status_codes.py:66 msgid "Removed from assembly" msgstr "Diambil dari" -#: stock/status_codes.py:67 +#: stock/status_codes.py:68 msgid "Installed component item" msgstr "Komponen terpasang" -#: stock/status_codes.py:68 +#: stock/status_codes.py:69 msgid "Removed component item" msgstr "Komponen terlepas" -#: stock/status_codes.py:71 +#: stock/status_codes.py:72 msgid "Split from parent item" msgstr "Dipisah dari item induk" -#: stock/status_codes.py:72 +#: stock/status_codes.py:73 msgid "Split child item" msgstr "Pisah item dari barang induk" -#: stock/status_codes.py:75 +#: stock/status_codes.py:76 msgid "Merged stock items" msgstr "Stok item digabungkan" -#: stock/status_codes.py:78 +#: stock/status_codes.py:79 msgid "Converted to variant" msgstr "Dikonversi ke variasi" -#: stock/status_codes.py:81 +#: stock/status_codes.py:82 msgid "Build order output created" msgstr "Output order produksi dibuat" -#: stock/status_codes.py:82 +#: stock/status_codes.py:83 msgid "Build order output completed" msgstr "Order output produksi selesai" -#: stock/status_codes.py:83 +#: stock/status_codes.py:84 msgid "Build order output rejected" msgstr "" -#: stock/status_codes.py:84 +#: stock/status_codes.py:85 msgid "Consumed by build order" msgstr "Terpakai oleh order produksi" -#: stock/status_codes.py:87 +#: stock/status_codes.py:88 msgid "Shipped against Sales Order" msgstr "" -#: stock/status_codes.py:90 +#: stock/status_codes.py:91 msgid "Received against Purchase Order" msgstr "" -#: stock/status_codes.py:93 +#: stock/status_codes.py:94 msgid "Returned against Return Order" msgstr "" -#: stock/status_codes.py:96 +#: stock/status_codes.py:97 msgid "Sent to customer" msgstr "Terkirim ke pelanggan" -#: stock/status_codes.py:97 +#: stock/status_codes.py:98 msgid "Returned from customer" msgstr "Dikembalikan pelanggan" diff --git a/src/backend/InvenTree/locale/it/LC_MESSAGES/django.po b/src/backend/InvenTree/locale/it/LC_MESSAGES/django.po index 31d6da83ef..d5925247b2 100644 --- a/src/backend/InvenTree/locale/it/LC_MESSAGES/django.po +++ b/src/backend/InvenTree/locale/it/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: inventree\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-11-19 04:55+0000\n" -"PO-Revision-Date: 2025-11-19 04:59\n" +"POT-Creation-Date: 2025-11-24 06:50+0000\n" +"PO-Revision-Date: 2025-11-24 06:54\n" "Last-Translator: \n" "Language-Team: Italian\n" "Language: it_IT\n" @@ -81,21 +81,21 @@ msgstr "L'indirizzo email principale fornito non è valido." msgid "The provided email domain is not approved." msgstr "L'indirizzo di posta elettronica fornito non è approvato." -#: InvenTree/conversion.py:166 +#: InvenTree/conversion.py:240 #, python-brace-format msgid "Invalid unit provided ({unit})" msgstr "Unità fornita non valida ({unit})" -#: InvenTree/conversion.py:183 +#: InvenTree/conversion.py:257 msgid "No value provided" msgstr "Nessun valore specificato" -#: InvenTree/conversion.py:210 +#: InvenTree/conversion.py:284 #, python-brace-format msgid "Could not convert {original} to {unit}" msgstr "Impossibile convertire {original} in {unit}" -#: InvenTree/conversion.py:212 InvenTree/conversion.py:226 +#: InvenTree/conversion.py:286 InvenTree/conversion.py:300 #: InvenTree/helpers.py:597 order/models.py:720 order/models.py:1015 msgid "Invalid quantity provided" msgstr "Quantità inserita non valida" @@ -116,7 +116,7 @@ msgstr "Valore decimale non valido" #: build/serializers.py:580 build/serializers.py:1788 company/models.py:857 #: order/models.py:1780 #: report/templates/report/inventree_build_order_report.html:172 -#: stock/models.py:2848 stock/models.py:2972 stock/serializers.py:717 +#: stock/models.py:2865 stock/models.py:2989 stock/serializers.py:717 #: stock/serializers.py:893 stock/serializers.py:1035 stock/serializers.py:1336 #: stock/serializers.py:1425 stock/serializers.py:1624 msgid "Notes" @@ -345,7 +345,7 @@ msgstr "Deve essere un numero valido" msgid "Currency" msgstr "Valuta" -#: InvenTree/serializers.py:298 part/serializers.py:1385 +#: InvenTree/serializers.py:298 part/serializers.py:1357 msgid "Select currency from available options" msgstr "Selezionare la valuta dalle opzioni disponibili" @@ -553,14 +553,14 @@ msgstr "Includi Varianti" #: build/api.py:100 build/api.py:466 build/api.py:845 build/models.py:270 #: build/serializers.py:1225 build/serializers.py:1356 -#: build/serializers.py:1427 company/models.py:1067 company/serializers.py:445 +#: build/serializers.py:1427 company/models.py:1067 company/serializers.py:491 #: order/api.py:298 order/api.py:302 order/api.py:929 order/api.py:1187 #: order/api.py:1190 order/models.py:1941 order/models.py:2108 #: order/models.py:2109 part/api.py:1233 part/api.py:1236 part/api.py:1302 #: part/api.py:1589 part/models.py:472 part/models.py:3296 part/models.py:3439 #: part/models.py:3497 part/models.py:3518 part/models.py:3540 #: part/models.py:3679 part/models.py:4046 part/models.py:4368 -#: part/models.py:4787 part/serializers.py:1928 +#: part/models.py:4787 part/serializers.py:1900 #: report/templates/report/inventree_bill_of_materials_report.html:110 #: report/templates/report/inventree_bill_of_materials_report.html:137 #: report/templates/report/inventree_build_order_report.html:109 @@ -582,7 +582,7 @@ msgstr "Articolo" #: build/api.py:120 build/api.py:123 build/serializers.py:1438 part/api.py:980 #: part/api.py:1316 part/api.py:1600 part/models.py:1080 part/models.py:3568 -#: part/models.py:4162 part/serializers.py:1752 stock/api.py:869 +#: part/models.py:4162 part/serializers.py:1724 stock/api.py:869 msgid "Category" msgstr "Categoria" @@ -663,7 +663,7 @@ msgid "Optional" msgstr "Opzionale" #: build/api.py:455 build/serializers.py:1415 common/setting/system.py:456 -#: part/models.py:1202 part/serializers.py:1714 part/serializers.py:1725 +#: part/models.py:1202 part/serializers.py:1686 part/serializers.py:1697 #: stock/api.py:639 msgid "Assembly" msgstr "Assemblaggio" @@ -688,16 +688,16 @@ msgstr "Allocato" msgid "Consumed" msgstr "Utilizzato" -#: build/api.py:499 company/models.py:912 company/serializers.py:440 +#: build/api.py:499 company/models.py:912 company/serializers.py:474 #: templates/email/build_order_required_stock.html:19 #: templates/email/low_stock_notification.html:17 #: templates/email/part_event_notification.html:18 msgid "Available" msgstr "Disponibile" -#: build/api.py:523 build/serializers.py:1466 company/serializers.py:437 -#: order/serializers.py:1281 part/serializers.py:959 part/serializers.py:1306 -#: part/serializers.py:1761 +#: build/api.py:523 build/serializers.py:1466 company/serializers.py:471 +#: order/serializers.py:1281 part/serializers.py:931 part/serializers.py:1278 +#: part/serializers.py:1733 msgid "On Order" msgstr "Ordinato" @@ -963,7 +963,7 @@ msgstr "L'output della produzione non corrisponde all'ordine di compilazione" #: build/models.py:1136 build/models.py:1234 build/serializers.py:285 #: build/serializers.py:335 build/serializers.py:965 build/serializers.py:1739 #: order/models.py:717 order/serializers.py:658 order/serializers.py:844 -#: part/serializers.py:1708 stock/models.py:940 stock/models.py:1430 +#: part/serializers.py:1680 stock/models.py:940 stock/models.py:1430 #: stock/models.py:1878 stock/serializers.py:688 stock/serializers.py:1580 msgid "Quantity must be greater than zero" msgstr "La quantità deve essere maggiore di zero" @@ -1385,20 +1385,20 @@ msgstr "Consenti Le Varianti" msgid "BOM Item" msgstr "Distinta base (Bom)" -#: build/serializers.py:1467 order/serializers.py:1282 part/serializers.py:1310 -#: part/serializers.py:1765 +#: build/serializers.py:1467 order/serializers.py:1282 part/serializers.py:1282 +#: part/serializers.py:1737 msgid "In Production" msgstr "In Produzione" -#: build/serializers.py:1469 part/serializers.py:950 part/serializers.py:1314 +#: build/serializers.py:1469 part/serializers.py:922 part/serializers.py:1286 msgid "Scheduled to Build" msgstr "Pianificato per la produzione" -#: build/serializers.py:1472 part/serializers.py:987 +#: build/serializers.py:1472 part/serializers.py:959 msgid "External Stock" msgstr "Scorte esterne" -#: build/serializers.py:1473 part/serializers.py:1300 part/serializers.py:1808 +#: build/serializers.py:1473 part/serializers.py:1272 part/serializers.py:1780 msgid "Available Stock" msgstr "Disponibilità in magazzino" @@ -1588,7 +1588,7 @@ msgstr "Utente" msgid "Price break quantity" msgstr "Quantità prezzo limite" -#: common/models.py:1348 company/serializers.py:564 order/models.py:1842 +#: common/models.py:1348 company/serializers.py:357 order/models.py:1842 #: order/models.py:3043 msgid "Price" msgstr "Prezzo" @@ -1760,7 +1760,7 @@ msgstr "Definizione" msgid "Unit definition" msgstr "Definizione unità" -#: common/models.py:1911 common/models.py:1974 stock/models.py:2967 +#: common/models.py:1911 common/models.py:1974 stock/models.py:2984 #: stock/serializers.py:247 msgid "Attachment" msgstr "Allegato" @@ -1839,7 +1839,7 @@ msgstr "Chiave logica dello stato che è uguale a questo stato personalizzato ne #: common/models.py:2090 common/models.py:2329 company/models.py:622 #: machine/serializers.py:27 -#: report/templates/report/inventree_test_report.html:104 stock/models.py:2959 +#: report/templates/report/inventree_test_report.html:104 stock/models.py:2976 msgid "Value" msgstr "Valore" @@ -2048,7 +2048,7 @@ msgid "Response data from the barcode scan" msgstr "Dati di risposta dalla scansione del codice a barre" #: common/models.py:2417 report/templates/report/inventree_test_report.html:103 -#: stock/models.py:2953 +#: stock/models.py:2970 msgid "Result" msgstr "Risultato" @@ -2141,8 +2141,8 @@ msgid "Linked thread for this message" msgstr "Thread collegato a questo messaggio" #: common/models.py:2656 -msgid "Prioriy" -msgstr "Priorità" +msgid "Priority" +msgstr "" #: common/models.py:2698 msgid "Email Thread" @@ -2671,8 +2671,8 @@ msgstr "Gli articoli sono modelli per impostazione predefinita" msgid "Parts can be assembled from other components by default" msgstr "Gli articoli possono essere assemblate da altri componenti per impostazione predefinita" -#: common/setting/system.py:462 part/models.py:1208 part/serializers.py:1734 -#: part/serializers.py:1741 +#: common/setting/system.py:462 part/models.py:1208 part/serializers.py:1706 +#: part/serializers.py:1713 msgid "Component" msgstr "Componente" @@ -3772,7 +3772,7 @@ msgstr "L'articolo interno è attivo" msgid "Supplier is Active" msgstr "Il fornitore è attivo" -#: company/api.py:307 company/models.py:520 company/serializers.py:457 +#: company/api.py:307 company/models.py:520 company/serializers.py:503 #: part/serializers.py:566 msgid "Manufacturer" msgstr "Produttore" @@ -3964,7 +3964,7 @@ msgid "Link to address information (external)" msgstr "Collegamento alle informazioni sull'indirizzo (esterno)" #: company/models.py:492 company/models.py:609 company/models.py:832 -#: company/serializers.py:471 stock/api.py:561 +#: company/serializers.py:517 stock/api.py:561 msgid "Manufacturer Part" msgstr "Codice articolo produttore" @@ -3981,7 +3981,7 @@ msgstr "Seleziona articolo" msgid "Select manufacturer" msgstr "Seleziona Produttore" -#: company/models.py:527 company/serializers.py:479 order/serializers.py:734 +#: company/models.py:527 company/serializers.py:525 order/serializers.py:734 #: part/serializers.py:576 msgid "MPN" msgstr "Codice articolo produttore (MPN)" @@ -4030,7 +4030,7 @@ msgstr "Le unità del pacchetto devono essere maggiori di zero" msgid "Linked manufacturer part must reference the same base part" msgstr "L'articolo del costruttore collegato deve riferirsi alla stesso articolo" -#: company/models.py:810 company/serializers.py:449 company/serializers.py:467 +#: company/models.py:810 company/serializers.py:495 company/serializers.py:513 #: order/models.py:639 part/serializers.py:550 #: plugin/builtin/suppliers/digikey.py:26 plugin/builtin/suppliers/lcsc.py:27 #: plugin/builtin/suppliers/mouser.py:25 plugin/builtin/suppliers/tme.py:27 @@ -4134,10 +4134,14 @@ msgstr "Valuta predefinita utilizzata per questo fornitore" msgid "Company Name" msgstr "Nome Azienda" -#: company/serializers.py:433 part/serializers.py:955 stock/serializers.py:428 +#: company/serializers.py:467 part/serializers.py:927 stock/serializers.py:428 msgid "In Stock" msgstr "In magazzino" +#: company/serializers.py:484 +msgid "Price Breaks" +msgstr "" + #: data_exporter/mixins.py:325 data_exporter/mixins.py:403 msgid "Error occurred during data export" msgstr "Errore durante l'esportazione dei dati" @@ -4290,7 +4294,7 @@ msgstr "Dati riga originali" msgid "Errors" msgstr "Errori" -#: importer/models.py:550 part/serializers.py:1268 +#: importer/models.py:550 part/serializers.py:1240 msgid "Valid" msgstr "Valido" @@ -5677,7 +5681,7 @@ msgstr "Parole chiave per migliorare la visibilità nei risultati di ricerca" msgid "Part category" msgstr "Categoria articolo" -#: part/models.py:1088 part/serializers.py:929 +#: part/models.py:1088 part/serializers.py:901 #: report/templates/report/inventree_stock_location_report.html:103 msgid "IPN" msgstr "IPN - Numero di riferimento interno" @@ -5718,7 +5722,7 @@ msgstr "Scadenza Predefinita" msgid "Expiry time (in days) for stock items of this part" msgstr "Scadenza (in giorni) per gli articoli in giacenza di questo pezzo" -#: part/models.py:1186 part/serializers.py:1003 +#: part/models.py:1186 part/serializers.py:975 msgid "Minimum Stock" msgstr "Scorta Minima" @@ -6418,203 +6422,203 @@ msgstr "L'articolo del produttore che corrisponde a questo MPN esiste già" msgid "Supplier part matching this SKU already exists" msgstr "L'articolo del fornitore che corrisponde a questo SKU esiste già" -#: part/serializers.py:914 +#: part/serializers.py:886 msgid "Category Name" msgstr "Nome Categoria" -#: part/serializers.py:943 +#: part/serializers.py:915 msgid "Building" msgstr "In Costruzione" -#: part/serializers.py:944 +#: part/serializers.py:916 msgid "Quantity of this part currently being in production" msgstr "Quantità di questo articolo attualmente in produzione" -#: part/serializers.py:951 +#: part/serializers.py:923 msgid "Outstanding quantity of this part scheduled to be built" msgstr "" -#: part/serializers.py:971 stock/serializers.py:1019 stock/serializers.py:1189 +#: part/serializers.py:943 stock/serializers.py:1019 stock/serializers.py:1189 #: users/ruleset.py:30 msgid "Stock Items" msgstr "Articoli in magazzino" -#: part/serializers.py:975 +#: part/serializers.py:947 msgid "Revisions" msgstr "Revisioni" -#: part/serializers.py:979 +#: part/serializers.py:951 msgid "Suppliers" msgstr "Fornitori" -#: part/serializers.py:983 part/serializers.py:1297 +#: part/serializers.py:955 part/serializers.py:1269 #: templates/email/low_stock_notification.html:16 #: templates/email/part_event_notification.html:17 msgid "Total Stock" msgstr "Giacenze Totali" -#: part/serializers.py:991 +#: part/serializers.py:963 msgid "Unallocated Stock" msgstr "Scorte Non Assegnate" -#: part/serializers.py:999 +#: part/serializers.py:971 msgid "Variant Stock" msgstr "Scorta Variante" -#: part/serializers.py:1054 +#: part/serializers.py:1026 msgid "Duplicate Part" msgstr "Duplica articolo" -#: part/serializers.py:1055 +#: part/serializers.py:1027 msgid "Copy initial data from another Part" msgstr "Copia i dati iniziali da un altro Articolo" -#: part/serializers.py:1061 +#: part/serializers.py:1033 msgid "Initial Stock" msgstr "Stock iniziale" -#: part/serializers.py:1062 +#: part/serializers.py:1034 msgid "Create Part with initial stock quantity" msgstr "Crea Articolo con quantità di scorta iniziale" -#: part/serializers.py:1068 +#: part/serializers.py:1040 msgid "Supplier Information" msgstr "Informazioni Fornitore" -#: part/serializers.py:1069 +#: part/serializers.py:1041 msgid "Add initial supplier information for this part" msgstr "Aggiungi le informazioni iniziali del fornitore per questo articolo" -#: part/serializers.py:1077 +#: part/serializers.py:1049 msgid "Copy Category Parameters" msgstr "Copia Parametri Categoria" -#: part/serializers.py:1078 +#: part/serializers.py:1050 msgid "Copy parameter templates from selected part category" msgstr "Copia i parametri dai modelli della categoria articolo selezionata" -#: part/serializers.py:1083 +#: part/serializers.py:1055 msgid "Existing Image" msgstr "Immagine esistente" -#: part/serializers.py:1084 +#: part/serializers.py:1056 msgid "Filename of an existing part image" msgstr "Nome del file di un'immagine articolo esistente" -#: part/serializers.py:1101 +#: part/serializers.py:1073 msgid "Image file does not exist" msgstr "Il file immagine non esiste" -#: part/serializers.py:1269 +#: part/serializers.py:1241 msgid "Validate entire Bill of Materials" msgstr "Convalida l'intera Fattura dei Materiali" -#: part/serializers.py:1303 part/serializers.py:1769 +#: part/serializers.py:1275 part/serializers.py:1741 msgid "Can Build" msgstr "Puoi produrre" -#: part/serializers.py:1320 +#: part/serializers.py:1292 msgid "Required for Build Orders" msgstr "Richiesto per gli Ordini di Produzione" -#: part/serializers.py:1325 +#: part/serializers.py:1297 msgid "Allocated to Build Orders" msgstr "Assegnato agli Ordini di Produzione" -#: part/serializers.py:1332 +#: part/serializers.py:1304 msgid "Required for Sales Orders" msgstr "Richiesto per gli Ordini di Vendita" -#: part/serializers.py:1336 +#: part/serializers.py:1308 msgid "Allocated to Sales Orders" msgstr "Assegnato agli Ordini di Vendita" -#: part/serializers.py:1475 +#: part/serializers.py:1447 msgid "Minimum Price" msgstr "Prezzo Minimo" -#: part/serializers.py:1476 +#: part/serializers.py:1448 msgid "Override calculated value for minimum price" msgstr "Sovrascrivi valore calcolato per il prezzo minimo" -#: part/serializers.py:1483 +#: part/serializers.py:1455 msgid "Minimum price currency" msgstr "Valuta del prezzo minimo" -#: part/serializers.py:1490 +#: part/serializers.py:1462 msgid "Maximum Price" msgstr "Prezzo Massimo" -#: part/serializers.py:1491 +#: part/serializers.py:1463 msgid "Override calculated value for maximum price" msgstr "Sovrascrivi valore calcolato per il prezzo massimo" -#: part/serializers.py:1498 +#: part/serializers.py:1470 msgid "Maximum price currency" msgstr "Valuta del prezzo massimo" -#: part/serializers.py:1527 +#: part/serializers.py:1499 msgid "Update" msgstr "Aggiorna" -#: part/serializers.py:1528 +#: part/serializers.py:1500 msgid "Update pricing for this part" msgstr "Aggiorna i prezzi per questo articolo" -#: part/serializers.py:1551 +#: part/serializers.py:1523 #, python-brace-format msgid "Could not convert from provided currencies to {default_currency}" msgstr "Impossibile convertire dalle valute fornite in {default_currency}" -#: part/serializers.py:1558 +#: part/serializers.py:1530 msgid "Minimum price must not be greater than maximum price" msgstr "Il prezzo minimo non può essere maggiore del prezzo massimo" -#: part/serializers.py:1561 +#: part/serializers.py:1533 msgid "Maximum price must not be less than minimum price" msgstr "Il prezzo massimo non può essere minore del prezzo minimo" -#: part/serializers.py:1715 +#: part/serializers.py:1687 msgid "Select the parent assembly" msgstr "" -#: part/serializers.py:1735 +#: part/serializers.py:1707 msgid "Select the component part" msgstr "Seleziona la componente" -#: part/serializers.py:1929 +#: part/serializers.py:1901 msgid "Select part to copy BOM from" msgstr "Seleziona l'articolo da cui copiare la distinta base" -#: part/serializers.py:1937 +#: part/serializers.py:1909 msgid "Remove Existing Data" msgstr "Rimuovi Dati Esistenti" -#: part/serializers.py:1938 +#: part/serializers.py:1910 msgid "Remove existing BOM items before copying" msgstr "Rimuovi elementi distinta base esistenti prima di copiare" -#: part/serializers.py:1943 +#: part/serializers.py:1915 msgid "Include Inherited" msgstr "Includi Ereditato" -#: part/serializers.py:1944 +#: part/serializers.py:1916 msgid "Include BOM items which are inherited from templated parts" msgstr "Includi gli elementi Distinta Base ereditati da prodotti template" -#: part/serializers.py:1949 +#: part/serializers.py:1921 msgid "Skip Invalid Rows" msgstr "Salta Righe Non Valide" -#: part/serializers.py:1950 +#: part/serializers.py:1922 msgid "Enable this option to skip invalid rows" msgstr "Abilita questa opzione per saltare le righe non valide" -#: part/serializers.py:1955 +#: part/serializers.py:1927 msgid "Copy Substitute Parts" msgstr "Copia Articoli sostitutivi" -#: part/serializers.py:1956 +#: part/serializers.py:1928 msgid "Copy substitute parts when duplicate BOM items" msgstr "Copia articoli sostitutivi quando duplichi gli elementi distinta base" @@ -8455,115 +8459,119 @@ msgstr "I numeri di serie devono essere forniti come elenco" msgid "Quantity does not match serial numbers" msgstr "La quantità non corrisponde ai numeri di serie" -#: stock/models.py:2012 stock/models.py:2917 +#: stock/models.py:1912 +msgid "Cannot assign stock to structural location" +msgstr "" + +#: stock/models.py:2029 stock/models.py:2934 msgid "Test template does not exist" msgstr "" -#: stock/models.py:2030 +#: stock/models.py:2047 msgid "Stock item has been assigned to a sales order" msgstr "L'elemento di magazzino è stato assegnato a un ordine di vendita" -#: stock/models.py:2034 +#: stock/models.py:2051 msgid "Stock item is installed in another item" msgstr "L'elemento di magazzino è installato in un altro elemento" -#: stock/models.py:2037 +#: stock/models.py:2054 msgid "Stock item contains other items" msgstr "L'elemento di magazzino contiene altri elementi" -#: stock/models.py:2040 +#: stock/models.py:2057 msgid "Stock item has been assigned to a customer" msgstr "L'elemento di magazzino è stato assegnato a un cliente" -#: stock/models.py:2043 stock/models.py:2226 +#: stock/models.py:2060 stock/models.py:2243 msgid "Stock item is currently in production" msgstr "L'elemento di magazzino è attualmente in produzione" -#: stock/models.py:2046 +#: stock/models.py:2063 msgid "Serialized stock cannot be merged" msgstr "Il magazzino serializzato non può essere unito" -#: stock/models.py:2053 stock/serializers.py:1462 +#: stock/models.py:2070 stock/serializers.py:1462 msgid "Duplicate stock items" msgstr "Duplica elementi di magazzino" -#: stock/models.py:2057 +#: stock/models.py:2074 msgid "Stock items must refer to the same part" msgstr "Gli elementi di magazzino devono riferirsi allo stesso articolo" -#: stock/models.py:2065 +#: stock/models.py:2082 msgid "Stock items must refer to the same supplier part" msgstr "Gli elementi di magazzino devono riferirsi allo stesso articolo fornitore" -#: stock/models.py:2070 +#: stock/models.py:2087 msgid "Stock status codes must match" msgstr "I codici di stato dello stock devono corrispondere" -#: stock/models.py:2349 +#: stock/models.py:2366 msgid "StockItem cannot be moved as it is not in stock" msgstr "Le giacenze non possono essere spostate perché non disponibili" -#: stock/models.py:2818 +#: stock/models.py:2835 msgid "Stock Item Tracking" msgstr "" -#: stock/models.py:2849 +#: stock/models.py:2866 msgid "Entry notes" msgstr "Note d'ingresso" -#: stock/models.py:2889 +#: stock/models.py:2906 msgid "Stock Item Test Result" msgstr "" -#: stock/models.py:2920 +#: stock/models.py:2937 msgid "Value must be provided for this test" msgstr "Il valore deve essere fornito per questo test" -#: stock/models.py:2924 +#: stock/models.py:2941 msgid "Attachment must be uploaded for this test" msgstr "L'allegato deve essere caricato per questo test" -#: stock/models.py:2929 +#: stock/models.py:2946 msgid "Invalid value for this test" msgstr "" -#: stock/models.py:2953 +#: stock/models.py:2970 msgid "Test result" msgstr "Risultato Test" -#: stock/models.py:2960 +#: stock/models.py:2977 msgid "Test output value" msgstr "Test valore output" -#: stock/models.py:2968 stock/serializers.py:248 +#: stock/models.py:2985 stock/serializers.py:248 msgid "Test result attachment" msgstr "Risultato della prova allegato" -#: stock/models.py:2972 +#: stock/models.py:2989 msgid "Test notes" msgstr "Note del test" -#: stock/models.py:2980 +#: stock/models.py:2997 msgid "Test station" msgstr "" -#: stock/models.py:2981 +#: stock/models.py:2998 msgid "The identifier of the test station where the test was performed" msgstr "" -#: stock/models.py:2987 +#: stock/models.py:3004 msgid "Started" msgstr "" -#: stock/models.py:2988 +#: stock/models.py:3005 msgid "The timestamp of the test start" msgstr "" -#: stock/models.py:2994 +#: stock/models.py:3011 msgid "Finished" msgstr "" -#: stock/models.py:2995 +#: stock/models.py:3012 msgid "The timestamp of the test finish" msgstr "" @@ -8902,83 +8910,87 @@ msgstr "Stock aggiunto manualmente" msgid "Stock manually removed" msgstr "Stock rimosso manualmente" -#: stock/status_codes.py:57 +#: stock/status_codes.py:56 +msgid "Serialized stock items" +msgstr "" + +#: stock/status_codes.py:58 msgid "Returned to stock" msgstr "" -#: stock/status_codes.py:60 +#: stock/status_codes.py:61 msgid "Location changed" msgstr "Posizione cambiata" -#: stock/status_codes.py:61 +#: stock/status_codes.py:62 msgid "Stock updated" msgstr "Stock aggiornato" -#: stock/status_codes.py:64 +#: stock/status_codes.py:65 msgid "Installed into assembly" msgstr "Installato nell'assemblaggio" -#: stock/status_codes.py:65 +#: stock/status_codes.py:66 msgid "Removed from assembly" msgstr "Rimosso dall'assemblaggio" -#: stock/status_codes.py:67 +#: stock/status_codes.py:68 msgid "Installed component item" msgstr "Componente installato" -#: stock/status_codes.py:68 +#: stock/status_codes.py:69 msgid "Removed component item" msgstr "Elemento componente rimosso" -#: stock/status_codes.py:71 +#: stock/status_codes.py:72 msgid "Split from parent item" msgstr "Diviso dall'elemento genitore" -#: stock/status_codes.py:72 +#: stock/status_codes.py:73 msgid "Split child item" msgstr "Dividi elemento figlio" -#: stock/status_codes.py:75 +#: stock/status_codes.py:76 msgid "Merged stock items" msgstr "Elemento stock raggruppato" -#: stock/status_codes.py:78 +#: stock/status_codes.py:79 msgid "Converted to variant" msgstr "Convertito in variante" -#: stock/status_codes.py:81 +#: stock/status_codes.py:82 msgid "Build order output created" msgstr "Genera l'output dell'ordine creato" -#: stock/status_codes.py:82 +#: stock/status_codes.py:83 msgid "Build order output completed" msgstr "Build order output completato" -#: stock/status_codes.py:83 +#: stock/status_codes.py:84 msgid "Build order output rejected" msgstr "Ordine di costruzione rifiutato" -#: stock/status_codes.py:84 +#: stock/status_codes.py:85 msgid "Consumed by build order" msgstr "Impegnato dall'ordine di costruzione" -#: stock/status_codes.py:87 +#: stock/status_codes.py:88 msgid "Shipped against Sales Order" msgstr "Spedito contro l'ordine di vendita" -#: stock/status_codes.py:90 +#: stock/status_codes.py:91 msgid "Received against Purchase Order" msgstr "Ricevuto contro l'ordine di acquisto" -#: stock/status_codes.py:93 +#: stock/status_codes.py:94 msgid "Returned against Return Order" msgstr "Restituito contro l'ordine di ritorno" -#: stock/status_codes.py:96 +#: stock/status_codes.py:97 msgid "Sent to customer" msgstr "Inviato al cliente" -#: stock/status_codes.py:97 +#: stock/status_codes.py:98 msgid "Returned from customer" msgstr "Restituito dal cliente" diff --git a/src/backend/InvenTree/locale/ja/LC_MESSAGES/django.po b/src/backend/InvenTree/locale/ja/LC_MESSAGES/django.po index f76ff41c13..ccb347e268 100644 --- a/src/backend/InvenTree/locale/ja/LC_MESSAGES/django.po +++ b/src/backend/InvenTree/locale/ja/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: inventree\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-11-19 04:55+0000\n" -"PO-Revision-Date: 2025-11-19 04:59\n" +"POT-Creation-Date: 2025-11-24 06:50+0000\n" +"PO-Revision-Date: 2025-11-24 06:54\n" "Last-Translator: \n" "Language-Team: Japanese\n" "Language: ja_JP\n" @@ -81,21 +81,21 @@ msgstr "指定されたプライマリEメールアドレスは無効です。" msgid "The provided email domain is not approved." msgstr "指定されたメールドメインは承認されていません。" -#: InvenTree/conversion.py:166 +#: InvenTree/conversion.py:240 #, python-brace-format msgid "Invalid unit provided ({unit})" msgstr "無効な単位 ({unit})" -#: InvenTree/conversion.py:183 +#: InvenTree/conversion.py:257 msgid "No value provided" msgstr "値がありません" -#: InvenTree/conversion.py:210 +#: InvenTree/conversion.py:284 #, python-brace-format msgid "Could not convert {original} to {unit}" msgstr "{original}を{unit}に変換できませんでした。" -#: InvenTree/conversion.py:212 InvenTree/conversion.py:226 +#: InvenTree/conversion.py:286 InvenTree/conversion.py:300 #: InvenTree/helpers.py:597 order/models.py:720 order/models.py:1015 msgid "Invalid quantity provided" msgstr "数量コードが無効です" @@ -116,7 +116,7 @@ msgstr "無効な10進数値" #: build/serializers.py:580 build/serializers.py:1788 company/models.py:857 #: order/models.py:1780 #: report/templates/report/inventree_build_order_report.html:172 -#: stock/models.py:2848 stock/models.py:2972 stock/serializers.py:717 +#: stock/models.py:2865 stock/models.py:2989 stock/serializers.py:717 #: stock/serializers.py:893 stock/serializers.py:1035 stock/serializers.py:1336 #: stock/serializers.py:1425 stock/serializers.py:1624 msgid "Notes" @@ -345,7 +345,7 @@ msgstr "有効な数字でなければなりません" msgid "Currency" msgstr "通貨" -#: InvenTree/serializers.py:298 part/serializers.py:1385 +#: InvenTree/serializers.py:298 part/serializers.py:1357 msgid "Select currency from available options" msgstr "利用可能なオプションから通貨を選択してください" @@ -553,14 +553,14 @@ msgstr "バリアントを含む" #: build/api.py:100 build/api.py:466 build/api.py:845 build/models.py:270 #: build/serializers.py:1225 build/serializers.py:1356 -#: build/serializers.py:1427 company/models.py:1067 company/serializers.py:445 +#: build/serializers.py:1427 company/models.py:1067 company/serializers.py:491 #: order/api.py:298 order/api.py:302 order/api.py:929 order/api.py:1187 #: order/api.py:1190 order/models.py:1941 order/models.py:2108 #: order/models.py:2109 part/api.py:1233 part/api.py:1236 part/api.py:1302 #: part/api.py:1589 part/models.py:472 part/models.py:3296 part/models.py:3439 #: part/models.py:3497 part/models.py:3518 part/models.py:3540 #: part/models.py:3679 part/models.py:4046 part/models.py:4368 -#: part/models.py:4787 part/serializers.py:1928 +#: part/models.py:4787 part/serializers.py:1900 #: report/templates/report/inventree_bill_of_materials_report.html:110 #: report/templates/report/inventree_bill_of_materials_report.html:137 #: report/templates/report/inventree_build_order_report.html:109 @@ -582,7 +582,7 @@ msgstr "パーツ" #: build/api.py:120 build/api.py:123 build/serializers.py:1438 part/api.py:980 #: part/api.py:1316 part/api.py:1600 part/models.py:1080 part/models.py:3568 -#: part/models.py:4162 part/serializers.py:1752 stock/api.py:869 +#: part/models.py:4162 part/serializers.py:1724 stock/api.py:869 msgid "Category" msgstr "カテゴリ" @@ -663,7 +663,7 @@ msgid "Optional" msgstr "オプション" #: build/api.py:455 build/serializers.py:1415 common/setting/system.py:456 -#: part/models.py:1202 part/serializers.py:1714 part/serializers.py:1725 +#: part/models.py:1202 part/serializers.py:1686 part/serializers.py:1697 #: stock/api.py:639 msgid "Assembly" msgstr "アセンブリ" @@ -688,16 +688,16 @@ msgstr "割り当てられた" msgid "Consumed" msgstr "" -#: build/api.py:499 company/models.py:912 company/serializers.py:440 +#: build/api.py:499 company/models.py:912 company/serializers.py:474 #: templates/email/build_order_required_stock.html:19 #: templates/email/low_stock_notification.html:17 #: templates/email/part_event_notification.html:18 msgid "Available" msgstr "利用可能" -#: build/api.py:523 build/serializers.py:1466 company/serializers.py:437 -#: order/serializers.py:1281 part/serializers.py:959 part/serializers.py:1306 -#: part/serializers.py:1761 +#: build/api.py:523 build/serializers.py:1466 company/serializers.py:471 +#: order/serializers.py:1281 part/serializers.py:931 part/serializers.py:1278 +#: part/serializers.py:1733 msgid "On Order" msgstr "注文中" @@ -963,7 +963,7 @@ msgstr "ビルド出力がビルド順序と一致しません" #: build/models.py:1136 build/models.py:1234 build/serializers.py:285 #: build/serializers.py:335 build/serializers.py:965 build/serializers.py:1739 #: order/models.py:717 order/serializers.py:658 order/serializers.py:844 -#: part/serializers.py:1708 stock/models.py:940 stock/models.py:1430 +#: part/serializers.py:1680 stock/models.py:940 stock/models.py:1430 #: stock/models.py:1878 stock/serializers.py:688 stock/serializers.py:1580 msgid "Quantity must be greater than zero" msgstr "数量はゼロより大きくなければなりません" @@ -1385,20 +1385,20 @@ msgstr "バリアントを許可" msgid "BOM Item" msgstr "BOMアイテム" -#: build/serializers.py:1467 order/serializers.py:1282 part/serializers.py:1310 -#: part/serializers.py:1765 +#: build/serializers.py:1467 order/serializers.py:1282 part/serializers.py:1282 +#: part/serializers.py:1737 msgid "In Production" msgstr "生産中" -#: build/serializers.py:1469 part/serializers.py:950 part/serializers.py:1314 +#: build/serializers.py:1469 part/serializers.py:922 part/serializers.py:1286 msgid "Scheduled to Build" msgstr "" -#: build/serializers.py:1472 part/serializers.py:987 +#: build/serializers.py:1472 part/serializers.py:959 msgid "External Stock" msgstr "外部在庫" -#: build/serializers.py:1473 part/serializers.py:1300 part/serializers.py:1808 +#: build/serializers.py:1473 part/serializers.py:1272 part/serializers.py:1780 msgid "Available Stock" msgstr "在庫状況" @@ -1588,7 +1588,7 @@ msgstr "ユーザー" msgid "Price break quantity" msgstr "価格破壊数量" -#: common/models.py:1348 company/serializers.py:564 order/models.py:1842 +#: common/models.py:1348 company/serializers.py:357 order/models.py:1842 #: order/models.py:3043 msgid "Price" msgstr "価格" @@ -1760,7 +1760,7 @@ msgstr "定義" msgid "Unit definition" msgstr "ユニットの定義" -#: common/models.py:1911 common/models.py:1974 stock/models.py:2967 +#: common/models.py:1911 common/models.py:1974 stock/models.py:2984 #: stock/serializers.py:247 msgid "Attachment" msgstr "添付ファイル" @@ -1839,7 +1839,7 @@ msgstr "ビジネスロジックでこのカスタムステートに等しいス #: common/models.py:2090 common/models.py:2329 company/models.py:622 #: machine/serializers.py:27 -#: report/templates/report/inventree_test_report.html:104 stock/models.py:2959 +#: report/templates/report/inventree_test_report.html:104 stock/models.py:2976 msgid "Value" msgstr "値" @@ -2048,7 +2048,7 @@ msgid "Response data from the barcode scan" msgstr "バーコードスキャンによるレスポンスデータ" #: common/models.py:2417 report/templates/report/inventree_test_report.html:103 -#: stock/models.py:2953 +#: stock/models.py:2970 msgid "Result" msgstr "結果" @@ -2141,7 +2141,7 @@ msgid "Linked thread for this message" msgstr "" #: common/models.py:2656 -msgid "Prioriy" +msgid "Priority" msgstr "" #: common/models.py:2698 @@ -2671,8 +2671,8 @@ msgstr "パーツはデフォルトのテンプレートです" msgid "Parts can be assembled from other components by default" msgstr "パーツはデフォルトで他のコンポーネントから組み立てることができます" -#: common/setting/system.py:462 part/models.py:1208 part/serializers.py:1734 -#: part/serializers.py:1741 +#: common/setting/system.py:462 part/models.py:1208 part/serializers.py:1706 +#: part/serializers.py:1713 msgid "Component" msgstr "コンポーネント" @@ -3772,7 +3772,7 @@ msgstr "内部はアクティブ" msgid "Supplier is Active" msgstr "サプライヤーの活動" -#: company/api.py:307 company/models.py:520 company/serializers.py:457 +#: company/api.py:307 company/models.py:520 company/serializers.py:503 #: part/serializers.py:566 msgid "Manufacturer" msgstr "製造元" @@ -3964,7 +3964,7 @@ msgid "Link to address information (external)" msgstr "住所情報へのリンク(外部)" #: company/models.py:492 company/models.py:609 company/models.py:832 -#: company/serializers.py:471 stock/api.py:561 +#: company/serializers.py:517 stock/api.py:561 msgid "Manufacturer Part" msgstr "メーカー・パーツ" @@ -3981,7 +3981,7 @@ msgstr "部品を選択" msgid "Select manufacturer" msgstr "メーカー選択" -#: company/models.py:527 company/serializers.py:479 order/serializers.py:734 +#: company/models.py:527 company/serializers.py:525 order/serializers.py:734 #: part/serializers.py:576 msgid "MPN" msgstr "MPN" @@ -4030,7 +4030,7 @@ msgstr "パック単位はゼロより大きくなければなりません。" msgid "Linked manufacturer part must reference the same base part" msgstr "リンクされたメーカー部品は、同じベース部品を参照する必要があります。" -#: company/models.py:810 company/serializers.py:449 company/serializers.py:467 +#: company/models.py:810 company/serializers.py:495 company/serializers.py:513 #: order/models.py:639 part/serializers.py:550 #: plugin/builtin/suppliers/digikey.py:26 plugin/builtin/suppliers/lcsc.py:27 #: plugin/builtin/suppliers/mouser.py:25 plugin/builtin/suppliers/tme.py:27 @@ -4134,10 +4134,14 @@ msgstr "このサプライヤーで使用されるデフォルト通貨" msgid "Company Name" msgstr "会社名" -#: company/serializers.py:433 part/serializers.py:955 stock/serializers.py:428 +#: company/serializers.py:467 part/serializers.py:927 stock/serializers.py:428 msgid "In Stock" msgstr "在庫あり" +#: company/serializers.py:484 +msgid "Price Breaks" +msgstr "" + #: data_exporter/mixins.py:325 data_exporter/mixins.py:403 msgid "Error occurred during data export" msgstr "データのエクスポート中にエラーが発生しました" @@ -4290,7 +4294,7 @@ msgstr "元の行データ" msgid "Errors" msgstr "エラー" -#: importer/models.py:550 part/serializers.py:1268 +#: importer/models.py:550 part/serializers.py:1240 msgid "Valid" msgstr "有効" @@ -5677,7 +5681,7 @@ msgstr "検索結果での視認性を向上させる部分キーワード" msgid "Part category" msgstr "パーツカテゴリ" -#: part/models.py:1088 part/serializers.py:929 +#: part/models.py:1088 part/serializers.py:901 #: report/templates/report/inventree_stock_location_report.html:103 msgid "IPN" msgstr "即時支払通知" @@ -5718,7 +5722,7 @@ msgstr "デフォルトの有効期限" msgid "Expiry time (in days) for stock items of this part" msgstr "この部品の在庫品の有効期限(日単位" -#: part/models.py:1186 part/serializers.py:1003 +#: part/models.py:1186 part/serializers.py:975 msgid "Minimum Stock" msgstr "最小在庫" @@ -6418,203 +6422,203 @@ msgstr "このMPNに一致するメーカー部品はすでに存在します。 msgid "Supplier part matching this SKU already exists" msgstr "このSKUに一致するサプライヤー部品は既に存在します。" -#: part/serializers.py:914 +#: part/serializers.py:886 msgid "Category Name" msgstr "カテゴリ名" -#: part/serializers.py:943 +#: part/serializers.py:915 msgid "Building" msgstr "建物" -#: part/serializers.py:944 +#: part/serializers.py:916 msgid "Quantity of this part currently being in production" msgstr "" -#: part/serializers.py:951 +#: part/serializers.py:923 msgid "Outstanding quantity of this part scheduled to be built" msgstr "" -#: part/serializers.py:971 stock/serializers.py:1019 stock/serializers.py:1189 +#: part/serializers.py:943 stock/serializers.py:1019 stock/serializers.py:1189 #: users/ruleset.py:30 msgid "Stock Items" msgstr "在庫商品" -#: part/serializers.py:975 +#: part/serializers.py:947 msgid "Revisions" msgstr "リビジョン" -#: part/serializers.py:979 +#: part/serializers.py:951 msgid "Suppliers" msgstr "仕入先" -#: part/serializers.py:983 part/serializers.py:1297 +#: part/serializers.py:955 part/serializers.py:1269 #: templates/email/low_stock_notification.html:16 #: templates/email/part_event_notification.html:17 msgid "Total Stock" msgstr "総在庫" -#: part/serializers.py:991 +#: part/serializers.py:963 msgid "Unallocated Stock" msgstr "未割当株式" -#: part/serializers.py:999 +#: part/serializers.py:971 msgid "Variant Stock" msgstr "バリアントストック" -#: part/serializers.py:1054 +#: part/serializers.py:1026 msgid "Duplicate Part" msgstr "重複部分" -#: part/serializers.py:1055 +#: part/serializers.py:1027 msgid "Copy initial data from another Part" msgstr "別のパートから初期データをコピー" -#: part/serializers.py:1061 +#: part/serializers.py:1033 msgid "Initial Stock" msgstr "初期在庫" -#: part/serializers.py:1062 +#: part/serializers.py:1034 msgid "Create Part with initial stock quantity" msgstr "初期在庫数で部品を作成" -#: part/serializers.py:1068 +#: part/serializers.py:1040 msgid "Supplier Information" msgstr "サプライヤー情報" -#: part/serializers.py:1069 +#: part/serializers.py:1041 msgid "Add initial supplier information for this part" msgstr "この部品の初期サプライヤー情報を追加します。" -#: part/serializers.py:1077 +#: part/serializers.py:1049 msgid "Copy Category Parameters" msgstr "コピーカテゴリパラメータ" -#: part/serializers.py:1078 +#: part/serializers.py:1050 msgid "Copy parameter templates from selected part category" msgstr "選択したパーツカテゴリーからパラメータテンプレートをコピー" -#: part/serializers.py:1083 +#: part/serializers.py:1055 msgid "Existing Image" msgstr "既存イメージ" -#: part/serializers.py:1084 +#: part/serializers.py:1056 msgid "Filename of an existing part image" msgstr "既存の部品画像のファイル名" -#: part/serializers.py:1101 +#: part/serializers.py:1073 msgid "Image file does not exist" msgstr "画像ファイルが存在しません" -#: part/serializers.py:1269 +#: part/serializers.py:1241 msgid "Validate entire Bill of Materials" msgstr "部品表全体の検証" -#: part/serializers.py:1303 part/serializers.py:1769 +#: part/serializers.py:1275 part/serializers.py:1741 msgid "Can Build" msgstr "ビルド" -#: part/serializers.py:1320 +#: part/serializers.py:1292 msgid "Required for Build Orders" msgstr "" -#: part/serializers.py:1325 +#: part/serializers.py:1297 msgid "Allocated to Build Orders" msgstr "" -#: part/serializers.py:1332 +#: part/serializers.py:1304 msgid "Required for Sales Orders" msgstr "" -#: part/serializers.py:1336 +#: part/serializers.py:1308 msgid "Allocated to Sales Orders" msgstr "" -#: part/serializers.py:1475 +#: part/serializers.py:1447 msgid "Minimum Price" msgstr "最小価格" -#: part/serializers.py:1476 +#: part/serializers.py:1448 msgid "Override calculated value for minimum price" msgstr "最低価格の計算値の上書き" -#: part/serializers.py:1483 +#: part/serializers.py:1455 msgid "Minimum price currency" msgstr "最低価格通貨" -#: part/serializers.py:1490 +#: part/serializers.py:1462 msgid "Maximum Price" msgstr "最大価格" -#: part/serializers.py:1491 +#: part/serializers.py:1463 msgid "Override calculated value for maximum price" msgstr "最高価格の計算値を上書き" -#: part/serializers.py:1498 +#: part/serializers.py:1470 msgid "Maximum price currency" msgstr "最高価格通貨" -#: part/serializers.py:1527 +#: part/serializers.py:1499 msgid "Update" msgstr "更新" -#: part/serializers.py:1528 +#: part/serializers.py:1500 msgid "Update pricing for this part" msgstr "この部品の価格を更新" -#: part/serializers.py:1551 +#: part/serializers.py:1523 #, python-brace-format msgid "Could not convert from provided currencies to {default_currency}" msgstr "提供された通貨から{default_currency}に変換できませんでした。" -#: part/serializers.py:1558 +#: part/serializers.py:1530 msgid "Minimum price must not be greater than maximum price" msgstr "最低価格は最高価格を超えてはなりません。" -#: part/serializers.py:1561 +#: part/serializers.py:1533 msgid "Maximum price must not be less than minimum price" msgstr "最高価格は最低価格を下回ってはなりません。" -#: part/serializers.py:1715 +#: part/serializers.py:1687 msgid "Select the parent assembly" msgstr "親アセンブリを選択" -#: part/serializers.py:1735 +#: part/serializers.py:1707 msgid "Select the component part" msgstr "構成部品の選択" -#: part/serializers.py:1929 +#: part/serializers.py:1901 msgid "Select part to copy BOM from" msgstr "BOMをコピーする部品を選択します。" -#: part/serializers.py:1937 +#: part/serializers.py:1909 msgid "Remove Existing Data" msgstr "既存データの削除" -#: part/serializers.py:1938 +#: part/serializers.py:1910 msgid "Remove existing BOM items before copying" msgstr "コピー前に既存のBOMアイテムを削除" -#: part/serializers.py:1943 +#: part/serializers.py:1915 msgid "Include Inherited" msgstr "インクルード継承" -#: part/serializers.py:1944 +#: part/serializers.py:1916 msgid "Include BOM items which are inherited from templated parts" msgstr "テンプレート化された部品から継承されたBOM項目を含めます。" -#: part/serializers.py:1949 +#: part/serializers.py:1921 msgid "Skip Invalid Rows" msgstr "無効な行をスキップ" -#: part/serializers.py:1950 +#: part/serializers.py:1922 msgid "Enable this option to skip invalid rows" msgstr "無効な行をスキップするには、このオプションを有効にします。" -#: part/serializers.py:1955 +#: part/serializers.py:1927 msgid "Copy Substitute Parts" msgstr "コピー代用部品" -#: part/serializers.py:1956 +#: part/serializers.py:1928 msgid "Copy substitute parts when duplicate BOM items" msgstr "BOMアイテムの重複時に代替部品をコピー" @@ -8455,115 +8459,119 @@ msgstr "シリアル番号はリストとして提供されなければなりま msgid "Quantity does not match serial numbers" msgstr "数量がシリアル番号と一致しません" -#: stock/models.py:2012 stock/models.py:2917 +#: stock/models.py:1912 +msgid "Cannot assign stock to structural location" +msgstr "" + +#: stock/models.py:2029 stock/models.py:2934 msgid "Test template does not exist" msgstr "テストテンプレートが存在しません" -#: stock/models.py:2030 +#: stock/models.py:2047 msgid "Stock item has been assigned to a sales order" msgstr "在庫商品が販売注文に割り当てられました" -#: stock/models.py:2034 +#: stock/models.py:2051 msgid "Stock item is installed in another item" msgstr "ストックアイテムが他のアイテムに装着されている場合" -#: stock/models.py:2037 +#: stock/models.py:2054 msgid "Stock item contains other items" msgstr "在庫商品には他の商品が含まれています。" -#: stock/models.py:2040 +#: stock/models.py:2057 msgid "Stock item has been assigned to a customer" msgstr "在庫商品が顧客に割り当てられました" -#: stock/models.py:2043 stock/models.py:2226 +#: stock/models.py:2060 stock/models.py:2243 msgid "Stock item is currently in production" msgstr "在庫品は現在生産中です。" -#: stock/models.py:2046 +#: stock/models.py:2063 msgid "Serialized stock cannot be merged" msgstr "連番在庫の統合はできません" -#: stock/models.py:2053 stock/serializers.py:1462 +#: stock/models.py:2070 stock/serializers.py:1462 msgid "Duplicate stock items" msgstr "在庫品の重複" -#: stock/models.py:2057 +#: stock/models.py:2074 msgid "Stock items must refer to the same part" msgstr "在庫品目は同じ部品を参照してください。" -#: stock/models.py:2065 +#: stock/models.py:2082 msgid "Stock items must refer to the same supplier part" msgstr "在庫品は同じサプライヤーの部品を参照する必要があります。" -#: stock/models.py:2070 +#: stock/models.py:2087 msgid "Stock status codes must match" msgstr "在庫状況コードが一致していること" -#: stock/models.py:2349 +#: stock/models.py:2366 msgid "StockItem cannot be moved as it is not in stock" msgstr "在庫がないため移動できません。" -#: stock/models.py:2818 +#: stock/models.py:2835 msgid "Stock Item Tracking" msgstr "ストックアイテムのトラッキング" -#: stock/models.py:2849 +#: stock/models.py:2866 msgid "Entry notes" msgstr "記入上の注意" -#: stock/models.py:2889 +#: stock/models.py:2906 msgid "Stock Item Test Result" msgstr "在庫品テスト結果" -#: stock/models.py:2920 +#: stock/models.py:2937 msgid "Value must be provided for this test" msgstr "このテストには値を指定する必要があります。" -#: stock/models.py:2924 +#: stock/models.py:2941 msgid "Attachment must be uploaded for this test" msgstr "このテストには添付ファイルをアップロードする必要があります。" -#: stock/models.py:2929 +#: stock/models.py:2946 msgid "Invalid value for this test" msgstr "このテストでは無効な値です。" -#: stock/models.py:2953 +#: stock/models.py:2970 msgid "Test result" msgstr "試験結果" -#: stock/models.py:2960 +#: stock/models.py:2977 msgid "Test output value" msgstr "テスト出力値" -#: stock/models.py:2968 stock/serializers.py:248 +#: stock/models.py:2985 stock/serializers.py:248 msgid "Test result attachment" msgstr "試験結果添付" -#: stock/models.py:2972 +#: stock/models.py:2989 msgid "Test notes" msgstr "テストノート" -#: stock/models.py:2980 +#: stock/models.py:2997 msgid "Test station" msgstr "テストステーション" -#: stock/models.py:2981 +#: stock/models.py:2998 msgid "The identifier of the test station where the test was performed" msgstr "試験が実施された試験ステーションの識別子。" -#: stock/models.py:2987 +#: stock/models.py:3004 msgid "Started" msgstr "開始" -#: stock/models.py:2988 +#: stock/models.py:3005 msgid "The timestamp of the test start" msgstr "テスト開始のタイムスタンプ" -#: stock/models.py:2994 +#: stock/models.py:3011 msgid "Finished" msgstr "修了済み" -#: stock/models.py:2995 +#: stock/models.py:3012 msgid "The timestamp of the test finish" msgstr "テスト終了のタイムスタンプ" @@ -8902,83 +8910,87 @@ msgstr "手動在庫追加が完了しました" msgid "Stock manually removed" msgstr "手動在庫削除が完了しました" -#: stock/status_codes.py:57 +#: stock/status_codes.py:56 +msgid "Serialized stock items" +msgstr "" + +#: stock/status_codes.py:58 msgid "Returned to stock" msgstr "" -#: stock/status_codes.py:60 +#: stock/status_codes.py:61 msgid "Location changed" msgstr "ロケーションが変更されました" -#: stock/status_codes.py:61 +#: stock/status_codes.py:62 msgid "Stock updated" msgstr "在庫更新" -#: stock/status_codes.py:64 +#: stock/status_codes.py:65 msgid "Installed into assembly" msgstr "アセンブリへインストールしました" -#: stock/status_codes.py:65 +#: stock/status_codes.py:66 msgid "Removed from assembly" msgstr "アセンブリから削除しました" -#: stock/status_codes.py:67 +#: stock/status_codes.py:68 msgid "Installed component item" msgstr "インストール済みのコンポーネント項目" -#: stock/status_codes.py:68 +#: stock/status_codes.py:69 msgid "Removed component item" msgstr "コンポーネント項目を削除しました" -#: stock/status_codes.py:71 +#: stock/status_codes.py:72 msgid "Split from parent item" msgstr "親アイテムから分割する" -#: stock/status_codes.py:72 +#: stock/status_codes.py:73 msgid "Split child item" msgstr "子項目を分割" -#: stock/status_codes.py:75 +#: stock/status_codes.py:76 msgid "Merged stock items" msgstr "商品在庫をマージしました" -#: stock/status_codes.py:78 +#: stock/status_codes.py:79 msgid "Converted to variant" msgstr "バリアントに変換" -#: stock/status_codes.py:81 +#: stock/status_codes.py:82 msgid "Build order output created" msgstr "組立注文の出力が作成されました" -#: stock/status_codes.py:82 +#: stock/status_codes.py:83 msgid "Build order output completed" msgstr "組立注文の出力が完了しました" -#: stock/status_codes.py:83 +#: stock/status_codes.py:84 msgid "Build order output rejected" msgstr "ビルドオーダーの出力が拒否されました" -#: stock/status_codes.py:84 +#: stock/status_codes.py:85 msgid "Consumed by build order" msgstr "ビルド・オーダーで消費" -#: stock/status_codes.py:87 +#: stock/status_codes.py:88 msgid "Shipped against Sales Order" msgstr "販売注文に対して出荷" -#: stock/status_codes.py:90 +#: stock/status_codes.py:91 msgid "Received against Purchase Order" msgstr "発注書との照合" -#: stock/status_codes.py:93 +#: stock/status_codes.py:94 msgid "Returned against Return Order" msgstr "リターンオーダーに反して返品" -#: stock/status_codes.py:96 +#: stock/status_codes.py:97 msgid "Sent to customer" msgstr "顧客に送信されました" -#: stock/status_codes.py:97 +#: stock/status_codes.py:98 msgid "Returned from customer" msgstr "顧客からの返品" diff --git a/src/backend/InvenTree/locale/ko/LC_MESSAGES/django.po b/src/backend/InvenTree/locale/ko/LC_MESSAGES/django.po index bb4a66f649..e5dfb3985a 100644 --- a/src/backend/InvenTree/locale/ko/LC_MESSAGES/django.po +++ b/src/backend/InvenTree/locale/ko/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: inventree\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-11-19 04:55+0000\n" -"PO-Revision-Date: 2025-11-19 04:59\n" +"POT-Creation-Date: 2025-11-24 06:50+0000\n" +"PO-Revision-Date: 2025-11-24 06:54\n" "Last-Translator: \n" "Language-Team: Korean\n" "Language: ko_KR\n" @@ -81,21 +81,21 @@ msgstr "" msgid "The provided email domain is not approved." msgstr "" -#: InvenTree/conversion.py:166 +#: InvenTree/conversion.py:240 #, python-brace-format msgid "Invalid unit provided ({unit})" msgstr "" -#: InvenTree/conversion.py:183 +#: InvenTree/conversion.py:257 msgid "No value provided" msgstr "" -#: InvenTree/conversion.py:210 +#: InvenTree/conversion.py:284 #, python-brace-format msgid "Could not convert {original} to {unit}" msgstr "" -#: InvenTree/conversion.py:212 InvenTree/conversion.py:226 +#: InvenTree/conversion.py:286 InvenTree/conversion.py:300 #: InvenTree/helpers.py:597 order/models.py:720 order/models.py:1015 msgid "Invalid quantity provided" msgstr "" @@ -116,7 +116,7 @@ msgstr "" #: build/serializers.py:580 build/serializers.py:1788 company/models.py:857 #: order/models.py:1780 #: report/templates/report/inventree_build_order_report.html:172 -#: stock/models.py:2848 stock/models.py:2972 stock/serializers.py:717 +#: stock/models.py:2865 stock/models.py:2989 stock/serializers.py:717 #: stock/serializers.py:893 stock/serializers.py:1035 stock/serializers.py:1336 #: stock/serializers.py:1425 stock/serializers.py:1624 msgid "Notes" @@ -345,7 +345,7 @@ msgstr "" msgid "Currency" msgstr "" -#: InvenTree/serializers.py:298 part/serializers.py:1385 +#: InvenTree/serializers.py:298 part/serializers.py:1357 msgid "Select currency from available options" msgstr "" @@ -553,14 +553,14 @@ msgstr "" #: build/api.py:100 build/api.py:466 build/api.py:845 build/models.py:270 #: build/serializers.py:1225 build/serializers.py:1356 -#: build/serializers.py:1427 company/models.py:1067 company/serializers.py:445 +#: build/serializers.py:1427 company/models.py:1067 company/serializers.py:491 #: order/api.py:298 order/api.py:302 order/api.py:929 order/api.py:1187 #: order/api.py:1190 order/models.py:1941 order/models.py:2108 #: order/models.py:2109 part/api.py:1233 part/api.py:1236 part/api.py:1302 #: part/api.py:1589 part/models.py:472 part/models.py:3296 part/models.py:3439 #: part/models.py:3497 part/models.py:3518 part/models.py:3540 #: part/models.py:3679 part/models.py:4046 part/models.py:4368 -#: part/models.py:4787 part/serializers.py:1928 +#: part/models.py:4787 part/serializers.py:1900 #: report/templates/report/inventree_bill_of_materials_report.html:110 #: report/templates/report/inventree_bill_of_materials_report.html:137 #: report/templates/report/inventree_build_order_report.html:109 @@ -582,7 +582,7 @@ msgstr "" #: build/api.py:120 build/api.py:123 build/serializers.py:1438 part/api.py:980 #: part/api.py:1316 part/api.py:1600 part/models.py:1080 part/models.py:3568 -#: part/models.py:4162 part/serializers.py:1752 stock/api.py:869 +#: part/models.py:4162 part/serializers.py:1724 stock/api.py:869 msgid "Category" msgstr "분류" @@ -663,7 +663,7 @@ msgid "Optional" msgstr "선택사항" #: build/api.py:455 build/serializers.py:1415 common/setting/system.py:456 -#: part/models.py:1202 part/serializers.py:1714 part/serializers.py:1725 +#: part/models.py:1202 part/serializers.py:1686 part/serializers.py:1697 #: stock/api.py:639 msgid "Assembly" msgstr "" @@ -688,16 +688,16 @@ msgstr "" msgid "Consumed" msgstr "" -#: build/api.py:499 company/models.py:912 company/serializers.py:440 +#: build/api.py:499 company/models.py:912 company/serializers.py:474 #: templates/email/build_order_required_stock.html:19 #: templates/email/low_stock_notification.html:17 #: templates/email/part_event_notification.html:18 msgid "Available" msgstr "" -#: build/api.py:523 build/serializers.py:1466 company/serializers.py:437 -#: order/serializers.py:1281 part/serializers.py:959 part/serializers.py:1306 -#: part/serializers.py:1761 +#: build/api.py:523 build/serializers.py:1466 company/serializers.py:471 +#: order/serializers.py:1281 part/serializers.py:931 part/serializers.py:1278 +#: part/serializers.py:1733 msgid "On Order" msgstr "" @@ -963,7 +963,7 @@ msgstr "" #: build/models.py:1136 build/models.py:1234 build/serializers.py:285 #: build/serializers.py:335 build/serializers.py:965 build/serializers.py:1739 #: order/models.py:717 order/serializers.py:658 order/serializers.py:844 -#: part/serializers.py:1708 stock/models.py:940 stock/models.py:1430 +#: part/serializers.py:1680 stock/models.py:940 stock/models.py:1430 #: stock/models.py:1878 stock/serializers.py:688 stock/serializers.py:1580 msgid "Quantity must be greater than zero" msgstr "" @@ -1385,20 +1385,20 @@ msgstr "" msgid "BOM Item" msgstr "" -#: build/serializers.py:1467 order/serializers.py:1282 part/serializers.py:1310 -#: part/serializers.py:1765 +#: build/serializers.py:1467 order/serializers.py:1282 part/serializers.py:1282 +#: part/serializers.py:1737 msgid "In Production" msgstr "" -#: build/serializers.py:1469 part/serializers.py:950 part/serializers.py:1314 +#: build/serializers.py:1469 part/serializers.py:922 part/serializers.py:1286 msgid "Scheduled to Build" msgstr "" -#: build/serializers.py:1472 part/serializers.py:987 +#: build/serializers.py:1472 part/serializers.py:959 msgid "External Stock" msgstr "" -#: build/serializers.py:1473 part/serializers.py:1300 part/serializers.py:1808 +#: build/serializers.py:1473 part/serializers.py:1272 part/serializers.py:1780 msgid "Available Stock" msgstr "" @@ -1588,7 +1588,7 @@ msgstr "" msgid "Price break quantity" msgstr "" -#: common/models.py:1348 company/serializers.py:564 order/models.py:1842 +#: common/models.py:1348 company/serializers.py:357 order/models.py:1842 #: order/models.py:3043 msgid "Price" msgstr "" @@ -1760,7 +1760,7 @@ msgstr "" msgid "Unit definition" msgstr "" -#: common/models.py:1911 common/models.py:1974 stock/models.py:2967 +#: common/models.py:1911 common/models.py:1974 stock/models.py:2984 #: stock/serializers.py:247 msgid "Attachment" msgstr "" @@ -1839,7 +1839,7 @@ msgstr "" #: common/models.py:2090 common/models.py:2329 company/models.py:622 #: machine/serializers.py:27 -#: report/templates/report/inventree_test_report.html:104 stock/models.py:2959 +#: report/templates/report/inventree_test_report.html:104 stock/models.py:2976 msgid "Value" msgstr "" @@ -2048,7 +2048,7 @@ msgid "Response data from the barcode scan" msgstr "" #: common/models.py:2417 report/templates/report/inventree_test_report.html:103 -#: stock/models.py:2953 +#: stock/models.py:2970 msgid "Result" msgstr "" @@ -2141,7 +2141,7 @@ msgid "Linked thread for this message" msgstr "" #: common/models.py:2656 -msgid "Prioriy" +msgid "Priority" msgstr "" #: common/models.py:2698 @@ -2671,8 +2671,8 @@ msgstr "" msgid "Parts can be assembled from other components by default" msgstr "" -#: common/setting/system.py:462 part/models.py:1208 part/serializers.py:1734 -#: part/serializers.py:1741 +#: common/setting/system.py:462 part/models.py:1208 part/serializers.py:1706 +#: part/serializers.py:1713 msgid "Component" msgstr "" @@ -3772,7 +3772,7 @@ msgstr "" msgid "Supplier is Active" msgstr "" -#: company/api.py:307 company/models.py:520 company/serializers.py:457 +#: company/api.py:307 company/models.py:520 company/serializers.py:503 #: part/serializers.py:566 msgid "Manufacturer" msgstr "" @@ -3964,7 +3964,7 @@ msgid "Link to address information (external)" msgstr "" #: company/models.py:492 company/models.py:609 company/models.py:832 -#: company/serializers.py:471 stock/api.py:561 +#: company/serializers.py:517 stock/api.py:561 msgid "Manufacturer Part" msgstr "" @@ -3981,7 +3981,7 @@ msgstr "" msgid "Select manufacturer" msgstr "" -#: company/models.py:527 company/serializers.py:479 order/serializers.py:734 +#: company/models.py:527 company/serializers.py:525 order/serializers.py:734 #: part/serializers.py:576 msgid "MPN" msgstr "" @@ -4030,7 +4030,7 @@ msgstr "" msgid "Linked manufacturer part must reference the same base part" msgstr "" -#: company/models.py:810 company/serializers.py:449 company/serializers.py:467 +#: company/models.py:810 company/serializers.py:495 company/serializers.py:513 #: order/models.py:639 part/serializers.py:550 #: plugin/builtin/suppliers/digikey.py:26 plugin/builtin/suppliers/lcsc.py:27 #: plugin/builtin/suppliers/mouser.py:25 plugin/builtin/suppliers/tme.py:27 @@ -4134,10 +4134,14 @@ msgstr "" msgid "Company Name" msgstr "" -#: company/serializers.py:433 part/serializers.py:955 stock/serializers.py:428 +#: company/serializers.py:467 part/serializers.py:927 stock/serializers.py:428 msgid "In Stock" msgstr "" +#: company/serializers.py:484 +msgid "Price Breaks" +msgstr "" + #: data_exporter/mixins.py:325 data_exporter/mixins.py:403 msgid "Error occurred during data export" msgstr "" @@ -4290,7 +4294,7 @@ msgstr "" msgid "Errors" msgstr "" -#: importer/models.py:550 part/serializers.py:1268 +#: importer/models.py:550 part/serializers.py:1240 msgid "Valid" msgstr "" @@ -5677,7 +5681,7 @@ msgstr "" msgid "Part category" msgstr "" -#: part/models.py:1088 part/serializers.py:929 +#: part/models.py:1088 part/serializers.py:901 #: report/templates/report/inventree_stock_location_report.html:103 msgid "IPN" msgstr "" @@ -5718,7 +5722,7 @@ msgstr "" msgid "Expiry time (in days) for stock items of this part" msgstr "" -#: part/models.py:1186 part/serializers.py:1003 +#: part/models.py:1186 part/serializers.py:975 msgid "Minimum Stock" msgstr "" @@ -6418,203 +6422,203 @@ msgstr "" msgid "Supplier part matching this SKU already exists" msgstr "" -#: part/serializers.py:914 +#: part/serializers.py:886 msgid "Category Name" msgstr "" -#: part/serializers.py:943 +#: part/serializers.py:915 msgid "Building" msgstr "" -#: part/serializers.py:944 +#: part/serializers.py:916 msgid "Quantity of this part currently being in production" msgstr "" -#: part/serializers.py:951 +#: part/serializers.py:923 msgid "Outstanding quantity of this part scheduled to be built" msgstr "" -#: part/serializers.py:971 stock/serializers.py:1019 stock/serializers.py:1189 +#: part/serializers.py:943 stock/serializers.py:1019 stock/serializers.py:1189 #: users/ruleset.py:30 msgid "Stock Items" msgstr "" -#: part/serializers.py:975 +#: part/serializers.py:947 msgid "Revisions" msgstr "" -#: part/serializers.py:979 +#: part/serializers.py:951 msgid "Suppliers" msgstr "" -#: part/serializers.py:983 part/serializers.py:1297 +#: part/serializers.py:955 part/serializers.py:1269 #: templates/email/low_stock_notification.html:16 #: templates/email/part_event_notification.html:17 msgid "Total Stock" msgstr "" -#: part/serializers.py:991 +#: part/serializers.py:963 msgid "Unallocated Stock" msgstr "" -#: part/serializers.py:999 +#: part/serializers.py:971 msgid "Variant Stock" msgstr "" -#: part/serializers.py:1054 +#: part/serializers.py:1026 msgid "Duplicate Part" msgstr "" -#: part/serializers.py:1055 +#: part/serializers.py:1027 msgid "Copy initial data from another Part" msgstr "" -#: part/serializers.py:1061 +#: part/serializers.py:1033 msgid "Initial Stock" msgstr "" -#: part/serializers.py:1062 +#: part/serializers.py:1034 msgid "Create Part with initial stock quantity" msgstr "" -#: part/serializers.py:1068 +#: part/serializers.py:1040 msgid "Supplier Information" msgstr "" -#: part/serializers.py:1069 +#: part/serializers.py:1041 msgid "Add initial supplier information for this part" msgstr "" -#: part/serializers.py:1077 +#: part/serializers.py:1049 msgid "Copy Category Parameters" msgstr "" -#: part/serializers.py:1078 +#: part/serializers.py:1050 msgid "Copy parameter templates from selected part category" msgstr "" -#: part/serializers.py:1083 +#: part/serializers.py:1055 msgid "Existing Image" msgstr "" -#: part/serializers.py:1084 +#: part/serializers.py:1056 msgid "Filename of an existing part image" msgstr "" -#: part/serializers.py:1101 +#: part/serializers.py:1073 msgid "Image file does not exist" msgstr "" -#: part/serializers.py:1269 +#: part/serializers.py:1241 msgid "Validate entire Bill of Materials" msgstr "" -#: part/serializers.py:1303 part/serializers.py:1769 +#: part/serializers.py:1275 part/serializers.py:1741 msgid "Can Build" msgstr "" -#: part/serializers.py:1320 +#: part/serializers.py:1292 msgid "Required for Build Orders" msgstr "" -#: part/serializers.py:1325 +#: part/serializers.py:1297 msgid "Allocated to Build Orders" msgstr "" -#: part/serializers.py:1332 +#: part/serializers.py:1304 msgid "Required for Sales Orders" msgstr "" -#: part/serializers.py:1336 +#: part/serializers.py:1308 msgid "Allocated to Sales Orders" msgstr "" -#: part/serializers.py:1475 +#: part/serializers.py:1447 msgid "Minimum Price" msgstr "" -#: part/serializers.py:1476 +#: part/serializers.py:1448 msgid "Override calculated value for minimum price" msgstr "" -#: part/serializers.py:1483 +#: part/serializers.py:1455 msgid "Minimum price currency" msgstr "" -#: part/serializers.py:1490 +#: part/serializers.py:1462 msgid "Maximum Price" msgstr "" -#: part/serializers.py:1491 +#: part/serializers.py:1463 msgid "Override calculated value for maximum price" msgstr "" -#: part/serializers.py:1498 +#: part/serializers.py:1470 msgid "Maximum price currency" msgstr "" -#: part/serializers.py:1527 +#: part/serializers.py:1499 msgid "Update" msgstr "" -#: part/serializers.py:1528 +#: part/serializers.py:1500 msgid "Update pricing for this part" msgstr "" -#: part/serializers.py:1551 +#: part/serializers.py:1523 #, python-brace-format msgid "Could not convert from provided currencies to {default_currency}" msgstr "" -#: part/serializers.py:1558 +#: part/serializers.py:1530 msgid "Minimum price must not be greater than maximum price" msgstr "" -#: part/serializers.py:1561 +#: part/serializers.py:1533 msgid "Maximum price must not be less than minimum price" msgstr "" -#: part/serializers.py:1715 +#: part/serializers.py:1687 msgid "Select the parent assembly" msgstr "" -#: part/serializers.py:1735 +#: part/serializers.py:1707 msgid "Select the component part" msgstr "" -#: part/serializers.py:1929 +#: part/serializers.py:1901 msgid "Select part to copy BOM from" msgstr "" -#: part/serializers.py:1937 +#: part/serializers.py:1909 msgid "Remove Existing Data" msgstr "" -#: part/serializers.py:1938 +#: part/serializers.py:1910 msgid "Remove existing BOM items before copying" msgstr "" -#: part/serializers.py:1943 +#: part/serializers.py:1915 msgid "Include Inherited" msgstr "" -#: part/serializers.py:1944 +#: part/serializers.py:1916 msgid "Include BOM items which are inherited from templated parts" msgstr "" -#: part/serializers.py:1949 +#: part/serializers.py:1921 msgid "Skip Invalid Rows" msgstr "" -#: part/serializers.py:1950 +#: part/serializers.py:1922 msgid "Enable this option to skip invalid rows" msgstr "" -#: part/serializers.py:1955 +#: part/serializers.py:1927 msgid "Copy Substitute Parts" msgstr "" -#: part/serializers.py:1956 +#: part/serializers.py:1928 msgid "Copy substitute parts when duplicate BOM items" msgstr "" @@ -8455,115 +8459,119 @@ msgstr "" msgid "Quantity does not match serial numbers" msgstr "" -#: stock/models.py:2012 stock/models.py:2917 +#: stock/models.py:1912 +msgid "Cannot assign stock to structural location" +msgstr "" + +#: stock/models.py:2029 stock/models.py:2934 msgid "Test template does not exist" msgstr "" -#: stock/models.py:2030 +#: stock/models.py:2047 msgid "Stock item has been assigned to a sales order" msgstr "" -#: stock/models.py:2034 +#: stock/models.py:2051 msgid "Stock item is installed in another item" msgstr "" -#: stock/models.py:2037 +#: stock/models.py:2054 msgid "Stock item contains other items" msgstr "" -#: stock/models.py:2040 +#: stock/models.py:2057 msgid "Stock item has been assigned to a customer" msgstr "" -#: stock/models.py:2043 stock/models.py:2226 +#: stock/models.py:2060 stock/models.py:2243 msgid "Stock item is currently in production" msgstr "" -#: stock/models.py:2046 +#: stock/models.py:2063 msgid "Serialized stock cannot be merged" msgstr "" -#: stock/models.py:2053 stock/serializers.py:1462 +#: stock/models.py:2070 stock/serializers.py:1462 msgid "Duplicate stock items" msgstr "" -#: stock/models.py:2057 +#: stock/models.py:2074 msgid "Stock items must refer to the same part" msgstr "" -#: stock/models.py:2065 +#: stock/models.py:2082 msgid "Stock items must refer to the same supplier part" msgstr "" -#: stock/models.py:2070 +#: stock/models.py:2087 msgid "Stock status codes must match" msgstr "" -#: stock/models.py:2349 +#: stock/models.py:2366 msgid "StockItem cannot be moved as it is not in stock" msgstr "" -#: stock/models.py:2818 +#: stock/models.py:2835 msgid "Stock Item Tracking" msgstr "" -#: stock/models.py:2849 +#: stock/models.py:2866 msgid "Entry notes" msgstr "" -#: stock/models.py:2889 +#: stock/models.py:2906 msgid "Stock Item Test Result" msgstr "" -#: stock/models.py:2920 +#: stock/models.py:2937 msgid "Value must be provided for this test" msgstr "" -#: stock/models.py:2924 +#: stock/models.py:2941 msgid "Attachment must be uploaded for this test" msgstr "" -#: stock/models.py:2929 +#: stock/models.py:2946 msgid "Invalid value for this test" msgstr "" -#: stock/models.py:2953 +#: stock/models.py:2970 msgid "Test result" msgstr "" -#: stock/models.py:2960 +#: stock/models.py:2977 msgid "Test output value" msgstr "" -#: stock/models.py:2968 stock/serializers.py:248 +#: stock/models.py:2985 stock/serializers.py:248 msgid "Test result attachment" msgstr "" -#: stock/models.py:2972 +#: stock/models.py:2989 msgid "Test notes" msgstr "" -#: stock/models.py:2980 +#: stock/models.py:2997 msgid "Test station" msgstr "" -#: stock/models.py:2981 +#: stock/models.py:2998 msgid "The identifier of the test station where the test was performed" msgstr "" -#: stock/models.py:2987 +#: stock/models.py:3004 msgid "Started" msgstr "" -#: stock/models.py:2988 +#: stock/models.py:3005 msgid "The timestamp of the test start" msgstr "" -#: stock/models.py:2994 +#: stock/models.py:3011 msgid "Finished" msgstr "" -#: stock/models.py:2995 +#: stock/models.py:3012 msgid "The timestamp of the test finish" msgstr "" @@ -8902,83 +8910,87 @@ msgstr "" msgid "Stock manually removed" msgstr "" -#: stock/status_codes.py:57 +#: stock/status_codes.py:56 +msgid "Serialized stock items" +msgstr "" + +#: stock/status_codes.py:58 msgid "Returned to stock" msgstr "" -#: stock/status_codes.py:60 +#: stock/status_codes.py:61 msgid "Location changed" msgstr "" -#: stock/status_codes.py:61 +#: stock/status_codes.py:62 msgid "Stock updated" msgstr "" -#: stock/status_codes.py:64 +#: stock/status_codes.py:65 msgid "Installed into assembly" msgstr "" -#: stock/status_codes.py:65 +#: stock/status_codes.py:66 msgid "Removed from assembly" msgstr "" -#: stock/status_codes.py:67 +#: stock/status_codes.py:68 msgid "Installed component item" msgstr "" -#: stock/status_codes.py:68 +#: stock/status_codes.py:69 msgid "Removed component item" msgstr "" -#: stock/status_codes.py:71 +#: stock/status_codes.py:72 msgid "Split from parent item" msgstr "" -#: stock/status_codes.py:72 +#: stock/status_codes.py:73 msgid "Split child item" msgstr "" -#: stock/status_codes.py:75 +#: stock/status_codes.py:76 msgid "Merged stock items" msgstr "" -#: stock/status_codes.py:78 +#: stock/status_codes.py:79 msgid "Converted to variant" msgstr "" -#: stock/status_codes.py:81 +#: stock/status_codes.py:82 msgid "Build order output created" msgstr "" -#: stock/status_codes.py:82 +#: stock/status_codes.py:83 msgid "Build order output completed" msgstr "" -#: stock/status_codes.py:83 +#: stock/status_codes.py:84 msgid "Build order output rejected" msgstr "" -#: stock/status_codes.py:84 +#: stock/status_codes.py:85 msgid "Consumed by build order" msgstr "" -#: stock/status_codes.py:87 +#: stock/status_codes.py:88 msgid "Shipped against Sales Order" msgstr "" -#: stock/status_codes.py:90 +#: stock/status_codes.py:91 msgid "Received against Purchase Order" msgstr "" -#: stock/status_codes.py:93 +#: stock/status_codes.py:94 msgid "Returned against Return Order" msgstr "" -#: stock/status_codes.py:96 +#: stock/status_codes.py:97 msgid "Sent to customer" msgstr "" -#: stock/status_codes.py:97 +#: stock/status_codes.py:98 msgid "Returned from customer" msgstr "" diff --git a/src/backend/InvenTree/locale/lt/LC_MESSAGES/django.po b/src/backend/InvenTree/locale/lt/LC_MESSAGES/django.po index a97132b8df..58f792bc1b 100644 --- a/src/backend/InvenTree/locale/lt/LC_MESSAGES/django.po +++ b/src/backend/InvenTree/locale/lt/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: inventree\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-11-19 04:55+0000\n" -"PO-Revision-Date: 2025-11-19 04:59\n" +"POT-Creation-Date: 2025-11-24 06:50+0000\n" +"PO-Revision-Date: 2025-11-24 06:54\n" "Last-Translator: \n" "Language-Team: Lithuanian\n" "Language: lt_LT\n" @@ -81,21 +81,21 @@ msgstr "Pateiktas pagrindinis el. pašto adresas neteisingas." msgid "The provided email domain is not approved." msgstr "Pateiktas el. pašto domenas nepatvirtintas." -#: InvenTree/conversion.py:166 +#: InvenTree/conversion.py:240 #, python-brace-format msgid "Invalid unit provided ({unit})" msgstr "Neteisingai nurodytas vienetas ({unit})" -#: InvenTree/conversion.py:183 +#: InvenTree/conversion.py:257 msgid "No value provided" msgstr "Nepateikta reikšmė" -#: InvenTree/conversion.py:210 +#: InvenTree/conversion.py:284 #, python-brace-format msgid "Could not convert {original} to {unit}" msgstr "Nepavyko konvertuoti {original} į {unit}" -#: InvenTree/conversion.py:212 InvenTree/conversion.py:226 +#: InvenTree/conversion.py:286 InvenTree/conversion.py:300 #: InvenTree/helpers.py:597 order/models.py:720 order/models.py:1015 msgid "Invalid quantity provided" msgstr "Pateiktas neteisingas kiekis" @@ -116,7 +116,7 @@ msgstr "Neteisinga dešimtainė reikšmė" #: build/serializers.py:580 build/serializers.py:1788 company/models.py:857 #: order/models.py:1780 #: report/templates/report/inventree_build_order_report.html:172 -#: stock/models.py:2848 stock/models.py:2972 stock/serializers.py:717 +#: stock/models.py:2865 stock/models.py:2989 stock/serializers.py:717 #: stock/serializers.py:893 stock/serializers.py:1035 stock/serializers.py:1336 #: stock/serializers.py:1425 stock/serializers.py:1624 msgid "Notes" @@ -345,7 +345,7 @@ msgstr "Turi būti teisingas skaičius" msgid "Currency" msgstr "Valiuta" -#: InvenTree/serializers.py:298 part/serializers.py:1385 +#: InvenTree/serializers.py:298 part/serializers.py:1357 msgid "Select currency from available options" msgstr "Pasirinkite valiutą iš galimų variantų" @@ -553,14 +553,14 @@ msgstr "Įtraukti variantus" #: build/api.py:100 build/api.py:466 build/api.py:845 build/models.py:270 #: build/serializers.py:1225 build/serializers.py:1356 -#: build/serializers.py:1427 company/models.py:1067 company/serializers.py:445 +#: build/serializers.py:1427 company/models.py:1067 company/serializers.py:491 #: order/api.py:298 order/api.py:302 order/api.py:929 order/api.py:1187 #: order/api.py:1190 order/models.py:1941 order/models.py:2108 #: order/models.py:2109 part/api.py:1233 part/api.py:1236 part/api.py:1302 #: part/api.py:1589 part/models.py:472 part/models.py:3296 part/models.py:3439 #: part/models.py:3497 part/models.py:3518 part/models.py:3540 #: part/models.py:3679 part/models.py:4046 part/models.py:4368 -#: part/models.py:4787 part/serializers.py:1928 +#: part/models.py:4787 part/serializers.py:1900 #: report/templates/report/inventree_bill_of_materials_report.html:110 #: report/templates/report/inventree_bill_of_materials_report.html:137 #: report/templates/report/inventree_build_order_report.html:109 @@ -582,7 +582,7 @@ msgstr "Detalė" #: build/api.py:120 build/api.py:123 build/serializers.py:1438 part/api.py:980 #: part/api.py:1316 part/api.py:1600 part/models.py:1080 part/models.py:3568 -#: part/models.py:4162 part/serializers.py:1752 stock/api.py:869 +#: part/models.py:4162 part/serializers.py:1724 stock/api.py:869 msgid "Category" msgstr "Kategorija" @@ -663,7 +663,7 @@ msgid "Optional" msgstr "Pasirinktinai" #: build/api.py:455 build/serializers.py:1415 common/setting/system.py:456 -#: part/models.py:1202 part/serializers.py:1714 part/serializers.py:1725 +#: part/models.py:1202 part/serializers.py:1686 part/serializers.py:1697 #: stock/api.py:639 msgid "Assembly" msgstr "Surinkimas" @@ -688,16 +688,16 @@ msgstr "Priskirta" msgid "Consumed" msgstr "" -#: build/api.py:499 company/models.py:912 company/serializers.py:440 +#: build/api.py:499 company/models.py:912 company/serializers.py:474 #: templates/email/build_order_required_stock.html:19 #: templates/email/low_stock_notification.html:17 #: templates/email/part_event_notification.html:18 msgid "Available" msgstr "Prieinama" -#: build/api.py:523 build/serializers.py:1466 company/serializers.py:437 -#: order/serializers.py:1281 part/serializers.py:959 part/serializers.py:1306 -#: part/serializers.py:1761 +#: build/api.py:523 build/serializers.py:1466 company/serializers.py:471 +#: order/serializers.py:1281 part/serializers.py:931 part/serializers.py:1278 +#: part/serializers.py:1733 msgid "On Order" msgstr "Užsakyta" @@ -963,7 +963,7 @@ msgstr "Gamybos rezultatas neatitinka gamybos užsakymo" #: build/models.py:1136 build/models.py:1234 build/serializers.py:285 #: build/serializers.py:335 build/serializers.py:965 build/serializers.py:1739 #: order/models.py:717 order/serializers.py:658 order/serializers.py:844 -#: part/serializers.py:1708 stock/models.py:940 stock/models.py:1430 +#: part/serializers.py:1680 stock/models.py:940 stock/models.py:1430 #: stock/models.py:1878 stock/serializers.py:688 stock/serializers.py:1580 msgid "Quantity must be greater than zero" msgstr "Kiekis turi būti didesnis nei nulis" @@ -1385,20 +1385,20 @@ msgstr "Leisti variantus" msgid "BOM Item" msgstr "BOM elementas" -#: build/serializers.py:1467 order/serializers.py:1282 part/serializers.py:1310 -#: part/serializers.py:1765 +#: build/serializers.py:1467 order/serializers.py:1282 part/serializers.py:1282 +#: part/serializers.py:1737 msgid "In Production" msgstr "Gamyboje" -#: build/serializers.py:1469 part/serializers.py:950 part/serializers.py:1314 +#: build/serializers.py:1469 part/serializers.py:922 part/serializers.py:1286 msgid "Scheduled to Build" msgstr "" -#: build/serializers.py:1472 part/serializers.py:987 +#: build/serializers.py:1472 part/serializers.py:959 msgid "External Stock" msgstr "Išorinės atsargos" -#: build/serializers.py:1473 part/serializers.py:1300 part/serializers.py:1808 +#: build/serializers.py:1473 part/serializers.py:1272 part/serializers.py:1780 msgid "Available Stock" msgstr "Prieinamos atsargos" @@ -1588,7 +1588,7 @@ msgstr "Vartotojas" msgid "Price break quantity" msgstr "Kiekio ribinis taškas kainai" -#: common/models.py:1348 company/serializers.py:564 order/models.py:1842 +#: common/models.py:1348 company/serializers.py:357 order/models.py:1842 #: order/models.py:3043 msgid "Price" msgstr "Kaina" @@ -1760,7 +1760,7 @@ msgstr "Apibrėžimas" msgid "Unit definition" msgstr "Vieneto apibrėžimas" -#: common/models.py:1911 common/models.py:1974 stock/models.py:2967 +#: common/models.py:1911 common/models.py:1974 stock/models.py:2984 #: stock/serializers.py:247 msgid "Attachment" msgstr "Priedas" @@ -1839,7 +1839,7 @@ msgstr "Loginis būsenos raktas, atitinkantis šią pasirinkitinę būseną" #: common/models.py:2090 common/models.py:2329 company/models.py:622 #: machine/serializers.py:27 -#: report/templates/report/inventree_test_report.html:104 stock/models.py:2959 +#: report/templates/report/inventree_test_report.html:104 stock/models.py:2976 msgid "Value" msgstr "Reikšmė" @@ -2048,7 +2048,7 @@ msgid "Response data from the barcode scan" msgstr "Atsako duomenys iš brūkšninio kodo nuskaitymo" #: common/models.py:2417 report/templates/report/inventree_test_report.html:103 -#: stock/models.py:2953 +#: stock/models.py:2970 msgid "Result" msgstr "Rezultatas" @@ -2141,7 +2141,7 @@ msgid "Linked thread for this message" msgstr "" #: common/models.py:2656 -msgid "Prioriy" +msgid "Priority" msgstr "" #: common/models.py:2698 @@ -2671,8 +2671,8 @@ msgstr "Detalės pagal nutylėjimą yra šablonai" msgid "Parts can be assembled from other components by default" msgstr "Detalės pagal nutylėjimą gali būti surenkamos iš kitų komponentų" -#: common/setting/system.py:462 part/models.py:1208 part/serializers.py:1734 -#: part/serializers.py:1741 +#: common/setting/system.py:462 part/models.py:1208 part/serializers.py:1706 +#: part/serializers.py:1713 msgid "Component" msgstr "Komponentas" @@ -3772,7 +3772,7 @@ msgstr "Vidinė detalė yra aktyvi" msgid "Supplier is Active" msgstr "Tiekėjas yra aktyvus" -#: company/api.py:307 company/models.py:520 company/serializers.py:457 +#: company/api.py:307 company/models.py:520 company/serializers.py:503 #: part/serializers.py:566 msgid "Manufacturer" msgstr "Gamintojas" @@ -3964,7 +3964,7 @@ msgid "Link to address information (external)" msgstr "Nuoroda į adreso informaciją (išorinė)" #: company/models.py:492 company/models.py:609 company/models.py:832 -#: company/serializers.py:471 stock/api.py:561 +#: company/serializers.py:517 stock/api.py:561 msgid "Manufacturer Part" msgstr "Gamintojo detalė" @@ -3981,7 +3981,7 @@ msgstr "Pasirinkite detalę" msgid "Select manufacturer" msgstr "Pasirinkite gamintoją" -#: company/models.py:527 company/serializers.py:479 order/serializers.py:734 +#: company/models.py:527 company/serializers.py:525 order/serializers.py:734 #: part/serializers.py:576 msgid "MPN" msgstr "MPN" @@ -4030,7 +4030,7 @@ msgstr "Pakuotės vienetų kiekis turi būti didesnis už nulį" msgid "Linked manufacturer part must reference the same base part" msgstr "Susieta gamintojo detalė turi nurodyti tą pačią pagrindinę detalę" -#: company/models.py:810 company/serializers.py:449 company/serializers.py:467 +#: company/models.py:810 company/serializers.py:495 company/serializers.py:513 #: order/models.py:639 part/serializers.py:550 #: plugin/builtin/suppliers/digikey.py:26 plugin/builtin/suppliers/lcsc.py:27 #: plugin/builtin/suppliers/mouser.py:25 plugin/builtin/suppliers/tme.py:27 @@ -4134,10 +4134,14 @@ msgstr "Numatytoji valiuta, naudojama šiam tiekėjui" msgid "Company Name" msgstr "Įmonės pavadinimas" -#: company/serializers.py:433 part/serializers.py:955 stock/serializers.py:428 +#: company/serializers.py:467 part/serializers.py:927 stock/serializers.py:428 msgid "In Stock" msgstr "Sandėlyje" +#: company/serializers.py:484 +msgid "Price Breaks" +msgstr "" + #: data_exporter/mixins.py:325 data_exporter/mixins.py:403 msgid "Error occurred during data export" msgstr "Įvyko klaida eksportuojant duomenis" @@ -4290,7 +4294,7 @@ msgstr "Pradiniai eilutės duomenys" msgid "Errors" msgstr "Klaidos" -#: importer/models.py:550 part/serializers.py:1268 +#: importer/models.py:550 part/serializers.py:1240 msgid "Valid" msgstr "Galiojantis" @@ -5677,7 +5681,7 @@ msgstr "Detalės raktažodžiai, skirti pagerinti matomumą paieškos rezultatuo msgid "Part category" msgstr "Detalės kategorija" -#: part/models.py:1088 part/serializers.py:929 +#: part/models.py:1088 part/serializers.py:901 #: report/templates/report/inventree_stock_location_report.html:103 msgid "IPN" msgstr "IPN" @@ -5718,7 +5722,7 @@ msgstr "Numatytasis galiojimo laikas" msgid "Expiry time (in days) for stock items of this part" msgstr "Šios detalės atsargų galiojimo laikas (dienomis)" -#: part/models.py:1186 part/serializers.py:1003 +#: part/models.py:1186 part/serializers.py:975 msgid "Minimum Stock" msgstr "Minimalus atsargų kiekis" @@ -6418,203 +6422,203 @@ msgstr "Detalė su šiuo gamintojo numeriu (MPN) jau egzistuoja" msgid "Supplier part matching this SKU already exists" msgstr "Tiekėjo detalė su šiuo SKU jau egzistuoja" -#: part/serializers.py:914 +#: part/serializers.py:886 msgid "Category Name" msgstr "Kategorijos pavadinimas" -#: part/serializers.py:943 +#: part/serializers.py:915 msgid "Building" msgstr "Surinkimas" -#: part/serializers.py:944 +#: part/serializers.py:916 msgid "Quantity of this part currently being in production" msgstr "" -#: part/serializers.py:951 +#: part/serializers.py:923 msgid "Outstanding quantity of this part scheduled to be built" msgstr "" -#: part/serializers.py:971 stock/serializers.py:1019 stock/serializers.py:1189 +#: part/serializers.py:943 stock/serializers.py:1019 stock/serializers.py:1189 #: users/ruleset.py:30 msgid "Stock Items" msgstr "Atsargos" -#: part/serializers.py:975 +#: part/serializers.py:947 msgid "Revisions" msgstr "Versijos" -#: part/serializers.py:979 +#: part/serializers.py:951 msgid "Suppliers" msgstr "Tiekėjai" -#: part/serializers.py:983 part/serializers.py:1297 +#: part/serializers.py:955 part/serializers.py:1269 #: templates/email/low_stock_notification.html:16 #: templates/email/part_event_notification.html:17 msgid "Total Stock" msgstr "Bendros atsargos" -#: part/serializers.py:991 +#: part/serializers.py:963 msgid "Unallocated Stock" msgstr "Nepriskirtos atsargos" -#: part/serializers.py:999 +#: part/serializers.py:971 msgid "Variant Stock" msgstr "Variantų atsargos" -#: part/serializers.py:1054 +#: part/serializers.py:1026 msgid "Duplicate Part" msgstr "Kopijuoti detalę" -#: part/serializers.py:1055 +#: part/serializers.py:1027 msgid "Copy initial data from another Part" msgstr "Kopijuoti pradinius duomenis iš kitos detalės" -#: part/serializers.py:1061 +#: part/serializers.py:1033 msgid "Initial Stock" msgstr "Pradinės atsargos" -#: part/serializers.py:1062 +#: part/serializers.py:1034 msgid "Create Part with initial stock quantity" msgstr "Sukurti detalę su pradiniu atsargų kiekiu" -#: part/serializers.py:1068 +#: part/serializers.py:1040 msgid "Supplier Information" msgstr "Tiekėjo informacija" -#: part/serializers.py:1069 +#: part/serializers.py:1041 msgid "Add initial supplier information for this part" msgstr "Pridėti pradinę tiekėjo informaciją šiai detalei" -#: part/serializers.py:1077 +#: part/serializers.py:1049 msgid "Copy Category Parameters" msgstr "Kopijuoti kategorijos parametrus" -#: part/serializers.py:1078 +#: part/serializers.py:1050 msgid "Copy parameter templates from selected part category" msgstr "Kopijuoti parametrų šablonus iš pasirinktos detalių kategorijos" -#: part/serializers.py:1083 +#: part/serializers.py:1055 msgid "Existing Image" msgstr "Esamas paveikslėlis" -#: part/serializers.py:1084 +#: part/serializers.py:1056 msgid "Filename of an existing part image" msgstr "Esamos detalės paveikslėlio failo pavadinimas" -#: part/serializers.py:1101 +#: part/serializers.py:1073 msgid "Image file does not exist" msgstr "Paveikslėlio failas neegzistuoja" -#: part/serializers.py:1269 +#: part/serializers.py:1241 msgid "Validate entire Bill of Materials" msgstr "Patvirtinti visą komplektavimo žiniaraštį" -#: part/serializers.py:1303 part/serializers.py:1769 +#: part/serializers.py:1275 part/serializers.py:1741 msgid "Can Build" msgstr "Galima surinkti" -#: part/serializers.py:1320 +#: part/serializers.py:1292 msgid "Required for Build Orders" msgstr "" -#: part/serializers.py:1325 +#: part/serializers.py:1297 msgid "Allocated to Build Orders" msgstr "" -#: part/serializers.py:1332 +#: part/serializers.py:1304 msgid "Required for Sales Orders" msgstr "" -#: part/serializers.py:1336 +#: part/serializers.py:1308 msgid "Allocated to Sales Orders" msgstr "" -#: part/serializers.py:1475 +#: part/serializers.py:1447 msgid "Minimum Price" msgstr "Mažiausia kaina" -#: part/serializers.py:1476 +#: part/serializers.py:1448 msgid "Override calculated value for minimum price" msgstr "Pakeisti apskaičiuotą mažiausią kainą" -#: part/serializers.py:1483 +#: part/serializers.py:1455 msgid "Minimum price currency" msgstr "Mažiausios kainos valiuta" -#: part/serializers.py:1490 +#: part/serializers.py:1462 msgid "Maximum Price" msgstr "Didžiausia kaina" -#: part/serializers.py:1491 +#: part/serializers.py:1463 msgid "Override calculated value for maximum price" msgstr "Pakeisti apskaičiuotą didžiausią kainą" -#: part/serializers.py:1498 +#: part/serializers.py:1470 msgid "Maximum price currency" msgstr "Didžiausios kainos valiuta" -#: part/serializers.py:1527 +#: part/serializers.py:1499 msgid "Update" msgstr "Atnaujinti" -#: part/serializers.py:1528 +#: part/serializers.py:1500 msgid "Update pricing for this part" msgstr "Atnaujinti šios detalės kainodarą" -#: part/serializers.py:1551 +#: part/serializers.py:1523 #, python-brace-format msgid "Could not convert from provided currencies to {default_currency}" msgstr "Nepavyko konvertuoti iš nurodytų valiutų į {default_currency}" -#: part/serializers.py:1558 +#: part/serializers.py:1530 msgid "Minimum price must not be greater than maximum price" msgstr "Mažiausia kaina negali būti didesnė už didžiausią kainą" -#: part/serializers.py:1561 +#: part/serializers.py:1533 msgid "Maximum price must not be less than minimum price" msgstr "Didžiausia kaina negali būti mažesnė už mažiausią kainą" -#: part/serializers.py:1715 +#: part/serializers.py:1687 msgid "Select the parent assembly" msgstr "Pasirinkite pirminį surinkimą" -#: part/serializers.py:1735 +#: part/serializers.py:1707 msgid "Select the component part" msgstr "Pasirinkite komponentinę detalę" -#: part/serializers.py:1929 +#: part/serializers.py:1901 msgid "Select part to copy BOM from" msgstr "Pasirinkite detalę, iš kurios kopijuoti BOM" -#: part/serializers.py:1937 +#: part/serializers.py:1909 msgid "Remove Existing Data" msgstr "Pašalinti esamus duomenis" -#: part/serializers.py:1938 +#: part/serializers.py:1910 msgid "Remove existing BOM items before copying" msgstr "Pašalinti esamus BOM elementus prieš kopijuojant" -#: part/serializers.py:1943 +#: part/serializers.py:1915 msgid "Include Inherited" msgstr "Įtraukti paveldėtus" -#: part/serializers.py:1944 +#: part/serializers.py:1916 msgid "Include BOM items which are inherited from templated parts" msgstr "Įtraukti BOM elementus, paveldėtus iš šabloninių detalių" -#: part/serializers.py:1949 +#: part/serializers.py:1921 msgid "Skip Invalid Rows" msgstr "Praleisti netinkamas eilutes" -#: part/serializers.py:1950 +#: part/serializers.py:1922 msgid "Enable this option to skip invalid rows" msgstr "Įjunkite šią parinktį, jei norite praleisti netinkamas eilutes" -#: part/serializers.py:1955 +#: part/serializers.py:1927 msgid "Copy Substitute Parts" msgstr "Kopijuoti pakaitines detales" -#: part/serializers.py:1956 +#: part/serializers.py:1928 msgid "Copy substitute parts when duplicate BOM items" msgstr "Kopijuoti pakaitines detales, kai kopijuojami BOM elementai" @@ -8455,115 +8459,119 @@ msgstr "Serijos numeriai turi būti pateikti sąraše" msgid "Quantity does not match serial numbers" msgstr "Kiekis nesutampa su serijos numeriais" -#: stock/models.py:2012 stock/models.py:2917 +#: stock/models.py:1912 +msgid "Cannot assign stock to structural location" +msgstr "" + +#: stock/models.py:2029 stock/models.py:2934 msgid "Test template does not exist" msgstr "Bandomasis šablonas neegzistuoja" -#: stock/models.py:2030 +#: stock/models.py:2047 msgid "Stock item has been assigned to a sales order" msgstr "Atsargų elementas buvo priskirtas pardavimo užsakymui" -#: stock/models.py:2034 +#: stock/models.py:2051 msgid "Stock item is installed in another item" msgstr "Atsargų elementas sumontuotas kitame elemente" -#: stock/models.py:2037 +#: stock/models.py:2054 msgid "Stock item contains other items" msgstr "Atsargų elementas turi kitų elementų" -#: stock/models.py:2040 +#: stock/models.py:2057 msgid "Stock item has been assigned to a customer" msgstr "Atsargų elementas buvo priskirtas klientui" -#: stock/models.py:2043 stock/models.py:2226 +#: stock/models.py:2060 stock/models.py:2243 msgid "Stock item is currently in production" msgstr "Atsargų elementas šiuo metu gaminamas" -#: stock/models.py:2046 +#: stock/models.py:2063 msgid "Serialized stock cannot be merged" msgstr "Su serijos numeriais pažymėtų atsargų sujungti negalima" -#: stock/models.py:2053 stock/serializers.py:1462 +#: stock/models.py:2070 stock/serializers.py:1462 msgid "Duplicate stock items" msgstr "Pasikartojantys atsargų elementai" -#: stock/models.py:2057 +#: stock/models.py:2074 msgid "Stock items must refer to the same part" msgstr "Atsargų elementai turi būti susiję su ta pačia detale" -#: stock/models.py:2065 +#: stock/models.py:2082 msgid "Stock items must refer to the same supplier part" msgstr "Atsargų elementai turi būti susiję su ta pačia tiekėjo detale" -#: stock/models.py:2070 +#: stock/models.py:2087 msgid "Stock status codes must match" msgstr "Atsargų būsenos kodai turi sutapti" -#: stock/models.py:2349 +#: stock/models.py:2366 msgid "StockItem cannot be moved as it is not in stock" msgstr "Atsargų elemento negalima perkelti, nes jo nėra sandėlyje" -#: stock/models.py:2818 +#: stock/models.py:2835 msgid "Stock Item Tracking" msgstr "Atsargų elemento sekimas" -#: stock/models.py:2849 +#: stock/models.py:2866 msgid "Entry notes" msgstr "Įrašo pastabos" -#: stock/models.py:2889 +#: stock/models.py:2906 msgid "Stock Item Test Result" msgstr "Atsargų elemento bandymo rezultatas" -#: stock/models.py:2920 +#: stock/models.py:2937 msgid "Value must be provided for this test" msgstr "Šiam bandymui turi būti pateikta reikšmė" -#: stock/models.py:2924 +#: stock/models.py:2941 msgid "Attachment must be uploaded for this test" msgstr "Šiam bandymui turi būti įkeltas priedas" -#: stock/models.py:2929 +#: stock/models.py:2946 msgid "Invalid value for this test" msgstr "Netinkama reikšmė šiam bandymui" -#: stock/models.py:2953 +#: stock/models.py:2970 msgid "Test result" msgstr "Bandymo rezultatas" -#: stock/models.py:2960 +#: stock/models.py:2977 msgid "Test output value" msgstr "Bandymo išvesties reikšmė" -#: stock/models.py:2968 stock/serializers.py:248 +#: stock/models.py:2985 stock/serializers.py:248 msgid "Test result attachment" msgstr "Bandymo rezultato priedas" -#: stock/models.py:2972 +#: stock/models.py:2989 msgid "Test notes" msgstr "Bandymo pastabos" -#: stock/models.py:2980 +#: stock/models.py:2997 msgid "Test station" msgstr "Bandymų stotis" -#: stock/models.py:2981 +#: stock/models.py:2998 msgid "The identifier of the test station where the test was performed" msgstr "Bandymų stoties identifikatorius, kurioje atliktas bandymas" -#: stock/models.py:2987 +#: stock/models.py:3004 msgid "Started" msgstr "Pradėta" -#: stock/models.py:2988 +#: stock/models.py:3005 msgid "The timestamp of the test start" msgstr "Bandymo pradžios laiko žyma" -#: stock/models.py:2994 +#: stock/models.py:3011 msgid "Finished" msgstr "Pabaigta" -#: stock/models.py:2995 +#: stock/models.py:3012 msgid "The timestamp of the test finish" msgstr "Bandymo pabaigos laiko žyma" @@ -8902,83 +8910,87 @@ msgstr "Atsargos pridėtos rankiniu būdu" msgid "Stock manually removed" msgstr "Atsargos pašalintos rankiniu būdu" -#: stock/status_codes.py:57 +#: stock/status_codes.py:56 +msgid "Serialized stock items" +msgstr "" + +#: stock/status_codes.py:58 msgid "Returned to stock" msgstr "" -#: stock/status_codes.py:60 +#: stock/status_codes.py:61 msgid "Location changed" msgstr "Vieta pakeista" -#: stock/status_codes.py:61 +#: stock/status_codes.py:62 msgid "Stock updated" msgstr "Atsargos atnaujintos" -#: stock/status_codes.py:64 +#: stock/status_codes.py:65 msgid "Installed into assembly" msgstr "Sumontuota į surinkimą" -#: stock/status_codes.py:65 +#: stock/status_codes.py:66 msgid "Removed from assembly" msgstr "Pašalinta iš surinkimo" -#: stock/status_codes.py:67 +#: stock/status_codes.py:68 msgid "Installed component item" msgstr "Sumontuotas komponentas" -#: stock/status_codes.py:68 +#: stock/status_codes.py:69 msgid "Removed component item" msgstr "Pašalintas komponentas" -#: stock/status_codes.py:71 +#: stock/status_codes.py:72 msgid "Split from parent item" msgstr "Atskirtas nuo pirminio elemento" -#: stock/status_codes.py:72 +#: stock/status_codes.py:73 msgid "Split child item" msgstr "Atskirtas antrinis elementas" -#: stock/status_codes.py:75 +#: stock/status_codes.py:76 msgid "Merged stock items" msgstr "Sujungti atsargų elementai" -#: stock/status_codes.py:78 +#: stock/status_codes.py:79 msgid "Converted to variant" msgstr "Konvertuota į variantą" -#: stock/status_codes.py:81 +#: stock/status_codes.py:82 msgid "Build order output created" msgstr "Sukurtas gamybos užsakymo rezultatas" -#: stock/status_codes.py:82 +#: stock/status_codes.py:83 msgid "Build order output completed" msgstr "Gamybos užsakymo rezultatas užbaigtas" -#: stock/status_codes.py:83 +#: stock/status_codes.py:84 msgid "Build order output rejected" msgstr "Gamybos užsakymo rezultatas atmestas" -#: stock/status_codes.py:84 +#: stock/status_codes.py:85 msgid "Consumed by build order" msgstr "Sunaudota gamybos užsakyme" -#: stock/status_codes.py:87 +#: stock/status_codes.py:88 msgid "Shipped against Sales Order" msgstr "Išsiųsta pagal pardavimo užsakymą" -#: stock/status_codes.py:90 +#: stock/status_codes.py:91 msgid "Received against Purchase Order" msgstr "Gauta pagal pirkimo užsakymą" -#: stock/status_codes.py:93 +#: stock/status_codes.py:94 msgid "Returned against Return Order" msgstr "Grąžinta pagal grąžinimo užsakymą" -#: stock/status_codes.py:96 +#: stock/status_codes.py:97 msgid "Sent to customer" msgstr "Išsiųsta klientui" -#: stock/status_codes.py:97 +#: stock/status_codes.py:98 msgid "Returned from customer" msgstr "Grąžinta iš kliento" diff --git a/src/backend/InvenTree/locale/lv/LC_MESSAGES/django.po b/src/backend/InvenTree/locale/lv/LC_MESSAGES/django.po index dc1e60844d..5def4d3512 100644 --- a/src/backend/InvenTree/locale/lv/LC_MESSAGES/django.po +++ b/src/backend/InvenTree/locale/lv/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: inventree\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-11-19 04:55+0000\n" -"PO-Revision-Date: 2025-11-19 04:59\n" +"POT-Creation-Date: 2025-11-24 06:50+0000\n" +"PO-Revision-Date: 2025-11-24 06:54\n" "Last-Translator: \n" "Language-Team: Latvian\n" "Language: lv_LV\n" @@ -81,21 +81,21 @@ msgstr "Norādītā primārā e-pasta adrese nav derīga." msgid "The provided email domain is not approved." msgstr "Norādītais e-pasta domēns nav apstiprināts." -#: InvenTree/conversion.py:166 +#: InvenTree/conversion.py:240 #, python-brace-format msgid "Invalid unit provided ({unit})" msgstr "Norādīta nederīga vienība ({unit})" -#: InvenTree/conversion.py:183 +#: InvenTree/conversion.py:257 msgid "No value provided" msgstr "Nav norādīta vērtība" -#: InvenTree/conversion.py:210 +#: InvenTree/conversion.py:284 #, python-brace-format msgid "Could not convert {original} to {unit}" msgstr "Nevarēja konvertēt {original} par {unit}" -#: InvenTree/conversion.py:212 InvenTree/conversion.py:226 +#: InvenTree/conversion.py:286 InvenTree/conversion.py:300 #: InvenTree/helpers.py:597 order/models.py:720 order/models.py:1015 msgid "Invalid quantity provided" msgstr "Norādītais daudzums nav derīgs" @@ -116,7 +116,7 @@ msgstr "" #: build/serializers.py:580 build/serializers.py:1788 company/models.py:857 #: order/models.py:1780 #: report/templates/report/inventree_build_order_report.html:172 -#: stock/models.py:2848 stock/models.py:2972 stock/serializers.py:717 +#: stock/models.py:2865 stock/models.py:2989 stock/serializers.py:717 #: stock/serializers.py:893 stock/serializers.py:1035 stock/serializers.py:1336 #: stock/serializers.py:1425 stock/serializers.py:1624 msgid "Notes" @@ -345,7 +345,7 @@ msgstr "" msgid "Currency" msgstr "" -#: InvenTree/serializers.py:298 part/serializers.py:1385 +#: InvenTree/serializers.py:298 part/serializers.py:1357 msgid "Select currency from available options" msgstr "" @@ -553,14 +553,14 @@ msgstr "" #: build/api.py:100 build/api.py:466 build/api.py:845 build/models.py:270 #: build/serializers.py:1225 build/serializers.py:1356 -#: build/serializers.py:1427 company/models.py:1067 company/serializers.py:445 +#: build/serializers.py:1427 company/models.py:1067 company/serializers.py:491 #: order/api.py:298 order/api.py:302 order/api.py:929 order/api.py:1187 #: order/api.py:1190 order/models.py:1941 order/models.py:2108 #: order/models.py:2109 part/api.py:1233 part/api.py:1236 part/api.py:1302 #: part/api.py:1589 part/models.py:472 part/models.py:3296 part/models.py:3439 #: part/models.py:3497 part/models.py:3518 part/models.py:3540 #: part/models.py:3679 part/models.py:4046 part/models.py:4368 -#: part/models.py:4787 part/serializers.py:1928 +#: part/models.py:4787 part/serializers.py:1900 #: report/templates/report/inventree_bill_of_materials_report.html:110 #: report/templates/report/inventree_bill_of_materials_report.html:137 #: report/templates/report/inventree_build_order_report.html:109 @@ -582,7 +582,7 @@ msgstr "" #: build/api.py:120 build/api.py:123 build/serializers.py:1438 part/api.py:980 #: part/api.py:1316 part/api.py:1600 part/models.py:1080 part/models.py:3568 -#: part/models.py:4162 part/serializers.py:1752 stock/api.py:869 +#: part/models.py:4162 part/serializers.py:1724 stock/api.py:869 msgid "Category" msgstr "" @@ -663,7 +663,7 @@ msgid "Optional" msgstr "" #: build/api.py:455 build/serializers.py:1415 common/setting/system.py:456 -#: part/models.py:1202 part/serializers.py:1714 part/serializers.py:1725 +#: part/models.py:1202 part/serializers.py:1686 part/serializers.py:1697 #: stock/api.py:639 msgid "Assembly" msgstr "" @@ -688,16 +688,16 @@ msgstr "" msgid "Consumed" msgstr "" -#: build/api.py:499 company/models.py:912 company/serializers.py:440 +#: build/api.py:499 company/models.py:912 company/serializers.py:474 #: templates/email/build_order_required_stock.html:19 #: templates/email/low_stock_notification.html:17 #: templates/email/part_event_notification.html:18 msgid "Available" msgstr "" -#: build/api.py:523 build/serializers.py:1466 company/serializers.py:437 -#: order/serializers.py:1281 part/serializers.py:959 part/serializers.py:1306 -#: part/serializers.py:1761 +#: build/api.py:523 build/serializers.py:1466 company/serializers.py:471 +#: order/serializers.py:1281 part/serializers.py:931 part/serializers.py:1278 +#: part/serializers.py:1733 msgid "On Order" msgstr "" @@ -963,7 +963,7 @@ msgstr "" #: build/models.py:1136 build/models.py:1234 build/serializers.py:285 #: build/serializers.py:335 build/serializers.py:965 build/serializers.py:1739 #: order/models.py:717 order/serializers.py:658 order/serializers.py:844 -#: part/serializers.py:1708 stock/models.py:940 stock/models.py:1430 +#: part/serializers.py:1680 stock/models.py:940 stock/models.py:1430 #: stock/models.py:1878 stock/serializers.py:688 stock/serializers.py:1580 msgid "Quantity must be greater than zero" msgstr "" @@ -1385,20 +1385,20 @@ msgstr "" msgid "BOM Item" msgstr "" -#: build/serializers.py:1467 order/serializers.py:1282 part/serializers.py:1310 -#: part/serializers.py:1765 +#: build/serializers.py:1467 order/serializers.py:1282 part/serializers.py:1282 +#: part/serializers.py:1737 msgid "In Production" msgstr "" -#: build/serializers.py:1469 part/serializers.py:950 part/serializers.py:1314 +#: build/serializers.py:1469 part/serializers.py:922 part/serializers.py:1286 msgid "Scheduled to Build" msgstr "" -#: build/serializers.py:1472 part/serializers.py:987 +#: build/serializers.py:1472 part/serializers.py:959 msgid "External Stock" msgstr "" -#: build/serializers.py:1473 part/serializers.py:1300 part/serializers.py:1808 +#: build/serializers.py:1473 part/serializers.py:1272 part/serializers.py:1780 msgid "Available Stock" msgstr "" @@ -1588,7 +1588,7 @@ msgstr "" msgid "Price break quantity" msgstr "" -#: common/models.py:1348 company/serializers.py:564 order/models.py:1842 +#: common/models.py:1348 company/serializers.py:357 order/models.py:1842 #: order/models.py:3043 msgid "Price" msgstr "" @@ -1760,7 +1760,7 @@ msgstr "" msgid "Unit definition" msgstr "" -#: common/models.py:1911 common/models.py:1974 stock/models.py:2967 +#: common/models.py:1911 common/models.py:1974 stock/models.py:2984 #: stock/serializers.py:247 msgid "Attachment" msgstr "" @@ -1839,7 +1839,7 @@ msgstr "" #: common/models.py:2090 common/models.py:2329 company/models.py:622 #: machine/serializers.py:27 -#: report/templates/report/inventree_test_report.html:104 stock/models.py:2959 +#: report/templates/report/inventree_test_report.html:104 stock/models.py:2976 msgid "Value" msgstr "" @@ -2048,7 +2048,7 @@ msgid "Response data from the barcode scan" msgstr "" #: common/models.py:2417 report/templates/report/inventree_test_report.html:103 -#: stock/models.py:2953 +#: stock/models.py:2970 msgid "Result" msgstr "" @@ -2141,7 +2141,7 @@ msgid "Linked thread for this message" msgstr "" #: common/models.py:2656 -msgid "Prioriy" +msgid "Priority" msgstr "" #: common/models.py:2698 @@ -2671,8 +2671,8 @@ msgstr "" msgid "Parts can be assembled from other components by default" msgstr "" -#: common/setting/system.py:462 part/models.py:1208 part/serializers.py:1734 -#: part/serializers.py:1741 +#: common/setting/system.py:462 part/models.py:1208 part/serializers.py:1706 +#: part/serializers.py:1713 msgid "Component" msgstr "" @@ -3772,7 +3772,7 @@ msgstr "" msgid "Supplier is Active" msgstr "" -#: company/api.py:307 company/models.py:520 company/serializers.py:457 +#: company/api.py:307 company/models.py:520 company/serializers.py:503 #: part/serializers.py:566 msgid "Manufacturer" msgstr "" @@ -3964,7 +3964,7 @@ msgid "Link to address information (external)" msgstr "" #: company/models.py:492 company/models.py:609 company/models.py:832 -#: company/serializers.py:471 stock/api.py:561 +#: company/serializers.py:517 stock/api.py:561 msgid "Manufacturer Part" msgstr "" @@ -3981,7 +3981,7 @@ msgstr "" msgid "Select manufacturer" msgstr "" -#: company/models.py:527 company/serializers.py:479 order/serializers.py:734 +#: company/models.py:527 company/serializers.py:525 order/serializers.py:734 #: part/serializers.py:576 msgid "MPN" msgstr "" @@ -4030,7 +4030,7 @@ msgstr "" msgid "Linked manufacturer part must reference the same base part" msgstr "" -#: company/models.py:810 company/serializers.py:449 company/serializers.py:467 +#: company/models.py:810 company/serializers.py:495 company/serializers.py:513 #: order/models.py:639 part/serializers.py:550 #: plugin/builtin/suppliers/digikey.py:26 plugin/builtin/suppliers/lcsc.py:27 #: plugin/builtin/suppliers/mouser.py:25 plugin/builtin/suppliers/tme.py:27 @@ -4134,10 +4134,14 @@ msgstr "" msgid "Company Name" msgstr "" -#: company/serializers.py:433 part/serializers.py:955 stock/serializers.py:428 +#: company/serializers.py:467 part/serializers.py:927 stock/serializers.py:428 msgid "In Stock" msgstr "" +#: company/serializers.py:484 +msgid "Price Breaks" +msgstr "" + #: data_exporter/mixins.py:325 data_exporter/mixins.py:403 msgid "Error occurred during data export" msgstr "" @@ -4290,7 +4294,7 @@ msgstr "" msgid "Errors" msgstr "" -#: importer/models.py:550 part/serializers.py:1268 +#: importer/models.py:550 part/serializers.py:1240 msgid "Valid" msgstr "" @@ -5677,7 +5681,7 @@ msgstr "" msgid "Part category" msgstr "" -#: part/models.py:1088 part/serializers.py:929 +#: part/models.py:1088 part/serializers.py:901 #: report/templates/report/inventree_stock_location_report.html:103 msgid "IPN" msgstr "" @@ -5718,7 +5722,7 @@ msgstr "" msgid "Expiry time (in days) for stock items of this part" msgstr "" -#: part/models.py:1186 part/serializers.py:1003 +#: part/models.py:1186 part/serializers.py:975 msgid "Minimum Stock" msgstr "" @@ -6418,203 +6422,203 @@ msgstr "" msgid "Supplier part matching this SKU already exists" msgstr "" -#: part/serializers.py:914 +#: part/serializers.py:886 msgid "Category Name" msgstr "" -#: part/serializers.py:943 +#: part/serializers.py:915 msgid "Building" msgstr "" -#: part/serializers.py:944 +#: part/serializers.py:916 msgid "Quantity of this part currently being in production" msgstr "" -#: part/serializers.py:951 +#: part/serializers.py:923 msgid "Outstanding quantity of this part scheduled to be built" msgstr "" -#: part/serializers.py:971 stock/serializers.py:1019 stock/serializers.py:1189 +#: part/serializers.py:943 stock/serializers.py:1019 stock/serializers.py:1189 #: users/ruleset.py:30 msgid "Stock Items" msgstr "" -#: part/serializers.py:975 +#: part/serializers.py:947 msgid "Revisions" msgstr "" -#: part/serializers.py:979 +#: part/serializers.py:951 msgid "Suppliers" msgstr "" -#: part/serializers.py:983 part/serializers.py:1297 +#: part/serializers.py:955 part/serializers.py:1269 #: templates/email/low_stock_notification.html:16 #: templates/email/part_event_notification.html:17 msgid "Total Stock" msgstr "" -#: part/serializers.py:991 +#: part/serializers.py:963 msgid "Unallocated Stock" msgstr "" -#: part/serializers.py:999 +#: part/serializers.py:971 msgid "Variant Stock" msgstr "" -#: part/serializers.py:1054 +#: part/serializers.py:1026 msgid "Duplicate Part" msgstr "" -#: part/serializers.py:1055 +#: part/serializers.py:1027 msgid "Copy initial data from another Part" msgstr "" -#: part/serializers.py:1061 +#: part/serializers.py:1033 msgid "Initial Stock" msgstr "" -#: part/serializers.py:1062 +#: part/serializers.py:1034 msgid "Create Part with initial stock quantity" msgstr "" -#: part/serializers.py:1068 +#: part/serializers.py:1040 msgid "Supplier Information" msgstr "" -#: part/serializers.py:1069 +#: part/serializers.py:1041 msgid "Add initial supplier information for this part" msgstr "" -#: part/serializers.py:1077 +#: part/serializers.py:1049 msgid "Copy Category Parameters" msgstr "" -#: part/serializers.py:1078 +#: part/serializers.py:1050 msgid "Copy parameter templates from selected part category" msgstr "" -#: part/serializers.py:1083 +#: part/serializers.py:1055 msgid "Existing Image" msgstr "" -#: part/serializers.py:1084 +#: part/serializers.py:1056 msgid "Filename of an existing part image" msgstr "" -#: part/serializers.py:1101 +#: part/serializers.py:1073 msgid "Image file does not exist" msgstr "" -#: part/serializers.py:1269 +#: part/serializers.py:1241 msgid "Validate entire Bill of Materials" msgstr "" -#: part/serializers.py:1303 part/serializers.py:1769 +#: part/serializers.py:1275 part/serializers.py:1741 msgid "Can Build" msgstr "" -#: part/serializers.py:1320 +#: part/serializers.py:1292 msgid "Required for Build Orders" msgstr "" -#: part/serializers.py:1325 +#: part/serializers.py:1297 msgid "Allocated to Build Orders" msgstr "" -#: part/serializers.py:1332 +#: part/serializers.py:1304 msgid "Required for Sales Orders" msgstr "" -#: part/serializers.py:1336 +#: part/serializers.py:1308 msgid "Allocated to Sales Orders" msgstr "" -#: part/serializers.py:1475 +#: part/serializers.py:1447 msgid "Minimum Price" msgstr "" -#: part/serializers.py:1476 +#: part/serializers.py:1448 msgid "Override calculated value for minimum price" msgstr "" -#: part/serializers.py:1483 +#: part/serializers.py:1455 msgid "Minimum price currency" msgstr "" -#: part/serializers.py:1490 +#: part/serializers.py:1462 msgid "Maximum Price" msgstr "" -#: part/serializers.py:1491 +#: part/serializers.py:1463 msgid "Override calculated value for maximum price" msgstr "" -#: part/serializers.py:1498 +#: part/serializers.py:1470 msgid "Maximum price currency" msgstr "" -#: part/serializers.py:1527 +#: part/serializers.py:1499 msgid "Update" msgstr "" -#: part/serializers.py:1528 +#: part/serializers.py:1500 msgid "Update pricing for this part" msgstr "" -#: part/serializers.py:1551 +#: part/serializers.py:1523 #, python-brace-format msgid "Could not convert from provided currencies to {default_currency}" msgstr "" -#: part/serializers.py:1558 +#: part/serializers.py:1530 msgid "Minimum price must not be greater than maximum price" msgstr "" -#: part/serializers.py:1561 +#: part/serializers.py:1533 msgid "Maximum price must not be less than minimum price" msgstr "" -#: part/serializers.py:1715 +#: part/serializers.py:1687 msgid "Select the parent assembly" msgstr "" -#: part/serializers.py:1735 +#: part/serializers.py:1707 msgid "Select the component part" msgstr "" -#: part/serializers.py:1929 +#: part/serializers.py:1901 msgid "Select part to copy BOM from" msgstr "" -#: part/serializers.py:1937 +#: part/serializers.py:1909 msgid "Remove Existing Data" msgstr "" -#: part/serializers.py:1938 +#: part/serializers.py:1910 msgid "Remove existing BOM items before copying" msgstr "" -#: part/serializers.py:1943 +#: part/serializers.py:1915 msgid "Include Inherited" msgstr "" -#: part/serializers.py:1944 +#: part/serializers.py:1916 msgid "Include BOM items which are inherited from templated parts" msgstr "" -#: part/serializers.py:1949 +#: part/serializers.py:1921 msgid "Skip Invalid Rows" msgstr "" -#: part/serializers.py:1950 +#: part/serializers.py:1922 msgid "Enable this option to skip invalid rows" msgstr "" -#: part/serializers.py:1955 +#: part/serializers.py:1927 msgid "Copy Substitute Parts" msgstr "" -#: part/serializers.py:1956 +#: part/serializers.py:1928 msgid "Copy substitute parts when duplicate BOM items" msgstr "" @@ -8455,115 +8459,119 @@ msgstr "" msgid "Quantity does not match serial numbers" msgstr "" -#: stock/models.py:2012 stock/models.py:2917 +#: stock/models.py:1912 +msgid "Cannot assign stock to structural location" +msgstr "" + +#: stock/models.py:2029 stock/models.py:2934 msgid "Test template does not exist" msgstr "" -#: stock/models.py:2030 +#: stock/models.py:2047 msgid "Stock item has been assigned to a sales order" msgstr "" -#: stock/models.py:2034 +#: stock/models.py:2051 msgid "Stock item is installed in another item" msgstr "" -#: stock/models.py:2037 +#: stock/models.py:2054 msgid "Stock item contains other items" msgstr "" -#: stock/models.py:2040 +#: stock/models.py:2057 msgid "Stock item has been assigned to a customer" msgstr "" -#: stock/models.py:2043 stock/models.py:2226 +#: stock/models.py:2060 stock/models.py:2243 msgid "Stock item is currently in production" msgstr "" -#: stock/models.py:2046 +#: stock/models.py:2063 msgid "Serialized stock cannot be merged" msgstr "" -#: stock/models.py:2053 stock/serializers.py:1462 +#: stock/models.py:2070 stock/serializers.py:1462 msgid "Duplicate stock items" msgstr "" -#: stock/models.py:2057 +#: stock/models.py:2074 msgid "Stock items must refer to the same part" msgstr "" -#: stock/models.py:2065 +#: stock/models.py:2082 msgid "Stock items must refer to the same supplier part" msgstr "" -#: stock/models.py:2070 +#: stock/models.py:2087 msgid "Stock status codes must match" msgstr "" -#: stock/models.py:2349 +#: stock/models.py:2366 msgid "StockItem cannot be moved as it is not in stock" msgstr "" -#: stock/models.py:2818 +#: stock/models.py:2835 msgid "Stock Item Tracking" msgstr "" -#: stock/models.py:2849 +#: stock/models.py:2866 msgid "Entry notes" msgstr "" -#: stock/models.py:2889 +#: stock/models.py:2906 msgid "Stock Item Test Result" msgstr "" -#: stock/models.py:2920 +#: stock/models.py:2937 msgid "Value must be provided for this test" msgstr "" -#: stock/models.py:2924 +#: stock/models.py:2941 msgid "Attachment must be uploaded for this test" msgstr "" -#: stock/models.py:2929 +#: stock/models.py:2946 msgid "Invalid value for this test" msgstr "" -#: stock/models.py:2953 +#: stock/models.py:2970 msgid "Test result" msgstr "" -#: stock/models.py:2960 +#: stock/models.py:2977 msgid "Test output value" msgstr "" -#: stock/models.py:2968 stock/serializers.py:248 +#: stock/models.py:2985 stock/serializers.py:248 msgid "Test result attachment" msgstr "" -#: stock/models.py:2972 +#: stock/models.py:2989 msgid "Test notes" msgstr "" -#: stock/models.py:2980 +#: stock/models.py:2997 msgid "Test station" msgstr "" -#: stock/models.py:2981 +#: stock/models.py:2998 msgid "The identifier of the test station where the test was performed" msgstr "" -#: stock/models.py:2987 +#: stock/models.py:3004 msgid "Started" msgstr "" -#: stock/models.py:2988 +#: stock/models.py:3005 msgid "The timestamp of the test start" msgstr "" -#: stock/models.py:2994 +#: stock/models.py:3011 msgid "Finished" msgstr "" -#: stock/models.py:2995 +#: stock/models.py:3012 msgid "The timestamp of the test finish" msgstr "" @@ -8902,83 +8910,87 @@ msgstr "" msgid "Stock manually removed" msgstr "" -#: stock/status_codes.py:57 +#: stock/status_codes.py:56 +msgid "Serialized stock items" +msgstr "" + +#: stock/status_codes.py:58 msgid "Returned to stock" msgstr "" -#: stock/status_codes.py:60 +#: stock/status_codes.py:61 msgid "Location changed" msgstr "" -#: stock/status_codes.py:61 +#: stock/status_codes.py:62 msgid "Stock updated" msgstr "" -#: stock/status_codes.py:64 +#: stock/status_codes.py:65 msgid "Installed into assembly" msgstr "" -#: stock/status_codes.py:65 +#: stock/status_codes.py:66 msgid "Removed from assembly" msgstr "" -#: stock/status_codes.py:67 +#: stock/status_codes.py:68 msgid "Installed component item" msgstr "" -#: stock/status_codes.py:68 +#: stock/status_codes.py:69 msgid "Removed component item" msgstr "" -#: stock/status_codes.py:71 +#: stock/status_codes.py:72 msgid "Split from parent item" msgstr "" -#: stock/status_codes.py:72 +#: stock/status_codes.py:73 msgid "Split child item" msgstr "" -#: stock/status_codes.py:75 +#: stock/status_codes.py:76 msgid "Merged stock items" msgstr "" -#: stock/status_codes.py:78 +#: stock/status_codes.py:79 msgid "Converted to variant" msgstr "" -#: stock/status_codes.py:81 +#: stock/status_codes.py:82 msgid "Build order output created" msgstr "" -#: stock/status_codes.py:82 +#: stock/status_codes.py:83 msgid "Build order output completed" msgstr "" -#: stock/status_codes.py:83 +#: stock/status_codes.py:84 msgid "Build order output rejected" msgstr "" -#: stock/status_codes.py:84 +#: stock/status_codes.py:85 msgid "Consumed by build order" msgstr "" -#: stock/status_codes.py:87 +#: stock/status_codes.py:88 msgid "Shipped against Sales Order" msgstr "" -#: stock/status_codes.py:90 +#: stock/status_codes.py:91 msgid "Received against Purchase Order" msgstr "" -#: stock/status_codes.py:93 +#: stock/status_codes.py:94 msgid "Returned against Return Order" msgstr "" -#: stock/status_codes.py:96 +#: stock/status_codes.py:97 msgid "Sent to customer" msgstr "" -#: stock/status_codes.py:97 +#: stock/status_codes.py:98 msgid "Returned from customer" msgstr "" diff --git a/src/backend/InvenTree/locale/nl/LC_MESSAGES/django.po b/src/backend/InvenTree/locale/nl/LC_MESSAGES/django.po index f33faf926e..49c4d88eb7 100644 --- a/src/backend/InvenTree/locale/nl/LC_MESSAGES/django.po +++ b/src/backend/InvenTree/locale/nl/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: inventree\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-11-19 04:55+0000\n" -"PO-Revision-Date: 2025-11-19 04:59\n" +"POT-Creation-Date: 2025-11-24 06:50+0000\n" +"PO-Revision-Date: 2025-11-24 06:53\n" "Last-Translator: \n" "Language-Team: Dutch\n" "Language: nl_NL\n" @@ -81,21 +81,21 @@ msgstr "Het opgegeven primaire e-mailadres is ongeldig." msgid "The provided email domain is not approved." msgstr "Het ingevoerde e-maildomein is niet goedgekeurd." -#: InvenTree/conversion.py:166 +#: InvenTree/conversion.py:240 #, python-brace-format msgid "Invalid unit provided ({unit})" msgstr "Ongeldige eenheid opgegeven ({unit})" -#: InvenTree/conversion.py:183 +#: InvenTree/conversion.py:257 msgid "No value provided" msgstr "Geen waarde opgegeven" -#: InvenTree/conversion.py:210 +#: InvenTree/conversion.py:284 #, python-brace-format msgid "Could not convert {original} to {unit}" msgstr "{original} kon niet worden omgezet naar {unit}" -#: InvenTree/conversion.py:212 InvenTree/conversion.py:226 +#: InvenTree/conversion.py:286 InvenTree/conversion.py:300 #: InvenTree/helpers.py:597 order/models.py:720 order/models.py:1015 msgid "Invalid quantity provided" msgstr "Ongeldige hoeveelheid ingevoerd" @@ -116,7 +116,7 @@ msgstr "Ongeldige decimale waarde" #: build/serializers.py:580 build/serializers.py:1788 company/models.py:857 #: order/models.py:1780 #: report/templates/report/inventree_build_order_report.html:172 -#: stock/models.py:2848 stock/models.py:2972 stock/serializers.py:717 +#: stock/models.py:2865 stock/models.py:2989 stock/serializers.py:717 #: stock/serializers.py:893 stock/serializers.py:1035 stock/serializers.py:1336 #: stock/serializers.py:1425 stock/serializers.py:1624 msgid "Notes" @@ -345,7 +345,7 @@ msgstr "Moet een geldig nummer zijn" msgid "Currency" msgstr "Valuta" -#: InvenTree/serializers.py:298 part/serializers.py:1385 +#: InvenTree/serializers.py:298 part/serializers.py:1357 msgid "Select currency from available options" msgstr "Selecteer valuta uit beschikbare opties" @@ -553,14 +553,14 @@ msgstr "Inclusief varianten" #: build/api.py:100 build/api.py:466 build/api.py:845 build/models.py:270 #: build/serializers.py:1225 build/serializers.py:1356 -#: build/serializers.py:1427 company/models.py:1067 company/serializers.py:445 +#: build/serializers.py:1427 company/models.py:1067 company/serializers.py:491 #: order/api.py:298 order/api.py:302 order/api.py:929 order/api.py:1187 #: order/api.py:1190 order/models.py:1941 order/models.py:2108 #: order/models.py:2109 part/api.py:1233 part/api.py:1236 part/api.py:1302 #: part/api.py:1589 part/models.py:472 part/models.py:3296 part/models.py:3439 #: part/models.py:3497 part/models.py:3518 part/models.py:3540 #: part/models.py:3679 part/models.py:4046 part/models.py:4368 -#: part/models.py:4787 part/serializers.py:1928 +#: part/models.py:4787 part/serializers.py:1900 #: report/templates/report/inventree_bill_of_materials_report.html:110 #: report/templates/report/inventree_bill_of_materials_report.html:137 #: report/templates/report/inventree_build_order_report.html:109 @@ -582,7 +582,7 @@ msgstr "Onderdeel" #: build/api.py:120 build/api.py:123 build/serializers.py:1438 part/api.py:980 #: part/api.py:1316 part/api.py:1600 part/models.py:1080 part/models.py:3568 -#: part/models.py:4162 part/serializers.py:1752 stock/api.py:869 +#: part/models.py:4162 part/serializers.py:1724 stock/api.py:869 msgid "Category" msgstr "Categorie" @@ -663,7 +663,7 @@ msgid "Optional" msgstr "Optioneel" #: build/api.py:455 build/serializers.py:1415 common/setting/system.py:456 -#: part/models.py:1202 part/serializers.py:1714 part/serializers.py:1725 +#: part/models.py:1202 part/serializers.py:1686 part/serializers.py:1697 #: stock/api.py:639 msgid "Assembly" msgstr "Samenstelling" @@ -688,16 +688,16 @@ msgstr "Toegewezen" msgid "Consumed" msgstr "Verbruikt" -#: build/api.py:499 company/models.py:912 company/serializers.py:440 +#: build/api.py:499 company/models.py:912 company/serializers.py:474 #: templates/email/build_order_required_stock.html:19 #: templates/email/low_stock_notification.html:17 #: templates/email/part_event_notification.html:18 msgid "Available" msgstr "Beschikbaar" -#: build/api.py:523 build/serializers.py:1466 company/serializers.py:437 -#: order/serializers.py:1281 part/serializers.py:959 part/serializers.py:1306 -#: part/serializers.py:1761 +#: build/api.py:523 build/serializers.py:1466 company/serializers.py:471 +#: order/serializers.py:1281 part/serializers.py:931 part/serializers.py:1278 +#: part/serializers.py:1733 msgid "On Order" msgstr "In bestelling" @@ -963,7 +963,7 @@ msgstr "Productuitvoer komt niet overeen met de Productieorder" #: build/models.py:1136 build/models.py:1234 build/serializers.py:285 #: build/serializers.py:335 build/serializers.py:965 build/serializers.py:1739 #: order/models.py:717 order/serializers.py:658 order/serializers.py:844 -#: part/serializers.py:1708 stock/models.py:940 stock/models.py:1430 +#: part/serializers.py:1680 stock/models.py:940 stock/models.py:1430 #: stock/models.py:1878 stock/serializers.py:688 stock/serializers.py:1580 msgid "Quantity must be greater than zero" msgstr "Hoeveelheid moet groter zijn dan nul" @@ -1385,20 +1385,20 @@ msgstr "Varianten toestaan" msgid "BOM Item" msgstr "Stuklijstartikel" -#: build/serializers.py:1467 order/serializers.py:1282 part/serializers.py:1310 -#: part/serializers.py:1765 +#: build/serializers.py:1467 order/serializers.py:1282 part/serializers.py:1282 +#: part/serializers.py:1737 msgid "In Production" msgstr "In productie" -#: build/serializers.py:1469 part/serializers.py:950 part/serializers.py:1314 +#: build/serializers.py:1469 part/serializers.py:922 part/serializers.py:1286 msgid "Scheduled to Build" msgstr "Gepland om te bouwen" -#: build/serializers.py:1472 part/serializers.py:987 +#: build/serializers.py:1472 part/serializers.py:959 msgid "External Stock" msgstr "Externe voorraad" -#: build/serializers.py:1473 part/serializers.py:1300 part/serializers.py:1808 +#: build/serializers.py:1473 part/serializers.py:1272 part/serializers.py:1780 msgid "Available Stock" msgstr "Beschikbare Voorraad" @@ -1588,7 +1588,7 @@ msgstr "Gebruiker" msgid "Price break quantity" msgstr "Prijs pauze hoeveelheid" -#: common/models.py:1348 company/serializers.py:564 order/models.py:1842 +#: common/models.py:1348 company/serializers.py:357 order/models.py:1842 #: order/models.py:3043 msgid "Price" msgstr "Prijs" @@ -1760,7 +1760,7 @@ msgstr "Definitie" msgid "Unit definition" msgstr "Definitie van eenheid" -#: common/models.py:1911 common/models.py:1974 stock/models.py:2967 +#: common/models.py:1911 common/models.py:1974 stock/models.py:2984 #: stock/serializers.py:247 msgid "Attachment" msgstr "Bijlage" @@ -1839,7 +1839,7 @@ msgstr "Staat logische sleutel die gelijk is aan deze staat in zakelijke logica" #: common/models.py:2090 common/models.py:2329 company/models.py:622 #: machine/serializers.py:27 -#: report/templates/report/inventree_test_report.html:104 stock/models.py:2959 +#: report/templates/report/inventree_test_report.html:104 stock/models.py:2976 msgid "Value" msgstr "Waarde" @@ -2048,7 +2048,7 @@ msgid "Response data from the barcode scan" msgstr "Reactiegegevens van de barcode scan" #: common/models.py:2417 report/templates/report/inventree_test_report.html:103 -#: stock/models.py:2953 +#: stock/models.py:2970 msgid "Result" msgstr "Resultaat" @@ -2141,8 +2141,8 @@ msgid "Linked thread for this message" msgstr "Gekoppeld onderwerp voor dit bericht" #: common/models.py:2656 -msgid "Prioriy" -msgstr "Prioriteit" +msgid "Priority" +msgstr "" #: common/models.py:2698 msgid "Email Thread" @@ -2671,8 +2671,8 @@ msgstr "Onderdelen zijn standaard sjablonen" msgid "Parts can be assembled from other components by default" msgstr "Onderdelen kunnen standaard vanuit andere componenten worden samengesteld" -#: common/setting/system.py:462 part/models.py:1208 part/serializers.py:1734 -#: part/serializers.py:1741 +#: common/setting/system.py:462 part/models.py:1208 part/serializers.py:1706 +#: part/serializers.py:1713 msgid "Component" msgstr "Onderdeel" @@ -3772,7 +3772,7 @@ msgstr "Intern onderdeel is actief" msgid "Supplier is Active" msgstr "Leverancier is actief" -#: company/api.py:307 company/models.py:520 company/serializers.py:457 +#: company/api.py:307 company/models.py:520 company/serializers.py:503 #: part/serializers.py:566 msgid "Manufacturer" msgstr "Fabrikant" @@ -3964,7 +3964,7 @@ msgid "Link to address information (external)" msgstr "Link naar adres gegevens (extern)" #: company/models.py:492 company/models.py:609 company/models.py:832 -#: company/serializers.py:471 stock/api.py:561 +#: company/serializers.py:517 stock/api.py:561 msgid "Manufacturer Part" msgstr "Fabrikant onderdeel" @@ -3981,7 +3981,7 @@ msgstr "Onderdeel selecteren" msgid "Select manufacturer" msgstr "Fabrikant selecteren" -#: company/models.py:527 company/serializers.py:479 order/serializers.py:734 +#: company/models.py:527 company/serializers.py:525 order/serializers.py:734 #: part/serializers.py:576 msgid "MPN" msgstr "Fabrikant artikel nummer" @@ -4030,7 +4030,7 @@ msgstr "Hoeveelheid moet groter zijn dan nul" msgid "Linked manufacturer part must reference the same base part" msgstr "Gekoppeld fabrikant onderdeel moet verwijzen naar hetzelfde basis onderdeel" -#: company/models.py:810 company/serializers.py:449 company/serializers.py:467 +#: company/models.py:810 company/serializers.py:495 company/serializers.py:513 #: order/models.py:639 part/serializers.py:550 #: plugin/builtin/suppliers/digikey.py:26 plugin/builtin/suppliers/lcsc.py:27 #: plugin/builtin/suppliers/mouser.py:25 plugin/builtin/suppliers/tme.py:27 @@ -4134,10 +4134,14 @@ msgstr "Standaardvaluta die gebruikt wordt voor deze leverancier" msgid "Company Name" msgstr "Bedrijfsnaam" -#: company/serializers.py:433 part/serializers.py:955 stock/serializers.py:428 +#: company/serializers.py:467 part/serializers.py:927 stock/serializers.py:428 msgid "In Stock" msgstr "Op voorraad" +#: company/serializers.py:484 +msgid "Price Breaks" +msgstr "" + #: data_exporter/mixins.py:325 data_exporter/mixins.py:403 msgid "Error occurred during data export" msgstr "Fout opgetreden tijdens data export" @@ -4290,7 +4294,7 @@ msgstr "Oorspronkelijke rij gegevens" msgid "Errors" msgstr "Fouten" -#: importer/models.py:550 part/serializers.py:1268 +#: importer/models.py:550 part/serializers.py:1240 msgid "Valid" msgstr "Geldig" @@ -5678,7 +5682,7 @@ msgstr "Deel sleutelwoorden om de zichtbaarheid van de zoekresultaten te verbete msgid "Part category" msgstr "Onderdeel Categorie" -#: part/models.py:1088 part/serializers.py:929 +#: part/models.py:1088 part/serializers.py:901 #: report/templates/report/inventree_stock_location_report.html:103 msgid "IPN" msgstr "IPN" @@ -5719,7 +5723,7 @@ msgstr "Standaard verval datum" msgid "Expiry time (in days) for stock items of this part" msgstr "Verlooptijd (in dagen) voor voorraadartikelen van dit deel" -#: part/models.py:1186 part/serializers.py:1003 +#: part/models.py:1186 part/serializers.py:975 msgid "Minimum Stock" msgstr "Minimum voorraad" @@ -6419,203 +6423,203 @@ msgstr "Fabrikant deel dat overeenkomt met deze MPN bestaat al" msgid "Supplier part matching this SKU already exists" msgstr "Leveranciersdeel dat overeenkomt met deze SKU bestaat al" -#: part/serializers.py:914 +#: part/serializers.py:886 msgid "Category Name" msgstr "Categorie naam" -#: part/serializers.py:943 +#: part/serializers.py:915 msgid "Building" msgstr "Bouwen" -#: part/serializers.py:944 +#: part/serializers.py:916 msgid "Quantity of this part currently being in production" msgstr "Hoeveelheid van dit deel dat momenteel in productie is" -#: part/serializers.py:951 +#: part/serializers.py:923 msgid "Outstanding quantity of this part scheduled to be built" msgstr "Er zal een onuitputtelijke hoeveelheid van dit deel worden gebouwd" -#: part/serializers.py:971 stock/serializers.py:1019 stock/serializers.py:1189 +#: part/serializers.py:943 stock/serializers.py:1019 stock/serializers.py:1189 #: users/ruleset.py:30 msgid "Stock Items" msgstr "Voorraadartikelen" -#: part/serializers.py:975 +#: part/serializers.py:947 msgid "Revisions" msgstr "Revisies" -#: part/serializers.py:979 +#: part/serializers.py:951 msgid "Suppliers" msgstr "Leveranciers" -#: part/serializers.py:983 part/serializers.py:1297 +#: part/serializers.py:955 part/serializers.py:1269 #: templates/email/low_stock_notification.html:16 #: templates/email/part_event_notification.html:17 msgid "Total Stock" msgstr "Totale Voorraad" -#: part/serializers.py:991 +#: part/serializers.py:963 msgid "Unallocated Stock" msgstr "Niet toegewezen voorraad" -#: part/serializers.py:999 +#: part/serializers.py:971 msgid "Variant Stock" msgstr "Variant voorraad" -#: part/serializers.py:1054 +#: part/serializers.py:1026 msgid "Duplicate Part" msgstr "Dupliceer onderdeel" -#: part/serializers.py:1055 +#: part/serializers.py:1027 msgid "Copy initial data from another Part" msgstr "Kopieer eerste gegevens uit een ander onderdeel" -#: part/serializers.py:1061 +#: part/serializers.py:1033 msgid "Initial Stock" msgstr "Eerste voorraad" -#: part/serializers.py:1062 +#: part/serializers.py:1034 msgid "Create Part with initial stock quantity" msgstr "Maak onderdeel met eerste voorraad" -#: part/serializers.py:1068 +#: part/serializers.py:1040 msgid "Supplier Information" msgstr "Leveranciersgegevens" -#: part/serializers.py:1069 +#: part/serializers.py:1041 msgid "Add initial supplier information for this part" msgstr "Aanvankelijke leveranciersinformatie voor dit deel toevoegen" -#: part/serializers.py:1077 +#: part/serializers.py:1049 msgid "Copy Category Parameters" msgstr "Categorie parameters kopiëren" -#: part/serializers.py:1078 +#: part/serializers.py:1050 msgid "Copy parameter templates from selected part category" msgstr "Parameter sjablonen kopiëren uit geselecteerde onderdeel categorie" -#: part/serializers.py:1083 +#: part/serializers.py:1055 msgid "Existing Image" msgstr "Bestaande afbeelding" -#: part/serializers.py:1084 +#: part/serializers.py:1056 msgid "Filename of an existing part image" msgstr "Bestandsnaam van een bestaande onderdeel afbeelding" -#: part/serializers.py:1101 +#: part/serializers.py:1073 msgid "Image file does not exist" msgstr "Afbeeldingsbestand bestaat niet" -#: part/serializers.py:1269 +#: part/serializers.py:1241 msgid "Validate entire Bill of Materials" msgstr "Valideer de gehele materiaalbon" -#: part/serializers.py:1303 part/serializers.py:1769 +#: part/serializers.py:1275 part/serializers.py:1741 msgid "Can Build" msgstr "Kan bouwen" -#: part/serializers.py:1320 +#: part/serializers.py:1292 msgid "Required for Build Orders" msgstr "Vereist voor bouworders" -#: part/serializers.py:1325 +#: part/serializers.py:1297 msgid "Allocated to Build Orders" msgstr "Toegewezen aan bouwen van orders" -#: part/serializers.py:1332 +#: part/serializers.py:1304 msgid "Required for Sales Orders" msgstr "Vereist voor verkooporders" -#: part/serializers.py:1336 +#: part/serializers.py:1308 msgid "Allocated to Sales Orders" msgstr "Toegewezen aan verkooporders" -#: part/serializers.py:1475 +#: part/serializers.py:1447 msgid "Minimum Price" msgstr "Minimale prijs" -#: part/serializers.py:1476 +#: part/serializers.py:1448 msgid "Override calculated value for minimum price" msgstr "Overschrijf berekende waarde voor minimale prijs" -#: part/serializers.py:1483 +#: part/serializers.py:1455 msgid "Minimum price currency" msgstr "Minimale prijs valuta" -#: part/serializers.py:1490 +#: part/serializers.py:1462 msgid "Maximum Price" msgstr "Maximale prijs" -#: part/serializers.py:1491 +#: part/serializers.py:1463 msgid "Override calculated value for maximum price" msgstr "Overschrijf de berekende waarde voor de maximale prijs" -#: part/serializers.py:1498 +#: part/serializers.py:1470 msgid "Maximum price currency" msgstr "Maximale prijs valuta" -#: part/serializers.py:1527 +#: part/serializers.py:1499 msgid "Update" msgstr "Bijwerken" -#: part/serializers.py:1528 +#: part/serializers.py:1500 msgid "Update pricing for this part" msgstr "Prijzen voor dit onderdeel bijwerken" -#: part/serializers.py:1551 +#: part/serializers.py:1523 #, python-brace-format msgid "Could not convert from provided currencies to {default_currency}" msgstr "Kan niet converteren van de verstrekte valuta naar {default_currency}" -#: part/serializers.py:1558 +#: part/serializers.py:1530 msgid "Minimum price must not be greater than maximum price" msgstr "Minimumprijs mag niet hoger zijn dan de maximale prijs" -#: part/serializers.py:1561 +#: part/serializers.py:1533 msgid "Maximum price must not be less than minimum price" msgstr "Maximale prijs mag niet lager zijn dan de minimale prijs" -#: part/serializers.py:1715 +#: part/serializers.py:1687 msgid "Select the parent assembly" msgstr "Selecteer de bovenliggende assemblage" -#: part/serializers.py:1735 +#: part/serializers.py:1707 msgid "Select the component part" msgstr "Selecteer het onderdeel" -#: part/serializers.py:1929 +#: part/serializers.py:1901 msgid "Select part to copy BOM from" msgstr "Selecteer onderdeel om BOM van te kopiëren" -#: part/serializers.py:1937 +#: part/serializers.py:1909 msgid "Remove Existing Data" msgstr "Bestaande gegevens verwijderen" -#: part/serializers.py:1938 +#: part/serializers.py:1910 msgid "Remove existing BOM items before copying" msgstr "Verwijder bestaande BOM items voor het kopiëren" -#: part/serializers.py:1943 +#: part/serializers.py:1915 msgid "Include Inherited" msgstr "Inclusief overgenomen" -#: part/serializers.py:1944 +#: part/serializers.py:1916 msgid "Include BOM items which are inherited from templated parts" msgstr "Inclusief stuklijst BOM items die worden overgenomen van getemplated onderdelen" -#: part/serializers.py:1949 +#: part/serializers.py:1921 msgid "Skip Invalid Rows" msgstr "Ongeldige regels overslaan" -#: part/serializers.py:1950 +#: part/serializers.py:1922 msgid "Enable this option to skip invalid rows" msgstr "Schakel deze optie in om ongeldige rijen over te slaan" -#: part/serializers.py:1955 +#: part/serializers.py:1927 msgid "Copy Substitute Parts" msgstr "Verwijder vervangend deel" -#: part/serializers.py:1956 +#: part/serializers.py:1928 msgid "Copy substitute parts when duplicate BOM items" msgstr "Kopieer vervangende onderdelen bij dubbele stuklijst BOM items" @@ -8456,115 +8460,119 @@ msgstr "Serienummers moeten als lijst worden opgegeven" msgid "Quantity does not match serial numbers" msgstr "Hoeveelheid komt niet overeen met serienummers" -#: stock/models.py:2012 stock/models.py:2917 +#: stock/models.py:1912 +msgid "Cannot assign stock to structural location" +msgstr "" + +#: stock/models.py:2029 stock/models.py:2934 msgid "Test template does not exist" msgstr "Testsjabloon bestaat niet" -#: stock/models.py:2030 +#: stock/models.py:2047 msgid "Stock item has been assigned to a sales order" msgstr "Voorraadartikel is toegewezen aan een verkooporder" -#: stock/models.py:2034 +#: stock/models.py:2051 msgid "Stock item is installed in another item" msgstr "Voorraad item is geïnstalleerd in een ander item" -#: stock/models.py:2037 +#: stock/models.py:2054 msgid "Stock item contains other items" msgstr "Voorraadartikel bevat andere producten" -#: stock/models.py:2040 +#: stock/models.py:2057 msgid "Stock item has been assigned to a customer" msgstr "Voorraadartikel is aan een klant toegewezen" -#: stock/models.py:2043 stock/models.py:2226 +#: stock/models.py:2060 stock/models.py:2243 msgid "Stock item is currently in production" msgstr "Voorraad item is momenteel in productie" -#: stock/models.py:2046 +#: stock/models.py:2063 msgid "Serialized stock cannot be merged" msgstr "Geserialiseerde voorraad kan niet worden samengevoegd" -#: stock/models.py:2053 stock/serializers.py:1462 +#: stock/models.py:2070 stock/serializers.py:1462 msgid "Duplicate stock items" msgstr "Dupliceer voorraadartikelen" -#: stock/models.py:2057 +#: stock/models.py:2074 msgid "Stock items must refer to the same part" msgstr "Voorraadartikelen moeten hetzelfde onderdeel verwijzen" -#: stock/models.py:2065 +#: stock/models.py:2082 msgid "Stock items must refer to the same supplier part" msgstr "Voorraadartikelen moeten verwijzen naar dezelfde leveranciersdeel" -#: stock/models.py:2070 +#: stock/models.py:2087 msgid "Stock status codes must match" msgstr "De voorraad statuscodes moeten overeenkomen" -#: stock/models.py:2349 +#: stock/models.py:2366 msgid "StockItem cannot be moved as it is not in stock" msgstr "Voorraadartikel kan niet worden verplaatst omdat het niet op voorraad is" -#: stock/models.py:2818 +#: stock/models.py:2835 msgid "Stock Item Tracking" msgstr "Voorraad item volgen" -#: stock/models.py:2849 +#: stock/models.py:2866 msgid "Entry notes" msgstr "Item notities" -#: stock/models.py:2889 +#: stock/models.py:2906 msgid "Stock Item Test Result" msgstr "Resultaat voorraad test resultaten" -#: stock/models.py:2920 +#: stock/models.py:2937 msgid "Value must be provided for this test" msgstr "Waarde moet voor deze test worden opgegeven" -#: stock/models.py:2924 +#: stock/models.py:2941 msgid "Attachment must be uploaded for this test" msgstr "Bijlage moet worden geüpload voor deze test" -#: stock/models.py:2929 +#: stock/models.py:2946 msgid "Invalid value for this test" msgstr "Ongeldige waarde voor deze test" -#: stock/models.py:2953 +#: stock/models.py:2970 msgid "Test result" msgstr "Test resultaat" -#: stock/models.py:2960 +#: stock/models.py:2977 msgid "Test output value" msgstr "Test uitvoer waarde" -#: stock/models.py:2968 stock/serializers.py:248 +#: stock/models.py:2985 stock/serializers.py:248 msgid "Test result attachment" msgstr "Test resultaat bijlage" -#: stock/models.py:2972 +#: stock/models.py:2989 msgid "Test notes" msgstr "Test notities" -#: stock/models.py:2980 +#: stock/models.py:2997 msgid "Test station" msgstr "Test station" -#: stock/models.py:2981 +#: stock/models.py:2998 msgid "The identifier of the test station where the test was performed" msgstr "De identificatie van het teststation waar de test werd uitgevoerd" -#: stock/models.py:2987 +#: stock/models.py:3004 msgid "Started" msgstr "Gestart" -#: stock/models.py:2988 +#: stock/models.py:3005 msgid "The timestamp of the test start" msgstr "Het tijdstip van de start test" -#: stock/models.py:2994 +#: stock/models.py:3011 msgid "Finished" msgstr "Afgerond" -#: stock/models.py:2995 +#: stock/models.py:3012 msgid "The timestamp of the test finish" msgstr "Het tijdstip van de afgeronde test" @@ -8903,83 +8911,87 @@ msgstr "Voorraad handmatig toegevoegd" msgid "Stock manually removed" msgstr "Voorraad handmatig verwijderd" -#: stock/status_codes.py:57 +#: stock/status_codes.py:56 +msgid "Serialized stock items" +msgstr "" + +#: stock/status_codes.py:58 msgid "Returned to stock" msgstr "Terug naar voorraad" -#: stock/status_codes.py:60 +#: stock/status_codes.py:61 msgid "Location changed" msgstr "Locatie veranderd" -#: stock/status_codes.py:61 +#: stock/status_codes.py:62 msgid "Stock updated" msgstr "Voorraad bijgewerkt" -#: stock/status_codes.py:64 +#: stock/status_codes.py:65 msgid "Installed into assembly" msgstr "Gemonteerd" -#: stock/status_codes.py:65 +#: stock/status_codes.py:66 msgid "Removed from assembly" msgstr "Gedemonteerd" -#: stock/status_codes.py:67 +#: stock/status_codes.py:68 msgid "Installed component item" msgstr "Geïnstalleerd componentartikel" -#: stock/status_codes.py:68 +#: stock/status_codes.py:69 msgid "Removed component item" msgstr "Verwijderd componentartikel" -#: stock/status_codes.py:71 +#: stock/status_codes.py:72 msgid "Split from parent item" msgstr "Splits van bovenliggend item" -#: stock/status_codes.py:72 +#: stock/status_codes.py:73 msgid "Split child item" msgstr "Splits onderliggende item" -#: stock/status_codes.py:75 +#: stock/status_codes.py:76 msgid "Merged stock items" msgstr "Samengevoegde voorraadartikelen" -#: stock/status_codes.py:78 +#: stock/status_codes.py:79 msgid "Converted to variant" msgstr "Geconverteerd naar variant" -#: stock/status_codes.py:81 +#: stock/status_codes.py:82 msgid "Build order output created" msgstr "Product aangemaakt" -#: stock/status_codes.py:82 +#: stock/status_codes.py:83 msgid "Build order output completed" msgstr "Product voltooid" -#: stock/status_codes.py:83 +#: stock/status_codes.py:84 msgid "Build order output rejected" msgstr "Build order uitvoer afgewezen" -#: stock/status_codes.py:84 +#: stock/status_codes.py:85 msgid "Consumed by build order" msgstr "Verbruikt door productieorder" -#: stock/status_codes.py:87 +#: stock/status_codes.py:88 msgid "Shipped against Sales Order" msgstr "Verzonden onder verkooporder" -#: stock/status_codes.py:90 +#: stock/status_codes.py:91 msgid "Received against Purchase Order" msgstr "Ontvangen onder verkooporder" -#: stock/status_codes.py:93 +#: stock/status_codes.py:94 msgid "Returned against Return Order" msgstr "Geretourneerd onder retourorder" -#: stock/status_codes.py:96 +#: stock/status_codes.py:97 msgid "Sent to customer" msgstr "Naar klant verzonden" -#: stock/status_codes.py:97 +#: stock/status_codes.py:98 msgid "Returned from customer" msgstr "Geretourneerd door klant" diff --git a/src/backend/InvenTree/locale/no/LC_MESSAGES/django.po b/src/backend/InvenTree/locale/no/LC_MESSAGES/django.po index f0fcde6791..c1cc763b0c 100644 --- a/src/backend/InvenTree/locale/no/LC_MESSAGES/django.po +++ b/src/backend/InvenTree/locale/no/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: inventree\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-11-19 04:55+0000\n" -"PO-Revision-Date: 2025-11-19 04:59\n" +"POT-Creation-Date: 2025-11-24 06:50+0000\n" +"PO-Revision-Date: 2025-11-24 06:54\n" "Last-Translator: \n" "Language-Team: Norwegian\n" "Language: no_NO\n" @@ -81,21 +81,21 @@ msgstr "Den oppgitte primære e-postadressen er ikke gyldig." msgid "The provided email domain is not approved." msgstr "Det oppgitte e-postdomenet er ikke godkjent." -#: InvenTree/conversion.py:166 +#: InvenTree/conversion.py:240 #, python-brace-format msgid "Invalid unit provided ({unit})" msgstr "Ugyldig enhet angitt ({unit})" -#: InvenTree/conversion.py:183 +#: InvenTree/conversion.py:257 msgid "No value provided" msgstr "Ingen verdi angitt" -#: InvenTree/conversion.py:210 +#: InvenTree/conversion.py:284 #, python-brace-format msgid "Could not convert {original} to {unit}" msgstr "Kunne ikke konvertere {original} til {unit}" -#: InvenTree/conversion.py:212 InvenTree/conversion.py:226 +#: InvenTree/conversion.py:286 InvenTree/conversion.py:300 #: InvenTree/helpers.py:597 order/models.py:720 order/models.py:1015 msgid "Invalid quantity provided" msgstr "Ugyldig mengde oppgitt" @@ -116,7 +116,7 @@ msgstr "" #: build/serializers.py:580 build/serializers.py:1788 company/models.py:857 #: order/models.py:1780 #: report/templates/report/inventree_build_order_report.html:172 -#: stock/models.py:2848 stock/models.py:2972 stock/serializers.py:717 +#: stock/models.py:2865 stock/models.py:2989 stock/serializers.py:717 #: stock/serializers.py:893 stock/serializers.py:1035 stock/serializers.py:1336 #: stock/serializers.py:1425 stock/serializers.py:1624 msgid "Notes" @@ -345,7 +345,7 @@ msgstr "Må være et gyldig tall" msgid "Currency" msgstr "Valuta" -#: InvenTree/serializers.py:298 part/serializers.py:1385 +#: InvenTree/serializers.py:298 part/serializers.py:1357 msgid "Select currency from available options" msgstr "Velg valuta ut fra tilgjengelige alternativer" @@ -553,14 +553,14 @@ msgstr "" #: build/api.py:100 build/api.py:466 build/api.py:845 build/models.py:270 #: build/serializers.py:1225 build/serializers.py:1356 -#: build/serializers.py:1427 company/models.py:1067 company/serializers.py:445 +#: build/serializers.py:1427 company/models.py:1067 company/serializers.py:491 #: order/api.py:298 order/api.py:302 order/api.py:929 order/api.py:1187 #: order/api.py:1190 order/models.py:1941 order/models.py:2108 #: order/models.py:2109 part/api.py:1233 part/api.py:1236 part/api.py:1302 #: part/api.py:1589 part/models.py:472 part/models.py:3296 part/models.py:3439 #: part/models.py:3497 part/models.py:3518 part/models.py:3540 #: part/models.py:3679 part/models.py:4046 part/models.py:4368 -#: part/models.py:4787 part/serializers.py:1928 +#: part/models.py:4787 part/serializers.py:1900 #: report/templates/report/inventree_bill_of_materials_report.html:110 #: report/templates/report/inventree_bill_of_materials_report.html:137 #: report/templates/report/inventree_build_order_report.html:109 @@ -582,7 +582,7 @@ msgstr "Del" #: build/api.py:120 build/api.py:123 build/serializers.py:1438 part/api.py:980 #: part/api.py:1316 part/api.py:1600 part/models.py:1080 part/models.py:3568 -#: part/models.py:4162 part/serializers.py:1752 stock/api.py:869 +#: part/models.py:4162 part/serializers.py:1724 stock/api.py:869 msgid "Category" msgstr "Kategori" @@ -663,7 +663,7 @@ msgid "Optional" msgstr "Valgfritt" #: build/api.py:455 build/serializers.py:1415 common/setting/system.py:456 -#: part/models.py:1202 part/serializers.py:1714 part/serializers.py:1725 +#: part/models.py:1202 part/serializers.py:1686 part/serializers.py:1697 #: stock/api.py:639 msgid "Assembly" msgstr "Sammenstilling" @@ -688,16 +688,16 @@ msgstr "Tildelt" msgid "Consumed" msgstr "" -#: build/api.py:499 company/models.py:912 company/serializers.py:440 +#: build/api.py:499 company/models.py:912 company/serializers.py:474 #: templates/email/build_order_required_stock.html:19 #: templates/email/low_stock_notification.html:17 #: templates/email/part_event_notification.html:18 msgid "Available" msgstr "Tilgjengelig" -#: build/api.py:523 build/serializers.py:1466 company/serializers.py:437 -#: order/serializers.py:1281 part/serializers.py:959 part/serializers.py:1306 -#: part/serializers.py:1761 +#: build/api.py:523 build/serializers.py:1466 company/serializers.py:471 +#: order/serializers.py:1281 part/serializers.py:931 part/serializers.py:1278 +#: part/serializers.py:1733 msgid "On Order" msgstr "I bestilling" @@ -963,7 +963,7 @@ msgstr "Produksjonsartikkelen samsvarer ikke med produksjonsordren" #: build/models.py:1136 build/models.py:1234 build/serializers.py:285 #: build/serializers.py:335 build/serializers.py:965 build/serializers.py:1739 #: order/models.py:717 order/serializers.py:658 order/serializers.py:844 -#: part/serializers.py:1708 stock/models.py:940 stock/models.py:1430 +#: part/serializers.py:1680 stock/models.py:940 stock/models.py:1430 #: stock/models.py:1878 stock/serializers.py:688 stock/serializers.py:1580 msgid "Quantity must be greater than zero" msgstr "Mengden må være større enn null" @@ -1385,20 +1385,20 @@ msgstr "Tillat Varianter" msgid "BOM Item" msgstr "BOM-artikkel" -#: build/serializers.py:1467 order/serializers.py:1282 part/serializers.py:1310 -#: part/serializers.py:1765 +#: build/serializers.py:1467 order/serializers.py:1282 part/serializers.py:1282 +#: part/serializers.py:1737 msgid "In Production" msgstr "I produksjon" -#: build/serializers.py:1469 part/serializers.py:950 part/serializers.py:1314 +#: build/serializers.py:1469 part/serializers.py:922 part/serializers.py:1286 msgid "Scheduled to Build" msgstr "" -#: build/serializers.py:1472 part/serializers.py:987 +#: build/serializers.py:1472 part/serializers.py:959 msgid "External Stock" msgstr "Ekstern lagerbeholdning" -#: build/serializers.py:1473 part/serializers.py:1300 part/serializers.py:1808 +#: build/serializers.py:1473 part/serializers.py:1272 part/serializers.py:1780 msgid "Available Stock" msgstr "Tilgjengelig lagerbeholdning" @@ -1588,7 +1588,7 @@ msgstr "Bruker" msgid "Price break quantity" msgstr "Antall for prisbrudd" -#: common/models.py:1348 company/serializers.py:564 order/models.py:1842 +#: common/models.py:1348 company/serializers.py:357 order/models.py:1842 #: order/models.py:3043 msgid "Price" msgstr "Pris" @@ -1760,7 +1760,7 @@ msgstr "Definisjon" msgid "Unit definition" msgstr "Enhetsdefinisjon" -#: common/models.py:1911 common/models.py:1974 stock/models.py:2967 +#: common/models.py:1911 common/models.py:1974 stock/models.py:2984 #: stock/serializers.py:247 msgid "Attachment" msgstr "Vedlegg" @@ -1839,7 +1839,7 @@ msgstr "" #: common/models.py:2090 common/models.py:2329 company/models.py:622 #: machine/serializers.py:27 -#: report/templates/report/inventree_test_report.html:104 stock/models.py:2959 +#: report/templates/report/inventree_test_report.html:104 stock/models.py:2976 msgid "Value" msgstr "Verdi" @@ -2048,7 +2048,7 @@ msgid "Response data from the barcode scan" msgstr "" #: common/models.py:2417 report/templates/report/inventree_test_report.html:103 -#: stock/models.py:2953 +#: stock/models.py:2970 msgid "Result" msgstr "Resultat" @@ -2141,7 +2141,7 @@ msgid "Linked thread for this message" msgstr "" #: common/models.py:2656 -msgid "Prioriy" +msgid "Priority" msgstr "" #: common/models.py:2698 @@ -2671,8 +2671,8 @@ msgstr "Deler er maler som standard" msgid "Parts can be assembled from other components by default" msgstr "Deler kan settes sammen fra andre komponenter som standard" -#: common/setting/system.py:462 part/models.py:1208 part/serializers.py:1734 -#: part/serializers.py:1741 +#: common/setting/system.py:462 part/models.py:1208 part/serializers.py:1706 +#: part/serializers.py:1713 msgid "Component" msgstr "Komponent" @@ -3772,7 +3772,7 @@ msgstr "Intern del er aktiv" msgid "Supplier is Active" msgstr "Leverandør er aktiv" -#: company/api.py:307 company/models.py:520 company/serializers.py:457 +#: company/api.py:307 company/models.py:520 company/serializers.py:503 #: part/serializers.py:566 msgid "Manufacturer" msgstr "Produsent" @@ -3964,7 +3964,7 @@ msgid "Link to address information (external)" msgstr "Lenke til adresseinformasjon (ekstern)" #: company/models.py:492 company/models.py:609 company/models.py:832 -#: company/serializers.py:471 stock/api.py:561 +#: company/serializers.py:517 stock/api.py:561 msgid "Manufacturer Part" msgstr "Produsentdeler" @@ -3981,7 +3981,7 @@ msgstr "Velg del" msgid "Select manufacturer" msgstr "Velg produsent" -#: company/models.py:527 company/serializers.py:479 order/serializers.py:734 +#: company/models.py:527 company/serializers.py:525 order/serializers.py:734 #: part/serializers.py:576 msgid "MPN" msgstr "MPN" @@ -4030,7 +4030,7 @@ msgstr "Pakkeenhet må være mer enn null" msgid "Linked manufacturer part must reference the same base part" msgstr "Den sammenkoblede produsentdelen må referere til samme basisdel" -#: company/models.py:810 company/serializers.py:449 company/serializers.py:467 +#: company/models.py:810 company/serializers.py:495 company/serializers.py:513 #: order/models.py:639 part/serializers.py:550 #: plugin/builtin/suppliers/digikey.py:26 plugin/builtin/suppliers/lcsc.py:27 #: plugin/builtin/suppliers/mouser.py:25 plugin/builtin/suppliers/tme.py:27 @@ -4134,10 +4134,14 @@ msgstr "Standardvaluta brukt for denne leverandøren" msgid "Company Name" msgstr "Bedriftsnavn" -#: company/serializers.py:433 part/serializers.py:955 stock/serializers.py:428 +#: company/serializers.py:467 part/serializers.py:927 stock/serializers.py:428 msgid "In Stock" msgstr "På lager" +#: company/serializers.py:484 +msgid "Price Breaks" +msgstr "" + #: data_exporter/mixins.py:325 data_exporter/mixins.py:403 msgid "Error occurred during data export" msgstr "" @@ -4290,7 +4294,7 @@ msgstr "" msgid "Errors" msgstr "" -#: importer/models.py:550 part/serializers.py:1268 +#: importer/models.py:550 part/serializers.py:1240 msgid "Valid" msgstr "Gyldig" @@ -5677,7 +5681,7 @@ msgstr "Del-nøkkelord for å øke synligheten i søkeresultater" msgid "Part category" msgstr "Delkategori" -#: part/models.py:1088 part/serializers.py:929 +#: part/models.py:1088 part/serializers.py:901 #: report/templates/report/inventree_stock_location_report.html:103 msgid "IPN" msgstr "" @@ -5718,7 +5722,7 @@ msgstr "Standard utløp" msgid "Expiry time (in days) for stock items of this part" msgstr "Utløpstid (i dager) for lagervarer av denne delen" -#: part/models.py:1186 part/serializers.py:1003 +#: part/models.py:1186 part/serializers.py:975 msgid "Minimum Stock" msgstr "Minimal lagerbeholdning" @@ -6418,203 +6422,203 @@ msgstr "Produsentdel som matcher dette MPN-et, finnes allerede" msgid "Supplier part matching this SKU already exists" msgstr "Leverandørdel som matcher denne SKU-en, finnes allerede" -#: part/serializers.py:914 +#: part/serializers.py:886 msgid "Category Name" msgstr "Kategorinavn" -#: part/serializers.py:943 +#: part/serializers.py:915 msgid "Building" msgstr "Produseres" -#: part/serializers.py:944 +#: part/serializers.py:916 msgid "Quantity of this part currently being in production" msgstr "" -#: part/serializers.py:951 +#: part/serializers.py:923 msgid "Outstanding quantity of this part scheduled to be built" msgstr "" -#: part/serializers.py:971 stock/serializers.py:1019 stock/serializers.py:1189 +#: part/serializers.py:943 stock/serializers.py:1019 stock/serializers.py:1189 #: users/ruleset.py:30 msgid "Stock Items" msgstr "Lagervarer" -#: part/serializers.py:975 +#: part/serializers.py:947 msgid "Revisions" msgstr "" -#: part/serializers.py:979 +#: part/serializers.py:951 msgid "Suppliers" msgstr "Leverandører" -#: part/serializers.py:983 part/serializers.py:1297 +#: part/serializers.py:955 part/serializers.py:1269 #: templates/email/low_stock_notification.html:16 #: templates/email/part_event_notification.html:17 msgid "Total Stock" msgstr "Total lagerbeholdning" -#: part/serializers.py:991 +#: part/serializers.py:963 msgid "Unallocated Stock" msgstr "" -#: part/serializers.py:999 +#: part/serializers.py:971 msgid "Variant Stock" msgstr "" -#: part/serializers.py:1054 +#: part/serializers.py:1026 msgid "Duplicate Part" msgstr "Dupliser del" -#: part/serializers.py:1055 +#: part/serializers.py:1027 msgid "Copy initial data from another Part" msgstr "Kopier innledende data fra en annen del" -#: part/serializers.py:1061 +#: part/serializers.py:1033 msgid "Initial Stock" msgstr "Innledende lagerbeholdning" -#: part/serializers.py:1062 +#: part/serializers.py:1034 msgid "Create Part with initial stock quantity" msgstr "Lag en del med innledende lagermengde" -#: part/serializers.py:1068 +#: part/serializers.py:1040 msgid "Supplier Information" msgstr "Leverandøropplysninger" -#: part/serializers.py:1069 +#: part/serializers.py:1041 msgid "Add initial supplier information for this part" msgstr "Legg til innledende leverandørinformasjon for denne delen" -#: part/serializers.py:1077 +#: part/serializers.py:1049 msgid "Copy Category Parameters" msgstr "Kopier kategoriparametre" -#: part/serializers.py:1078 +#: part/serializers.py:1050 msgid "Copy parameter templates from selected part category" msgstr "Kopier parametermaler fra valgt delkategori" -#: part/serializers.py:1083 +#: part/serializers.py:1055 msgid "Existing Image" msgstr "Eksisterende bilde" -#: part/serializers.py:1084 +#: part/serializers.py:1056 msgid "Filename of an existing part image" msgstr "Filnavn for et eksisterende del-bilde" -#: part/serializers.py:1101 +#: part/serializers.py:1073 msgid "Image file does not exist" msgstr "Bildefilen finnes ikke" -#: part/serializers.py:1269 +#: part/serializers.py:1241 msgid "Validate entire Bill of Materials" msgstr "Godkjenn hele Stykklisten" -#: part/serializers.py:1303 part/serializers.py:1769 +#: part/serializers.py:1275 part/serializers.py:1741 msgid "Can Build" msgstr "Kan Produsere" -#: part/serializers.py:1320 +#: part/serializers.py:1292 msgid "Required for Build Orders" msgstr "" -#: part/serializers.py:1325 +#: part/serializers.py:1297 msgid "Allocated to Build Orders" msgstr "" -#: part/serializers.py:1332 +#: part/serializers.py:1304 msgid "Required for Sales Orders" msgstr "" -#: part/serializers.py:1336 +#: part/serializers.py:1308 msgid "Allocated to Sales Orders" msgstr "" -#: part/serializers.py:1475 +#: part/serializers.py:1447 msgid "Minimum Price" msgstr "Minstepris" -#: part/serializers.py:1476 +#: part/serializers.py:1448 msgid "Override calculated value for minimum price" msgstr "Overstyr beregnet verdi for minimumspris" -#: part/serializers.py:1483 +#: part/serializers.py:1455 msgid "Minimum price currency" msgstr "Valuta for minstepris" -#: part/serializers.py:1490 +#: part/serializers.py:1462 msgid "Maximum Price" msgstr "Makspris" -#: part/serializers.py:1491 +#: part/serializers.py:1463 msgid "Override calculated value for maximum price" msgstr "Overstyr beregnet verdi for maksimal pris" -#: part/serializers.py:1498 +#: part/serializers.py:1470 msgid "Maximum price currency" msgstr "Valuta for maksimal pris" -#: part/serializers.py:1527 +#: part/serializers.py:1499 msgid "Update" msgstr "Oppdater" -#: part/serializers.py:1528 +#: part/serializers.py:1500 msgid "Update pricing for this part" msgstr "Oppdater priser for denne delen" -#: part/serializers.py:1551 +#: part/serializers.py:1523 #, python-brace-format msgid "Could not convert from provided currencies to {default_currency}" msgstr "Kan ikke konvertere fra gitte valutaer til {default_currency}" -#: part/serializers.py:1558 +#: part/serializers.py:1530 msgid "Minimum price must not be greater than maximum price" msgstr "Minsteprisen kan ikke være større enn maksimal pris" -#: part/serializers.py:1561 +#: part/serializers.py:1533 msgid "Maximum price must not be less than minimum price" msgstr "Maksimal pris kan ikke være mindre enn minstepris" -#: part/serializers.py:1715 +#: part/serializers.py:1687 msgid "Select the parent assembly" msgstr "" -#: part/serializers.py:1735 +#: part/serializers.py:1707 msgid "Select the component part" msgstr "" -#: part/serializers.py:1929 +#: part/serializers.py:1901 msgid "Select part to copy BOM from" msgstr "Velg del å kopiere BOM fra" -#: part/serializers.py:1937 +#: part/serializers.py:1909 msgid "Remove Existing Data" msgstr "Fjern eksisterende data" -#: part/serializers.py:1938 +#: part/serializers.py:1910 msgid "Remove existing BOM items before copying" msgstr "Fjern eksisterende BOM-artikler før kopiering" -#: part/serializers.py:1943 +#: part/serializers.py:1915 msgid "Include Inherited" msgstr "Inkluder arvede" -#: part/serializers.py:1944 +#: part/serializers.py:1916 msgid "Include BOM items which are inherited from templated parts" msgstr "Inkluder BOM-artikler som er arvet fra maldeler" -#: part/serializers.py:1949 +#: part/serializers.py:1921 msgid "Skip Invalid Rows" msgstr "Hopp over ugyldige rader" -#: part/serializers.py:1950 +#: part/serializers.py:1922 msgid "Enable this option to skip invalid rows" msgstr "Aktiver dette alternativet for å hoppe over ugyldige rader" -#: part/serializers.py:1955 +#: part/serializers.py:1927 msgid "Copy Substitute Parts" msgstr "Kopier erstatningsdeler" -#: part/serializers.py:1956 +#: part/serializers.py:1928 msgid "Copy substitute parts when duplicate BOM items" msgstr "Kopier erstatningsdeler når BOM-elementer dupliseres" @@ -8455,115 +8459,119 @@ msgstr "" msgid "Quantity does not match serial numbers" msgstr "Antallet stemmer ikke overens med serienumrene" -#: stock/models.py:2012 stock/models.py:2917 +#: stock/models.py:1912 +msgid "Cannot assign stock to structural location" +msgstr "" + +#: stock/models.py:2029 stock/models.py:2934 msgid "Test template does not exist" msgstr "" -#: stock/models.py:2030 +#: stock/models.py:2047 msgid "Stock item has been assigned to a sales order" msgstr "Lagervare har blitt tildelt en salgsordre" -#: stock/models.py:2034 +#: stock/models.py:2051 msgid "Stock item is installed in another item" msgstr "Lagervare er montert i en annen artikkel" -#: stock/models.py:2037 +#: stock/models.py:2054 msgid "Stock item contains other items" msgstr "Lagervare inneholder andre artikler" -#: stock/models.py:2040 +#: stock/models.py:2057 msgid "Stock item has been assigned to a customer" msgstr "Lagervare har blitt tildelt til en kunde" -#: stock/models.py:2043 stock/models.py:2226 +#: stock/models.py:2060 stock/models.py:2243 msgid "Stock item is currently in production" msgstr "Lagervare er for tiden i produksjon" -#: stock/models.py:2046 +#: stock/models.py:2063 msgid "Serialized stock cannot be merged" msgstr "Serialisert lagerbeholdning kan ikke slås sammen" -#: stock/models.py:2053 stock/serializers.py:1462 +#: stock/models.py:2070 stock/serializers.py:1462 msgid "Duplicate stock items" msgstr "Duplisert lagervare" -#: stock/models.py:2057 +#: stock/models.py:2074 msgid "Stock items must refer to the same part" msgstr "Lagervarer må referere til samme del" -#: stock/models.py:2065 +#: stock/models.py:2082 msgid "Stock items must refer to the same supplier part" msgstr "Lagervarer må referere til samme leverandørdel" -#: stock/models.py:2070 +#: stock/models.py:2087 msgid "Stock status codes must match" msgstr "Lagerstatuskoder må være like" -#: stock/models.py:2349 +#: stock/models.py:2366 msgid "StockItem cannot be moved as it is not in stock" msgstr "Lagervare kan ikke flyttes fordi den ikke er på lager" -#: stock/models.py:2818 +#: stock/models.py:2835 msgid "Stock Item Tracking" msgstr "" -#: stock/models.py:2849 +#: stock/models.py:2866 msgid "Entry notes" msgstr "Oppføringsnotater" -#: stock/models.py:2889 +#: stock/models.py:2906 msgid "Stock Item Test Result" msgstr "" -#: stock/models.py:2920 +#: stock/models.py:2937 msgid "Value must be provided for this test" msgstr "Verdi må angis for denne testen" -#: stock/models.py:2924 +#: stock/models.py:2941 msgid "Attachment must be uploaded for this test" msgstr "Vedlegg må lastes opp for denne testen" -#: stock/models.py:2929 +#: stock/models.py:2946 msgid "Invalid value for this test" msgstr "" -#: stock/models.py:2953 +#: stock/models.py:2970 msgid "Test result" msgstr "Testresultat" -#: stock/models.py:2960 +#: stock/models.py:2977 msgid "Test output value" msgstr "Testens verdi" -#: stock/models.py:2968 stock/serializers.py:248 +#: stock/models.py:2985 stock/serializers.py:248 msgid "Test result attachment" msgstr "Vedlegg til testresultat" -#: stock/models.py:2972 +#: stock/models.py:2989 msgid "Test notes" msgstr "Testnotater" -#: stock/models.py:2980 +#: stock/models.py:2997 msgid "Test station" msgstr "" -#: stock/models.py:2981 +#: stock/models.py:2998 msgid "The identifier of the test station where the test was performed" msgstr "" -#: stock/models.py:2987 +#: stock/models.py:3004 msgid "Started" msgstr "" -#: stock/models.py:2988 +#: stock/models.py:3005 msgid "The timestamp of the test start" msgstr "" -#: stock/models.py:2994 +#: stock/models.py:3011 msgid "Finished" msgstr "" -#: stock/models.py:2995 +#: stock/models.py:3012 msgid "The timestamp of the test finish" msgstr "" @@ -8902,83 +8910,87 @@ msgstr "Lagerbeholdning manuelt lagt til" msgid "Stock manually removed" msgstr "Lagerbeholdning manuelt fjernet" -#: stock/status_codes.py:57 +#: stock/status_codes.py:56 +msgid "Serialized stock items" +msgstr "" + +#: stock/status_codes.py:58 msgid "Returned to stock" msgstr "" -#: stock/status_codes.py:60 +#: stock/status_codes.py:61 msgid "Location changed" msgstr "Posisjon endret" -#: stock/status_codes.py:61 +#: stock/status_codes.py:62 msgid "Stock updated" msgstr "Lagerbeholdning oppdatert" -#: stock/status_codes.py:64 +#: stock/status_codes.py:65 msgid "Installed into assembly" msgstr "Montert i sammenstilling" -#: stock/status_codes.py:65 +#: stock/status_codes.py:66 msgid "Removed from assembly" msgstr "Fjernet fra sammenstilling" -#: stock/status_codes.py:67 +#: stock/status_codes.py:68 msgid "Installed component item" msgstr "Montert komponentartikkel" -#: stock/status_codes.py:68 +#: stock/status_codes.py:69 msgid "Removed component item" msgstr "Fjernet komponentartikkel" -#: stock/status_codes.py:71 +#: stock/status_codes.py:72 msgid "Split from parent item" msgstr "Skill ut fra overordnet artikkel" -#: stock/status_codes.py:72 +#: stock/status_codes.py:73 msgid "Split child item" msgstr "Skill ut fra underartikkel" -#: stock/status_codes.py:75 +#: stock/status_codes.py:76 msgid "Merged stock items" msgstr "Sammenslåtte lagervarer" -#: stock/status_codes.py:78 +#: stock/status_codes.py:79 msgid "Converted to variant" msgstr "Konvertert til variant" -#: stock/status_codes.py:81 +#: stock/status_codes.py:82 msgid "Build order output created" msgstr "Produksjonsartikkel opprettet" -#: stock/status_codes.py:82 +#: stock/status_codes.py:83 msgid "Build order output completed" msgstr "Produksjonsartikkel fullført" -#: stock/status_codes.py:83 +#: stock/status_codes.py:84 msgid "Build order output rejected" msgstr "Produksjonsartikkel avvist" -#: stock/status_codes.py:84 +#: stock/status_codes.py:85 msgid "Consumed by build order" msgstr "Brukt av produksjonsordre" -#: stock/status_codes.py:87 +#: stock/status_codes.py:88 msgid "Shipped against Sales Order" msgstr "Sendt mot salgsordre" -#: stock/status_codes.py:90 +#: stock/status_codes.py:91 msgid "Received against Purchase Order" msgstr "Mottatt mot innkjøpsordre" -#: stock/status_codes.py:93 +#: stock/status_codes.py:94 msgid "Returned against Return Order" msgstr "Returnert mot returordre" -#: stock/status_codes.py:96 +#: stock/status_codes.py:97 msgid "Sent to customer" msgstr "Sendt til kunde" -#: stock/status_codes.py:97 +#: stock/status_codes.py:98 msgid "Returned from customer" msgstr "Returnert av kunde" diff --git a/src/backend/InvenTree/locale/pl/LC_MESSAGES/django.po b/src/backend/InvenTree/locale/pl/LC_MESSAGES/django.po index c354840f3f..f5f0d3a249 100644 --- a/src/backend/InvenTree/locale/pl/LC_MESSAGES/django.po +++ b/src/backend/InvenTree/locale/pl/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: inventree\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-11-19 04:55+0000\n" -"PO-Revision-Date: 2025-11-19 04:59\n" +"POT-Creation-Date: 2025-11-24 06:50+0000\n" +"PO-Revision-Date: 2025-11-24 06:54\n" "Last-Translator: \n" "Language-Team: Polish\n" "Language: pl_PL\n" @@ -81,21 +81,21 @@ msgstr "Podany podstawowy adres e-mail jest nieprawidłowy." msgid "The provided email domain is not approved." msgstr "Podany e-mail domeny nie został zatwierdzony." -#: InvenTree/conversion.py:166 +#: InvenTree/conversion.py:240 #, python-brace-format msgid "Invalid unit provided ({unit})" msgstr "Nieprawidłowa jednostka ({unit})" -#: InvenTree/conversion.py:183 +#: InvenTree/conversion.py:257 msgid "No value provided" msgstr "Nie podano wartości" -#: InvenTree/conversion.py:210 +#: InvenTree/conversion.py:284 #, python-brace-format msgid "Could not convert {original} to {unit}" msgstr "Nie udało się przeliczyć {original} na {unit}" -#: InvenTree/conversion.py:212 InvenTree/conversion.py:226 +#: InvenTree/conversion.py:286 InvenTree/conversion.py:300 #: InvenTree/helpers.py:597 order/models.py:720 order/models.py:1015 msgid "Invalid quantity provided" msgstr "Podano nieprawidłową ilość" @@ -116,7 +116,7 @@ msgstr "Niepoprawna wartość dziesiętna" #: build/serializers.py:580 build/serializers.py:1788 company/models.py:857 #: order/models.py:1780 #: report/templates/report/inventree_build_order_report.html:172 -#: stock/models.py:2848 stock/models.py:2972 stock/serializers.py:717 +#: stock/models.py:2865 stock/models.py:2989 stock/serializers.py:717 #: stock/serializers.py:893 stock/serializers.py:1035 stock/serializers.py:1336 #: stock/serializers.py:1425 stock/serializers.py:1624 msgid "Notes" @@ -345,7 +345,7 @@ msgstr "Numer musi być prawidłowy" msgid "Currency" msgstr "Waluta" -#: InvenTree/serializers.py:298 part/serializers.py:1385 +#: InvenTree/serializers.py:298 part/serializers.py:1357 msgid "Select currency from available options" msgstr "Wybierz walutę z dostępnych opcji" @@ -553,14 +553,14 @@ msgstr "Obejmuje warianty" #: build/api.py:100 build/api.py:466 build/api.py:845 build/models.py:270 #: build/serializers.py:1225 build/serializers.py:1356 -#: build/serializers.py:1427 company/models.py:1067 company/serializers.py:445 +#: build/serializers.py:1427 company/models.py:1067 company/serializers.py:491 #: order/api.py:298 order/api.py:302 order/api.py:929 order/api.py:1187 #: order/api.py:1190 order/models.py:1941 order/models.py:2108 #: order/models.py:2109 part/api.py:1233 part/api.py:1236 part/api.py:1302 #: part/api.py:1589 part/models.py:472 part/models.py:3296 part/models.py:3439 #: part/models.py:3497 part/models.py:3518 part/models.py:3540 #: part/models.py:3679 part/models.py:4046 part/models.py:4368 -#: part/models.py:4787 part/serializers.py:1928 +#: part/models.py:4787 part/serializers.py:1900 #: report/templates/report/inventree_bill_of_materials_report.html:110 #: report/templates/report/inventree_bill_of_materials_report.html:137 #: report/templates/report/inventree_build_order_report.html:109 @@ -582,7 +582,7 @@ msgstr "Komponent" #: build/api.py:120 build/api.py:123 build/serializers.py:1438 part/api.py:980 #: part/api.py:1316 part/api.py:1600 part/models.py:1080 part/models.py:3568 -#: part/models.py:4162 part/serializers.py:1752 stock/api.py:869 +#: part/models.py:4162 part/serializers.py:1724 stock/api.py:869 msgid "Category" msgstr "Kategoria" @@ -663,7 +663,7 @@ msgid "Optional" msgstr "Opcjonalne" #: build/api.py:455 build/serializers.py:1415 common/setting/system.py:456 -#: part/models.py:1202 part/serializers.py:1714 part/serializers.py:1725 +#: part/models.py:1202 part/serializers.py:1686 part/serializers.py:1697 #: stock/api.py:639 msgid "Assembly" msgstr "Złożenie" @@ -688,16 +688,16 @@ msgstr "Przydzielono" msgid "Consumed" msgstr "" -#: build/api.py:499 company/models.py:912 company/serializers.py:440 +#: build/api.py:499 company/models.py:912 company/serializers.py:474 #: templates/email/build_order_required_stock.html:19 #: templates/email/low_stock_notification.html:17 #: templates/email/part_event_notification.html:18 msgid "Available" msgstr "Dostępne" -#: build/api.py:523 build/serializers.py:1466 company/serializers.py:437 -#: order/serializers.py:1281 part/serializers.py:959 part/serializers.py:1306 -#: part/serializers.py:1761 +#: build/api.py:523 build/serializers.py:1466 company/serializers.py:471 +#: order/serializers.py:1281 part/serializers.py:931 part/serializers.py:1278 +#: part/serializers.py:1733 msgid "On Order" msgstr "W Zamówieniu" @@ -963,7 +963,7 @@ msgstr "Skompilowane dane wyjściowe nie pasują do kolejności kompilacji" #: build/models.py:1136 build/models.py:1234 build/serializers.py:285 #: build/serializers.py:335 build/serializers.py:965 build/serializers.py:1739 #: order/models.py:717 order/serializers.py:658 order/serializers.py:844 -#: part/serializers.py:1708 stock/models.py:940 stock/models.py:1430 +#: part/serializers.py:1680 stock/models.py:940 stock/models.py:1430 #: stock/models.py:1878 stock/serializers.py:688 stock/serializers.py:1580 msgid "Quantity must be greater than zero" msgstr "Ilość musi być większa niż zero" @@ -1385,20 +1385,20 @@ msgstr "Zezwalaj na warianty" msgid "BOM Item" msgstr "Element BOM" -#: build/serializers.py:1467 order/serializers.py:1282 part/serializers.py:1310 -#: part/serializers.py:1765 +#: build/serializers.py:1467 order/serializers.py:1282 part/serializers.py:1282 +#: part/serializers.py:1737 msgid "In Production" msgstr "W produkcji" -#: build/serializers.py:1469 part/serializers.py:950 part/serializers.py:1314 +#: build/serializers.py:1469 part/serializers.py:922 part/serializers.py:1286 msgid "Scheduled to Build" msgstr "" -#: build/serializers.py:1472 part/serializers.py:987 +#: build/serializers.py:1472 part/serializers.py:959 msgid "External Stock" msgstr "Zew. zasoby magazynowe" -#: build/serializers.py:1473 part/serializers.py:1300 part/serializers.py:1808 +#: build/serializers.py:1473 part/serializers.py:1272 part/serializers.py:1780 msgid "Available Stock" msgstr "Dostępna ilość" @@ -1588,7 +1588,7 @@ msgstr "Użytkownik" msgid "Price break quantity" msgstr "" -#: common/models.py:1348 company/serializers.py:564 order/models.py:1842 +#: common/models.py:1348 company/serializers.py:357 order/models.py:1842 #: order/models.py:3043 msgid "Price" msgstr "Cena" @@ -1760,7 +1760,7 @@ msgstr "Definicja" msgid "Unit definition" msgstr "Definicja jednostki" -#: common/models.py:1911 common/models.py:1974 stock/models.py:2967 +#: common/models.py:1911 common/models.py:1974 stock/models.py:2984 #: stock/serializers.py:247 msgid "Attachment" msgstr "Załącznik" @@ -1839,7 +1839,7 @@ msgstr "" #: common/models.py:2090 common/models.py:2329 company/models.py:622 #: machine/serializers.py:27 -#: report/templates/report/inventree_test_report.html:104 stock/models.py:2959 +#: report/templates/report/inventree_test_report.html:104 stock/models.py:2976 msgid "Value" msgstr "Wartość" @@ -2048,7 +2048,7 @@ msgid "Response data from the barcode scan" msgstr "" #: common/models.py:2417 report/templates/report/inventree_test_report.html:103 -#: stock/models.py:2953 +#: stock/models.py:2970 msgid "Result" msgstr "Wynik" @@ -2141,8 +2141,8 @@ msgid "Linked thread for this message" msgstr "" #: common/models.py:2656 -msgid "Prioriy" -msgstr "Priorytet" +msgid "Priority" +msgstr "" #: common/models.py:2698 msgid "Email Thread" @@ -2671,8 +2671,8 @@ msgstr "" msgid "Parts can be assembled from other components by default" msgstr "" -#: common/setting/system.py:462 part/models.py:1208 part/serializers.py:1734 -#: part/serializers.py:1741 +#: common/setting/system.py:462 part/models.py:1208 part/serializers.py:1706 +#: part/serializers.py:1713 msgid "Component" msgstr "Komponent" @@ -3772,7 +3772,7 @@ msgstr "" msgid "Supplier is Active" msgstr "" -#: company/api.py:307 company/models.py:520 company/serializers.py:457 +#: company/api.py:307 company/models.py:520 company/serializers.py:503 #: part/serializers.py:566 msgid "Manufacturer" msgstr "Producent" @@ -3964,7 +3964,7 @@ msgid "Link to address information (external)" msgstr "" #: company/models.py:492 company/models.py:609 company/models.py:832 -#: company/serializers.py:471 stock/api.py:561 +#: company/serializers.py:517 stock/api.py:561 msgid "Manufacturer Part" msgstr "Komponent producenta" @@ -3981,7 +3981,7 @@ msgstr "Wybierz część" msgid "Select manufacturer" msgstr "Wybierz producenta" -#: company/models.py:527 company/serializers.py:479 order/serializers.py:734 +#: company/models.py:527 company/serializers.py:525 order/serializers.py:734 #: part/serializers.py:576 msgid "MPN" msgstr "" @@ -4030,7 +4030,7 @@ msgstr "" msgid "Linked manufacturer part must reference the same base part" msgstr "" -#: company/models.py:810 company/serializers.py:449 company/serializers.py:467 +#: company/models.py:810 company/serializers.py:495 company/serializers.py:513 #: order/models.py:639 part/serializers.py:550 #: plugin/builtin/suppliers/digikey.py:26 plugin/builtin/suppliers/lcsc.py:27 #: plugin/builtin/suppliers/mouser.py:25 plugin/builtin/suppliers/tme.py:27 @@ -4134,10 +4134,14 @@ msgstr "Domyślna waluta używana dla tego dostawcy" msgid "Company Name" msgstr "" -#: company/serializers.py:433 part/serializers.py:955 stock/serializers.py:428 +#: company/serializers.py:467 part/serializers.py:927 stock/serializers.py:428 msgid "In Stock" msgstr "Na stanie" +#: company/serializers.py:484 +msgid "Price Breaks" +msgstr "" + #: data_exporter/mixins.py:325 data_exporter/mixins.py:403 msgid "Error occurred during data export" msgstr "" @@ -4290,7 +4294,7 @@ msgstr "" msgid "Errors" msgstr "" -#: importer/models.py:550 part/serializers.py:1268 +#: importer/models.py:550 part/serializers.py:1240 msgid "Valid" msgstr "Ważny" @@ -5677,7 +5681,7 @@ msgstr "" msgid "Part category" msgstr "" -#: part/models.py:1088 part/serializers.py:929 +#: part/models.py:1088 part/serializers.py:901 #: report/templates/report/inventree_stock_location_report.html:103 msgid "IPN" msgstr "" @@ -5718,7 +5722,7 @@ msgstr "Domyślne wygasanie" msgid "Expiry time (in days) for stock items of this part" msgstr "" -#: part/models.py:1186 part/serializers.py:1003 +#: part/models.py:1186 part/serializers.py:975 msgid "Minimum Stock" msgstr "Minimalny stan magazynowy" @@ -6418,203 +6422,203 @@ msgstr "" msgid "Supplier part matching this SKU already exists" msgstr "" -#: part/serializers.py:914 +#: part/serializers.py:886 msgid "Category Name" msgstr "" -#: part/serializers.py:943 +#: part/serializers.py:915 msgid "Building" msgstr "" -#: part/serializers.py:944 +#: part/serializers.py:916 msgid "Quantity of this part currently being in production" msgstr "" -#: part/serializers.py:951 +#: part/serializers.py:923 msgid "Outstanding quantity of this part scheduled to be built" msgstr "" -#: part/serializers.py:971 stock/serializers.py:1019 stock/serializers.py:1189 +#: part/serializers.py:943 stock/serializers.py:1019 stock/serializers.py:1189 #: users/ruleset.py:30 msgid "Stock Items" msgstr "Towary" -#: part/serializers.py:975 +#: part/serializers.py:947 msgid "Revisions" msgstr "" -#: part/serializers.py:979 +#: part/serializers.py:951 msgid "Suppliers" msgstr "Dostawcy" -#: part/serializers.py:983 part/serializers.py:1297 +#: part/serializers.py:955 part/serializers.py:1269 #: templates/email/low_stock_notification.html:16 #: templates/email/part_event_notification.html:17 msgid "Total Stock" msgstr "" -#: part/serializers.py:991 +#: part/serializers.py:963 msgid "Unallocated Stock" msgstr "" -#: part/serializers.py:999 +#: part/serializers.py:971 msgid "Variant Stock" msgstr "" -#: part/serializers.py:1054 +#: part/serializers.py:1026 msgid "Duplicate Part" msgstr "Duplikuj część" -#: part/serializers.py:1055 +#: part/serializers.py:1027 msgid "Copy initial data from another Part" msgstr "" -#: part/serializers.py:1061 +#: part/serializers.py:1033 msgid "Initial Stock" msgstr "" -#: part/serializers.py:1062 +#: part/serializers.py:1034 msgid "Create Part with initial stock quantity" msgstr "" -#: part/serializers.py:1068 +#: part/serializers.py:1040 msgid "Supplier Information" msgstr "" -#: part/serializers.py:1069 +#: part/serializers.py:1041 msgid "Add initial supplier information for this part" msgstr "" -#: part/serializers.py:1077 +#: part/serializers.py:1049 msgid "Copy Category Parameters" msgstr "" -#: part/serializers.py:1078 +#: part/serializers.py:1050 msgid "Copy parameter templates from selected part category" msgstr "" -#: part/serializers.py:1083 +#: part/serializers.py:1055 msgid "Existing Image" msgstr "" -#: part/serializers.py:1084 +#: part/serializers.py:1056 msgid "Filename of an existing part image" msgstr "" -#: part/serializers.py:1101 +#: part/serializers.py:1073 msgid "Image file does not exist" msgstr "" -#: part/serializers.py:1269 +#: part/serializers.py:1241 msgid "Validate entire Bill of Materials" msgstr "" -#: part/serializers.py:1303 part/serializers.py:1769 +#: part/serializers.py:1275 part/serializers.py:1741 msgid "Can Build" msgstr "" -#: part/serializers.py:1320 +#: part/serializers.py:1292 msgid "Required for Build Orders" msgstr "" -#: part/serializers.py:1325 +#: part/serializers.py:1297 msgid "Allocated to Build Orders" msgstr "" -#: part/serializers.py:1332 +#: part/serializers.py:1304 msgid "Required for Sales Orders" msgstr "" -#: part/serializers.py:1336 +#: part/serializers.py:1308 msgid "Allocated to Sales Orders" msgstr "" -#: part/serializers.py:1475 +#: part/serializers.py:1447 msgid "Minimum Price" msgstr "" -#: part/serializers.py:1476 +#: part/serializers.py:1448 msgid "Override calculated value for minimum price" msgstr "" -#: part/serializers.py:1483 +#: part/serializers.py:1455 msgid "Minimum price currency" msgstr "" -#: part/serializers.py:1490 +#: part/serializers.py:1462 msgid "Maximum Price" msgstr "" -#: part/serializers.py:1491 +#: part/serializers.py:1463 msgid "Override calculated value for maximum price" msgstr "" -#: part/serializers.py:1498 +#: part/serializers.py:1470 msgid "Maximum price currency" msgstr "" -#: part/serializers.py:1527 +#: part/serializers.py:1499 msgid "Update" msgstr "" -#: part/serializers.py:1528 +#: part/serializers.py:1500 msgid "Update pricing for this part" msgstr "" -#: part/serializers.py:1551 +#: part/serializers.py:1523 #, python-brace-format msgid "Could not convert from provided currencies to {default_currency}" msgstr "" -#: part/serializers.py:1558 +#: part/serializers.py:1530 msgid "Minimum price must not be greater than maximum price" msgstr "" -#: part/serializers.py:1561 +#: part/serializers.py:1533 msgid "Maximum price must not be less than minimum price" msgstr "" -#: part/serializers.py:1715 +#: part/serializers.py:1687 msgid "Select the parent assembly" msgstr "" -#: part/serializers.py:1735 +#: part/serializers.py:1707 msgid "Select the component part" msgstr "" -#: part/serializers.py:1929 +#: part/serializers.py:1901 msgid "Select part to copy BOM from" msgstr "" -#: part/serializers.py:1937 +#: part/serializers.py:1909 msgid "Remove Existing Data" msgstr "Usuń istniejące dane" -#: part/serializers.py:1938 +#: part/serializers.py:1910 msgid "Remove existing BOM items before copying" msgstr "" -#: part/serializers.py:1943 +#: part/serializers.py:1915 msgid "Include Inherited" msgstr "" -#: part/serializers.py:1944 +#: part/serializers.py:1916 msgid "Include BOM items which are inherited from templated parts" msgstr "" -#: part/serializers.py:1949 +#: part/serializers.py:1921 msgid "Skip Invalid Rows" msgstr "Pomiń nieprawidłowe wiersze" -#: part/serializers.py:1950 +#: part/serializers.py:1922 msgid "Enable this option to skip invalid rows" msgstr "Włącz tę opcję, aby pominąć nieprawidłowe wiersze" -#: part/serializers.py:1955 +#: part/serializers.py:1927 msgid "Copy Substitute Parts" msgstr "" -#: part/serializers.py:1956 +#: part/serializers.py:1928 msgid "Copy substitute parts when duplicate BOM items" msgstr "" @@ -8455,115 +8459,119 @@ msgstr "" msgid "Quantity does not match serial numbers" msgstr "" -#: stock/models.py:2012 stock/models.py:2917 +#: stock/models.py:1912 +msgid "Cannot assign stock to structural location" +msgstr "" + +#: stock/models.py:2029 stock/models.py:2934 msgid "Test template does not exist" msgstr "" -#: stock/models.py:2030 +#: stock/models.py:2047 msgid "Stock item has been assigned to a sales order" msgstr "" -#: stock/models.py:2034 +#: stock/models.py:2051 msgid "Stock item is installed in another item" msgstr "" -#: stock/models.py:2037 +#: stock/models.py:2054 msgid "Stock item contains other items" msgstr "" -#: stock/models.py:2040 +#: stock/models.py:2057 msgid "Stock item has been assigned to a customer" msgstr "" -#: stock/models.py:2043 stock/models.py:2226 +#: stock/models.py:2060 stock/models.py:2243 msgid "Stock item is currently in production" msgstr "" -#: stock/models.py:2046 +#: stock/models.py:2063 msgid "Serialized stock cannot be merged" msgstr "" -#: stock/models.py:2053 stock/serializers.py:1462 +#: stock/models.py:2070 stock/serializers.py:1462 msgid "Duplicate stock items" msgstr "" -#: stock/models.py:2057 +#: stock/models.py:2074 msgid "Stock items must refer to the same part" msgstr "" -#: stock/models.py:2065 +#: stock/models.py:2082 msgid "Stock items must refer to the same supplier part" msgstr "" -#: stock/models.py:2070 +#: stock/models.py:2087 msgid "Stock status codes must match" msgstr "" -#: stock/models.py:2349 +#: stock/models.py:2366 msgid "StockItem cannot be moved as it is not in stock" msgstr "" -#: stock/models.py:2818 +#: stock/models.py:2835 msgid "Stock Item Tracking" msgstr "" -#: stock/models.py:2849 +#: stock/models.py:2866 msgid "Entry notes" msgstr "Notatki do wpisu" -#: stock/models.py:2889 +#: stock/models.py:2906 msgid "Stock Item Test Result" msgstr "" -#: stock/models.py:2920 +#: stock/models.py:2937 msgid "Value must be provided for this test" msgstr "Należy podać wartość dla tego testu" -#: stock/models.py:2924 +#: stock/models.py:2941 msgid "Attachment must be uploaded for this test" msgstr "" -#: stock/models.py:2929 +#: stock/models.py:2946 msgid "Invalid value for this test" msgstr "" -#: stock/models.py:2953 +#: stock/models.py:2970 msgid "Test result" msgstr "Wynik testu" -#: stock/models.py:2960 +#: stock/models.py:2977 msgid "Test output value" msgstr "" -#: stock/models.py:2968 stock/serializers.py:248 +#: stock/models.py:2985 stock/serializers.py:248 msgid "Test result attachment" msgstr "" -#: stock/models.py:2972 +#: stock/models.py:2989 msgid "Test notes" msgstr "" -#: stock/models.py:2980 +#: stock/models.py:2997 msgid "Test station" msgstr "" -#: stock/models.py:2981 +#: stock/models.py:2998 msgid "The identifier of the test station where the test was performed" msgstr "" -#: stock/models.py:2987 +#: stock/models.py:3004 msgid "Started" msgstr "" -#: stock/models.py:2988 +#: stock/models.py:3005 msgid "The timestamp of the test start" msgstr "" -#: stock/models.py:2994 +#: stock/models.py:3011 msgid "Finished" msgstr "" -#: stock/models.py:2995 +#: stock/models.py:3012 msgid "The timestamp of the test finish" msgstr "" @@ -8902,83 +8910,87 @@ msgstr "Zapas dodany ręcznie" msgid "Stock manually removed" msgstr "Zapas usunięty ręcznie" -#: stock/status_codes.py:57 +#: stock/status_codes.py:56 +msgid "Serialized stock items" +msgstr "" + +#: stock/status_codes.py:58 msgid "Returned to stock" msgstr "" -#: stock/status_codes.py:60 +#: stock/status_codes.py:61 msgid "Location changed" msgstr "Lokalizacja zmieniona" -#: stock/status_codes.py:61 +#: stock/status_codes.py:62 msgid "Stock updated" msgstr "Zaktualizowano stan magazynu" -#: stock/status_codes.py:64 +#: stock/status_codes.py:65 msgid "Installed into assembly" msgstr "Zainstalowano do montażu" -#: stock/status_codes.py:65 +#: stock/status_codes.py:66 msgid "Removed from assembly" msgstr "Usunięto z montażu" -#: stock/status_codes.py:67 +#: stock/status_codes.py:68 msgid "Installed component item" msgstr "Zainstalowano element komponentu" -#: stock/status_codes.py:68 +#: stock/status_codes.py:69 msgid "Removed component item" msgstr "Usunięto element komponentu" -#: stock/status_codes.py:71 +#: stock/status_codes.py:72 msgid "Split from parent item" msgstr "Podziel z pozycji nadrzędnej" -#: stock/status_codes.py:72 +#: stock/status_codes.py:73 msgid "Split child item" msgstr "Podziel element podrzędny" -#: stock/status_codes.py:75 +#: stock/status_codes.py:76 msgid "Merged stock items" msgstr "Scalone przedmioty magazynowe" -#: stock/status_codes.py:78 +#: stock/status_codes.py:79 msgid "Converted to variant" msgstr "Przekonwertowano na wariant" -#: stock/status_codes.py:81 +#: stock/status_codes.py:82 msgid "Build order output created" msgstr "Dane wyjściowe kolejności kompilacji utworzone" -#: stock/status_codes.py:82 +#: stock/status_codes.py:83 msgid "Build order output completed" msgstr "Dane wyjściowe kolejności kompilacji ukończone" -#: stock/status_codes.py:83 +#: stock/status_codes.py:84 msgid "Build order output rejected" msgstr "Odrzucono wynik zlecenia produkcji" -#: stock/status_codes.py:84 +#: stock/status_codes.py:85 msgid "Consumed by build order" msgstr "Zużyte przez kolejność kompilacji" -#: stock/status_codes.py:87 +#: stock/status_codes.py:88 msgid "Shipped against Sales Order" msgstr "Wysłane na podstawie zlecenia sprzedaży" -#: stock/status_codes.py:90 +#: stock/status_codes.py:91 msgid "Received against Purchase Order" msgstr "Otrzymane na podstawie zlecenia zakupu" -#: stock/status_codes.py:93 +#: stock/status_codes.py:94 msgid "Returned against Return Order" msgstr "Zwrócone na podstawie zlecenia zwrotu" -#: stock/status_codes.py:96 +#: stock/status_codes.py:97 msgid "Sent to customer" msgstr "Wyślij do klienta" -#: stock/status_codes.py:97 +#: stock/status_codes.py:98 msgid "Returned from customer" msgstr "Zwrócony od klienta" diff --git a/src/backend/InvenTree/locale/pt/LC_MESSAGES/django.po b/src/backend/InvenTree/locale/pt/LC_MESSAGES/django.po index 3f975302fc..7820900a07 100644 --- a/src/backend/InvenTree/locale/pt/LC_MESSAGES/django.po +++ b/src/backend/InvenTree/locale/pt/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: inventree\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-11-19 04:55+0000\n" -"PO-Revision-Date: 2025-11-19 04:59\n" +"POT-Creation-Date: 2025-11-24 06:50+0000\n" +"PO-Revision-Date: 2025-11-24 06:54\n" "Last-Translator: \n" "Language-Team: Portuguese\n" "Language: pt_PT\n" @@ -81,21 +81,21 @@ msgstr "O endereço primário de e-mail não é válido." msgid "The provided email domain is not approved." msgstr "O domínio de e-mail providenciado não foi aprovado." -#: InvenTree/conversion.py:166 +#: InvenTree/conversion.py:240 #, python-brace-format msgid "Invalid unit provided ({unit})" msgstr "Unidade inválida fornecida ({unit})" -#: InvenTree/conversion.py:183 +#: InvenTree/conversion.py:257 msgid "No value provided" msgstr "Nenhum valor fornecido" -#: InvenTree/conversion.py:210 +#: InvenTree/conversion.py:284 #, python-brace-format msgid "Could not convert {original} to {unit}" msgstr "Não foi possível converter {original} para {unit}" -#: InvenTree/conversion.py:212 InvenTree/conversion.py:226 +#: InvenTree/conversion.py:286 InvenTree/conversion.py:300 #: InvenTree/helpers.py:597 order/models.py:720 order/models.py:1015 msgid "Invalid quantity provided" msgstr "Quantidade fornecida inválida" @@ -116,7 +116,7 @@ msgstr "" #: build/serializers.py:580 build/serializers.py:1788 company/models.py:857 #: order/models.py:1780 #: report/templates/report/inventree_build_order_report.html:172 -#: stock/models.py:2848 stock/models.py:2972 stock/serializers.py:717 +#: stock/models.py:2865 stock/models.py:2989 stock/serializers.py:717 #: stock/serializers.py:893 stock/serializers.py:1035 stock/serializers.py:1336 #: stock/serializers.py:1425 stock/serializers.py:1624 msgid "Notes" @@ -345,7 +345,7 @@ msgstr "Preicsa ser um numero valido" msgid "Currency" msgstr "Moeda" -#: InvenTree/serializers.py:298 part/serializers.py:1385 +#: InvenTree/serializers.py:298 part/serializers.py:1357 msgid "Select currency from available options" msgstr "Selecione a Moeda nas opções disponíveis" @@ -553,14 +553,14 @@ msgstr "" #: build/api.py:100 build/api.py:466 build/api.py:845 build/models.py:270 #: build/serializers.py:1225 build/serializers.py:1356 -#: build/serializers.py:1427 company/models.py:1067 company/serializers.py:445 +#: build/serializers.py:1427 company/models.py:1067 company/serializers.py:491 #: order/api.py:298 order/api.py:302 order/api.py:929 order/api.py:1187 #: order/api.py:1190 order/models.py:1941 order/models.py:2108 #: order/models.py:2109 part/api.py:1233 part/api.py:1236 part/api.py:1302 #: part/api.py:1589 part/models.py:472 part/models.py:3296 part/models.py:3439 #: part/models.py:3497 part/models.py:3518 part/models.py:3540 #: part/models.py:3679 part/models.py:4046 part/models.py:4368 -#: part/models.py:4787 part/serializers.py:1928 +#: part/models.py:4787 part/serializers.py:1900 #: report/templates/report/inventree_bill_of_materials_report.html:110 #: report/templates/report/inventree_bill_of_materials_report.html:137 #: report/templates/report/inventree_build_order_report.html:109 @@ -582,7 +582,7 @@ msgstr "Peça" #: build/api.py:120 build/api.py:123 build/serializers.py:1438 part/api.py:980 #: part/api.py:1316 part/api.py:1600 part/models.py:1080 part/models.py:3568 -#: part/models.py:4162 part/serializers.py:1752 stock/api.py:869 +#: part/models.py:4162 part/serializers.py:1724 stock/api.py:869 msgid "Category" msgstr "Categoria" @@ -663,7 +663,7 @@ msgid "Optional" msgstr "Opcional" #: build/api.py:455 build/serializers.py:1415 common/setting/system.py:456 -#: part/models.py:1202 part/serializers.py:1714 part/serializers.py:1725 +#: part/models.py:1202 part/serializers.py:1686 part/serializers.py:1697 #: stock/api.py:639 msgid "Assembly" msgstr "Montagem" @@ -688,16 +688,16 @@ msgstr "Alocado" msgid "Consumed" msgstr "" -#: build/api.py:499 company/models.py:912 company/serializers.py:440 +#: build/api.py:499 company/models.py:912 company/serializers.py:474 #: templates/email/build_order_required_stock.html:19 #: templates/email/low_stock_notification.html:17 #: templates/email/part_event_notification.html:18 msgid "Available" msgstr "Disponível" -#: build/api.py:523 build/serializers.py:1466 company/serializers.py:437 -#: order/serializers.py:1281 part/serializers.py:959 part/serializers.py:1306 -#: part/serializers.py:1761 +#: build/api.py:523 build/serializers.py:1466 company/serializers.py:471 +#: order/serializers.py:1281 part/serializers.py:931 part/serializers.py:1278 +#: part/serializers.py:1733 msgid "On Order" msgstr "No pedido" @@ -963,7 +963,7 @@ msgstr "Saída da produção não corresponde ao Pedido de Produção" #: build/models.py:1136 build/models.py:1234 build/serializers.py:285 #: build/serializers.py:335 build/serializers.py:965 build/serializers.py:1739 #: order/models.py:717 order/serializers.py:658 order/serializers.py:844 -#: part/serializers.py:1708 stock/models.py:940 stock/models.py:1430 +#: part/serializers.py:1680 stock/models.py:940 stock/models.py:1430 #: stock/models.py:1878 stock/serializers.py:688 stock/serializers.py:1580 msgid "Quantity must be greater than zero" msgstr "Quantidade deve ser maior que zero" @@ -1385,20 +1385,20 @@ msgstr "Permitir variações" msgid "BOM Item" msgstr "Item LDM" -#: build/serializers.py:1467 order/serializers.py:1282 part/serializers.py:1310 -#: part/serializers.py:1765 +#: build/serializers.py:1467 order/serializers.py:1282 part/serializers.py:1282 +#: part/serializers.py:1737 msgid "In Production" msgstr "Em Produção" -#: build/serializers.py:1469 part/serializers.py:950 part/serializers.py:1314 +#: build/serializers.py:1469 part/serializers.py:922 part/serializers.py:1286 msgid "Scheduled to Build" msgstr "" -#: build/serializers.py:1472 part/serializers.py:987 +#: build/serializers.py:1472 part/serializers.py:959 msgid "External Stock" msgstr "" -#: build/serializers.py:1473 part/serializers.py:1300 part/serializers.py:1808 +#: build/serializers.py:1473 part/serializers.py:1272 part/serializers.py:1780 msgid "Available Stock" msgstr "Estoque Disponível" @@ -1588,7 +1588,7 @@ msgstr "Usuario" msgid "Price break quantity" msgstr "Quantidade de Parcelamentos" -#: common/models.py:1348 company/serializers.py:564 order/models.py:1842 +#: common/models.py:1348 company/serializers.py:357 order/models.py:1842 #: order/models.py:3043 msgid "Price" msgstr "Preço" @@ -1760,7 +1760,7 @@ msgstr "Definição" msgid "Unit definition" msgstr "Definição de unidade" -#: common/models.py:1911 common/models.py:1974 stock/models.py:2967 +#: common/models.py:1911 common/models.py:1974 stock/models.py:2984 #: stock/serializers.py:247 msgid "Attachment" msgstr "Anexo" @@ -1839,7 +1839,7 @@ msgstr "" #: common/models.py:2090 common/models.py:2329 company/models.py:622 #: machine/serializers.py:27 -#: report/templates/report/inventree_test_report.html:104 stock/models.py:2959 +#: report/templates/report/inventree_test_report.html:104 stock/models.py:2976 msgid "Value" msgstr "Valor" @@ -2048,7 +2048,7 @@ msgid "Response data from the barcode scan" msgstr "" #: common/models.py:2417 report/templates/report/inventree_test_report.html:103 -#: stock/models.py:2953 +#: stock/models.py:2970 msgid "Result" msgstr "Resultado" @@ -2141,7 +2141,7 @@ msgid "Linked thread for this message" msgstr "" #: common/models.py:2656 -msgid "Prioriy" +msgid "Priority" msgstr "" #: common/models.py:2698 @@ -2671,8 +2671,8 @@ msgstr "Peças são modelos por padrão" msgid "Parts can be assembled from other components by default" msgstr "Peças podem ser montadas a partir de outros componentes por padrão" -#: common/setting/system.py:462 part/models.py:1208 part/serializers.py:1734 -#: part/serializers.py:1741 +#: common/setting/system.py:462 part/models.py:1208 part/serializers.py:1706 +#: part/serializers.py:1713 msgid "Component" msgstr "Componente" @@ -3772,7 +3772,7 @@ msgstr "" msgid "Supplier is Active" msgstr "" -#: company/api.py:307 company/models.py:520 company/serializers.py:457 +#: company/api.py:307 company/models.py:520 company/serializers.py:503 #: part/serializers.py:566 msgid "Manufacturer" msgstr "Fabricante" @@ -3964,7 +3964,7 @@ msgid "Link to address information (external)" msgstr "Link para as informações do endereço (externo)" #: company/models.py:492 company/models.py:609 company/models.py:832 -#: company/serializers.py:471 stock/api.py:561 +#: company/serializers.py:517 stock/api.py:561 msgid "Manufacturer Part" msgstr "Peça do Fabricante" @@ -3981,7 +3981,7 @@ msgstr "Selecionar peça" msgid "Select manufacturer" msgstr "Selecionar fabricante" -#: company/models.py:527 company/serializers.py:479 order/serializers.py:734 +#: company/models.py:527 company/serializers.py:525 order/serializers.py:734 #: part/serializers.py:576 msgid "MPN" msgstr "NPF" @@ -4030,7 +4030,7 @@ msgstr "Unidades de pacote deve ser maior do que zero" msgid "Linked manufacturer part must reference the same base part" msgstr "Parte do fabricante vinculado deve fazer referência à mesma peça base" -#: company/models.py:810 company/serializers.py:449 company/serializers.py:467 +#: company/models.py:810 company/serializers.py:495 company/serializers.py:513 #: order/models.py:639 part/serializers.py:550 #: plugin/builtin/suppliers/digikey.py:26 plugin/builtin/suppliers/lcsc.py:27 #: plugin/builtin/suppliers/mouser.py:25 plugin/builtin/suppliers/tme.py:27 @@ -4134,10 +4134,14 @@ msgstr "Moeda padrão utilizada para este fornecedor" msgid "Company Name" msgstr "" -#: company/serializers.py:433 part/serializers.py:955 stock/serializers.py:428 +#: company/serializers.py:467 part/serializers.py:927 stock/serializers.py:428 msgid "In Stock" msgstr "Em Estoque" +#: company/serializers.py:484 +msgid "Price Breaks" +msgstr "" + #: data_exporter/mixins.py:325 data_exporter/mixins.py:403 msgid "Error occurred during data export" msgstr "" @@ -4290,7 +4294,7 @@ msgstr "" msgid "Errors" msgstr "" -#: importer/models.py:550 part/serializers.py:1268 +#: importer/models.py:550 part/serializers.py:1240 msgid "Valid" msgstr "Válido" @@ -5677,7 +5681,7 @@ msgstr "Palavras-chave para melhorar a visibilidade nos resultados da pesquisa" msgid "Part category" msgstr "Categoria da Peça" -#: part/models.py:1088 part/serializers.py:929 +#: part/models.py:1088 part/serializers.py:901 #: report/templates/report/inventree_stock_location_report.html:103 msgid "IPN" msgstr "" @@ -5718,7 +5722,7 @@ msgstr "Validade Padrão" msgid "Expiry time (in days) for stock items of this part" msgstr "Validade (em dias) para itens do estoque desta peça" -#: part/models.py:1186 part/serializers.py:1003 +#: part/models.py:1186 part/serializers.py:975 msgid "Minimum Stock" msgstr "Estoque Mínimo" @@ -6418,203 +6422,203 @@ msgstr "A peça do fabricante que corresponde a essa MPN já existe" msgid "Supplier part matching this SKU already exists" msgstr "A peça do fornecedor que corresponde a essa SKU já existe" -#: part/serializers.py:914 +#: part/serializers.py:886 msgid "Category Name" msgstr "Nome da Categoria" -#: part/serializers.py:943 +#: part/serializers.py:915 msgid "Building" msgstr "Produzindo" -#: part/serializers.py:944 +#: part/serializers.py:916 msgid "Quantity of this part currently being in production" msgstr "" -#: part/serializers.py:951 +#: part/serializers.py:923 msgid "Outstanding quantity of this part scheduled to be built" msgstr "" -#: part/serializers.py:971 stock/serializers.py:1019 stock/serializers.py:1189 +#: part/serializers.py:943 stock/serializers.py:1019 stock/serializers.py:1189 #: users/ruleset.py:30 msgid "Stock Items" msgstr "Itens de Estoque" -#: part/serializers.py:975 +#: part/serializers.py:947 msgid "Revisions" msgstr "" -#: part/serializers.py:979 +#: part/serializers.py:951 msgid "Suppliers" msgstr "Fornecedores" -#: part/serializers.py:983 part/serializers.py:1297 +#: part/serializers.py:955 part/serializers.py:1269 #: templates/email/low_stock_notification.html:16 #: templates/email/part_event_notification.html:17 msgid "Total Stock" msgstr "Estoque Total" -#: part/serializers.py:991 +#: part/serializers.py:963 msgid "Unallocated Stock" msgstr "" -#: part/serializers.py:999 +#: part/serializers.py:971 msgid "Variant Stock" msgstr "" -#: part/serializers.py:1054 +#: part/serializers.py:1026 msgid "Duplicate Part" msgstr "Peça duplicada" -#: part/serializers.py:1055 +#: part/serializers.py:1027 msgid "Copy initial data from another Part" msgstr "Copiar dados iniciais de outra peça" -#: part/serializers.py:1061 +#: part/serializers.py:1033 msgid "Initial Stock" msgstr "Estoque inicial" -#: part/serializers.py:1062 +#: part/serializers.py:1034 msgid "Create Part with initial stock quantity" msgstr "Criar peça com a quantidade inicial de estoque" -#: part/serializers.py:1068 +#: part/serializers.py:1040 msgid "Supplier Information" msgstr "Informações do Fornecedor" -#: part/serializers.py:1069 +#: part/serializers.py:1041 msgid "Add initial supplier information for this part" msgstr "Adicionar informação inicial de fornecedor para esta peça" -#: part/serializers.py:1077 +#: part/serializers.py:1049 msgid "Copy Category Parameters" msgstr "Copiar Parâmetros da Categoria" -#: part/serializers.py:1078 +#: part/serializers.py:1050 msgid "Copy parameter templates from selected part category" msgstr "Copiar modelos de parâmetros a partir de categoria de peça selecionada" -#: part/serializers.py:1083 +#: part/serializers.py:1055 msgid "Existing Image" msgstr "Imagem Existente" -#: part/serializers.py:1084 +#: part/serializers.py:1056 msgid "Filename of an existing part image" msgstr "Nome de arquivo de uma imagem de peça existente" -#: part/serializers.py:1101 +#: part/serializers.py:1073 msgid "Image file does not exist" msgstr "A imagem não existe" -#: part/serializers.py:1269 +#: part/serializers.py:1241 msgid "Validate entire Bill of Materials" msgstr "Validar a Lista de Materiais completa" -#: part/serializers.py:1303 part/serializers.py:1769 +#: part/serializers.py:1275 part/serializers.py:1741 msgid "Can Build" msgstr "Pode Produzir" -#: part/serializers.py:1320 +#: part/serializers.py:1292 msgid "Required for Build Orders" msgstr "" -#: part/serializers.py:1325 +#: part/serializers.py:1297 msgid "Allocated to Build Orders" msgstr "" -#: part/serializers.py:1332 +#: part/serializers.py:1304 msgid "Required for Sales Orders" msgstr "" -#: part/serializers.py:1336 +#: part/serializers.py:1308 msgid "Allocated to Sales Orders" msgstr "" -#: part/serializers.py:1475 +#: part/serializers.py:1447 msgid "Minimum Price" msgstr "Preço Mínimo" -#: part/serializers.py:1476 +#: part/serializers.py:1448 msgid "Override calculated value for minimum price" msgstr "Sobrepor valor calculado para preço mínimo" -#: part/serializers.py:1483 +#: part/serializers.py:1455 msgid "Minimum price currency" msgstr "Moeda do preço mínimo" -#: part/serializers.py:1490 +#: part/serializers.py:1462 msgid "Maximum Price" msgstr "Preço Máximo" -#: part/serializers.py:1491 +#: part/serializers.py:1463 msgid "Override calculated value for maximum price" msgstr "Sobrepor valor calculado para preço máximo" -#: part/serializers.py:1498 +#: part/serializers.py:1470 msgid "Maximum price currency" msgstr "Moeda do preço máximo" -#: part/serializers.py:1527 +#: part/serializers.py:1499 msgid "Update" msgstr "Atualizar" -#: part/serializers.py:1528 +#: part/serializers.py:1500 msgid "Update pricing for this part" msgstr "Atualizar preços desta peça" -#: part/serializers.py:1551 +#: part/serializers.py:1523 #, python-brace-format msgid "Could not convert from provided currencies to {default_currency}" msgstr "Não foi possível converter das moedas fornecidas para {default_currency}" -#: part/serializers.py:1558 +#: part/serializers.py:1530 msgid "Minimum price must not be greater than maximum price" msgstr "Preço mínimo não pode ser maior que o preço máximo" -#: part/serializers.py:1561 +#: part/serializers.py:1533 msgid "Maximum price must not be less than minimum price" msgstr "Preço máximo não pode ser menor que o preço mínimo" -#: part/serializers.py:1715 +#: part/serializers.py:1687 msgid "Select the parent assembly" msgstr "" -#: part/serializers.py:1735 +#: part/serializers.py:1707 msgid "Select the component part" msgstr "" -#: part/serializers.py:1929 +#: part/serializers.py:1901 msgid "Select part to copy BOM from" msgstr "Selecionar peça para copiar a LDM" -#: part/serializers.py:1937 +#: part/serializers.py:1909 msgid "Remove Existing Data" msgstr "Remover Dado Existente" -#: part/serializers.py:1938 +#: part/serializers.py:1910 msgid "Remove existing BOM items before copying" msgstr "Remova itens LDM existentes antes de copiar" -#: part/serializers.py:1943 +#: part/serializers.py:1915 msgid "Include Inherited" msgstr "Incluir Herdados" -#: part/serializers.py:1944 +#: part/serializers.py:1916 msgid "Include BOM items which are inherited from templated parts" msgstr "Incluir itens LDM que são herdados de peças modelo" -#: part/serializers.py:1949 +#: part/serializers.py:1921 msgid "Skip Invalid Rows" msgstr "Pular Linhas inválidas" -#: part/serializers.py:1950 +#: part/serializers.py:1922 msgid "Enable this option to skip invalid rows" msgstr "Habilitar esta opção para pular linhas inválidas" -#: part/serializers.py:1955 +#: part/serializers.py:1927 msgid "Copy Substitute Parts" msgstr "Copiar Peças Substitutas" -#: part/serializers.py:1956 +#: part/serializers.py:1928 msgid "Copy substitute parts when duplicate BOM items" msgstr "Copiar peças de substitutas quando duplicar itens de LDM" @@ -8455,115 +8459,119 @@ msgstr "" msgid "Quantity does not match serial numbers" msgstr "A quantidade não corresponde aos números de série" -#: stock/models.py:2012 stock/models.py:2917 +#: stock/models.py:1912 +msgid "Cannot assign stock to structural location" +msgstr "" + +#: stock/models.py:2029 stock/models.py:2934 msgid "Test template does not exist" msgstr "" -#: stock/models.py:2030 +#: stock/models.py:2047 msgid "Stock item has been assigned to a sales order" msgstr "Item em estoque foi reservado para um pedido" -#: stock/models.py:2034 +#: stock/models.py:2051 msgid "Stock item is installed in another item" msgstr "Item em estoque está instalado em outro item" -#: stock/models.py:2037 +#: stock/models.py:2054 msgid "Stock item contains other items" msgstr "item em estoque contem outro(s) items" -#: stock/models.py:2040 +#: stock/models.py:2057 msgid "Stock item has been assigned to a customer" msgstr "Item em estoque foi reservado para outro cliente" -#: stock/models.py:2043 stock/models.py:2226 +#: stock/models.py:2060 stock/models.py:2243 msgid "Stock item is currently in production" msgstr "Item no estoque está em produção no momento" -#: stock/models.py:2046 +#: stock/models.py:2063 msgid "Serialized stock cannot be merged" msgstr "Itens de série não podem ser mesclados" -#: stock/models.py:2053 stock/serializers.py:1462 +#: stock/models.py:2070 stock/serializers.py:1462 msgid "Duplicate stock items" msgstr "Item de estoque duplicado" -#: stock/models.py:2057 +#: stock/models.py:2074 msgid "Stock items must refer to the same part" msgstr "Itens de estoque devem se referir à mesma peça" -#: stock/models.py:2065 +#: stock/models.py:2082 msgid "Stock items must refer to the same supplier part" msgstr "Itens de estoque devem se referir à mesma peça do fornecedor" -#: stock/models.py:2070 +#: stock/models.py:2087 msgid "Stock status codes must match" msgstr "Códigos de estado do estoque devem corresponder" -#: stock/models.py:2349 +#: stock/models.py:2366 msgid "StockItem cannot be moved as it is not in stock" msgstr "Item do estoque não pode ser realocado se não houver estoque da mesma" -#: stock/models.py:2818 +#: stock/models.py:2835 msgid "Stock Item Tracking" msgstr "" -#: stock/models.py:2849 +#: stock/models.py:2866 msgid "Entry notes" msgstr "Observações de entrada" -#: stock/models.py:2889 +#: stock/models.py:2906 msgid "Stock Item Test Result" msgstr "" -#: stock/models.py:2920 +#: stock/models.py:2937 msgid "Value must be provided for this test" msgstr "Deve-se fornecer o valor desse teste" -#: stock/models.py:2924 +#: stock/models.py:2941 msgid "Attachment must be uploaded for this test" msgstr "O anexo deve ser enviado para este teste" -#: stock/models.py:2929 +#: stock/models.py:2946 msgid "Invalid value for this test" msgstr "" -#: stock/models.py:2953 +#: stock/models.py:2970 msgid "Test result" msgstr "Resultado do teste" -#: stock/models.py:2960 +#: stock/models.py:2977 msgid "Test output value" msgstr "Valor da saída do teste" -#: stock/models.py:2968 stock/serializers.py:248 +#: stock/models.py:2985 stock/serializers.py:248 msgid "Test result attachment" msgstr "Anexo do resultado do teste" -#: stock/models.py:2972 +#: stock/models.py:2989 msgid "Test notes" msgstr "Notas do teste" -#: stock/models.py:2980 +#: stock/models.py:2997 msgid "Test station" msgstr "" -#: stock/models.py:2981 +#: stock/models.py:2998 msgid "The identifier of the test station where the test was performed" msgstr "" -#: stock/models.py:2987 +#: stock/models.py:3004 msgid "Started" msgstr "" -#: stock/models.py:2988 +#: stock/models.py:3005 msgid "The timestamp of the test start" msgstr "" -#: stock/models.py:2994 +#: stock/models.py:3011 msgid "Finished" msgstr "" -#: stock/models.py:2995 +#: stock/models.py:3012 msgid "The timestamp of the test finish" msgstr "" @@ -8902,83 +8910,87 @@ msgstr "Estoque adicionado manualmente" msgid "Stock manually removed" msgstr "Estoque removido manualmente" -#: stock/status_codes.py:57 +#: stock/status_codes.py:56 +msgid "Serialized stock items" +msgstr "" + +#: stock/status_codes.py:58 msgid "Returned to stock" msgstr "" -#: stock/status_codes.py:60 +#: stock/status_codes.py:61 msgid "Location changed" msgstr "Local alterado" -#: stock/status_codes.py:61 +#: stock/status_codes.py:62 msgid "Stock updated" msgstr "Estoque atualizado" -#: stock/status_codes.py:64 +#: stock/status_codes.py:65 msgid "Installed into assembly" msgstr "Instalado na montagem" -#: stock/status_codes.py:65 +#: stock/status_codes.py:66 msgid "Removed from assembly" msgstr "Removido da montagem" -#: stock/status_codes.py:67 +#: stock/status_codes.py:68 msgid "Installed component item" msgstr "Instalado componente do Item" -#: stock/status_codes.py:68 +#: stock/status_codes.py:69 msgid "Removed component item" msgstr "Removido componente do Item" -#: stock/status_codes.py:71 +#: stock/status_codes.py:72 msgid "Split from parent item" msgstr "Separado do Item Paternal" -#: stock/status_codes.py:72 +#: stock/status_codes.py:73 msgid "Split child item" msgstr "Separar o Item filho" -#: stock/status_codes.py:75 +#: stock/status_codes.py:76 msgid "Merged stock items" msgstr "Itens de estoque mesclados" -#: stock/status_codes.py:78 +#: stock/status_codes.py:79 msgid "Converted to variant" msgstr "Convertido para variável" -#: stock/status_codes.py:81 +#: stock/status_codes.py:82 msgid "Build order output created" msgstr "Criação dos pedidos de produção criado" -#: stock/status_codes.py:82 +#: stock/status_codes.py:83 msgid "Build order output completed" msgstr "Criação do pedido de produção completado" -#: stock/status_codes.py:83 +#: stock/status_codes.py:84 msgid "Build order output rejected" msgstr "Saída do pedido de produção rejeitada" -#: stock/status_codes.py:84 +#: stock/status_codes.py:85 msgid "Consumed by build order" msgstr "Usado no pedido de produção" -#: stock/status_codes.py:87 +#: stock/status_codes.py:88 msgid "Shipped against Sales Order" msgstr "Enviado contra o Pedido de Venda" -#: stock/status_codes.py:90 +#: stock/status_codes.py:91 msgid "Received against Purchase Order" msgstr "Recebido referente ao Pedido de Compra" -#: stock/status_codes.py:93 +#: stock/status_codes.py:94 msgid "Returned against Return Order" msgstr "Devolvido contra Pedido de Retorno" -#: stock/status_codes.py:96 +#: stock/status_codes.py:97 msgid "Sent to customer" msgstr "Enviado ao cliente" -#: stock/status_codes.py:97 +#: stock/status_codes.py:98 msgid "Returned from customer" msgstr "Devolvido pelo cliente" diff --git a/src/backend/InvenTree/locale/pt_BR/LC_MESSAGES/django.po b/src/backend/InvenTree/locale/pt_BR/LC_MESSAGES/django.po index 76177bf7c5..07cf785472 100644 --- a/src/backend/InvenTree/locale/pt_BR/LC_MESSAGES/django.po +++ b/src/backend/InvenTree/locale/pt_BR/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: inventree\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-11-19 04:55+0000\n" -"PO-Revision-Date: 2025-11-19 04:59\n" +"POT-Creation-Date: 2025-11-24 06:50+0000\n" +"PO-Revision-Date: 2025-11-24 06:54\n" "Last-Translator: \n" "Language-Team: Portuguese, Brazilian\n" "Language: pt_BR\n" @@ -81,21 +81,21 @@ msgstr "O endereço de e-mail fornecido não é válido." msgid "The provided email domain is not approved." msgstr "O domínio de e-mail fornecido não foi aprovado." -#: InvenTree/conversion.py:166 +#: InvenTree/conversion.py:240 #, python-brace-format msgid "Invalid unit provided ({unit})" msgstr "Unidade fornecida inválida ({unit})" -#: InvenTree/conversion.py:183 +#: InvenTree/conversion.py:257 msgid "No value provided" msgstr "Nenhum valor fornecido" -#: InvenTree/conversion.py:210 +#: InvenTree/conversion.py:284 #, python-brace-format msgid "Could not convert {original} to {unit}" msgstr "Não foi possível converter {original} para {unit}" -#: InvenTree/conversion.py:212 InvenTree/conversion.py:226 +#: InvenTree/conversion.py:286 InvenTree/conversion.py:300 #: InvenTree/helpers.py:597 order/models.py:720 order/models.py:1015 msgid "Invalid quantity provided" msgstr "Quantidade inválida" @@ -116,7 +116,7 @@ msgstr "Valor decimal inválido" #: build/serializers.py:580 build/serializers.py:1788 company/models.py:857 #: order/models.py:1780 #: report/templates/report/inventree_build_order_report.html:172 -#: stock/models.py:2848 stock/models.py:2972 stock/serializers.py:717 +#: stock/models.py:2865 stock/models.py:2989 stock/serializers.py:717 #: stock/serializers.py:893 stock/serializers.py:1035 stock/serializers.py:1336 #: stock/serializers.py:1425 stock/serializers.py:1624 msgid "Notes" @@ -345,7 +345,7 @@ msgstr "Deve ser um número válido" msgid "Currency" msgstr "Moeda" -#: InvenTree/serializers.py:298 part/serializers.py:1385 +#: InvenTree/serializers.py:298 part/serializers.py:1357 msgid "Select currency from available options" msgstr "Selecione a moeda entre as opções disponíveis" @@ -553,14 +553,14 @@ msgstr "Incluir Variáveis" #: build/api.py:100 build/api.py:466 build/api.py:845 build/models.py:270 #: build/serializers.py:1225 build/serializers.py:1356 -#: build/serializers.py:1427 company/models.py:1067 company/serializers.py:445 +#: build/serializers.py:1427 company/models.py:1067 company/serializers.py:491 #: order/api.py:298 order/api.py:302 order/api.py:929 order/api.py:1187 #: order/api.py:1190 order/models.py:1941 order/models.py:2108 #: order/models.py:2109 part/api.py:1233 part/api.py:1236 part/api.py:1302 #: part/api.py:1589 part/models.py:472 part/models.py:3296 part/models.py:3439 #: part/models.py:3497 part/models.py:3518 part/models.py:3540 #: part/models.py:3679 part/models.py:4046 part/models.py:4368 -#: part/models.py:4787 part/serializers.py:1928 +#: part/models.py:4787 part/serializers.py:1900 #: report/templates/report/inventree_bill_of_materials_report.html:110 #: report/templates/report/inventree_bill_of_materials_report.html:137 #: report/templates/report/inventree_build_order_report.html:109 @@ -582,7 +582,7 @@ msgstr "Parte" #: build/api.py:120 build/api.py:123 build/serializers.py:1438 part/api.py:980 #: part/api.py:1316 part/api.py:1600 part/models.py:1080 part/models.py:3568 -#: part/models.py:4162 part/serializers.py:1752 stock/api.py:869 +#: part/models.py:4162 part/serializers.py:1724 stock/api.py:869 msgid "Category" msgstr "Categoria" @@ -663,7 +663,7 @@ msgid "Optional" msgstr "Opcional" #: build/api.py:455 build/serializers.py:1415 common/setting/system.py:456 -#: part/models.py:1202 part/serializers.py:1714 part/serializers.py:1725 +#: part/models.py:1202 part/serializers.py:1686 part/serializers.py:1697 #: stock/api.py:639 msgid "Assembly" msgstr "Montagem" @@ -688,16 +688,16 @@ msgstr "Alocado" msgid "Consumed" msgstr "" -#: build/api.py:499 company/models.py:912 company/serializers.py:440 +#: build/api.py:499 company/models.py:912 company/serializers.py:474 #: templates/email/build_order_required_stock.html:19 #: templates/email/low_stock_notification.html:17 #: templates/email/part_event_notification.html:18 msgid "Available" msgstr "Disponível" -#: build/api.py:523 build/serializers.py:1466 company/serializers.py:437 -#: order/serializers.py:1281 part/serializers.py:959 part/serializers.py:1306 -#: part/serializers.py:1761 +#: build/api.py:523 build/serializers.py:1466 company/serializers.py:471 +#: order/serializers.py:1281 part/serializers.py:931 part/serializers.py:1278 +#: part/serializers.py:1733 msgid "On Order" msgstr "Em pedido" @@ -963,7 +963,7 @@ msgstr "Saída da produção não corresponde à Ordem de Produção" #: build/models.py:1136 build/models.py:1234 build/serializers.py:285 #: build/serializers.py:335 build/serializers.py:965 build/serializers.py:1739 #: order/models.py:717 order/serializers.py:658 order/serializers.py:844 -#: part/serializers.py:1708 stock/models.py:940 stock/models.py:1430 +#: part/serializers.py:1680 stock/models.py:940 stock/models.py:1430 #: stock/models.py:1878 stock/serializers.py:688 stock/serializers.py:1580 msgid "Quantity must be greater than zero" msgstr "Quantidade deve ser maior que zero" @@ -1385,20 +1385,20 @@ msgstr "Permitir variantes" msgid "BOM Item" msgstr "Item BOM" -#: build/serializers.py:1467 order/serializers.py:1282 part/serializers.py:1310 -#: part/serializers.py:1765 +#: build/serializers.py:1467 order/serializers.py:1282 part/serializers.py:1282 +#: part/serializers.py:1737 msgid "In Production" msgstr "Em Produção" -#: build/serializers.py:1469 part/serializers.py:950 part/serializers.py:1314 +#: build/serializers.py:1469 part/serializers.py:922 part/serializers.py:1286 msgid "Scheduled to Build" msgstr "Agendado para produção" -#: build/serializers.py:1472 part/serializers.py:987 +#: build/serializers.py:1472 part/serializers.py:959 msgid "External Stock" msgstr "Estoque Externo" -#: build/serializers.py:1473 part/serializers.py:1300 part/serializers.py:1808 +#: build/serializers.py:1473 part/serializers.py:1272 part/serializers.py:1780 msgid "Available Stock" msgstr "Estoque Disponível" @@ -1588,7 +1588,7 @@ msgstr "Usuário" msgid "Price break quantity" msgstr "Quantidade de Parcelamentos" -#: common/models.py:1348 company/serializers.py:564 order/models.py:1842 +#: common/models.py:1348 company/serializers.py:357 order/models.py:1842 #: order/models.py:3043 msgid "Price" msgstr "Preço" @@ -1760,7 +1760,7 @@ msgstr "Definição" msgid "Unit definition" msgstr "Definição de unidade" -#: common/models.py:1911 common/models.py:1974 stock/models.py:2967 +#: common/models.py:1911 common/models.py:1974 stock/models.py:2984 #: stock/serializers.py:247 msgid "Attachment" msgstr "Anexo" @@ -1839,7 +1839,7 @@ msgstr "Chave lógica de estado que é igual a este estado personalizado na lóg #: common/models.py:2090 common/models.py:2329 company/models.py:622 #: machine/serializers.py:27 -#: report/templates/report/inventree_test_report.html:104 stock/models.py:2959 +#: report/templates/report/inventree_test_report.html:104 stock/models.py:2976 msgid "Value" msgstr "Valor" @@ -2048,7 +2048,7 @@ msgid "Response data from the barcode scan" msgstr "Dados de resposta da verificação de código de barras" #: common/models.py:2417 report/templates/report/inventree_test_report.html:103 -#: stock/models.py:2953 +#: stock/models.py:2970 msgid "Result" msgstr "Resultado" @@ -2141,8 +2141,8 @@ msgid "Linked thread for this message" msgstr "Tópico vinculado para esta mensagem" #: common/models.py:2656 -msgid "Prioriy" -msgstr "Prioridade" +msgid "Priority" +msgstr "" #: common/models.py:2698 msgid "Email Thread" @@ -2671,8 +2671,8 @@ msgstr "Peças são modelos por padrão" msgid "Parts can be assembled from other components by default" msgstr "Peças podem ser montadas a partir de outros componentes por padrão" -#: common/setting/system.py:462 part/models.py:1208 part/serializers.py:1734 -#: part/serializers.py:1741 +#: common/setting/system.py:462 part/models.py:1208 part/serializers.py:1706 +#: part/serializers.py:1713 msgid "Component" msgstr "Componente" @@ -3772,7 +3772,7 @@ msgstr "A peça interna está ativa" msgid "Supplier is Active" msgstr "O fornecedor está Ativo" -#: company/api.py:307 company/models.py:520 company/serializers.py:457 +#: company/api.py:307 company/models.py:520 company/serializers.py:503 #: part/serializers.py:566 msgid "Manufacturer" msgstr "Fabricante" @@ -3964,7 +3964,7 @@ msgid "Link to address information (external)" msgstr "Link para as informações do endereço (externo)" #: company/models.py:492 company/models.py:609 company/models.py:832 -#: company/serializers.py:471 stock/api.py:561 +#: company/serializers.py:517 stock/api.py:561 msgid "Manufacturer Part" msgstr "Fabricante da peça" @@ -3981,7 +3981,7 @@ msgstr "Selecionar peça" msgid "Select manufacturer" msgstr "Selecionar fabricante" -#: company/models.py:527 company/serializers.py:479 order/serializers.py:734 +#: company/models.py:527 company/serializers.py:525 order/serializers.py:734 #: part/serializers.py:576 msgid "MPN" msgstr "NPF" @@ -4030,7 +4030,7 @@ msgstr "Unidades de pacote devem ser maior que zero" msgid "Linked manufacturer part must reference the same base part" msgstr "Parte do fabricante vinculado deve fazer referência à mesma peça base" -#: company/models.py:810 company/serializers.py:449 company/serializers.py:467 +#: company/models.py:810 company/serializers.py:495 company/serializers.py:513 #: order/models.py:639 part/serializers.py:550 #: plugin/builtin/suppliers/digikey.py:26 plugin/builtin/suppliers/lcsc.py:27 #: plugin/builtin/suppliers/mouser.py:25 plugin/builtin/suppliers/tme.py:27 @@ -4134,10 +4134,14 @@ msgstr "Moeda padrão utilizada para este fornecedor" msgid "Company Name" msgstr "Nome da Empresa" -#: company/serializers.py:433 part/serializers.py:955 stock/serializers.py:428 +#: company/serializers.py:467 part/serializers.py:927 stock/serializers.py:428 msgid "In Stock" msgstr "Em Estoque" +#: company/serializers.py:484 +msgid "Price Breaks" +msgstr "" + #: data_exporter/mixins.py:325 data_exporter/mixins.py:403 msgid "Error occurred during data export" msgstr "Ocorreu um erro ao exportar os dados" @@ -4290,7 +4294,7 @@ msgstr "Dados da linha original" msgid "Errors" msgstr "Erros" -#: importer/models.py:550 part/serializers.py:1268 +#: importer/models.py:550 part/serializers.py:1240 msgid "Valid" msgstr "Válido" @@ -5677,7 +5681,7 @@ msgstr "" msgid "Part category" msgstr "Categoria da Peça" -#: part/models.py:1088 part/serializers.py:929 +#: part/models.py:1088 part/serializers.py:901 #: report/templates/report/inventree_stock_location_report.html:103 msgid "IPN" msgstr "" @@ -5718,7 +5722,7 @@ msgstr "Validade Padrão" msgid "Expiry time (in days) for stock items of this part" msgstr "Validade (em dias) para itens do estoque desta peça" -#: part/models.py:1186 part/serializers.py:1003 +#: part/models.py:1186 part/serializers.py:975 msgid "Minimum Stock" msgstr "Estoque Mínimo" @@ -6418,203 +6422,203 @@ msgstr "" msgid "Supplier part matching this SKU already exists" msgstr "" -#: part/serializers.py:914 +#: part/serializers.py:886 msgid "Category Name" msgstr "" -#: part/serializers.py:943 +#: part/serializers.py:915 msgid "Building" msgstr "" -#: part/serializers.py:944 +#: part/serializers.py:916 msgid "Quantity of this part currently being in production" msgstr "" -#: part/serializers.py:951 +#: part/serializers.py:923 msgid "Outstanding quantity of this part scheduled to be built" msgstr "" -#: part/serializers.py:971 stock/serializers.py:1019 stock/serializers.py:1189 +#: part/serializers.py:943 stock/serializers.py:1019 stock/serializers.py:1189 #: users/ruleset.py:30 msgid "Stock Items" msgstr "Itens de Estoque" -#: part/serializers.py:975 +#: part/serializers.py:947 msgid "Revisions" msgstr "" -#: part/serializers.py:979 +#: part/serializers.py:951 msgid "Suppliers" msgstr "" -#: part/serializers.py:983 part/serializers.py:1297 +#: part/serializers.py:955 part/serializers.py:1269 #: templates/email/low_stock_notification.html:16 #: templates/email/part_event_notification.html:17 msgid "Total Stock" msgstr "Estoque Total" -#: part/serializers.py:991 +#: part/serializers.py:963 msgid "Unallocated Stock" msgstr "" -#: part/serializers.py:999 +#: part/serializers.py:971 msgid "Variant Stock" msgstr "" -#: part/serializers.py:1054 +#: part/serializers.py:1026 msgid "Duplicate Part" msgstr "" -#: part/serializers.py:1055 +#: part/serializers.py:1027 msgid "Copy initial data from another Part" msgstr "" -#: part/serializers.py:1061 +#: part/serializers.py:1033 msgid "Initial Stock" msgstr "Estoque Inicial" -#: part/serializers.py:1062 +#: part/serializers.py:1034 msgid "Create Part with initial stock quantity" msgstr "" -#: part/serializers.py:1068 +#: part/serializers.py:1040 msgid "Supplier Information" msgstr "" -#: part/serializers.py:1069 +#: part/serializers.py:1041 msgid "Add initial supplier information for this part" msgstr "" -#: part/serializers.py:1077 +#: part/serializers.py:1049 msgid "Copy Category Parameters" msgstr "" -#: part/serializers.py:1078 +#: part/serializers.py:1050 msgid "Copy parameter templates from selected part category" msgstr "" -#: part/serializers.py:1083 +#: part/serializers.py:1055 msgid "Existing Image" msgstr "" -#: part/serializers.py:1084 +#: part/serializers.py:1056 msgid "Filename of an existing part image" msgstr "" -#: part/serializers.py:1101 +#: part/serializers.py:1073 msgid "Image file does not exist" msgstr "" -#: part/serializers.py:1269 +#: part/serializers.py:1241 msgid "Validate entire Bill of Materials" msgstr "" -#: part/serializers.py:1303 part/serializers.py:1769 +#: part/serializers.py:1275 part/serializers.py:1741 msgid "Can Build" msgstr "" -#: part/serializers.py:1320 +#: part/serializers.py:1292 msgid "Required for Build Orders" msgstr "" -#: part/serializers.py:1325 +#: part/serializers.py:1297 msgid "Allocated to Build Orders" msgstr "" -#: part/serializers.py:1332 +#: part/serializers.py:1304 msgid "Required for Sales Orders" msgstr "" -#: part/serializers.py:1336 +#: part/serializers.py:1308 msgid "Allocated to Sales Orders" msgstr "" -#: part/serializers.py:1475 +#: part/serializers.py:1447 msgid "Minimum Price" msgstr "" -#: part/serializers.py:1476 +#: part/serializers.py:1448 msgid "Override calculated value for minimum price" msgstr "" -#: part/serializers.py:1483 +#: part/serializers.py:1455 msgid "Minimum price currency" msgstr "" -#: part/serializers.py:1490 +#: part/serializers.py:1462 msgid "Maximum Price" msgstr "" -#: part/serializers.py:1491 +#: part/serializers.py:1463 msgid "Override calculated value for maximum price" msgstr "" -#: part/serializers.py:1498 +#: part/serializers.py:1470 msgid "Maximum price currency" msgstr "" -#: part/serializers.py:1527 +#: part/serializers.py:1499 msgid "Update" msgstr "Atualizar" -#: part/serializers.py:1528 +#: part/serializers.py:1500 msgid "Update pricing for this part" msgstr "" -#: part/serializers.py:1551 +#: part/serializers.py:1523 #, python-brace-format msgid "Could not convert from provided currencies to {default_currency}" msgstr "" -#: part/serializers.py:1558 +#: part/serializers.py:1530 msgid "Minimum price must not be greater than maximum price" msgstr "" -#: part/serializers.py:1561 +#: part/serializers.py:1533 msgid "Maximum price must not be less than minimum price" msgstr "" -#: part/serializers.py:1715 +#: part/serializers.py:1687 msgid "Select the parent assembly" msgstr "" -#: part/serializers.py:1735 +#: part/serializers.py:1707 msgid "Select the component part" msgstr "" -#: part/serializers.py:1929 +#: part/serializers.py:1901 msgid "Select part to copy BOM from" msgstr "" -#: part/serializers.py:1937 +#: part/serializers.py:1909 msgid "Remove Existing Data" msgstr "" -#: part/serializers.py:1938 +#: part/serializers.py:1910 msgid "Remove existing BOM items before copying" msgstr "" -#: part/serializers.py:1943 +#: part/serializers.py:1915 msgid "Include Inherited" msgstr "" -#: part/serializers.py:1944 +#: part/serializers.py:1916 msgid "Include BOM items which are inherited from templated parts" msgstr "" -#: part/serializers.py:1949 +#: part/serializers.py:1921 msgid "Skip Invalid Rows" msgstr "Ignorar Linhas Inválidas" -#: part/serializers.py:1950 +#: part/serializers.py:1922 msgid "Enable this option to skip invalid rows" msgstr "Habilite essa opção para ignorar linhas inválidas" -#: part/serializers.py:1955 +#: part/serializers.py:1927 msgid "Copy Substitute Parts" msgstr "" -#: part/serializers.py:1956 +#: part/serializers.py:1928 msgid "Copy substitute parts when duplicate BOM items" msgstr "" @@ -8455,115 +8459,119 @@ msgstr "" msgid "Quantity does not match serial numbers" msgstr "" -#: stock/models.py:2012 stock/models.py:2917 +#: stock/models.py:1912 +msgid "Cannot assign stock to structural location" +msgstr "" + +#: stock/models.py:2029 stock/models.py:2934 msgid "Test template does not exist" msgstr "" -#: stock/models.py:2030 +#: stock/models.py:2047 msgid "Stock item has been assigned to a sales order" msgstr "" -#: stock/models.py:2034 +#: stock/models.py:2051 msgid "Stock item is installed in another item" msgstr "" -#: stock/models.py:2037 +#: stock/models.py:2054 msgid "Stock item contains other items" msgstr "" -#: stock/models.py:2040 +#: stock/models.py:2057 msgid "Stock item has been assigned to a customer" msgstr "" -#: stock/models.py:2043 stock/models.py:2226 +#: stock/models.py:2060 stock/models.py:2243 msgid "Stock item is currently in production" msgstr "" -#: stock/models.py:2046 +#: stock/models.py:2063 msgid "Serialized stock cannot be merged" msgstr "" -#: stock/models.py:2053 stock/serializers.py:1462 +#: stock/models.py:2070 stock/serializers.py:1462 msgid "Duplicate stock items" msgstr "" -#: stock/models.py:2057 +#: stock/models.py:2074 msgid "Stock items must refer to the same part" msgstr "" -#: stock/models.py:2065 +#: stock/models.py:2082 msgid "Stock items must refer to the same supplier part" msgstr "" -#: stock/models.py:2070 +#: stock/models.py:2087 msgid "Stock status codes must match" msgstr "" -#: stock/models.py:2349 +#: stock/models.py:2366 msgid "StockItem cannot be moved as it is not in stock" msgstr "" -#: stock/models.py:2818 +#: stock/models.py:2835 msgid "Stock Item Tracking" msgstr "" -#: stock/models.py:2849 +#: stock/models.py:2866 msgid "Entry notes" msgstr "" -#: stock/models.py:2889 +#: stock/models.py:2906 msgid "Stock Item Test Result" msgstr "" -#: stock/models.py:2920 +#: stock/models.py:2937 msgid "Value must be provided for this test" msgstr "" -#: stock/models.py:2924 +#: stock/models.py:2941 msgid "Attachment must be uploaded for this test" msgstr "" -#: stock/models.py:2929 +#: stock/models.py:2946 msgid "Invalid value for this test" msgstr "" -#: stock/models.py:2953 +#: stock/models.py:2970 msgid "Test result" msgstr "" -#: stock/models.py:2960 +#: stock/models.py:2977 msgid "Test output value" msgstr "" -#: stock/models.py:2968 stock/serializers.py:248 +#: stock/models.py:2985 stock/serializers.py:248 msgid "Test result attachment" msgstr "" -#: stock/models.py:2972 +#: stock/models.py:2989 msgid "Test notes" msgstr "" -#: stock/models.py:2980 +#: stock/models.py:2997 msgid "Test station" msgstr "" -#: stock/models.py:2981 +#: stock/models.py:2998 msgid "The identifier of the test station where the test was performed" msgstr "" -#: stock/models.py:2987 +#: stock/models.py:3004 msgid "Started" msgstr "" -#: stock/models.py:2988 +#: stock/models.py:3005 msgid "The timestamp of the test start" msgstr "" -#: stock/models.py:2994 +#: stock/models.py:3011 msgid "Finished" msgstr "" -#: stock/models.py:2995 +#: stock/models.py:3012 msgid "The timestamp of the test finish" msgstr "" @@ -8902,83 +8910,87 @@ msgstr "" msgid "Stock manually removed" msgstr "" -#: stock/status_codes.py:57 +#: stock/status_codes.py:56 +msgid "Serialized stock items" +msgstr "" + +#: stock/status_codes.py:58 msgid "Returned to stock" msgstr "" -#: stock/status_codes.py:60 +#: stock/status_codes.py:61 msgid "Location changed" msgstr "" -#: stock/status_codes.py:61 +#: stock/status_codes.py:62 msgid "Stock updated" msgstr "" -#: stock/status_codes.py:64 +#: stock/status_codes.py:65 msgid "Installed into assembly" msgstr "" -#: stock/status_codes.py:65 +#: stock/status_codes.py:66 msgid "Removed from assembly" msgstr "" -#: stock/status_codes.py:67 +#: stock/status_codes.py:68 msgid "Installed component item" msgstr "" -#: stock/status_codes.py:68 +#: stock/status_codes.py:69 msgid "Removed component item" msgstr "" -#: stock/status_codes.py:71 +#: stock/status_codes.py:72 msgid "Split from parent item" msgstr "" -#: stock/status_codes.py:72 +#: stock/status_codes.py:73 msgid "Split child item" msgstr "" -#: stock/status_codes.py:75 +#: stock/status_codes.py:76 msgid "Merged stock items" msgstr "" -#: stock/status_codes.py:78 +#: stock/status_codes.py:79 msgid "Converted to variant" msgstr "" -#: stock/status_codes.py:81 +#: stock/status_codes.py:82 msgid "Build order output created" msgstr "" -#: stock/status_codes.py:82 +#: stock/status_codes.py:83 msgid "Build order output completed" msgstr "" -#: stock/status_codes.py:83 +#: stock/status_codes.py:84 msgid "Build order output rejected" msgstr "" -#: stock/status_codes.py:84 +#: stock/status_codes.py:85 msgid "Consumed by build order" msgstr "" -#: stock/status_codes.py:87 +#: stock/status_codes.py:88 msgid "Shipped against Sales Order" msgstr "" -#: stock/status_codes.py:90 +#: stock/status_codes.py:91 msgid "Received against Purchase Order" msgstr "" -#: stock/status_codes.py:93 +#: stock/status_codes.py:94 msgid "Returned against Return Order" msgstr "" -#: stock/status_codes.py:96 +#: stock/status_codes.py:97 msgid "Sent to customer" msgstr "" -#: stock/status_codes.py:97 +#: stock/status_codes.py:98 msgid "Returned from customer" msgstr "" diff --git a/src/backend/InvenTree/locale/ro/LC_MESSAGES/django.po b/src/backend/InvenTree/locale/ro/LC_MESSAGES/django.po index 5414710c92..7eb663bbd3 100644 --- a/src/backend/InvenTree/locale/ro/LC_MESSAGES/django.po +++ b/src/backend/InvenTree/locale/ro/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: inventree\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-11-19 04:55+0000\n" -"PO-Revision-Date: 2025-11-19 04:59\n" +"POT-Creation-Date: 2025-11-24 06:50+0000\n" +"PO-Revision-Date: 2025-11-24 06:54\n" "Last-Translator: \n" "Language-Team: Romanian\n" "Language: ro_RO\n" @@ -81,21 +81,21 @@ msgstr "" msgid "The provided email domain is not approved." msgstr "Domeniul de e-mail furnizat nu este aprobat." -#: InvenTree/conversion.py:166 +#: InvenTree/conversion.py:240 #, python-brace-format msgid "Invalid unit provided ({unit})" msgstr "" -#: InvenTree/conversion.py:183 +#: InvenTree/conversion.py:257 msgid "No value provided" msgstr "" -#: InvenTree/conversion.py:210 +#: InvenTree/conversion.py:284 #, python-brace-format msgid "Could not convert {original} to {unit}" msgstr "" -#: InvenTree/conversion.py:212 InvenTree/conversion.py:226 +#: InvenTree/conversion.py:286 InvenTree/conversion.py:300 #: InvenTree/helpers.py:597 order/models.py:720 order/models.py:1015 msgid "Invalid quantity provided" msgstr "" @@ -116,7 +116,7 @@ msgstr "" #: build/serializers.py:580 build/serializers.py:1788 company/models.py:857 #: order/models.py:1780 #: report/templates/report/inventree_build_order_report.html:172 -#: stock/models.py:2848 stock/models.py:2972 stock/serializers.py:717 +#: stock/models.py:2865 stock/models.py:2989 stock/serializers.py:717 #: stock/serializers.py:893 stock/serializers.py:1035 stock/serializers.py:1336 #: stock/serializers.py:1425 stock/serializers.py:1624 msgid "Notes" @@ -345,7 +345,7 @@ msgstr "" msgid "Currency" msgstr "" -#: InvenTree/serializers.py:298 part/serializers.py:1385 +#: InvenTree/serializers.py:298 part/serializers.py:1357 msgid "Select currency from available options" msgstr "" @@ -553,14 +553,14 @@ msgstr "" #: build/api.py:100 build/api.py:466 build/api.py:845 build/models.py:270 #: build/serializers.py:1225 build/serializers.py:1356 -#: build/serializers.py:1427 company/models.py:1067 company/serializers.py:445 +#: build/serializers.py:1427 company/models.py:1067 company/serializers.py:491 #: order/api.py:298 order/api.py:302 order/api.py:929 order/api.py:1187 #: order/api.py:1190 order/models.py:1941 order/models.py:2108 #: order/models.py:2109 part/api.py:1233 part/api.py:1236 part/api.py:1302 #: part/api.py:1589 part/models.py:472 part/models.py:3296 part/models.py:3439 #: part/models.py:3497 part/models.py:3518 part/models.py:3540 #: part/models.py:3679 part/models.py:4046 part/models.py:4368 -#: part/models.py:4787 part/serializers.py:1928 +#: part/models.py:4787 part/serializers.py:1900 #: report/templates/report/inventree_bill_of_materials_report.html:110 #: report/templates/report/inventree_bill_of_materials_report.html:137 #: report/templates/report/inventree_build_order_report.html:109 @@ -582,7 +582,7 @@ msgstr "" #: build/api.py:120 build/api.py:123 build/serializers.py:1438 part/api.py:980 #: part/api.py:1316 part/api.py:1600 part/models.py:1080 part/models.py:3568 -#: part/models.py:4162 part/serializers.py:1752 stock/api.py:869 +#: part/models.py:4162 part/serializers.py:1724 stock/api.py:869 msgid "Category" msgstr "" @@ -663,7 +663,7 @@ msgid "Optional" msgstr "" #: build/api.py:455 build/serializers.py:1415 common/setting/system.py:456 -#: part/models.py:1202 part/serializers.py:1714 part/serializers.py:1725 +#: part/models.py:1202 part/serializers.py:1686 part/serializers.py:1697 #: stock/api.py:639 msgid "Assembly" msgstr "" @@ -688,16 +688,16 @@ msgstr "" msgid "Consumed" msgstr "" -#: build/api.py:499 company/models.py:912 company/serializers.py:440 +#: build/api.py:499 company/models.py:912 company/serializers.py:474 #: templates/email/build_order_required_stock.html:19 #: templates/email/low_stock_notification.html:17 #: templates/email/part_event_notification.html:18 msgid "Available" msgstr "" -#: build/api.py:523 build/serializers.py:1466 company/serializers.py:437 -#: order/serializers.py:1281 part/serializers.py:959 part/serializers.py:1306 -#: part/serializers.py:1761 +#: build/api.py:523 build/serializers.py:1466 company/serializers.py:471 +#: order/serializers.py:1281 part/serializers.py:931 part/serializers.py:1278 +#: part/serializers.py:1733 msgid "On Order" msgstr "" @@ -729,7 +729,7 @@ msgstr "" #: build/models.py:118 users/ruleset.py:31 msgid "Build Orders" -msgstr "" +msgstr "Comenzi de Producție" #: build/models.py:168 msgid "Assembly BOM has not been validated" @@ -963,7 +963,7 @@ msgstr "" #: build/models.py:1136 build/models.py:1234 build/serializers.py:285 #: build/serializers.py:335 build/serializers.py:965 build/serializers.py:1739 #: order/models.py:717 order/serializers.py:658 order/serializers.py:844 -#: part/serializers.py:1708 stock/models.py:940 stock/models.py:1430 +#: part/serializers.py:1680 stock/models.py:940 stock/models.py:1430 #: stock/models.py:1878 stock/serializers.py:688 stock/serializers.py:1580 msgid "Quantity must be greater than zero" msgstr "" @@ -1385,20 +1385,20 @@ msgstr "" msgid "BOM Item" msgstr "" -#: build/serializers.py:1467 order/serializers.py:1282 part/serializers.py:1310 -#: part/serializers.py:1765 +#: build/serializers.py:1467 order/serializers.py:1282 part/serializers.py:1282 +#: part/serializers.py:1737 msgid "In Production" msgstr "" -#: build/serializers.py:1469 part/serializers.py:950 part/serializers.py:1314 +#: build/serializers.py:1469 part/serializers.py:922 part/serializers.py:1286 msgid "Scheduled to Build" msgstr "" -#: build/serializers.py:1472 part/serializers.py:987 +#: build/serializers.py:1472 part/serializers.py:959 msgid "External Stock" msgstr "" -#: build/serializers.py:1473 part/serializers.py:1300 part/serializers.py:1808 +#: build/serializers.py:1473 part/serializers.py:1272 part/serializers.py:1780 msgid "Available Stock" msgstr "" @@ -1588,7 +1588,7 @@ msgstr "" msgid "Price break quantity" msgstr "" -#: common/models.py:1348 company/serializers.py:564 order/models.py:1842 +#: common/models.py:1348 company/serializers.py:357 order/models.py:1842 #: order/models.py:3043 msgid "Price" msgstr "" @@ -1760,7 +1760,7 @@ msgstr "" msgid "Unit definition" msgstr "" -#: common/models.py:1911 common/models.py:1974 stock/models.py:2967 +#: common/models.py:1911 common/models.py:1974 stock/models.py:2984 #: stock/serializers.py:247 msgid "Attachment" msgstr "" @@ -1839,7 +1839,7 @@ msgstr "" #: common/models.py:2090 common/models.py:2329 company/models.py:622 #: machine/serializers.py:27 -#: report/templates/report/inventree_test_report.html:104 stock/models.py:2959 +#: report/templates/report/inventree_test_report.html:104 stock/models.py:2976 msgid "Value" msgstr "" @@ -2048,7 +2048,7 @@ msgid "Response data from the barcode scan" msgstr "" #: common/models.py:2417 report/templates/report/inventree_test_report.html:103 -#: stock/models.py:2953 +#: stock/models.py:2970 msgid "Result" msgstr "" @@ -2141,7 +2141,7 @@ msgid "Linked thread for this message" msgstr "" #: common/models.py:2656 -msgid "Prioriy" +msgid "Priority" msgstr "" #: common/models.py:2698 @@ -2671,8 +2671,8 @@ msgstr "" msgid "Parts can be assembled from other components by default" msgstr "" -#: common/setting/system.py:462 part/models.py:1208 part/serializers.py:1734 -#: part/serializers.py:1741 +#: common/setting/system.py:462 part/models.py:1208 part/serializers.py:1706 +#: part/serializers.py:1713 msgid "Component" msgstr "" @@ -3049,7 +3049,7 @@ msgstr "" #: common/setting/system.py:789 msgid "External Build Orders" -msgstr "" +msgstr "Comenzi externe de producție" #: common/setting/system.py:790 msgid "Enable external build order functionality" @@ -3405,7 +3405,7 @@ msgstr "" #: common/setting/system.py:1124 msgid "Display Users full names instead of usernames" -msgstr "" +msgstr "Afișează numele complet al utilizatorilor în loc de nume de utilizator" #: common/setting/system.py:1129 msgid "Display User Profiles" @@ -3529,7 +3529,7 @@ msgstr "" #: common/setting/user.py:101 msgid "Search Build Orders" -msgstr "" +msgstr "Căutați comenzi de producție" #: common/setting/user.py:102 msgid "Display build orders in search preview window" @@ -3772,7 +3772,7 @@ msgstr "" msgid "Supplier is Active" msgstr "" -#: company/api.py:307 company/models.py:520 company/serializers.py:457 +#: company/api.py:307 company/models.py:520 company/serializers.py:503 #: part/serializers.py:566 msgid "Manufacturer" msgstr "" @@ -3964,7 +3964,7 @@ msgid "Link to address information (external)" msgstr "" #: company/models.py:492 company/models.py:609 company/models.py:832 -#: company/serializers.py:471 stock/api.py:561 +#: company/serializers.py:517 stock/api.py:561 msgid "Manufacturer Part" msgstr "" @@ -3981,7 +3981,7 @@ msgstr "" msgid "Select manufacturer" msgstr "" -#: company/models.py:527 company/serializers.py:479 order/serializers.py:734 +#: company/models.py:527 company/serializers.py:525 order/serializers.py:734 #: part/serializers.py:576 msgid "MPN" msgstr "" @@ -4030,7 +4030,7 @@ msgstr "" msgid "Linked manufacturer part must reference the same base part" msgstr "" -#: company/models.py:810 company/serializers.py:449 company/serializers.py:467 +#: company/models.py:810 company/serializers.py:495 company/serializers.py:513 #: order/models.py:639 part/serializers.py:550 #: plugin/builtin/suppliers/digikey.py:26 plugin/builtin/suppliers/lcsc.py:27 #: plugin/builtin/suppliers/mouser.py:25 plugin/builtin/suppliers/tme.py:27 @@ -4134,10 +4134,14 @@ msgstr "" msgid "Company Name" msgstr "" -#: company/serializers.py:433 part/serializers.py:955 stock/serializers.py:428 +#: company/serializers.py:467 part/serializers.py:927 stock/serializers.py:428 msgid "In Stock" msgstr "" +#: company/serializers.py:484 +msgid "Price Breaks" +msgstr "" + #: data_exporter/mixins.py:325 data_exporter/mixins.py:403 msgid "Error occurred during data export" msgstr "" @@ -4290,7 +4294,7 @@ msgstr "" msgid "Errors" msgstr "" -#: importer/models.py:550 part/serializers.py:1268 +#: importer/models.py:550 part/serializers.py:1240 msgid "Valid" msgstr "" @@ -5677,7 +5681,7 @@ msgstr "" msgid "Part category" msgstr "" -#: part/models.py:1088 part/serializers.py:929 +#: part/models.py:1088 part/serializers.py:901 #: report/templates/report/inventree_stock_location_report.html:103 msgid "IPN" msgstr "" @@ -5718,7 +5722,7 @@ msgstr "" msgid "Expiry time (in days) for stock items of this part" msgstr "" -#: part/models.py:1186 part/serializers.py:1003 +#: part/models.py:1186 part/serializers.py:975 msgid "Minimum Stock" msgstr "" @@ -6418,203 +6422,203 @@ msgstr "" msgid "Supplier part matching this SKU already exists" msgstr "" -#: part/serializers.py:914 +#: part/serializers.py:886 msgid "Category Name" msgstr "" -#: part/serializers.py:943 +#: part/serializers.py:915 msgid "Building" msgstr "" -#: part/serializers.py:944 +#: part/serializers.py:916 msgid "Quantity of this part currently being in production" msgstr "" -#: part/serializers.py:951 +#: part/serializers.py:923 msgid "Outstanding quantity of this part scheduled to be built" msgstr "" -#: part/serializers.py:971 stock/serializers.py:1019 stock/serializers.py:1189 +#: part/serializers.py:943 stock/serializers.py:1019 stock/serializers.py:1189 #: users/ruleset.py:30 msgid "Stock Items" msgstr "" -#: part/serializers.py:975 +#: part/serializers.py:947 msgid "Revisions" msgstr "" -#: part/serializers.py:979 +#: part/serializers.py:951 msgid "Suppliers" msgstr "" -#: part/serializers.py:983 part/serializers.py:1297 +#: part/serializers.py:955 part/serializers.py:1269 #: templates/email/low_stock_notification.html:16 #: templates/email/part_event_notification.html:17 msgid "Total Stock" msgstr "" -#: part/serializers.py:991 +#: part/serializers.py:963 msgid "Unallocated Stock" msgstr "" -#: part/serializers.py:999 +#: part/serializers.py:971 msgid "Variant Stock" msgstr "" -#: part/serializers.py:1054 +#: part/serializers.py:1026 msgid "Duplicate Part" msgstr "" -#: part/serializers.py:1055 +#: part/serializers.py:1027 msgid "Copy initial data from another Part" msgstr "" -#: part/serializers.py:1061 +#: part/serializers.py:1033 msgid "Initial Stock" msgstr "" -#: part/serializers.py:1062 +#: part/serializers.py:1034 msgid "Create Part with initial stock quantity" msgstr "" -#: part/serializers.py:1068 +#: part/serializers.py:1040 msgid "Supplier Information" msgstr "" -#: part/serializers.py:1069 +#: part/serializers.py:1041 msgid "Add initial supplier information for this part" msgstr "" -#: part/serializers.py:1077 +#: part/serializers.py:1049 msgid "Copy Category Parameters" msgstr "" -#: part/serializers.py:1078 +#: part/serializers.py:1050 msgid "Copy parameter templates from selected part category" msgstr "" -#: part/serializers.py:1083 +#: part/serializers.py:1055 msgid "Existing Image" msgstr "" -#: part/serializers.py:1084 +#: part/serializers.py:1056 msgid "Filename of an existing part image" msgstr "" -#: part/serializers.py:1101 +#: part/serializers.py:1073 msgid "Image file does not exist" msgstr "" -#: part/serializers.py:1269 +#: part/serializers.py:1241 msgid "Validate entire Bill of Materials" msgstr "" -#: part/serializers.py:1303 part/serializers.py:1769 +#: part/serializers.py:1275 part/serializers.py:1741 msgid "Can Build" msgstr "" -#: part/serializers.py:1320 +#: part/serializers.py:1292 msgid "Required for Build Orders" msgstr "" -#: part/serializers.py:1325 +#: part/serializers.py:1297 msgid "Allocated to Build Orders" msgstr "" -#: part/serializers.py:1332 +#: part/serializers.py:1304 msgid "Required for Sales Orders" msgstr "" -#: part/serializers.py:1336 +#: part/serializers.py:1308 msgid "Allocated to Sales Orders" msgstr "" -#: part/serializers.py:1475 +#: part/serializers.py:1447 msgid "Minimum Price" msgstr "" -#: part/serializers.py:1476 +#: part/serializers.py:1448 msgid "Override calculated value for minimum price" msgstr "" -#: part/serializers.py:1483 +#: part/serializers.py:1455 msgid "Minimum price currency" msgstr "" -#: part/serializers.py:1490 +#: part/serializers.py:1462 msgid "Maximum Price" msgstr "" -#: part/serializers.py:1491 +#: part/serializers.py:1463 msgid "Override calculated value for maximum price" msgstr "" -#: part/serializers.py:1498 +#: part/serializers.py:1470 msgid "Maximum price currency" msgstr "" -#: part/serializers.py:1527 +#: part/serializers.py:1499 msgid "Update" msgstr "" -#: part/serializers.py:1528 +#: part/serializers.py:1500 msgid "Update pricing for this part" msgstr "" -#: part/serializers.py:1551 +#: part/serializers.py:1523 #, python-brace-format msgid "Could not convert from provided currencies to {default_currency}" msgstr "" -#: part/serializers.py:1558 +#: part/serializers.py:1530 msgid "Minimum price must not be greater than maximum price" msgstr "" -#: part/serializers.py:1561 +#: part/serializers.py:1533 msgid "Maximum price must not be less than minimum price" msgstr "" -#: part/serializers.py:1715 +#: part/serializers.py:1687 msgid "Select the parent assembly" msgstr "" -#: part/serializers.py:1735 +#: part/serializers.py:1707 msgid "Select the component part" msgstr "" -#: part/serializers.py:1929 +#: part/serializers.py:1901 msgid "Select part to copy BOM from" msgstr "" -#: part/serializers.py:1937 +#: part/serializers.py:1909 msgid "Remove Existing Data" msgstr "" -#: part/serializers.py:1938 +#: part/serializers.py:1910 msgid "Remove existing BOM items before copying" msgstr "" -#: part/serializers.py:1943 +#: part/serializers.py:1915 msgid "Include Inherited" msgstr "" -#: part/serializers.py:1944 +#: part/serializers.py:1916 msgid "Include BOM items which are inherited from templated parts" msgstr "" -#: part/serializers.py:1949 +#: part/serializers.py:1921 msgid "Skip Invalid Rows" msgstr "" -#: part/serializers.py:1950 +#: part/serializers.py:1922 msgid "Enable this option to skip invalid rows" msgstr "" -#: part/serializers.py:1955 +#: part/serializers.py:1927 msgid "Copy Substitute Parts" msgstr "" -#: part/serializers.py:1956 +#: part/serializers.py:1928 msgid "Copy substitute parts when duplicate BOM items" msgstr "" @@ -8455,115 +8459,119 @@ msgstr "" msgid "Quantity does not match serial numbers" msgstr "" -#: stock/models.py:2012 stock/models.py:2917 +#: stock/models.py:1912 +msgid "Cannot assign stock to structural location" +msgstr "" + +#: stock/models.py:2029 stock/models.py:2934 msgid "Test template does not exist" msgstr "" -#: stock/models.py:2030 +#: stock/models.py:2047 msgid "Stock item has been assigned to a sales order" msgstr "" -#: stock/models.py:2034 +#: stock/models.py:2051 msgid "Stock item is installed in another item" msgstr "" -#: stock/models.py:2037 +#: stock/models.py:2054 msgid "Stock item contains other items" msgstr "" -#: stock/models.py:2040 +#: stock/models.py:2057 msgid "Stock item has been assigned to a customer" msgstr "" -#: stock/models.py:2043 stock/models.py:2226 +#: stock/models.py:2060 stock/models.py:2243 msgid "Stock item is currently in production" msgstr "" -#: stock/models.py:2046 +#: stock/models.py:2063 msgid "Serialized stock cannot be merged" msgstr "" -#: stock/models.py:2053 stock/serializers.py:1462 +#: stock/models.py:2070 stock/serializers.py:1462 msgid "Duplicate stock items" msgstr "" -#: stock/models.py:2057 +#: stock/models.py:2074 msgid "Stock items must refer to the same part" msgstr "" -#: stock/models.py:2065 +#: stock/models.py:2082 msgid "Stock items must refer to the same supplier part" msgstr "" -#: stock/models.py:2070 +#: stock/models.py:2087 msgid "Stock status codes must match" msgstr "" -#: stock/models.py:2349 +#: stock/models.py:2366 msgid "StockItem cannot be moved as it is not in stock" msgstr "" -#: stock/models.py:2818 +#: stock/models.py:2835 msgid "Stock Item Tracking" msgstr "" -#: stock/models.py:2849 +#: stock/models.py:2866 msgid "Entry notes" msgstr "" -#: stock/models.py:2889 +#: stock/models.py:2906 msgid "Stock Item Test Result" msgstr "" -#: stock/models.py:2920 +#: stock/models.py:2937 msgid "Value must be provided for this test" msgstr "" -#: stock/models.py:2924 +#: stock/models.py:2941 msgid "Attachment must be uploaded for this test" msgstr "" -#: stock/models.py:2929 +#: stock/models.py:2946 msgid "Invalid value for this test" msgstr "" -#: stock/models.py:2953 +#: stock/models.py:2970 msgid "Test result" msgstr "" -#: stock/models.py:2960 +#: stock/models.py:2977 msgid "Test output value" msgstr "" -#: stock/models.py:2968 stock/serializers.py:248 +#: stock/models.py:2985 stock/serializers.py:248 msgid "Test result attachment" msgstr "" -#: stock/models.py:2972 +#: stock/models.py:2989 msgid "Test notes" msgstr "" -#: stock/models.py:2980 +#: stock/models.py:2997 msgid "Test station" msgstr "" -#: stock/models.py:2981 +#: stock/models.py:2998 msgid "The identifier of the test station where the test was performed" msgstr "" -#: stock/models.py:2987 +#: stock/models.py:3004 msgid "Started" msgstr "" -#: stock/models.py:2988 +#: stock/models.py:3005 msgid "The timestamp of the test start" msgstr "" -#: stock/models.py:2994 +#: stock/models.py:3011 msgid "Finished" msgstr "" -#: stock/models.py:2995 +#: stock/models.py:3012 msgid "The timestamp of the test finish" msgstr "" @@ -8902,83 +8910,87 @@ msgstr "" msgid "Stock manually removed" msgstr "" -#: stock/status_codes.py:57 +#: stock/status_codes.py:56 +msgid "Serialized stock items" +msgstr "" + +#: stock/status_codes.py:58 msgid "Returned to stock" msgstr "" -#: stock/status_codes.py:60 +#: stock/status_codes.py:61 msgid "Location changed" msgstr "" -#: stock/status_codes.py:61 +#: stock/status_codes.py:62 msgid "Stock updated" msgstr "" -#: stock/status_codes.py:64 +#: stock/status_codes.py:65 msgid "Installed into assembly" msgstr "" -#: stock/status_codes.py:65 +#: stock/status_codes.py:66 msgid "Removed from assembly" msgstr "" -#: stock/status_codes.py:67 +#: stock/status_codes.py:68 msgid "Installed component item" msgstr "" -#: stock/status_codes.py:68 +#: stock/status_codes.py:69 msgid "Removed component item" msgstr "" -#: stock/status_codes.py:71 +#: stock/status_codes.py:72 msgid "Split from parent item" msgstr "" -#: stock/status_codes.py:72 +#: stock/status_codes.py:73 msgid "Split child item" msgstr "" -#: stock/status_codes.py:75 +#: stock/status_codes.py:76 msgid "Merged stock items" msgstr "" -#: stock/status_codes.py:78 +#: stock/status_codes.py:79 msgid "Converted to variant" msgstr "" -#: stock/status_codes.py:81 +#: stock/status_codes.py:82 msgid "Build order output created" msgstr "" -#: stock/status_codes.py:82 +#: stock/status_codes.py:83 msgid "Build order output completed" msgstr "" -#: stock/status_codes.py:83 +#: stock/status_codes.py:84 msgid "Build order output rejected" msgstr "" -#: stock/status_codes.py:84 +#: stock/status_codes.py:85 msgid "Consumed by build order" msgstr "" -#: stock/status_codes.py:87 +#: stock/status_codes.py:88 msgid "Shipped against Sales Order" msgstr "" -#: stock/status_codes.py:90 +#: stock/status_codes.py:91 msgid "Received against Purchase Order" msgstr "" -#: stock/status_codes.py:93 +#: stock/status_codes.py:94 msgid "Returned against Return Order" msgstr "" -#: stock/status_codes.py:96 +#: stock/status_codes.py:97 msgid "Sent to customer" msgstr "" -#: stock/status_codes.py:97 +#: stock/status_codes.py:98 msgid "Returned from customer" msgstr "" @@ -9326,15 +9338,15 @@ msgstr "" #: users/serializers.py:187 msgid "Username" -msgstr "" +msgstr "Nume utilizator" #: users/serializers.py:190 msgid "First Name" -msgstr "" +msgstr "Prenumele" #: users/serializers.py:190 msgid "First name of the user" -msgstr "" +msgstr "Prenumele utilizatorului" #: users/serializers.py:194 msgid "Last Name" diff --git a/src/backend/InvenTree/locale/ru/LC_MESSAGES/django.po b/src/backend/InvenTree/locale/ru/LC_MESSAGES/django.po index 3506ea7ed6..a02827b06a 100644 --- a/src/backend/InvenTree/locale/ru/LC_MESSAGES/django.po +++ b/src/backend/InvenTree/locale/ru/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: inventree\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-11-19 04:55+0000\n" -"PO-Revision-Date: 2025-11-19 04:59\n" +"POT-Creation-Date: 2025-11-24 06:50+0000\n" +"PO-Revision-Date: 2025-11-24 06:54\n" "Last-Translator: \n" "Language-Team: Russian\n" "Language: ru_RU\n" @@ -81,21 +81,21 @@ msgstr "Указанный основной адрес электронной п msgid "The provided email domain is not approved." msgstr "Указанный домен электронной почты не утверждён." -#: InvenTree/conversion.py:166 +#: InvenTree/conversion.py:240 #, python-brace-format msgid "Invalid unit provided ({unit})" msgstr "Предоставлено недопустимое значение ({unit})" -#: InvenTree/conversion.py:183 +#: InvenTree/conversion.py:257 msgid "No value provided" msgstr "Значение не указано" -#: InvenTree/conversion.py:210 +#: InvenTree/conversion.py:284 #, python-brace-format msgid "Could not convert {original} to {unit}" msgstr "Невозможно преобразовать {original} в {unit}" -#: InvenTree/conversion.py:212 InvenTree/conversion.py:226 +#: InvenTree/conversion.py:286 InvenTree/conversion.py:300 #: InvenTree/helpers.py:597 order/models.py:720 order/models.py:1015 msgid "Invalid quantity provided" msgstr "недопустимое количество" @@ -116,7 +116,7 @@ msgstr "Не верное десятичное значение" #: build/serializers.py:580 build/serializers.py:1788 company/models.py:857 #: order/models.py:1780 #: report/templates/report/inventree_build_order_report.html:172 -#: stock/models.py:2848 stock/models.py:2972 stock/serializers.py:717 +#: stock/models.py:2865 stock/models.py:2989 stock/serializers.py:717 #: stock/serializers.py:893 stock/serializers.py:1035 stock/serializers.py:1336 #: stock/serializers.py:1425 stock/serializers.py:1624 msgid "Notes" @@ -345,7 +345,7 @@ msgstr "Должно быть действительным номером" msgid "Currency" msgstr "Валюта" -#: InvenTree/serializers.py:298 part/serializers.py:1385 +#: InvenTree/serializers.py:298 part/serializers.py:1357 msgid "Select currency from available options" msgstr "Выберите валюту из доступных вариантов" @@ -553,14 +553,14 @@ msgstr "" #: build/api.py:100 build/api.py:466 build/api.py:845 build/models.py:270 #: build/serializers.py:1225 build/serializers.py:1356 -#: build/serializers.py:1427 company/models.py:1067 company/serializers.py:445 +#: build/serializers.py:1427 company/models.py:1067 company/serializers.py:491 #: order/api.py:298 order/api.py:302 order/api.py:929 order/api.py:1187 #: order/api.py:1190 order/models.py:1941 order/models.py:2108 #: order/models.py:2109 part/api.py:1233 part/api.py:1236 part/api.py:1302 #: part/api.py:1589 part/models.py:472 part/models.py:3296 part/models.py:3439 #: part/models.py:3497 part/models.py:3518 part/models.py:3540 #: part/models.py:3679 part/models.py:4046 part/models.py:4368 -#: part/models.py:4787 part/serializers.py:1928 +#: part/models.py:4787 part/serializers.py:1900 #: report/templates/report/inventree_bill_of_materials_report.html:110 #: report/templates/report/inventree_bill_of_materials_report.html:137 #: report/templates/report/inventree_build_order_report.html:109 @@ -582,7 +582,7 @@ msgstr "Деталь" #: build/api.py:120 build/api.py:123 build/serializers.py:1438 part/api.py:980 #: part/api.py:1316 part/api.py:1600 part/models.py:1080 part/models.py:3568 -#: part/models.py:4162 part/serializers.py:1752 stock/api.py:869 +#: part/models.py:4162 part/serializers.py:1724 stock/api.py:869 msgid "Category" msgstr "Категория" @@ -663,7 +663,7 @@ msgid "Optional" msgstr "Необязательно" #: build/api.py:455 build/serializers.py:1415 common/setting/system.py:456 -#: part/models.py:1202 part/serializers.py:1714 part/serializers.py:1725 +#: part/models.py:1202 part/serializers.py:1686 part/serializers.py:1697 #: stock/api.py:639 msgid "Assembly" msgstr "Сборная деталь" @@ -688,16 +688,16 @@ msgstr "Зарезервировано" msgid "Consumed" msgstr "" -#: build/api.py:499 company/models.py:912 company/serializers.py:440 +#: build/api.py:499 company/models.py:912 company/serializers.py:474 #: templates/email/build_order_required_stock.html:19 #: templates/email/low_stock_notification.html:17 #: templates/email/part_event_notification.html:18 msgid "Available" msgstr "Доступно" -#: build/api.py:523 build/serializers.py:1466 company/serializers.py:437 -#: order/serializers.py:1281 part/serializers.py:959 part/serializers.py:1306 -#: part/serializers.py:1761 +#: build/api.py:523 build/serializers.py:1466 company/serializers.py:471 +#: order/serializers.py:1281 part/serializers.py:931 part/serializers.py:1278 +#: part/serializers.py:1733 msgid "On Order" msgstr "В заказе" @@ -963,7 +963,7 @@ msgstr "Продукция не совпадает с заказом на про #: build/models.py:1136 build/models.py:1234 build/serializers.py:285 #: build/serializers.py:335 build/serializers.py:965 build/serializers.py:1739 #: order/models.py:717 order/serializers.py:658 order/serializers.py:844 -#: part/serializers.py:1708 stock/models.py:940 stock/models.py:1430 +#: part/serializers.py:1680 stock/models.py:940 stock/models.py:1430 #: stock/models.py:1878 stock/serializers.py:688 stock/serializers.py:1580 msgid "Quantity must be greater than zero" msgstr "Количество должно быть больше нуля" @@ -1385,20 +1385,20 @@ msgstr "Есть варианты" msgid "BOM Item" msgstr "Позиция BOM" -#: build/serializers.py:1467 order/serializers.py:1282 part/serializers.py:1310 -#: part/serializers.py:1765 +#: build/serializers.py:1467 order/serializers.py:1282 part/serializers.py:1282 +#: part/serializers.py:1737 msgid "In Production" msgstr "В производстве" -#: build/serializers.py:1469 part/serializers.py:950 part/serializers.py:1314 +#: build/serializers.py:1469 part/serializers.py:922 part/serializers.py:1286 msgid "Scheduled to Build" msgstr "" -#: build/serializers.py:1472 part/serializers.py:987 +#: build/serializers.py:1472 part/serializers.py:959 msgid "External Stock" msgstr "Внешний склад" -#: build/serializers.py:1473 part/serializers.py:1300 part/serializers.py:1808 +#: build/serializers.py:1473 part/serializers.py:1272 part/serializers.py:1780 msgid "Available Stock" msgstr "Доступный запас" @@ -1588,7 +1588,7 @@ msgstr "Пользователь" msgid "Price break quantity" msgstr "Скидка распространяется на заданное количество" -#: common/models.py:1348 company/serializers.py:564 order/models.py:1842 +#: common/models.py:1348 company/serializers.py:357 order/models.py:1842 #: order/models.py:3043 msgid "Price" msgstr "Цена" @@ -1760,7 +1760,7 @@ msgstr "Определение" msgid "Unit definition" msgstr "Определение единицы измерения" -#: common/models.py:1911 common/models.py:1974 stock/models.py:2967 +#: common/models.py:1911 common/models.py:1974 stock/models.py:2984 #: stock/serializers.py:247 msgid "Attachment" msgstr "Вложения" @@ -1839,7 +1839,7 @@ msgstr "Логическое состояние, соответствующее #: common/models.py:2090 common/models.py:2329 company/models.py:622 #: machine/serializers.py:27 -#: report/templates/report/inventree_test_report.html:104 stock/models.py:2959 +#: report/templates/report/inventree_test_report.html:104 stock/models.py:2976 msgid "Value" msgstr "Значение" @@ -2048,7 +2048,7 @@ msgid "Response data from the barcode scan" msgstr "" #: common/models.py:2417 report/templates/report/inventree_test_report.html:103 -#: stock/models.py:2953 +#: stock/models.py:2970 msgid "Result" msgstr "Результат" @@ -2141,7 +2141,7 @@ msgid "Linked thread for this message" msgstr "" #: common/models.py:2656 -msgid "Prioriy" +msgid "Priority" msgstr "" #: common/models.py:2698 @@ -2671,8 +2671,8 @@ msgstr "По умолчанию детали являются шаблонами msgid "Parts can be assembled from other components by default" msgstr "По умолчанию детали могут быть собраны из других компонентов" -#: common/setting/system.py:462 part/models.py:1208 part/serializers.py:1734 -#: part/serializers.py:1741 +#: common/setting/system.py:462 part/models.py:1208 part/serializers.py:1706 +#: part/serializers.py:1713 msgid "Component" msgstr "Компонент" @@ -3772,7 +3772,7 @@ msgstr "" msgid "Supplier is Active" msgstr "" -#: company/api.py:307 company/models.py:520 company/serializers.py:457 +#: company/api.py:307 company/models.py:520 company/serializers.py:503 #: part/serializers.py:566 msgid "Manufacturer" msgstr "Производитель" @@ -3964,7 +3964,7 @@ msgid "Link to address information (external)" msgstr "Ссылка на адресную информацию (внешняя)" #: company/models.py:492 company/models.py:609 company/models.py:832 -#: company/serializers.py:471 stock/api.py:561 +#: company/serializers.py:517 stock/api.py:561 msgid "Manufacturer Part" msgstr "Производитель детали" @@ -3981,7 +3981,7 @@ msgstr "Выберите деталь" msgid "Select manufacturer" msgstr "Выберите производителя" -#: company/models.py:527 company/serializers.py:479 order/serializers.py:734 +#: company/models.py:527 company/serializers.py:525 order/serializers.py:734 #: part/serializers.py:576 msgid "MPN" msgstr "Артикул производителя" @@ -4030,7 +4030,7 @@ msgstr "" msgid "Linked manufacturer part must reference the same base part" msgstr "Связанная деталь производителя должна ссылаться на ту же базовую деталь" -#: company/models.py:810 company/serializers.py:449 company/serializers.py:467 +#: company/models.py:810 company/serializers.py:495 company/serializers.py:513 #: order/models.py:639 part/serializers.py:550 #: plugin/builtin/suppliers/digikey.py:26 plugin/builtin/suppliers/lcsc.py:27 #: plugin/builtin/suppliers/mouser.py:25 plugin/builtin/suppliers/tme.py:27 @@ -4134,10 +4134,14 @@ msgstr "Валюта по умолчанию для этого поставщи msgid "Company Name" msgstr "" -#: company/serializers.py:433 part/serializers.py:955 stock/serializers.py:428 +#: company/serializers.py:467 part/serializers.py:927 stock/serializers.py:428 msgid "In Stock" msgstr "На складе" +#: company/serializers.py:484 +msgid "Price Breaks" +msgstr "" + #: data_exporter/mixins.py:325 data_exporter/mixins.py:403 msgid "Error occurred during data export" msgstr "" @@ -4290,7 +4294,7 @@ msgstr "" msgid "Errors" msgstr "Ошибки" -#: importer/models.py:550 part/serializers.py:1268 +#: importer/models.py:550 part/serializers.py:1240 msgid "Valid" msgstr "Корректный" @@ -5677,7 +5681,7 @@ msgstr "Ключевые слова для улучшения видимости msgid "Part category" msgstr "Категория" -#: part/models.py:1088 part/serializers.py:929 +#: part/models.py:1088 part/serializers.py:901 #: report/templates/report/inventree_stock_location_report.html:103 msgid "IPN" msgstr "Внутренний артикул" @@ -5718,7 +5722,7 @@ msgstr "Срок действия по умолчанию" msgid "Expiry time (in days) for stock items of this part" msgstr "Срок годности (в днях) для складских позиций этой детали" -#: part/models.py:1186 part/serializers.py:1003 +#: part/models.py:1186 part/serializers.py:975 msgid "Minimum Stock" msgstr "Минимальный запас" @@ -6418,203 +6422,203 @@ msgstr "Деталь производителя с данным артикуло msgid "Supplier part matching this SKU already exists" msgstr "Деталь поставщика с данным артикулом уже существует" -#: part/serializers.py:914 +#: part/serializers.py:886 msgid "Category Name" msgstr "Название категории" -#: part/serializers.py:943 +#: part/serializers.py:915 msgid "Building" msgstr "Производится" -#: part/serializers.py:944 +#: part/serializers.py:916 msgid "Quantity of this part currently being in production" msgstr "" -#: part/serializers.py:951 +#: part/serializers.py:923 msgid "Outstanding quantity of this part scheduled to be built" msgstr "" -#: part/serializers.py:971 stock/serializers.py:1019 stock/serializers.py:1189 +#: part/serializers.py:943 stock/serializers.py:1019 stock/serializers.py:1189 #: users/ruleset.py:30 msgid "Stock Items" msgstr "Складские позиции" -#: part/serializers.py:975 +#: part/serializers.py:947 msgid "Revisions" msgstr "" -#: part/serializers.py:979 +#: part/serializers.py:951 msgid "Suppliers" msgstr "Поставщики" -#: part/serializers.py:983 part/serializers.py:1297 +#: part/serializers.py:955 part/serializers.py:1269 #: templates/email/low_stock_notification.html:16 #: templates/email/part_event_notification.html:17 msgid "Total Stock" msgstr "Общий запас" -#: part/serializers.py:991 +#: part/serializers.py:963 msgid "Unallocated Stock" msgstr "" -#: part/serializers.py:999 +#: part/serializers.py:971 msgid "Variant Stock" msgstr "" -#: part/serializers.py:1054 +#: part/serializers.py:1026 msgid "Duplicate Part" msgstr "Дублировать деталь" -#: part/serializers.py:1055 +#: part/serializers.py:1027 msgid "Copy initial data from another Part" msgstr "" -#: part/serializers.py:1061 +#: part/serializers.py:1033 msgid "Initial Stock" msgstr "Начальный запас" -#: part/serializers.py:1062 +#: part/serializers.py:1034 msgid "Create Part with initial stock quantity" msgstr "Создавать деталь с начальным количеством на складе" -#: part/serializers.py:1068 +#: part/serializers.py:1040 msgid "Supplier Information" msgstr "Информация о поставщике" -#: part/serializers.py:1069 +#: part/serializers.py:1041 msgid "Add initial supplier information for this part" msgstr "Добавить начальную информацию о поставщике для этой детали" -#: part/serializers.py:1077 +#: part/serializers.py:1049 msgid "Copy Category Parameters" msgstr "Копировать параметры категории" -#: part/serializers.py:1078 +#: part/serializers.py:1050 msgid "Copy parameter templates from selected part category" msgstr "Копировать шаблоны параметров из выбранной категории деталей" -#: part/serializers.py:1083 +#: part/serializers.py:1055 msgid "Existing Image" msgstr "Существующее изображение" -#: part/serializers.py:1084 +#: part/serializers.py:1056 msgid "Filename of an existing part image" msgstr "" -#: part/serializers.py:1101 +#: part/serializers.py:1073 msgid "Image file does not exist" msgstr "" -#: part/serializers.py:1269 +#: part/serializers.py:1241 msgid "Validate entire Bill of Materials" msgstr "" -#: part/serializers.py:1303 part/serializers.py:1769 +#: part/serializers.py:1275 part/serializers.py:1741 msgid "Can Build" msgstr "Можно произвести" -#: part/serializers.py:1320 +#: part/serializers.py:1292 msgid "Required for Build Orders" msgstr "" -#: part/serializers.py:1325 +#: part/serializers.py:1297 msgid "Allocated to Build Orders" msgstr "" -#: part/serializers.py:1332 +#: part/serializers.py:1304 msgid "Required for Sales Orders" msgstr "" -#: part/serializers.py:1336 +#: part/serializers.py:1308 msgid "Allocated to Sales Orders" msgstr "" -#: part/serializers.py:1475 +#: part/serializers.py:1447 msgid "Minimum Price" msgstr "Минимальная цена" -#: part/serializers.py:1476 +#: part/serializers.py:1448 msgid "Override calculated value for minimum price" msgstr "Переопределить рассчитанное значение минимальной цены" -#: part/serializers.py:1483 +#: part/serializers.py:1455 msgid "Minimum price currency" msgstr "Валюта минимальной цены" -#: part/serializers.py:1490 +#: part/serializers.py:1462 msgid "Maximum Price" msgstr "Максимальная цена" -#: part/serializers.py:1491 +#: part/serializers.py:1463 msgid "Override calculated value for maximum price" msgstr "Переопределить рассчитанное значение максимальной цены" -#: part/serializers.py:1498 +#: part/serializers.py:1470 msgid "Maximum price currency" msgstr "Валюта максимальной цены" -#: part/serializers.py:1527 +#: part/serializers.py:1499 msgid "Update" msgstr "Обновить" -#: part/serializers.py:1528 +#: part/serializers.py:1500 msgid "Update pricing for this part" msgstr "" -#: part/serializers.py:1551 +#: part/serializers.py:1523 #, python-brace-format msgid "Could not convert from provided currencies to {default_currency}" msgstr "" -#: part/serializers.py:1558 +#: part/serializers.py:1530 msgid "Minimum price must not be greater than maximum price" msgstr "" -#: part/serializers.py:1561 +#: part/serializers.py:1533 msgid "Maximum price must not be less than minimum price" msgstr "" -#: part/serializers.py:1715 +#: part/serializers.py:1687 msgid "Select the parent assembly" msgstr "" -#: part/serializers.py:1735 +#: part/serializers.py:1707 msgid "Select the component part" msgstr "Выберите деталь, которая является компонентом" -#: part/serializers.py:1929 +#: part/serializers.py:1901 msgid "Select part to copy BOM from" msgstr "" -#: part/serializers.py:1937 +#: part/serializers.py:1909 msgid "Remove Existing Data" msgstr "" -#: part/serializers.py:1938 +#: part/serializers.py:1910 msgid "Remove existing BOM items before copying" msgstr "" -#: part/serializers.py:1943 +#: part/serializers.py:1915 msgid "Include Inherited" msgstr "" -#: part/serializers.py:1944 +#: part/serializers.py:1916 msgid "Include BOM items which are inherited from templated parts" msgstr "" -#: part/serializers.py:1949 +#: part/serializers.py:1921 msgid "Skip Invalid Rows" msgstr "Пропустить некорректные строки" -#: part/serializers.py:1950 +#: part/serializers.py:1922 msgid "Enable this option to skip invalid rows" msgstr "" -#: part/serializers.py:1955 +#: part/serializers.py:1927 msgid "Copy Substitute Parts" msgstr "" -#: part/serializers.py:1956 +#: part/serializers.py:1928 msgid "Copy substitute parts when duplicate BOM items" msgstr "" @@ -8455,115 +8459,119 @@ msgstr "" msgid "Quantity does not match serial numbers" msgstr "" -#: stock/models.py:2012 stock/models.py:2917 +#: stock/models.py:1912 +msgid "Cannot assign stock to structural location" +msgstr "" + +#: stock/models.py:2029 stock/models.py:2934 msgid "Test template does not exist" msgstr "" -#: stock/models.py:2030 +#: stock/models.py:2047 msgid "Stock item has been assigned to a sales order" msgstr "Складская позиция была назначена заказу на продажу" -#: stock/models.py:2034 +#: stock/models.py:2051 msgid "Stock item is installed in another item" msgstr "Складская позиция установлена в другую деталь" -#: stock/models.py:2037 +#: stock/models.py:2054 msgid "Stock item contains other items" msgstr "Складская позиция содержит другие детали" -#: stock/models.py:2040 +#: stock/models.py:2057 msgid "Stock item has been assigned to a customer" msgstr "Складская позиция была назначена покупателю" -#: stock/models.py:2043 stock/models.py:2226 +#: stock/models.py:2060 stock/models.py:2243 msgid "Stock item is currently in production" msgstr "Складская позиция в производстве" -#: stock/models.py:2046 +#: stock/models.py:2063 msgid "Serialized stock cannot be merged" msgstr "" -#: stock/models.py:2053 stock/serializers.py:1462 +#: stock/models.py:2070 stock/serializers.py:1462 msgid "Duplicate stock items" msgstr "" -#: stock/models.py:2057 +#: stock/models.py:2074 msgid "Stock items must refer to the same part" msgstr "Складские позиции должны ссылаться на одну и ту же деталь" -#: stock/models.py:2065 +#: stock/models.py:2082 msgid "Stock items must refer to the same supplier part" msgstr "Складские позиции должны ссылаться на одну и ту же деталь поставщика" -#: stock/models.py:2070 +#: stock/models.py:2087 msgid "Stock status codes must match" msgstr "" -#: stock/models.py:2349 +#: stock/models.py:2366 msgid "StockItem cannot be moved as it is not in stock" msgstr "" -#: stock/models.py:2818 +#: stock/models.py:2835 msgid "Stock Item Tracking" msgstr "" -#: stock/models.py:2849 +#: stock/models.py:2866 msgid "Entry notes" msgstr "" -#: stock/models.py:2889 +#: stock/models.py:2906 msgid "Stock Item Test Result" msgstr "" -#: stock/models.py:2920 +#: stock/models.py:2937 msgid "Value must be provided for this test" msgstr "" -#: stock/models.py:2924 +#: stock/models.py:2941 msgid "Attachment must be uploaded for this test" msgstr "Для этого теста требуется загрузить вложения" -#: stock/models.py:2929 +#: stock/models.py:2946 msgid "Invalid value for this test" msgstr "" -#: stock/models.py:2953 +#: stock/models.py:2970 msgid "Test result" msgstr "Результат тестирования" -#: stock/models.py:2960 +#: stock/models.py:2977 msgid "Test output value" msgstr "Результат выполнения теста" -#: stock/models.py:2968 stock/serializers.py:248 +#: stock/models.py:2985 stock/serializers.py:248 msgid "Test result attachment" msgstr "Вложение с результатом теста" -#: stock/models.py:2972 +#: stock/models.py:2989 msgid "Test notes" msgstr "Заметки о тестировании" -#: stock/models.py:2980 +#: stock/models.py:2997 msgid "Test station" msgstr "Испытательное оборудование" -#: stock/models.py:2981 +#: stock/models.py:2998 msgid "The identifier of the test station where the test was performed" msgstr "Идентификатор испытательного оборудования, на котором выполнялось тестирование" -#: stock/models.py:2987 +#: stock/models.py:3004 msgid "Started" msgstr "Запущен" -#: stock/models.py:2988 +#: stock/models.py:3005 msgid "The timestamp of the test start" msgstr "Время начала тестирования" -#: stock/models.py:2994 +#: stock/models.py:3011 msgid "Finished" msgstr "Завершён" -#: stock/models.py:2995 +#: stock/models.py:3012 msgid "The timestamp of the test finish" msgstr "Время окончания тестирования" @@ -8902,83 +8910,87 @@ msgstr "Запасы, добавленные вручную" msgid "Stock manually removed" msgstr "Запасы удаленные вручную" -#: stock/status_codes.py:57 +#: stock/status_codes.py:56 +msgid "Serialized stock items" +msgstr "" + +#: stock/status_codes.py:58 msgid "Returned to stock" msgstr "" -#: stock/status_codes.py:60 +#: stock/status_codes.py:61 msgid "Location changed" msgstr "Место хранения изменено" -#: stock/status_codes.py:61 +#: stock/status_codes.py:62 msgid "Stock updated" msgstr "Запас обновлен" -#: stock/status_codes.py:64 +#: stock/status_codes.py:65 msgid "Installed into assembly" msgstr "Установленно в производимую деталь" -#: stock/status_codes.py:65 +#: stock/status_codes.py:66 msgid "Removed from assembly" msgstr "Удалено из производимой детали" -#: stock/status_codes.py:67 +#: stock/status_codes.py:68 msgid "Installed component item" msgstr "Установленный компонент" -#: stock/status_codes.py:68 +#: stock/status_codes.py:69 msgid "Removed component item" msgstr "Удаленный компонент" -#: stock/status_codes.py:71 +#: stock/status_codes.py:72 msgid "Split from parent item" msgstr "Отделить от родительского элемента" -#: stock/status_codes.py:72 +#: stock/status_codes.py:73 msgid "Split child item" msgstr "Разбить дочерний элемент" -#: stock/status_codes.py:75 +#: stock/status_codes.py:76 msgid "Merged stock items" msgstr "Объединенные складские позиции" -#: stock/status_codes.py:78 +#: stock/status_codes.py:79 msgid "Converted to variant" msgstr "Преобразовать в разновидность" -#: stock/status_codes.py:81 +#: stock/status_codes.py:82 msgid "Build order output created" msgstr "Создан выход продукции для этого заказа на производство" -#: stock/status_codes.py:82 +#: stock/status_codes.py:83 msgid "Build order output completed" msgstr "Продукция заказа на производство завершена" -#: stock/status_codes.py:83 +#: stock/status_codes.py:84 msgid "Build order output rejected" msgstr "Продукция заказа на производство отклонена" -#: stock/status_codes.py:84 +#: stock/status_codes.py:85 msgid "Consumed by build order" msgstr "Поглощен заказом на производство" -#: stock/status_codes.py:87 +#: stock/status_codes.py:88 msgid "Shipped against Sales Order" msgstr "Отгружено по заказу на продажу" -#: stock/status_codes.py:90 +#: stock/status_codes.py:91 msgid "Received against Purchase Order" msgstr "Получено по заказу на поставку" -#: stock/status_codes.py:93 +#: stock/status_codes.py:94 msgid "Returned against Return Order" msgstr "Возвращено по заказу на возврат" -#: stock/status_codes.py:96 +#: stock/status_codes.py:97 msgid "Sent to customer" msgstr "Отправлено клиенту" -#: stock/status_codes.py:97 +#: stock/status_codes.py:98 msgid "Returned from customer" msgstr "Возвращено от клиента" diff --git a/src/backend/InvenTree/locale/sk/LC_MESSAGES/django.po b/src/backend/InvenTree/locale/sk/LC_MESSAGES/django.po index 19d86471eb..9c48b26d8c 100644 --- a/src/backend/InvenTree/locale/sk/LC_MESSAGES/django.po +++ b/src/backend/InvenTree/locale/sk/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: inventree\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-11-19 04:55+0000\n" -"PO-Revision-Date: 2025-11-19 04:59\n" +"POT-Creation-Date: 2025-11-24 06:50+0000\n" +"PO-Revision-Date: 2025-11-24 06:54\n" "Last-Translator: \n" "Language-Team: Slovak\n" "Language: sk_SK\n" @@ -81,21 +81,21 @@ msgstr "" msgid "The provided email domain is not approved." msgstr "" -#: InvenTree/conversion.py:166 +#: InvenTree/conversion.py:240 #, python-brace-format msgid "Invalid unit provided ({unit})" msgstr "" -#: InvenTree/conversion.py:183 +#: InvenTree/conversion.py:257 msgid "No value provided" msgstr "" -#: InvenTree/conversion.py:210 +#: InvenTree/conversion.py:284 #, python-brace-format msgid "Could not convert {original} to {unit}" msgstr "" -#: InvenTree/conversion.py:212 InvenTree/conversion.py:226 +#: InvenTree/conversion.py:286 InvenTree/conversion.py:300 #: InvenTree/helpers.py:597 order/models.py:720 order/models.py:1015 msgid "Invalid quantity provided" msgstr "" @@ -116,7 +116,7 @@ msgstr "" #: build/serializers.py:580 build/serializers.py:1788 company/models.py:857 #: order/models.py:1780 #: report/templates/report/inventree_build_order_report.html:172 -#: stock/models.py:2848 stock/models.py:2972 stock/serializers.py:717 +#: stock/models.py:2865 stock/models.py:2989 stock/serializers.py:717 #: stock/serializers.py:893 stock/serializers.py:1035 stock/serializers.py:1336 #: stock/serializers.py:1425 stock/serializers.py:1624 msgid "Notes" @@ -345,7 +345,7 @@ msgstr "" msgid "Currency" msgstr "" -#: InvenTree/serializers.py:298 part/serializers.py:1385 +#: InvenTree/serializers.py:298 part/serializers.py:1357 msgid "Select currency from available options" msgstr "" @@ -553,14 +553,14 @@ msgstr "" #: build/api.py:100 build/api.py:466 build/api.py:845 build/models.py:270 #: build/serializers.py:1225 build/serializers.py:1356 -#: build/serializers.py:1427 company/models.py:1067 company/serializers.py:445 +#: build/serializers.py:1427 company/models.py:1067 company/serializers.py:491 #: order/api.py:298 order/api.py:302 order/api.py:929 order/api.py:1187 #: order/api.py:1190 order/models.py:1941 order/models.py:2108 #: order/models.py:2109 part/api.py:1233 part/api.py:1236 part/api.py:1302 #: part/api.py:1589 part/models.py:472 part/models.py:3296 part/models.py:3439 #: part/models.py:3497 part/models.py:3518 part/models.py:3540 #: part/models.py:3679 part/models.py:4046 part/models.py:4368 -#: part/models.py:4787 part/serializers.py:1928 +#: part/models.py:4787 part/serializers.py:1900 #: report/templates/report/inventree_bill_of_materials_report.html:110 #: report/templates/report/inventree_bill_of_materials_report.html:137 #: report/templates/report/inventree_build_order_report.html:109 @@ -582,7 +582,7 @@ msgstr "" #: build/api.py:120 build/api.py:123 build/serializers.py:1438 part/api.py:980 #: part/api.py:1316 part/api.py:1600 part/models.py:1080 part/models.py:3568 -#: part/models.py:4162 part/serializers.py:1752 stock/api.py:869 +#: part/models.py:4162 part/serializers.py:1724 stock/api.py:869 msgid "Category" msgstr "" @@ -663,7 +663,7 @@ msgid "Optional" msgstr "" #: build/api.py:455 build/serializers.py:1415 common/setting/system.py:456 -#: part/models.py:1202 part/serializers.py:1714 part/serializers.py:1725 +#: part/models.py:1202 part/serializers.py:1686 part/serializers.py:1697 #: stock/api.py:639 msgid "Assembly" msgstr "" @@ -688,16 +688,16 @@ msgstr "" msgid "Consumed" msgstr "" -#: build/api.py:499 company/models.py:912 company/serializers.py:440 +#: build/api.py:499 company/models.py:912 company/serializers.py:474 #: templates/email/build_order_required_stock.html:19 #: templates/email/low_stock_notification.html:17 #: templates/email/part_event_notification.html:18 msgid "Available" msgstr "" -#: build/api.py:523 build/serializers.py:1466 company/serializers.py:437 -#: order/serializers.py:1281 part/serializers.py:959 part/serializers.py:1306 -#: part/serializers.py:1761 +#: build/api.py:523 build/serializers.py:1466 company/serializers.py:471 +#: order/serializers.py:1281 part/serializers.py:931 part/serializers.py:1278 +#: part/serializers.py:1733 msgid "On Order" msgstr "" @@ -963,7 +963,7 @@ msgstr "" #: build/models.py:1136 build/models.py:1234 build/serializers.py:285 #: build/serializers.py:335 build/serializers.py:965 build/serializers.py:1739 #: order/models.py:717 order/serializers.py:658 order/serializers.py:844 -#: part/serializers.py:1708 stock/models.py:940 stock/models.py:1430 +#: part/serializers.py:1680 stock/models.py:940 stock/models.py:1430 #: stock/models.py:1878 stock/serializers.py:688 stock/serializers.py:1580 msgid "Quantity must be greater than zero" msgstr "" @@ -1385,20 +1385,20 @@ msgstr "" msgid "BOM Item" msgstr "" -#: build/serializers.py:1467 order/serializers.py:1282 part/serializers.py:1310 -#: part/serializers.py:1765 +#: build/serializers.py:1467 order/serializers.py:1282 part/serializers.py:1282 +#: part/serializers.py:1737 msgid "In Production" msgstr "" -#: build/serializers.py:1469 part/serializers.py:950 part/serializers.py:1314 +#: build/serializers.py:1469 part/serializers.py:922 part/serializers.py:1286 msgid "Scheduled to Build" msgstr "" -#: build/serializers.py:1472 part/serializers.py:987 +#: build/serializers.py:1472 part/serializers.py:959 msgid "External Stock" msgstr "" -#: build/serializers.py:1473 part/serializers.py:1300 part/serializers.py:1808 +#: build/serializers.py:1473 part/serializers.py:1272 part/serializers.py:1780 msgid "Available Stock" msgstr "" @@ -1588,7 +1588,7 @@ msgstr "" msgid "Price break quantity" msgstr "" -#: common/models.py:1348 company/serializers.py:564 order/models.py:1842 +#: common/models.py:1348 company/serializers.py:357 order/models.py:1842 #: order/models.py:3043 msgid "Price" msgstr "" @@ -1760,7 +1760,7 @@ msgstr "" msgid "Unit definition" msgstr "" -#: common/models.py:1911 common/models.py:1974 stock/models.py:2967 +#: common/models.py:1911 common/models.py:1974 stock/models.py:2984 #: stock/serializers.py:247 msgid "Attachment" msgstr "" @@ -1839,7 +1839,7 @@ msgstr "" #: common/models.py:2090 common/models.py:2329 company/models.py:622 #: machine/serializers.py:27 -#: report/templates/report/inventree_test_report.html:104 stock/models.py:2959 +#: report/templates/report/inventree_test_report.html:104 stock/models.py:2976 msgid "Value" msgstr "" @@ -2048,7 +2048,7 @@ msgid "Response data from the barcode scan" msgstr "" #: common/models.py:2417 report/templates/report/inventree_test_report.html:103 -#: stock/models.py:2953 +#: stock/models.py:2970 msgid "Result" msgstr "" @@ -2141,7 +2141,7 @@ msgid "Linked thread for this message" msgstr "" #: common/models.py:2656 -msgid "Prioriy" +msgid "Priority" msgstr "" #: common/models.py:2698 @@ -2671,8 +2671,8 @@ msgstr "" msgid "Parts can be assembled from other components by default" msgstr "" -#: common/setting/system.py:462 part/models.py:1208 part/serializers.py:1734 -#: part/serializers.py:1741 +#: common/setting/system.py:462 part/models.py:1208 part/serializers.py:1706 +#: part/serializers.py:1713 msgid "Component" msgstr "" @@ -3772,7 +3772,7 @@ msgstr "" msgid "Supplier is Active" msgstr "" -#: company/api.py:307 company/models.py:520 company/serializers.py:457 +#: company/api.py:307 company/models.py:520 company/serializers.py:503 #: part/serializers.py:566 msgid "Manufacturer" msgstr "" @@ -3964,7 +3964,7 @@ msgid "Link to address information (external)" msgstr "" #: company/models.py:492 company/models.py:609 company/models.py:832 -#: company/serializers.py:471 stock/api.py:561 +#: company/serializers.py:517 stock/api.py:561 msgid "Manufacturer Part" msgstr "" @@ -3981,7 +3981,7 @@ msgstr "" msgid "Select manufacturer" msgstr "" -#: company/models.py:527 company/serializers.py:479 order/serializers.py:734 +#: company/models.py:527 company/serializers.py:525 order/serializers.py:734 #: part/serializers.py:576 msgid "MPN" msgstr "" @@ -4030,7 +4030,7 @@ msgstr "" msgid "Linked manufacturer part must reference the same base part" msgstr "" -#: company/models.py:810 company/serializers.py:449 company/serializers.py:467 +#: company/models.py:810 company/serializers.py:495 company/serializers.py:513 #: order/models.py:639 part/serializers.py:550 #: plugin/builtin/suppliers/digikey.py:26 plugin/builtin/suppliers/lcsc.py:27 #: plugin/builtin/suppliers/mouser.py:25 plugin/builtin/suppliers/tme.py:27 @@ -4134,10 +4134,14 @@ msgstr "" msgid "Company Name" msgstr "" -#: company/serializers.py:433 part/serializers.py:955 stock/serializers.py:428 +#: company/serializers.py:467 part/serializers.py:927 stock/serializers.py:428 msgid "In Stock" msgstr "" +#: company/serializers.py:484 +msgid "Price Breaks" +msgstr "" + #: data_exporter/mixins.py:325 data_exporter/mixins.py:403 msgid "Error occurred during data export" msgstr "" @@ -4290,7 +4294,7 @@ msgstr "" msgid "Errors" msgstr "" -#: importer/models.py:550 part/serializers.py:1268 +#: importer/models.py:550 part/serializers.py:1240 msgid "Valid" msgstr "" @@ -5677,7 +5681,7 @@ msgstr "" msgid "Part category" msgstr "" -#: part/models.py:1088 part/serializers.py:929 +#: part/models.py:1088 part/serializers.py:901 #: report/templates/report/inventree_stock_location_report.html:103 msgid "IPN" msgstr "" @@ -5718,7 +5722,7 @@ msgstr "" msgid "Expiry time (in days) for stock items of this part" msgstr "" -#: part/models.py:1186 part/serializers.py:1003 +#: part/models.py:1186 part/serializers.py:975 msgid "Minimum Stock" msgstr "" @@ -6418,203 +6422,203 @@ msgstr "" msgid "Supplier part matching this SKU already exists" msgstr "" -#: part/serializers.py:914 +#: part/serializers.py:886 msgid "Category Name" msgstr "" -#: part/serializers.py:943 +#: part/serializers.py:915 msgid "Building" msgstr "" -#: part/serializers.py:944 +#: part/serializers.py:916 msgid "Quantity of this part currently being in production" msgstr "" -#: part/serializers.py:951 +#: part/serializers.py:923 msgid "Outstanding quantity of this part scheduled to be built" msgstr "" -#: part/serializers.py:971 stock/serializers.py:1019 stock/serializers.py:1189 +#: part/serializers.py:943 stock/serializers.py:1019 stock/serializers.py:1189 #: users/ruleset.py:30 msgid "Stock Items" msgstr "" -#: part/serializers.py:975 +#: part/serializers.py:947 msgid "Revisions" msgstr "" -#: part/serializers.py:979 +#: part/serializers.py:951 msgid "Suppliers" msgstr "" -#: part/serializers.py:983 part/serializers.py:1297 +#: part/serializers.py:955 part/serializers.py:1269 #: templates/email/low_stock_notification.html:16 #: templates/email/part_event_notification.html:17 msgid "Total Stock" msgstr "" -#: part/serializers.py:991 +#: part/serializers.py:963 msgid "Unallocated Stock" msgstr "" -#: part/serializers.py:999 +#: part/serializers.py:971 msgid "Variant Stock" msgstr "" -#: part/serializers.py:1054 +#: part/serializers.py:1026 msgid "Duplicate Part" msgstr "" -#: part/serializers.py:1055 +#: part/serializers.py:1027 msgid "Copy initial data from another Part" msgstr "" -#: part/serializers.py:1061 +#: part/serializers.py:1033 msgid "Initial Stock" msgstr "" -#: part/serializers.py:1062 +#: part/serializers.py:1034 msgid "Create Part with initial stock quantity" msgstr "" -#: part/serializers.py:1068 +#: part/serializers.py:1040 msgid "Supplier Information" msgstr "" -#: part/serializers.py:1069 +#: part/serializers.py:1041 msgid "Add initial supplier information for this part" msgstr "" -#: part/serializers.py:1077 +#: part/serializers.py:1049 msgid "Copy Category Parameters" msgstr "" -#: part/serializers.py:1078 +#: part/serializers.py:1050 msgid "Copy parameter templates from selected part category" msgstr "" -#: part/serializers.py:1083 +#: part/serializers.py:1055 msgid "Existing Image" msgstr "" -#: part/serializers.py:1084 +#: part/serializers.py:1056 msgid "Filename of an existing part image" msgstr "" -#: part/serializers.py:1101 +#: part/serializers.py:1073 msgid "Image file does not exist" msgstr "" -#: part/serializers.py:1269 +#: part/serializers.py:1241 msgid "Validate entire Bill of Materials" msgstr "" -#: part/serializers.py:1303 part/serializers.py:1769 +#: part/serializers.py:1275 part/serializers.py:1741 msgid "Can Build" msgstr "" -#: part/serializers.py:1320 +#: part/serializers.py:1292 msgid "Required for Build Orders" msgstr "" -#: part/serializers.py:1325 +#: part/serializers.py:1297 msgid "Allocated to Build Orders" msgstr "" -#: part/serializers.py:1332 +#: part/serializers.py:1304 msgid "Required for Sales Orders" msgstr "" -#: part/serializers.py:1336 +#: part/serializers.py:1308 msgid "Allocated to Sales Orders" msgstr "" -#: part/serializers.py:1475 +#: part/serializers.py:1447 msgid "Minimum Price" msgstr "" -#: part/serializers.py:1476 +#: part/serializers.py:1448 msgid "Override calculated value for minimum price" msgstr "" -#: part/serializers.py:1483 +#: part/serializers.py:1455 msgid "Minimum price currency" msgstr "" -#: part/serializers.py:1490 +#: part/serializers.py:1462 msgid "Maximum Price" msgstr "" -#: part/serializers.py:1491 +#: part/serializers.py:1463 msgid "Override calculated value for maximum price" msgstr "" -#: part/serializers.py:1498 +#: part/serializers.py:1470 msgid "Maximum price currency" msgstr "" -#: part/serializers.py:1527 +#: part/serializers.py:1499 msgid "Update" msgstr "" -#: part/serializers.py:1528 +#: part/serializers.py:1500 msgid "Update pricing for this part" msgstr "" -#: part/serializers.py:1551 +#: part/serializers.py:1523 #, python-brace-format msgid "Could not convert from provided currencies to {default_currency}" msgstr "" -#: part/serializers.py:1558 +#: part/serializers.py:1530 msgid "Minimum price must not be greater than maximum price" msgstr "" -#: part/serializers.py:1561 +#: part/serializers.py:1533 msgid "Maximum price must not be less than minimum price" msgstr "" -#: part/serializers.py:1715 +#: part/serializers.py:1687 msgid "Select the parent assembly" msgstr "" -#: part/serializers.py:1735 +#: part/serializers.py:1707 msgid "Select the component part" msgstr "" -#: part/serializers.py:1929 +#: part/serializers.py:1901 msgid "Select part to copy BOM from" msgstr "" -#: part/serializers.py:1937 +#: part/serializers.py:1909 msgid "Remove Existing Data" msgstr "" -#: part/serializers.py:1938 +#: part/serializers.py:1910 msgid "Remove existing BOM items before copying" msgstr "" -#: part/serializers.py:1943 +#: part/serializers.py:1915 msgid "Include Inherited" msgstr "" -#: part/serializers.py:1944 +#: part/serializers.py:1916 msgid "Include BOM items which are inherited from templated parts" msgstr "" -#: part/serializers.py:1949 +#: part/serializers.py:1921 msgid "Skip Invalid Rows" msgstr "" -#: part/serializers.py:1950 +#: part/serializers.py:1922 msgid "Enable this option to skip invalid rows" msgstr "" -#: part/serializers.py:1955 +#: part/serializers.py:1927 msgid "Copy Substitute Parts" msgstr "" -#: part/serializers.py:1956 +#: part/serializers.py:1928 msgid "Copy substitute parts when duplicate BOM items" msgstr "" @@ -8455,115 +8459,119 @@ msgstr "" msgid "Quantity does not match serial numbers" msgstr "" -#: stock/models.py:2012 stock/models.py:2917 +#: stock/models.py:1912 +msgid "Cannot assign stock to structural location" +msgstr "" + +#: stock/models.py:2029 stock/models.py:2934 msgid "Test template does not exist" msgstr "" -#: stock/models.py:2030 +#: stock/models.py:2047 msgid "Stock item has been assigned to a sales order" msgstr "" -#: stock/models.py:2034 +#: stock/models.py:2051 msgid "Stock item is installed in another item" msgstr "" -#: stock/models.py:2037 +#: stock/models.py:2054 msgid "Stock item contains other items" msgstr "" -#: stock/models.py:2040 +#: stock/models.py:2057 msgid "Stock item has been assigned to a customer" msgstr "" -#: stock/models.py:2043 stock/models.py:2226 +#: stock/models.py:2060 stock/models.py:2243 msgid "Stock item is currently in production" msgstr "" -#: stock/models.py:2046 +#: stock/models.py:2063 msgid "Serialized stock cannot be merged" msgstr "" -#: stock/models.py:2053 stock/serializers.py:1462 +#: stock/models.py:2070 stock/serializers.py:1462 msgid "Duplicate stock items" msgstr "" -#: stock/models.py:2057 +#: stock/models.py:2074 msgid "Stock items must refer to the same part" msgstr "" -#: stock/models.py:2065 +#: stock/models.py:2082 msgid "Stock items must refer to the same supplier part" msgstr "" -#: stock/models.py:2070 +#: stock/models.py:2087 msgid "Stock status codes must match" msgstr "" -#: stock/models.py:2349 +#: stock/models.py:2366 msgid "StockItem cannot be moved as it is not in stock" msgstr "" -#: stock/models.py:2818 +#: stock/models.py:2835 msgid "Stock Item Tracking" msgstr "" -#: stock/models.py:2849 +#: stock/models.py:2866 msgid "Entry notes" msgstr "" -#: stock/models.py:2889 +#: stock/models.py:2906 msgid "Stock Item Test Result" msgstr "" -#: stock/models.py:2920 +#: stock/models.py:2937 msgid "Value must be provided for this test" msgstr "" -#: stock/models.py:2924 +#: stock/models.py:2941 msgid "Attachment must be uploaded for this test" msgstr "" -#: stock/models.py:2929 +#: stock/models.py:2946 msgid "Invalid value for this test" msgstr "" -#: stock/models.py:2953 +#: stock/models.py:2970 msgid "Test result" msgstr "" -#: stock/models.py:2960 +#: stock/models.py:2977 msgid "Test output value" msgstr "" -#: stock/models.py:2968 stock/serializers.py:248 +#: stock/models.py:2985 stock/serializers.py:248 msgid "Test result attachment" msgstr "" -#: stock/models.py:2972 +#: stock/models.py:2989 msgid "Test notes" msgstr "" -#: stock/models.py:2980 +#: stock/models.py:2997 msgid "Test station" msgstr "" -#: stock/models.py:2981 +#: stock/models.py:2998 msgid "The identifier of the test station where the test was performed" msgstr "" -#: stock/models.py:2987 +#: stock/models.py:3004 msgid "Started" msgstr "" -#: stock/models.py:2988 +#: stock/models.py:3005 msgid "The timestamp of the test start" msgstr "" -#: stock/models.py:2994 +#: stock/models.py:3011 msgid "Finished" msgstr "" -#: stock/models.py:2995 +#: stock/models.py:3012 msgid "The timestamp of the test finish" msgstr "" @@ -8902,83 +8910,87 @@ msgstr "" msgid "Stock manually removed" msgstr "" -#: stock/status_codes.py:57 +#: stock/status_codes.py:56 +msgid "Serialized stock items" +msgstr "" + +#: stock/status_codes.py:58 msgid "Returned to stock" msgstr "" -#: stock/status_codes.py:60 +#: stock/status_codes.py:61 msgid "Location changed" msgstr "" -#: stock/status_codes.py:61 +#: stock/status_codes.py:62 msgid "Stock updated" msgstr "" -#: stock/status_codes.py:64 +#: stock/status_codes.py:65 msgid "Installed into assembly" msgstr "" -#: stock/status_codes.py:65 +#: stock/status_codes.py:66 msgid "Removed from assembly" msgstr "" -#: stock/status_codes.py:67 +#: stock/status_codes.py:68 msgid "Installed component item" msgstr "" -#: stock/status_codes.py:68 +#: stock/status_codes.py:69 msgid "Removed component item" msgstr "" -#: stock/status_codes.py:71 +#: stock/status_codes.py:72 msgid "Split from parent item" msgstr "" -#: stock/status_codes.py:72 +#: stock/status_codes.py:73 msgid "Split child item" msgstr "" -#: stock/status_codes.py:75 +#: stock/status_codes.py:76 msgid "Merged stock items" msgstr "" -#: stock/status_codes.py:78 +#: stock/status_codes.py:79 msgid "Converted to variant" msgstr "" -#: stock/status_codes.py:81 +#: stock/status_codes.py:82 msgid "Build order output created" msgstr "" -#: stock/status_codes.py:82 +#: stock/status_codes.py:83 msgid "Build order output completed" msgstr "" -#: stock/status_codes.py:83 +#: stock/status_codes.py:84 msgid "Build order output rejected" msgstr "" -#: stock/status_codes.py:84 +#: stock/status_codes.py:85 msgid "Consumed by build order" msgstr "" -#: stock/status_codes.py:87 +#: stock/status_codes.py:88 msgid "Shipped against Sales Order" msgstr "" -#: stock/status_codes.py:90 +#: stock/status_codes.py:91 msgid "Received against Purchase Order" msgstr "" -#: stock/status_codes.py:93 +#: stock/status_codes.py:94 msgid "Returned against Return Order" msgstr "" -#: stock/status_codes.py:96 +#: stock/status_codes.py:97 msgid "Sent to customer" msgstr "" -#: stock/status_codes.py:97 +#: stock/status_codes.py:98 msgid "Returned from customer" msgstr "" diff --git a/src/backend/InvenTree/locale/sl/LC_MESSAGES/django.po b/src/backend/InvenTree/locale/sl/LC_MESSAGES/django.po index 06f0cdb85e..22717091a1 100644 --- a/src/backend/InvenTree/locale/sl/LC_MESSAGES/django.po +++ b/src/backend/InvenTree/locale/sl/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: inventree\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-11-19 04:55+0000\n" -"PO-Revision-Date: 2025-11-19 04:59\n" +"POT-Creation-Date: 2025-11-24 06:50+0000\n" +"PO-Revision-Date: 2025-11-24 06:54\n" "Last-Translator: \n" "Language-Team: Slovenian\n" "Language: sl_SI\n" @@ -81,21 +81,21 @@ msgstr "Podana epošta ni veljavna." msgid "The provided email domain is not approved." msgstr "Domena epošte ni podprta." -#: InvenTree/conversion.py:166 +#: InvenTree/conversion.py:240 #, python-brace-format msgid "Invalid unit provided ({unit})" msgstr "Vnesena napačna enota ({unit})" -#: InvenTree/conversion.py:183 +#: InvenTree/conversion.py:257 msgid "No value provided" msgstr "Vrednost ni vnesena" -#: InvenTree/conversion.py:210 +#: InvenTree/conversion.py:284 #, python-brace-format msgid "Could not convert {original} to {unit}" msgstr "Ni mogoče pretvoriti {original} v {unit}" -#: InvenTree/conversion.py:212 InvenTree/conversion.py:226 +#: InvenTree/conversion.py:286 InvenTree/conversion.py:300 #: InvenTree/helpers.py:597 order/models.py:720 order/models.py:1015 msgid "Invalid quantity provided" msgstr "Podana napačna količina" @@ -116,7 +116,7 @@ msgstr "" #: build/serializers.py:580 build/serializers.py:1788 company/models.py:857 #: order/models.py:1780 #: report/templates/report/inventree_build_order_report.html:172 -#: stock/models.py:2848 stock/models.py:2972 stock/serializers.py:717 +#: stock/models.py:2865 stock/models.py:2989 stock/serializers.py:717 #: stock/serializers.py:893 stock/serializers.py:1035 stock/serializers.py:1336 #: stock/serializers.py:1425 stock/serializers.py:1624 msgid "Notes" @@ -345,7 +345,7 @@ msgstr "Mora biti veljavna številka" msgid "Currency" msgstr "Valuta" -#: InvenTree/serializers.py:298 part/serializers.py:1385 +#: InvenTree/serializers.py:298 part/serializers.py:1357 msgid "Select currency from available options" msgstr "Izberite valuto med razpoložljivimi možnostmi" @@ -553,14 +553,14 @@ msgstr "" #: build/api.py:100 build/api.py:466 build/api.py:845 build/models.py:270 #: build/serializers.py:1225 build/serializers.py:1356 -#: build/serializers.py:1427 company/models.py:1067 company/serializers.py:445 +#: build/serializers.py:1427 company/models.py:1067 company/serializers.py:491 #: order/api.py:298 order/api.py:302 order/api.py:929 order/api.py:1187 #: order/api.py:1190 order/models.py:1941 order/models.py:2108 #: order/models.py:2109 part/api.py:1233 part/api.py:1236 part/api.py:1302 #: part/api.py:1589 part/models.py:472 part/models.py:3296 part/models.py:3439 #: part/models.py:3497 part/models.py:3518 part/models.py:3540 #: part/models.py:3679 part/models.py:4046 part/models.py:4368 -#: part/models.py:4787 part/serializers.py:1928 +#: part/models.py:4787 part/serializers.py:1900 #: report/templates/report/inventree_bill_of_materials_report.html:110 #: report/templates/report/inventree_bill_of_materials_report.html:137 #: report/templates/report/inventree_build_order_report.html:109 @@ -582,7 +582,7 @@ msgstr "Del" #: build/api.py:120 build/api.py:123 build/serializers.py:1438 part/api.py:980 #: part/api.py:1316 part/api.py:1600 part/models.py:1080 part/models.py:3568 -#: part/models.py:4162 part/serializers.py:1752 stock/api.py:869 +#: part/models.py:4162 part/serializers.py:1724 stock/api.py:869 msgid "Category" msgstr "" @@ -663,7 +663,7 @@ msgid "Optional" msgstr "Neobvezno" #: build/api.py:455 build/serializers.py:1415 common/setting/system.py:456 -#: part/models.py:1202 part/serializers.py:1714 part/serializers.py:1725 +#: part/models.py:1202 part/serializers.py:1686 part/serializers.py:1697 #: stock/api.py:639 msgid "Assembly" msgstr "Montaža" @@ -688,16 +688,16 @@ msgstr "Dodeljeno" msgid "Consumed" msgstr "" -#: build/api.py:499 company/models.py:912 company/serializers.py:440 +#: build/api.py:499 company/models.py:912 company/serializers.py:474 #: templates/email/build_order_required_stock.html:19 #: templates/email/low_stock_notification.html:17 #: templates/email/part_event_notification.html:18 msgid "Available" msgstr "Na voljo" -#: build/api.py:523 build/serializers.py:1466 company/serializers.py:437 -#: order/serializers.py:1281 part/serializers.py:959 part/serializers.py:1306 -#: part/serializers.py:1761 +#: build/api.py:523 build/serializers.py:1466 company/serializers.py:471 +#: order/serializers.py:1281 part/serializers.py:931 part/serializers.py:1278 +#: part/serializers.py:1733 msgid "On Order" msgstr "" @@ -963,7 +963,7 @@ msgstr "Izgradnja se ne ujema s nalogom izdelave" #: build/models.py:1136 build/models.py:1234 build/serializers.py:285 #: build/serializers.py:335 build/serializers.py:965 build/serializers.py:1739 #: order/models.py:717 order/serializers.py:658 order/serializers.py:844 -#: part/serializers.py:1708 stock/models.py:940 stock/models.py:1430 +#: part/serializers.py:1680 stock/models.py:940 stock/models.py:1430 #: stock/models.py:1878 stock/serializers.py:688 stock/serializers.py:1580 msgid "Quantity must be greater than zero" msgstr "" @@ -1385,20 +1385,20 @@ msgstr "" msgid "BOM Item" msgstr "" -#: build/serializers.py:1467 order/serializers.py:1282 part/serializers.py:1310 -#: part/serializers.py:1765 +#: build/serializers.py:1467 order/serializers.py:1282 part/serializers.py:1282 +#: part/serializers.py:1737 msgid "In Production" msgstr "" -#: build/serializers.py:1469 part/serializers.py:950 part/serializers.py:1314 +#: build/serializers.py:1469 part/serializers.py:922 part/serializers.py:1286 msgid "Scheduled to Build" msgstr "" -#: build/serializers.py:1472 part/serializers.py:987 +#: build/serializers.py:1472 part/serializers.py:959 msgid "External Stock" msgstr "" -#: build/serializers.py:1473 part/serializers.py:1300 part/serializers.py:1808 +#: build/serializers.py:1473 part/serializers.py:1272 part/serializers.py:1780 msgid "Available Stock" msgstr "" @@ -1588,7 +1588,7 @@ msgstr "Uporabnik" msgid "Price break quantity" msgstr "" -#: common/models.py:1348 company/serializers.py:564 order/models.py:1842 +#: common/models.py:1348 company/serializers.py:357 order/models.py:1842 #: order/models.py:3043 msgid "Price" msgstr "" @@ -1760,7 +1760,7 @@ msgstr "" msgid "Unit definition" msgstr "" -#: common/models.py:1911 common/models.py:1974 stock/models.py:2967 +#: common/models.py:1911 common/models.py:1974 stock/models.py:2984 #: stock/serializers.py:247 msgid "Attachment" msgstr "Priloga" @@ -1839,7 +1839,7 @@ msgstr "" #: common/models.py:2090 common/models.py:2329 company/models.py:622 #: machine/serializers.py:27 -#: report/templates/report/inventree_test_report.html:104 stock/models.py:2959 +#: report/templates/report/inventree_test_report.html:104 stock/models.py:2976 msgid "Value" msgstr "" @@ -2048,7 +2048,7 @@ msgid "Response data from the barcode scan" msgstr "" #: common/models.py:2417 report/templates/report/inventree_test_report.html:103 -#: stock/models.py:2953 +#: stock/models.py:2970 msgid "Result" msgstr "" @@ -2141,7 +2141,7 @@ msgid "Linked thread for this message" msgstr "" #: common/models.py:2656 -msgid "Prioriy" +msgid "Priority" msgstr "" #: common/models.py:2698 @@ -2671,8 +2671,8 @@ msgstr "" msgid "Parts can be assembled from other components by default" msgstr "" -#: common/setting/system.py:462 part/models.py:1208 part/serializers.py:1734 -#: part/serializers.py:1741 +#: common/setting/system.py:462 part/models.py:1208 part/serializers.py:1706 +#: part/serializers.py:1713 msgid "Component" msgstr "" @@ -3772,7 +3772,7 @@ msgstr "" msgid "Supplier is Active" msgstr "" -#: company/api.py:307 company/models.py:520 company/serializers.py:457 +#: company/api.py:307 company/models.py:520 company/serializers.py:503 #: part/serializers.py:566 msgid "Manufacturer" msgstr "" @@ -3964,7 +3964,7 @@ msgid "Link to address information (external)" msgstr "" #: company/models.py:492 company/models.py:609 company/models.py:832 -#: company/serializers.py:471 stock/api.py:561 +#: company/serializers.py:517 stock/api.py:561 msgid "Manufacturer Part" msgstr "" @@ -3981,7 +3981,7 @@ msgstr "" msgid "Select manufacturer" msgstr "" -#: company/models.py:527 company/serializers.py:479 order/serializers.py:734 +#: company/models.py:527 company/serializers.py:525 order/serializers.py:734 #: part/serializers.py:576 msgid "MPN" msgstr "" @@ -4030,7 +4030,7 @@ msgstr "" msgid "Linked manufacturer part must reference the same base part" msgstr "" -#: company/models.py:810 company/serializers.py:449 company/serializers.py:467 +#: company/models.py:810 company/serializers.py:495 company/serializers.py:513 #: order/models.py:639 part/serializers.py:550 #: plugin/builtin/suppliers/digikey.py:26 plugin/builtin/suppliers/lcsc.py:27 #: plugin/builtin/suppliers/mouser.py:25 plugin/builtin/suppliers/tme.py:27 @@ -4134,10 +4134,14 @@ msgstr "" msgid "Company Name" msgstr "" -#: company/serializers.py:433 part/serializers.py:955 stock/serializers.py:428 +#: company/serializers.py:467 part/serializers.py:927 stock/serializers.py:428 msgid "In Stock" msgstr "" +#: company/serializers.py:484 +msgid "Price Breaks" +msgstr "" + #: data_exporter/mixins.py:325 data_exporter/mixins.py:403 msgid "Error occurred during data export" msgstr "" @@ -4290,7 +4294,7 @@ msgstr "" msgid "Errors" msgstr "" -#: importer/models.py:550 part/serializers.py:1268 +#: importer/models.py:550 part/serializers.py:1240 msgid "Valid" msgstr "" @@ -5677,7 +5681,7 @@ msgstr "" msgid "Part category" msgstr "" -#: part/models.py:1088 part/serializers.py:929 +#: part/models.py:1088 part/serializers.py:901 #: report/templates/report/inventree_stock_location_report.html:103 msgid "IPN" msgstr "" @@ -5718,7 +5722,7 @@ msgstr "" msgid "Expiry time (in days) for stock items of this part" msgstr "" -#: part/models.py:1186 part/serializers.py:1003 +#: part/models.py:1186 part/serializers.py:975 msgid "Minimum Stock" msgstr "" @@ -6418,203 +6422,203 @@ msgstr "" msgid "Supplier part matching this SKU already exists" msgstr "" -#: part/serializers.py:914 +#: part/serializers.py:886 msgid "Category Name" msgstr "" -#: part/serializers.py:943 +#: part/serializers.py:915 msgid "Building" msgstr "" -#: part/serializers.py:944 +#: part/serializers.py:916 msgid "Quantity of this part currently being in production" msgstr "" -#: part/serializers.py:951 +#: part/serializers.py:923 msgid "Outstanding quantity of this part scheduled to be built" msgstr "" -#: part/serializers.py:971 stock/serializers.py:1019 stock/serializers.py:1189 +#: part/serializers.py:943 stock/serializers.py:1019 stock/serializers.py:1189 #: users/ruleset.py:30 msgid "Stock Items" msgstr "" -#: part/serializers.py:975 +#: part/serializers.py:947 msgid "Revisions" msgstr "" -#: part/serializers.py:979 +#: part/serializers.py:951 msgid "Suppliers" msgstr "" -#: part/serializers.py:983 part/serializers.py:1297 +#: part/serializers.py:955 part/serializers.py:1269 #: templates/email/low_stock_notification.html:16 #: templates/email/part_event_notification.html:17 msgid "Total Stock" msgstr "" -#: part/serializers.py:991 +#: part/serializers.py:963 msgid "Unallocated Stock" msgstr "" -#: part/serializers.py:999 +#: part/serializers.py:971 msgid "Variant Stock" msgstr "" -#: part/serializers.py:1054 +#: part/serializers.py:1026 msgid "Duplicate Part" msgstr "" -#: part/serializers.py:1055 +#: part/serializers.py:1027 msgid "Copy initial data from another Part" msgstr "" -#: part/serializers.py:1061 +#: part/serializers.py:1033 msgid "Initial Stock" msgstr "" -#: part/serializers.py:1062 +#: part/serializers.py:1034 msgid "Create Part with initial stock quantity" msgstr "" -#: part/serializers.py:1068 +#: part/serializers.py:1040 msgid "Supplier Information" msgstr "" -#: part/serializers.py:1069 +#: part/serializers.py:1041 msgid "Add initial supplier information for this part" msgstr "" -#: part/serializers.py:1077 +#: part/serializers.py:1049 msgid "Copy Category Parameters" msgstr "" -#: part/serializers.py:1078 +#: part/serializers.py:1050 msgid "Copy parameter templates from selected part category" msgstr "" -#: part/serializers.py:1083 +#: part/serializers.py:1055 msgid "Existing Image" msgstr "" -#: part/serializers.py:1084 +#: part/serializers.py:1056 msgid "Filename of an existing part image" msgstr "" -#: part/serializers.py:1101 +#: part/serializers.py:1073 msgid "Image file does not exist" msgstr "" -#: part/serializers.py:1269 +#: part/serializers.py:1241 msgid "Validate entire Bill of Materials" msgstr "" -#: part/serializers.py:1303 part/serializers.py:1769 +#: part/serializers.py:1275 part/serializers.py:1741 msgid "Can Build" msgstr "" -#: part/serializers.py:1320 +#: part/serializers.py:1292 msgid "Required for Build Orders" msgstr "" -#: part/serializers.py:1325 +#: part/serializers.py:1297 msgid "Allocated to Build Orders" msgstr "" -#: part/serializers.py:1332 +#: part/serializers.py:1304 msgid "Required for Sales Orders" msgstr "" -#: part/serializers.py:1336 +#: part/serializers.py:1308 msgid "Allocated to Sales Orders" msgstr "" -#: part/serializers.py:1475 +#: part/serializers.py:1447 msgid "Minimum Price" msgstr "" -#: part/serializers.py:1476 +#: part/serializers.py:1448 msgid "Override calculated value for minimum price" msgstr "" -#: part/serializers.py:1483 +#: part/serializers.py:1455 msgid "Minimum price currency" msgstr "" -#: part/serializers.py:1490 +#: part/serializers.py:1462 msgid "Maximum Price" msgstr "" -#: part/serializers.py:1491 +#: part/serializers.py:1463 msgid "Override calculated value for maximum price" msgstr "" -#: part/serializers.py:1498 +#: part/serializers.py:1470 msgid "Maximum price currency" msgstr "" -#: part/serializers.py:1527 +#: part/serializers.py:1499 msgid "Update" msgstr "" -#: part/serializers.py:1528 +#: part/serializers.py:1500 msgid "Update pricing for this part" msgstr "" -#: part/serializers.py:1551 +#: part/serializers.py:1523 #, python-brace-format msgid "Could not convert from provided currencies to {default_currency}" msgstr "" -#: part/serializers.py:1558 +#: part/serializers.py:1530 msgid "Minimum price must not be greater than maximum price" msgstr "" -#: part/serializers.py:1561 +#: part/serializers.py:1533 msgid "Maximum price must not be less than minimum price" msgstr "" -#: part/serializers.py:1715 +#: part/serializers.py:1687 msgid "Select the parent assembly" msgstr "" -#: part/serializers.py:1735 +#: part/serializers.py:1707 msgid "Select the component part" msgstr "" -#: part/serializers.py:1929 +#: part/serializers.py:1901 msgid "Select part to copy BOM from" msgstr "" -#: part/serializers.py:1937 +#: part/serializers.py:1909 msgid "Remove Existing Data" msgstr "" -#: part/serializers.py:1938 +#: part/serializers.py:1910 msgid "Remove existing BOM items before copying" msgstr "" -#: part/serializers.py:1943 +#: part/serializers.py:1915 msgid "Include Inherited" msgstr "" -#: part/serializers.py:1944 +#: part/serializers.py:1916 msgid "Include BOM items which are inherited from templated parts" msgstr "" -#: part/serializers.py:1949 +#: part/serializers.py:1921 msgid "Skip Invalid Rows" msgstr "" -#: part/serializers.py:1950 +#: part/serializers.py:1922 msgid "Enable this option to skip invalid rows" msgstr "" -#: part/serializers.py:1955 +#: part/serializers.py:1927 msgid "Copy Substitute Parts" msgstr "" -#: part/serializers.py:1956 +#: part/serializers.py:1928 msgid "Copy substitute parts when duplicate BOM items" msgstr "" @@ -8455,115 +8459,119 @@ msgstr "" msgid "Quantity does not match serial numbers" msgstr "" -#: stock/models.py:2012 stock/models.py:2917 +#: stock/models.py:1912 +msgid "Cannot assign stock to structural location" +msgstr "" + +#: stock/models.py:2029 stock/models.py:2934 msgid "Test template does not exist" msgstr "" -#: stock/models.py:2030 +#: stock/models.py:2047 msgid "Stock item has been assigned to a sales order" msgstr "" -#: stock/models.py:2034 +#: stock/models.py:2051 msgid "Stock item is installed in another item" msgstr "" -#: stock/models.py:2037 +#: stock/models.py:2054 msgid "Stock item contains other items" msgstr "" -#: stock/models.py:2040 +#: stock/models.py:2057 msgid "Stock item has been assigned to a customer" msgstr "" -#: stock/models.py:2043 stock/models.py:2226 +#: stock/models.py:2060 stock/models.py:2243 msgid "Stock item is currently in production" msgstr "" -#: stock/models.py:2046 +#: stock/models.py:2063 msgid "Serialized stock cannot be merged" msgstr "" -#: stock/models.py:2053 stock/serializers.py:1462 +#: stock/models.py:2070 stock/serializers.py:1462 msgid "Duplicate stock items" msgstr "" -#: stock/models.py:2057 +#: stock/models.py:2074 msgid "Stock items must refer to the same part" msgstr "" -#: stock/models.py:2065 +#: stock/models.py:2082 msgid "Stock items must refer to the same supplier part" msgstr "" -#: stock/models.py:2070 +#: stock/models.py:2087 msgid "Stock status codes must match" msgstr "" -#: stock/models.py:2349 +#: stock/models.py:2366 msgid "StockItem cannot be moved as it is not in stock" msgstr "" -#: stock/models.py:2818 +#: stock/models.py:2835 msgid "Stock Item Tracking" msgstr "" -#: stock/models.py:2849 +#: stock/models.py:2866 msgid "Entry notes" msgstr "" -#: stock/models.py:2889 +#: stock/models.py:2906 msgid "Stock Item Test Result" msgstr "" -#: stock/models.py:2920 +#: stock/models.py:2937 msgid "Value must be provided for this test" msgstr "" -#: stock/models.py:2924 +#: stock/models.py:2941 msgid "Attachment must be uploaded for this test" msgstr "" -#: stock/models.py:2929 +#: stock/models.py:2946 msgid "Invalid value for this test" msgstr "" -#: stock/models.py:2953 +#: stock/models.py:2970 msgid "Test result" msgstr "" -#: stock/models.py:2960 +#: stock/models.py:2977 msgid "Test output value" msgstr "" -#: stock/models.py:2968 stock/serializers.py:248 +#: stock/models.py:2985 stock/serializers.py:248 msgid "Test result attachment" msgstr "" -#: stock/models.py:2972 +#: stock/models.py:2989 msgid "Test notes" msgstr "" -#: stock/models.py:2980 +#: stock/models.py:2997 msgid "Test station" msgstr "" -#: stock/models.py:2981 +#: stock/models.py:2998 msgid "The identifier of the test station where the test was performed" msgstr "" -#: stock/models.py:2987 +#: stock/models.py:3004 msgid "Started" msgstr "" -#: stock/models.py:2988 +#: stock/models.py:3005 msgid "The timestamp of the test start" msgstr "" -#: stock/models.py:2994 +#: stock/models.py:3011 msgid "Finished" msgstr "" -#: stock/models.py:2995 +#: stock/models.py:3012 msgid "The timestamp of the test finish" msgstr "" @@ -8902,83 +8910,87 @@ msgstr "Zaloga ročno dodana" msgid "Stock manually removed" msgstr "Zaloga ročno odstranjena" -#: stock/status_codes.py:57 +#: stock/status_codes.py:56 +msgid "Serialized stock items" +msgstr "" + +#: stock/status_codes.py:58 msgid "Returned to stock" msgstr "" -#: stock/status_codes.py:60 +#: stock/status_codes.py:61 msgid "Location changed" msgstr "Lokacija spremenjena" -#: stock/status_codes.py:61 +#: stock/status_codes.py:62 msgid "Stock updated" msgstr "Zaloga posodobljena" -#: stock/status_codes.py:64 +#: stock/status_codes.py:65 msgid "Installed into assembly" msgstr "Vstavljeno v sestavo" -#: stock/status_codes.py:65 +#: stock/status_codes.py:66 msgid "Removed from assembly" msgstr "Odstranjeno iz sestave" -#: stock/status_codes.py:67 +#: stock/status_codes.py:68 msgid "Installed component item" msgstr "Vstavljena postavka komponente" -#: stock/status_codes.py:68 +#: stock/status_codes.py:69 msgid "Removed component item" msgstr "Odstranjena postavka komponente" -#: stock/status_codes.py:71 +#: stock/status_codes.py:72 msgid "Split from parent item" msgstr "Razdeljena od nadrejene postavke" -#: stock/status_codes.py:72 +#: stock/status_codes.py:73 msgid "Split child item" msgstr "Razdeljena podrejena postavka" -#: stock/status_codes.py:75 +#: stock/status_codes.py:76 msgid "Merged stock items" msgstr "Združena zaloga postavk" -#: stock/status_codes.py:78 +#: stock/status_codes.py:79 msgid "Converted to variant" msgstr "Spremenjeno v varianto" -#: stock/status_codes.py:81 +#: stock/status_codes.py:82 msgid "Build order output created" msgstr "Nalog za izgradnjo ustvarjen" -#: stock/status_codes.py:82 +#: stock/status_codes.py:83 msgid "Build order output completed" msgstr "Nalog za izgradnjo končan" -#: stock/status_codes.py:83 +#: stock/status_codes.py:84 msgid "Build order output rejected" msgstr "Nalog za izgradnjo zavrnjen" -#: stock/status_codes.py:84 +#: stock/status_codes.py:85 msgid "Consumed by build order" msgstr "Porabljeno v nalogu za izgradnjo" -#: stock/status_codes.py:87 +#: stock/status_codes.py:88 msgid "Shipped against Sales Order" msgstr "Poslano preko prodajnega naročila" -#: stock/status_codes.py:90 +#: stock/status_codes.py:91 msgid "Received against Purchase Order" msgstr "Prejeto preko nabavnega naročila" -#: stock/status_codes.py:93 +#: stock/status_codes.py:94 msgid "Returned against Return Order" msgstr "Vrnjeno preko naročila za vračilo" -#: stock/status_codes.py:96 +#: stock/status_codes.py:97 msgid "Sent to customer" msgstr "Posalno stranki" -#: stock/status_codes.py:97 +#: stock/status_codes.py:98 msgid "Returned from customer" msgstr "Vrnjeno od stranke" diff --git a/src/backend/InvenTree/locale/sr/LC_MESSAGES/django.po b/src/backend/InvenTree/locale/sr/LC_MESSAGES/django.po index b228b827c8..f52da29927 100644 --- a/src/backend/InvenTree/locale/sr/LC_MESSAGES/django.po +++ b/src/backend/InvenTree/locale/sr/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: inventree\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-11-19 04:55+0000\n" -"PO-Revision-Date: 2025-11-19 04:59\n" +"POT-Creation-Date: 2025-11-24 06:50+0000\n" +"PO-Revision-Date: 2025-11-24 06:54\n" "Last-Translator: \n" "Language-Team: Serbian (Latin)\n" "Language: sr_CS\n" @@ -81,21 +81,21 @@ msgstr "Navedena primarna adresa e-pošte nije važeća." msgid "The provided email domain is not approved." msgstr "Navedeni domen adrese e-pošte nije prihvaćen." -#: InvenTree/conversion.py:166 +#: InvenTree/conversion.py:240 #, python-brace-format msgid "Invalid unit provided ({unit})" msgstr "Data je nevažeća jedinica ({unit})" -#: InvenTree/conversion.py:183 +#: InvenTree/conversion.py:257 msgid "No value provided" msgstr "Nije navedena vrednost" -#: InvenTree/conversion.py:210 +#: InvenTree/conversion.py:284 #, python-brace-format msgid "Could not convert {original} to {unit}" msgstr "Nije moguće konvertovati {original} u {unit}" -#: InvenTree/conversion.py:212 InvenTree/conversion.py:226 +#: InvenTree/conversion.py:286 InvenTree/conversion.py:300 #: InvenTree/helpers.py:597 order/models.py:720 order/models.py:1015 msgid "Invalid quantity provided" msgstr "Isporučena nevažeća količina" @@ -116,7 +116,7 @@ msgstr "Neispravna decimalna vrednost" #: build/serializers.py:580 build/serializers.py:1788 company/models.py:857 #: order/models.py:1780 #: report/templates/report/inventree_build_order_report.html:172 -#: stock/models.py:2848 stock/models.py:2972 stock/serializers.py:717 +#: stock/models.py:2865 stock/models.py:2989 stock/serializers.py:717 #: stock/serializers.py:893 stock/serializers.py:1035 stock/serializers.py:1336 #: stock/serializers.py:1425 stock/serializers.py:1624 msgid "Notes" @@ -345,7 +345,7 @@ msgstr "Mora biti važeći broj" msgid "Currency" msgstr "Valuta" -#: InvenTree/serializers.py:298 part/serializers.py:1385 +#: InvenTree/serializers.py:298 part/serializers.py:1357 msgid "Select currency from available options" msgstr "Odaberite valutu među dostupnim opcijama" @@ -553,14 +553,14 @@ msgstr "Uključi varijante" #: build/api.py:100 build/api.py:466 build/api.py:845 build/models.py:270 #: build/serializers.py:1225 build/serializers.py:1356 -#: build/serializers.py:1427 company/models.py:1067 company/serializers.py:445 +#: build/serializers.py:1427 company/models.py:1067 company/serializers.py:491 #: order/api.py:298 order/api.py:302 order/api.py:929 order/api.py:1187 #: order/api.py:1190 order/models.py:1941 order/models.py:2108 #: order/models.py:2109 part/api.py:1233 part/api.py:1236 part/api.py:1302 #: part/api.py:1589 part/models.py:472 part/models.py:3296 part/models.py:3439 #: part/models.py:3497 part/models.py:3518 part/models.py:3540 #: part/models.py:3679 part/models.py:4046 part/models.py:4368 -#: part/models.py:4787 part/serializers.py:1928 +#: part/models.py:4787 part/serializers.py:1900 #: report/templates/report/inventree_bill_of_materials_report.html:110 #: report/templates/report/inventree_bill_of_materials_report.html:137 #: report/templates/report/inventree_build_order_report.html:109 @@ -582,7 +582,7 @@ msgstr "Deo" #: build/api.py:120 build/api.py:123 build/serializers.py:1438 part/api.py:980 #: part/api.py:1316 part/api.py:1600 part/models.py:1080 part/models.py:3568 -#: part/models.py:4162 part/serializers.py:1752 stock/api.py:869 +#: part/models.py:4162 part/serializers.py:1724 stock/api.py:869 msgid "Category" msgstr "Kategorija" @@ -663,7 +663,7 @@ msgid "Optional" msgstr "Opciono" #: build/api.py:455 build/serializers.py:1415 common/setting/system.py:456 -#: part/models.py:1202 part/serializers.py:1714 part/serializers.py:1725 +#: part/models.py:1202 part/serializers.py:1686 part/serializers.py:1697 #: stock/api.py:639 msgid "Assembly" msgstr "Sklapanje" @@ -688,16 +688,16 @@ msgstr "Alocirano" msgid "Consumed" msgstr "" -#: build/api.py:499 company/models.py:912 company/serializers.py:440 +#: build/api.py:499 company/models.py:912 company/serializers.py:474 #: templates/email/build_order_required_stock.html:19 #: templates/email/low_stock_notification.html:17 #: templates/email/part_event_notification.html:18 msgid "Available" msgstr "Dostupno" -#: build/api.py:523 build/serializers.py:1466 company/serializers.py:437 -#: order/serializers.py:1281 part/serializers.py:959 part/serializers.py:1306 -#: part/serializers.py:1761 +#: build/api.py:523 build/serializers.py:1466 company/serializers.py:471 +#: order/serializers.py:1281 part/serializers.py:931 part/serializers.py:1278 +#: part/serializers.py:1733 msgid "On Order" msgstr "Po narudžbini" @@ -963,7 +963,7 @@ msgstr "Izlaz izgradnje se ne slaže sa Nalogom za izgradnju" #: build/models.py:1136 build/models.py:1234 build/serializers.py:285 #: build/serializers.py:335 build/serializers.py:965 build/serializers.py:1739 #: order/models.py:717 order/serializers.py:658 order/serializers.py:844 -#: part/serializers.py:1708 stock/models.py:940 stock/models.py:1430 +#: part/serializers.py:1680 stock/models.py:940 stock/models.py:1430 #: stock/models.py:1878 stock/serializers.py:688 stock/serializers.py:1580 msgid "Quantity must be greater than zero" msgstr "Količina mora biti veća od nule" @@ -1385,20 +1385,20 @@ msgstr "Dozvoli varijante" msgid "BOM Item" msgstr "BOM stavka" -#: build/serializers.py:1467 order/serializers.py:1282 part/serializers.py:1310 -#: part/serializers.py:1765 +#: build/serializers.py:1467 order/serializers.py:1282 part/serializers.py:1282 +#: part/serializers.py:1737 msgid "In Production" msgstr "U proizvodnji" -#: build/serializers.py:1469 part/serializers.py:950 part/serializers.py:1314 +#: build/serializers.py:1469 part/serializers.py:922 part/serializers.py:1286 msgid "Scheduled to Build" msgstr "" -#: build/serializers.py:1472 part/serializers.py:987 +#: build/serializers.py:1472 part/serializers.py:959 msgid "External Stock" msgstr "Spoljašnje zalihe" -#: build/serializers.py:1473 part/serializers.py:1300 part/serializers.py:1808 +#: build/serializers.py:1473 part/serializers.py:1272 part/serializers.py:1780 msgid "Available Stock" msgstr "Dostupne zalihe" @@ -1588,7 +1588,7 @@ msgstr "Korisnik" msgid "Price break quantity" msgstr "Prelomna količina cene" -#: common/models.py:1348 company/serializers.py:564 order/models.py:1842 +#: common/models.py:1348 company/serializers.py:357 order/models.py:1842 #: order/models.py:3043 msgid "Price" msgstr "Cena" @@ -1760,7 +1760,7 @@ msgstr "Definicija" msgid "Unit definition" msgstr "Definicija jedinice" -#: common/models.py:1911 common/models.py:1974 stock/models.py:2967 +#: common/models.py:1911 common/models.py:1974 stock/models.py:2984 #: stock/serializers.py:247 msgid "Attachment" msgstr "Prilog" @@ -1839,7 +1839,7 @@ msgstr "Stanje logičkog ključa je jednako posebnom ključu u poslovnoj logici" #: common/models.py:2090 common/models.py:2329 company/models.py:622 #: machine/serializers.py:27 -#: report/templates/report/inventree_test_report.html:104 stock/models.py:2959 +#: report/templates/report/inventree_test_report.html:104 stock/models.py:2976 msgid "Value" msgstr "Vrednost" @@ -2048,7 +2048,7 @@ msgid "Response data from the barcode scan" msgstr "Podaci odgovora za skeniranje bar koda" #: common/models.py:2417 report/templates/report/inventree_test_report.html:103 -#: stock/models.py:2953 +#: stock/models.py:2970 msgid "Result" msgstr "Rezultat" @@ -2141,7 +2141,7 @@ msgid "Linked thread for this message" msgstr "" #: common/models.py:2656 -msgid "Prioriy" +msgid "Priority" msgstr "" #: common/models.py:2698 @@ -2671,8 +2671,8 @@ msgstr "Podrazumevano je da su delovi šabloni" msgid "Parts can be assembled from other components by default" msgstr "Podrazumevano je da se delovi mogu sastavljati od drugih komponenti" -#: common/setting/system.py:462 part/models.py:1208 part/serializers.py:1734 -#: part/serializers.py:1741 +#: common/setting/system.py:462 part/models.py:1208 part/serializers.py:1706 +#: part/serializers.py:1713 msgid "Component" msgstr "Komponenta" @@ -3772,7 +3772,7 @@ msgstr "Interni deo je aktivan" msgid "Supplier is Active" msgstr "Dobavljač je aktivan" -#: company/api.py:307 company/models.py:520 company/serializers.py:457 +#: company/api.py:307 company/models.py:520 company/serializers.py:503 #: part/serializers.py:566 msgid "Manufacturer" msgstr "Proizvođač" @@ -3964,7 +3964,7 @@ msgid "Link to address information (external)" msgstr "Link za adresne informacije (eksterni)" #: company/models.py:492 company/models.py:609 company/models.py:832 -#: company/serializers.py:471 stock/api.py:561 +#: company/serializers.py:517 stock/api.py:561 msgid "Manufacturer Part" msgstr "Deo proizvođača" @@ -3981,7 +3981,7 @@ msgstr "Izaberi deo" msgid "Select manufacturer" msgstr "Izaberi proizvođača" -#: company/models.py:527 company/serializers.py:479 order/serializers.py:734 +#: company/models.py:527 company/serializers.py:525 order/serializers.py:734 #: part/serializers.py:576 msgid "MPN" msgstr "Broj dela proizvođača" @@ -4030,7 +4030,7 @@ msgstr "Jedinice pakovanja moraju biti veće od nule" msgid "Linked manufacturer part must reference the same base part" msgstr "Povezani delovi dobavljača moraju referencirati isti osnovni deo" -#: company/models.py:810 company/serializers.py:449 company/serializers.py:467 +#: company/models.py:810 company/serializers.py:495 company/serializers.py:513 #: order/models.py:639 part/serializers.py:550 #: plugin/builtin/suppliers/digikey.py:26 plugin/builtin/suppliers/lcsc.py:27 #: plugin/builtin/suppliers/mouser.py:25 plugin/builtin/suppliers/tme.py:27 @@ -4134,10 +4134,14 @@ msgstr "Podrazumevana valuta koja se koristi za ovog dobavljača" msgid "Company Name" msgstr "Naziv kompanije" -#: company/serializers.py:433 part/serializers.py:955 stock/serializers.py:428 +#: company/serializers.py:467 part/serializers.py:927 stock/serializers.py:428 msgid "In Stock" msgstr "Na zalihama" +#: company/serializers.py:484 +msgid "Price Breaks" +msgstr "" + #: data_exporter/mixins.py:325 data_exporter/mixins.py:403 msgid "Error occurred during data export" msgstr "" @@ -4290,7 +4294,7 @@ msgstr "Originalni podaci vrste" msgid "Errors" msgstr "Greške" -#: importer/models.py:550 part/serializers.py:1268 +#: importer/models.py:550 part/serializers.py:1240 msgid "Valid" msgstr "Važeće" @@ -5677,7 +5681,7 @@ msgstr "Ključne reči dela da bi se poboljšala vidljivost u rezultatima pretra msgid "Part category" msgstr "Kategorija dela" -#: part/models.py:1088 part/serializers.py:929 +#: part/models.py:1088 part/serializers.py:901 #: report/templates/report/inventree_stock_location_report.html:103 msgid "IPN" msgstr "Interni broj dela" @@ -5718,7 +5722,7 @@ msgstr "Podrazumevani istek" msgid "Expiry time (in days) for stock items of this part" msgstr "Vreme isteka (u danima) za stavke sa zaliha ovog dela" -#: part/models.py:1186 part/serializers.py:1003 +#: part/models.py:1186 part/serializers.py:975 msgid "Minimum Stock" msgstr "Minimalne zalihe" @@ -6418,203 +6422,203 @@ msgstr "Deo proizvođača koji se poklapa sa ovim brojem dela proizvođača već msgid "Supplier part matching this SKU already exists" msgstr "Deo dobavljača koji se opklapa sa ovim brojem dela dobavljača već postoji" -#: part/serializers.py:914 +#: part/serializers.py:886 msgid "Category Name" msgstr "Naziv kategorije" -#: part/serializers.py:943 +#: part/serializers.py:915 msgid "Building" msgstr "Izrađivanje" -#: part/serializers.py:944 +#: part/serializers.py:916 msgid "Quantity of this part currently being in production" msgstr "" -#: part/serializers.py:951 +#: part/serializers.py:923 msgid "Outstanding quantity of this part scheduled to be built" msgstr "" -#: part/serializers.py:971 stock/serializers.py:1019 stock/serializers.py:1189 +#: part/serializers.py:943 stock/serializers.py:1019 stock/serializers.py:1189 #: users/ruleset.py:30 msgid "Stock Items" msgstr "Stavke sa zaliha" -#: part/serializers.py:975 +#: part/serializers.py:947 msgid "Revisions" msgstr "Revizije" -#: part/serializers.py:979 +#: part/serializers.py:951 msgid "Suppliers" msgstr "Dobavljači" -#: part/serializers.py:983 part/serializers.py:1297 +#: part/serializers.py:955 part/serializers.py:1269 #: templates/email/low_stock_notification.html:16 #: templates/email/part_event_notification.html:17 msgid "Total Stock" msgstr "Ukupne zalihe" -#: part/serializers.py:991 +#: part/serializers.py:963 msgid "Unallocated Stock" msgstr "Nealocirane zalihe" -#: part/serializers.py:999 +#: part/serializers.py:971 msgid "Variant Stock" msgstr "Varijante zaliha" -#: part/serializers.py:1054 +#: part/serializers.py:1026 msgid "Duplicate Part" msgstr "Dupliraj deo" -#: part/serializers.py:1055 +#: part/serializers.py:1027 msgid "Copy initial data from another Part" msgstr "Kopiraj inicijalne podatke od drugog dela" -#: part/serializers.py:1061 +#: part/serializers.py:1033 msgid "Initial Stock" msgstr "Početne zalihe" -#: part/serializers.py:1062 +#: part/serializers.py:1034 msgid "Create Part with initial stock quantity" msgstr "Kreiraj deo sa početnom količinom zaliha" -#: part/serializers.py:1068 +#: part/serializers.py:1040 msgid "Supplier Information" msgstr "Informacije o dobavljaču" -#: part/serializers.py:1069 +#: part/serializers.py:1041 msgid "Add initial supplier information for this part" msgstr "Dodaj inicijalne informacije o dobavljaču za ovaj deo" -#: part/serializers.py:1077 +#: part/serializers.py:1049 msgid "Copy Category Parameters" msgstr "Kopiraj parametre kategorije" -#: part/serializers.py:1078 +#: part/serializers.py:1050 msgid "Copy parameter templates from selected part category" msgstr "Kopiraj parametarske šablone sa izabrane kategorije dela" -#: part/serializers.py:1083 +#: part/serializers.py:1055 msgid "Existing Image" msgstr "Postojeća slika" -#: part/serializers.py:1084 +#: part/serializers.py:1056 msgid "Filename of an existing part image" msgstr "Ime fajla postojeće slike dela" -#: part/serializers.py:1101 +#: part/serializers.py:1073 msgid "Image file does not exist" msgstr "Fajl sa slikom ne postoji" -#: part/serializers.py:1269 +#: part/serializers.py:1241 msgid "Validate entire Bill of Materials" msgstr "Validiraj ceo spisak materijala" -#: part/serializers.py:1303 part/serializers.py:1769 +#: part/serializers.py:1275 part/serializers.py:1741 msgid "Can Build" msgstr "Može se izgraditi" -#: part/serializers.py:1320 +#: part/serializers.py:1292 msgid "Required for Build Orders" msgstr "" -#: part/serializers.py:1325 +#: part/serializers.py:1297 msgid "Allocated to Build Orders" msgstr "" -#: part/serializers.py:1332 +#: part/serializers.py:1304 msgid "Required for Sales Orders" msgstr "" -#: part/serializers.py:1336 +#: part/serializers.py:1308 msgid "Allocated to Sales Orders" msgstr "" -#: part/serializers.py:1475 +#: part/serializers.py:1447 msgid "Minimum Price" msgstr "Minimalna cena" -#: part/serializers.py:1476 +#: part/serializers.py:1448 msgid "Override calculated value for minimum price" msgstr "Izmeni izračunatu vrednost za minimalnu cenu" -#: part/serializers.py:1483 +#: part/serializers.py:1455 msgid "Minimum price currency" msgstr "Minimalna valuta cene" -#: part/serializers.py:1490 +#: part/serializers.py:1462 msgid "Maximum Price" msgstr "Maksimalna cena" -#: part/serializers.py:1491 +#: part/serializers.py:1463 msgid "Override calculated value for maximum price" msgstr "Izmeni izračunatu vrednost maksimalne cene" -#: part/serializers.py:1498 +#: part/serializers.py:1470 msgid "Maximum price currency" msgstr "Maksimalna valuta cene" -#: part/serializers.py:1527 +#: part/serializers.py:1499 msgid "Update" msgstr "Ažuriraj" -#: part/serializers.py:1528 +#: part/serializers.py:1500 msgid "Update pricing for this part" msgstr "Ažuriraj cene za ovaj deo" -#: part/serializers.py:1551 +#: part/serializers.py:1523 #, python-brace-format msgid "Could not convert from provided currencies to {default_currency}" msgstr "Nija moguća konverzija iz dostavljen valute u {default_currency}" -#: part/serializers.py:1558 +#: part/serializers.py:1530 msgid "Minimum price must not be greater than maximum price" msgstr "Minimalna cena ne sme biti veća od maksimalne cene" -#: part/serializers.py:1561 +#: part/serializers.py:1533 msgid "Maximum price must not be less than minimum price" msgstr "Maksimalna cena ne sme biti manja od minimalne cene" -#: part/serializers.py:1715 +#: part/serializers.py:1687 msgid "Select the parent assembly" msgstr "Izaberi nadređeni sklop" -#: part/serializers.py:1735 +#: part/serializers.py:1707 msgid "Select the component part" msgstr "Izaberi komponentu dela" -#: part/serializers.py:1929 +#: part/serializers.py:1901 msgid "Select part to copy BOM from" msgstr "Izaberi deo sa kog će se kopirati spisak materijala" -#: part/serializers.py:1937 +#: part/serializers.py:1909 msgid "Remove Existing Data" msgstr "Ukloni postojeće podatke" -#: part/serializers.py:1938 +#: part/serializers.py:1910 msgid "Remove existing BOM items before copying" msgstr "Ukloni postojeće stavke sa spiska materijala pre kopiranja" -#: part/serializers.py:1943 +#: part/serializers.py:1915 msgid "Include Inherited" msgstr "Uključi nasleđeno" -#: part/serializers.py:1944 +#: part/serializers.py:1916 msgid "Include BOM items which are inherited from templated parts" msgstr "Uključi stavke sa spiska materijala koje su nasleđene od šablonskih delova" -#: part/serializers.py:1949 +#: part/serializers.py:1921 msgid "Skip Invalid Rows" msgstr "Preskoči nevažeće vrste" -#: part/serializers.py:1950 +#: part/serializers.py:1922 msgid "Enable this option to skip invalid rows" msgstr "Omogući ovu opciju za preskakanje nevažećih vrsta" -#: part/serializers.py:1955 +#: part/serializers.py:1927 msgid "Copy Substitute Parts" msgstr "Kopiraj zamenske delove" -#: part/serializers.py:1956 +#: part/serializers.py:1928 msgid "Copy substitute parts when duplicate BOM items" msgstr "Kopiraj zamenske delove prilikom duplikacije stavki sa spiska materijala" @@ -8455,115 +8459,119 @@ msgstr "Serijski brojevi moraju biti dostavljeni kao lista" msgid "Quantity does not match serial numbers" msgstr "Količine se ne poklapaju sa serijskim brojevima" -#: stock/models.py:2012 stock/models.py:2917 +#: stock/models.py:1912 +msgid "Cannot assign stock to structural location" +msgstr "" + +#: stock/models.py:2029 stock/models.py:2934 msgid "Test template does not exist" msgstr "Test šablon ne postoji" -#: stock/models.py:2030 +#: stock/models.py:2047 msgid "Stock item has been assigned to a sales order" msgstr "Stavka sa zaliha je dodeljena nalogu za prodaju" -#: stock/models.py:2034 +#: stock/models.py:2051 msgid "Stock item is installed in another item" msgstr "Stavka sa zaliha je instalirana u drugu stavku" -#: stock/models.py:2037 +#: stock/models.py:2054 msgid "Stock item contains other items" msgstr "Stavka sa zaliha sadrži druge stavke" -#: stock/models.py:2040 +#: stock/models.py:2057 msgid "Stock item has been assigned to a customer" msgstr "Stavka sa zaliha je dodeljena mušteriji" -#: stock/models.py:2043 stock/models.py:2226 +#: stock/models.py:2060 stock/models.py:2243 msgid "Stock item is currently in production" msgstr "Stavka sa zaliha je trenutno u produkciji" -#: stock/models.py:2046 +#: stock/models.py:2063 msgid "Serialized stock cannot be merged" msgstr "Serijalizovane zalihe se ne mogu spojiti" -#: stock/models.py:2053 stock/serializers.py:1462 +#: stock/models.py:2070 stock/serializers.py:1462 msgid "Duplicate stock items" msgstr "Dupliraj stavke sa zaliha" -#: stock/models.py:2057 +#: stock/models.py:2074 msgid "Stock items must refer to the same part" msgstr "Stavke sa zaliha se moraju odnositi na isti deo" -#: stock/models.py:2065 +#: stock/models.py:2082 msgid "Stock items must refer to the same supplier part" msgstr "Stavke sa zaliha se moraju odnositi na isti deo dobavljača" -#: stock/models.py:2070 +#: stock/models.py:2087 msgid "Stock status codes must match" msgstr "Statusne šifre zaliha moraju da se poklapaju" -#: stock/models.py:2349 +#: stock/models.py:2366 msgid "StockItem cannot be moved as it is not in stock" msgstr "Stavka se ne može pomeriti jer nije na zalihama" -#: stock/models.py:2818 +#: stock/models.py:2835 msgid "Stock Item Tracking" msgstr "Praćenje stavke sa zaliha" -#: stock/models.py:2849 +#: stock/models.py:2866 msgid "Entry notes" msgstr "Ulazne beleške" -#: stock/models.py:2889 +#: stock/models.py:2906 msgid "Stock Item Test Result" msgstr "Rezultat testa stavke sa zaliha" -#: stock/models.py:2920 +#: stock/models.py:2937 msgid "Value must be provided for this test" msgstr "Vrednost mora biti dostavljena za ovaj test" -#: stock/models.py:2924 +#: stock/models.py:2941 msgid "Attachment must be uploaded for this test" msgstr "Prilog mora biti dostavljen za ovaj test" -#: stock/models.py:2929 +#: stock/models.py:2946 msgid "Invalid value for this test" msgstr "Nevažeća vrednost za ovaj test" -#: stock/models.py:2953 +#: stock/models.py:2970 msgid "Test result" msgstr "Rezultat testa" -#: stock/models.py:2960 +#: stock/models.py:2977 msgid "Test output value" msgstr "Vrednost završetka testa" -#: stock/models.py:2968 stock/serializers.py:248 +#: stock/models.py:2985 stock/serializers.py:248 msgid "Test result attachment" msgstr "Prilog uz test rezultat" -#: stock/models.py:2972 +#: stock/models.py:2989 msgid "Test notes" msgstr "Beleške sa testa" -#: stock/models.py:2980 +#: stock/models.py:2997 msgid "Test station" msgstr "Stanica za testiranje" -#: stock/models.py:2981 +#: stock/models.py:2998 msgid "The identifier of the test station where the test was performed" msgstr "Identifikator stanice za testiranje gde je test izvršen" -#: stock/models.py:2987 +#: stock/models.py:3004 msgid "Started" msgstr "Započeto" -#: stock/models.py:2988 +#: stock/models.py:3005 msgid "The timestamp of the test start" msgstr "Vreme početka testa" -#: stock/models.py:2994 +#: stock/models.py:3011 msgid "Finished" msgstr "Završeno" -#: stock/models.py:2995 +#: stock/models.py:3012 msgid "The timestamp of the test finish" msgstr "Vreme završetka testa" @@ -8902,83 +8910,87 @@ msgstr "Zalihe dodane ručno" msgid "Stock manually removed" msgstr "Zaliha ručno uklonjena" -#: stock/status_codes.py:57 +#: stock/status_codes.py:56 +msgid "Serialized stock items" +msgstr "" + +#: stock/status_codes.py:58 msgid "Returned to stock" msgstr "" -#: stock/status_codes.py:60 +#: stock/status_codes.py:61 msgid "Location changed" msgstr "Lokacija promenjena" -#: stock/status_codes.py:61 +#: stock/status_codes.py:62 msgid "Stock updated" msgstr "Zaliha obnovljena" -#: stock/status_codes.py:64 +#: stock/status_codes.py:65 msgid "Installed into assembly" msgstr "Instalisan u sklopu" -#: stock/status_codes.py:65 +#: stock/status_codes.py:66 msgid "Removed from assembly" msgstr "Skinuto sa sklopa" -#: stock/status_codes.py:67 +#: stock/status_codes.py:68 msgid "Installed component item" msgstr "Instalirana stavka komponente" -#: stock/status_codes.py:68 +#: stock/status_codes.py:69 msgid "Removed component item" msgstr "Uklonjena stavka komponente" -#: stock/status_codes.py:71 +#: stock/status_codes.py:72 msgid "Split from parent item" msgstr "Odvoj od nadređene stavke" -#: stock/status_codes.py:72 +#: stock/status_codes.py:73 msgid "Split child item" msgstr "Podeli podređenu stavku" -#: stock/status_codes.py:75 +#: stock/status_codes.py:76 msgid "Merged stock items" msgstr "Spojene stavke zaliha" -#: stock/status_codes.py:78 +#: stock/status_codes.py:79 msgid "Converted to variant" msgstr "Pretvoreno u varijaciju" -#: stock/status_codes.py:81 +#: stock/status_codes.py:82 msgid "Build order output created" msgstr "Započeta obrada naloga za izradu" -#: stock/status_codes.py:82 +#: stock/status_codes.py:83 msgid "Build order output completed" msgstr "Završena obrada naloga za izradu" -#: stock/status_codes.py:83 +#: stock/status_codes.py:84 msgid "Build order output rejected" msgstr "Odbijen rezultat naloga za izradu" -#: stock/status_codes.py:84 +#: stock/status_codes.py:85 msgid "Consumed by build order" msgstr "Potrošeno od strane nalga za izradu" -#: stock/status_codes.py:87 +#: stock/status_codes.py:88 msgid "Shipped against Sales Order" msgstr "Isporučeno prema nalogu za prodaju" -#: stock/status_codes.py:90 +#: stock/status_codes.py:91 msgid "Received against Purchase Order" msgstr "Primljeno prema nalogu za kupovinu" -#: stock/status_codes.py:93 +#: stock/status_codes.py:94 msgid "Returned against Return Order" msgstr "Vraćeno prema nalogu za vraćanje" -#: stock/status_codes.py:96 +#: stock/status_codes.py:97 msgid "Sent to customer" msgstr "Poslato mušteriji" -#: stock/status_codes.py:97 +#: stock/status_codes.py:98 msgid "Returned from customer" msgstr "Vratila mušterija" diff --git a/src/backend/InvenTree/locale/sv/LC_MESSAGES/django.po b/src/backend/InvenTree/locale/sv/LC_MESSAGES/django.po index 7fb7ad2501..899d9e5f00 100644 --- a/src/backend/InvenTree/locale/sv/LC_MESSAGES/django.po +++ b/src/backend/InvenTree/locale/sv/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: inventree\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-11-19 04:55+0000\n" -"PO-Revision-Date: 2025-11-19 04:59\n" +"POT-Creation-Date: 2025-11-24 06:50+0000\n" +"PO-Revision-Date: 2025-11-24 06:54\n" "Last-Translator: \n" "Language-Team: Swedish\n" "Language: sv_SE\n" @@ -81,21 +81,21 @@ msgstr "Den angivna primära e-postadressen är inte giltig." msgid "The provided email domain is not approved." msgstr "Den angivna e-postdomänen är inte godkänd." -#: InvenTree/conversion.py:166 +#: InvenTree/conversion.py:240 #, python-brace-format msgid "Invalid unit provided ({unit})" msgstr "Ogiltig enhet angiven ({unit})" -#: InvenTree/conversion.py:183 +#: InvenTree/conversion.py:257 msgid "No value provided" msgstr "Inget värde angivet" -#: InvenTree/conversion.py:210 +#: InvenTree/conversion.py:284 #, python-brace-format msgid "Could not convert {original} to {unit}" msgstr "Kunde inte konvertera {original} till {unit}" -#: InvenTree/conversion.py:212 InvenTree/conversion.py:226 +#: InvenTree/conversion.py:286 InvenTree/conversion.py:300 #: InvenTree/helpers.py:597 order/models.py:720 order/models.py:1015 msgid "Invalid quantity provided" msgstr "Ogiltigt antal angivet" @@ -116,7 +116,7 @@ msgstr "" #: build/serializers.py:580 build/serializers.py:1788 company/models.py:857 #: order/models.py:1780 #: report/templates/report/inventree_build_order_report.html:172 -#: stock/models.py:2848 stock/models.py:2972 stock/serializers.py:717 +#: stock/models.py:2865 stock/models.py:2989 stock/serializers.py:717 #: stock/serializers.py:893 stock/serializers.py:1035 stock/serializers.py:1336 #: stock/serializers.py:1425 stock/serializers.py:1624 msgid "Notes" @@ -345,7 +345,7 @@ msgstr "Måste vara ett giltigt nummer" msgid "Currency" msgstr "Valuta" -#: InvenTree/serializers.py:298 part/serializers.py:1385 +#: InvenTree/serializers.py:298 part/serializers.py:1357 msgid "Select currency from available options" msgstr "Välj valuta från tillgängliga alternativ" @@ -553,14 +553,14 @@ msgstr "Inkludera varianter" #: build/api.py:100 build/api.py:466 build/api.py:845 build/models.py:270 #: build/serializers.py:1225 build/serializers.py:1356 -#: build/serializers.py:1427 company/models.py:1067 company/serializers.py:445 +#: build/serializers.py:1427 company/models.py:1067 company/serializers.py:491 #: order/api.py:298 order/api.py:302 order/api.py:929 order/api.py:1187 #: order/api.py:1190 order/models.py:1941 order/models.py:2108 #: order/models.py:2109 part/api.py:1233 part/api.py:1236 part/api.py:1302 #: part/api.py:1589 part/models.py:472 part/models.py:3296 part/models.py:3439 #: part/models.py:3497 part/models.py:3518 part/models.py:3540 #: part/models.py:3679 part/models.py:4046 part/models.py:4368 -#: part/models.py:4787 part/serializers.py:1928 +#: part/models.py:4787 part/serializers.py:1900 #: report/templates/report/inventree_bill_of_materials_report.html:110 #: report/templates/report/inventree_bill_of_materials_report.html:137 #: report/templates/report/inventree_build_order_report.html:109 @@ -582,7 +582,7 @@ msgstr "Del" #: build/api.py:120 build/api.py:123 build/serializers.py:1438 part/api.py:980 #: part/api.py:1316 part/api.py:1600 part/models.py:1080 part/models.py:3568 -#: part/models.py:4162 part/serializers.py:1752 stock/api.py:869 +#: part/models.py:4162 part/serializers.py:1724 stock/api.py:869 msgid "Category" msgstr "Kategori" @@ -663,7 +663,7 @@ msgid "Optional" msgstr "Valfri" #: build/api.py:455 build/serializers.py:1415 common/setting/system.py:456 -#: part/models.py:1202 part/serializers.py:1714 part/serializers.py:1725 +#: part/models.py:1202 part/serializers.py:1686 part/serializers.py:1697 #: stock/api.py:639 msgid "Assembly" msgstr "" @@ -688,16 +688,16 @@ msgstr "Allokerad" msgid "Consumed" msgstr "Konsumerad" -#: build/api.py:499 company/models.py:912 company/serializers.py:440 +#: build/api.py:499 company/models.py:912 company/serializers.py:474 #: templates/email/build_order_required_stock.html:19 #: templates/email/low_stock_notification.html:17 #: templates/email/part_event_notification.html:18 msgid "Available" msgstr "Tillgänglig" -#: build/api.py:523 build/serializers.py:1466 company/serializers.py:437 -#: order/serializers.py:1281 part/serializers.py:959 part/serializers.py:1306 -#: part/serializers.py:1761 +#: build/api.py:523 build/serializers.py:1466 company/serializers.py:471 +#: order/serializers.py:1281 part/serializers.py:931 part/serializers.py:1278 +#: part/serializers.py:1733 msgid "On Order" msgstr "" @@ -963,7 +963,7 @@ msgstr "Byggutgång matchar inte bygg order" #: build/models.py:1136 build/models.py:1234 build/serializers.py:285 #: build/serializers.py:335 build/serializers.py:965 build/serializers.py:1739 #: order/models.py:717 order/serializers.py:658 order/serializers.py:844 -#: part/serializers.py:1708 stock/models.py:940 stock/models.py:1430 +#: part/serializers.py:1680 stock/models.py:940 stock/models.py:1430 #: stock/models.py:1878 stock/serializers.py:688 stock/serializers.py:1580 msgid "Quantity must be greater than zero" msgstr "" @@ -1385,20 +1385,20 @@ msgstr "Tillåt varianter" msgid "BOM Item" msgstr "" -#: build/serializers.py:1467 order/serializers.py:1282 part/serializers.py:1310 -#: part/serializers.py:1765 +#: build/serializers.py:1467 order/serializers.py:1282 part/serializers.py:1282 +#: part/serializers.py:1737 msgid "In Production" msgstr "" -#: build/serializers.py:1469 part/serializers.py:950 part/serializers.py:1314 +#: build/serializers.py:1469 part/serializers.py:922 part/serializers.py:1286 msgid "Scheduled to Build" msgstr "" -#: build/serializers.py:1472 part/serializers.py:987 +#: build/serializers.py:1472 part/serializers.py:959 msgid "External Stock" msgstr "" -#: build/serializers.py:1473 part/serializers.py:1300 part/serializers.py:1808 +#: build/serializers.py:1473 part/serializers.py:1272 part/serializers.py:1780 msgid "Available Stock" msgstr "" @@ -1588,7 +1588,7 @@ msgstr "Användare" msgid "Price break quantity" msgstr "" -#: common/models.py:1348 company/serializers.py:564 order/models.py:1842 +#: common/models.py:1348 company/serializers.py:357 order/models.py:1842 #: order/models.py:3043 msgid "Price" msgstr "Pris" @@ -1760,7 +1760,7 @@ msgstr "Definition" msgid "Unit definition" msgstr "" -#: common/models.py:1911 common/models.py:1974 stock/models.py:2967 +#: common/models.py:1911 common/models.py:1974 stock/models.py:2984 #: stock/serializers.py:247 msgid "Attachment" msgstr "Bilaga" @@ -1839,7 +1839,7 @@ msgstr "" #: common/models.py:2090 common/models.py:2329 company/models.py:622 #: machine/serializers.py:27 -#: report/templates/report/inventree_test_report.html:104 stock/models.py:2959 +#: report/templates/report/inventree_test_report.html:104 stock/models.py:2976 msgid "Value" msgstr "Värde" @@ -2048,7 +2048,7 @@ msgid "Response data from the barcode scan" msgstr "" #: common/models.py:2417 report/templates/report/inventree_test_report.html:103 -#: stock/models.py:2953 +#: stock/models.py:2970 msgid "Result" msgstr "Resultat" @@ -2141,8 +2141,8 @@ msgid "Linked thread for this message" msgstr "" #: common/models.py:2656 -msgid "Prioriy" -msgstr "Prioritet" +msgid "Priority" +msgstr "" #: common/models.py:2698 msgid "Email Thread" @@ -2671,8 +2671,8 @@ msgstr "" msgid "Parts can be assembled from other components by default" msgstr "" -#: common/setting/system.py:462 part/models.py:1208 part/serializers.py:1734 -#: part/serializers.py:1741 +#: common/setting/system.py:462 part/models.py:1208 part/serializers.py:1706 +#: part/serializers.py:1713 msgid "Component" msgstr "Komponent" @@ -3772,7 +3772,7 @@ msgstr "" msgid "Supplier is Active" msgstr "" -#: company/api.py:307 company/models.py:520 company/serializers.py:457 +#: company/api.py:307 company/models.py:520 company/serializers.py:503 #: part/serializers.py:566 msgid "Manufacturer" msgstr "Tillverkare" @@ -3964,7 +3964,7 @@ msgid "Link to address information (external)" msgstr "" #: company/models.py:492 company/models.py:609 company/models.py:832 -#: company/serializers.py:471 stock/api.py:561 +#: company/serializers.py:517 stock/api.py:561 msgid "Manufacturer Part" msgstr "" @@ -3981,7 +3981,7 @@ msgstr "Välj del" msgid "Select manufacturer" msgstr "" -#: company/models.py:527 company/serializers.py:479 order/serializers.py:734 +#: company/models.py:527 company/serializers.py:525 order/serializers.py:734 #: part/serializers.py:576 msgid "MPN" msgstr "MPN" @@ -4030,7 +4030,7 @@ msgstr "" msgid "Linked manufacturer part must reference the same base part" msgstr "" -#: company/models.py:810 company/serializers.py:449 company/serializers.py:467 +#: company/models.py:810 company/serializers.py:495 company/serializers.py:513 #: order/models.py:639 part/serializers.py:550 #: plugin/builtin/suppliers/digikey.py:26 plugin/builtin/suppliers/lcsc.py:27 #: plugin/builtin/suppliers/mouser.py:25 plugin/builtin/suppliers/tme.py:27 @@ -4134,10 +4134,14 @@ msgstr "" msgid "Company Name" msgstr "Företagsnamn" -#: company/serializers.py:433 part/serializers.py:955 stock/serializers.py:428 +#: company/serializers.py:467 part/serializers.py:927 stock/serializers.py:428 msgid "In Stock" msgstr "I lager" +#: company/serializers.py:484 +msgid "Price Breaks" +msgstr "" + #: data_exporter/mixins.py:325 data_exporter/mixins.py:403 msgid "Error occurred during data export" msgstr "" @@ -4290,7 +4294,7 @@ msgstr "" msgid "Errors" msgstr "Fel" -#: importer/models.py:550 part/serializers.py:1268 +#: importer/models.py:550 part/serializers.py:1240 msgid "Valid" msgstr "Giltig" @@ -5677,7 +5681,7 @@ msgstr "" msgid "Part category" msgstr "Delkategori" -#: part/models.py:1088 part/serializers.py:929 +#: part/models.py:1088 part/serializers.py:901 #: report/templates/report/inventree_stock_location_report.html:103 msgid "IPN" msgstr "IPN" @@ -5718,7 +5722,7 @@ msgstr "" msgid "Expiry time (in days) for stock items of this part" msgstr "" -#: part/models.py:1186 part/serializers.py:1003 +#: part/models.py:1186 part/serializers.py:975 msgid "Minimum Stock" msgstr "" @@ -6418,203 +6422,203 @@ msgstr "" msgid "Supplier part matching this SKU already exists" msgstr "" -#: part/serializers.py:914 +#: part/serializers.py:886 msgid "Category Name" msgstr "Kategorinamn" -#: part/serializers.py:943 +#: part/serializers.py:915 msgid "Building" msgstr "" -#: part/serializers.py:944 +#: part/serializers.py:916 msgid "Quantity of this part currently being in production" msgstr "" -#: part/serializers.py:951 +#: part/serializers.py:923 msgid "Outstanding quantity of this part scheduled to be built" msgstr "" -#: part/serializers.py:971 stock/serializers.py:1019 stock/serializers.py:1189 +#: part/serializers.py:943 stock/serializers.py:1019 stock/serializers.py:1189 #: users/ruleset.py:30 msgid "Stock Items" msgstr "" -#: part/serializers.py:975 +#: part/serializers.py:947 msgid "Revisions" msgstr "Revisioner" -#: part/serializers.py:979 +#: part/serializers.py:951 msgid "Suppliers" msgstr "Leverantörer" -#: part/serializers.py:983 part/serializers.py:1297 +#: part/serializers.py:955 part/serializers.py:1269 #: templates/email/low_stock_notification.html:16 #: templates/email/part_event_notification.html:17 msgid "Total Stock" msgstr "" -#: part/serializers.py:991 +#: part/serializers.py:963 msgid "Unallocated Stock" msgstr "" -#: part/serializers.py:999 +#: part/serializers.py:971 msgid "Variant Stock" msgstr "" -#: part/serializers.py:1054 +#: part/serializers.py:1026 msgid "Duplicate Part" msgstr "" -#: part/serializers.py:1055 +#: part/serializers.py:1027 msgid "Copy initial data from another Part" msgstr "" -#: part/serializers.py:1061 +#: part/serializers.py:1033 msgid "Initial Stock" msgstr "" -#: part/serializers.py:1062 +#: part/serializers.py:1034 msgid "Create Part with initial stock quantity" msgstr "" -#: part/serializers.py:1068 +#: part/serializers.py:1040 msgid "Supplier Information" msgstr "" -#: part/serializers.py:1069 +#: part/serializers.py:1041 msgid "Add initial supplier information for this part" msgstr "" -#: part/serializers.py:1077 +#: part/serializers.py:1049 msgid "Copy Category Parameters" msgstr "" -#: part/serializers.py:1078 +#: part/serializers.py:1050 msgid "Copy parameter templates from selected part category" msgstr "" -#: part/serializers.py:1083 +#: part/serializers.py:1055 msgid "Existing Image" msgstr "" -#: part/serializers.py:1084 +#: part/serializers.py:1056 msgid "Filename of an existing part image" msgstr "" -#: part/serializers.py:1101 +#: part/serializers.py:1073 msgid "Image file does not exist" msgstr "" -#: part/serializers.py:1269 +#: part/serializers.py:1241 msgid "Validate entire Bill of Materials" msgstr "" -#: part/serializers.py:1303 part/serializers.py:1769 +#: part/serializers.py:1275 part/serializers.py:1741 msgid "Can Build" msgstr "" -#: part/serializers.py:1320 +#: part/serializers.py:1292 msgid "Required for Build Orders" msgstr "" -#: part/serializers.py:1325 +#: part/serializers.py:1297 msgid "Allocated to Build Orders" msgstr "" -#: part/serializers.py:1332 +#: part/serializers.py:1304 msgid "Required for Sales Orders" msgstr "" -#: part/serializers.py:1336 +#: part/serializers.py:1308 msgid "Allocated to Sales Orders" msgstr "" -#: part/serializers.py:1475 +#: part/serializers.py:1447 msgid "Minimum Price" msgstr "" -#: part/serializers.py:1476 +#: part/serializers.py:1448 msgid "Override calculated value for minimum price" msgstr "" -#: part/serializers.py:1483 +#: part/serializers.py:1455 msgid "Minimum price currency" msgstr "" -#: part/serializers.py:1490 +#: part/serializers.py:1462 msgid "Maximum Price" msgstr "" -#: part/serializers.py:1491 +#: part/serializers.py:1463 msgid "Override calculated value for maximum price" msgstr "" -#: part/serializers.py:1498 +#: part/serializers.py:1470 msgid "Maximum price currency" msgstr "" -#: part/serializers.py:1527 +#: part/serializers.py:1499 msgid "Update" msgstr "Uppdatera" -#: part/serializers.py:1528 +#: part/serializers.py:1500 msgid "Update pricing for this part" msgstr "" -#: part/serializers.py:1551 +#: part/serializers.py:1523 #, python-brace-format msgid "Could not convert from provided currencies to {default_currency}" msgstr "" -#: part/serializers.py:1558 +#: part/serializers.py:1530 msgid "Minimum price must not be greater than maximum price" msgstr "" -#: part/serializers.py:1561 +#: part/serializers.py:1533 msgid "Maximum price must not be less than minimum price" msgstr "" -#: part/serializers.py:1715 +#: part/serializers.py:1687 msgid "Select the parent assembly" msgstr "" -#: part/serializers.py:1735 +#: part/serializers.py:1707 msgid "Select the component part" msgstr "" -#: part/serializers.py:1929 +#: part/serializers.py:1901 msgid "Select part to copy BOM from" msgstr "" -#: part/serializers.py:1937 +#: part/serializers.py:1909 msgid "Remove Existing Data" msgstr "" -#: part/serializers.py:1938 +#: part/serializers.py:1910 msgid "Remove existing BOM items before copying" msgstr "" -#: part/serializers.py:1943 +#: part/serializers.py:1915 msgid "Include Inherited" msgstr "" -#: part/serializers.py:1944 +#: part/serializers.py:1916 msgid "Include BOM items which are inherited from templated parts" msgstr "" -#: part/serializers.py:1949 +#: part/serializers.py:1921 msgid "Skip Invalid Rows" msgstr "Hoppa över ogiltiga rader" -#: part/serializers.py:1950 +#: part/serializers.py:1922 msgid "Enable this option to skip invalid rows" msgstr "" -#: part/serializers.py:1955 +#: part/serializers.py:1927 msgid "Copy Substitute Parts" msgstr "" -#: part/serializers.py:1956 +#: part/serializers.py:1928 msgid "Copy substitute parts when duplicate BOM items" msgstr "" @@ -8455,115 +8459,119 @@ msgstr "" msgid "Quantity does not match serial numbers" msgstr "" -#: stock/models.py:2012 stock/models.py:2917 +#: stock/models.py:1912 +msgid "Cannot assign stock to structural location" +msgstr "" + +#: stock/models.py:2029 stock/models.py:2934 msgid "Test template does not exist" msgstr "" -#: stock/models.py:2030 +#: stock/models.py:2047 msgid "Stock item has been assigned to a sales order" msgstr "" -#: stock/models.py:2034 +#: stock/models.py:2051 msgid "Stock item is installed in another item" msgstr "" -#: stock/models.py:2037 +#: stock/models.py:2054 msgid "Stock item contains other items" msgstr "" -#: stock/models.py:2040 +#: stock/models.py:2057 msgid "Stock item has been assigned to a customer" msgstr "" -#: stock/models.py:2043 stock/models.py:2226 +#: stock/models.py:2060 stock/models.py:2243 msgid "Stock item is currently in production" msgstr "" -#: stock/models.py:2046 +#: stock/models.py:2063 msgid "Serialized stock cannot be merged" msgstr "" -#: stock/models.py:2053 stock/serializers.py:1462 +#: stock/models.py:2070 stock/serializers.py:1462 msgid "Duplicate stock items" msgstr "" -#: stock/models.py:2057 +#: stock/models.py:2074 msgid "Stock items must refer to the same part" msgstr "" -#: stock/models.py:2065 +#: stock/models.py:2082 msgid "Stock items must refer to the same supplier part" msgstr "" -#: stock/models.py:2070 +#: stock/models.py:2087 msgid "Stock status codes must match" msgstr "" -#: stock/models.py:2349 +#: stock/models.py:2366 msgid "StockItem cannot be moved as it is not in stock" msgstr "" -#: stock/models.py:2818 +#: stock/models.py:2835 msgid "Stock Item Tracking" msgstr "" -#: stock/models.py:2849 +#: stock/models.py:2866 msgid "Entry notes" msgstr "" -#: stock/models.py:2889 +#: stock/models.py:2906 msgid "Stock Item Test Result" msgstr "" -#: stock/models.py:2920 +#: stock/models.py:2937 msgid "Value must be provided for this test" msgstr "" -#: stock/models.py:2924 +#: stock/models.py:2941 msgid "Attachment must be uploaded for this test" msgstr "" -#: stock/models.py:2929 +#: stock/models.py:2946 msgid "Invalid value for this test" msgstr "" -#: stock/models.py:2953 +#: stock/models.py:2970 msgid "Test result" msgstr "Testresultat" -#: stock/models.py:2960 +#: stock/models.py:2977 msgid "Test output value" msgstr "" -#: stock/models.py:2968 stock/serializers.py:248 +#: stock/models.py:2985 stock/serializers.py:248 msgid "Test result attachment" msgstr "" -#: stock/models.py:2972 +#: stock/models.py:2989 msgid "Test notes" msgstr "" -#: stock/models.py:2980 +#: stock/models.py:2997 msgid "Test station" msgstr "" -#: stock/models.py:2981 +#: stock/models.py:2998 msgid "The identifier of the test station where the test was performed" msgstr "" -#: stock/models.py:2987 +#: stock/models.py:3004 msgid "Started" msgstr "Startad" -#: stock/models.py:2988 +#: stock/models.py:3005 msgid "The timestamp of the test start" msgstr "" -#: stock/models.py:2994 +#: stock/models.py:3011 msgid "Finished" msgstr "" -#: stock/models.py:2995 +#: stock/models.py:3012 msgid "The timestamp of the test finish" msgstr "" @@ -8902,83 +8910,87 @@ msgstr "Lagerpost manuellt tillagd" msgid "Stock manually removed" msgstr "Lagerpost manuellt borttagen" -#: stock/status_codes.py:57 +#: stock/status_codes.py:56 +msgid "Serialized stock items" +msgstr "" + +#: stock/status_codes.py:58 msgid "Returned to stock" msgstr "" -#: stock/status_codes.py:60 +#: stock/status_codes.py:61 msgid "Location changed" msgstr "Platsen har ändrats" -#: stock/status_codes.py:61 +#: stock/status_codes.py:62 msgid "Stock updated" msgstr "" -#: stock/status_codes.py:64 +#: stock/status_codes.py:65 msgid "Installed into assembly" msgstr "Installerad i montering" -#: stock/status_codes.py:65 +#: stock/status_codes.py:66 msgid "Removed from assembly" msgstr "Borttagen från montering" -#: stock/status_codes.py:67 +#: stock/status_codes.py:68 msgid "Installed component item" msgstr "Installerat komponentobjekt" -#: stock/status_codes.py:68 +#: stock/status_codes.py:69 msgid "Removed component item" msgstr "Tog bort komponentobjekt" -#: stock/status_codes.py:71 +#: stock/status_codes.py:72 msgid "Split from parent item" msgstr "Dela från överordnat objekt" -#: stock/status_codes.py:72 +#: stock/status_codes.py:73 msgid "Split child item" msgstr "Dela underordnat objekt" -#: stock/status_codes.py:75 +#: stock/status_codes.py:76 msgid "Merged stock items" msgstr "Sammanfogade lagerposter" -#: stock/status_codes.py:78 +#: stock/status_codes.py:79 msgid "Converted to variant" msgstr "Konverterad till variant" -#: stock/status_codes.py:81 +#: stock/status_codes.py:82 msgid "Build order output created" msgstr "Bygg orderutgång skapad" -#: stock/status_codes.py:82 +#: stock/status_codes.py:83 msgid "Build order output completed" msgstr "Bygg orderutgång slutförd" -#: stock/status_codes.py:83 +#: stock/status_codes.py:84 msgid "Build order output rejected" msgstr "" -#: stock/status_codes.py:84 +#: stock/status_codes.py:85 msgid "Consumed by build order" msgstr "Konsumeras av byggorder" -#: stock/status_codes.py:87 +#: stock/status_codes.py:88 msgid "Shipped against Sales Order" msgstr "" -#: stock/status_codes.py:90 +#: stock/status_codes.py:91 msgid "Received against Purchase Order" msgstr "" -#: stock/status_codes.py:93 +#: stock/status_codes.py:94 msgid "Returned against Return Order" msgstr "" -#: stock/status_codes.py:96 +#: stock/status_codes.py:97 msgid "Sent to customer" msgstr "Skickat till kund" -#: stock/status_codes.py:97 +#: stock/status_codes.py:98 msgid "Returned from customer" msgstr "Returnerad från kund" diff --git a/src/backend/InvenTree/locale/th/LC_MESSAGES/django.po b/src/backend/InvenTree/locale/th/LC_MESSAGES/django.po index 89046bfde6..9d39e8afda 100644 --- a/src/backend/InvenTree/locale/th/LC_MESSAGES/django.po +++ b/src/backend/InvenTree/locale/th/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: inventree\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-11-19 04:55+0000\n" -"PO-Revision-Date: 2025-11-19 04:59\n" +"POT-Creation-Date: 2025-11-24 06:50+0000\n" +"PO-Revision-Date: 2025-11-24 06:54\n" "Last-Translator: \n" "Language-Team: Thai\n" "Language: th_TH\n" @@ -81,21 +81,21 @@ msgstr "" msgid "The provided email domain is not approved." msgstr "" -#: InvenTree/conversion.py:166 +#: InvenTree/conversion.py:240 #, python-brace-format msgid "Invalid unit provided ({unit})" msgstr "" -#: InvenTree/conversion.py:183 +#: InvenTree/conversion.py:257 msgid "No value provided" msgstr "" -#: InvenTree/conversion.py:210 +#: InvenTree/conversion.py:284 #, python-brace-format msgid "Could not convert {original} to {unit}" msgstr "" -#: InvenTree/conversion.py:212 InvenTree/conversion.py:226 +#: InvenTree/conversion.py:286 InvenTree/conversion.py:300 #: InvenTree/helpers.py:597 order/models.py:720 order/models.py:1015 msgid "Invalid quantity provided" msgstr "ปริมาณสินค้าไม่ถูกต้อง" @@ -116,7 +116,7 @@ msgstr "" #: build/serializers.py:580 build/serializers.py:1788 company/models.py:857 #: order/models.py:1780 #: report/templates/report/inventree_build_order_report.html:172 -#: stock/models.py:2848 stock/models.py:2972 stock/serializers.py:717 +#: stock/models.py:2865 stock/models.py:2989 stock/serializers.py:717 #: stock/serializers.py:893 stock/serializers.py:1035 stock/serializers.py:1336 #: stock/serializers.py:1425 stock/serializers.py:1624 msgid "Notes" @@ -345,7 +345,7 @@ msgstr "ต้องเป็นตัวเลข" msgid "Currency" msgstr "สกุลเงิน" -#: InvenTree/serializers.py:298 part/serializers.py:1385 +#: InvenTree/serializers.py:298 part/serializers.py:1357 msgid "Select currency from available options" msgstr "" @@ -553,14 +553,14 @@ msgstr "" #: build/api.py:100 build/api.py:466 build/api.py:845 build/models.py:270 #: build/serializers.py:1225 build/serializers.py:1356 -#: build/serializers.py:1427 company/models.py:1067 company/serializers.py:445 +#: build/serializers.py:1427 company/models.py:1067 company/serializers.py:491 #: order/api.py:298 order/api.py:302 order/api.py:929 order/api.py:1187 #: order/api.py:1190 order/models.py:1941 order/models.py:2108 #: order/models.py:2109 part/api.py:1233 part/api.py:1236 part/api.py:1302 #: part/api.py:1589 part/models.py:472 part/models.py:3296 part/models.py:3439 #: part/models.py:3497 part/models.py:3518 part/models.py:3540 #: part/models.py:3679 part/models.py:4046 part/models.py:4368 -#: part/models.py:4787 part/serializers.py:1928 +#: part/models.py:4787 part/serializers.py:1900 #: report/templates/report/inventree_bill_of_materials_report.html:110 #: report/templates/report/inventree_bill_of_materials_report.html:137 #: report/templates/report/inventree_build_order_report.html:109 @@ -582,7 +582,7 @@ msgstr "" #: build/api.py:120 build/api.py:123 build/serializers.py:1438 part/api.py:980 #: part/api.py:1316 part/api.py:1600 part/models.py:1080 part/models.py:3568 -#: part/models.py:4162 part/serializers.py:1752 stock/api.py:869 +#: part/models.py:4162 part/serializers.py:1724 stock/api.py:869 msgid "Category" msgstr "" @@ -663,7 +663,7 @@ msgid "Optional" msgstr "" #: build/api.py:455 build/serializers.py:1415 common/setting/system.py:456 -#: part/models.py:1202 part/serializers.py:1714 part/serializers.py:1725 +#: part/models.py:1202 part/serializers.py:1686 part/serializers.py:1697 #: stock/api.py:639 msgid "Assembly" msgstr "" @@ -688,16 +688,16 @@ msgstr "" msgid "Consumed" msgstr "" -#: build/api.py:499 company/models.py:912 company/serializers.py:440 +#: build/api.py:499 company/models.py:912 company/serializers.py:474 #: templates/email/build_order_required_stock.html:19 #: templates/email/low_stock_notification.html:17 #: templates/email/part_event_notification.html:18 msgid "Available" msgstr "" -#: build/api.py:523 build/serializers.py:1466 company/serializers.py:437 -#: order/serializers.py:1281 part/serializers.py:959 part/serializers.py:1306 -#: part/serializers.py:1761 +#: build/api.py:523 build/serializers.py:1466 company/serializers.py:471 +#: order/serializers.py:1281 part/serializers.py:931 part/serializers.py:1278 +#: part/serializers.py:1733 msgid "On Order" msgstr "" @@ -963,7 +963,7 @@ msgstr "" #: build/models.py:1136 build/models.py:1234 build/serializers.py:285 #: build/serializers.py:335 build/serializers.py:965 build/serializers.py:1739 #: order/models.py:717 order/serializers.py:658 order/serializers.py:844 -#: part/serializers.py:1708 stock/models.py:940 stock/models.py:1430 +#: part/serializers.py:1680 stock/models.py:940 stock/models.py:1430 #: stock/models.py:1878 stock/serializers.py:688 stock/serializers.py:1580 msgid "Quantity must be greater than zero" msgstr "จำนวนต้องมีค่ามากกว่า 0" @@ -1385,20 +1385,20 @@ msgstr "" msgid "BOM Item" msgstr "" -#: build/serializers.py:1467 order/serializers.py:1282 part/serializers.py:1310 -#: part/serializers.py:1765 +#: build/serializers.py:1467 order/serializers.py:1282 part/serializers.py:1282 +#: part/serializers.py:1737 msgid "In Production" msgstr "" -#: build/serializers.py:1469 part/serializers.py:950 part/serializers.py:1314 +#: build/serializers.py:1469 part/serializers.py:922 part/serializers.py:1286 msgid "Scheduled to Build" msgstr "" -#: build/serializers.py:1472 part/serializers.py:987 +#: build/serializers.py:1472 part/serializers.py:959 msgid "External Stock" msgstr "" -#: build/serializers.py:1473 part/serializers.py:1300 part/serializers.py:1808 +#: build/serializers.py:1473 part/serializers.py:1272 part/serializers.py:1780 msgid "Available Stock" msgstr "" @@ -1588,7 +1588,7 @@ msgstr "ผู้ใช้งาน" msgid "Price break quantity" msgstr "" -#: common/models.py:1348 company/serializers.py:564 order/models.py:1842 +#: common/models.py:1348 company/serializers.py:357 order/models.py:1842 #: order/models.py:3043 msgid "Price" msgstr "" @@ -1760,7 +1760,7 @@ msgstr "" msgid "Unit definition" msgstr "" -#: common/models.py:1911 common/models.py:1974 stock/models.py:2967 +#: common/models.py:1911 common/models.py:1974 stock/models.py:2984 #: stock/serializers.py:247 msgid "Attachment" msgstr "ไฟล์แนบ" @@ -1839,7 +1839,7 @@ msgstr "" #: common/models.py:2090 common/models.py:2329 company/models.py:622 #: machine/serializers.py:27 -#: report/templates/report/inventree_test_report.html:104 stock/models.py:2959 +#: report/templates/report/inventree_test_report.html:104 stock/models.py:2976 msgid "Value" msgstr "" @@ -2048,7 +2048,7 @@ msgid "Response data from the barcode scan" msgstr "" #: common/models.py:2417 report/templates/report/inventree_test_report.html:103 -#: stock/models.py:2953 +#: stock/models.py:2970 msgid "Result" msgstr "" @@ -2141,7 +2141,7 @@ msgid "Linked thread for this message" msgstr "" #: common/models.py:2656 -msgid "Prioriy" +msgid "Priority" msgstr "" #: common/models.py:2698 @@ -2671,8 +2671,8 @@ msgstr "" msgid "Parts can be assembled from other components by default" msgstr "" -#: common/setting/system.py:462 part/models.py:1208 part/serializers.py:1734 -#: part/serializers.py:1741 +#: common/setting/system.py:462 part/models.py:1208 part/serializers.py:1706 +#: part/serializers.py:1713 msgid "Component" msgstr "" @@ -3772,7 +3772,7 @@ msgstr "" msgid "Supplier is Active" msgstr "" -#: company/api.py:307 company/models.py:520 company/serializers.py:457 +#: company/api.py:307 company/models.py:520 company/serializers.py:503 #: part/serializers.py:566 msgid "Manufacturer" msgstr "" @@ -3964,7 +3964,7 @@ msgid "Link to address information (external)" msgstr "" #: company/models.py:492 company/models.py:609 company/models.py:832 -#: company/serializers.py:471 stock/api.py:561 +#: company/serializers.py:517 stock/api.py:561 msgid "Manufacturer Part" msgstr "" @@ -3981,7 +3981,7 @@ msgstr "" msgid "Select manufacturer" msgstr "" -#: company/models.py:527 company/serializers.py:479 order/serializers.py:734 +#: company/models.py:527 company/serializers.py:525 order/serializers.py:734 #: part/serializers.py:576 msgid "MPN" msgstr "" @@ -4030,7 +4030,7 @@ msgstr "" msgid "Linked manufacturer part must reference the same base part" msgstr "" -#: company/models.py:810 company/serializers.py:449 company/serializers.py:467 +#: company/models.py:810 company/serializers.py:495 company/serializers.py:513 #: order/models.py:639 part/serializers.py:550 #: plugin/builtin/suppliers/digikey.py:26 plugin/builtin/suppliers/lcsc.py:27 #: plugin/builtin/suppliers/mouser.py:25 plugin/builtin/suppliers/tme.py:27 @@ -4134,10 +4134,14 @@ msgstr "" msgid "Company Name" msgstr "" -#: company/serializers.py:433 part/serializers.py:955 stock/serializers.py:428 +#: company/serializers.py:467 part/serializers.py:927 stock/serializers.py:428 msgid "In Stock" msgstr "" +#: company/serializers.py:484 +msgid "Price Breaks" +msgstr "" + #: data_exporter/mixins.py:325 data_exporter/mixins.py:403 msgid "Error occurred during data export" msgstr "" @@ -4290,7 +4294,7 @@ msgstr "" msgid "Errors" msgstr "" -#: importer/models.py:550 part/serializers.py:1268 +#: importer/models.py:550 part/serializers.py:1240 msgid "Valid" msgstr "" @@ -5677,7 +5681,7 @@ msgstr "" msgid "Part category" msgstr "" -#: part/models.py:1088 part/serializers.py:929 +#: part/models.py:1088 part/serializers.py:901 #: report/templates/report/inventree_stock_location_report.html:103 msgid "IPN" msgstr "" @@ -5718,7 +5722,7 @@ msgstr "" msgid "Expiry time (in days) for stock items of this part" msgstr "" -#: part/models.py:1186 part/serializers.py:1003 +#: part/models.py:1186 part/serializers.py:975 msgid "Minimum Stock" msgstr "" @@ -6418,203 +6422,203 @@ msgstr "" msgid "Supplier part matching this SKU already exists" msgstr "" -#: part/serializers.py:914 +#: part/serializers.py:886 msgid "Category Name" msgstr "" -#: part/serializers.py:943 +#: part/serializers.py:915 msgid "Building" msgstr "" -#: part/serializers.py:944 +#: part/serializers.py:916 msgid "Quantity of this part currently being in production" msgstr "" -#: part/serializers.py:951 +#: part/serializers.py:923 msgid "Outstanding quantity of this part scheduled to be built" msgstr "" -#: part/serializers.py:971 stock/serializers.py:1019 stock/serializers.py:1189 +#: part/serializers.py:943 stock/serializers.py:1019 stock/serializers.py:1189 #: users/ruleset.py:30 msgid "Stock Items" msgstr "" -#: part/serializers.py:975 +#: part/serializers.py:947 msgid "Revisions" msgstr "" -#: part/serializers.py:979 +#: part/serializers.py:951 msgid "Suppliers" msgstr "" -#: part/serializers.py:983 part/serializers.py:1297 +#: part/serializers.py:955 part/serializers.py:1269 #: templates/email/low_stock_notification.html:16 #: templates/email/part_event_notification.html:17 msgid "Total Stock" msgstr "" -#: part/serializers.py:991 +#: part/serializers.py:963 msgid "Unallocated Stock" msgstr "" -#: part/serializers.py:999 +#: part/serializers.py:971 msgid "Variant Stock" msgstr "" -#: part/serializers.py:1054 +#: part/serializers.py:1026 msgid "Duplicate Part" msgstr "" -#: part/serializers.py:1055 +#: part/serializers.py:1027 msgid "Copy initial data from another Part" msgstr "" -#: part/serializers.py:1061 +#: part/serializers.py:1033 msgid "Initial Stock" msgstr "" -#: part/serializers.py:1062 +#: part/serializers.py:1034 msgid "Create Part with initial stock quantity" msgstr "" -#: part/serializers.py:1068 +#: part/serializers.py:1040 msgid "Supplier Information" msgstr "" -#: part/serializers.py:1069 +#: part/serializers.py:1041 msgid "Add initial supplier information for this part" msgstr "" -#: part/serializers.py:1077 +#: part/serializers.py:1049 msgid "Copy Category Parameters" msgstr "" -#: part/serializers.py:1078 +#: part/serializers.py:1050 msgid "Copy parameter templates from selected part category" msgstr "" -#: part/serializers.py:1083 +#: part/serializers.py:1055 msgid "Existing Image" msgstr "" -#: part/serializers.py:1084 +#: part/serializers.py:1056 msgid "Filename of an existing part image" msgstr "" -#: part/serializers.py:1101 +#: part/serializers.py:1073 msgid "Image file does not exist" msgstr "" -#: part/serializers.py:1269 +#: part/serializers.py:1241 msgid "Validate entire Bill of Materials" msgstr "" -#: part/serializers.py:1303 part/serializers.py:1769 +#: part/serializers.py:1275 part/serializers.py:1741 msgid "Can Build" msgstr "" -#: part/serializers.py:1320 +#: part/serializers.py:1292 msgid "Required for Build Orders" msgstr "" -#: part/serializers.py:1325 +#: part/serializers.py:1297 msgid "Allocated to Build Orders" msgstr "" -#: part/serializers.py:1332 +#: part/serializers.py:1304 msgid "Required for Sales Orders" msgstr "" -#: part/serializers.py:1336 +#: part/serializers.py:1308 msgid "Allocated to Sales Orders" msgstr "" -#: part/serializers.py:1475 +#: part/serializers.py:1447 msgid "Minimum Price" msgstr "" -#: part/serializers.py:1476 +#: part/serializers.py:1448 msgid "Override calculated value for minimum price" msgstr "" -#: part/serializers.py:1483 +#: part/serializers.py:1455 msgid "Minimum price currency" msgstr "" -#: part/serializers.py:1490 +#: part/serializers.py:1462 msgid "Maximum Price" msgstr "" -#: part/serializers.py:1491 +#: part/serializers.py:1463 msgid "Override calculated value for maximum price" msgstr "" -#: part/serializers.py:1498 +#: part/serializers.py:1470 msgid "Maximum price currency" msgstr "" -#: part/serializers.py:1527 +#: part/serializers.py:1499 msgid "Update" msgstr "" -#: part/serializers.py:1528 +#: part/serializers.py:1500 msgid "Update pricing for this part" msgstr "" -#: part/serializers.py:1551 +#: part/serializers.py:1523 #, python-brace-format msgid "Could not convert from provided currencies to {default_currency}" msgstr "" -#: part/serializers.py:1558 +#: part/serializers.py:1530 msgid "Minimum price must not be greater than maximum price" msgstr "" -#: part/serializers.py:1561 +#: part/serializers.py:1533 msgid "Maximum price must not be less than minimum price" msgstr "" -#: part/serializers.py:1715 +#: part/serializers.py:1687 msgid "Select the parent assembly" msgstr "" -#: part/serializers.py:1735 +#: part/serializers.py:1707 msgid "Select the component part" msgstr "" -#: part/serializers.py:1929 +#: part/serializers.py:1901 msgid "Select part to copy BOM from" msgstr "" -#: part/serializers.py:1937 +#: part/serializers.py:1909 msgid "Remove Existing Data" msgstr "" -#: part/serializers.py:1938 +#: part/serializers.py:1910 msgid "Remove existing BOM items before copying" msgstr "" -#: part/serializers.py:1943 +#: part/serializers.py:1915 msgid "Include Inherited" msgstr "" -#: part/serializers.py:1944 +#: part/serializers.py:1916 msgid "Include BOM items which are inherited from templated parts" msgstr "" -#: part/serializers.py:1949 +#: part/serializers.py:1921 msgid "Skip Invalid Rows" msgstr "" -#: part/serializers.py:1950 +#: part/serializers.py:1922 msgid "Enable this option to skip invalid rows" msgstr "" -#: part/serializers.py:1955 +#: part/serializers.py:1927 msgid "Copy Substitute Parts" msgstr "" -#: part/serializers.py:1956 +#: part/serializers.py:1928 msgid "Copy substitute parts when duplicate BOM items" msgstr "" @@ -8455,115 +8459,119 @@ msgstr "" msgid "Quantity does not match serial numbers" msgstr "" -#: stock/models.py:2012 stock/models.py:2917 +#: stock/models.py:1912 +msgid "Cannot assign stock to structural location" +msgstr "" + +#: stock/models.py:2029 stock/models.py:2934 msgid "Test template does not exist" msgstr "" -#: stock/models.py:2030 +#: stock/models.py:2047 msgid "Stock item has been assigned to a sales order" msgstr "" -#: stock/models.py:2034 +#: stock/models.py:2051 msgid "Stock item is installed in another item" msgstr "" -#: stock/models.py:2037 +#: stock/models.py:2054 msgid "Stock item contains other items" msgstr "" -#: stock/models.py:2040 +#: stock/models.py:2057 msgid "Stock item has been assigned to a customer" msgstr "" -#: stock/models.py:2043 stock/models.py:2226 +#: stock/models.py:2060 stock/models.py:2243 msgid "Stock item is currently in production" msgstr "" -#: stock/models.py:2046 +#: stock/models.py:2063 msgid "Serialized stock cannot be merged" msgstr "" -#: stock/models.py:2053 stock/serializers.py:1462 +#: stock/models.py:2070 stock/serializers.py:1462 msgid "Duplicate stock items" msgstr "" -#: stock/models.py:2057 +#: stock/models.py:2074 msgid "Stock items must refer to the same part" msgstr "" -#: stock/models.py:2065 +#: stock/models.py:2082 msgid "Stock items must refer to the same supplier part" msgstr "" -#: stock/models.py:2070 +#: stock/models.py:2087 msgid "Stock status codes must match" msgstr "" -#: stock/models.py:2349 +#: stock/models.py:2366 msgid "StockItem cannot be moved as it is not in stock" msgstr "" -#: stock/models.py:2818 +#: stock/models.py:2835 msgid "Stock Item Tracking" msgstr "" -#: stock/models.py:2849 +#: stock/models.py:2866 msgid "Entry notes" msgstr "" -#: stock/models.py:2889 +#: stock/models.py:2906 msgid "Stock Item Test Result" msgstr "" -#: stock/models.py:2920 +#: stock/models.py:2937 msgid "Value must be provided for this test" msgstr "" -#: stock/models.py:2924 +#: stock/models.py:2941 msgid "Attachment must be uploaded for this test" msgstr "" -#: stock/models.py:2929 +#: stock/models.py:2946 msgid "Invalid value for this test" msgstr "" -#: stock/models.py:2953 +#: stock/models.py:2970 msgid "Test result" msgstr "" -#: stock/models.py:2960 +#: stock/models.py:2977 msgid "Test output value" msgstr "" -#: stock/models.py:2968 stock/serializers.py:248 +#: stock/models.py:2985 stock/serializers.py:248 msgid "Test result attachment" msgstr "" -#: stock/models.py:2972 +#: stock/models.py:2989 msgid "Test notes" msgstr "" -#: stock/models.py:2980 +#: stock/models.py:2997 msgid "Test station" msgstr "" -#: stock/models.py:2981 +#: stock/models.py:2998 msgid "The identifier of the test station where the test was performed" msgstr "" -#: stock/models.py:2987 +#: stock/models.py:3004 msgid "Started" msgstr "" -#: stock/models.py:2988 +#: stock/models.py:3005 msgid "The timestamp of the test start" msgstr "" -#: stock/models.py:2994 +#: stock/models.py:3011 msgid "Finished" msgstr "" -#: stock/models.py:2995 +#: stock/models.py:3012 msgid "The timestamp of the test finish" msgstr "" @@ -8902,83 +8910,87 @@ msgstr "เพิ่มสต็อกแล้ว" msgid "Stock manually removed" msgstr "ลบสต็อกแล้ว" -#: stock/status_codes.py:57 +#: stock/status_codes.py:56 +msgid "Serialized stock items" +msgstr "" + +#: stock/status_codes.py:58 msgid "Returned to stock" msgstr "" -#: stock/status_codes.py:60 +#: stock/status_codes.py:61 msgid "Location changed" msgstr "เปลี่ยนสถานที่แล้ว" -#: stock/status_codes.py:61 +#: stock/status_codes.py:62 msgid "Stock updated" msgstr "อัพเดทสต็อกแล้ว" -#: stock/status_codes.py:64 +#: stock/status_codes.py:65 msgid "Installed into assembly" msgstr "" -#: stock/status_codes.py:65 +#: stock/status_codes.py:66 msgid "Removed from assembly" msgstr "" -#: stock/status_codes.py:67 +#: stock/status_codes.py:68 msgid "Installed component item" msgstr "" -#: stock/status_codes.py:68 +#: stock/status_codes.py:69 msgid "Removed component item" msgstr "" -#: stock/status_codes.py:71 +#: stock/status_codes.py:72 msgid "Split from parent item" msgstr "" -#: stock/status_codes.py:72 +#: stock/status_codes.py:73 msgid "Split child item" msgstr "" -#: stock/status_codes.py:75 +#: stock/status_codes.py:76 msgid "Merged stock items" msgstr "" -#: stock/status_codes.py:78 +#: stock/status_codes.py:79 msgid "Converted to variant" msgstr "" -#: stock/status_codes.py:81 +#: stock/status_codes.py:82 msgid "Build order output created" msgstr "" -#: stock/status_codes.py:82 +#: stock/status_codes.py:83 msgid "Build order output completed" msgstr "" -#: stock/status_codes.py:83 +#: stock/status_codes.py:84 msgid "Build order output rejected" msgstr "" -#: stock/status_codes.py:84 +#: stock/status_codes.py:85 msgid "Consumed by build order" msgstr "" -#: stock/status_codes.py:87 +#: stock/status_codes.py:88 msgid "Shipped against Sales Order" msgstr "" -#: stock/status_codes.py:90 +#: stock/status_codes.py:91 msgid "Received against Purchase Order" msgstr "" -#: stock/status_codes.py:93 +#: stock/status_codes.py:94 msgid "Returned against Return Order" msgstr "" -#: stock/status_codes.py:96 +#: stock/status_codes.py:97 msgid "Sent to customer" msgstr "จัดส่งให้ลูกค้าแล้ว" -#: stock/status_codes.py:97 +#: stock/status_codes.py:98 msgid "Returned from customer" msgstr "" diff --git a/src/backend/InvenTree/locale/tr/LC_MESSAGES/django.po b/src/backend/InvenTree/locale/tr/LC_MESSAGES/django.po index 4437e38fb5..0dcb0c5e18 100644 --- a/src/backend/InvenTree/locale/tr/LC_MESSAGES/django.po +++ b/src/backend/InvenTree/locale/tr/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: inventree\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-11-19 04:55+0000\n" -"PO-Revision-Date: 2025-11-19 04:59\n" +"POT-Creation-Date: 2025-11-24 06:50+0000\n" +"PO-Revision-Date: 2025-11-24 06:54\n" "Last-Translator: \n" "Language-Team: Turkish\n" "Language: tr_TR\n" @@ -81,21 +81,21 @@ msgstr "Sağlanan e-posta adresi geçerli değil." msgid "The provided email domain is not approved." msgstr "Sağlanan e-posta alanı onaylanmadı." -#: InvenTree/conversion.py:166 +#: InvenTree/conversion.py:240 #, python-brace-format msgid "Invalid unit provided ({unit})" msgstr "Geçersiz ürün girildi ({unit})" -#: InvenTree/conversion.py:183 +#: InvenTree/conversion.py:257 msgid "No value provided" msgstr "Değer verilmemiş" -#: InvenTree/conversion.py:210 +#: InvenTree/conversion.py:284 #, python-brace-format msgid "Could not convert {original} to {unit}" msgstr "{original} birimi {unit} birimine dönüştürülemedi" -#: InvenTree/conversion.py:212 InvenTree/conversion.py:226 +#: InvenTree/conversion.py:286 InvenTree/conversion.py:300 #: InvenTree/helpers.py:597 order/models.py:720 order/models.py:1015 msgid "Invalid quantity provided" msgstr "Geçersiz veri sağlandı" @@ -116,7 +116,7 @@ msgstr "Geçersiz ondalık değer" #: build/serializers.py:580 build/serializers.py:1788 company/models.py:857 #: order/models.py:1780 #: report/templates/report/inventree_build_order_report.html:172 -#: stock/models.py:2848 stock/models.py:2972 stock/serializers.py:717 +#: stock/models.py:2865 stock/models.py:2989 stock/serializers.py:717 #: stock/serializers.py:893 stock/serializers.py:1035 stock/serializers.py:1336 #: stock/serializers.py:1425 stock/serializers.py:1624 msgid "Notes" @@ -345,7 +345,7 @@ msgstr "Geçerli bir numara olmalı" msgid "Currency" msgstr "Para birimi" -#: InvenTree/serializers.py:298 part/serializers.py:1385 +#: InvenTree/serializers.py:298 part/serializers.py:1357 msgid "Select currency from available options" msgstr "Var olan seçeneklerden bir döviz birimi seçin" @@ -553,14 +553,14 @@ msgstr "Varyantları Dahil Et" #: build/api.py:100 build/api.py:466 build/api.py:845 build/models.py:270 #: build/serializers.py:1225 build/serializers.py:1356 -#: build/serializers.py:1427 company/models.py:1067 company/serializers.py:445 +#: build/serializers.py:1427 company/models.py:1067 company/serializers.py:491 #: order/api.py:298 order/api.py:302 order/api.py:929 order/api.py:1187 #: order/api.py:1190 order/models.py:1941 order/models.py:2108 #: order/models.py:2109 part/api.py:1233 part/api.py:1236 part/api.py:1302 #: part/api.py:1589 part/models.py:472 part/models.py:3296 part/models.py:3439 #: part/models.py:3497 part/models.py:3518 part/models.py:3540 #: part/models.py:3679 part/models.py:4046 part/models.py:4368 -#: part/models.py:4787 part/serializers.py:1928 +#: part/models.py:4787 part/serializers.py:1900 #: report/templates/report/inventree_bill_of_materials_report.html:110 #: report/templates/report/inventree_bill_of_materials_report.html:137 #: report/templates/report/inventree_build_order_report.html:109 @@ -582,7 +582,7 @@ msgstr "Parça" #: build/api.py:120 build/api.py:123 build/serializers.py:1438 part/api.py:980 #: part/api.py:1316 part/api.py:1600 part/models.py:1080 part/models.py:3568 -#: part/models.py:4162 part/serializers.py:1752 stock/api.py:869 +#: part/models.py:4162 part/serializers.py:1724 stock/api.py:869 msgid "Category" msgstr "Kategori" @@ -663,7 +663,7 @@ msgid "Optional" msgstr "İsteğe Bağlı" #: build/api.py:455 build/serializers.py:1415 common/setting/system.py:456 -#: part/models.py:1202 part/serializers.py:1714 part/serializers.py:1725 +#: part/models.py:1202 part/serializers.py:1686 part/serializers.py:1697 #: stock/api.py:639 msgid "Assembly" msgstr "Montaj" @@ -688,16 +688,16 @@ msgstr "Ayrıldı" msgid "Consumed" msgstr "Tüketildi" -#: build/api.py:499 company/models.py:912 company/serializers.py:440 +#: build/api.py:499 company/models.py:912 company/serializers.py:474 #: templates/email/build_order_required_stock.html:19 #: templates/email/low_stock_notification.html:17 #: templates/email/part_event_notification.html:18 msgid "Available" msgstr "Mevcut" -#: build/api.py:523 build/serializers.py:1466 company/serializers.py:437 -#: order/serializers.py:1281 part/serializers.py:959 part/serializers.py:1306 -#: part/serializers.py:1761 +#: build/api.py:523 build/serializers.py:1466 company/serializers.py:471 +#: order/serializers.py:1281 part/serializers.py:931 part/serializers.py:1278 +#: part/serializers.py:1733 msgid "On Order" msgstr "Siparişte" @@ -963,7 +963,7 @@ msgstr "Yapım işi çıktısı, yapım işi emri ile eşleşmiyor" #: build/models.py:1136 build/models.py:1234 build/serializers.py:285 #: build/serializers.py:335 build/serializers.py:965 build/serializers.py:1739 #: order/models.py:717 order/serializers.py:658 order/serializers.py:844 -#: part/serializers.py:1708 stock/models.py:940 stock/models.py:1430 +#: part/serializers.py:1680 stock/models.py:940 stock/models.py:1430 #: stock/models.py:1878 stock/serializers.py:688 stock/serializers.py:1580 msgid "Quantity must be greater than zero" msgstr "Miktar sıfırdan büyük olmalıdır" @@ -1385,20 +1385,20 @@ msgstr "Çeşide İzin Ver" msgid "BOM Item" msgstr "ML Ögesi" -#: build/serializers.py:1467 order/serializers.py:1282 part/serializers.py:1310 -#: part/serializers.py:1765 +#: build/serializers.py:1467 order/serializers.py:1282 part/serializers.py:1282 +#: part/serializers.py:1737 msgid "In Production" msgstr "Üretimde" -#: build/serializers.py:1469 part/serializers.py:950 part/serializers.py:1314 +#: build/serializers.py:1469 part/serializers.py:922 part/serializers.py:1286 msgid "Scheduled to Build" msgstr "Üretim için planlandı" -#: build/serializers.py:1472 part/serializers.py:987 +#: build/serializers.py:1472 part/serializers.py:959 msgid "External Stock" msgstr "Harici Stok" -#: build/serializers.py:1473 part/serializers.py:1300 part/serializers.py:1808 +#: build/serializers.py:1473 part/serializers.py:1272 part/serializers.py:1780 msgid "Available Stock" msgstr "Mevcut Stok" @@ -1588,7 +1588,7 @@ msgstr "Kullanıcı" msgid "Price break quantity" msgstr "Fiyat düşürme miktarı" -#: common/models.py:1348 company/serializers.py:564 order/models.py:1842 +#: common/models.py:1348 company/serializers.py:357 order/models.py:1842 #: order/models.py:3043 msgid "Price" msgstr "Fiyat" @@ -1760,7 +1760,7 @@ msgstr "Tanımlama" msgid "Unit definition" msgstr "Birim tanımlaması" -#: common/models.py:1911 common/models.py:1974 stock/models.py:2967 +#: common/models.py:1911 common/models.py:1974 stock/models.py:2984 #: stock/serializers.py:247 msgid "Attachment" msgstr "Ek" @@ -1839,7 +1839,7 @@ msgstr "İş mantığında bu özel duruma eşit olan durum mantıksal anahtarı #: common/models.py:2090 common/models.py:2329 company/models.py:622 #: machine/serializers.py:27 -#: report/templates/report/inventree_test_report.html:104 stock/models.py:2959 +#: report/templates/report/inventree_test_report.html:104 stock/models.py:2976 msgid "Value" msgstr "Değer" @@ -2048,7 +2048,7 @@ msgid "Response data from the barcode scan" msgstr "Barkod taramasından gelen yanıt verisi" #: common/models.py:2417 report/templates/report/inventree_test_report.html:103 -#: stock/models.py:2953 +#: stock/models.py:2970 msgid "Result" msgstr "Sonuç" @@ -2141,8 +2141,8 @@ msgid "Linked thread for this message" msgstr "Bu mesaja bağlı konu" #: common/models.py:2656 -msgid "Prioriy" -msgstr "Öncelik" +msgid "Priority" +msgstr "" #: common/models.py:2698 msgid "Email Thread" @@ -2671,8 +2671,8 @@ msgstr "Parçaları varsayılan olan şablondur" msgid "Parts can be assembled from other components by default" msgstr "Parçalar varsayılan olarak başka bileşenlerden monte edilebilir" -#: common/setting/system.py:462 part/models.py:1208 part/serializers.py:1734 -#: part/serializers.py:1741 +#: common/setting/system.py:462 part/models.py:1208 part/serializers.py:1706 +#: part/serializers.py:1713 msgid "Component" msgstr "Bileşen" @@ -3772,7 +3772,7 @@ msgstr "" msgid "Supplier is Active" msgstr "" -#: company/api.py:307 company/models.py:520 company/serializers.py:457 +#: company/api.py:307 company/models.py:520 company/serializers.py:503 #: part/serializers.py:566 msgid "Manufacturer" msgstr "Üretici" @@ -3964,7 +3964,7 @@ msgid "Link to address information (external)" msgstr "" #: company/models.py:492 company/models.py:609 company/models.py:832 -#: company/serializers.py:471 stock/api.py:561 +#: company/serializers.py:517 stock/api.py:561 msgid "Manufacturer Part" msgstr "" @@ -3981,7 +3981,7 @@ msgstr "Parça seçin" msgid "Select manufacturer" msgstr "Üretici seçin" -#: company/models.py:527 company/serializers.py:479 order/serializers.py:734 +#: company/models.py:527 company/serializers.py:525 order/serializers.py:734 #: part/serializers.py:576 msgid "MPN" msgstr "ÜPN" @@ -4030,7 +4030,7 @@ msgstr "" msgid "Linked manufacturer part must reference the same base part" msgstr "" -#: company/models.py:810 company/serializers.py:449 company/serializers.py:467 +#: company/models.py:810 company/serializers.py:495 company/serializers.py:513 #: order/models.py:639 part/serializers.py:550 #: plugin/builtin/suppliers/digikey.py:26 plugin/builtin/suppliers/lcsc.py:27 #: plugin/builtin/suppliers/mouser.py:25 plugin/builtin/suppliers/tme.py:27 @@ -4134,10 +4134,14 @@ msgstr "" msgid "Company Name" msgstr "" -#: company/serializers.py:433 part/serializers.py:955 stock/serializers.py:428 +#: company/serializers.py:467 part/serializers.py:927 stock/serializers.py:428 msgid "In Stock" msgstr "" +#: company/serializers.py:484 +msgid "Price Breaks" +msgstr "" + #: data_exporter/mixins.py:325 data_exporter/mixins.py:403 msgid "Error occurred during data export" msgstr "" @@ -4290,7 +4294,7 @@ msgstr "" msgid "Errors" msgstr "" -#: importer/models.py:550 part/serializers.py:1268 +#: importer/models.py:550 part/serializers.py:1240 msgid "Valid" msgstr "" @@ -5677,7 +5681,7 @@ msgstr "" msgid "Part category" msgstr "" -#: part/models.py:1088 part/serializers.py:929 +#: part/models.py:1088 part/serializers.py:901 #: report/templates/report/inventree_stock_location_report.html:103 msgid "IPN" msgstr "DPN" @@ -5718,7 +5722,7 @@ msgstr "" msgid "Expiry time (in days) for stock items of this part" msgstr "" -#: part/models.py:1186 part/serializers.py:1003 +#: part/models.py:1186 part/serializers.py:975 msgid "Minimum Stock" msgstr "Minimum Stok" @@ -6418,203 +6422,203 @@ msgstr "" msgid "Supplier part matching this SKU already exists" msgstr "" -#: part/serializers.py:914 +#: part/serializers.py:886 msgid "Category Name" msgstr "" -#: part/serializers.py:943 +#: part/serializers.py:915 msgid "Building" msgstr "" -#: part/serializers.py:944 +#: part/serializers.py:916 msgid "Quantity of this part currently being in production" msgstr "" -#: part/serializers.py:951 +#: part/serializers.py:923 msgid "Outstanding quantity of this part scheduled to be built" msgstr "" -#: part/serializers.py:971 stock/serializers.py:1019 stock/serializers.py:1189 +#: part/serializers.py:943 stock/serializers.py:1019 stock/serializers.py:1189 #: users/ruleset.py:30 msgid "Stock Items" msgstr "Stok Kalemleri" -#: part/serializers.py:975 +#: part/serializers.py:947 msgid "Revisions" msgstr "" -#: part/serializers.py:979 +#: part/serializers.py:951 msgid "Suppliers" msgstr "" -#: part/serializers.py:983 part/serializers.py:1297 +#: part/serializers.py:955 part/serializers.py:1269 #: templates/email/low_stock_notification.html:16 #: templates/email/part_event_notification.html:17 msgid "Total Stock" msgstr "" -#: part/serializers.py:991 +#: part/serializers.py:963 msgid "Unallocated Stock" msgstr "" -#: part/serializers.py:999 +#: part/serializers.py:971 msgid "Variant Stock" msgstr "" -#: part/serializers.py:1054 +#: part/serializers.py:1026 msgid "Duplicate Part" msgstr "" -#: part/serializers.py:1055 +#: part/serializers.py:1027 msgid "Copy initial data from another Part" msgstr "" -#: part/serializers.py:1061 +#: part/serializers.py:1033 msgid "Initial Stock" msgstr "" -#: part/serializers.py:1062 +#: part/serializers.py:1034 msgid "Create Part with initial stock quantity" msgstr "" -#: part/serializers.py:1068 +#: part/serializers.py:1040 msgid "Supplier Information" msgstr "" -#: part/serializers.py:1069 +#: part/serializers.py:1041 msgid "Add initial supplier information for this part" msgstr "" -#: part/serializers.py:1077 +#: part/serializers.py:1049 msgid "Copy Category Parameters" msgstr "" -#: part/serializers.py:1078 +#: part/serializers.py:1050 msgid "Copy parameter templates from selected part category" msgstr "" -#: part/serializers.py:1083 +#: part/serializers.py:1055 msgid "Existing Image" msgstr "" -#: part/serializers.py:1084 +#: part/serializers.py:1056 msgid "Filename of an existing part image" msgstr "" -#: part/serializers.py:1101 +#: part/serializers.py:1073 msgid "Image file does not exist" msgstr "" -#: part/serializers.py:1269 +#: part/serializers.py:1241 msgid "Validate entire Bill of Materials" msgstr "" -#: part/serializers.py:1303 part/serializers.py:1769 +#: part/serializers.py:1275 part/serializers.py:1741 msgid "Can Build" msgstr "" -#: part/serializers.py:1320 +#: part/serializers.py:1292 msgid "Required for Build Orders" msgstr "" -#: part/serializers.py:1325 +#: part/serializers.py:1297 msgid "Allocated to Build Orders" msgstr "" -#: part/serializers.py:1332 +#: part/serializers.py:1304 msgid "Required for Sales Orders" msgstr "" -#: part/serializers.py:1336 +#: part/serializers.py:1308 msgid "Allocated to Sales Orders" msgstr "" -#: part/serializers.py:1475 +#: part/serializers.py:1447 msgid "Minimum Price" msgstr "" -#: part/serializers.py:1476 +#: part/serializers.py:1448 msgid "Override calculated value for minimum price" msgstr "" -#: part/serializers.py:1483 +#: part/serializers.py:1455 msgid "Minimum price currency" msgstr "" -#: part/serializers.py:1490 +#: part/serializers.py:1462 msgid "Maximum Price" msgstr "" -#: part/serializers.py:1491 +#: part/serializers.py:1463 msgid "Override calculated value for maximum price" msgstr "" -#: part/serializers.py:1498 +#: part/serializers.py:1470 msgid "Maximum price currency" msgstr "" -#: part/serializers.py:1527 +#: part/serializers.py:1499 msgid "Update" msgstr "" -#: part/serializers.py:1528 +#: part/serializers.py:1500 msgid "Update pricing for this part" msgstr "" -#: part/serializers.py:1551 +#: part/serializers.py:1523 #, python-brace-format msgid "Could not convert from provided currencies to {default_currency}" msgstr "" -#: part/serializers.py:1558 +#: part/serializers.py:1530 msgid "Minimum price must not be greater than maximum price" msgstr "" -#: part/serializers.py:1561 +#: part/serializers.py:1533 msgid "Maximum price must not be less than minimum price" msgstr "" -#: part/serializers.py:1715 +#: part/serializers.py:1687 msgid "Select the parent assembly" msgstr "" -#: part/serializers.py:1735 +#: part/serializers.py:1707 msgid "Select the component part" msgstr "" -#: part/serializers.py:1929 +#: part/serializers.py:1901 msgid "Select part to copy BOM from" msgstr "" -#: part/serializers.py:1937 +#: part/serializers.py:1909 msgid "Remove Existing Data" msgstr "" -#: part/serializers.py:1938 +#: part/serializers.py:1910 msgid "Remove existing BOM items before copying" msgstr "" -#: part/serializers.py:1943 +#: part/serializers.py:1915 msgid "Include Inherited" msgstr "" -#: part/serializers.py:1944 +#: part/serializers.py:1916 msgid "Include BOM items which are inherited from templated parts" msgstr "" -#: part/serializers.py:1949 +#: part/serializers.py:1921 msgid "Skip Invalid Rows" msgstr "" -#: part/serializers.py:1950 +#: part/serializers.py:1922 msgid "Enable this option to skip invalid rows" msgstr "" -#: part/serializers.py:1955 +#: part/serializers.py:1927 msgid "Copy Substitute Parts" msgstr "" -#: part/serializers.py:1956 +#: part/serializers.py:1928 msgid "Copy substitute parts when duplicate BOM items" msgstr "" @@ -8455,115 +8459,119 @@ msgstr "" msgid "Quantity does not match serial numbers" msgstr "Miktar seri numaları ile eşleşmiyor" -#: stock/models.py:2012 stock/models.py:2917 +#: stock/models.py:1912 +msgid "Cannot assign stock to structural location" +msgstr "" + +#: stock/models.py:2029 stock/models.py:2934 msgid "Test template does not exist" msgstr "" -#: stock/models.py:2030 +#: stock/models.py:2047 msgid "Stock item has been assigned to a sales order" msgstr "" -#: stock/models.py:2034 +#: stock/models.py:2051 msgid "Stock item is installed in another item" msgstr "" -#: stock/models.py:2037 +#: stock/models.py:2054 msgid "Stock item contains other items" msgstr "" -#: stock/models.py:2040 +#: stock/models.py:2057 msgid "Stock item has been assigned to a customer" msgstr "" -#: stock/models.py:2043 stock/models.py:2226 +#: stock/models.py:2060 stock/models.py:2243 msgid "Stock item is currently in production" msgstr "" -#: stock/models.py:2046 +#: stock/models.py:2063 msgid "Serialized stock cannot be merged" msgstr "" -#: stock/models.py:2053 stock/serializers.py:1462 +#: stock/models.py:2070 stock/serializers.py:1462 msgid "Duplicate stock items" msgstr "" -#: stock/models.py:2057 +#: stock/models.py:2074 msgid "Stock items must refer to the same part" msgstr "" -#: stock/models.py:2065 +#: stock/models.py:2082 msgid "Stock items must refer to the same supplier part" msgstr "" -#: stock/models.py:2070 +#: stock/models.py:2087 msgid "Stock status codes must match" msgstr "" -#: stock/models.py:2349 +#: stock/models.py:2366 msgid "StockItem cannot be moved as it is not in stock" msgstr "Stok kalemi stokta olmadığı için taşınamaz" -#: stock/models.py:2818 +#: stock/models.py:2835 msgid "Stock Item Tracking" msgstr "" -#: stock/models.py:2849 +#: stock/models.py:2866 msgid "Entry notes" msgstr "" -#: stock/models.py:2889 +#: stock/models.py:2906 msgid "Stock Item Test Result" msgstr "" -#: stock/models.py:2920 +#: stock/models.py:2937 msgid "Value must be provided for this test" msgstr "" -#: stock/models.py:2924 +#: stock/models.py:2941 msgid "Attachment must be uploaded for this test" msgstr "" -#: stock/models.py:2929 +#: stock/models.py:2946 msgid "Invalid value for this test" msgstr "" -#: stock/models.py:2953 +#: stock/models.py:2970 msgid "Test result" msgstr "" -#: stock/models.py:2960 +#: stock/models.py:2977 msgid "Test output value" msgstr "" -#: stock/models.py:2968 stock/serializers.py:248 +#: stock/models.py:2985 stock/serializers.py:248 msgid "Test result attachment" msgstr "" -#: stock/models.py:2972 +#: stock/models.py:2989 msgid "Test notes" msgstr "" -#: stock/models.py:2980 +#: stock/models.py:2997 msgid "Test station" msgstr "" -#: stock/models.py:2981 +#: stock/models.py:2998 msgid "The identifier of the test station where the test was performed" msgstr "" -#: stock/models.py:2987 +#: stock/models.py:3004 msgid "Started" msgstr "" -#: stock/models.py:2988 +#: stock/models.py:3005 msgid "The timestamp of the test start" msgstr "" -#: stock/models.py:2994 +#: stock/models.py:3011 msgid "Finished" msgstr "" -#: stock/models.py:2995 +#: stock/models.py:3012 msgid "The timestamp of the test finish" msgstr "" @@ -8902,83 +8910,87 @@ msgstr "Stok manuel olarak eklendi" msgid "Stock manually removed" msgstr "Stok manuel olarak çıkarıldı" -#: stock/status_codes.py:57 +#: stock/status_codes.py:56 +msgid "Serialized stock items" +msgstr "" + +#: stock/status_codes.py:58 msgid "Returned to stock" msgstr "" -#: stock/status_codes.py:60 +#: stock/status_codes.py:61 msgid "Location changed" msgstr "Konum değişti" -#: stock/status_codes.py:61 +#: stock/status_codes.py:62 msgid "Stock updated" msgstr "Stok Güncellendi" -#: stock/status_codes.py:64 +#: stock/status_codes.py:65 msgid "Installed into assembly" msgstr "Montajda kullanıldı" -#: stock/status_codes.py:65 +#: stock/status_codes.py:66 msgid "Removed from assembly" msgstr "Montajdan çıkarıldı" -#: stock/status_codes.py:67 +#: stock/status_codes.py:68 msgid "Installed component item" msgstr "Bileşen ögesinde kullanıldı" -#: stock/status_codes.py:68 +#: stock/status_codes.py:69 msgid "Removed component item" msgstr "Bileşen ögesinden çıkarıldı" -#: stock/status_codes.py:71 +#: stock/status_codes.py:72 msgid "Split from parent item" msgstr "Üst ögeden ayır" -#: stock/status_codes.py:72 +#: stock/status_codes.py:73 msgid "Split child item" msgstr "Alt ögeyi ayır" -#: stock/status_codes.py:75 +#: stock/status_codes.py:76 msgid "Merged stock items" msgstr "Stok parçalarını birleştir" -#: stock/status_codes.py:78 +#: stock/status_codes.py:79 msgid "Converted to variant" msgstr "" -#: stock/status_codes.py:81 +#: stock/status_codes.py:82 msgid "Build order output created" msgstr "Yapım emri çıktısı oluşturuldu" -#: stock/status_codes.py:82 +#: stock/status_codes.py:83 msgid "Build order output completed" msgstr "Yapım emri çıktısı tamamlandı" -#: stock/status_codes.py:83 +#: stock/status_codes.py:84 msgid "Build order output rejected" msgstr "" -#: stock/status_codes.py:84 +#: stock/status_codes.py:85 msgid "Consumed by build order" msgstr "" -#: stock/status_codes.py:87 +#: stock/status_codes.py:88 msgid "Shipped against Sales Order" msgstr "" -#: stock/status_codes.py:90 +#: stock/status_codes.py:91 msgid "Received against Purchase Order" msgstr "" -#: stock/status_codes.py:93 +#: stock/status_codes.py:94 msgid "Returned against Return Order" msgstr "" -#: stock/status_codes.py:96 +#: stock/status_codes.py:97 msgid "Sent to customer" msgstr "Müşteriye gönderildi" -#: stock/status_codes.py:97 +#: stock/status_codes.py:98 msgid "Returned from customer" msgstr "Müşteriden geri döndü" diff --git a/src/backend/InvenTree/locale/uk/LC_MESSAGES/django.po b/src/backend/InvenTree/locale/uk/LC_MESSAGES/django.po index b4e1c4e932..cd95d35118 100644 --- a/src/backend/InvenTree/locale/uk/LC_MESSAGES/django.po +++ b/src/backend/InvenTree/locale/uk/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: inventree\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-11-19 04:55+0000\n" -"PO-Revision-Date: 2025-11-19 04:59\n" +"POT-Creation-Date: 2025-11-24 06:50+0000\n" +"PO-Revision-Date: 2025-11-24 06:54\n" "Last-Translator: \n" "Language-Team: Ukrainian\n" "Language: uk_UA\n" @@ -81,21 +81,21 @@ msgstr "Вказана основна адреса електронної пош msgid "The provided email domain is not approved." msgstr "Наданий домен електронної пошти не затверджено." -#: InvenTree/conversion.py:166 +#: InvenTree/conversion.py:240 #, python-brace-format msgid "Invalid unit provided ({unit})" msgstr "Надано неправильну одиницю виміру ({unit})" -#: InvenTree/conversion.py:183 +#: InvenTree/conversion.py:257 msgid "No value provided" msgstr "Значення не вказане" -#: InvenTree/conversion.py:210 +#: InvenTree/conversion.py:284 #, python-brace-format msgid "Could not convert {original} to {unit}" msgstr "Не вдалося перетворити {original} на {unit}" -#: InvenTree/conversion.py:212 InvenTree/conversion.py:226 +#: InvenTree/conversion.py:286 InvenTree/conversion.py:300 #: InvenTree/helpers.py:597 order/models.py:720 order/models.py:1015 msgid "Invalid quantity provided" msgstr "Невірна кількість" @@ -116,7 +116,7 @@ msgstr "Неправильне десяткове значення" #: build/serializers.py:580 build/serializers.py:1788 company/models.py:857 #: order/models.py:1780 #: report/templates/report/inventree_build_order_report.html:172 -#: stock/models.py:2848 stock/models.py:2972 stock/serializers.py:717 +#: stock/models.py:2865 stock/models.py:2989 stock/serializers.py:717 #: stock/serializers.py:893 stock/serializers.py:1035 stock/serializers.py:1336 #: stock/serializers.py:1425 stock/serializers.py:1624 msgid "Notes" @@ -345,7 +345,7 @@ msgstr "" msgid "Currency" msgstr "" -#: InvenTree/serializers.py:298 part/serializers.py:1385 +#: InvenTree/serializers.py:298 part/serializers.py:1357 msgid "Select currency from available options" msgstr "" @@ -553,14 +553,14 @@ msgstr "" #: build/api.py:100 build/api.py:466 build/api.py:845 build/models.py:270 #: build/serializers.py:1225 build/serializers.py:1356 -#: build/serializers.py:1427 company/models.py:1067 company/serializers.py:445 +#: build/serializers.py:1427 company/models.py:1067 company/serializers.py:491 #: order/api.py:298 order/api.py:302 order/api.py:929 order/api.py:1187 #: order/api.py:1190 order/models.py:1941 order/models.py:2108 #: order/models.py:2109 part/api.py:1233 part/api.py:1236 part/api.py:1302 #: part/api.py:1589 part/models.py:472 part/models.py:3296 part/models.py:3439 #: part/models.py:3497 part/models.py:3518 part/models.py:3540 #: part/models.py:3679 part/models.py:4046 part/models.py:4368 -#: part/models.py:4787 part/serializers.py:1928 +#: part/models.py:4787 part/serializers.py:1900 #: report/templates/report/inventree_bill_of_materials_report.html:110 #: report/templates/report/inventree_bill_of_materials_report.html:137 #: report/templates/report/inventree_build_order_report.html:109 @@ -582,7 +582,7 @@ msgstr "Деталь" #: build/api.py:120 build/api.py:123 build/serializers.py:1438 part/api.py:980 #: part/api.py:1316 part/api.py:1600 part/models.py:1080 part/models.py:3568 -#: part/models.py:4162 part/serializers.py:1752 stock/api.py:869 +#: part/models.py:4162 part/serializers.py:1724 stock/api.py:869 msgid "Category" msgstr "" @@ -663,7 +663,7 @@ msgid "Optional" msgstr "" #: build/api.py:455 build/serializers.py:1415 common/setting/system.py:456 -#: part/models.py:1202 part/serializers.py:1714 part/serializers.py:1725 +#: part/models.py:1202 part/serializers.py:1686 part/serializers.py:1697 #: stock/api.py:639 msgid "Assembly" msgstr "Збірка" @@ -688,16 +688,16 @@ msgstr "" msgid "Consumed" msgstr "" -#: build/api.py:499 company/models.py:912 company/serializers.py:440 +#: build/api.py:499 company/models.py:912 company/serializers.py:474 #: templates/email/build_order_required_stock.html:19 #: templates/email/low_stock_notification.html:17 #: templates/email/part_event_notification.html:18 msgid "Available" msgstr "Доступно" -#: build/api.py:523 build/serializers.py:1466 company/serializers.py:437 -#: order/serializers.py:1281 part/serializers.py:959 part/serializers.py:1306 -#: part/serializers.py:1761 +#: build/api.py:523 build/serializers.py:1466 company/serializers.py:471 +#: order/serializers.py:1281 part/serializers.py:931 part/serializers.py:1278 +#: part/serializers.py:1733 msgid "On Order" msgstr "" @@ -963,7 +963,7 @@ msgstr "" #: build/models.py:1136 build/models.py:1234 build/serializers.py:285 #: build/serializers.py:335 build/serializers.py:965 build/serializers.py:1739 #: order/models.py:717 order/serializers.py:658 order/serializers.py:844 -#: part/serializers.py:1708 stock/models.py:940 stock/models.py:1430 +#: part/serializers.py:1680 stock/models.py:940 stock/models.py:1430 #: stock/models.py:1878 stock/serializers.py:688 stock/serializers.py:1580 msgid "Quantity must be greater than zero" msgstr "" @@ -1385,20 +1385,20 @@ msgstr "Дозволити варіанти" msgid "BOM Item" msgstr "" -#: build/serializers.py:1467 order/serializers.py:1282 part/serializers.py:1310 -#: part/serializers.py:1765 +#: build/serializers.py:1467 order/serializers.py:1282 part/serializers.py:1282 +#: part/serializers.py:1737 msgid "In Production" msgstr "У виробництві" -#: build/serializers.py:1469 part/serializers.py:950 part/serializers.py:1314 +#: build/serializers.py:1469 part/serializers.py:922 part/serializers.py:1286 msgid "Scheduled to Build" msgstr "" -#: build/serializers.py:1472 part/serializers.py:987 +#: build/serializers.py:1472 part/serializers.py:959 msgid "External Stock" msgstr "" -#: build/serializers.py:1473 part/serializers.py:1300 part/serializers.py:1808 +#: build/serializers.py:1473 part/serializers.py:1272 part/serializers.py:1780 msgid "Available Stock" msgstr "" @@ -1588,7 +1588,7 @@ msgstr "Користувач" msgid "Price break quantity" msgstr "" -#: common/models.py:1348 company/serializers.py:564 order/models.py:1842 +#: common/models.py:1348 company/serializers.py:357 order/models.py:1842 #: order/models.py:3043 msgid "Price" msgstr "Ціна" @@ -1760,7 +1760,7 @@ msgstr "" msgid "Unit definition" msgstr "" -#: common/models.py:1911 common/models.py:1974 stock/models.py:2967 +#: common/models.py:1911 common/models.py:1974 stock/models.py:2984 #: stock/serializers.py:247 msgid "Attachment" msgstr "" @@ -1839,7 +1839,7 @@ msgstr "" #: common/models.py:2090 common/models.py:2329 company/models.py:622 #: machine/serializers.py:27 -#: report/templates/report/inventree_test_report.html:104 stock/models.py:2959 +#: report/templates/report/inventree_test_report.html:104 stock/models.py:2976 msgid "Value" msgstr "" @@ -2048,7 +2048,7 @@ msgid "Response data from the barcode scan" msgstr "" #: common/models.py:2417 report/templates/report/inventree_test_report.html:103 -#: stock/models.py:2953 +#: stock/models.py:2970 msgid "Result" msgstr "" @@ -2141,7 +2141,7 @@ msgid "Linked thread for this message" msgstr "" #: common/models.py:2656 -msgid "Prioriy" +msgid "Priority" msgstr "" #: common/models.py:2698 @@ -2671,8 +2671,8 @@ msgstr "" msgid "Parts can be assembled from other components by default" msgstr "" -#: common/setting/system.py:462 part/models.py:1208 part/serializers.py:1734 -#: part/serializers.py:1741 +#: common/setting/system.py:462 part/models.py:1208 part/serializers.py:1706 +#: part/serializers.py:1713 msgid "Component" msgstr "Компонент" @@ -3772,7 +3772,7 @@ msgstr "Внутрішня позиція активна" msgid "Supplier is Active" msgstr "" -#: company/api.py:307 company/models.py:520 company/serializers.py:457 +#: company/api.py:307 company/models.py:520 company/serializers.py:503 #: part/serializers.py:566 msgid "Manufacturer" msgstr "Виробник" @@ -3964,7 +3964,7 @@ msgid "Link to address information (external)" msgstr "" #: company/models.py:492 company/models.py:609 company/models.py:832 -#: company/serializers.py:471 stock/api.py:561 +#: company/serializers.py:517 stock/api.py:561 msgid "Manufacturer Part" msgstr "Позиція виробника" @@ -3981,7 +3981,7 @@ msgstr "Обрати позицію" msgid "Select manufacturer" msgstr "" -#: company/models.py:527 company/serializers.py:479 order/serializers.py:734 +#: company/models.py:527 company/serializers.py:525 order/serializers.py:734 #: part/serializers.py:576 msgid "MPN" msgstr "" @@ -4030,7 +4030,7 @@ msgstr "" msgid "Linked manufacturer part must reference the same base part" msgstr "" -#: company/models.py:810 company/serializers.py:449 company/serializers.py:467 +#: company/models.py:810 company/serializers.py:495 company/serializers.py:513 #: order/models.py:639 part/serializers.py:550 #: plugin/builtin/suppliers/digikey.py:26 plugin/builtin/suppliers/lcsc.py:27 #: plugin/builtin/suppliers/mouser.py:25 plugin/builtin/suppliers/tme.py:27 @@ -4134,10 +4134,14 @@ msgstr "" msgid "Company Name" msgstr "" -#: company/serializers.py:433 part/serializers.py:955 stock/serializers.py:428 +#: company/serializers.py:467 part/serializers.py:927 stock/serializers.py:428 msgid "In Stock" msgstr "В наявності" +#: company/serializers.py:484 +msgid "Price Breaks" +msgstr "" + #: data_exporter/mixins.py:325 data_exporter/mixins.py:403 msgid "Error occurred during data export" msgstr "" @@ -4290,7 +4294,7 @@ msgstr "" msgid "Errors" msgstr "" -#: importer/models.py:550 part/serializers.py:1268 +#: importer/models.py:550 part/serializers.py:1240 msgid "Valid" msgstr "Дійсно" @@ -5677,7 +5681,7 @@ msgstr "" msgid "Part category" msgstr "" -#: part/models.py:1088 part/serializers.py:929 +#: part/models.py:1088 part/serializers.py:901 #: report/templates/report/inventree_stock_location_report.html:103 msgid "IPN" msgstr "" @@ -5718,7 +5722,7 @@ msgstr "" msgid "Expiry time (in days) for stock items of this part" msgstr "" -#: part/models.py:1186 part/serializers.py:1003 +#: part/models.py:1186 part/serializers.py:975 msgid "Minimum Stock" msgstr "Мінімальний запас" @@ -6418,203 +6422,203 @@ msgstr "" msgid "Supplier part matching this SKU already exists" msgstr "" -#: part/serializers.py:914 +#: part/serializers.py:886 msgid "Category Name" msgstr "" -#: part/serializers.py:943 +#: part/serializers.py:915 msgid "Building" msgstr "" -#: part/serializers.py:944 +#: part/serializers.py:916 msgid "Quantity of this part currently being in production" msgstr "" -#: part/serializers.py:951 +#: part/serializers.py:923 msgid "Outstanding quantity of this part scheduled to be built" msgstr "" -#: part/serializers.py:971 stock/serializers.py:1019 stock/serializers.py:1189 +#: part/serializers.py:943 stock/serializers.py:1019 stock/serializers.py:1189 #: users/ruleset.py:30 msgid "Stock Items" msgstr "" -#: part/serializers.py:975 +#: part/serializers.py:947 msgid "Revisions" msgstr "" -#: part/serializers.py:979 +#: part/serializers.py:951 msgid "Suppliers" msgstr "" -#: part/serializers.py:983 part/serializers.py:1297 +#: part/serializers.py:955 part/serializers.py:1269 #: templates/email/low_stock_notification.html:16 #: templates/email/part_event_notification.html:17 msgid "Total Stock" msgstr "" -#: part/serializers.py:991 +#: part/serializers.py:963 msgid "Unallocated Stock" msgstr "" -#: part/serializers.py:999 +#: part/serializers.py:971 msgid "Variant Stock" msgstr "" -#: part/serializers.py:1054 +#: part/serializers.py:1026 msgid "Duplicate Part" msgstr "" -#: part/serializers.py:1055 +#: part/serializers.py:1027 msgid "Copy initial data from another Part" msgstr "" -#: part/serializers.py:1061 +#: part/serializers.py:1033 msgid "Initial Stock" msgstr "Початковий запас" -#: part/serializers.py:1062 +#: part/serializers.py:1034 msgid "Create Part with initial stock quantity" msgstr "" -#: part/serializers.py:1068 +#: part/serializers.py:1040 msgid "Supplier Information" msgstr "" -#: part/serializers.py:1069 +#: part/serializers.py:1041 msgid "Add initial supplier information for this part" msgstr "" -#: part/serializers.py:1077 +#: part/serializers.py:1049 msgid "Copy Category Parameters" msgstr "" -#: part/serializers.py:1078 +#: part/serializers.py:1050 msgid "Copy parameter templates from selected part category" msgstr "" -#: part/serializers.py:1083 +#: part/serializers.py:1055 msgid "Existing Image" msgstr "Наявне зображення" -#: part/serializers.py:1084 +#: part/serializers.py:1056 msgid "Filename of an existing part image" msgstr "" -#: part/serializers.py:1101 +#: part/serializers.py:1073 msgid "Image file does not exist" msgstr "" -#: part/serializers.py:1269 +#: part/serializers.py:1241 msgid "Validate entire Bill of Materials" msgstr "" -#: part/serializers.py:1303 part/serializers.py:1769 +#: part/serializers.py:1275 part/serializers.py:1741 msgid "Can Build" msgstr "" -#: part/serializers.py:1320 +#: part/serializers.py:1292 msgid "Required for Build Orders" msgstr "" -#: part/serializers.py:1325 +#: part/serializers.py:1297 msgid "Allocated to Build Orders" msgstr "" -#: part/serializers.py:1332 +#: part/serializers.py:1304 msgid "Required for Sales Orders" msgstr "" -#: part/serializers.py:1336 +#: part/serializers.py:1308 msgid "Allocated to Sales Orders" msgstr "" -#: part/serializers.py:1475 +#: part/serializers.py:1447 msgid "Minimum Price" msgstr "Мінімальна ціна" -#: part/serializers.py:1476 +#: part/serializers.py:1448 msgid "Override calculated value for minimum price" msgstr "" -#: part/serializers.py:1483 +#: part/serializers.py:1455 msgid "Minimum price currency" msgstr "" -#: part/serializers.py:1490 +#: part/serializers.py:1462 msgid "Maximum Price" msgstr "Максимальна ціна" -#: part/serializers.py:1491 +#: part/serializers.py:1463 msgid "Override calculated value for maximum price" msgstr "" -#: part/serializers.py:1498 +#: part/serializers.py:1470 msgid "Maximum price currency" msgstr "" -#: part/serializers.py:1527 +#: part/serializers.py:1499 msgid "Update" msgstr "" -#: part/serializers.py:1528 +#: part/serializers.py:1500 msgid "Update pricing for this part" msgstr "" -#: part/serializers.py:1551 +#: part/serializers.py:1523 #, python-brace-format msgid "Could not convert from provided currencies to {default_currency}" msgstr "" -#: part/serializers.py:1558 +#: part/serializers.py:1530 msgid "Minimum price must not be greater than maximum price" msgstr "" -#: part/serializers.py:1561 +#: part/serializers.py:1533 msgid "Maximum price must not be less than minimum price" msgstr "" -#: part/serializers.py:1715 +#: part/serializers.py:1687 msgid "Select the parent assembly" msgstr "" -#: part/serializers.py:1735 +#: part/serializers.py:1707 msgid "Select the component part" msgstr "" -#: part/serializers.py:1929 +#: part/serializers.py:1901 msgid "Select part to copy BOM from" msgstr "" -#: part/serializers.py:1937 +#: part/serializers.py:1909 msgid "Remove Existing Data" msgstr "" -#: part/serializers.py:1938 +#: part/serializers.py:1910 msgid "Remove existing BOM items before copying" msgstr "" -#: part/serializers.py:1943 +#: part/serializers.py:1915 msgid "Include Inherited" msgstr "" -#: part/serializers.py:1944 +#: part/serializers.py:1916 msgid "Include BOM items which are inherited from templated parts" msgstr "" -#: part/serializers.py:1949 +#: part/serializers.py:1921 msgid "Skip Invalid Rows" msgstr "" -#: part/serializers.py:1950 +#: part/serializers.py:1922 msgid "Enable this option to skip invalid rows" msgstr "" -#: part/serializers.py:1955 +#: part/serializers.py:1927 msgid "Copy Substitute Parts" msgstr "" -#: part/serializers.py:1956 +#: part/serializers.py:1928 msgid "Copy substitute parts when duplicate BOM items" msgstr "" @@ -8455,115 +8459,119 @@ msgstr "" msgid "Quantity does not match serial numbers" msgstr "" -#: stock/models.py:2012 stock/models.py:2917 +#: stock/models.py:1912 +msgid "Cannot assign stock to structural location" +msgstr "" + +#: stock/models.py:2029 stock/models.py:2934 msgid "Test template does not exist" msgstr "" -#: stock/models.py:2030 +#: stock/models.py:2047 msgid "Stock item has been assigned to a sales order" msgstr "" -#: stock/models.py:2034 +#: stock/models.py:2051 msgid "Stock item is installed in another item" msgstr "" -#: stock/models.py:2037 +#: stock/models.py:2054 msgid "Stock item contains other items" msgstr "" -#: stock/models.py:2040 +#: stock/models.py:2057 msgid "Stock item has been assigned to a customer" msgstr "" -#: stock/models.py:2043 stock/models.py:2226 +#: stock/models.py:2060 stock/models.py:2243 msgid "Stock item is currently in production" msgstr "" -#: stock/models.py:2046 +#: stock/models.py:2063 msgid "Serialized stock cannot be merged" msgstr "" -#: stock/models.py:2053 stock/serializers.py:1462 +#: stock/models.py:2070 stock/serializers.py:1462 msgid "Duplicate stock items" msgstr "" -#: stock/models.py:2057 +#: stock/models.py:2074 msgid "Stock items must refer to the same part" msgstr "" -#: stock/models.py:2065 +#: stock/models.py:2082 msgid "Stock items must refer to the same supplier part" msgstr "" -#: stock/models.py:2070 +#: stock/models.py:2087 msgid "Stock status codes must match" msgstr "" -#: stock/models.py:2349 +#: stock/models.py:2366 msgid "StockItem cannot be moved as it is not in stock" msgstr "" -#: stock/models.py:2818 +#: stock/models.py:2835 msgid "Stock Item Tracking" msgstr "" -#: stock/models.py:2849 +#: stock/models.py:2866 msgid "Entry notes" msgstr "" -#: stock/models.py:2889 +#: stock/models.py:2906 msgid "Stock Item Test Result" msgstr "" -#: stock/models.py:2920 +#: stock/models.py:2937 msgid "Value must be provided for this test" msgstr "" -#: stock/models.py:2924 +#: stock/models.py:2941 msgid "Attachment must be uploaded for this test" msgstr "" -#: stock/models.py:2929 +#: stock/models.py:2946 msgid "Invalid value for this test" msgstr "" -#: stock/models.py:2953 +#: stock/models.py:2970 msgid "Test result" msgstr "" -#: stock/models.py:2960 +#: stock/models.py:2977 msgid "Test output value" msgstr "" -#: stock/models.py:2968 stock/serializers.py:248 +#: stock/models.py:2985 stock/serializers.py:248 msgid "Test result attachment" msgstr "" -#: stock/models.py:2972 +#: stock/models.py:2989 msgid "Test notes" msgstr "" -#: stock/models.py:2980 +#: stock/models.py:2997 msgid "Test station" msgstr "" -#: stock/models.py:2981 +#: stock/models.py:2998 msgid "The identifier of the test station where the test was performed" msgstr "" -#: stock/models.py:2987 +#: stock/models.py:3004 msgid "Started" msgstr "" -#: stock/models.py:2988 +#: stock/models.py:3005 msgid "The timestamp of the test start" msgstr "" -#: stock/models.py:2994 +#: stock/models.py:3011 msgid "Finished" msgstr "" -#: stock/models.py:2995 +#: stock/models.py:3012 msgid "The timestamp of the test finish" msgstr "" @@ -8902,83 +8910,87 @@ msgstr "" msgid "Stock manually removed" msgstr "" -#: stock/status_codes.py:57 +#: stock/status_codes.py:56 +msgid "Serialized stock items" +msgstr "" + +#: stock/status_codes.py:58 msgid "Returned to stock" msgstr "" -#: stock/status_codes.py:60 +#: stock/status_codes.py:61 msgid "Location changed" msgstr "" -#: stock/status_codes.py:61 +#: stock/status_codes.py:62 msgid "Stock updated" msgstr "" -#: stock/status_codes.py:64 +#: stock/status_codes.py:65 msgid "Installed into assembly" msgstr "" -#: stock/status_codes.py:65 +#: stock/status_codes.py:66 msgid "Removed from assembly" msgstr "" -#: stock/status_codes.py:67 +#: stock/status_codes.py:68 msgid "Installed component item" msgstr "" -#: stock/status_codes.py:68 +#: stock/status_codes.py:69 msgid "Removed component item" msgstr "" -#: stock/status_codes.py:71 +#: stock/status_codes.py:72 msgid "Split from parent item" msgstr "" -#: stock/status_codes.py:72 +#: stock/status_codes.py:73 msgid "Split child item" msgstr "" -#: stock/status_codes.py:75 +#: stock/status_codes.py:76 msgid "Merged stock items" msgstr "" -#: stock/status_codes.py:78 +#: stock/status_codes.py:79 msgid "Converted to variant" msgstr "" -#: stock/status_codes.py:81 +#: stock/status_codes.py:82 msgid "Build order output created" msgstr "" -#: stock/status_codes.py:82 +#: stock/status_codes.py:83 msgid "Build order output completed" msgstr "" -#: stock/status_codes.py:83 +#: stock/status_codes.py:84 msgid "Build order output rejected" msgstr "" -#: stock/status_codes.py:84 +#: stock/status_codes.py:85 msgid "Consumed by build order" msgstr "" -#: stock/status_codes.py:87 +#: stock/status_codes.py:88 msgid "Shipped against Sales Order" msgstr "" -#: stock/status_codes.py:90 +#: stock/status_codes.py:91 msgid "Received against Purchase Order" msgstr "" -#: stock/status_codes.py:93 +#: stock/status_codes.py:94 msgid "Returned against Return Order" msgstr "" -#: stock/status_codes.py:96 +#: stock/status_codes.py:97 msgid "Sent to customer" msgstr "" -#: stock/status_codes.py:97 +#: stock/status_codes.py:98 msgid "Returned from customer" msgstr "" diff --git a/src/backend/InvenTree/locale/vi/LC_MESSAGES/django.po b/src/backend/InvenTree/locale/vi/LC_MESSAGES/django.po index 6459b48898..b2a77dd004 100644 --- a/src/backend/InvenTree/locale/vi/LC_MESSAGES/django.po +++ b/src/backend/InvenTree/locale/vi/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: inventree\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-11-19 04:55+0000\n" -"PO-Revision-Date: 2025-11-19 04:59\n" +"POT-Creation-Date: 2025-11-24 06:50+0000\n" +"PO-Revision-Date: 2025-11-24 06:54\n" "Last-Translator: \n" "Language-Team: Vietnamese\n" "Language: vi_VN\n" @@ -81,21 +81,21 @@ msgstr "Địa chỉ email chính đã cung cấp không hợp lệ." msgid "The provided email domain is not approved." msgstr "Miền email được cung cấp không được phê duyệt." -#: InvenTree/conversion.py:166 +#: InvenTree/conversion.py:240 #, python-brace-format msgid "Invalid unit provided ({unit})" msgstr "Đơn vị không hợp lệ ({unit})" -#: InvenTree/conversion.py:183 +#: InvenTree/conversion.py:257 msgid "No value provided" msgstr "Chưa cung cấp giá trị" -#: InvenTree/conversion.py:210 +#: InvenTree/conversion.py:284 #, python-brace-format msgid "Could not convert {original} to {unit}" msgstr "Không thể chuyển đổi {original} sang {unit}" -#: InvenTree/conversion.py:212 InvenTree/conversion.py:226 +#: InvenTree/conversion.py:286 InvenTree/conversion.py:300 #: InvenTree/helpers.py:597 order/models.py:720 order/models.py:1015 msgid "Invalid quantity provided" msgstr "Số lượng cung cấp không hợp lệ" @@ -116,7 +116,7 @@ msgstr "" #: build/serializers.py:580 build/serializers.py:1788 company/models.py:857 #: order/models.py:1780 #: report/templates/report/inventree_build_order_report.html:172 -#: stock/models.py:2848 stock/models.py:2972 stock/serializers.py:717 +#: stock/models.py:2865 stock/models.py:2989 stock/serializers.py:717 #: stock/serializers.py:893 stock/serializers.py:1035 stock/serializers.py:1336 #: stock/serializers.py:1425 stock/serializers.py:1624 msgid "Notes" @@ -345,7 +345,7 @@ msgstr "Phải là một số hợp lệ" msgid "Currency" msgstr "Tiền tệ" -#: InvenTree/serializers.py:298 part/serializers.py:1385 +#: InvenTree/serializers.py:298 part/serializers.py:1357 msgid "Select currency from available options" msgstr "Chọn tiền tệ trong các tùy chọn đang có" @@ -553,14 +553,14 @@ msgstr "" #: build/api.py:100 build/api.py:466 build/api.py:845 build/models.py:270 #: build/serializers.py:1225 build/serializers.py:1356 -#: build/serializers.py:1427 company/models.py:1067 company/serializers.py:445 +#: build/serializers.py:1427 company/models.py:1067 company/serializers.py:491 #: order/api.py:298 order/api.py:302 order/api.py:929 order/api.py:1187 #: order/api.py:1190 order/models.py:1941 order/models.py:2108 #: order/models.py:2109 part/api.py:1233 part/api.py:1236 part/api.py:1302 #: part/api.py:1589 part/models.py:472 part/models.py:3296 part/models.py:3439 #: part/models.py:3497 part/models.py:3518 part/models.py:3540 #: part/models.py:3679 part/models.py:4046 part/models.py:4368 -#: part/models.py:4787 part/serializers.py:1928 +#: part/models.py:4787 part/serializers.py:1900 #: report/templates/report/inventree_bill_of_materials_report.html:110 #: report/templates/report/inventree_bill_of_materials_report.html:137 #: report/templates/report/inventree_build_order_report.html:109 @@ -582,7 +582,7 @@ msgstr "Nguyên liệu" #: build/api.py:120 build/api.py:123 build/serializers.py:1438 part/api.py:980 #: part/api.py:1316 part/api.py:1600 part/models.py:1080 part/models.py:3568 -#: part/models.py:4162 part/serializers.py:1752 stock/api.py:869 +#: part/models.py:4162 part/serializers.py:1724 stock/api.py:869 msgid "Category" msgstr "Danh mục" @@ -663,7 +663,7 @@ msgid "Optional" msgstr "Tuỳ chọn" #: build/api.py:455 build/serializers.py:1415 common/setting/system.py:456 -#: part/models.py:1202 part/serializers.py:1714 part/serializers.py:1725 +#: part/models.py:1202 part/serializers.py:1686 part/serializers.py:1697 #: stock/api.py:639 msgid "Assembly" msgstr "Lắp ráp" @@ -688,16 +688,16 @@ msgstr "Đã cấp phát" msgid "Consumed" msgstr "Đã dùng" -#: build/api.py:499 company/models.py:912 company/serializers.py:440 +#: build/api.py:499 company/models.py:912 company/serializers.py:474 #: templates/email/build_order_required_stock.html:19 #: templates/email/low_stock_notification.html:17 #: templates/email/part_event_notification.html:18 msgid "Available" msgstr "Có sẵn" -#: build/api.py:523 build/serializers.py:1466 company/serializers.py:437 -#: order/serializers.py:1281 part/serializers.py:959 part/serializers.py:1306 -#: part/serializers.py:1761 +#: build/api.py:523 build/serializers.py:1466 company/serializers.py:471 +#: order/serializers.py:1281 part/serializers.py:931 part/serializers.py:1278 +#: part/serializers.py:1733 msgid "On Order" msgstr "Bật đơn hàng" @@ -963,7 +963,7 @@ msgstr "Đầu ra bản dựng không phù hợp với đơn đặt bản dựng #: build/models.py:1136 build/models.py:1234 build/serializers.py:285 #: build/serializers.py:335 build/serializers.py:965 build/serializers.py:1739 #: order/models.py:717 order/serializers.py:658 order/serializers.py:844 -#: part/serializers.py:1708 stock/models.py:940 stock/models.py:1430 +#: part/serializers.py:1680 stock/models.py:940 stock/models.py:1430 #: stock/models.py:1878 stock/serializers.py:688 stock/serializers.py:1580 msgid "Quantity must be greater than zero" msgstr "Số lượng phải lớn hơn 0" @@ -1385,20 +1385,20 @@ msgstr "Cho phép biến thể" msgid "BOM Item" msgstr "Mục BOM" -#: build/serializers.py:1467 order/serializers.py:1282 part/serializers.py:1310 -#: part/serializers.py:1765 +#: build/serializers.py:1467 order/serializers.py:1282 part/serializers.py:1282 +#: part/serializers.py:1737 msgid "In Production" msgstr "Đang sản xuất" -#: build/serializers.py:1469 part/serializers.py:950 part/serializers.py:1314 +#: build/serializers.py:1469 part/serializers.py:922 part/serializers.py:1286 msgid "Scheduled to Build" msgstr "" -#: build/serializers.py:1472 part/serializers.py:987 +#: build/serializers.py:1472 part/serializers.py:959 msgid "External Stock" msgstr "Kho ngoài" -#: build/serializers.py:1473 part/serializers.py:1300 part/serializers.py:1808 +#: build/serializers.py:1473 part/serializers.py:1272 part/serializers.py:1780 msgid "Available Stock" msgstr "Số hàng tồn" @@ -1588,7 +1588,7 @@ msgstr "Người dùng" msgid "Price break quantity" msgstr "Số lượng giá phá vỡ" -#: common/models.py:1348 company/serializers.py:564 order/models.py:1842 +#: common/models.py:1348 company/serializers.py:357 order/models.py:1842 #: order/models.py:3043 msgid "Price" msgstr "Giá" @@ -1760,7 +1760,7 @@ msgstr "Định nghĩa" msgid "Unit definition" msgstr "Định nghĩa đơn vị" -#: common/models.py:1911 common/models.py:1974 stock/models.py:2967 +#: common/models.py:1911 common/models.py:1974 stock/models.py:2984 #: stock/serializers.py:247 msgid "Attachment" msgstr "Đính kèm" @@ -1839,7 +1839,7 @@ msgstr "" #: common/models.py:2090 common/models.py:2329 company/models.py:622 #: machine/serializers.py:27 -#: report/templates/report/inventree_test_report.html:104 stock/models.py:2959 +#: report/templates/report/inventree_test_report.html:104 stock/models.py:2976 msgid "Value" msgstr "Giá trị" @@ -2048,7 +2048,7 @@ msgid "Response data from the barcode scan" msgstr "" #: common/models.py:2417 report/templates/report/inventree_test_report.html:103 -#: stock/models.py:2953 +#: stock/models.py:2970 msgid "Result" msgstr "Kết quả" @@ -2141,7 +2141,7 @@ msgid "Linked thread for this message" msgstr "" #: common/models.py:2656 -msgid "Prioriy" +msgid "Priority" msgstr "" #: common/models.py:2698 @@ -2671,8 +2671,8 @@ msgstr "Sản phẩm là mẫu bởi mặc định" msgid "Parts can be assembled from other components by default" msgstr "Sản phẩm có thể lắp giáp từ thành phần khác theo mặc định" -#: common/setting/system.py:462 part/models.py:1208 part/serializers.py:1734 -#: part/serializers.py:1741 +#: common/setting/system.py:462 part/models.py:1208 part/serializers.py:1706 +#: part/serializers.py:1713 msgid "Component" msgstr "Thành phần" @@ -3772,7 +3772,7 @@ msgstr "" msgid "Supplier is Active" msgstr "" -#: company/api.py:307 company/models.py:520 company/serializers.py:457 +#: company/api.py:307 company/models.py:520 company/serializers.py:503 #: part/serializers.py:566 msgid "Manufacturer" msgstr "Nhà sản xuất" @@ -3964,7 +3964,7 @@ msgid "Link to address information (external)" msgstr "Liên kết thông tin địa chỉ (bên ngoài)" #: company/models.py:492 company/models.py:609 company/models.py:832 -#: company/serializers.py:471 stock/api.py:561 +#: company/serializers.py:517 stock/api.py:561 msgid "Manufacturer Part" msgstr "Sản phẩm nhà sản xuất" @@ -3981,7 +3981,7 @@ msgstr "Chọn sản phẩm" msgid "Select manufacturer" msgstr "Chọn nhà sản xuất" -#: company/models.py:527 company/serializers.py:479 order/serializers.py:734 +#: company/models.py:527 company/serializers.py:525 order/serializers.py:734 #: part/serializers.py:576 msgid "MPN" msgstr "" @@ -4030,7 +4030,7 @@ msgstr "Đơn vị đóng gói phải lớn hơn không" msgid "Linked manufacturer part must reference the same base part" msgstr "Sản phẩm nhà sản xuất đã liên kết phải tham chiếu với sản phẩm cơ bản tương tự" -#: company/models.py:810 company/serializers.py:449 company/serializers.py:467 +#: company/models.py:810 company/serializers.py:495 company/serializers.py:513 #: order/models.py:639 part/serializers.py:550 #: plugin/builtin/suppliers/digikey.py:26 plugin/builtin/suppliers/lcsc.py:27 #: plugin/builtin/suppliers/mouser.py:25 plugin/builtin/suppliers/tme.py:27 @@ -4134,10 +4134,14 @@ msgstr "Tiền tệ mặc định được sử dụng cho nhà cung cấp này" msgid "Company Name" msgstr "" -#: company/serializers.py:433 part/serializers.py:955 stock/serializers.py:428 +#: company/serializers.py:467 part/serializers.py:927 stock/serializers.py:428 msgid "In Stock" msgstr "Còn hàng" +#: company/serializers.py:484 +msgid "Price Breaks" +msgstr "" + #: data_exporter/mixins.py:325 data_exporter/mixins.py:403 msgid "Error occurred during data export" msgstr "" @@ -4290,7 +4294,7 @@ msgstr "" msgid "Errors" msgstr "" -#: importer/models.py:550 part/serializers.py:1268 +#: importer/models.py:550 part/serializers.py:1240 msgid "Valid" msgstr "Hợp lệ" @@ -5677,7 +5681,7 @@ msgstr "Từ khóa sản phẩm để cải thiện sự hiện diện trong k msgid "Part category" msgstr "Danh mục sản phẩm" -#: part/models.py:1088 part/serializers.py:929 +#: part/models.py:1088 part/serializers.py:901 #: report/templates/report/inventree_stock_location_report.html:103 msgid "IPN" msgstr "" @@ -5718,7 +5722,7 @@ msgstr "Hết hạn mặc định" msgid "Expiry time (in days) for stock items of this part" msgstr "Thời gian hết hạn (theo ngày) để nhập kho hàng hóa cho sản phẩm này" -#: part/models.py:1186 part/serializers.py:1003 +#: part/models.py:1186 part/serializers.py:975 msgid "Minimum Stock" msgstr "Kho tối thiểu" @@ -6418,203 +6422,203 @@ msgstr "Mã số nhà sản xuất khớp với MPN này đã tồn tại" msgid "Supplier part matching this SKU already exists" msgstr "Mã số nhà cung cấp khớp với SKU này đã tồn tại" -#: part/serializers.py:914 +#: part/serializers.py:886 msgid "Category Name" msgstr "Tên danh mục" -#: part/serializers.py:943 +#: part/serializers.py:915 msgid "Building" msgstr "Đang dựng" -#: part/serializers.py:944 +#: part/serializers.py:916 msgid "Quantity of this part currently being in production" msgstr "" -#: part/serializers.py:951 +#: part/serializers.py:923 msgid "Outstanding quantity of this part scheduled to be built" msgstr "" -#: part/serializers.py:971 stock/serializers.py:1019 stock/serializers.py:1189 +#: part/serializers.py:943 stock/serializers.py:1019 stock/serializers.py:1189 #: users/ruleset.py:30 msgid "Stock Items" msgstr "Hàng trong kho" -#: part/serializers.py:975 +#: part/serializers.py:947 msgid "Revisions" msgstr "" -#: part/serializers.py:979 +#: part/serializers.py:951 msgid "Suppliers" msgstr "Nhà cung cấp" -#: part/serializers.py:983 part/serializers.py:1297 +#: part/serializers.py:955 part/serializers.py:1269 #: templates/email/low_stock_notification.html:16 #: templates/email/part_event_notification.html:17 msgid "Total Stock" msgstr "Tổng số lượng" -#: part/serializers.py:991 +#: part/serializers.py:963 msgid "Unallocated Stock" msgstr "" -#: part/serializers.py:999 +#: part/serializers.py:971 msgid "Variant Stock" msgstr "" -#: part/serializers.py:1054 +#: part/serializers.py:1026 msgid "Duplicate Part" msgstr "Nhân bản sản phẩm" -#: part/serializers.py:1055 +#: part/serializers.py:1027 msgid "Copy initial data from another Part" msgstr "Sao chép dữ liệu ban đầu từ sản phẩm khác" -#: part/serializers.py:1061 +#: part/serializers.py:1033 msgid "Initial Stock" msgstr "Số liệu kho ban đầu" -#: part/serializers.py:1062 +#: part/serializers.py:1034 msgid "Create Part with initial stock quantity" msgstr "Tạo sản phẩm với số lượng tồn kho ban đầu" -#: part/serializers.py:1068 +#: part/serializers.py:1040 msgid "Supplier Information" msgstr "Thông tin nhà cung cấp" -#: part/serializers.py:1069 +#: part/serializers.py:1041 msgid "Add initial supplier information for this part" msgstr "Thêm thông tin nhà cung cấp ban đầu cho sản phẩm này" -#: part/serializers.py:1077 +#: part/serializers.py:1049 msgid "Copy Category Parameters" msgstr "Sao chép thông số nhóm hàng" -#: part/serializers.py:1078 +#: part/serializers.py:1050 msgid "Copy parameter templates from selected part category" msgstr "Sao chép mẫu tham số từ nhóm sản phẩm được chọn" -#: part/serializers.py:1083 +#: part/serializers.py:1055 msgid "Existing Image" msgstr "Ảnh hiện có" -#: part/serializers.py:1084 +#: part/serializers.py:1056 msgid "Filename of an existing part image" msgstr "Tên tệp của ảnh sản phẩm hiện hữu" -#: part/serializers.py:1101 +#: part/serializers.py:1073 msgid "Image file does not exist" msgstr "Tệp hình ảnh không tồn tại" -#: part/serializers.py:1269 +#: part/serializers.py:1241 msgid "Validate entire Bill of Materials" msgstr "Xác minh toàn bộ hóa đơn vật liệu" -#: part/serializers.py:1303 part/serializers.py:1769 +#: part/serializers.py:1275 part/serializers.py:1741 msgid "Can Build" msgstr "Có thể dựng" -#: part/serializers.py:1320 +#: part/serializers.py:1292 msgid "Required for Build Orders" msgstr "" -#: part/serializers.py:1325 +#: part/serializers.py:1297 msgid "Allocated to Build Orders" msgstr "" -#: part/serializers.py:1332 +#: part/serializers.py:1304 msgid "Required for Sales Orders" msgstr "" -#: part/serializers.py:1336 +#: part/serializers.py:1308 msgid "Allocated to Sales Orders" msgstr "" -#: part/serializers.py:1475 +#: part/serializers.py:1447 msgid "Minimum Price" msgstr "Giá thấp nhất" -#: part/serializers.py:1476 +#: part/serializers.py:1448 msgid "Override calculated value for minimum price" msgstr "Giá trị tính toán ghi đè cho giá tối thiểu" -#: part/serializers.py:1483 +#: part/serializers.py:1455 msgid "Minimum price currency" msgstr "Tiền tế giá tối thiểu" -#: part/serializers.py:1490 +#: part/serializers.py:1462 msgid "Maximum Price" msgstr "Giá cao nhất" -#: part/serializers.py:1491 +#: part/serializers.py:1463 msgid "Override calculated value for maximum price" msgstr "Giá trị tính toán ghi đè cho giá tối đa" -#: part/serializers.py:1498 +#: part/serializers.py:1470 msgid "Maximum price currency" msgstr "Tiền tế giá tối đa" -#: part/serializers.py:1527 +#: part/serializers.py:1499 msgid "Update" msgstr "Cập nhật" -#: part/serializers.py:1528 +#: part/serializers.py:1500 msgid "Update pricing for this part" msgstr "Cập nhật giá cho sản phẩm này" -#: part/serializers.py:1551 +#: part/serializers.py:1523 #, python-brace-format msgid "Could not convert from provided currencies to {default_currency}" msgstr "Không thể chuyển đổi từ tiền tệ đã cung cấp cho {default_currency}" -#: part/serializers.py:1558 +#: part/serializers.py:1530 msgid "Minimum price must not be greater than maximum price" msgstr "Giá tối thiểu không được lớn hơn giá tối đa" -#: part/serializers.py:1561 +#: part/serializers.py:1533 msgid "Maximum price must not be less than minimum price" msgstr "Giá tối đa không được nhỏ hơn giá tối thiểu" -#: part/serializers.py:1715 +#: part/serializers.py:1687 msgid "Select the parent assembly" msgstr "" -#: part/serializers.py:1735 +#: part/serializers.py:1707 msgid "Select the component part" msgstr "" -#: part/serializers.py:1929 +#: part/serializers.py:1901 msgid "Select part to copy BOM from" msgstr "Chọn sản phẩm để sao chép định mức nguyên vật liệu" -#: part/serializers.py:1937 +#: part/serializers.py:1909 msgid "Remove Existing Data" msgstr "Xóa dữ liệu đã tồn tại" -#: part/serializers.py:1938 +#: part/serializers.py:1910 msgid "Remove existing BOM items before copying" msgstr "Xóa mục BOM đã tồn tại trước khi sao chép" -#: part/serializers.py:1943 +#: part/serializers.py:1915 msgid "Include Inherited" msgstr "Bao gồm thừa hưởng" -#: part/serializers.py:1944 +#: part/serializers.py:1916 msgid "Include BOM items which are inherited from templated parts" msgstr "Bao gồm mục BOM được thừa hưởng từ sản phẩm mẫu" -#: part/serializers.py:1949 +#: part/serializers.py:1921 msgid "Skip Invalid Rows" msgstr "Bỏ qua dòng không hợp lệ" -#: part/serializers.py:1950 +#: part/serializers.py:1922 msgid "Enable this option to skip invalid rows" msgstr "Bật tùy chọn này để bỏ qua dòng không hợp lệ" -#: part/serializers.py:1955 +#: part/serializers.py:1927 msgid "Copy Substitute Parts" msgstr "Sao chép sản phẩm thay thế" -#: part/serializers.py:1956 +#: part/serializers.py:1928 msgid "Copy substitute parts when duplicate BOM items" msgstr "Sao chép sản phẩm thay thế khi nhân bản hàng hóa BOM" @@ -8455,115 +8459,119 @@ msgstr "" msgid "Quantity does not match serial numbers" msgstr "Số lượng không khớp với số sêri" -#: stock/models.py:2012 stock/models.py:2917 +#: stock/models.py:1912 +msgid "Cannot assign stock to structural location" +msgstr "" + +#: stock/models.py:2029 stock/models.py:2934 msgid "Test template does not exist" msgstr "" -#: stock/models.py:2030 +#: stock/models.py:2047 msgid "Stock item has been assigned to a sales order" msgstr "Hàng trong kho đã được gán vào đơn hàng bán" -#: stock/models.py:2034 +#: stock/models.py:2051 msgid "Stock item is installed in another item" msgstr "Hàng trong kho đã được cài đặt vào hàng hóa khác" -#: stock/models.py:2037 +#: stock/models.py:2054 msgid "Stock item contains other items" msgstr "Hàng trong kho chứa hàng hóa khác" -#: stock/models.py:2040 +#: stock/models.py:2057 msgid "Stock item has been assigned to a customer" msgstr "Hàng trong kho đã được gắn với một khách hàng" -#: stock/models.py:2043 stock/models.py:2226 +#: stock/models.py:2060 stock/models.py:2243 msgid "Stock item is currently in production" msgstr "Hàng trong kho hiện đang sản xuất" -#: stock/models.py:2046 +#: stock/models.py:2063 msgid "Serialized stock cannot be merged" msgstr "Không thể hợp nhất kho nối tiếp" -#: stock/models.py:2053 stock/serializers.py:1462 +#: stock/models.py:2070 stock/serializers.py:1462 msgid "Duplicate stock items" msgstr "Mặt hàng trùng lặp" -#: stock/models.py:2057 +#: stock/models.py:2074 msgid "Stock items must refer to the same part" msgstr "Mặt hàng phải tham chiếu đến sản phẩm tương tự" -#: stock/models.py:2065 +#: stock/models.py:2082 msgid "Stock items must refer to the same supplier part" msgstr "Mặt hàng phải tham chiếu đến sản phẩm nhà cung cấp tương tự" -#: stock/models.py:2070 +#: stock/models.py:2087 msgid "Stock status codes must match" msgstr "Mã trạng thái kho phải phù hợp" -#: stock/models.py:2349 +#: stock/models.py:2366 msgid "StockItem cannot be moved as it is not in stock" msgstr "Không thể xóa mặt hàng không ở trong kho" -#: stock/models.py:2818 +#: stock/models.py:2835 msgid "Stock Item Tracking" msgstr "" -#: stock/models.py:2849 +#: stock/models.py:2866 msgid "Entry notes" msgstr "Ghi chú đầu vào" -#: stock/models.py:2889 +#: stock/models.py:2906 msgid "Stock Item Test Result" msgstr "" -#: stock/models.py:2920 +#: stock/models.py:2937 msgid "Value must be provided for this test" msgstr "Phải cung cấp giá trị cho kiểm thử này" -#: stock/models.py:2924 +#: stock/models.py:2941 msgid "Attachment must be uploaded for this test" msgstr "Phải tải liên đính kèm cho kiểm thử này" -#: stock/models.py:2929 +#: stock/models.py:2946 msgid "Invalid value for this test" msgstr "" -#: stock/models.py:2953 +#: stock/models.py:2970 msgid "Test result" msgstr "Kết quả kiểm thử" -#: stock/models.py:2960 +#: stock/models.py:2977 msgid "Test output value" msgstr "Giá trị đầu ra kiểm thử" -#: stock/models.py:2968 stock/serializers.py:248 +#: stock/models.py:2985 stock/serializers.py:248 msgid "Test result attachment" msgstr "Đính kèm kết quả kiểm thử" -#: stock/models.py:2972 +#: stock/models.py:2989 msgid "Test notes" msgstr "Ghi chú kiểm thử" -#: stock/models.py:2980 +#: stock/models.py:2997 msgid "Test station" msgstr "" -#: stock/models.py:2981 +#: stock/models.py:2998 msgid "The identifier of the test station where the test was performed" msgstr "" -#: stock/models.py:2987 +#: stock/models.py:3004 msgid "Started" msgstr "" -#: stock/models.py:2988 +#: stock/models.py:3005 msgid "The timestamp of the test start" msgstr "" -#: stock/models.py:2994 +#: stock/models.py:3011 msgid "Finished" msgstr "" -#: stock/models.py:2995 +#: stock/models.py:3012 msgid "The timestamp of the test finish" msgstr "" @@ -8902,83 +8910,87 @@ msgstr "Kho được thêm thủ công" msgid "Stock manually removed" msgstr "Kho được xóa thủ công" -#: stock/status_codes.py:57 +#: stock/status_codes.py:56 +msgid "Serialized stock items" +msgstr "" + +#: stock/status_codes.py:58 msgid "Returned to stock" msgstr "" -#: stock/status_codes.py:60 +#: stock/status_codes.py:61 msgid "Location changed" msgstr "Vị trí đã thay đổi" -#: stock/status_codes.py:61 +#: stock/status_codes.py:62 msgid "Stock updated" msgstr "Kho hàng đã được cập nhật" -#: stock/status_codes.py:64 +#: stock/status_codes.py:65 msgid "Installed into assembly" msgstr "Đã cài đặt vào bộ phận lắp ráp" -#: stock/status_codes.py:65 +#: stock/status_codes.py:66 msgid "Removed from assembly" msgstr "Di rời khỏi bộ phận lắp ráp" -#: stock/status_codes.py:67 +#: stock/status_codes.py:68 msgid "Installed component item" msgstr "Mục thành phần đã cài đặt" -#: stock/status_codes.py:68 +#: stock/status_codes.py:69 msgid "Removed component item" msgstr "Mục thành phần đã di rời" -#: stock/status_codes.py:71 +#: stock/status_codes.py:72 msgid "Split from parent item" msgstr "Tách từ mục cha" -#: stock/status_codes.py:72 +#: stock/status_codes.py:73 msgid "Split child item" msgstr "Tách mục con" -#: stock/status_codes.py:75 +#: stock/status_codes.py:76 msgid "Merged stock items" msgstr "Kho hàng đã được gộp" -#: stock/status_codes.py:78 +#: stock/status_codes.py:79 msgid "Converted to variant" msgstr "Đã chuyển đổi sang biến thể" -#: stock/status_codes.py:81 +#: stock/status_codes.py:82 msgid "Build order output created" msgstr "Đầu ra đơn đặt bản dựng đã được tạo" -#: stock/status_codes.py:82 +#: stock/status_codes.py:83 msgid "Build order output completed" msgstr "Đầu ra đơn đặt bản dựng đã hoàn thành" -#: stock/status_codes.py:83 +#: stock/status_codes.py:84 msgid "Build order output rejected" msgstr "Đầu ra đơn đặt bản dựng bị từ chối" -#: stock/status_codes.py:84 +#: stock/status_codes.py:85 msgid "Consumed by build order" msgstr "Tiêu hao bởi đơn đặt bản dựng" -#: stock/status_codes.py:87 +#: stock/status_codes.py:88 msgid "Shipped against Sales Order" msgstr "Vận chyển dựa vào đơn đặt bản dựng" -#: stock/status_codes.py:90 +#: stock/status_codes.py:91 msgid "Received against Purchase Order" msgstr "Đã nhận dựa vào đơn đặt hàng mua" -#: stock/status_codes.py:93 +#: stock/status_codes.py:94 msgid "Returned against Return Order" msgstr "Trả hành dựa vào đơn hàng trả lại" -#: stock/status_codes.py:96 +#: stock/status_codes.py:97 msgid "Sent to customer" msgstr "Gửi đến khách hàng" -#: stock/status_codes.py:97 +#: stock/status_codes.py:98 msgid "Returned from customer" msgstr "Bị trả lại từ khách hàng" diff --git a/src/backend/InvenTree/locale/zh_Hans/LC_MESSAGES/django.po b/src/backend/InvenTree/locale/zh_Hans/LC_MESSAGES/django.po index 48ee471397..108766f641 100644 --- a/src/backend/InvenTree/locale/zh_Hans/LC_MESSAGES/django.po +++ b/src/backend/InvenTree/locale/zh_Hans/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: inventree\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-11-19 04:55+0000\n" -"PO-Revision-Date: 2025-11-19 04:59\n" +"POT-Creation-Date: 2025-11-24 06:50+0000\n" +"PO-Revision-Date: 2025-11-24 06:53\n" "Last-Translator: \n" "Language-Team: Chinese Simplified\n" "Language: zh_CN\n" @@ -81,21 +81,21 @@ msgstr "提供的主电子邮件地址无效。" msgid "The provided email domain is not approved." msgstr "提供的邮箱域名未被批准。" -#: InvenTree/conversion.py:166 +#: InvenTree/conversion.py:240 #, python-brace-format msgid "Invalid unit provided ({unit})" msgstr "提供了无效的单位 ({unit})" -#: InvenTree/conversion.py:183 +#: InvenTree/conversion.py:257 msgid "No value provided" msgstr "没有提供数值" -#: InvenTree/conversion.py:210 +#: InvenTree/conversion.py:284 #, python-brace-format msgid "Could not convert {original} to {unit}" msgstr "不能将 {original} 转换到 {unit}" -#: InvenTree/conversion.py:212 InvenTree/conversion.py:226 +#: InvenTree/conversion.py:286 InvenTree/conversion.py:300 #: InvenTree/helpers.py:597 order/models.py:720 order/models.py:1015 msgid "Invalid quantity provided" msgstr "提供的数量无效" @@ -116,7 +116,7 @@ msgstr "无效的数值" #: build/serializers.py:580 build/serializers.py:1788 company/models.py:857 #: order/models.py:1780 #: report/templates/report/inventree_build_order_report.html:172 -#: stock/models.py:2848 stock/models.py:2972 stock/serializers.py:717 +#: stock/models.py:2865 stock/models.py:2989 stock/serializers.py:717 #: stock/serializers.py:893 stock/serializers.py:1035 stock/serializers.py:1336 #: stock/serializers.py:1425 stock/serializers.py:1624 msgid "Notes" @@ -345,7 +345,7 @@ msgstr "必须是有效数字" msgid "Currency" msgstr "货币" -#: InvenTree/serializers.py:298 part/serializers.py:1385 +#: InvenTree/serializers.py:298 part/serializers.py:1357 msgid "Select currency from available options" msgstr "从可用选项中选择货币" @@ -553,14 +553,14 @@ msgstr "包含变体" #: build/api.py:100 build/api.py:466 build/api.py:845 build/models.py:270 #: build/serializers.py:1225 build/serializers.py:1356 -#: build/serializers.py:1427 company/models.py:1067 company/serializers.py:445 +#: build/serializers.py:1427 company/models.py:1067 company/serializers.py:491 #: order/api.py:298 order/api.py:302 order/api.py:929 order/api.py:1187 #: order/api.py:1190 order/models.py:1941 order/models.py:2108 #: order/models.py:2109 part/api.py:1233 part/api.py:1236 part/api.py:1302 #: part/api.py:1589 part/models.py:472 part/models.py:3296 part/models.py:3439 #: part/models.py:3497 part/models.py:3518 part/models.py:3540 #: part/models.py:3679 part/models.py:4046 part/models.py:4368 -#: part/models.py:4787 part/serializers.py:1928 +#: part/models.py:4787 part/serializers.py:1900 #: report/templates/report/inventree_bill_of_materials_report.html:110 #: report/templates/report/inventree_bill_of_materials_report.html:137 #: report/templates/report/inventree_build_order_report.html:109 @@ -582,7 +582,7 @@ msgstr "零件" #: build/api.py:120 build/api.py:123 build/serializers.py:1438 part/api.py:980 #: part/api.py:1316 part/api.py:1600 part/models.py:1080 part/models.py:3568 -#: part/models.py:4162 part/serializers.py:1752 stock/api.py:869 +#: part/models.py:4162 part/serializers.py:1724 stock/api.py:869 msgid "Category" msgstr "类别" @@ -663,7 +663,7 @@ msgid "Optional" msgstr "可选项" #: build/api.py:455 build/serializers.py:1415 common/setting/system.py:456 -#: part/models.py:1202 part/serializers.py:1714 part/serializers.py:1725 +#: part/models.py:1202 part/serializers.py:1686 part/serializers.py:1697 #: stock/api.py:639 msgid "Assembly" msgstr "装配件" @@ -688,16 +688,16 @@ msgstr "已分配" msgid "Consumed" msgstr "已消耗" -#: build/api.py:499 company/models.py:912 company/serializers.py:440 +#: build/api.py:499 company/models.py:912 company/serializers.py:474 #: templates/email/build_order_required_stock.html:19 #: templates/email/low_stock_notification.html:17 #: templates/email/part_event_notification.html:18 msgid "Available" msgstr "可用数量" -#: build/api.py:523 build/serializers.py:1466 company/serializers.py:437 -#: order/serializers.py:1281 part/serializers.py:959 part/serializers.py:1306 -#: part/serializers.py:1761 +#: build/api.py:523 build/serializers.py:1466 company/serializers.py:471 +#: order/serializers.py:1281 part/serializers.py:931 part/serializers.py:1278 +#: part/serializers.py:1733 msgid "On Order" msgstr "已订购" @@ -963,7 +963,7 @@ msgstr "产出与生产订单不匹配" #: build/models.py:1136 build/models.py:1234 build/serializers.py:285 #: build/serializers.py:335 build/serializers.py:965 build/serializers.py:1739 #: order/models.py:717 order/serializers.py:658 order/serializers.py:844 -#: part/serializers.py:1708 stock/models.py:940 stock/models.py:1430 +#: part/serializers.py:1680 stock/models.py:940 stock/models.py:1430 #: stock/models.py:1878 stock/serializers.py:688 stock/serializers.py:1580 msgid "Quantity must be greater than zero" msgstr "数量必须大于零" @@ -1385,20 +1385,20 @@ msgstr "允许变体" msgid "BOM Item" msgstr "物料清单项" -#: build/serializers.py:1467 order/serializers.py:1282 part/serializers.py:1310 -#: part/serializers.py:1765 +#: build/serializers.py:1467 order/serializers.py:1282 part/serializers.py:1282 +#: part/serializers.py:1737 msgid "In Production" msgstr "生产中" -#: build/serializers.py:1469 part/serializers.py:950 part/serializers.py:1314 +#: build/serializers.py:1469 part/serializers.py:922 part/serializers.py:1286 msgid "Scheduled to Build" msgstr "生产计划" -#: build/serializers.py:1472 part/serializers.py:987 +#: build/serializers.py:1472 part/serializers.py:959 msgid "External Stock" msgstr "外部库存" -#: build/serializers.py:1473 part/serializers.py:1300 part/serializers.py:1808 +#: build/serializers.py:1473 part/serializers.py:1272 part/serializers.py:1780 msgid "Available Stock" msgstr "可用库存" @@ -1588,7 +1588,7 @@ msgstr "使用者" msgid "Price break quantity" msgstr "批发价数量" -#: common/models.py:1348 company/serializers.py:564 order/models.py:1842 +#: common/models.py:1348 company/serializers.py:357 order/models.py:1842 #: order/models.py:3043 msgid "Price" msgstr "价格" @@ -1760,7 +1760,7 @@ msgstr "定义" msgid "Unit definition" msgstr "单位定义" -#: common/models.py:1911 common/models.py:1974 stock/models.py:2967 +#: common/models.py:1911 common/models.py:1974 stock/models.py:2984 #: stock/serializers.py:247 msgid "Attachment" msgstr "附件" @@ -1839,7 +1839,7 @@ msgstr "等同于商业逻辑中自定义状态的状态逻辑键" #: common/models.py:2090 common/models.py:2329 company/models.py:622 #: machine/serializers.py:27 -#: report/templates/report/inventree_test_report.html:104 stock/models.py:2959 +#: report/templates/report/inventree_test_report.html:104 stock/models.py:2976 msgid "Value" msgstr "值" @@ -2048,7 +2048,7 @@ msgid "Response data from the barcode scan" msgstr "扫描条形码的响应数据" #: common/models.py:2417 report/templates/report/inventree_test_report.html:103 -#: stock/models.py:2953 +#: stock/models.py:2970 msgid "Result" msgstr "结果" @@ -2141,8 +2141,8 @@ msgid "Linked thread for this message" msgstr "链接到此消息的主题" #: common/models.py:2656 -msgid "Prioriy" -msgstr "优先级" +msgid "Priority" +msgstr "" #: common/models.py:2698 msgid "Email Thread" @@ -2671,8 +2671,8 @@ msgstr "零件默认为模板" msgid "Parts can be assembled from other components by default" msgstr "默认情况下,元件可由其他零件组装而成" -#: common/setting/system.py:462 part/models.py:1208 part/serializers.py:1734 -#: part/serializers.py:1741 +#: common/setting/system.py:462 part/models.py:1208 part/serializers.py:1706 +#: part/serializers.py:1713 msgid "Component" msgstr "组件" @@ -3774,7 +3774,7 @@ msgstr "内部零件已激活" msgid "Supplier is Active" msgstr "供应商已激活" -#: company/api.py:307 company/models.py:520 company/serializers.py:457 +#: company/api.py:307 company/models.py:520 company/serializers.py:503 #: part/serializers.py:566 msgid "Manufacturer" msgstr "制造商" @@ -3966,7 +3966,7 @@ msgid "Link to address information (external)" msgstr "链接地址信息 (外部)" #: company/models.py:492 company/models.py:609 company/models.py:832 -#: company/serializers.py:471 stock/api.py:561 +#: company/serializers.py:517 stock/api.py:561 msgid "Manufacturer Part" msgstr "制造商零件" @@ -3983,7 +3983,7 @@ msgstr "选择零件" msgid "Select manufacturer" msgstr "选择制造商" -#: company/models.py:527 company/serializers.py:479 order/serializers.py:734 +#: company/models.py:527 company/serializers.py:525 order/serializers.py:734 #: part/serializers.py:576 msgid "MPN" msgstr "制造商零件编号" @@ -4032,7 +4032,7 @@ msgstr "包装单位必须大于零" msgid "Linked manufacturer part must reference the same base part" msgstr "链接的制造商零件必须引用相同的基础零件" -#: company/models.py:810 company/serializers.py:449 company/serializers.py:467 +#: company/models.py:810 company/serializers.py:495 company/serializers.py:513 #: order/models.py:639 part/serializers.py:550 #: plugin/builtin/suppliers/digikey.py:26 plugin/builtin/suppliers/lcsc.py:27 #: plugin/builtin/suppliers/mouser.py:25 plugin/builtin/suppliers/tme.py:27 @@ -4136,10 +4136,14 @@ msgstr "此供应商使用的默认货币" msgid "Company Name" msgstr "公司名称" -#: company/serializers.py:433 part/serializers.py:955 stock/serializers.py:428 +#: company/serializers.py:467 part/serializers.py:927 stock/serializers.py:428 msgid "In Stock" msgstr "有库存" +#: company/serializers.py:484 +msgid "Price Breaks" +msgstr "" + #: data_exporter/mixins.py:325 data_exporter/mixins.py:403 msgid "Error occurred during data export" msgstr "数据导出过程中发生错误" @@ -4292,7 +4296,7 @@ msgstr "原始行数据" msgid "Errors" msgstr "错误" -#: importer/models.py:550 part/serializers.py:1268 +#: importer/models.py:550 part/serializers.py:1240 msgid "Valid" msgstr "有效" @@ -5679,7 +5683,7 @@ msgstr "提高搜索结果可见性的零件关键字" msgid "Part category" msgstr "零件类别" -#: part/models.py:1088 part/serializers.py:929 +#: part/models.py:1088 part/serializers.py:901 #: report/templates/report/inventree_stock_location_report.html:103 msgid "IPN" msgstr "内部零件号 IPN" @@ -5720,7 +5724,7 @@ msgstr "默认到期" msgid "Expiry time (in days) for stock items of this part" msgstr "此零件库存项的过期时间 (天)" -#: part/models.py:1186 part/serializers.py:1003 +#: part/models.py:1186 part/serializers.py:975 msgid "Minimum Stock" msgstr "最低库存" @@ -6420,203 +6424,203 @@ msgstr "与此制造商零件编号 (MPN) 的相匹配的制造商零件已存 msgid "Supplier part matching this SKU already exists" msgstr "匹配此库存单位 (SKU) 的供应商零件已存在" -#: part/serializers.py:914 +#: part/serializers.py:886 msgid "Category Name" msgstr "类别名称" -#: part/serializers.py:943 +#: part/serializers.py:915 msgid "Building" msgstr "正在生产" -#: part/serializers.py:944 +#: part/serializers.py:916 msgid "Quantity of this part currently being in production" msgstr "目前正在生产的零件数量" -#: part/serializers.py:951 +#: part/serializers.py:923 msgid "Outstanding quantity of this part scheduled to be built" msgstr "此零件计划待产数量" -#: part/serializers.py:971 stock/serializers.py:1019 stock/serializers.py:1189 +#: part/serializers.py:943 stock/serializers.py:1019 stock/serializers.py:1189 #: users/ruleset.py:30 msgid "Stock Items" msgstr "库存项" -#: part/serializers.py:975 +#: part/serializers.py:947 msgid "Revisions" msgstr "修订" -#: part/serializers.py:979 +#: part/serializers.py:951 msgid "Suppliers" msgstr "供应商" -#: part/serializers.py:983 part/serializers.py:1297 +#: part/serializers.py:955 part/serializers.py:1269 #: templates/email/low_stock_notification.html:16 #: templates/email/part_event_notification.html:17 msgid "Total Stock" msgstr "库存总量" -#: part/serializers.py:991 +#: part/serializers.py:963 msgid "Unallocated Stock" msgstr "未分配的库存" -#: part/serializers.py:999 +#: part/serializers.py:971 msgid "Variant Stock" msgstr "变体库存" -#: part/serializers.py:1054 +#: part/serializers.py:1026 msgid "Duplicate Part" msgstr "重复零件" -#: part/serializers.py:1055 +#: part/serializers.py:1027 msgid "Copy initial data from another Part" msgstr "从另一个零件复制初始数据" -#: part/serializers.py:1061 +#: part/serializers.py:1033 msgid "Initial Stock" msgstr "初始库存" -#: part/serializers.py:1062 +#: part/serializers.py:1034 msgid "Create Part with initial stock quantity" msgstr "创建具有初始库存数量的零件" -#: part/serializers.py:1068 +#: part/serializers.py:1040 msgid "Supplier Information" msgstr "供应商信息" -#: part/serializers.py:1069 +#: part/serializers.py:1041 msgid "Add initial supplier information for this part" msgstr "添加此零件的初始供应商信息" -#: part/serializers.py:1077 +#: part/serializers.py:1049 msgid "Copy Category Parameters" msgstr "复制类别参数" -#: part/serializers.py:1078 +#: part/serializers.py:1050 msgid "Copy parameter templates from selected part category" msgstr "从选择的零件复制参数模版" -#: part/serializers.py:1083 +#: part/serializers.py:1055 msgid "Existing Image" msgstr "现有的图片" -#: part/serializers.py:1084 +#: part/serializers.py:1056 msgid "Filename of an existing part image" msgstr "现有零件图片的文件名" -#: part/serializers.py:1101 +#: part/serializers.py:1073 msgid "Image file does not exist" msgstr "图片不存在" -#: part/serializers.py:1269 +#: part/serializers.py:1241 msgid "Validate entire Bill of Materials" msgstr "验证整个物料清单" -#: part/serializers.py:1303 part/serializers.py:1769 +#: part/serializers.py:1275 part/serializers.py:1741 msgid "Can Build" msgstr "可以创建" -#: part/serializers.py:1320 +#: part/serializers.py:1292 msgid "Required for Build Orders" msgstr "生产订单必填项" -#: part/serializers.py:1325 +#: part/serializers.py:1297 msgid "Allocated to Build Orders" msgstr "分配到生产订单" -#: part/serializers.py:1332 +#: part/serializers.py:1304 msgid "Required for Sales Orders" msgstr "销售订单必填项" -#: part/serializers.py:1336 +#: part/serializers.py:1308 msgid "Allocated to Sales Orders" msgstr "分配到销售订单" -#: part/serializers.py:1475 +#: part/serializers.py:1447 msgid "Minimum Price" msgstr "最低价格" -#: part/serializers.py:1476 +#: part/serializers.py:1448 msgid "Override calculated value for minimum price" msgstr "覆盖已计算的最低价格值" -#: part/serializers.py:1483 +#: part/serializers.py:1455 msgid "Minimum price currency" msgstr "最低价格货币" -#: part/serializers.py:1490 +#: part/serializers.py:1462 msgid "Maximum Price" msgstr "最高价格" -#: part/serializers.py:1491 +#: part/serializers.py:1463 msgid "Override calculated value for maximum price" msgstr "覆盖已计算的最高价格值" -#: part/serializers.py:1498 +#: part/serializers.py:1470 msgid "Maximum price currency" msgstr "最高价格货币" -#: part/serializers.py:1527 +#: part/serializers.py:1499 msgid "Update" msgstr "更新" -#: part/serializers.py:1528 +#: part/serializers.py:1500 msgid "Update pricing for this part" msgstr "更新这个零件的价格" -#: part/serializers.py:1551 +#: part/serializers.py:1523 #, python-brace-format msgid "Could not convert from provided currencies to {default_currency}" msgstr "无法将所提供的货币转换为 {default_currency}" -#: part/serializers.py:1558 +#: part/serializers.py:1530 msgid "Minimum price must not be greater than maximum price" msgstr "最低价格不能高于最高价格。" -#: part/serializers.py:1561 +#: part/serializers.py:1533 msgid "Maximum price must not be less than minimum price" msgstr "最高价格不能低于最低价格" -#: part/serializers.py:1715 +#: part/serializers.py:1687 msgid "Select the parent assembly" msgstr "选择父装配" -#: part/serializers.py:1735 +#: part/serializers.py:1707 msgid "Select the component part" msgstr "选择零部件" -#: part/serializers.py:1929 +#: part/serializers.py:1901 msgid "Select part to copy BOM from" msgstr "选择要复制物料清单的零件" -#: part/serializers.py:1937 +#: part/serializers.py:1909 msgid "Remove Existing Data" msgstr "移除现有数据" -#: part/serializers.py:1938 +#: part/serializers.py:1910 msgid "Remove existing BOM items before copying" msgstr "复制前删除现有的物料清单项目" -#: part/serializers.py:1943 +#: part/serializers.py:1915 msgid "Include Inherited" msgstr "包含继承的" -#: part/serializers.py:1944 +#: part/serializers.py:1916 msgid "Include BOM items which are inherited from templated parts" msgstr "包含从模板零件继承的物料清单项目" -#: part/serializers.py:1949 +#: part/serializers.py:1921 msgid "Skip Invalid Rows" msgstr "跳过无效行" -#: part/serializers.py:1950 +#: part/serializers.py:1922 msgid "Enable this option to skip invalid rows" msgstr "启用此选项以跳过无效行" -#: part/serializers.py:1955 +#: part/serializers.py:1927 msgid "Copy Substitute Parts" msgstr "复制替代品零件" -#: part/serializers.py:1956 +#: part/serializers.py:1928 msgid "Copy substitute parts when duplicate BOM items" msgstr "复制物料清单项目时复制替代品零件" @@ -8457,115 +8461,119 @@ msgstr "必须以列表形式提供序列号" msgid "Quantity does not match serial numbers" msgstr "数量不匹配序列号" -#: stock/models.py:2012 stock/models.py:2917 +#: stock/models.py:1912 +msgid "Cannot assign stock to structural location" +msgstr "" + +#: stock/models.py:2029 stock/models.py:2934 msgid "Test template does not exist" msgstr "测试模板不存在" -#: stock/models.py:2030 +#: stock/models.py:2047 msgid "Stock item has been assigned to a sales order" msgstr "库存项已分配到销售订单" -#: stock/models.py:2034 +#: stock/models.py:2051 msgid "Stock item is installed in another item" msgstr "库存项已安装在另一个项目中" -#: stock/models.py:2037 +#: stock/models.py:2054 msgid "Stock item contains other items" msgstr "库存项包含其他项目" -#: stock/models.py:2040 +#: stock/models.py:2057 msgid "Stock item has been assigned to a customer" msgstr "库存项已分配给客户" -#: stock/models.py:2043 stock/models.py:2226 +#: stock/models.py:2060 stock/models.py:2243 msgid "Stock item is currently in production" msgstr "库存项目前正在生产" -#: stock/models.py:2046 +#: stock/models.py:2063 msgid "Serialized stock cannot be merged" msgstr "序列化的库存不能合并" -#: stock/models.py:2053 stock/serializers.py:1462 +#: stock/models.py:2070 stock/serializers.py:1462 msgid "Duplicate stock items" msgstr "复制库存项" -#: stock/models.py:2057 +#: stock/models.py:2074 msgid "Stock items must refer to the same part" msgstr "库存项必须指相同零件" -#: stock/models.py:2065 +#: stock/models.py:2082 msgid "Stock items must refer to the same supplier part" msgstr "库存项必须是同一供应商的零件" -#: stock/models.py:2070 +#: stock/models.py:2087 msgid "Stock status codes must match" msgstr "库存状态码必须匹配" -#: stock/models.py:2349 +#: stock/models.py:2366 msgid "StockItem cannot be moved as it is not in stock" msgstr "库存项不能移动,因为它没有库存" -#: stock/models.py:2818 +#: stock/models.py:2835 msgid "Stock Item Tracking" msgstr "库存项跟踪" -#: stock/models.py:2849 +#: stock/models.py:2866 msgid "Entry notes" msgstr "条目注释" -#: stock/models.py:2889 +#: stock/models.py:2906 msgid "Stock Item Test Result" msgstr "库存项测试结果" -#: stock/models.py:2920 +#: stock/models.py:2937 msgid "Value must be provided for this test" msgstr "必须为此测试提供值" -#: stock/models.py:2924 +#: stock/models.py:2941 msgid "Attachment must be uploaded for this test" msgstr "测试附件必须上传" -#: stock/models.py:2929 +#: stock/models.py:2946 msgid "Invalid value for this test" msgstr "此测试的值无效" -#: stock/models.py:2953 +#: stock/models.py:2970 msgid "Test result" msgstr "测试结果" -#: stock/models.py:2960 +#: stock/models.py:2977 msgid "Test output value" msgstr "测试输出值" -#: stock/models.py:2968 stock/serializers.py:248 +#: stock/models.py:2985 stock/serializers.py:248 msgid "Test result attachment" msgstr "测验结果附件" -#: stock/models.py:2972 +#: stock/models.py:2989 msgid "Test notes" msgstr "测试备注" -#: stock/models.py:2980 +#: stock/models.py:2997 msgid "Test station" msgstr "测试站" -#: stock/models.py:2981 +#: stock/models.py:2998 msgid "The identifier of the test station where the test was performed" msgstr "进行测试的测试站的标识符" -#: stock/models.py:2987 +#: stock/models.py:3004 msgid "Started" msgstr "已开始" -#: stock/models.py:2988 +#: stock/models.py:3005 msgid "The timestamp of the test start" msgstr "测试开始的时间戳" -#: stock/models.py:2994 +#: stock/models.py:3011 msgid "Finished" msgstr "已完成" -#: stock/models.py:2995 +#: stock/models.py:3012 msgid "The timestamp of the test finish" msgstr "测试结束的时间戳" @@ -8904,83 +8912,87 @@ msgstr "已手动添加库存" msgid "Stock manually removed" msgstr "已手动删除库存" -#: stock/status_codes.py:57 +#: stock/status_codes.py:56 +msgid "Serialized stock items" +msgstr "" + +#: stock/status_codes.py:58 msgid "Returned to stock" msgstr "退回库存" -#: stock/status_codes.py:60 +#: stock/status_codes.py:61 msgid "Location changed" msgstr "地点已更改" -#: stock/status_codes.py:61 +#: stock/status_codes.py:62 msgid "Stock updated" msgstr "库存已更新" -#: stock/status_codes.py:64 +#: stock/status_codes.py:65 msgid "Installed into assembly" msgstr "已安装到装配中" -#: stock/status_codes.py:65 +#: stock/status_codes.py:66 msgid "Removed from assembly" msgstr "已从装配中删除" -#: stock/status_codes.py:67 +#: stock/status_codes.py:68 msgid "Installed component item" msgstr "已安装组件项" -#: stock/status_codes.py:68 +#: stock/status_codes.py:69 msgid "Removed component item" msgstr "已删除组件项" -#: stock/status_codes.py:71 +#: stock/status_codes.py:72 msgid "Split from parent item" msgstr "从上级项拆分" -#: stock/status_codes.py:72 +#: stock/status_codes.py:73 msgid "Split child item" msgstr "拆分子项" -#: stock/status_codes.py:75 +#: stock/status_codes.py:76 msgid "Merged stock items" msgstr "合并的库存项" -#: stock/status_codes.py:78 +#: stock/status_codes.py:79 msgid "Converted to variant" msgstr "转换为变体" -#: stock/status_codes.py:81 +#: stock/status_codes.py:82 msgid "Build order output created" msgstr "已创建生产订单产出" -#: stock/status_codes.py:82 +#: stock/status_codes.py:83 msgid "Build order output completed" msgstr "生产订单已出产" -#: stock/status_codes.py:83 +#: stock/status_codes.py:84 msgid "Build order output rejected" msgstr "生产订单产出被拒绝" -#: stock/status_codes.py:84 +#: stock/status_codes.py:85 msgid "Consumed by build order" msgstr "被生产订单消耗" -#: stock/status_codes.py:87 +#: stock/status_codes.py:88 msgid "Shipped against Sales Order" msgstr "根据销售订单发货" -#: stock/status_codes.py:90 +#: stock/status_codes.py:91 msgid "Received against Purchase Order" msgstr "根据采购订单接收" -#: stock/status_codes.py:93 +#: stock/status_codes.py:94 msgid "Returned against Return Order" msgstr "根据退货订单退货" -#: stock/status_codes.py:96 +#: stock/status_codes.py:97 msgid "Sent to customer" msgstr "发往客户" -#: stock/status_codes.py:97 +#: stock/status_codes.py:98 msgid "Returned from customer" msgstr "客户退回" diff --git a/src/backend/InvenTree/locale/zh_Hant/LC_MESSAGES/django.po b/src/backend/InvenTree/locale/zh_Hant/LC_MESSAGES/django.po index 1e73535995..3d2466a8dc 100644 --- a/src/backend/InvenTree/locale/zh_Hant/LC_MESSAGES/django.po +++ b/src/backend/InvenTree/locale/zh_Hant/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: inventree\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-11-19 04:55+0000\n" -"PO-Revision-Date: 2025-11-19 04:59\n" +"POT-Creation-Date: 2025-11-24 06:50+0000\n" +"PO-Revision-Date: 2025-11-24 06:53\n" "Last-Translator: \n" "Language-Team: Chinese Traditional\n" "Language: zh_TW\n" @@ -81,21 +81,21 @@ msgstr "提供的主電子郵件地址無效。" msgid "The provided email domain is not approved." msgstr "提供的郵箱域名未被批准。" -#: InvenTree/conversion.py:166 +#: InvenTree/conversion.py:240 #, python-brace-format msgid "Invalid unit provided ({unit})" msgstr "提供了無效的單位 ({unit})" -#: InvenTree/conversion.py:183 +#: InvenTree/conversion.py:257 msgid "No value provided" msgstr "沒有提供數值" -#: InvenTree/conversion.py:210 +#: InvenTree/conversion.py:284 #, python-brace-format msgid "Could not convert {original} to {unit}" msgstr "不能將 {original} 轉換到 {unit}" -#: InvenTree/conversion.py:212 InvenTree/conversion.py:226 +#: InvenTree/conversion.py:286 InvenTree/conversion.py:300 #: InvenTree/helpers.py:597 order/models.py:720 order/models.py:1015 msgid "Invalid quantity provided" msgstr "提供的數量無效" @@ -116,7 +116,7 @@ msgstr "無效的十進位數值" #: build/serializers.py:580 build/serializers.py:1788 company/models.py:857 #: order/models.py:1780 #: report/templates/report/inventree_build_order_report.html:172 -#: stock/models.py:2848 stock/models.py:2972 stock/serializers.py:717 +#: stock/models.py:2865 stock/models.py:2989 stock/serializers.py:717 #: stock/serializers.py:893 stock/serializers.py:1035 stock/serializers.py:1336 #: stock/serializers.py:1425 stock/serializers.py:1624 msgid "Notes" @@ -345,7 +345,7 @@ msgstr "必須是有效的數字" msgid "Currency" msgstr "貨幣" -#: InvenTree/serializers.py:298 part/serializers.py:1385 +#: InvenTree/serializers.py:298 part/serializers.py:1357 msgid "Select currency from available options" msgstr "從可用選項中選擇貨幣" @@ -553,14 +553,14 @@ msgstr "包含變體" #: build/api.py:100 build/api.py:466 build/api.py:845 build/models.py:270 #: build/serializers.py:1225 build/serializers.py:1356 -#: build/serializers.py:1427 company/models.py:1067 company/serializers.py:445 +#: build/serializers.py:1427 company/models.py:1067 company/serializers.py:491 #: order/api.py:298 order/api.py:302 order/api.py:929 order/api.py:1187 #: order/api.py:1190 order/models.py:1941 order/models.py:2108 #: order/models.py:2109 part/api.py:1233 part/api.py:1236 part/api.py:1302 #: part/api.py:1589 part/models.py:472 part/models.py:3296 part/models.py:3439 #: part/models.py:3497 part/models.py:3518 part/models.py:3540 #: part/models.py:3679 part/models.py:4046 part/models.py:4368 -#: part/models.py:4787 part/serializers.py:1928 +#: part/models.py:4787 part/serializers.py:1900 #: report/templates/report/inventree_bill_of_materials_report.html:110 #: report/templates/report/inventree_bill_of_materials_report.html:137 #: report/templates/report/inventree_build_order_report.html:109 @@ -582,7 +582,7 @@ msgstr "零件" #: build/api.py:120 build/api.py:123 build/serializers.py:1438 part/api.py:980 #: part/api.py:1316 part/api.py:1600 part/models.py:1080 part/models.py:3568 -#: part/models.py:4162 part/serializers.py:1752 stock/api.py:869 +#: part/models.py:4162 part/serializers.py:1724 stock/api.py:869 msgid "Category" msgstr "類別" @@ -663,7 +663,7 @@ msgid "Optional" msgstr "非必須項目" #: build/api.py:455 build/serializers.py:1415 common/setting/system.py:456 -#: part/models.py:1202 part/serializers.py:1714 part/serializers.py:1725 +#: part/models.py:1202 part/serializers.py:1686 part/serializers.py:1697 #: stock/api.py:639 msgid "Assembly" msgstr "裝配" @@ -688,16 +688,16 @@ msgstr "已分配" msgid "Consumed" msgstr "已消耗" -#: build/api.py:499 company/models.py:912 company/serializers.py:440 +#: build/api.py:499 company/models.py:912 company/serializers.py:474 #: templates/email/build_order_required_stock.html:19 #: templates/email/low_stock_notification.html:17 #: templates/email/part_event_notification.html:18 msgid "Available" msgstr "可用數量" -#: build/api.py:523 build/serializers.py:1466 company/serializers.py:437 -#: order/serializers.py:1281 part/serializers.py:959 part/serializers.py:1306 -#: part/serializers.py:1761 +#: build/api.py:523 build/serializers.py:1466 company/serializers.py:471 +#: order/serializers.py:1281 part/serializers.py:931 part/serializers.py:1278 +#: part/serializers.py:1733 msgid "On Order" msgstr "已訂購" @@ -963,7 +963,7 @@ msgstr "產出與生產訂單不匹配" #: build/models.py:1136 build/models.py:1234 build/serializers.py:285 #: build/serializers.py:335 build/serializers.py:965 build/serializers.py:1739 #: order/models.py:717 order/serializers.py:658 order/serializers.py:844 -#: part/serializers.py:1708 stock/models.py:940 stock/models.py:1430 +#: part/serializers.py:1680 stock/models.py:940 stock/models.py:1430 #: stock/models.py:1878 stock/serializers.py:688 stock/serializers.py:1580 msgid "Quantity must be greater than zero" msgstr "數量必須大於零" @@ -1385,20 +1385,20 @@ msgstr "允許變體" msgid "BOM Item" msgstr "物料清單項" -#: build/serializers.py:1467 order/serializers.py:1282 part/serializers.py:1310 -#: part/serializers.py:1765 +#: build/serializers.py:1467 order/serializers.py:1282 part/serializers.py:1282 +#: part/serializers.py:1737 msgid "In Production" msgstr "生產中" -#: build/serializers.py:1469 part/serializers.py:950 part/serializers.py:1314 +#: build/serializers.py:1469 part/serializers.py:922 part/serializers.py:1286 msgid "Scheduled to Build" msgstr "排程生產中" -#: build/serializers.py:1472 part/serializers.py:987 +#: build/serializers.py:1472 part/serializers.py:959 msgid "External Stock" msgstr "外部庫存" -#: build/serializers.py:1473 part/serializers.py:1300 part/serializers.py:1808 +#: build/serializers.py:1473 part/serializers.py:1272 part/serializers.py:1780 msgid "Available Stock" msgstr "可用庫存" @@ -1588,7 +1588,7 @@ msgstr "使用者" msgid "Price break quantity" msgstr "批發價數量" -#: common/models.py:1348 company/serializers.py:564 order/models.py:1842 +#: common/models.py:1348 company/serializers.py:357 order/models.py:1842 #: order/models.py:3043 msgid "Price" msgstr "價格" @@ -1760,7 +1760,7 @@ msgstr "定義" msgid "Unit definition" msgstr "單位定義" -#: common/models.py:1911 common/models.py:1974 stock/models.py:2967 +#: common/models.py:1911 common/models.py:1974 stock/models.py:2984 #: stock/serializers.py:247 msgid "Attachment" msgstr "附件" @@ -1839,7 +1839,7 @@ msgstr "等同於商業邏輯中自定義狀態的狀態邏輯鍵" #: common/models.py:2090 common/models.py:2329 company/models.py:622 #: machine/serializers.py:27 -#: report/templates/report/inventree_test_report.html:104 stock/models.py:2959 +#: report/templates/report/inventree_test_report.html:104 stock/models.py:2976 msgid "Value" msgstr "值" @@ -2048,7 +2048,7 @@ msgid "Response data from the barcode scan" msgstr "掃描條碼的響應數據" #: common/models.py:2417 report/templates/report/inventree_test_report.html:103 -#: stock/models.py:2953 +#: stock/models.py:2970 msgid "Result" msgstr "結果" @@ -2141,8 +2141,8 @@ msgid "Linked thread for this message" msgstr "此訊息所連結的討論串" #: common/models.py:2656 -msgid "Prioriy" -msgstr "優先等級" +msgid "Priority" +msgstr "" #: common/models.py:2698 msgid "Email Thread" @@ -2671,8 +2671,8 @@ msgstr "零件默認為模板" msgid "Parts can be assembled from other components by default" msgstr "默認情況下,元件可由其他零件組裝而成" -#: common/setting/system.py:462 part/models.py:1208 part/serializers.py:1734 -#: part/serializers.py:1741 +#: common/setting/system.py:462 part/models.py:1208 part/serializers.py:1706 +#: part/serializers.py:1713 msgid "Component" msgstr "組件" @@ -3772,7 +3772,7 @@ msgstr "內部零件已激活" msgid "Supplier is Active" msgstr "供應商已激活" -#: company/api.py:307 company/models.py:520 company/serializers.py:457 +#: company/api.py:307 company/models.py:520 company/serializers.py:503 #: part/serializers.py:566 msgid "Manufacturer" msgstr "製造商" @@ -3964,7 +3964,7 @@ msgid "Link to address information (external)" msgstr "鏈接地址信息 (外部)" #: company/models.py:492 company/models.py:609 company/models.py:832 -#: company/serializers.py:471 stock/api.py:561 +#: company/serializers.py:517 stock/api.py:561 msgid "Manufacturer Part" msgstr "製造商零件" @@ -3981,7 +3981,7 @@ msgstr "選擇零件" msgid "Select manufacturer" msgstr "選擇製造商" -#: company/models.py:527 company/serializers.py:479 order/serializers.py:734 +#: company/models.py:527 company/serializers.py:525 order/serializers.py:734 #: part/serializers.py:576 msgid "MPN" msgstr "製造商零件編號" @@ -4030,7 +4030,7 @@ msgstr "包裝單位必須大於零" msgid "Linked manufacturer part must reference the same base part" msgstr "鏈接的製造商零件必須引用相同的基礎零件" -#: company/models.py:810 company/serializers.py:449 company/serializers.py:467 +#: company/models.py:810 company/serializers.py:495 company/serializers.py:513 #: order/models.py:639 part/serializers.py:550 #: plugin/builtin/suppliers/digikey.py:26 plugin/builtin/suppliers/lcsc.py:27 #: plugin/builtin/suppliers/mouser.py:25 plugin/builtin/suppliers/tme.py:27 @@ -4134,10 +4134,14 @@ msgstr "此供應商使用的默認貨幣" msgid "Company Name" msgstr "公司名稱" -#: company/serializers.py:433 part/serializers.py:955 stock/serializers.py:428 +#: company/serializers.py:467 part/serializers.py:927 stock/serializers.py:428 msgid "In Stock" msgstr "有庫存" +#: company/serializers.py:484 +msgid "Price Breaks" +msgstr "" + #: data_exporter/mixins.py:325 data_exporter/mixins.py:403 msgid "Error occurred during data export" msgstr "資料匯出過程發生錯誤" @@ -4290,7 +4294,7 @@ msgstr "原始行數據" msgid "Errors" msgstr "錯誤" -#: importer/models.py:550 part/serializers.py:1268 +#: importer/models.py:550 part/serializers.py:1240 msgid "Valid" msgstr "有效" @@ -5677,7 +5681,7 @@ msgstr "提高搜索結果可見性的零件關鍵字" msgid "Part category" msgstr "零件類別" -#: part/models.py:1088 part/serializers.py:929 +#: part/models.py:1088 part/serializers.py:901 #: report/templates/report/inventree_stock_location_report.html:103 msgid "IPN" msgstr "內部零件號 IPN" @@ -5718,7 +5722,7 @@ msgstr "默認到期" msgid "Expiry time (in days) for stock items of this part" msgstr "此零件庫存項的過期時間 (天)" -#: part/models.py:1186 part/serializers.py:1003 +#: part/models.py:1186 part/serializers.py:975 msgid "Minimum Stock" msgstr "最低庫存" @@ -6418,203 +6422,203 @@ msgstr "與此製造商零件編號 (MPN) 的相匹配的製造商零件已存 msgid "Supplier part matching this SKU already exists" msgstr "匹配此庫存單位 (SKU) 的供應商零件已存在" -#: part/serializers.py:914 +#: part/serializers.py:886 msgid "Category Name" msgstr "類別名稱" -#: part/serializers.py:943 +#: part/serializers.py:915 msgid "Building" msgstr "正在生產" -#: part/serializers.py:944 +#: part/serializers.py:916 msgid "Quantity of this part currently being in production" msgstr "此零件目前生產中數量" -#: part/serializers.py:951 +#: part/serializers.py:923 msgid "Outstanding quantity of this part scheduled to be built" msgstr "此零件排程待製造未完成數量" -#: part/serializers.py:971 stock/serializers.py:1019 stock/serializers.py:1189 +#: part/serializers.py:943 stock/serializers.py:1019 stock/serializers.py:1189 #: users/ruleset.py:30 msgid "Stock Items" msgstr "庫存項" -#: part/serializers.py:975 +#: part/serializers.py:947 msgid "Revisions" msgstr "修訂" -#: part/serializers.py:979 +#: part/serializers.py:951 msgid "Suppliers" msgstr "供應商" -#: part/serializers.py:983 part/serializers.py:1297 +#: part/serializers.py:955 part/serializers.py:1269 #: templates/email/low_stock_notification.html:16 #: templates/email/part_event_notification.html:17 msgid "Total Stock" msgstr "庫存總量" -#: part/serializers.py:991 +#: part/serializers.py:963 msgid "Unallocated Stock" msgstr "未分配的庫存" -#: part/serializers.py:999 +#: part/serializers.py:971 msgid "Variant Stock" msgstr "變體庫存" -#: part/serializers.py:1054 +#: part/serializers.py:1026 msgid "Duplicate Part" msgstr "重複零件" -#: part/serializers.py:1055 +#: part/serializers.py:1027 msgid "Copy initial data from another Part" msgstr "從另一個零件複製初始數據" -#: part/serializers.py:1061 +#: part/serializers.py:1033 msgid "Initial Stock" msgstr "初始庫存" -#: part/serializers.py:1062 +#: part/serializers.py:1034 msgid "Create Part with initial stock quantity" msgstr "創建具有初始庫存數量的零件" -#: part/serializers.py:1068 +#: part/serializers.py:1040 msgid "Supplier Information" msgstr "供應商信息" -#: part/serializers.py:1069 +#: part/serializers.py:1041 msgid "Add initial supplier information for this part" msgstr "添加此零件的初始供應商信息" -#: part/serializers.py:1077 +#: part/serializers.py:1049 msgid "Copy Category Parameters" msgstr "複製類別參數" -#: part/serializers.py:1078 +#: part/serializers.py:1050 msgid "Copy parameter templates from selected part category" msgstr "從選擇的零件複製參數模版" -#: part/serializers.py:1083 +#: part/serializers.py:1055 msgid "Existing Image" msgstr "現有的圖片" -#: part/serializers.py:1084 +#: part/serializers.py:1056 msgid "Filename of an existing part image" msgstr "現有零件圖片的文件名" -#: part/serializers.py:1101 +#: part/serializers.py:1073 msgid "Image file does not exist" msgstr "圖片不存在" -#: part/serializers.py:1269 +#: part/serializers.py:1241 msgid "Validate entire Bill of Materials" msgstr "驗證整個物料清單" -#: part/serializers.py:1303 part/serializers.py:1769 +#: part/serializers.py:1275 part/serializers.py:1741 msgid "Can Build" msgstr "可以創建" -#: part/serializers.py:1320 +#: part/serializers.py:1292 msgid "Required for Build Orders" msgstr "生產工單需求數" -#: part/serializers.py:1325 +#: part/serializers.py:1297 msgid "Allocated to Build Orders" msgstr "已分配至生產工單" -#: part/serializers.py:1332 +#: part/serializers.py:1304 msgid "Required for Sales Orders" msgstr "銷售訂單需求數" -#: part/serializers.py:1336 +#: part/serializers.py:1308 msgid "Allocated to Sales Orders" msgstr "已分配至銷售訂單" -#: part/serializers.py:1475 +#: part/serializers.py:1447 msgid "Minimum Price" msgstr "最低價格" -#: part/serializers.py:1476 +#: part/serializers.py:1448 msgid "Override calculated value for minimum price" msgstr "覆蓋已計算的最低價格值" -#: part/serializers.py:1483 +#: part/serializers.py:1455 msgid "Minimum price currency" msgstr "最低價格貨幣" -#: part/serializers.py:1490 +#: part/serializers.py:1462 msgid "Maximum Price" msgstr "最高價格" -#: part/serializers.py:1491 +#: part/serializers.py:1463 msgid "Override calculated value for maximum price" msgstr "覆蓋已計算的最高價格值" -#: part/serializers.py:1498 +#: part/serializers.py:1470 msgid "Maximum price currency" msgstr "最高價格貨幣" -#: part/serializers.py:1527 +#: part/serializers.py:1499 msgid "Update" msgstr "更新" -#: part/serializers.py:1528 +#: part/serializers.py:1500 msgid "Update pricing for this part" msgstr "更新這個零件的價格" -#: part/serializers.py:1551 +#: part/serializers.py:1523 #, python-brace-format msgid "Could not convert from provided currencies to {default_currency}" msgstr "無法將所提供的貨幣轉換為 {default_currency}" -#: part/serializers.py:1558 +#: part/serializers.py:1530 msgid "Minimum price must not be greater than maximum price" msgstr "最低價格不能高於最高價格。" -#: part/serializers.py:1561 +#: part/serializers.py:1533 msgid "Maximum price must not be less than minimum price" msgstr "最高價格不能低於最低價格" -#: part/serializers.py:1715 +#: part/serializers.py:1687 msgid "Select the parent assembly" msgstr "選擇父裝配" -#: part/serializers.py:1735 +#: part/serializers.py:1707 msgid "Select the component part" msgstr "選擇零部件" -#: part/serializers.py:1929 +#: part/serializers.py:1901 msgid "Select part to copy BOM from" msgstr "選擇要複製物料清單的零件" -#: part/serializers.py:1937 +#: part/serializers.py:1909 msgid "Remove Existing Data" msgstr "移除現有數據" -#: part/serializers.py:1938 +#: part/serializers.py:1910 msgid "Remove existing BOM items before copying" msgstr "複製前刪除現有的物料清單項目" -#: part/serializers.py:1943 +#: part/serializers.py:1915 msgid "Include Inherited" msgstr "包含繼承的" -#: part/serializers.py:1944 +#: part/serializers.py:1916 msgid "Include BOM items which are inherited from templated parts" msgstr "包含從模板零件繼承的物料清單項目" -#: part/serializers.py:1949 +#: part/serializers.py:1921 msgid "Skip Invalid Rows" msgstr "跳過無效行" -#: part/serializers.py:1950 +#: part/serializers.py:1922 msgid "Enable this option to skip invalid rows" msgstr "啓用此選項以跳過無效行" -#: part/serializers.py:1955 +#: part/serializers.py:1927 msgid "Copy Substitute Parts" msgstr "複製替代品零件" -#: part/serializers.py:1956 +#: part/serializers.py:1928 msgid "Copy substitute parts when duplicate BOM items" msgstr "複製物料清單項目時複製替代品零件" @@ -8455,115 +8459,119 @@ msgstr "序列號需以清單提供" msgid "Quantity does not match serial numbers" msgstr "數量不匹配序列號" -#: stock/models.py:2012 stock/models.py:2917 +#: stock/models.py:1912 +msgid "Cannot assign stock to structural location" +msgstr "" + +#: stock/models.py:2029 stock/models.py:2934 msgid "Test template does not exist" msgstr "測試模板不存在" -#: stock/models.py:2030 +#: stock/models.py:2047 msgid "Stock item has been assigned to a sales order" msgstr "庫存項已分配到銷售訂單" -#: stock/models.py:2034 +#: stock/models.py:2051 msgid "Stock item is installed in another item" msgstr "庫存項已安裝在另一個項目中" -#: stock/models.py:2037 +#: stock/models.py:2054 msgid "Stock item contains other items" msgstr "庫存項包含其他項目" -#: stock/models.py:2040 +#: stock/models.py:2057 msgid "Stock item has been assigned to a customer" msgstr "庫存項已分配給客户" -#: stock/models.py:2043 stock/models.py:2226 +#: stock/models.py:2060 stock/models.py:2243 msgid "Stock item is currently in production" msgstr "庫存項目前正在生產" -#: stock/models.py:2046 +#: stock/models.py:2063 msgid "Serialized stock cannot be merged" msgstr "序列化的庫存不能合併" -#: stock/models.py:2053 stock/serializers.py:1462 +#: stock/models.py:2070 stock/serializers.py:1462 msgid "Duplicate stock items" msgstr "複製庫存項" -#: stock/models.py:2057 +#: stock/models.py:2074 msgid "Stock items must refer to the same part" msgstr "庫存項必須指相同零件" -#: stock/models.py:2065 +#: stock/models.py:2082 msgid "Stock items must refer to the same supplier part" msgstr "庫存項必須是同一供應商的零件" -#: stock/models.py:2070 +#: stock/models.py:2087 msgid "Stock status codes must match" msgstr "庫存狀態碼必須匹配" -#: stock/models.py:2349 +#: stock/models.py:2366 msgid "StockItem cannot be moved as it is not in stock" msgstr "庫存項不能移動,因為它沒有庫存" -#: stock/models.py:2818 +#: stock/models.py:2835 msgid "Stock Item Tracking" msgstr "庫存項跟蹤" -#: stock/models.py:2849 +#: stock/models.py:2866 msgid "Entry notes" msgstr "條目註釋" -#: stock/models.py:2889 +#: stock/models.py:2906 msgid "Stock Item Test Result" msgstr "庫存項測試結果" -#: stock/models.py:2920 +#: stock/models.py:2937 msgid "Value must be provided for this test" msgstr "必須為此測試提供值" -#: stock/models.py:2924 +#: stock/models.py:2941 msgid "Attachment must be uploaded for this test" msgstr "測試附件必須上傳" -#: stock/models.py:2929 +#: stock/models.py:2946 msgid "Invalid value for this test" msgstr "此測試的值無效" -#: stock/models.py:2953 +#: stock/models.py:2970 msgid "Test result" msgstr "測試結果" -#: stock/models.py:2960 +#: stock/models.py:2977 msgid "Test output value" msgstr "測試輸出值" -#: stock/models.py:2968 stock/serializers.py:248 +#: stock/models.py:2985 stock/serializers.py:248 msgid "Test result attachment" msgstr "測驗結果附件" -#: stock/models.py:2972 +#: stock/models.py:2989 msgid "Test notes" msgstr "測試備註" -#: stock/models.py:2980 +#: stock/models.py:2997 msgid "Test station" msgstr "測試站" -#: stock/models.py:2981 +#: stock/models.py:2998 msgid "The identifier of the test station where the test was performed" msgstr "進行測試的測試站的標識符" -#: stock/models.py:2987 +#: stock/models.py:3004 msgid "Started" msgstr "已開始" -#: stock/models.py:2988 +#: stock/models.py:3005 msgid "The timestamp of the test start" msgstr "測試開始的時間戳" -#: stock/models.py:2994 +#: stock/models.py:3011 msgid "Finished" msgstr "已完成" -#: stock/models.py:2995 +#: stock/models.py:3012 msgid "The timestamp of the test finish" msgstr "測試結束的時間戳" @@ -8902,83 +8910,87 @@ msgstr "已手動添加庫存" msgid "Stock manually removed" msgstr "已手動刪除庫存" -#: stock/status_codes.py:57 +#: stock/status_codes.py:56 +msgid "Serialized stock items" +msgstr "" + +#: stock/status_codes.py:58 msgid "Returned to stock" msgstr "退回庫存" -#: stock/status_codes.py:60 +#: stock/status_codes.py:61 msgid "Location changed" msgstr "地點已更改" -#: stock/status_codes.py:61 +#: stock/status_codes.py:62 msgid "Stock updated" msgstr "庫存已更新" -#: stock/status_codes.py:64 +#: stock/status_codes.py:65 msgid "Installed into assembly" msgstr "已安裝到裝配中" -#: stock/status_codes.py:65 +#: stock/status_codes.py:66 msgid "Removed from assembly" msgstr "已從裝配中刪除" -#: stock/status_codes.py:67 +#: stock/status_codes.py:68 msgid "Installed component item" msgstr "已安裝組件項" -#: stock/status_codes.py:68 +#: stock/status_codes.py:69 msgid "Removed component item" msgstr "已刪除組件項" -#: stock/status_codes.py:71 +#: stock/status_codes.py:72 msgid "Split from parent item" msgstr "從上級項拆分" -#: stock/status_codes.py:72 +#: stock/status_codes.py:73 msgid "Split child item" msgstr "拆分子項" -#: stock/status_codes.py:75 +#: stock/status_codes.py:76 msgid "Merged stock items" msgstr "合併的庫存項" -#: stock/status_codes.py:78 +#: stock/status_codes.py:79 msgid "Converted to variant" msgstr "轉換為變體" -#: stock/status_codes.py:81 +#: stock/status_codes.py:82 msgid "Build order output created" msgstr "已創建生產訂單產出" -#: stock/status_codes.py:82 +#: stock/status_codes.py:83 msgid "Build order output completed" msgstr "生產訂單已出產" -#: stock/status_codes.py:83 +#: stock/status_codes.py:84 msgid "Build order output rejected" msgstr "生產訂單產出被拒絕" -#: stock/status_codes.py:84 +#: stock/status_codes.py:85 msgid "Consumed by build order" msgstr "被工單消耗的" -#: stock/status_codes.py:87 +#: stock/status_codes.py:88 msgid "Shipped against Sales Order" msgstr "按銷售訂單出貨" -#: stock/status_codes.py:90 +#: stock/status_codes.py:91 msgid "Received against Purchase Order" msgstr "按採購訂單接收" -#: stock/status_codes.py:93 +#: stock/status_codes.py:94 msgid "Returned against Return Order" msgstr "按退貨訂單退回" -#: stock/status_codes.py:96 +#: stock/status_codes.py:97 msgid "Sent to customer" msgstr "寄送給客户" -#: stock/status_codes.py:97 +#: stock/status_codes.py:98 msgid "Returned from customer" msgstr "從客户端退回" diff --git a/src/frontend/src/locales/ar/messages.po b/src/frontend/src/locales/ar/messages.po index 6c1050e483..24a6e458ad 100644 --- a/src/frontend/src/locales/ar/messages.po +++ b/src/frontend/src/locales/ar/messages.po @@ -8,7 +8,7 @@ msgstr "" "Language: ar\n" "Project-Id-Version: inventree\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2025-11-19 19:39\n" +"PO-Revision-Date: 2025-11-22 06:25\n" "Last-Translator: \n" "Language-Team: Arabic\n" "Plural-Forms: nplurals=6; plural=(n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5);\n" @@ -56,7 +56,7 @@ msgstr "" #: lib/components/RowActions.tsx:136 #: src/components/nav/NavigationDrawer.tsx:190 -#: src/forms/PurchaseOrderForms.tsx:802 +#: src/forms/PurchaseOrderForms.tsx:854 #: src/forms/StockForms.tsx:796 #: src/forms/StockForms.tsx:843 #: src/forms/StockForms.tsx:889 @@ -103,9 +103,9 @@ msgstr "" #: src/forms/BuildForms.tsx:630 #: src/forms/BuildForms.tsx:793 #: src/forms/BuildForms.tsx:896 -#: src/forms/PurchaseOrderForms.tsx:798 +#: src/forms/PurchaseOrderForms.tsx:850 #: src/forms/ReturnOrderForms.tsx:242 -#: src/forms/SalesOrderForms.tsx:305 +#: src/forms/SalesOrderForms.tsx:323 #: src/forms/StockForms.tsx:360 #: src/forms/StockForms.tsx:791 #: src/forms/StockForms.tsx:838 @@ -119,6 +119,7 @@ msgstr "" #: src/pages/build/BuildDetail.tsx:200 #: src/pages/part/PartDetail.tsx:1207 #: src/tables/ColumnRenderers.tsx:91 +#: src/tables/part/PartTestResultTable.tsx:247 #: src/tables/part/RelatedPartTable.tsx:53 #: src/tables/stock/StockTrackingTable.tsx:87 msgid "Part" @@ -158,7 +159,7 @@ msgstr "" #: src/components/wizards/OrderPartsWizard.tsx:290 #: src/pages/company/SupplierPartDetail.tsx:413 #: src/pages/stock/StockDetail.tsx:289 -#: src/tables/build/BuildAllocatedStockTable.tsx:155 +#: src/tables/build/BuildAllocatedStockTable.tsx:152 #: src/tables/part/PartPurchaseOrdersTable.tsx:50 #: src/tables/purchasing/SupplierPartTable.tsx:83 #: src/tables/stock/StockItemTable.tsx:247 @@ -201,9 +202,9 @@ msgstr "" #: src/forms/BuildForms.tsx:473 #: src/forms/BuildForms.tsx:633 #: src/forms/BuildForms.tsx:794 -#: src/forms/SalesOrderForms.tsx:307 +#: src/forms/SalesOrderForms.tsx:325 #: src/pages/stock/StockDetail.tsx:1005 -#: src/tables/part/PartTestResultTable.tsx:248 +#: src/tables/part/PartTestResultTable.tsx:256 #: src/tables/stock/StockTrackingTable.tsx:48 #: src/tables/stock/StockTrackingTable.tsx:55 msgid "Stock Item" @@ -517,7 +518,7 @@ msgstr "" #: src/components/dashboard/DashboardLayout.tsx:281 #: src/components/editors/NotesEditor.tsx:74 #: src/components/editors/TemplateEditor/TemplateEditor.tsx:158 -#: src/components/forms/fields/ApiFormField.tsx:273 +#: src/components/forms/fields/ApiFormField.tsx:237 #: src/components/forms/fields/TableField.tsx:45 #: src/components/importer/ImportDataSelector.tsx:192 #: src/components/importer/ImporterColumnSelector.tsx:234 @@ -642,8 +643,8 @@ msgstr "" #: src/components/barcodes/BarcodeScanDialog.tsx:49 #: src/components/buttons/ScanButton.tsx:15 #: src/components/nav/NavigationDrawer.tsx:122 -#: src/forms/PurchaseOrderForms.tsx:457 -#: src/forms/PurchaseOrderForms.tsx:563 +#: src/forms/PurchaseOrderForms.tsx:509 +#: src/forms/PurchaseOrderForms.tsx:615 msgid "Scan Barcode" msgstr "" @@ -728,7 +729,7 @@ msgstr "" #: src/components/barcodes/QRCode.tsx:205 #: src/components/items/ActionDropdown.tsx:192 -#: src/forms/PurchaseOrderForms.tsx:554 +#: src/forms/PurchaseOrderForms.tsx:606 msgid "Unlink Barcode" msgstr "" @@ -1216,6 +1217,12 @@ msgstr "" #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:884 #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:903 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:254 +#: src/tables/build/BuildAllocatedStockTable.tsx:178 +#: src/tables/build/BuildAllocatedStockTable.tsx:258 +#: src/tables/build/BuildLineTable.tsx:111 +#: src/tables/build/BuildLineTable.tsx:665 +#: src/tables/sales/SalesOrderAllocationTable.tsx:224 +#: src/tables/sales/SalesOrderAllocationTable.tsx:247 msgid "Remove" msgstr "" @@ -1241,7 +1248,7 @@ msgid "Upload Error" msgstr "" #: src/components/details/DetailsImage.tsx:250 -#: src/components/forms/fields/TextField.tsx:65 +#: src/components/forms/fields/AutoFillRightSection.tsx:34 msgid "Clear" msgstr "" @@ -1817,10 +1824,14 @@ msgstr "" msgid "Running" msgstr "" -#: src/components/forms/fields/ApiFormField.tsx:233 +#: src/components/forms/fields/ApiFormField.tsx:197 msgid "Select file to upload" msgstr "" +#: src/components/forms/fields/AutoFillRightSection.tsx:47 +msgid "Accept suggested value" +msgstr "" + #: src/components/forms/fields/DateField.tsx:76 msgid "Select date" msgstr "" @@ -1875,10 +1886,6 @@ msgstr "" msgid "Add new row" msgstr "" -#: src/components/forms/fields/TextField.tsx:82 -msgid "Accept suggested value" -msgstr "" - #: src/components/images/DetailsImage.tsx:252 #~ msgid "Select image" #~ msgstr "Select image" @@ -2225,8 +2232,8 @@ msgstr "" #: src/pages/part/PartDetail.tsx:994 #: src/pages/stock/StockDetail.tsx:265 #: src/pages/stock/StockDetail.tsx:942 -#: src/tables/build/BuildAllocatedStockTable.tsx:135 -#: src/tables/build/BuildLineTable.tsx:192 +#: src/tables/build/BuildAllocatedStockTable.tsx:132 +#: src/tables/build/BuildLineTable.tsx:193 #: src/tables/part/PartTable.tsx:137 #: src/tables/stock/StockItemTable.tsx:182 #: src/tables/stock/StockItemTable.tsx:343 @@ -2784,7 +2791,7 @@ msgstr "" #: src/pages/sales/SalesOrderDetail.tsx:119 #: src/pages/stock/LocationDetail.tsx:102 #: src/tables/ColumnRenderers.tsx:278 -#: src/tables/build/BuildAllocatedStockTable.tsx:91 +#: src/tables/build/BuildAllocatedStockTable.tsx:88 #: src/tables/machine/MachineTypeTable.tsx:161 #: src/tables/machine/MachineTypeTable.tsx:257 #: src/tables/plugin/PluginListTable.tsx:110 @@ -2966,7 +2973,7 @@ msgstr "" #: src/pages/company/SupplierPartDetail.tsx:394 #: src/pages/part/PartDetail.tsx:1015 #: src/tables/bom/BomTable.tsx:444 -#: src/tables/build/BuildLineTable.tsx:222 +#: src/tables/build/BuildLineTable.tsx:223 #: src/tables/part/PartTable.tsx:108 msgid "On Order" msgstr "" @@ -2976,7 +2983,7 @@ msgstr "" #: src/pages/part/PartDetail.tsx:587 #: src/pages/part/PartDetail.tsx:1021 #: src/pages/stock/StockDetail.tsx:925 -#: src/tables/part/PartTestResultTable.tsx:297 +#: src/tables/part/PartTestResultTable.tsx:305 #: src/tables/stock/StockItemTable.tsx:359 msgid "In Production" msgstr "" @@ -3000,7 +3007,7 @@ msgstr "" #: src/components/render/Stock.tsx:114 #: src/components/render/Stock.tsx:132 #: src/forms/BuildForms.tsx:795 -#: src/forms/PurchaseOrderForms.tsx:595 +#: src/forms/PurchaseOrderForms.tsx:647 #: src/forms/StockForms.tsx:792 #: src/forms/StockForms.tsx:839 #: src/forms/StockForms.tsx:885 @@ -3023,7 +3030,7 @@ msgstr "" #: src/components/render/Stock.tsx:99 #: src/pages/stock/StockDetail.tsx:198 #: src/pages/stock/StockDetail.tsx:930 -#: src/tables/build/BuildAllocatedStockTable.tsx:121 +#: src/tables/build/BuildAllocatedStockTable.tsx:118 #: src/tables/build/BuildOutputTable.tsx:107 #: src/tables/sales/SalesOrderAllocationTable.tsx:142 msgid "Serial Number" @@ -3034,9 +3041,9 @@ msgstr "" #: src/forms/BuildForms.tsx:240 #: src/forms/BuildForms.tsx:634 #: src/forms/BuildForms.tsx:797 -#: src/forms/PurchaseOrderForms.tsx:801 +#: src/forms/PurchaseOrderForms.tsx:853 #: src/forms/ReturnOrderForms.tsx:243 -#: src/forms/SalesOrderForms.tsx:308 +#: src/forms/SalesOrderForms.tsx:326 #: src/forms/StockForms.tsx:841 #: src/pages/part/PartStockHistoryDetail.tsx:56 #: src/pages/part/PartStockHistoryDetail.tsx:210 @@ -3046,9 +3053,9 @@ msgstr "" #: src/pages/part/pricing/PriceBreakPanel.tsx:172 #: src/pages/stock/StockDetail.tsx:258 #: src/pages/stock/StockDetail.tsx:936 -#: src/tables/build/BuildLineTable.tsx:86 +#: src/tables/build/BuildLineTable.tsx:83 #: src/tables/part/PartPurchaseOrdersTable.tsx:94 -#: src/tables/part/PartTestResultTable.tsx:269 +#: src/tables/part/PartTestResultTable.tsx:277 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:175 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:206 #: src/tables/purchasing/SupplierPriceBreakTable.tsx:69 @@ -3070,7 +3077,7 @@ msgstr "" #: src/forms/StockForms.tsx:1048 #: src/forms/StockForms.tsx:1096 #: src/forms/StockForms.tsx:1140 -#: src/tables/build/BuildLineTable.tsx:96 +#: src/tables/build/BuildLineTable.tsx:93 msgid "Batch" msgstr "" @@ -3755,7 +3762,7 @@ msgid "In Stock" msgstr "" #: src/components/wizards/OrderPartsWizard.tsx:146 -#: src/tables/build/BuildLineTable.tsx:404 +#: src/tables/build/BuildLineTable.tsx:405 msgid "Required Quantity" msgstr "" @@ -3847,7 +3854,7 @@ msgid "Please correct the errors in the selected parts" msgstr "" #: src/components/wizards/OrderPartsWizard.tsx:587 -#: src/tables/build/BuildLineTable.tsx:815 +#: src/tables/build/BuildLineTable.tsx:822 #: src/tables/part/PartTable.tsx:522 #: src/tables/sales/SalesOrderLineItemTable.tsx:370 msgid "Order Parts" @@ -4349,9 +4356,9 @@ msgstr "" #: src/forms/BuildForms.tsx:333 #: src/forms/BuildForms.tsx:408 #: src/forms/BuildForms.tsx:685 -#: src/tables/build/BuildAllocatedStockTable.tsx:150 +#: src/tables/build/BuildAllocatedStockTable.tsx:147 #: src/tables/build/BuildOutputTable.tsx:582 -#: src/tables/part/PartTestResultTable.tsx:272 +#: src/tables/part/PartTestResultTable.tsx:280 msgid "Build Output" msgstr "" @@ -4362,7 +4369,7 @@ msgstr "" #: src/forms/BuildForms.tsx:336 #: src/forms/BuildForms.tsx:411 #: src/forms/BuildForms.tsx:475 -#: src/forms/PurchaseOrderForms.tsx:717 +#: src/forms/PurchaseOrderForms.tsx:769 #: src/forms/ReturnOrderForms.tsx:197 #: src/forms/ReturnOrderForms.tsx:244 #: src/forms/StockForms.tsx:712 @@ -4377,7 +4384,7 @@ msgstr "" #: src/tables/build/BuildOutputTable.tsx:404 #: src/tables/machine/MachineListTable.tsx:387 #: src/tables/part/PartPurchaseOrdersTable.tsx:38 -#: src/tables/part/PartTestResultTable.tsx:309 +#: src/tables/part/PartTestResultTable.tsx:317 #: src/tables/sales/ReturnOrderLineItemTable.tsx:138 #: src/tables/sales/ReturnOrderLineItemTable.tsx:176 #: src/tables/settings/CustomStateTable.tsx:79 @@ -4450,8 +4457,8 @@ msgstr "" #: src/pages/stock/StockDetail.tsx:153 #: src/tables/bom/BomTable.tsx:134 #: src/tables/bom/UsedInTable.tsx:40 -#: src/tables/build/BuildAllocatedStockTable.tsx:108 -#: src/tables/build/BuildLineTable.tsx:336 +#: src/tables/build/BuildAllocatedStockTable.tsx:105 +#: src/tables/build/BuildLineTable.tsx:337 #: src/tables/build/BuildOrderTable.tsx:79 #: src/tables/part/PartSalesAllocationsTable.tsx:61 #: src/tables/part/RelatedPartTable.tsx:73 @@ -4466,47 +4473,47 @@ msgstr "" #: src/forms/BuildForms.tsx:632 #: src/forms/BuildForms.tsx:796 #: src/forms/BuildForms.tsx:897 -#: src/forms/SalesOrderForms.tsx:306 -#: src/tables/build/BuildAllocatedStockTable.tsx:139 -#: src/tables/build/BuildLineTable.tsx:182 +#: src/forms/SalesOrderForms.tsx:324 +#: src/tables/build/BuildAllocatedStockTable.tsx:136 +#: src/tables/build/BuildLineTable.tsx:183 #: src/tables/sales/SalesOrderLineItemTable.tsx:342 #: src/tables/stock/StockItemTable.tsx:338 msgid "Allocated" msgstr "" #: src/forms/BuildForms.tsx:667 -#: src/forms/SalesOrderForms.tsx:295 +#: src/forms/SalesOrderForms.tsx:313 #: src/pages/build/BuildDetail.tsx:108 #: src/pages/build/BuildDetail.tsx:326 msgid "Source Location" msgstr "" #: src/forms/BuildForms.tsx:668 -#: src/forms/SalesOrderForms.tsx:296 +#: src/forms/SalesOrderForms.tsx:314 msgid "Select the source location for the stock allocation" msgstr "اختر موقع المصدر لتخصيص المخزون" #: src/forms/BuildForms.tsx:700 -#: src/forms/SalesOrderForms.tsx:336 -#: src/tables/build/BuildLineTable.tsx:574 -#: src/tables/build/BuildLineTable.tsx:731 -#: src/tables/build/BuildLineTable.tsx:830 +#: src/forms/SalesOrderForms.tsx:354 +#: src/tables/build/BuildLineTable.tsx:575 +#: src/tables/build/BuildLineTable.tsx:738 +#: src/tables/build/BuildLineTable.tsx:837 #: src/tables/sales/SalesOrderLineItemTable.tsx:380 #: src/tables/sales/SalesOrderLineItemTable.tsx:406 msgid "Allocate Stock" msgstr "" #: src/forms/BuildForms.tsx:703 -#: src/forms/SalesOrderForms.tsx:341 +#: src/forms/SalesOrderForms.tsx:359 msgid "Stock items allocated" msgstr "تم تخصيص عناصر المخزون" #: src/forms/BuildForms.tsx:816 #: src/forms/BuildForms.tsx:917 -#: src/tables/build/BuildAllocatedStockTable.tsx:240 -#: src/tables/build/BuildAllocatedStockTable.tsx:272 -#: src/tables/build/BuildLineTable.tsx:741 -#: src/tables/build/BuildLineTable.tsx:864 +#: src/tables/build/BuildAllocatedStockTable.tsx:243 +#: src/tables/build/BuildAllocatedStockTable.tsx:279 +#: src/tables/build/BuildLineTable.tsx:748 +#: src/tables/build/BuildLineTable.tsx:871 msgid "Consume Stock" msgstr "" @@ -4521,21 +4528,21 @@ msgstr "" #~ msgstr "Stock items consumed" #: src/forms/BuildForms.tsx:853 -#: src/tables/build/BuildLineTable.tsx:514 +#: src/tables/build/BuildLineTable.tsx:515 #: src/tables/part/PartBuildAllocationsTable.tsx:101 msgid "Fully consumed" msgstr "" #: src/forms/BuildForms.tsx:898 -#: src/tables/build/BuildLineTable.tsx:187 +#: src/tables/build/BuildLineTable.tsx:188 #: src/tables/stock/StockItemTable.tsx:367 msgid "Consumed" msgstr "" #: src/forms/CommonForms.tsx:88 -#: src/forms/PurchaseOrderForms.tsx:125 +#: src/forms/PurchaseOrderForms.tsx:176 #: src/forms/ReturnOrderForms.tsx:138 -#: src/forms/SalesOrderForms.tsx:164 +#: src/forms/SalesOrderForms.tsx:182 msgid "Select project code for this line item" msgstr "" @@ -4572,32 +4579,16 @@ msgstr "" msgid "Subscribe to notifications for this category" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:388 -msgid "Assign Batch Code and Serial Numbers" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:390 -msgid "Assign Batch Code" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:410 -msgid "Choose Location" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:418 -msgid "Item Destination selected" -msgstr "" - #: src/forms/PurchaseOrderForms.tsx:421 #~ msgid "Assign Batch Code{0}" #~ msgstr "Assign Batch Code{0}" -#: src/forms/PurchaseOrderForms.tsx:428 -msgid "Part category default location selected" +#: src/forms/PurchaseOrderForms.tsx:440 +msgid "Assign Batch Code and Serial Numbers" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:438 -msgid "Received stock location selected" +#: src/forms/PurchaseOrderForms.tsx:442 +msgid "Assign Batch Code" msgstr "" #: src/forms/PurchaseOrderForms.tsx:444 @@ -4605,94 +4596,110 @@ msgstr "" #~ msgid "Remove item from list" #~ msgstr "Remove item from list" -#: src/forms/PurchaseOrderForms.tsx:446 +#: src/forms/PurchaseOrderForms.tsx:462 +msgid "Choose Location" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:470 +msgid "Item Destination selected" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:480 +msgid "Part category default location selected" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:490 +msgid "Received stock location selected" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:498 msgid "Default location selected" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:507 +#: src/forms/PurchaseOrderForms.tsx:559 msgid "Set Location" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:524 -msgid "Set Expiry Date" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:532 -#: src/forms/StockForms.tsx:693 -msgid "Adjust Packaging" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:540 -#: src/forms/StockForms.tsx:684 -#: src/hooks/UseStockAdjustActions.tsx:148 -msgid "Change Status" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:546 -msgid "Add Note" -msgstr "" - #: src/forms/PurchaseOrderForms.tsx:566 #~ msgid "Serial numbers" #~ msgstr "Serial numbers" +#: src/forms/PurchaseOrderForms.tsx:576 +msgid "Set Expiry Date" +msgstr "" + #: src/forms/PurchaseOrderForms.tsx:582 #~ msgid "Store at line item destination" #~ msgstr "Store at line item destination" -#: src/forms/PurchaseOrderForms.tsx:610 -msgid "Store at default location" +#: src/forms/PurchaseOrderForms.tsx:584 +#: src/forms/StockForms.tsx:693 +msgid "Adjust Packaging" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:625 -msgid "Store at line item destination " +#: src/forms/PurchaseOrderForms.tsx:592 +#: src/forms/StockForms.tsx:684 +#: src/hooks/UseStockAdjustActions.tsx:148 +msgid "Change Status" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:637 -msgid "Store with already received stock" +#: src/forms/PurchaseOrderForms.tsx:598 +msgid "Add Note" msgstr "" #: src/forms/PurchaseOrderForms.tsx:658 #~ msgid "Receive line items" #~ msgstr "Receive line items" -#: src/forms/PurchaseOrderForms.tsx:661 +#: src/forms/PurchaseOrderForms.tsx:662 +msgid "Store at default location" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:677 +msgid "Store at line item destination " +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:689 +msgid "Store with already received stock" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:713 #: src/pages/build/BuildDetail.tsx:340 #: src/pages/stock/StockDetail.tsx:280 #: src/pages/stock/StockDetail.tsx:952 #: src/tables/Filter.tsx:83 -#: src/tables/build/BuildAllocatedStockTable.tsx:128 +#: src/tables/build/BuildAllocatedStockTable.tsx:125 #: src/tables/build/BuildOutputTable.tsx:112 -#: src/tables/part/PartTestResultTable.tsx:260 -#: src/tables/part/PartTestResultTable.tsx:281 +#: src/tables/part/PartTestResultTable.tsx:268 +#: src/tables/part/PartTestResultTable.tsx:289 #: src/tables/sales/SalesOrderAllocationTable.tsx:149 msgid "Batch Code" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:662 +#: src/forms/PurchaseOrderForms.tsx:714 msgid "Enter batch code for received items" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:675 +#: src/forms/PurchaseOrderForms.tsx:727 #: src/forms/StockForms.tsx:218 msgid "Serial Numbers" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:676 +#: src/forms/PurchaseOrderForms.tsx:728 msgid "Enter serial numbers for received items" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:690 +#: src/forms/PurchaseOrderForms.tsx:742 #: src/pages/stock/StockDetail.tsx:382 #: src/tables/stock/StockItemTable.tsx:294 msgid "Expiry Date" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:691 +#: src/forms/PurchaseOrderForms.tsx:743 msgid "Enter an expiry date for received items" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:703 +#: src/forms/PurchaseOrderForms.tsx:755 #: src/forms/StockForms.tsx:728 #: src/pages/company/SupplierPartDetail.tsx:172 #: src/pages/company/SupplierPartDetail.tsx:236 @@ -4701,19 +4708,19 @@ msgstr "" msgid "Packaging" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:727 +#: src/forms/PurchaseOrderForms.tsx:779 #: src/pages/company/SupplierPartDetail.tsx:120 #: src/tables/ColumnRenderers.tsx:332 msgid "Note" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:799 +#: src/forms/PurchaseOrderForms.tsx:851 #: src/pages/company/SupplierPartDetail.tsx:138 #: src/tables/purchasing/SupplierPriceBreakTable.tsx:49 msgid "SKU" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:800 +#: src/forms/PurchaseOrderForms.tsx:852 #: src/tables/part/PartPurchaseOrdersTable.tsx:127 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:213 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:283 @@ -4721,11 +4728,11 @@ msgstr "" msgid "Received" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:817 +#: src/forms/PurchaseOrderForms.tsx:869 msgid "Receive Line Items" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:823 +#: src/forms/PurchaseOrderForms.tsx:875 msgid "Items received" msgstr "" @@ -4737,7 +4744,7 @@ msgstr "" msgid "Item received into stock" msgstr "" -#: src/forms/SalesOrderForms.tsx:401 +#: src/forms/SalesOrderForms.tsx:419 msgid "Leave blank to use the order address" msgstr "" @@ -5932,6 +5939,9 @@ msgstr "" #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:310 #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:401 +#: src/tables/build/BuildAllocatedStockTable.tsx:181 +#: src/tables/build/BuildLineTable.tsx:668 +#: src/tables/sales/SalesOrderAllocationTable.tsx:220 msgid "Confirm Removal" msgstr "" @@ -6870,8 +6880,8 @@ msgstr "" #: src/pages/sales/ReturnOrderDetail.tsx:108 #: src/pages/sales/SalesOrderDetail.tsx:98 #: src/tables/ColumnRenderers.tsx:321 -#: src/tables/build/BuildAllocatedStockTable.tsx:115 -#: src/tables/build/BuildLineTable.tsx:352 +#: src/tables/build/BuildAllocatedStockTable.tsx:112 +#: src/tables/build/BuildLineTable.tsx:353 msgid "Reference" msgstr "" @@ -7132,7 +7142,7 @@ msgstr "" #: src/pages/build/BuildDetail.tsx:742 #: src/pages/stock/StockDetail.tsx:344 -#: src/tables/build/BuildAllocatedStockTable.tsx:85 +#: src/tables/build/BuildAllocatedStockTable.tsx:82 #: src/tables/part/PartBuildAllocationsTable.tsx:45 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:157 #: src/tables/stock/StockTrackingTable.tsx:109 @@ -7600,7 +7610,7 @@ msgstr "" #: src/pages/part/PartDetail.tsx:542 #: src/tables/bom/BomTable.tsx:439 -#: src/tables/build/BuildLineTable.tsx:305 +#: src/tables/build/BuildLineTable.tsx:306 #: src/tables/part/PartTable.tsx:319 #: src/tables/sales/SalesOrderLineItemTable.tsx:138 msgid "Available Stock" @@ -7608,7 +7618,7 @@ msgstr "" #: src/pages/part/PartDetail.tsx:548 #: src/tables/bom/BomTable.tsx:341 -#: src/tables/build/BuildLineTable.tsx:267 +#: src/tables/build/BuildLineTable.tsx:268 #: src/tables/sales/SalesOrderLineItemTable.tsx:180 msgid "On order" msgstr "" @@ -7782,7 +7792,7 @@ msgstr "" #: src/pages/part/PartDetail.tsx:1144 #: src/pages/stock/StockDetail.tsx:884 -#: src/tables/build/BuildLineTable.tsx:761 +#: src/tables/build/BuildLineTable.tsx:768 msgid "Order Stock" msgstr "" @@ -9219,13 +9229,13 @@ msgstr "" #~ msgstr "Show asssmbled items" #: src/tables/bom/BomTable.tsx:315 -#: src/tables/build/BuildLineTable.tsx:276 +#: src/tables/build/BuildLineTable.tsx:277 #: src/tables/part/PartTable.tsx:145 msgid "External stock" msgstr "" #: src/tables/bom/BomTable.tsx:323 -#: src/tables/build/BuildLineTable.tsx:239 +#: src/tables/build/BuildLineTable.tsx:240 msgid "Includes substitute stock" msgstr "" @@ -9234,7 +9244,7 @@ msgstr "" #~ msgstr "Edit Bom Item" #: src/tables/bom/BomTable.tsx:332 -#: src/tables/build/BuildLineTable.tsx:249 +#: src/tables/build/BuildLineTable.tsx:250 #: src/tables/sales/SalesOrderLineItemTable.tsx:166 msgid "Includes variant stock" msgstr "" @@ -9272,8 +9282,8 @@ msgid "Stock Information" msgstr "" #: src/tables/bom/BomTable.tsx:399 -#: src/tables/build/BuildLineTable.tsx:496 -#: src/tables/build/BuildLineTable.tsx:537 +#: src/tables/build/BuildLineTable.tsx:497 +#: src/tables/build/BuildLineTable.tsx:538 msgid "Consumable item" msgstr "" @@ -9282,7 +9292,7 @@ msgid "No available stock" msgstr "" #: src/tables/bom/BomTable.tsx:420 -#: src/tables/build/BuildLineTable.tsx:213 +#: src/tables/build/BuildLineTable.tsx:214 msgid "Show testable items" msgstr "" @@ -9291,7 +9301,7 @@ msgid "Show trackable items" msgstr "" #: src/tables/bom/BomTable.tsx:430 -#: src/tables/build/BuildLineTable.tsx:208 +#: src/tables/build/BuildLineTable.tsx:209 msgid "Show assembled items" msgstr "" @@ -9335,7 +9345,7 @@ msgstr "" #: src/tables/bom/BomTable.tsx:464 #: src/tables/bom/UsedInTable.tsx:85 -#: src/tables/build/BuildLineTable.tsx:202 +#: src/tables/build/BuildLineTable.tsx:203 msgid "Optional" msgstr "" @@ -9345,7 +9355,7 @@ msgid "Show optional items" msgstr "" #: src/tables/bom/BomTable.tsx:469 -#: src/tables/build/BuildLineTable.tsx:197 +#: src/tables/build/BuildLineTable.tsx:198 msgid "Consumable" msgstr "" @@ -9433,7 +9443,7 @@ msgid "Bill of materials cannot be edited, as the part is locked" msgstr "" #: src/tables/bom/UsedInTable.tsx:34 -#: src/tables/build/BuildLineTable.tsx:207 +#: src/tables/build/BuildLineTable.tsx:208 #: src/tables/part/ParametricPartTable.tsx:364 #: src/tables/part/PartBuildAllocationsTable.tsx:60 #: src/tables/part/PartTable.tsx:209 @@ -9455,11 +9465,11 @@ msgstr "" msgid "Show trackable assemblies" msgstr "" -#: src/tables/build/BuildAllocatedStockTable.tsx:67 +#: src/tables/build/BuildAllocatedStockTable.tsx:64 msgid "Allocated to Output" msgstr "" -#: src/tables/build/BuildAllocatedStockTable.tsx:68 +#: src/tables/build/BuildAllocatedStockTable.tsx:65 msgid "Show items allocated to a build output" msgstr "" @@ -9472,7 +9482,7 @@ msgstr "" #~ msgid "Include orders for part variants" #~ msgstr "Include orders for part variants" -#: src/tables/build/BuildAllocatedStockTable.tsx:97 +#: src/tables/build/BuildAllocatedStockTable.tsx:94 #: src/tables/part/PartBuildAllocationsTable.tsx:84 #: src/tables/part/PartPurchaseOrdersTable.tsx:132 #: src/tables/part/PartSalesAllocationsTable.tsx:69 @@ -9482,40 +9492,58 @@ msgid "Order Status" msgstr "" #: src/tables/build/BuildAllocatedStockTable.tsx:164 -#~ msgid "Edit Build Item" -#~ msgstr "Edit Build Item" - -#: src/tables/build/BuildAllocatedStockTable.tsx:167 -#: src/tables/build/BuildLineTable.tsx:650 +#: src/tables/build/BuildLineTable.tsx:651 msgid "Edit Stock Allocation" msgstr "" +#: src/tables/build/BuildAllocatedStockTable.tsx:164 +#~ msgid "Edit Build Item" +#~ msgstr "Edit Build Item" + #: src/tables/build/BuildAllocatedStockTable.tsx:174 #~ msgid "Delete Build Item" #~ msgstr "Delete Build Item" -#: src/tables/build/BuildAllocatedStockTable.tsx:180 -#: src/tables/build/BuildLineTable.tsx:663 -msgid "Delete Stock Allocation" +#: src/tables/build/BuildAllocatedStockTable.tsx:177 +#: src/tables/build/BuildLineTable.tsx:664 +#: src/tables/sales/SalesOrderAllocationTable.tsx:218 +msgid "Remove Allocated Stock" msgstr "" -#: src/tables/build/BuildAllocatedStockTable.tsx:239 +#: src/tables/build/BuildAllocatedStockTable.tsx:180 +#: src/tables/build/BuildLineTable.tsx:663 +#~ msgid "Delete Stock Allocation" +#~ msgstr "Delete Stock Allocation" + +#: src/tables/build/BuildAllocatedStockTable.tsx:182 +#: src/tables/build/BuildLineTable.tsx:669 +#: src/tables/sales/SalesOrderAllocationTable.tsx:221 +msgid "Are you sure you want to remove this allocated stock from the order?" +msgstr "" + +#: src/tables/build/BuildAllocatedStockTable.tsx:242 msgid "Consume" msgstr "" +#: src/tables/build/BuildAllocatedStockTable.tsx:259 +#: src/tables/build/BuildLineTable.tsx:112 +#: src/tables/sales/SalesOrderAllocationTable.tsx:248 +msgid "Remove allocated stock" +msgstr "" + #: src/tables/build/BuildLineTable.tsx:59 #~ msgid "Show lines with available stock" #~ msgstr "Show lines with available stock" -#: src/tables/build/BuildLineTable.tsx:120 +#: src/tables/build/BuildLineTable.tsx:121 msgid "View Stock Item" msgstr "" -#: src/tables/build/BuildLineTable.tsx:183 +#: src/tables/build/BuildLineTable.tsx:184 msgid "Show fully allocated lines" msgstr "" -#: src/tables/build/BuildLineTable.tsx:188 +#: src/tables/build/BuildLineTable.tsx:189 msgid "Show fully consumed lines" msgstr "" @@ -9523,124 +9551,124 @@ msgstr "" #~ msgid "Show allocated lines" #~ msgstr "Show allocated lines" -#: src/tables/build/BuildLineTable.tsx:193 +#: src/tables/build/BuildLineTable.tsx:194 msgid "Show items with sufficient available stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:198 +#: src/tables/build/BuildLineTable.tsx:199 msgid "Show consumable lines" msgstr "" -#: src/tables/build/BuildLineTable.tsx:203 +#: src/tables/build/BuildLineTable.tsx:204 msgid "Show optional lines" msgstr "" -#: src/tables/build/BuildLineTable.tsx:212 +#: src/tables/build/BuildLineTable.tsx:213 #: src/tables/part/PartTable.tsx:233 msgid "Testable" msgstr "" -#: src/tables/build/BuildLineTable.tsx:217 +#: src/tables/build/BuildLineTable.tsx:218 #: src/tables/stock/StockItemTable.tsx:388 msgid "Tracked" msgstr "" -#: src/tables/build/BuildLineTable.tsx:218 +#: src/tables/build/BuildLineTable.tsx:219 msgid "Show tracked lines" msgstr "" -#: src/tables/build/BuildLineTable.tsx:223 +#: src/tables/build/BuildLineTable.tsx:224 msgid "Show items with stock on order" msgstr "" -#: src/tables/build/BuildLineTable.tsx:258 +#: src/tables/build/BuildLineTable.tsx:259 #: src/tables/sales/SalesOrderLineItemTable.tsx:172 msgid "In production" msgstr "" -#: src/tables/build/BuildLineTable.tsx:286 +#: src/tables/build/BuildLineTable.tsx:287 msgid "Insufficient stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:302 +#: src/tables/build/BuildLineTable.tsx:303 #: src/tables/sales/SalesOrderLineItemTable.tsx:160 #: src/tables/stock/StockItemTable.tsx:191 msgid "No stock available" msgstr "" -#: src/tables/build/BuildLineTable.tsx:375 +#: src/tables/build/BuildLineTable.tsx:376 msgid "Gets Inherited" msgstr "" -#: src/tables/build/BuildLineTable.tsx:388 +#: src/tables/build/BuildLineTable.tsx:389 msgid "Unit Quantity" msgstr "" -#: src/tables/build/BuildLineTable.tsx:415 +#: src/tables/build/BuildLineTable.tsx:416 msgid "Setup Quantity" msgstr "" -#: src/tables/build/BuildLineTable.tsx:424 +#: src/tables/build/BuildLineTable.tsx:425 msgid "Attrition" msgstr "" -#: src/tables/build/BuildLineTable.tsx:432 +#: src/tables/build/BuildLineTable.tsx:433 msgid "Rounding Multiple" msgstr "" -#: src/tables/build/BuildLineTable.tsx:441 +#: src/tables/build/BuildLineTable.tsx:442 msgid "BOM Information" msgstr "" -#: src/tables/build/BuildLineTable.tsx:515 +#: src/tables/build/BuildLineTable.tsx:516 #: src/tables/part/PartBuildAllocationsTable.tsx:102 msgid "Fully allocated" msgstr "" -#: src/tables/build/BuildLineTable.tsx:563 +#: src/tables/build/BuildLineTable.tsx:564 #: src/tables/sales/SalesOrderLineItemTable.tsx:311 msgid "Create Build Order" msgstr "" -#: src/tables/build/BuildLineTable.tsx:592 +#: src/tables/build/BuildLineTable.tsx:593 msgid "Auto allocation in progress" msgstr "التخصيص التلقائي قيد التنفيذ" -#: src/tables/build/BuildLineTable.tsx:595 -#: src/tables/build/BuildLineTable.tsx:802 +#: src/tables/build/BuildLineTable.tsx:596 +#: src/tables/build/BuildLineTable.tsx:809 msgid "Auto Allocate Stock" msgstr "تخصيص تلقائي للمخزون" -#: src/tables/build/BuildLineTable.tsx:596 +#: src/tables/build/BuildLineTable.tsx:597 msgid "Automatically allocate stock to this build according to the selected options" msgstr "تخصيص المخزون تِلْقائيًا لهذا البناء وفقا للخيارات المحددة" -#: src/tables/build/BuildLineTable.tsx:616 -#: src/tables/build/BuildLineTable.tsx:630 -#: src/tables/build/BuildLineTable.tsx:751 -#: src/tables/build/BuildLineTable.tsx:852 +#: src/tables/build/BuildLineTable.tsx:617 +#: src/tables/build/BuildLineTable.tsx:631 +#: src/tables/build/BuildLineTable.tsx:758 +#: src/tables/build/BuildLineTable.tsx:859 #: src/tables/build/BuildOutputTable.tsx:355 #: src/tables/build/BuildOutputTable.tsx:360 msgid "Deallocate Stock" msgstr "إلغاء تخصيص المخزون" -#: src/tables/build/BuildLineTable.tsx:632 +#: src/tables/build/BuildLineTable.tsx:633 msgid "Deallocate all untracked stock for this build order" msgstr "إلغاء تخصيص جميع المخزون الغير متابع لطلب البناء هذا" -#: src/tables/build/BuildLineTable.tsx:634 +#: src/tables/build/BuildLineTable.tsx:635 msgid "Deallocate stock from the selected line item" msgstr "إلغاء تخصيص المخزون من العنصر المحدد" -#: src/tables/build/BuildLineTable.tsx:638 +#: src/tables/build/BuildLineTable.tsx:639 msgid "Stock has been deallocated" msgstr "تم إلغاء تخصيص المخزون" -#: src/tables/build/BuildLineTable.tsx:771 +#: src/tables/build/BuildLineTable.tsx:778 msgid "Build Stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:784 +#: src/tables/build/BuildLineTable.tsx:791 #: src/tables/sales/SalesOrderLineItemTable.tsx:487 msgid "View Part" msgstr "" @@ -9739,7 +9767,7 @@ msgid "Serialize Build Output" msgstr "" #: src/tables/build/BuildOutputTable.tsx:405 -#: src/tables/part/PartTestResultTable.tsx:310 +#: src/tables/part/PartTestResultTable.tsx:318 #: src/tables/stock/StockItemTable.tsx:328 msgid "Filter by stock status" msgstr "" @@ -9964,8 +9992,8 @@ msgid "View Item" msgstr "" #: src/tables/general/ExtraLineItemTable.tsx:95 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:299 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:403 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:300 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:405 #: src/tables/sales/ReturnOrderLineItemTable.tsx:83 #: src/tables/sales/ReturnOrderLineItemTable.tsx:187 #: src/tables/sales/SalesOrderLineItemTable.tsx:252 @@ -9974,14 +10002,14 @@ msgid "Add Line Item" msgstr "" #: src/tables/general/ExtraLineItemTable.tsx:108 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:320 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:322 #: src/tables/sales/ReturnOrderLineItemTable.tsx:96 #: src/tables/sales/SalesOrderLineItemTable.tsx:271 msgid "Edit Line Item" msgstr "" #: src/tables/general/ExtraLineItemTable.tsx:117 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:329 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:331 #: src/tables/sales/ReturnOrderLineItemTable.tsx:105 #: src/tables/sales/SalesOrderLineItemTable.tsx:280 msgid "Delete Line Item" @@ -10273,7 +10301,7 @@ msgid "Required Stock" msgstr "" #: src/tables/part/PartBuildAllocationsTable.tsx:124 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:381 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:383 msgid "View Build Order" msgstr "" @@ -10617,8 +10645,8 @@ msgstr "" #: src/tables/part/PartTestResultTable.tsx:103 #: src/tables/part/PartTestResultTable.tsx:181 -#: src/tables/part/PartTestResultTable.tsx:320 -#: src/tables/part/PartTestResultTable.tsx:334 +#: src/tables/part/PartTestResultTable.tsx:328 +#: src/tables/part/PartTestResultTable.tsx:342 #: src/tables/stock/StockItemTestResultTable.tsx:296 #: src/tables/stock/StockItemTestResultTable.tsx:368 #: src/tables/stock/StockItemTestResultTable.tsx:429 @@ -10643,7 +10671,7 @@ msgstr "" msgid "No Result" msgstr "" -#: src/tables/part/PartTestResultTable.tsx:298 +#: src/tables/part/PartTestResultTable.tsx:306 msgid "Show build outputs currently in production" msgstr "" @@ -11073,7 +11101,7 @@ msgid "Show manufacturer parts for active manufacturers." msgstr "" #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:115 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:397 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:399 msgid "Import Line Items" msgstr "" @@ -11099,11 +11127,11 @@ msgstr "" #~ msgid "Add line item" #~ msgstr "Add line item" -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:350 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:352 msgid "Receive line item" msgstr "" -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:414 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:416 msgid "Receive items" msgstr "" @@ -11201,25 +11229,25 @@ msgid "Not shipped" msgstr "" #: src/tables/sales/SalesOrderAllocationTable.tsx:211 -#: src/tables/sales/SalesOrderAllocationTable.tsx:229 +#: src/tables/sales/SalesOrderAllocationTable.tsx:235 msgid "Edit Allocation" msgstr "" #: src/tables/sales/SalesOrderAllocationTable.tsx:218 #: src/tables/sales/SalesOrderAllocationTable.tsx:241 -msgid "Delete Allocation" -msgstr "" +#~ msgid "Delete Allocation" +#~ msgstr "Delete Allocation" -#: src/tables/sales/SalesOrderAllocationTable.tsx:252 -#: src/tables/sales/SalesOrderAllocationTable.tsx:253 +#: src/tables/sales/SalesOrderAllocationTable.tsx:261 +#: src/tables/sales/SalesOrderAllocationTable.tsx:262 msgid "View Shipment" msgstr "" -#: src/tables/sales/SalesOrderAllocationTable.tsx:308 +#: src/tables/sales/SalesOrderAllocationTable.tsx:317 msgid "Assign to Shipment" msgstr "" -#: src/tables/sales/SalesOrderAllocationTable.tsx:324 +#: src/tables/sales/SalesOrderAllocationTable.tsx:333 msgid "Assign to shipment" msgstr "" diff --git a/src/frontend/src/locales/bg/messages.po b/src/frontend/src/locales/bg/messages.po index 987efff888..013306849a 100644 --- a/src/frontend/src/locales/bg/messages.po +++ b/src/frontend/src/locales/bg/messages.po @@ -8,7 +8,7 @@ msgstr "" "Language: bg\n" "Project-Id-Version: inventree\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2025-11-19 19:39\n" +"PO-Revision-Date: 2025-11-22 06:25\n" "Last-Translator: \n" "Language-Team: Bulgarian\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" @@ -56,7 +56,7 @@ msgstr "" #: lib/components/RowActions.tsx:136 #: src/components/nav/NavigationDrawer.tsx:190 -#: src/forms/PurchaseOrderForms.tsx:802 +#: src/forms/PurchaseOrderForms.tsx:854 #: src/forms/StockForms.tsx:796 #: src/forms/StockForms.tsx:843 #: src/forms/StockForms.tsx:889 @@ -103,9 +103,9 @@ msgstr "" #: src/forms/BuildForms.tsx:630 #: src/forms/BuildForms.tsx:793 #: src/forms/BuildForms.tsx:896 -#: src/forms/PurchaseOrderForms.tsx:798 +#: src/forms/PurchaseOrderForms.tsx:850 #: src/forms/ReturnOrderForms.tsx:242 -#: src/forms/SalesOrderForms.tsx:305 +#: src/forms/SalesOrderForms.tsx:323 #: src/forms/StockForms.tsx:360 #: src/forms/StockForms.tsx:791 #: src/forms/StockForms.tsx:838 @@ -119,6 +119,7 @@ msgstr "" #: src/pages/build/BuildDetail.tsx:200 #: src/pages/part/PartDetail.tsx:1207 #: src/tables/ColumnRenderers.tsx:91 +#: src/tables/part/PartTestResultTable.tsx:247 #: src/tables/part/RelatedPartTable.tsx:53 #: src/tables/stock/StockTrackingTable.tsx:87 msgid "Part" @@ -158,7 +159,7 @@ msgstr "" #: src/components/wizards/OrderPartsWizard.tsx:290 #: src/pages/company/SupplierPartDetail.tsx:413 #: src/pages/stock/StockDetail.tsx:289 -#: src/tables/build/BuildAllocatedStockTable.tsx:155 +#: src/tables/build/BuildAllocatedStockTable.tsx:152 #: src/tables/part/PartPurchaseOrdersTable.tsx:50 #: src/tables/purchasing/SupplierPartTable.tsx:83 #: src/tables/stock/StockItemTable.tsx:247 @@ -201,9 +202,9 @@ msgstr "" #: src/forms/BuildForms.tsx:473 #: src/forms/BuildForms.tsx:633 #: src/forms/BuildForms.tsx:794 -#: src/forms/SalesOrderForms.tsx:307 +#: src/forms/SalesOrderForms.tsx:325 #: src/pages/stock/StockDetail.tsx:1005 -#: src/tables/part/PartTestResultTable.tsx:248 +#: src/tables/part/PartTestResultTable.tsx:256 #: src/tables/stock/StockTrackingTable.tsx:48 #: src/tables/stock/StockTrackingTable.tsx:55 msgid "Stock Item" @@ -517,7 +518,7 @@ msgstr "" #: src/components/dashboard/DashboardLayout.tsx:281 #: src/components/editors/NotesEditor.tsx:74 #: src/components/editors/TemplateEditor/TemplateEditor.tsx:158 -#: src/components/forms/fields/ApiFormField.tsx:273 +#: src/components/forms/fields/ApiFormField.tsx:237 #: src/components/forms/fields/TableField.tsx:45 #: src/components/importer/ImportDataSelector.tsx:192 #: src/components/importer/ImporterColumnSelector.tsx:234 @@ -642,8 +643,8 @@ msgstr "" #: src/components/barcodes/BarcodeScanDialog.tsx:49 #: src/components/buttons/ScanButton.tsx:15 #: src/components/nav/NavigationDrawer.tsx:122 -#: src/forms/PurchaseOrderForms.tsx:457 -#: src/forms/PurchaseOrderForms.tsx:563 +#: src/forms/PurchaseOrderForms.tsx:509 +#: src/forms/PurchaseOrderForms.tsx:615 msgid "Scan Barcode" msgstr "" @@ -728,7 +729,7 @@ msgstr "" #: src/components/barcodes/QRCode.tsx:205 #: src/components/items/ActionDropdown.tsx:192 -#: src/forms/PurchaseOrderForms.tsx:554 +#: src/forms/PurchaseOrderForms.tsx:606 msgid "Unlink Barcode" msgstr "" @@ -1216,6 +1217,12 @@ msgstr "" #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:884 #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:903 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:254 +#: src/tables/build/BuildAllocatedStockTable.tsx:178 +#: src/tables/build/BuildAllocatedStockTable.tsx:258 +#: src/tables/build/BuildLineTable.tsx:111 +#: src/tables/build/BuildLineTable.tsx:665 +#: src/tables/sales/SalesOrderAllocationTable.tsx:224 +#: src/tables/sales/SalesOrderAllocationTable.tsx:247 msgid "Remove" msgstr "" @@ -1241,7 +1248,7 @@ msgid "Upload Error" msgstr "" #: src/components/details/DetailsImage.tsx:250 -#: src/components/forms/fields/TextField.tsx:65 +#: src/components/forms/fields/AutoFillRightSection.tsx:34 msgid "Clear" msgstr "" @@ -1817,10 +1824,14 @@ msgstr "" msgid "Running" msgstr "" -#: src/components/forms/fields/ApiFormField.tsx:233 +#: src/components/forms/fields/ApiFormField.tsx:197 msgid "Select file to upload" msgstr "" +#: src/components/forms/fields/AutoFillRightSection.tsx:47 +msgid "Accept suggested value" +msgstr "" + #: src/components/forms/fields/DateField.tsx:76 msgid "Select date" msgstr "" @@ -1875,10 +1886,6 @@ msgstr "" msgid "Add new row" msgstr "" -#: src/components/forms/fields/TextField.tsx:82 -msgid "Accept suggested value" -msgstr "" - #: src/components/images/DetailsImage.tsx:252 #~ msgid "Select image" #~ msgstr "Select image" @@ -2225,8 +2232,8 @@ msgstr "" #: src/pages/part/PartDetail.tsx:994 #: src/pages/stock/StockDetail.tsx:265 #: src/pages/stock/StockDetail.tsx:942 -#: src/tables/build/BuildAllocatedStockTable.tsx:135 -#: src/tables/build/BuildLineTable.tsx:192 +#: src/tables/build/BuildAllocatedStockTable.tsx:132 +#: src/tables/build/BuildLineTable.tsx:193 #: src/tables/part/PartTable.tsx:137 #: src/tables/stock/StockItemTable.tsx:182 #: src/tables/stock/StockItemTable.tsx:343 @@ -2784,7 +2791,7 @@ msgstr "" #: src/pages/sales/SalesOrderDetail.tsx:119 #: src/pages/stock/LocationDetail.tsx:102 #: src/tables/ColumnRenderers.tsx:278 -#: src/tables/build/BuildAllocatedStockTable.tsx:91 +#: src/tables/build/BuildAllocatedStockTable.tsx:88 #: src/tables/machine/MachineTypeTable.tsx:161 #: src/tables/machine/MachineTypeTable.tsx:257 #: src/tables/plugin/PluginListTable.tsx:110 @@ -2966,7 +2973,7 @@ msgstr "" #: src/pages/company/SupplierPartDetail.tsx:394 #: src/pages/part/PartDetail.tsx:1015 #: src/tables/bom/BomTable.tsx:444 -#: src/tables/build/BuildLineTable.tsx:222 +#: src/tables/build/BuildLineTable.tsx:223 #: src/tables/part/PartTable.tsx:108 msgid "On Order" msgstr "" @@ -2976,7 +2983,7 @@ msgstr "" #: src/pages/part/PartDetail.tsx:587 #: src/pages/part/PartDetail.tsx:1021 #: src/pages/stock/StockDetail.tsx:925 -#: src/tables/part/PartTestResultTable.tsx:297 +#: src/tables/part/PartTestResultTable.tsx:305 #: src/tables/stock/StockItemTable.tsx:359 msgid "In Production" msgstr "" @@ -3000,7 +3007,7 @@ msgstr "" #: src/components/render/Stock.tsx:114 #: src/components/render/Stock.tsx:132 #: src/forms/BuildForms.tsx:795 -#: src/forms/PurchaseOrderForms.tsx:595 +#: src/forms/PurchaseOrderForms.tsx:647 #: src/forms/StockForms.tsx:792 #: src/forms/StockForms.tsx:839 #: src/forms/StockForms.tsx:885 @@ -3023,7 +3030,7 @@ msgstr "" #: src/components/render/Stock.tsx:99 #: src/pages/stock/StockDetail.tsx:198 #: src/pages/stock/StockDetail.tsx:930 -#: src/tables/build/BuildAllocatedStockTable.tsx:121 +#: src/tables/build/BuildAllocatedStockTable.tsx:118 #: src/tables/build/BuildOutputTable.tsx:107 #: src/tables/sales/SalesOrderAllocationTable.tsx:142 msgid "Serial Number" @@ -3034,9 +3041,9 @@ msgstr "" #: src/forms/BuildForms.tsx:240 #: src/forms/BuildForms.tsx:634 #: src/forms/BuildForms.tsx:797 -#: src/forms/PurchaseOrderForms.tsx:801 +#: src/forms/PurchaseOrderForms.tsx:853 #: src/forms/ReturnOrderForms.tsx:243 -#: src/forms/SalesOrderForms.tsx:308 +#: src/forms/SalesOrderForms.tsx:326 #: src/forms/StockForms.tsx:841 #: src/pages/part/PartStockHistoryDetail.tsx:56 #: src/pages/part/PartStockHistoryDetail.tsx:210 @@ -3046,9 +3053,9 @@ msgstr "" #: src/pages/part/pricing/PriceBreakPanel.tsx:172 #: src/pages/stock/StockDetail.tsx:258 #: src/pages/stock/StockDetail.tsx:936 -#: src/tables/build/BuildLineTable.tsx:86 +#: src/tables/build/BuildLineTable.tsx:83 #: src/tables/part/PartPurchaseOrdersTable.tsx:94 -#: src/tables/part/PartTestResultTable.tsx:269 +#: src/tables/part/PartTestResultTable.tsx:277 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:175 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:206 #: src/tables/purchasing/SupplierPriceBreakTable.tsx:69 @@ -3070,7 +3077,7 @@ msgstr "" #: src/forms/StockForms.tsx:1048 #: src/forms/StockForms.tsx:1096 #: src/forms/StockForms.tsx:1140 -#: src/tables/build/BuildLineTable.tsx:96 +#: src/tables/build/BuildLineTable.tsx:93 msgid "Batch" msgstr "" @@ -3755,7 +3762,7 @@ msgid "In Stock" msgstr "" #: src/components/wizards/OrderPartsWizard.tsx:146 -#: src/tables/build/BuildLineTable.tsx:404 +#: src/tables/build/BuildLineTable.tsx:405 msgid "Required Quantity" msgstr "" @@ -3847,7 +3854,7 @@ msgid "Please correct the errors in the selected parts" msgstr "" #: src/components/wizards/OrderPartsWizard.tsx:587 -#: src/tables/build/BuildLineTable.tsx:815 +#: src/tables/build/BuildLineTable.tsx:822 #: src/tables/part/PartTable.tsx:522 #: src/tables/sales/SalesOrderLineItemTable.tsx:370 msgid "Order Parts" @@ -4349,9 +4356,9 @@ msgstr "" #: src/forms/BuildForms.tsx:333 #: src/forms/BuildForms.tsx:408 #: src/forms/BuildForms.tsx:685 -#: src/tables/build/BuildAllocatedStockTable.tsx:150 +#: src/tables/build/BuildAllocatedStockTable.tsx:147 #: src/tables/build/BuildOutputTable.tsx:582 -#: src/tables/part/PartTestResultTable.tsx:272 +#: src/tables/part/PartTestResultTable.tsx:280 msgid "Build Output" msgstr "" @@ -4362,7 +4369,7 @@ msgstr "" #: src/forms/BuildForms.tsx:336 #: src/forms/BuildForms.tsx:411 #: src/forms/BuildForms.tsx:475 -#: src/forms/PurchaseOrderForms.tsx:717 +#: src/forms/PurchaseOrderForms.tsx:769 #: src/forms/ReturnOrderForms.tsx:197 #: src/forms/ReturnOrderForms.tsx:244 #: src/forms/StockForms.tsx:712 @@ -4377,7 +4384,7 @@ msgstr "" #: src/tables/build/BuildOutputTable.tsx:404 #: src/tables/machine/MachineListTable.tsx:387 #: src/tables/part/PartPurchaseOrdersTable.tsx:38 -#: src/tables/part/PartTestResultTable.tsx:309 +#: src/tables/part/PartTestResultTable.tsx:317 #: src/tables/sales/ReturnOrderLineItemTable.tsx:138 #: src/tables/sales/ReturnOrderLineItemTable.tsx:176 #: src/tables/settings/CustomStateTable.tsx:79 @@ -4450,8 +4457,8 @@ msgstr "" #: src/pages/stock/StockDetail.tsx:153 #: src/tables/bom/BomTable.tsx:134 #: src/tables/bom/UsedInTable.tsx:40 -#: src/tables/build/BuildAllocatedStockTable.tsx:108 -#: src/tables/build/BuildLineTable.tsx:336 +#: src/tables/build/BuildAllocatedStockTable.tsx:105 +#: src/tables/build/BuildLineTable.tsx:337 #: src/tables/build/BuildOrderTable.tsx:79 #: src/tables/part/PartSalesAllocationsTable.tsx:61 #: src/tables/part/RelatedPartTable.tsx:73 @@ -4466,47 +4473,47 @@ msgstr "" #: src/forms/BuildForms.tsx:632 #: src/forms/BuildForms.tsx:796 #: src/forms/BuildForms.tsx:897 -#: src/forms/SalesOrderForms.tsx:306 -#: src/tables/build/BuildAllocatedStockTable.tsx:139 -#: src/tables/build/BuildLineTable.tsx:182 +#: src/forms/SalesOrderForms.tsx:324 +#: src/tables/build/BuildAllocatedStockTable.tsx:136 +#: src/tables/build/BuildLineTable.tsx:183 #: src/tables/sales/SalesOrderLineItemTable.tsx:342 #: src/tables/stock/StockItemTable.tsx:338 msgid "Allocated" msgstr "" #: src/forms/BuildForms.tsx:667 -#: src/forms/SalesOrderForms.tsx:295 +#: src/forms/SalesOrderForms.tsx:313 #: src/pages/build/BuildDetail.tsx:108 #: src/pages/build/BuildDetail.tsx:326 msgid "Source Location" msgstr "" #: src/forms/BuildForms.tsx:668 -#: src/forms/SalesOrderForms.tsx:296 +#: src/forms/SalesOrderForms.tsx:314 msgid "Select the source location for the stock allocation" msgstr "" #: src/forms/BuildForms.tsx:700 -#: src/forms/SalesOrderForms.tsx:336 -#: src/tables/build/BuildLineTable.tsx:574 -#: src/tables/build/BuildLineTable.tsx:731 -#: src/tables/build/BuildLineTable.tsx:830 +#: src/forms/SalesOrderForms.tsx:354 +#: src/tables/build/BuildLineTable.tsx:575 +#: src/tables/build/BuildLineTable.tsx:738 +#: src/tables/build/BuildLineTable.tsx:837 #: src/tables/sales/SalesOrderLineItemTable.tsx:380 #: src/tables/sales/SalesOrderLineItemTable.tsx:406 msgid "Allocate Stock" msgstr "" #: src/forms/BuildForms.tsx:703 -#: src/forms/SalesOrderForms.tsx:341 +#: src/forms/SalesOrderForms.tsx:359 msgid "Stock items allocated" msgstr "" #: src/forms/BuildForms.tsx:816 #: src/forms/BuildForms.tsx:917 -#: src/tables/build/BuildAllocatedStockTable.tsx:240 -#: src/tables/build/BuildAllocatedStockTable.tsx:272 -#: src/tables/build/BuildLineTable.tsx:741 -#: src/tables/build/BuildLineTable.tsx:864 +#: src/tables/build/BuildAllocatedStockTable.tsx:243 +#: src/tables/build/BuildAllocatedStockTable.tsx:279 +#: src/tables/build/BuildLineTable.tsx:748 +#: src/tables/build/BuildLineTable.tsx:871 msgid "Consume Stock" msgstr "" @@ -4521,21 +4528,21 @@ msgstr "" #~ msgstr "Stock items consumed" #: src/forms/BuildForms.tsx:853 -#: src/tables/build/BuildLineTable.tsx:514 +#: src/tables/build/BuildLineTable.tsx:515 #: src/tables/part/PartBuildAllocationsTable.tsx:101 msgid "Fully consumed" msgstr "" #: src/forms/BuildForms.tsx:898 -#: src/tables/build/BuildLineTable.tsx:187 +#: src/tables/build/BuildLineTable.tsx:188 #: src/tables/stock/StockItemTable.tsx:367 msgid "Consumed" msgstr "" #: src/forms/CommonForms.tsx:88 -#: src/forms/PurchaseOrderForms.tsx:125 +#: src/forms/PurchaseOrderForms.tsx:176 #: src/forms/ReturnOrderForms.tsx:138 -#: src/forms/SalesOrderForms.tsx:164 +#: src/forms/SalesOrderForms.tsx:182 msgid "Select project code for this line item" msgstr "" @@ -4572,32 +4579,16 @@ msgstr "" msgid "Subscribe to notifications for this category" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:388 -msgid "Assign Batch Code and Serial Numbers" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:390 -msgid "Assign Batch Code" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:410 -msgid "Choose Location" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:418 -msgid "Item Destination selected" -msgstr "" - #: src/forms/PurchaseOrderForms.tsx:421 #~ msgid "Assign Batch Code{0}" #~ msgstr "Assign Batch Code{0}" -#: src/forms/PurchaseOrderForms.tsx:428 -msgid "Part category default location selected" +#: src/forms/PurchaseOrderForms.tsx:440 +msgid "Assign Batch Code and Serial Numbers" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:438 -msgid "Received stock location selected" +#: src/forms/PurchaseOrderForms.tsx:442 +msgid "Assign Batch Code" msgstr "" #: src/forms/PurchaseOrderForms.tsx:444 @@ -4605,94 +4596,110 @@ msgstr "" #~ msgid "Remove item from list" #~ msgstr "Remove item from list" -#: src/forms/PurchaseOrderForms.tsx:446 +#: src/forms/PurchaseOrderForms.tsx:462 +msgid "Choose Location" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:470 +msgid "Item Destination selected" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:480 +msgid "Part category default location selected" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:490 +msgid "Received stock location selected" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:498 msgid "Default location selected" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:507 +#: src/forms/PurchaseOrderForms.tsx:559 msgid "Set Location" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:524 -msgid "Set Expiry Date" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:532 -#: src/forms/StockForms.tsx:693 -msgid "Adjust Packaging" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:540 -#: src/forms/StockForms.tsx:684 -#: src/hooks/UseStockAdjustActions.tsx:148 -msgid "Change Status" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:546 -msgid "Add Note" -msgstr "" - #: src/forms/PurchaseOrderForms.tsx:566 #~ msgid "Serial numbers" #~ msgstr "Serial numbers" +#: src/forms/PurchaseOrderForms.tsx:576 +msgid "Set Expiry Date" +msgstr "" + #: src/forms/PurchaseOrderForms.tsx:582 #~ msgid "Store at line item destination" #~ msgstr "Store at line item destination" -#: src/forms/PurchaseOrderForms.tsx:610 -msgid "Store at default location" +#: src/forms/PurchaseOrderForms.tsx:584 +#: src/forms/StockForms.tsx:693 +msgid "Adjust Packaging" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:625 -msgid "Store at line item destination " +#: src/forms/PurchaseOrderForms.tsx:592 +#: src/forms/StockForms.tsx:684 +#: src/hooks/UseStockAdjustActions.tsx:148 +msgid "Change Status" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:637 -msgid "Store with already received stock" +#: src/forms/PurchaseOrderForms.tsx:598 +msgid "Add Note" msgstr "" #: src/forms/PurchaseOrderForms.tsx:658 #~ msgid "Receive line items" #~ msgstr "Receive line items" -#: src/forms/PurchaseOrderForms.tsx:661 +#: src/forms/PurchaseOrderForms.tsx:662 +msgid "Store at default location" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:677 +msgid "Store at line item destination " +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:689 +msgid "Store with already received stock" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:713 #: src/pages/build/BuildDetail.tsx:340 #: src/pages/stock/StockDetail.tsx:280 #: src/pages/stock/StockDetail.tsx:952 #: src/tables/Filter.tsx:83 -#: src/tables/build/BuildAllocatedStockTable.tsx:128 +#: src/tables/build/BuildAllocatedStockTable.tsx:125 #: src/tables/build/BuildOutputTable.tsx:112 -#: src/tables/part/PartTestResultTable.tsx:260 -#: src/tables/part/PartTestResultTable.tsx:281 +#: src/tables/part/PartTestResultTable.tsx:268 +#: src/tables/part/PartTestResultTable.tsx:289 #: src/tables/sales/SalesOrderAllocationTable.tsx:149 msgid "Batch Code" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:662 +#: src/forms/PurchaseOrderForms.tsx:714 msgid "Enter batch code for received items" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:675 +#: src/forms/PurchaseOrderForms.tsx:727 #: src/forms/StockForms.tsx:218 msgid "Serial Numbers" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:676 +#: src/forms/PurchaseOrderForms.tsx:728 msgid "Enter serial numbers for received items" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:690 +#: src/forms/PurchaseOrderForms.tsx:742 #: src/pages/stock/StockDetail.tsx:382 #: src/tables/stock/StockItemTable.tsx:294 msgid "Expiry Date" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:691 +#: src/forms/PurchaseOrderForms.tsx:743 msgid "Enter an expiry date for received items" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:703 +#: src/forms/PurchaseOrderForms.tsx:755 #: src/forms/StockForms.tsx:728 #: src/pages/company/SupplierPartDetail.tsx:172 #: src/pages/company/SupplierPartDetail.tsx:236 @@ -4701,19 +4708,19 @@ msgstr "" msgid "Packaging" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:727 +#: src/forms/PurchaseOrderForms.tsx:779 #: src/pages/company/SupplierPartDetail.tsx:120 #: src/tables/ColumnRenderers.tsx:332 msgid "Note" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:799 +#: src/forms/PurchaseOrderForms.tsx:851 #: src/pages/company/SupplierPartDetail.tsx:138 #: src/tables/purchasing/SupplierPriceBreakTable.tsx:49 msgid "SKU" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:800 +#: src/forms/PurchaseOrderForms.tsx:852 #: src/tables/part/PartPurchaseOrdersTable.tsx:127 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:213 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:283 @@ -4721,11 +4728,11 @@ msgstr "" msgid "Received" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:817 +#: src/forms/PurchaseOrderForms.tsx:869 msgid "Receive Line Items" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:823 +#: src/forms/PurchaseOrderForms.tsx:875 msgid "Items received" msgstr "" @@ -4737,7 +4744,7 @@ msgstr "" msgid "Item received into stock" msgstr "" -#: src/forms/SalesOrderForms.tsx:401 +#: src/forms/SalesOrderForms.tsx:419 msgid "Leave blank to use the order address" msgstr "" @@ -5932,6 +5939,9 @@ msgstr "" #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:310 #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:401 +#: src/tables/build/BuildAllocatedStockTable.tsx:181 +#: src/tables/build/BuildLineTable.tsx:668 +#: src/tables/sales/SalesOrderAllocationTable.tsx:220 msgid "Confirm Removal" msgstr "" @@ -6870,8 +6880,8 @@ msgstr "" #: src/pages/sales/ReturnOrderDetail.tsx:108 #: src/pages/sales/SalesOrderDetail.tsx:98 #: src/tables/ColumnRenderers.tsx:321 -#: src/tables/build/BuildAllocatedStockTable.tsx:115 -#: src/tables/build/BuildLineTable.tsx:352 +#: src/tables/build/BuildAllocatedStockTable.tsx:112 +#: src/tables/build/BuildLineTable.tsx:353 msgid "Reference" msgstr "" @@ -7132,7 +7142,7 @@ msgstr "" #: src/pages/build/BuildDetail.tsx:742 #: src/pages/stock/StockDetail.tsx:344 -#: src/tables/build/BuildAllocatedStockTable.tsx:85 +#: src/tables/build/BuildAllocatedStockTable.tsx:82 #: src/tables/part/PartBuildAllocationsTable.tsx:45 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:157 #: src/tables/stock/StockTrackingTable.tsx:109 @@ -7600,7 +7610,7 @@ msgstr "" #: src/pages/part/PartDetail.tsx:542 #: src/tables/bom/BomTable.tsx:439 -#: src/tables/build/BuildLineTable.tsx:305 +#: src/tables/build/BuildLineTable.tsx:306 #: src/tables/part/PartTable.tsx:319 #: src/tables/sales/SalesOrderLineItemTable.tsx:138 msgid "Available Stock" @@ -7608,7 +7618,7 @@ msgstr "" #: src/pages/part/PartDetail.tsx:548 #: src/tables/bom/BomTable.tsx:341 -#: src/tables/build/BuildLineTable.tsx:267 +#: src/tables/build/BuildLineTable.tsx:268 #: src/tables/sales/SalesOrderLineItemTable.tsx:180 msgid "On order" msgstr "" @@ -7782,7 +7792,7 @@ msgstr "" #: src/pages/part/PartDetail.tsx:1144 #: src/pages/stock/StockDetail.tsx:884 -#: src/tables/build/BuildLineTable.tsx:761 +#: src/tables/build/BuildLineTable.tsx:768 msgid "Order Stock" msgstr "" @@ -9219,13 +9229,13 @@ msgstr "" #~ msgstr "Show asssmbled items" #: src/tables/bom/BomTable.tsx:315 -#: src/tables/build/BuildLineTable.tsx:276 +#: src/tables/build/BuildLineTable.tsx:277 #: src/tables/part/PartTable.tsx:145 msgid "External stock" msgstr "" #: src/tables/bom/BomTable.tsx:323 -#: src/tables/build/BuildLineTable.tsx:239 +#: src/tables/build/BuildLineTable.tsx:240 msgid "Includes substitute stock" msgstr "" @@ -9234,7 +9244,7 @@ msgstr "" #~ msgstr "Edit Bom Item" #: src/tables/bom/BomTable.tsx:332 -#: src/tables/build/BuildLineTable.tsx:249 +#: src/tables/build/BuildLineTable.tsx:250 #: src/tables/sales/SalesOrderLineItemTable.tsx:166 msgid "Includes variant stock" msgstr "" @@ -9272,8 +9282,8 @@ msgid "Stock Information" msgstr "" #: src/tables/bom/BomTable.tsx:399 -#: src/tables/build/BuildLineTable.tsx:496 -#: src/tables/build/BuildLineTable.tsx:537 +#: src/tables/build/BuildLineTable.tsx:497 +#: src/tables/build/BuildLineTable.tsx:538 msgid "Consumable item" msgstr "" @@ -9282,7 +9292,7 @@ msgid "No available stock" msgstr "" #: src/tables/bom/BomTable.tsx:420 -#: src/tables/build/BuildLineTable.tsx:213 +#: src/tables/build/BuildLineTable.tsx:214 msgid "Show testable items" msgstr "" @@ -9291,7 +9301,7 @@ msgid "Show trackable items" msgstr "" #: src/tables/bom/BomTable.tsx:430 -#: src/tables/build/BuildLineTable.tsx:208 +#: src/tables/build/BuildLineTable.tsx:209 msgid "Show assembled items" msgstr "" @@ -9335,7 +9345,7 @@ msgstr "" #: src/tables/bom/BomTable.tsx:464 #: src/tables/bom/UsedInTable.tsx:85 -#: src/tables/build/BuildLineTable.tsx:202 +#: src/tables/build/BuildLineTable.tsx:203 msgid "Optional" msgstr "" @@ -9345,7 +9355,7 @@ msgid "Show optional items" msgstr "" #: src/tables/bom/BomTable.tsx:469 -#: src/tables/build/BuildLineTable.tsx:197 +#: src/tables/build/BuildLineTable.tsx:198 msgid "Consumable" msgstr "" @@ -9433,7 +9443,7 @@ msgid "Bill of materials cannot be edited, as the part is locked" msgstr "" #: src/tables/bom/UsedInTable.tsx:34 -#: src/tables/build/BuildLineTable.tsx:207 +#: src/tables/build/BuildLineTable.tsx:208 #: src/tables/part/ParametricPartTable.tsx:364 #: src/tables/part/PartBuildAllocationsTable.tsx:60 #: src/tables/part/PartTable.tsx:209 @@ -9455,11 +9465,11 @@ msgstr "" msgid "Show trackable assemblies" msgstr "" -#: src/tables/build/BuildAllocatedStockTable.tsx:67 +#: src/tables/build/BuildAllocatedStockTable.tsx:64 msgid "Allocated to Output" msgstr "" -#: src/tables/build/BuildAllocatedStockTable.tsx:68 +#: src/tables/build/BuildAllocatedStockTable.tsx:65 msgid "Show items allocated to a build output" msgstr "" @@ -9472,7 +9482,7 @@ msgstr "" #~ msgid "Include orders for part variants" #~ msgstr "Include orders for part variants" -#: src/tables/build/BuildAllocatedStockTable.tsx:97 +#: src/tables/build/BuildAllocatedStockTable.tsx:94 #: src/tables/part/PartBuildAllocationsTable.tsx:84 #: src/tables/part/PartPurchaseOrdersTable.tsx:132 #: src/tables/part/PartSalesAllocationsTable.tsx:69 @@ -9482,40 +9492,58 @@ msgid "Order Status" msgstr "" #: src/tables/build/BuildAllocatedStockTable.tsx:164 -#~ msgid "Edit Build Item" -#~ msgstr "Edit Build Item" - -#: src/tables/build/BuildAllocatedStockTable.tsx:167 -#: src/tables/build/BuildLineTable.tsx:650 +#: src/tables/build/BuildLineTable.tsx:651 msgid "Edit Stock Allocation" msgstr "" +#: src/tables/build/BuildAllocatedStockTable.tsx:164 +#~ msgid "Edit Build Item" +#~ msgstr "Edit Build Item" + #: src/tables/build/BuildAllocatedStockTable.tsx:174 #~ msgid "Delete Build Item" #~ msgstr "Delete Build Item" -#: src/tables/build/BuildAllocatedStockTable.tsx:180 -#: src/tables/build/BuildLineTable.tsx:663 -msgid "Delete Stock Allocation" +#: src/tables/build/BuildAllocatedStockTable.tsx:177 +#: src/tables/build/BuildLineTable.tsx:664 +#: src/tables/sales/SalesOrderAllocationTable.tsx:218 +msgid "Remove Allocated Stock" msgstr "" -#: src/tables/build/BuildAllocatedStockTable.tsx:239 +#: src/tables/build/BuildAllocatedStockTable.tsx:180 +#: src/tables/build/BuildLineTable.tsx:663 +#~ msgid "Delete Stock Allocation" +#~ msgstr "Delete Stock Allocation" + +#: src/tables/build/BuildAllocatedStockTable.tsx:182 +#: src/tables/build/BuildLineTable.tsx:669 +#: src/tables/sales/SalesOrderAllocationTable.tsx:221 +msgid "Are you sure you want to remove this allocated stock from the order?" +msgstr "" + +#: src/tables/build/BuildAllocatedStockTable.tsx:242 msgid "Consume" msgstr "" +#: src/tables/build/BuildAllocatedStockTable.tsx:259 +#: src/tables/build/BuildLineTable.tsx:112 +#: src/tables/sales/SalesOrderAllocationTable.tsx:248 +msgid "Remove allocated stock" +msgstr "" + #: src/tables/build/BuildLineTable.tsx:59 #~ msgid "Show lines with available stock" #~ msgstr "Show lines with available stock" -#: src/tables/build/BuildLineTable.tsx:120 +#: src/tables/build/BuildLineTable.tsx:121 msgid "View Stock Item" msgstr "" -#: src/tables/build/BuildLineTable.tsx:183 +#: src/tables/build/BuildLineTable.tsx:184 msgid "Show fully allocated lines" msgstr "" -#: src/tables/build/BuildLineTable.tsx:188 +#: src/tables/build/BuildLineTable.tsx:189 msgid "Show fully consumed lines" msgstr "" @@ -9523,124 +9551,124 @@ msgstr "" #~ msgid "Show allocated lines" #~ msgstr "Show allocated lines" -#: src/tables/build/BuildLineTable.tsx:193 +#: src/tables/build/BuildLineTable.tsx:194 msgid "Show items with sufficient available stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:198 +#: src/tables/build/BuildLineTable.tsx:199 msgid "Show consumable lines" msgstr "" -#: src/tables/build/BuildLineTable.tsx:203 +#: src/tables/build/BuildLineTable.tsx:204 msgid "Show optional lines" msgstr "" -#: src/tables/build/BuildLineTable.tsx:212 +#: src/tables/build/BuildLineTable.tsx:213 #: src/tables/part/PartTable.tsx:233 msgid "Testable" msgstr "" -#: src/tables/build/BuildLineTable.tsx:217 +#: src/tables/build/BuildLineTable.tsx:218 #: src/tables/stock/StockItemTable.tsx:388 msgid "Tracked" msgstr "" -#: src/tables/build/BuildLineTable.tsx:218 +#: src/tables/build/BuildLineTable.tsx:219 msgid "Show tracked lines" msgstr "" -#: src/tables/build/BuildLineTable.tsx:223 +#: src/tables/build/BuildLineTable.tsx:224 msgid "Show items with stock on order" msgstr "" -#: src/tables/build/BuildLineTable.tsx:258 +#: src/tables/build/BuildLineTable.tsx:259 #: src/tables/sales/SalesOrderLineItemTable.tsx:172 msgid "In production" msgstr "" -#: src/tables/build/BuildLineTable.tsx:286 +#: src/tables/build/BuildLineTable.tsx:287 msgid "Insufficient stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:302 +#: src/tables/build/BuildLineTable.tsx:303 #: src/tables/sales/SalesOrderLineItemTable.tsx:160 #: src/tables/stock/StockItemTable.tsx:191 msgid "No stock available" msgstr "" -#: src/tables/build/BuildLineTable.tsx:375 +#: src/tables/build/BuildLineTable.tsx:376 msgid "Gets Inherited" msgstr "" -#: src/tables/build/BuildLineTable.tsx:388 +#: src/tables/build/BuildLineTable.tsx:389 msgid "Unit Quantity" msgstr "" -#: src/tables/build/BuildLineTable.tsx:415 +#: src/tables/build/BuildLineTable.tsx:416 msgid "Setup Quantity" msgstr "" -#: src/tables/build/BuildLineTable.tsx:424 +#: src/tables/build/BuildLineTable.tsx:425 msgid "Attrition" msgstr "" -#: src/tables/build/BuildLineTable.tsx:432 +#: src/tables/build/BuildLineTable.tsx:433 msgid "Rounding Multiple" msgstr "" -#: src/tables/build/BuildLineTable.tsx:441 +#: src/tables/build/BuildLineTable.tsx:442 msgid "BOM Information" msgstr "" -#: src/tables/build/BuildLineTable.tsx:515 +#: src/tables/build/BuildLineTable.tsx:516 #: src/tables/part/PartBuildAllocationsTable.tsx:102 msgid "Fully allocated" msgstr "" -#: src/tables/build/BuildLineTable.tsx:563 +#: src/tables/build/BuildLineTable.tsx:564 #: src/tables/sales/SalesOrderLineItemTable.tsx:311 msgid "Create Build Order" msgstr "" -#: src/tables/build/BuildLineTable.tsx:592 +#: src/tables/build/BuildLineTable.tsx:593 msgid "Auto allocation in progress" msgstr "" -#: src/tables/build/BuildLineTable.tsx:595 -#: src/tables/build/BuildLineTable.tsx:802 +#: src/tables/build/BuildLineTable.tsx:596 +#: src/tables/build/BuildLineTable.tsx:809 msgid "Auto Allocate Stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:596 +#: src/tables/build/BuildLineTable.tsx:597 msgid "Automatically allocate stock to this build according to the selected options" msgstr "" -#: src/tables/build/BuildLineTable.tsx:616 -#: src/tables/build/BuildLineTable.tsx:630 -#: src/tables/build/BuildLineTable.tsx:751 -#: src/tables/build/BuildLineTable.tsx:852 +#: src/tables/build/BuildLineTable.tsx:617 +#: src/tables/build/BuildLineTable.tsx:631 +#: src/tables/build/BuildLineTable.tsx:758 +#: src/tables/build/BuildLineTable.tsx:859 #: src/tables/build/BuildOutputTable.tsx:355 #: src/tables/build/BuildOutputTable.tsx:360 msgid "Deallocate Stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:632 +#: src/tables/build/BuildLineTable.tsx:633 msgid "Deallocate all untracked stock for this build order" msgstr "" -#: src/tables/build/BuildLineTable.tsx:634 +#: src/tables/build/BuildLineTable.tsx:635 msgid "Deallocate stock from the selected line item" msgstr "" -#: src/tables/build/BuildLineTable.tsx:638 +#: src/tables/build/BuildLineTable.tsx:639 msgid "Stock has been deallocated" msgstr "" -#: src/tables/build/BuildLineTable.tsx:771 +#: src/tables/build/BuildLineTable.tsx:778 msgid "Build Stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:784 +#: src/tables/build/BuildLineTable.tsx:791 #: src/tables/sales/SalesOrderLineItemTable.tsx:487 msgid "View Part" msgstr "" @@ -9739,7 +9767,7 @@ msgid "Serialize Build Output" msgstr "" #: src/tables/build/BuildOutputTable.tsx:405 -#: src/tables/part/PartTestResultTable.tsx:310 +#: src/tables/part/PartTestResultTable.tsx:318 #: src/tables/stock/StockItemTable.tsx:328 msgid "Filter by stock status" msgstr "" @@ -9964,8 +9992,8 @@ msgid "View Item" msgstr "" #: src/tables/general/ExtraLineItemTable.tsx:95 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:299 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:403 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:300 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:405 #: src/tables/sales/ReturnOrderLineItemTable.tsx:83 #: src/tables/sales/ReturnOrderLineItemTable.tsx:187 #: src/tables/sales/SalesOrderLineItemTable.tsx:252 @@ -9974,14 +10002,14 @@ msgid "Add Line Item" msgstr "" #: src/tables/general/ExtraLineItemTable.tsx:108 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:320 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:322 #: src/tables/sales/ReturnOrderLineItemTable.tsx:96 #: src/tables/sales/SalesOrderLineItemTable.tsx:271 msgid "Edit Line Item" msgstr "" #: src/tables/general/ExtraLineItemTable.tsx:117 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:329 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:331 #: src/tables/sales/ReturnOrderLineItemTable.tsx:105 #: src/tables/sales/SalesOrderLineItemTable.tsx:280 msgid "Delete Line Item" @@ -10273,7 +10301,7 @@ msgid "Required Stock" msgstr "" #: src/tables/part/PartBuildAllocationsTable.tsx:124 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:381 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:383 msgid "View Build Order" msgstr "" @@ -10617,8 +10645,8 @@ msgstr "" #: src/tables/part/PartTestResultTable.tsx:103 #: src/tables/part/PartTestResultTable.tsx:181 -#: src/tables/part/PartTestResultTable.tsx:320 -#: src/tables/part/PartTestResultTable.tsx:334 +#: src/tables/part/PartTestResultTable.tsx:328 +#: src/tables/part/PartTestResultTable.tsx:342 #: src/tables/stock/StockItemTestResultTable.tsx:296 #: src/tables/stock/StockItemTestResultTable.tsx:368 #: src/tables/stock/StockItemTestResultTable.tsx:429 @@ -10643,7 +10671,7 @@ msgstr "" msgid "No Result" msgstr "" -#: src/tables/part/PartTestResultTable.tsx:298 +#: src/tables/part/PartTestResultTable.tsx:306 msgid "Show build outputs currently in production" msgstr "" @@ -11073,7 +11101,7 @@ msgid "Show manufacturer parts for active manufacturers." msgstr "" #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:115 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:397 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:399 msgid "Import Line Items" msgstr "" @@ -11099,11 +11127,11 @@ msgstr "" #~ msgid "Add line item" #~ msgstr "Add line item" -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:350 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:352 msgid "Receive line item" msgstr "" -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:414 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:416 msgid "Receive items" msgstr "" @@ -11201,25 +11229,25 @@ msgid "Not shipped" msgstr "" #: src/tables/sales/SalesOrderAllocationTable.tsx:211 -#: src/tables/sales/SalesOrderAllocationTable.tsx:229 +#: src/tables/sales/SalesOrderAllocationTable.tsx:235 msgid "Edit Allocation" msgstr "" #: src/tables/sales/SalesOrderAllocationTable.tsx:218 #: src/tables/sales/SalesOrderAllocationTable.tsx:241 -msgid "Delete Allocation" -msgstr "" +#~ msgid "Delete Allocation" +#~ msgstr "Delete Allocation" -#: src/tables/sales/SalesOrderAllocationTable.tsx:252 -#: src/tables/sales/SalesOrderAllocationTable.tsx:253 +#: src/tables/sales/SalesOrderAllocationTable.tsx:261 +#: src/tables/sales/SalesOrderAllocationTable.tsx:262 msgid "View Shipment" msgstr "" -#: src/tables/sales/SalesOrderAllocationTable.tsx:308 +#: src/tables/sales/SalesOrderAllocationTable.tsx:317 msgid "Assign to Shipment" msgstr "" -#: src/tables/sales/SalesOrderAllocationTable.tsx:324 +#: src/tables/sales/SalesOrderAllocationTable.tsx:333 msgid "Assign to shipment" msgstr "" diff --git a/src/frontend/src/locales/cs/messages.po b/src/frontend/src/locales/cs/messages.po index 9d45f83268..25821787c4 100644 --- a/src/frontend/src/locales/cs/messages.po +++ b/src/frontend/src/locales/cs/messages.po @@ -8,7 +8,7 @@ msgstr "" "Language: cs\n" "Project-Id-Version: inventree\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2025-11-19 19:39\n" +"PO-Revision-Date: 2025-11-25 11:06\n" "Last-Translator: \n" "Language-Team: Czech\n" "Plural-Forms: nplurals=4; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 3;\n" @@ -56,7 +56,7 @@ msgstr "Zrušit" #: lib/components/RowActions.tsx:136 #: src/components/nav/NavigationDrawer.tsx:190 -#: src/forms/PurchaseOrderForms.tsx:802 +#: src/forms/PurchaseOrderForms.tsx:854 #: src/forms/StockForms.tsx:796 #: src/forms/StockForms.tsx:843 #: src/forms/StockForms.tsx:889 @@ -103,9 +103,9 @@ msgstr "Ne" #: src/forms/BuildForms.tsx:630 #: src/forms/BuildForms.tsx:793 #: src/forms/BuildForms.tsx:896 -#: src/forms/PurchaseOrderForms.tsx:798 +#: src/forms/PurchaseOrderForms.tsx:850 #: src/forms/ReturnOrderForms.tsx:242 -#: src/forms/SalesOrderForms.tsx:305 +#: src/forms/SalesOrderForms.tsx:323 #: src/forms/StockForms.tsx:360 #: src/forms/StockForms.tsx:791 #: src/forms/StockForms.tsx:838 @@ -119,6 +119,7 @@ msgstr "Ne" #: src/pages/build/BuildDetail.tsx:200 #: src/pages/part/PartDetail.tsx:1207 #: src/tables/ColumnRenderers.tsx:91 +#: src/tables/part/PartTestResultTable.tsx:247 #: src/tables/part/RelatedPartTable.tsx:53 #: src/tables/stock/StockTrackingTable.tsx:87 msgid "Part" @@ -158,7 +159,7 @@ msgstr "Šablony testu položky" #: src/components/wizards/OrderPartsWizard.tsx:290 #: src/pages/company/SupplierPartDetail.tsx:413 #: src/pages/stock/StockDetail.tsx:289 -#: src/tables/build/BuildAllocatedStockTable.tsx:155 +#: src/tables/build/BuildAllocatedStockTable.tsx:152 #: src/tables/part/PartPurchaseOrdersTable.tsx:50 #: src/tables/purchasing/SupplierPartTable.tsx:83 #: src/tables/stock/StockItemTable.tsx:247 @@ -201,9 +202,9 @@ msgstr "Kategorie dílů" #: src/forms/BuildForms.tsx:473 #: src/forms/BuildForms.tsx:633 #: src/forms/BuildForms.tsx:794 -#: src/forms/SalesOrderForms.tsx:307 +#: src/forms/SalesOrderForms.tsx:325 #: src/pages/stock/StockDetail.tsx:1005 -#: src/tables/part/PartTestResultTable.tsx:248 +#: src/tables/part/PartTestResultTable.tsx:256 #: src/tables/stock/StockTrackingTable.tsx:48 #: src/tables/stock/StockTrackingTable.tsx:55 msgid "Stock Item" @@ -517,7 +518,7 @@ msgstr "Výběrová pole" #: src/components/dashboard/DashboardLayout.tsx:281 #: src/components/editors/NotesEditor.tsx:74 #: src/components/editors/TemplateEditor/TemplateEditor.tsx:158 -#: src/components/forms/fields/ApiFormField.tsx:273 +#: src/components/forms/fields/ApiFormField.tsx:237 #: src/components/forms/fields/TableField.tsx:45 #: src/components/importer/ImportDataSelector.tsx:192 #: src/components/importer/ImporterColumnSelector.tsx:234 @@ -642,8 +643,8 @@ msgstr "Zadat data čárového kódu" #: src/components/barcodes/BarcodeScanDialog.tsx:49 #: src/components/buttons/ScanButton.tsx:15 #: src/components/nav/NavigationDrawer.tsx:122 -#: src/forms/PurchaseOrderForms.tsx:457 -#: src/forms/PurchaseOrderForms.tsx:563 +#: src/forms/PurchaseOrderForms.tsx:509 +#: src/forms/PurchaseOrderForms.tsx:615 msgid "Scan Barcode" msgstr "Skenovat čárový kód" @@ -728,7 +729,7 @@ msgstr "Tímto odstraníte odkaz na přidružený čárový kód" #: src/components/barcodes/QRCode.tsx:205 #: src/components/items/ActionDropdown.tsx:192 -#: src/forms/PurchaseOrderForms.tsx:554 +#: src/forms/PurchaseOrderForms.tsx:606 msgid "Unlink Barcode" msgstr "Odstranit čárový kód" @@ -1216,6 +1217,12 @@ msgstr "Odstranit přidružený obrázek z této položky?" #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:884 #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:903 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:254 +#: src/tables/build/BuildAllocatedStockTable.tsx:178 +#: src/tables/build/BuildAllocatedStockTable.tsx:258 +#: src/tables/build/BuildLineTable.tsx:111 +#: src/tables/build/BuildLineTable.tsx:665 +#: src/tables/sales/SalesOrderAllocationTable.tsx:224 +#: src/tables/sales/SalesOrderAllocationTable.tsx:247 msgid "Remove" msgstr "Odstranit" @@ -1241,7 +1248,7 @@ msgid "Upload Error" msgstr "Chyba nahrávání" #: src/components/details/DetailsImage.tsx:250 -#: src/components/forms/fields/TextField.tsx:65 +#: src/components/forms/fields/AutoFillRightSection.tsx:34 msgid "Clear" msgstr "Vymazat" @@ -1817,10 +1824,14 @@ msgstr "Zastaveno" msgid "Running" msgstr "Spuštěno" -#: src/components/forms/fields/ApiFormField.tsx:233 +#: src/components/forms/fields/ApiFormField.tsx:197 msgid "Select file to upload" msgstr "Vyberte soubor k nahrání" +#: src/components/forms/fields/AutoFillRightSection.tsx:47 +msgid "Accept suggested value" +msgstr "Přijmout doporučenou hodnotu" + #: src/components/forms/fields/DateField.tsx:76 msgid "Select date" msgstr "Vyberte datum" @@ -1875,10 +1886,6 @@ msgstr "Nejsou žádné záznamy" msgid "Add new row" msgstr "Přidat nový řádek" -#: src/components/forms/fields/TextField.tsx:82 -msgid "Accept suggested value" -msgstr "Přijmout doporučenou hodnotu" - #: src/components/images/DetailsImage.tsx:252 #~ msgid "Select image" #~ msgstr "Select image" @@ -2225,8 +2232,8 @@ msgstr "Žádné položky" #: src/pages/part/PartDetail.tsx:994 #: src/pages/stock/StockDetail.tsx:265 #: src/pages/stock/StockDetail.tsx:942 -#: src/tables/build/BuildAllocatedStockTable.tsx:135 -#: src/tables/build/BuildLineTable.tsx:192 +#: src/tables/build/BuildAllocatedStockTable.tsx:132 +#: src/tables/build/BuildLineTable.tsx:193 #: src/tables/part/PartTable.tsx:137 #: src/tables/stock/StockItemTable.tsx:182 #: src/tables/stock/StockItemTable.tsx:343 @@ -2784,7 +2791,7 @@ msgstr "Informace o pluginu" #: src/pages/sales/SalesOrderDetail.tsx:119 #: src/pages/stock/LocationDetail.tsx:102 #: src/tables/ColumnRenderers.tsx:278 -#: src/tables/build/BuildAllocatedStockTable.tsx:91 +#: src/tables/build/BuildAllocatedStockTable.tsx:88 #: src/tables/machine/MachineTypeTable.tsx:161 #: src/tables/machine/MachineTypeTable.tsx:257 #: src/tables/plugin/PluginListTable.tsx:110 @@ -2966,7 +2973,7 @@ msgstr "Není skladem" #: src/pages/company/SupplierPartDetail.tsx:394 #: src/pages/part/PartDetail.tsx:1015 #: src/tables/bom/BomTable.tsx:444 -#: src/tables/build/BuildLineTable.tsx:222 +#: src/tables/build/BuildLineTable.tsx:223 #: src/tables/part/PartTable.tsx:108 msgid "On Order" msgstr "V objednávce" @@ -2976,7 +2983,7 @@ msgstr "V objednávce" #: src/pages/part/PartDetail.tsx:587 #: src/pages/part/PartDetail.tsx:1021 #: src/pages/stock/StockDetail.tsx:925 -#: src/tables/part/PartTestResultTable.tsx:297 +#: src/tables/part/PartTestResultTable.tsx:305 #: src/tables/stock/StockItemTable.tsx:359 msgid "In Production" msgstr "Ve výrobě" @@ -3000,7 +3007,7 @@ msgstr "Kategorie" #: src/components/render/Stock.tsx:114 #: src/components/render/Stock.tsx:132 #: src/forms/BuildForms.tsx:795 -#: src/forms/PurchaseOrderForms.tsx:595 +#: src/forms/PurchaseOrderForms.tsx:647 #: src/forms/StockForms.tsx:792 #: src/forms/StockForms.tsx:839 #: src/forms/StockForms.tsx:885 @@ -3023,7 +3030,7 @@ msgstr "Lokace" #: src/components/render/Stock.tsx:99 #: src/pages/stock/StockDetail.tsx:198 #: src/pages/stock/StockDetail.tsx:930 -#: src/tables/build/BuildAllocatedStockTable.tsx:121 +#: src/tables/build/BuildAllocatedStockTable.tsx:118 #: src/tables/build/BuildOutputTable.tsx:107 #: src/tables/sales/SalesOrderAllocationTable.tsx:142 msgid "Serial Number" @@ -3034,9 +3041,9 @@ msgstr "Sériové číslo" #: src/forms/BuildForms.tsx:240 #: src/forms/BuildForms.tsx:634 #: src/forms/BuildForms.tsx:797 -#: src/forms/PurchaseOrderForms.tsx:801 +#: src/forms/PurchaseOrderForms.tsx:853 #: src/forms/ReturnOrderForms.tsx:243 -#: src/forms/SalesOrderForms.tsx:308 +#: src/forms/SalesOrderForms.tsx:326 #: src/forms/StockForms.tsx:841 #: src/pages/part/PartStockHistoryDetail.tsx:56 #: src/pages/part/PartStockHistoryDetail.tsx:210 @@ -3046,9 +3053,9 @@ msgstr "Sériové číslo" #: src/pages/part/pricing/PriceBreakPanel.tsx:172 #: src/pages/stock/StockDetail.tsx:258 #: src/pages/stock/StockDetail.tsx:936 -#: src/tables/build/BuildLineTable.tsx:86 +#: src/tables/build/BuildLineTable.tsx:83 #: src/tables/part/PartPurchaseOrdersTable.tsx:94 -#: src/tables/part/PartTestResultTable.tsx:269 +#: src/tables/part/PartTestResultTable.tsx:277 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:175 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:206 #: src/tables/purchasing/SupplierPriceBreakTable.tsx:69 @@ -3070,7 +3077,7 @@ msgstr "Množství" #: src/forms/StockForms.tsx:1048 #: src/forms/StockForms.tsx:1096 #: src/forms/StockForms.tsx:1140 -#: src/tables/build/BuildLineTable.tsx:96 +#: src/tables/build/BuildLineTable.tsx:93 msgid "Batch" msgstr "Dávka" @@ -3755,7 +3762,7 @@ msgid "In Stock" msgstr "Na skladě" #: src/components/wizards/OrderPartsWizard.tsx:146 -#: src/tables/build/BuildLineTable.tsx:404 +#: src/tables/build/BuildLineTable.tsx:405 msgid "Required Quantity" msgstr "Požadované množství" @@ -3847,7 +3854,7 @@ msgid "Please correct the errors in the selected parts" msgstr "Opravte chyby ve vybraných položkách" #: src/components/wizards/OrderPartsWizard.tsx:587 -#: src/tables/build/BuildLineTable.tsx:815 +#: src/tables/build/BuildLineTable.tsx:822 #: src/tables/part/PartTable.tsx:522 #: src/tables/sales/SalesOrderLineItemTable.tsx:370 msgid "Order Parts" @@ -4349,9 +4356,9 @@ msgstr "Náhrada přidána" #: src/forms/BuildForms.tsx:333 #: src/forms/BuildForms.tsx:408 #: src/forms/BuildForms.tsx:685 -#: src/tables/build/BuildAllocatedStockTable.tsx:150 +#: src/tables/build/BuildAllocatedStockTable.tsx:147 #: src/tables/build/BuildOutputTable.tsx:582 -#: src/tables/part/PartTestResultTable.tsx:272 +#: src/tables/part/PartTestResultTable.tsx:280 msgid "Build Output" msgstr "Výstup sestavy" @@ -4362,7 +4369,7 @@ msgstr "Množství k dokončení" #: src/forms/BuildForms.tsx:336 #: src/forms/BuildForms.tsx:411 #: src/forms/BuildForms.tsx:475 -#: src/forms/PurchaseOrderForms.tsx:717 +#: src/forms/PurchaseOrderForms.tsx:769 #: src/forms/ReturnOrderForms.tsx:197 #: src/forms/ReturnOrderForms.tsx:244 #: src/forms/StockForms.tsx:712 @@ -4377,7 +4384,7 @@ msgstr "Množství k dokončení" #: src/tables/build/BuildOutputTable.tsx:404 #: src/tables/machine/MachineListTable.tsx:387 #: src/tables/part/PartPurchaseOrdersTable.tsx:38 -#: src/tables/part/PartTestResultTable.tsx:309 +#: src/tables/part/PartTestResultTable.tsx:317 #: src/tables/sales/ReturnOrderLineItemTable.tsx:138 #: src/tables/sales/ReturnOrderLineItemTable.tsx:176 #: src/tables/settings/CustomStateTable.tsx:79 @@ -4450,8 +4457,8 @@ msgstr "Výrobní příkaz byl zrušen" #: src/pages/stock/StockDetail.tsx:153 #: src/tables/bom/BomTable.tsx:134 #: src/tables/bom/UsedInTable.tsx:40 -#: src/tables/build/BuildAllocatedStockTable.tsx:108 -#: src/tables/build/BuildLineTable.tsx:336 +#: src/tables/build/BuildAllocatedStockTable.tsx:105 +#: src/tables/build/BuildLineTable.tsx:337 #: src/tables/build/BuildOrderTable.tsx:79 #: src/tables/part/PartSalesAllocationsTable.tsx:61 #: src/tables/part/RelatedPartTable.tsx:73 @@ -4466,47 +4473,47 @@ msgstr "IČO" #: src/forms/BuildForms.tsx:632 #: src/forms/BuildForms.tsx:796 #: src/forms/BuildForms.tsx:897 -#: src/forms/SalesOrderForms.tsx:306 -#: src/tables/build/BuildAllocatedStockTable.tsx:139 -#: src/tables/build/BuildLineTable.tsx:182 +#: src/forms/SalesOrderForms.tsx:324 +#: src/tables/build/BuildAllocatedStockTable.tsx:136 +#: src/tables/build/BuildLineTable.tsx:183 #: src/tables/sales/SalesOrderLineItemTable.tsx:342 #: src/tables/stock/StockItemTable.tsx:338 msgid "Allocated" msgstr "Přiděleno" #: src/forms/BuildForms.tsx:667 -#: src/forms/SalesOrderForms.tsx:295 +#: src/forms/SalesOrderForms.tsx:313 #: src/pages/build/BuildDetail.tsx:108 #: src/pages/build/BuildDetail.tsx:326 msgid "Source Location" msgstr "Zdrojové umístění" #: src/forms/BuildForms.tsx:668 -#: src/forms/SalesOrderForms.tsx:296 +#: src/forms/SalesOrderForms.tsx:314 msgid "Select the source location for the stock allocation" msgstr "Vyberte umístění pro přiřazení zásob" #: src/forms/BuildForms.tsx:700 -#: src/forms/SalesOrderForms.tsx:336 -#: src/tables/build/BuildLineTable.tsx:574 -#: src/tables/build/BuildLineTable.tsx:731 -#: src/tables/build/BuildLineTable.tsx:830 +#: src/forms/SalesOrderForms.tsx:354 +#: src/tables/build/BuildLineTable.tsx:575 +#: src/tables/build/BuildLineTable.tsx:738 +#: src/tables/build/BuildLineTable.tsx:837 #: src/tables/sales/SalesOrderLineItemTable.tsx:380 #: src/tables/sales/SalesOrderLineItemTable.tsx:406 msgid "Allocate Stock" msgstr "Přidělit zásoby" #: src/forms/BuildForms.tsx:703 -#: src/forms/SalesOrderForms.tsx:341 +#: src/forms/SalesOrderForms.tsx:359 msgid "Stock items allocated" msgstr "Zásoba přidělena" #: src/forms/BuildForms.tsx:816 #: src/forms/BuildForms.tsx:917 -#: src/tables/build/BuildAllocatedStockTable.tsx:240 -#: src/tables/build/BuildAllocatedStockTable.tsx:272 -#: src/tables/build/BuildLineTable.tsx:741 -#: src/tables/build/BuildLineTable.tsx:864 +#: src/tables/build/BuildAllocatedStockTable.tsx:243 +#: src/tables/build/BuildAllocatedStockTable.tsx:279 +#: src/tables/build/BuildLineTable.tsx:748 +#: src/tables/build/BuildLineTable.tsx:871 msgid "Consume Stock" msgstr "Spotřebovat zásoby" @@ -4521,21 +4528,21 @@ msgstr "Zásoby plánované ke spotřebě" #~ msgstr "Stock items consumed" #: src/forms/BuildForms.tsx:853 -#: src/tables/build/BuildLineTable.tsx:514 +#: src/tables/build/BuildLineTable.tsx:515 #: src/tables/part/PartBuildAllocationsTable.tsx:101 msgid "Fully consumed" msgstr "Plně spotřebovány" #: src/forms/BuildForms.tsx:898 -#: src/tables/build/BuildLineTable.tsx:187 +#: src/tables/build/BuildLineTable.tsx:188 #: src/tables/stock/StockItemTable.tsx:367 msgid "Consumed" msgstr "Spotřebovány" #: src/forms/CommonForms.tsx:88 -#: src/forms/PurchaseOrderForms.tsx:125 +#: src/forms/PurchaseOrderForms.tsx:176 #: src/forms/ReturnOrderForms.tsx:138 -#: src/forms/SalesOrderForms.tsx:164 +#: src/forms/SalesOrderForms.tsx:182 msgid "Select project code for this line item" msgstr "Vyberte kód projektu pro tuto položku" @@ -4572,127 +4579,127 @@ msgstr "Nadřazená kategorie" msgid "Subscribe to notifications for this category" msgstr "Přihlásit se k odběru oznámení pro tuto kategorii" -#: src/forms/PurchaseOrderForms.tsx:388 -msgid "Assign Batch Code and Serial Numbers" -msgstr "Přiřadit kód dávky a sériová čísla" - -#: src/forms/PurchaseOrderForms.tsx:390 -msgid "Assign Batch Code" -msgstr "Přiřadit kód dávky" - -#: src/forms/PurchaseOrderForms.tsx:410 -msgid "Choose Location" -msgstr "Zvolte umístění" - -#: src/forms/PurchaseOrderForms.tsx:418 -msgid "Item Destination selected" -msgstr "Cíl položky byl vybrán" - #: src/forms/PurchaseOrderForms.tsx:421 #~ msgid "Assign Batch Code{0}" #~ msgstr "Assign Batch Code{0}" -#: src/forms/PurchaseOrderForms.tsx:428 -msgid "Part category default location selected" -msgstr "Vybráno výchozí umístění kategorie dílu" +#: src/forms/PurchaseOrderForms.tsx:440 +msgid "Assign Batch Code and Serial Numbers" +msgstr "Přiřadit kód dávky a sériová čísla" -#: src/forms/PurchaseOrderForms.tsx:438 -msgid "Received stock location selected" -msgstr "Vybráno skladové umístění" +#: src/forms/PurchaseOrderForms.tsx:442 +msgid "Assign Batch Code" +msgstr "Přiřadit kód dávky" #: src/forms/PurchaseOrderForms.tsx:444 #: src/forms/StockForms.tsx:428 #~ msgid "Remove item from list" #~ msgstr "Remove item from list" -#: src/forms/PurchaseOrderForms.tsx:446 +#: src/forms/PurchaseOrderForms.tsx:462 +msgid "Choose Location" +msgstr "Zvolte umístění" + +#: src/forms/PurchaseOrderForms.tsx:470 +msgid "Item Destination selected" +msgstr "Cíl položky byl vybrán" + +#: src/forms/PurchaseOrderForms.tsx:480 +msgid "Part category default location selected" +msgstr "Vybráno výchozí umístění kategorie dílu" + +#: src/forms/PurchaseOrderForms.tsx:490 +msgid "Received stock location selected" +msgstr "Vybráno skladové umístění" + +#: src/forms/PurchaseOrderForms.tsx:498 msgid "Default location selected" msgstr "Výchozí lokace vybrána" -#: src/forms/PurchaseOrderForms.tsx:507 +#: src/forms/PurchaseOrderForms.tsx:559 msgid "Set Location" msgstr "Nastavit umístění" -#: src/forms/PurchaseOrderForms.tsx:524 -msgid "Set Expiry Date" -msgstr "Nastavit datum expirace" - -#: src/forms/PurchaseOrderForms.tsx:532 -#: src/forms/StockForms.tsx:693 -msgid "Adjust Packaging" -msgstr "Upravit balení" - -#: src/forms/PurchaseOrderForms.tsx:540 -#: src/forms/StockForms.tsx:684 -#: src/hooks/UseStockAdjustActions.tsx:148 -msgid "Change Status" -msgstr "Změnit stav" - -#: src/forms/PurchaseOrderForms.tsx:546 -msgid "Add Note" -msgstr "Přidat poznámku" - #: src/forms/PurchaseOrderForms.tsx:566 #~ msgid "Serial numbers" #~ msgstr "Serial numbers" +#: src/forms/PurchaseOrderForms.tsx:576 +msgid "Set Expiry Date" +msgstr "Nastavit datum expirace" + #: src/forms/PurchaseOrderForms.tsx:582 #~ msgid "Store at line item destination" #~ msgstr "Store at line item destination" -#: src/forms/PurchaseOrderForms.tsx:610 -msgid "Store at default location" -msgstr "Uložit ve výchozím umístění" +#: src/forms/PurchaseOrderForms.tsx:584 +#: src/forms/StockForms.tsx:693 +msgid "Adjust Packaging" +msgstr "Upravit balení" -#: src/forms/PurchaseOrderForms.tsx:625 -msgid "Store at line item destination " -msgstr "Uložit na cíl řádkového předmětu " +#: src/forms/PurchaseOrderForms.tsx:592 +#: src/forms/StockForms.tsx:684 +#: src/hooks/UseStockAdjustActions.tsx:148 +msgid "Change Status" +msgstr "Změnit stav" -#: src/forms/PurchaseOrderForms.tsx:637 -msgid "Store with already received stock" -msgstr "Uložit již s přijatými zásobami" +#: src/forms/PurchaseOrderForms.tsx:598 +msgid "Add Note" +msgstr "Přidat poznámku" #: src/forms/PurchaseOrderForms.tsx:658 #~ msgid "Receive line items" #~ msgstr "Receive line items" -#: src/forms/PurchaseOrderForms.tsx:661 +#: src/forms/PurchaseOrderForms.tsx:662 +msgid "Store at default location" +msgstr "Uložit ve výchozím umístění" + +#: src/forms/PurchaseOrderForms.tsx:677 +msgid "Store at line item destination " +msgstr "Uložit na cíl řádkového předmětu " + +#: src/forms/PurchaseOrderForms.tsx:689 +msgid "Store with already received stock" +msgstr "Uložit již s přijatými zásobami" + +#: src/forms/PurchaseOrderForms.tsx:713 #: src/pages/build/BuildDetail.tsx:340 #: src/pages/stock/StockDetail.tsx:280 #: src/pages/stock/StockDetail.tsx:952 #: src/tables/Filter.tsx:83 -#: src/tables/build/BuildAllocatedStockTable.tsx:128 +#: src/tables/build/BuildAllocatedStockTable.tsx:125 #: src/tables/build/BuildOutputTable.tsx:112 -#: src/tables/part/PartTestResultTable.tsx:260 -#: src/tables/part/PartTestResultTable.tsx:281 +#: src/tables/part/PartTestResultTable.tsx:268 +#: src/tables/part/PartTestResultTable.tsx:289 #: src/tables/sales/SalesOrderAllocationTable.tsx:149 msgid "Batch Code" msgstr "Kód dávky" -#: src/forms/PurchaseOrderForms.tsx:662 +#: src/forms/PurchaseOrderForms.tsx:714 msgid "Enter batch code for received items" msgstr "Zadat kód dávky pro příchozí položky skladu" -#: src/forms/PurchaseOrderForms.tsx:675 +#: src/forms/PurchaseOrderForms.tsx:727 #: src/forms/StockForms.tsx:218 msgid "Serial Numbers" msgstr "Sériová čísla" -#: src/forms/PurchaseOrderForms.tsx:676 +#: src/forms/PurchaseOrderForms.tsx:728 msgid "Enter serial numbers for received items" msgstr "Zadat sériová čísla pro příchozí skladové položky" -#: src/forms/PurchaseOrderForms.tsx:690 +#: src/forms/PurchaseOrderForms.tsx:742 #: src/pages/stock/StockDetail.tsx:382 #: src/tables/stock/StockItemTable.tsx:294 msgid "Expiry Date" msgstr "Datum expirace" -#: src/forms/PurchaseOrderForms.tsx:691 +#: src/forms/PurchaseOrderForms.tsx:743 msgid "Enter an expiry date for received items" msgstr "Zadejte datum expirace pro přijaté položky" -#: src/forms/PurchaseOrderForms.tsx:703 +#: src/forms/PurchaseOrderForms.tsx:755 #: src/forms/StockForms.tsx:728 #: src/pages/company/SupplierPartDetail.tsx:172 #: src/pages/company/SupplierPartDetail.tsx:236 @@ -4701,19 +4708,19 @@ msgstr "Zadejte datum expirace pro přijaté položky" msgid "Packaging" msgstr "Balení" -#: src/forms/PurchaseOrderForms.tsx:727 +#: src/forms/PurchaseOrderForms.tsx:779 #: src/pages/company/SupplierPartDetail.tsx:120 #: src/tables/ColumnRenderers.tsx:332 msgid "Note" msgstr "Poznámka" -#: src/forms/PurchaseOrderForms.tsx:799 +#: src/forms/PurchaseOrderForms.tsx:851 #: src/pages/company/SupplierPartDetail.tsx:138 #: src/tables/purchasing/SupplierPriceBreakTable.tsx:49 msgid "SKU" msgstr "Číslo zboží (SKU)" -#: src/forms/PurchaseOrderForms.tsx:800 +#: src/forms/PurchaseOrderForms.tsx:852 #: src/tables/part/PartPurchaseOrdersTable.tsx:127 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:213 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:283 @@ -4721,11 +4728,11 @@ msgstr "Číslo zboží (SKU)" msgid "Received" msgstr "Přijaté" -#: src/forms/PurchaseOrderForms.tsx:817 +#: src/forms/PurchaseOrderForms.tsx:869 msgid "Receive Line Items" msgstr "Řádek přijatých položek" -#: src/forms/PurchaseOrderForms.tsx:823 +#: src/forms/PurchaseOrderForms.tsx:875 msgid "Items received" msgstr "Přijaté položky" @@ -4737,7 +4744,7 @@ msgstr "Přijaté položky" msgid "Item received into stock" msgstr "Položka byla přijata na skladě" -#: src/forms/SalesOrderForms.tsx:401 +#: src/forms/SalesOrderForms.tsx:419 msgid "Leave blank to use the order address" msgstr "Ponechte prázdné pro použití adresy objednávky" @@ -5932,6 +5939,9 @@ msgstr "Odstranit WebAuthn údaje" #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:310 #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:401 +#: src/tables/build/BuildAllocatedStockTable.tsx:181 +#: src/tables/build/BuildLineTable.tsx:668 +#: src/tables/sales/SalesOrderAllocationTable.tsx:220 msgid "Confirm Removal" msgstr "Potvrdit odstranění" @@ -6870,8 +6880,8 @@ msgstr "Externí" #: src/pages/sales/ReturnOrderDetail.tsx:108 #: src/pages/sales/SalesOrderDetail.tsx:98 #: src/tables/ColumnRenderers.tsx:321 -#: src/tables/build/BuildAllocatedStockTable.tsx:115 -#: src/tables/build/BuildLineTable.tsx:352 +#: src/tables/build/BuildAllocatedStockTable.tsx:112 +#: src/tables/build/BuildLineTable.tsx:353 msgid "Reference" msgstr "Reference" @@ -7132,7 +7142,7 @@ msgstr "Zrušit objednávku" #: src/pages/build/BuildDetail.tsx:742 #: src/pages/stock/StockDetail.tsx:344 -#: src/tables/build/BuildAllocatedStockTable.tsx:85 +#: src/tables/build/BuildAllocatedStockTable.tsx:82 #: src/tables/part/PartBuildAllocationsTable.tsx:45 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:157 #: src/tables/stock/StockTrackingTable.tsx:109 @@ -7600,7 +7610,7 @@ msgstr "Klíčová slova" #: src/pages/part/PartDetail.tsx:542 #: src/tables/bom/BomTable.tsx:439 -#: src/tables/build/BuildLineTable.tsx:305 +#: src/tables/build/BuildLineTable.tsx:306 #: src/tables/part/PartTable.tsx:319 #: src/tables/sales/SalesOrderLineItemTable.tsx:138 msgid "Available Stock" @@ -7608,7 +7618,7 @@ msgstr "Dostupná zásoba" #: src/pages/part/PartDetail.tsx:548 #: src/tables/bom/BomTable.tsx:341 -#: src/tables/build/BuildLineTable.tsx:267 +#: src/tables/build/BuildLineTable.tsx:268 #: src/tables/sales/SalesOrderLineItemTable.tsx:180 msgid "On order" msgstr "Na objednávku" @@ -7782,7 +7792,7 @@ msgstr "Objednávka" #: src/pages/part/PartDetail.tsx:1144 #: src/pages/stock/StockDetail.tsx:884 -#: src/tables/build/BuildLineTable.tsx:761 +#: src/tables/build/BuildLineTable.tsx:768 msgid "Order Stock" msgstr "Objednat zásoby" @@ -9219,13 +9229,13 @@ msgstr "Virtuální díl" #~ msgstr "Show asssmbled items" #: src/tables/bom/BomTable.tsx:315 -#: src/tables/build/BuildLineTable.tsx:276 +#: src/tables/build/BuildLineTable.tsx:277 #: src/tables/part/PartTable.tsx:145 msgid "External stock" msgstr "Externí zásoby" #: src/tables/bom/BomTable.tsx:323 -#: src/tables/build/BuildLineTable.tsx:239 +#: src/tables/build/BuildLineTable.tsx:240 msgid "Includes substitute stock" msgstr "Zahrnuje náhradní zásoby" @@ -9234,7 +9244,7 @@ msgstr "Zahrnuje náhradní zásoby" #~ msgstr "Edit Bom Item" #: src/tables/bom/BomTable.tsx:332 -#: src/tables/build/BuildLineTable.tsx:249 +#: src/tables/build/BuildLineTable.tsx:250 #: src/tables/sales/SalesOrderLineItemTable.tsx:166 msgid "Includes variant stock" msgstr "Zahrnuje variantu zásob" @@ -9272,8 +9282,8 @@ msgid "Stock Information" msgstr "Informace o skladu" #: src/tables/bom/BomTable.tsx:399 -#: src/tables/build/BuildLineTable.tsx:496 -#: src/tables/build/BuildLineTable.tsx:537 +#: src/tables/build/BuildLineTable.tsx:497 +#: src/tables/build/BuildLineTable.tsx:538 msgid "Consumable item" msgstr "Spotřební materiál" @@ -9282,7 +9292,7 @@ msgid "No available stock" msgstr "Není k dispozici skladem" #: src/tables/bom/BomTable.tsx:420 -#: src/tables/build/BuildLineTable.tsx:213 +#: src/tables/build/BuildLineTable.tsx:214 msgid "Show testable items" msgstr "Zobrazovat testovatelné položky" @@ -9291,7 +9301,7 @@ msgid "Show trackable items" msgstr "Zobrazit sledovatelné předměty" #: src/tables/bom/BomTable.tsx:430 -#: src/tables/build/BuildLineTable.tsx:208 +#: src/tables/build/BuildLineTable.tsx:209 msgid "Show assembled items" msgstr "Zobrazit smontované položky" @@ -9335,7 +9345,7 @@ msgstr "Zobrazit položky, které umožňují výměnu variant" #: src/tables/bom/BomTable.tsx:464 #: src/tables/bom/UsedInTable.tsx:85 -#: src/tables/build/BuildLineTable.tsx:202 +#: src/tables/build/BuildLineTable.tsx:203 msgid "Optional" msgstr "Volitelné" @@ -9345,7 +9355,7 @@ msgid "Show optional items" msgstr "Zobrazit volitelné položky" #: src/tables/bom/BomTable.tsx:469 -#: src/tables/build/BuildLineTable.tsx:197 +#: src/tables/build/BuildLineTable.tsx:198 msgid "Consumable" msgstr "Spotřební" @@ -9433,7 +9443,7 @@ msgid "Bill of materials cannot be edited, as the part is locked" msgstr "Kusovník nemůže být upraven, díl je uzamčen" #: src/tables/bom/UsedInTable.tsx:34 -#: src/tables/build/BuildLineTable.tsx:207 +#: src/tables/build/BuildLineTable.tsx:208 #: src/tables/part/ParametricPartTable.tsx:364 #: src/tables/part/PartBuildAllocationsTable.tsx:60 #: src/tables/part/PartTable.tsx:209 @@ -9455,11 +9465,11 @@ msgstr "Sledovatelné" msgid "Show trackable assemblies" msgstr "Zobrazit sledovatelné montáže" -#: src/tables/build/BuildAllocatedStockTable.tsx:67 +#: src/tables/build/BuildAllocatedStockTable.tsx:64 msgid "Allocated to Output" msgstr "Přidělen výstup" -#: src/tables/build/BuildAllocatedStockTable.tsx:68 +#: src/tables/build/BuildAllocatedStockTable.tsx:65 msgid "Show items allocated to a build output" msgstr "Zobrazit položky přiřazené k výstupu výstavby" @@ -9472,7 +9482,7 @@ msgstr "Zobrazit položky přiřazené k výstupu výstavby" #~ msgid "Include orders for part variants" #~ msgstr "Include orders for part variants" -#: src/tables/build/BuildAllocatedStockTable.tsx:97 +#: src/tables/build/BuildAllocatedStockTable.tsx:94 #: src/tables/part/PartBuildAllocationsTable.tsx:84 #: src/tables/part/PartPurchaseOrdersTable.tsx:132 #: src/tables/part/PartSalesAllocationsTable.tsx:69 @@ -9482,40 +9492,58 @@ msgid "Order Status" msgstr "Stav objednávky" #: src/tables/build/BuildAllocatedStockTable.tsx:164 -#~ msgid "Edit Build Item" -#~ msgstr "Edit Build Item" - -#: src/tables/build/BuildAllocatedStockTable.tsx:167 -#: src/tables/build/BuildLineTable.tsx:650 +#: src/tables/build/BuildLineTable.tsx:651 msgid "Edit Stock Allocation" msgstr "Upravit přiřazení zásob" +#: src/tables/build/BuildAllocatedStockTable.tsx:164 +#~ msgid "Edit Build Item" +#~ msgstr "Edit Build Item" + #: src/tables/build/BuildAllocatedStockTable.tsx:174 #~ msgid "Delete Build Item" #~ msgstr "Delete Build Item" +#: src/tables/build/BuildAllocatedStockTable.tsx:177 +#: src/tables/build/BuildLineTable.tsx:664 +#: src/tables/sales/SalesOrderAllocationTable.tsx:218 +msgid "Remove Allocated Stock" +msgstr "Odstranit přidělené zásoby" + #: src/tables/build/BuildAllocatedStockTable.tsx:180 #: src/tables/build/BuildLineTable.tsx:663 -msgid "Delete Stock Allocation" -msgstr "Odstranit přiřazení zásob" +#~ msgid "Delete Stock Allocation" +#~ msgstr "Delete Stock Allocation" -#: src/tables/build/BuildAllocatedStockTable.tsx:239 +#: src/tables/build/BuildAllocatedStockTable.tsx:182 +#: src/tables/build/BuildLineTable.tsx:669 +#: src/tables/sales/SalesOrderAllocationTable.tsx:221 +msgid "Are you sure you want to remove this allocated stock from the order?" +msgstr "Jste si jisti, že chcete odstranit tuto přiřazenou skladovou zásobu z objednávky?" + +#: src/tables/build/BuildAllocatedStockTable.tsx:242 msgid "Consume" msgstr "Spotřebovat" +#: src/tables/build/BuildAllocatedStockTable.tsx:259 +#: src/tables/build/BuildLineTable.tsx:112 +#: src/tables/sales/SalesOrderAllocationTable.tsx:248 +msgid "Remove allocated stock" +msgstr "Odstranit přidělené zásoby" + #: src/tables/build/BuildLineTable.tsx:59 #~ msgid "Show lines with available stock" #~ msgstr "Show lines with available stock" -#: src/tables/build/BuildLineTable.tsx:120 +#: src/tables/build/BuildLineTable.tsx:121 msgid "View Stock Item" msgstr "Zobrazit skladovou položku" -#: src/tables/build/BuildLineTable.tsx:183 +#: src/tables/build/BuildLineTable.tsx:184 msgid "Show fully allocated lines" msgstr "Zobrazit plně přidělené řádky" -#: src/tables/build/BuildLineTable.tsx:188 +#: src/tables/build/BuildLineTable.tsx:189 msgid "Show fully consumed lines" msgstr "Zobrazit plně spotřebované řádky" @@ -9523,124 +9551,124 @@ msgstr "Zobrazit plně spotřebované řádky" #~ msgid "Show allocated lines" #~ msgstr "Show allocated lines" -#: src/tables/build/BuildLineTable.tsx:193 +#: src/tables/build/BuildLineTable.tsx:194 msgid "Show items with sufficient available stock" msgstr "Zobrazit předměty s dostatečnými zásobami" -#: src/tables/build/BuildLineTable.tsx:198 +#: src/tables/build/BuildLineTable.tsx:199 msgid "Show consumable lines" msgstr "Zobrazit spotřební řádky" -#: src/tables/build/BuildLineTable.tsx:203 +#: src/tables/build/BuildLineTable.tsx:204 msgid "Show optional lines" msgstr "Zobrazit volitelné řádky" -#: src/tables/build/BuildLineTable.tsx:212 +#: src/tables/build/BuildLineTable.tsx:213 #: src/tables/part/PartTable.tsx:233 msgid "Testable" msgstr "Testovatelné" -#: src/tables/build/BuildLineTable.tsx:217 +#: src/tables/build/BuildLineTable.tsx:218 #: src/tables/stock/StockItemTable.tsx:388 msgid "Tracked" msgstr "Sledováno" -#: src/tables/build/BuildLineTable.tsx:218 +#: src/tables/build/BuildLineTable.tsx:219 msgid "Show tracked lines" msgstr "Zobrazit sledované řádky" -#: src/tables/build/BuildLineTable.tsx:223 +#: src/tables/build/BuildLineTable.tsx:224 msgid "Show items with stock on order" msgstr "Zobrazit položky skladem k objednávce" -#: src/tables/build/BuildLineTable.tsx:258 +#: src/tables/build/BuildLineTable.tsx:259 #: src/tables/sales/SalesOrderLineItemTable.tsx:172 msgid "In production" msgstr "Ve výrobě" -#: src/tables/build/BuildLineTable.tsx:286 +#: src/tables/build/BuildLineTable.tsx:287 msgid "Insufficient stock" msgstr "Nedostatek zásob" -#: src/tables/build/BuildLineTable.tsx:302 +#: src/tables/build/BuildLineTable.tsx:303 #: src/tables/sales/SalesOrderLineItemTable.tsx:160 #: src/tables/stock/StockItemTable.tsx:191 msgid "No stock available" msgstr "Není na skladě" -#: src/tables/build/BuildLineTable.tsx:375 +#: src/tables/build/BuildLineTable.tsx:376 msgid "Gets Inherited" msgstr "Zděděný" -#: src/tables/build/BuildLineTable.tsx:388 +#: src/tables/build/BuildLineTable.tsx:389 msgid "Unit Quantity" msgstr "Jednotkové množství" -#: src/tables/build/BuildLineTable.tsx:415 +#: src/tables/build/BuildLineTable.tsx:416 msgid "Setup Quantity" msgstr "Nastavit množství" -#: src/tables/build/BuildLineTable.tsx:424 +#: src/tables/build/BuildLineTable.tsx:425 msgid "Attrition" msgstr "Přirozené ztráty" -#: src/tables/build/BuildLineTable.tsx:432 +#: src/tables/build/BuildLineTable.tsx:433 msgid "Rounding Multiple" msgstr "Zaokrouhlení více" -#: src/tables/build/BuildLineTable.tsx:441 +#: src/tables/build/BuildLineTable.tsx:442 msgid "BOM Information" msgstr "Informace kusovníku" -#: src/tables/build/BuildLineTable.tsx:515 +#: src/tables/build/BuildLineTable.tsx:516 #: src/tables/part/PartBuildAllocationsTable.tsx:102 msgid "Fully allocated" msgstr "Plně přiděleno" -#: src/tables/build/BuildLineTable.tsx:563 +#: src/tables/build/BuildLineTable.tsx:564 #: src/tables/sales/SalesOrderLineItemTable.tsx:311 msgid "Create Build Order" msgstr "Vytvořit výrobní příkaz" -#: src/tables/build/BuildLineTable.tsx:592 +#: src/tables/build/BuildLineTable.tsx:593 msgid "Auto allocation in progress" msgstr "Probíhá automatické přidělování" -#: src/tables/build/BuildLineTable.tsx:595 -#: src/tables/build/BuildLineTable.tsx:802 +#: src/tables/build/BuildLineTable.tsx:596 +#: src/tables/build/BuildLineTable.tsx:809 msgid "Auto Allocate Stock" msgstr "Automatické přiřazení zásob" -#: src/tables/build/BuildLineTable.tsx:596 +#: src/tables/build/BuildLineTable.tsx:597 msgid "Automatically allocate stock to this build according to the selected options" msgstr "Automaticky přiřadit zásoby do této výstavby podle zvolených možností" -#: src/tables/build/BuildLineTable.tsx:616 -#: src/tables/build/BuildLineTable.tsx:630 -#: src/tables/build/BuildLineTable.tsx:751 -#: src/tables/build/BuildLineTable.tsx:852 +#: src/tables/build/BuildLineTable.tsx:617 +#: src/tables/build/BuildLineTable.tsx:631 +#: src/tables/build/BuildLineTable.tsx:758 +#: src/tables/build/BuildLineTable.tsx:859 #: src/tables/build/BuildOutputTable.tsx:355 #: src/tables/build/BuildOutputTable.tsx:360 msgid "Deallocate Stock" msgstr "Uvolnění zásob" -#: src/tables/build/BuildLineTable.tsx:632 +#: src/tables/build/BuildLineTable.tsx:633 msgid "Deallocate all untracked stock for this build order" msgstr "Uvolnit všechny nesledované zásoby pro tuto stavební objednávku" -#: src/tables/build/BuildLineTable.tsx:634 +#: src/tables/build/BuildLineTable.tsx:635 msgid "Deallocate stock from the selected line item" msgstr "Uvolnit veškeré zásoby z vybrané položky" -#: src/tables/build/BuildLineTable.tsx:638 +#: src/tables/build/BuildLineTable.tsx:639 msgid "Stock has been deallocated" msgstr "Zásoby byly uvolněné" -#: src/tables/build/BuildLineTable.tsx:771 +#: src/tables/build/BuildLineTable.tsx:778 msgid "Build Stock" msgstr "Zásoby stavby" -#: src/tables/build/BuildLineTable.tsx:784 +#: src/tables/build/BuildLineTable.tsx:791 #: src/tables/sales/SalesOrderLineItemTable.tsx:487 msgid "View Part" msgstr "Zobrazit díl" @@ -9739,7 +9767,7 @@ msgid "Serialize Build Output" msgstr "Serializovat výstup výroby" #: src/tables/build/BuildOutputTable.tsx:405 -#: src/tables/part/PartTestResultTable.tsx:310 +#: src/tables/part/PartTestResultTable.tsx:318 #: src/tables/stock/StockItemTable.tsx:328 msgid "Filter by stock status" msgstr "Filtrovat podle stavu zásob" @@ -9964,8 +9992,8 @@ msgid "View Item" msgstr "Zobrazit položku" #: src/tables/general/ExtraLineItemTable.tsx:95 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:299 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:403 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:300 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:405 #: src/tables/sales/ReturnOrderLineItemTable.tsx:83 #: src/tables/sales/ReturnOrderLineItemTable.tsx:187 #: src/tables/sales/SalesOrderLineItemTable.tsx:252 @@ -9974,14 +10002,14 @@ msgid "Add Line Item" msgstr "Přidat řádek položky" #: src/tables/general/ExtraLineItemTable.tsx:108 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:320 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:322 #: src/tables/sales/ReturnOrderLineItemTable.tsx:96 #: src/tables/sales/SalesOrderLineItemTable.tsx:271 msgid "Edit Line Item" msgstr "Upravit řádkovou položku" #: src/tables/general/ExtraLineItemTable.tsx:117 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:329 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:331 #: src/tables/sales/ReturnOrderLineItemTable.tsx:105 #: src/tables/sales/SalesOrderLineItemTable.tsx:280 msgid "Delete Line Item" @@ -10273,7 +10301,7 @@ msgid "Required Stock" msgstr "Vyžadované zásoby" #: src/tables/part/PartBuildAllocationsTable.tsx:124 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:381 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:383 msgid "View Build Order" msgstr "Zobrazit výrobní příkaz" @@ -10617,8 +10645,8 @@ msgstr "Importovat od pluginu dodavatele" #: src/tables/part/PartTestResultTable.tsx:103 #: src/tables/part/PartTestResultTable.tsx:181 -#: src/tables/part/PartTestResultTable.tsx:320 -#: src/tables/part/PartTestResultTable.tsx:334 +#: src/tables/part/PartTestResultTable.tsx:328 +#: src/tables/part/PartTestResultTable.tsx:342 #: src/tables/stock/StockItemTestResultTable.tsx:296 #: src/tables/stock/StockItemTestResultTable.tsx:368 #: src/tables/stock/StockItemTestResultTable.tsx:429 @@ -10643,7 +10671,7 @@ msgstr "Výsledky testu přidány" msgid "No Result" msgstr "Žádný výsledek" -#: src/tables/part/PartTestResultTable.tsx:298 +#: src/tables/part/PartTestResultTable.tsx:306 msgid "Show build outputs currently in production" msgstr "Zobrazit výsledky výrobních výstupů v současné výrobě" @@ -11073,7 +11101,7 @@ msgid "Show manufacturer parts for active manufacturers." msgstr "Zobrazit díly výrobce pro aktivní výrobce." #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:115 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:397 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:399 msgid "Import Line Items" msgstr "Importovat položky řádku" @@ -11099,11 +11127,11 @@ msgstr "Zobrazit řádkové položky, které byly přijaty" #~ msgid "Add line item" #~ msgstr "Add line item" -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:350 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:352 msgid "Receive line item" msgstr "Přijímat položku" -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:414 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:416 msgid "Receive items" msgstr "Přijímat položky" @@ -11201,25 +11229,25 @@ msgid "Not shipped" msgstr "Neodesláno" #: src/tables/sales/SalesOrderAllocationTable.tsx:211 -#: src/tables/sales/SalesOrderAllocationTable.tsx:229 +#: src/tables/sales/SalesOrderAllocationTable.tsx:235 msgid "Edit Allocation" msgstr "Upravit přiřazení" #: src/tables/sales/SalesOrderAllocationTable.tsx:218 #: src/tables/sales/SalesOrderAllocationTable.tsx:241 -msgid "Delete Allocation" -msgstr "Odstranit přiřazení" +#~ msgid "Delete Allocation" +#~ msgstr "Delete Allocation" -#: src/tables/sales/SalesOrderAllocationTable.tsx:252 -#: src/tables/sales/SalesOrderAllocationTable.tsx:253 +#: src/tables/sales/SalesOrderAllocationTable.tsx:261 +#: src/tables/sales/SalesOrderAllocationTable.tsx:262 msgid "View Shipment" msgstr "Zobrazit zásilku" -#: src/tables/sales/SalesOrderAllocationTable.tsx:308 +#: src/tables/sales/SalesOrderAllocationTable.tsx:317 msgid "Assign to Shipment" msgstr "Přiřadit k zásilce" -#: src/tables/sales/SalesOrderAllocationTable.tsx:324 +#: src/tables/sales/SalesOrderAllocationTable.tsx:333 msgid "Assign to shipment" msgstr "Přiřadit k zásilce" diff --git a/src/frontend/src/locales/da/messages.po b/src/frontend/src/locales/da/messages.po index 706d39a21c..162f04f447 100644 --- a/src/frontend/src/locales/da/messages.po +++ b/src/frontend/src/locales/da/messages.po @@ -8,7 +8,7 @@ msgstr "" "Language: da\n" "Project-Id-Version: inventree\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2025-11-19 19:39\n" +"PO-Revision-Date: 2025-11-22 06:25\n" "Last-Translator: \n" "Language-Team: Danish\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" @@ -56,7 +56,7 @@ msgstr "" #: lib/components/RowActions.tsx:136 #: src/components/nav/NavigationDrawer.tsx:190 -#: src/forms/PurchaseOrderForms.tsx:802 +#: src/forms/PurchaseOrderForms.tsx:854 #: src/forms/StockForms.tsx:796 #: src/forms/StockForms.tsx:843 #: src/forms/StockForms.tsx:889 @@ -103,9 +103,9 @@ msgstr "" #: src/forms/BuildForms.tsx:630 #: src/forms/BuildForms.tsx:793 #: src/forms/BuildForms.tsx:896 -#: src/forms/PurchaseOrderForms.tsx:798 +#: src/forms/PurchaseOrderForms.tsx:850 #: src/forms/ReturnOrderForms.tsx:242 -#: src/forms/SalesOrderForms.tsx:305 +#: src/forms/SalesOrderForms.tsx:323 #: src/forms/StockForms.tsx:360 #: src/forms/StockForms.tsx:791 #: src/forms/StockForms.tsx:838 @@ -119,6 +119,7 @@ msgstr "" #: src/pages/build/BuildDetail.tsx:200 #: src/pages/part/PartDetail.tsx:1207 #: src/tables/ColumnRenderers.tsx:91 +#: src/tables/part/PartTestResultTable.tsx:247 #: src/tables/part/RelatedPartTable.tsx:53 #: src/tables/stock/StockTrackingTable.tsx:87 msgid "Part" @@ -158,7 +159,7 @@ msgstr "" #: src/components/wizards/OrderPartsWizard.tsx:290 #: src/pages/company/SupplierPartDetail.tsx:413 #: src/pages/stock/StockDetail.tsx:289 -#: src/tables/build/BuildAllocatedStockTable.tsx:155 +#: src/tables/build/BuildAllocatedStockTable.tsx:152 #: src/tables/part/PartPurchaseOrdersTable.tsx:50 #: src/tables/purchasing/SupplierPartTable.tsx:83 #: src/tables/stock/StockItemTable.tsx:247 @@ -201,9 +202,9 @@ msgstr "" #: src/forms/BuildForms.tsx:473 #: src/forms/BuildForms.tsx:633 #: src/forms/BuildForms.tsx:794 -#: src/forms/SalesOrderForms.tsx:307 +#: src/forms/SalesOrderForms.tsx:325 #: src/pages/stock/StockDetail.tsx:1005 -#: src/tables/part/PartTestResultTable.tsx:248 +#: src/tables/part/PartTestResultTable.tsx:256 #: src/tables/stock/StockTrackingTable.tsx:48 #: src/tables/stock/StockTrackingTable.tsx:55 msgid "Stock Item" @@ -517,7 +518,7 @@ msgstr "" #: src/components/dashboard/DashboardLayout.tsx:281 #: src/components/editors/NotesEditor.tsx:74 #: src/components/editors/TemplateEditor/TemplateEditor.tsx:158 -#: src/components/forms/fields/ApiFormField.tsx:273 +#: src/components/forms/fields/ApiFormField.tsx:237 #: src/components/forms/fields/TableField.tsx:45 #: src/components/importer/ImportDataSelector.tsx:192 #: src/components/importer/ImporterColumnSelector.tsx:234 @@ -642,8 +643,8 @@ msgstr "" #: src/components/barcodes/BarcodeScanDialog.tsx:49 #: src/components/buttons/ScanButton.tsx:15 #: src/components/nav/NavigationDrawer.tsx:122 -#: src/forms/PurchaseOrderForms.tsx:457 -#: src/forms/PurchaseOrderForms.tsx:563 +#: src/forms/PurchaseOrderForms.tsx:509 +#: src/forms/PurchaseOrderForms.tsx:615 msgid "Scan Barcode" msgstr "" @@ -728,7 +729,7 @@ msgstr "" #: src/components/barcodes/QRCode.tsx:205 #: src/components/items/ActionDropdown.tsx:192 -#: src/forms/PurchaseOrderForms.tsx:554 +#: src/forms/PurchaseOrderForms.tsx:606 msgid "Unlink Barcode" msgstr "" @@ -1216,6 +1217,12 @@ msgstr "" #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:884 #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:903 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:254 +#: src/tables/build/BuildAllocatedStockTable.tsx:178 +#: src/tables/build/BuildAllocatedStockTable.tsx:258 +#: src/tables/build/BuildLineTable.tsx:111 +#: src/tables/build/BuildLineTable.tsx:665 +#: src/tables/sales/SalesOrderAllocationTable.tsx:224 +#: src/tables/sales/SalesOrderAllocationTable.tsx:247 msgid "Remove" msgstr "" @@ -1241,7 +1248,7 @@ msgid "Upload Error" msgstr "" #: src/components/details/DetailsImage.tsx:250 -#: src/components/forms/fields/TextField.tsx:65 +#: src/components/forms/fields/AutoFillRightSection.tsx:34 msgid "Clear" msgstr "" @@ -1817,10 +1824,14 @@ msgstr "" msgid "Running" msgstr "" -#: src/components/forms/fields/ApiFormField.tsx:233 +#: src/components/forms/fields/ApiFormField.tsx:197 msgid "Select file to upload" msgstr "" +#: src/components/forms/fields/AutoFillRightSection.tsx:47 +msgid "Accept suggested value" +msgstr "" + #: src/components/forms/fields/DateField.tsx:76 msgid "Select date" msgstr "" @@ -1875,10 +1886,6 @@ msgstr "" msgid "Add new row" msgstr "" -#: src/components/forms/fields/TextField.tsx:82 -msgid "Accept suggested value" -msgstr "" - #: src/components/images/DetailsImage.tsx:252 #~ msgid "Select image" #~ msgstr "Select image" @@ -2225,8 +2232,8 @@ msgstr "" #: src/pages/part/PartDetail.tsx:994 #: src/pages/stock/StockDetail.tsx:265 #: src/pages/stock/StockDetail.tsx:942 -#: src/tables/build/BuildAllocatedStockTable.tsx:135 -#: src/tables/build/BuildLineTable.tsx:192 +#: src/tables/build/BuildAllocatedStockTable.tsx:132 +#: src/tables/build/BuildLineTable.tsx:193 #: src/tables/part/PartTable.tsx:137 #: src/tables/stock/StockItemTable.tsx:182 #: src/tables/stock/StockItemTable.tsx:343 @@ -2784,7 +2791,7 @@ msgstr "" #: src/pages/sales/SalesOrderDetail.tsx:119 #: src/pages/stock/LocationDetail.tsx:102 #: src/tables/ColumnRenderers.tsx:278 -#: src/tables/build/BuildAllocatedStockTable.tsx:91 +#: src/tables/build/BuildAllocatedStockTable.tsx:88 #: src/tables/machine/MachineTypeTable.tsx:161 #: src/tables/machine/MachineTypeTable.tsx:257 #: src/tables/plugin/PluginListTable.tsx:110 @@ -2966,7 +2973,7 @@ msgstr "" #: src/pages/company/SupplierPartDetail.tsx:394 #: src/pages/part/PartDetail.tsx:1015 #: src/tables/bom/BomTable.tsx:444 -#: src/tables/build/BuildLineTable.tsx:222 +#: src/tables/build/BuildLineTable.tsx:223 #: src/tables/part/PartTable.tsx:108 msgid "On Order" msgstr "" @@ -2976,7 +2983,7 @@ msgstr "" #: src/pages/part/PartDetail.tsx:587 #: src/pages/part/PartDetail.tsx:1021 #: src/pages/stock/StockDetail.tsx:925 -#: src/tables/part/PartTestResultTable.tsx:297 +#: src/tables/part/PartTestResultTable.tsx:305 #: src/tables/stock/StockItemTable.tsx:359 msgid "In Production" msgstr "" @@ -3000,7 +3007,7 @@ msgstr "" #: src/components/render/Stock.tsx:114 #: src/components/render/Stock.tsx:132 #: src/forms/BuildForms.tsx:795 -#: src/forms/PurchaseOrderForms.tsx:595 +#: src/forms/PurchaseOrderForms.tsx:647 #: src/forms/StockForms.tsx:792 #: src/forms/StockForms.tsx:839 #: src/forms/StockForms.tsx:885 @@ -3023,7 +3030,7 @@ msgstr "" #: src/components/render/Stock.tsx:99 #: src/pages/stock/StockDetail.tsx:198 #: src/pages/stock/StockDetail.tsx:930 -#: src/tables/build/BuildAllocatedStockTable.tsx:121 +#: src/tables/build/BuildAllocatedStockTable.tsx:118 #: src/tables/build/BuildOutputTable.tsx:107 #: src/tables/sales/SalesOrderAllocationTable.tsx:142 msgid "Serial Number" @@ -3034,9 +3041,9 @@ msgstr "" #: src/forms/BuildForms.tsx:240 #: src/forms/BuildForms.tsx:634 #: src/forms/BuildForms.tsx:797 -#: src/forms/PurchaseOrderForms.tsx:801 +#: src/forms/PurchaseOrderForms.tsx:853 #: src/forms/ReturnOrderForms.tsx:243 -#: src/forms/SalesOrderForms.tsx:308 +#: src/forms/SalesOrderForms.tsx:326 #: src/forms/StockForms.tsx:841 #: src/pages/part/PartStockHistoryDetail.tsx:56 #: src/pages/part/PartStockHistoryDetail.tsx:210 @@ -3046,9 +3053,9 @@ msgstr "" #: src/pages/part/pricing/PriceBreakPanel.tsx:172 #: src/pages/stock/StockDetail.tsx:258 #: src/pages/stock/StockDetail.tsx:936 -#: src/tables/build/BuildLineTable.tsx:86 +#: src/tables/build/BuildLineTable.tsx:83 #: src/tables/part/PartPurchaseOrdersTable.tsx:94 -#: src/tables/part/PartTestResultTable.tsx:269 +#: src/tables/part/PartTestResultTable.tsx:277 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:175 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:206 #: src/tables/purchasing/SupplierPriceBreakTable.tsx:69 @@ -3070,7 +3077,7 @@ msgstr "" #: src/forms/StockForms.tsx:1048 #: src/forms/StockForms.tsx:1096 #: src/forms/StockForms.tsx:1140 -#: src/tables/build/BuildLineTable.tsx:96 +#: src/tables/build/BuildLineTable.tsx:93 msgid "Batch" msgstr "" @@ -3755,7 +3762,7 @@ msgid "In Stock" msgstr "" #: src/components/wizards/OrderPartsWizard.tsx:146 -#: src/tables/build/BuildLineTable.tsx:404 +#: src/tables/build/BuildLineTable.tsx:405 msgid "Required Quantity" msgstr "" @@ -3847,7 +3854,7 @@ msgid "Please correct the errors in the selected parts" msgstr "" #: src/components/wizards/OrderPartsWizard.tsx:587 -#: src/tables/build/BuildLineTable.tsx:815 +#: src/tables/build/BuildLineTable.tsx:822 #: src/tables/part/PartTable.tsx:522 #: src/tables/sales/SalesOrderLineItemTable.tsx:370 msgid "Order Parts" @@ -4349,9 +4356,9 @@ msgstr "" #: src/forms/BuildForms.tsx:333 #: src/forms/BuildForms.tsx:408 #: src/forms/BuildForms.tsx:685 -#: src/tables/build/BuildAllocatedStockTable.tsx:150 +#: src/tables/build/BuildAllocatedStockTable.tsx:147 #: src/tables/build/BuildOutputTable.tsx:582 -#: src/tables/part/PartTestResultTable.tsx:272 +#: src/tables/part/PartTestResultTable.tsx:280 msgid "Build Output" msgstr "" @@ -4362,7 +4369,7 @@ msgstr "" #: src/forms/BuildForms.tsx:336 #: src/forms/BuildForms.tsx:411 #: src/forms/BuildForms.tsx:475 -#: src/forms/PurchaseOrderForms.tsx:717 +#: src/forms/PurchaseOrderForms.tsx:769 #: src/forms/ReturnOrderForms.tsx:197 #: src/forms/ReturnOrderForms.tsx:244 #: src/forms/StockForms.tsx:712 @@ -4377,7 +4384,7 @@ msgstr "" #: src/tables/build/BuildOutputTable.tsx:404 #: src/tables/machine/MachineListTable.tsx:387 #: src/tables/part/PartPurchaseOrdersTable.tsx:38 -#: src/tables/part/PartTestResultTable.tsx:309 +#: src/tables/part/PartTestResultTable.tsx:317 #: src/tables/sales/ReturnOrderLineItemTable.tsx:138 #: src/tables/sales/ReturnOrderLineItemTable.tsx:176 #: src/tables/settings/CustomStateTable.tsx:79 @@ -4450,8 +4457,8 @@ msgstr "" #: src/pages/stock/StockDetail.tsx:153 #: src/tables/bom/BomTable.tsx:134 #: src/tables/bom/UsedInTable.tsx:40 -#: src/tables/build/BuildAllocatedStockTable.tsx:108 -#: src/tables/build/BuildLineTable.tsx:336 +#: src/tables/build/BuildAllocatedStockTable.tsx:105 +#: src/tables/build/BuildLineTable.tsx:337 #: src/tables/build/BuildOrderTable.tsx:79 #: src/tables/part/PartSalesAllocationsTable.tsx:61 #: src/tables/part/RelatedPartTable.tsx:73 @@ -4466,47 +4473,47 @@ msgstr "" #: src/forms/BuildForms.tsx:632 #: src/forms/BuildForms.tsx:796 #: src/forms/BuildForms.tsx:897 -#: src/forms/SalesOrderForms.tsx:306 -#: src/tables/build/BuildAllocatedStockTable.tsx:139 -#: src/tables/build/BuildLineTable.tsx:182 +#: src/forms/SalesOrderForms.tsx:324 +#: src/tables/build/BuildAllocatedStockTable.tsx:136 +#: src/tables/build/BuildLineTable.tsx:183 #: src/tables/sales/SalesOrderLineItemTable.tsx:342 #: src/tables/stock/StockItemTable.tsx:338 msgid "Allocated" msgstr "" #: src/forms/BuildForms.tsx:667 -#: src/forms/SalesOrderForms.tsx:295 +#: src/forms/SalesOrderForms.tsx:313 #: src/pages/build/BuildDetail.tsx:108 #: src/pages/build/BuildDetail.tsx:326 msgid "Source Location" msgstr "" #: src/forms/BuildForms.tsx:668 -#: src/forms/SalesOrderForms.tsx:296 +#: src/forms/SalesOrderForms.tsx:314 msgid "Select the source location for the stock allocation" msgstr "" #: src/forms/BuildForms.tsx:700 -#: src/forms/SalesOrderForms.tsx:336 -#: src/tables/build/BuildLineTable.tsx:574 -#: src/tables/build/BuildLineTable.tsx:731 -#: src/tables/build/BuildLineTable.tsx:830 +#: src/forms/SalesOrderForms.tsx:354 +#: src/tables/build/BuildLineTable.tsx:575 +#: src/tables/build/BuildLineTable.tsx:738 +#: src/tables/build/BuildLineTable.tsx:837 #: src/tables/sales/SalesOrderLineItemTable.tsx:380 #: src/tables/sales/SalesOrderLineItemTable.tsx:406 msgid "Allocate Stock" msgstr "" #: src/forms/BuildForms.tsx:703 -#: src/forms/SalesOrderForms.tsx:341 +#: src/forms/SalesOrderForms.tsx:359 msgid "Stock items allocated" msgstr "" #: src/forms/BuildForms.tsx:816 #: src/forms/BuildForms.tsx:917 -#: src/tables/build/BuildAllocatedStockTable.tsx:240 -#: src/tables/build/BuildAllocatedStockTable.tsx:272 -#: src/tables/build/BuildLineTable.tsx:741 -#: src/tables/build/BuildLineTable.tsx:864 +#: src/tables/build/BuildAllocatedStockTable.tsx:243 +#: src/tables/build/BuildAllocatedStockTable.tsx:279 +#: src/tables/build/BuildLineTable.tsx:748 +#: src/tables/build/BuildLineTable.tsx:871 msgid "Consume Stock" msgstr "" @@ -4521,21 +4528,21 @@ msgstr "" #~ msgstr "Stock items consumed" #: src/forms/BuildForms.tsx:853 -#: src/tables/build/BuildLineTable.tsx:514 +#: src/tables/build/BuildLineTable.tsx:515 #: src/tables/part/PartBuildAllocationsTable.tsx:101 msgid "Fully consumed" msgstr "" #: src/forms/BuildForms.tsx:898 -#: src/tables/build/BuildLineTable.tsx:187 +#: src/tables/build/BuildLineTable.tsx:188 #: src/tables/stock/StockItemTable.tsx:367 msgid "Consumed" msgstr "" #: src/forms/CommonForms.tsx:88 -#: src/forms/PurchaseOrderForms.tsx:125 +#: src/forms/PurchaseOrderForms.tsx:176 #: src/forms/ReturnOrderForms.tsx:138 -#: src/forms/SalesOrderForms.tsx:164 +#: src/forms/SalesOrderForms.tsx:182 msgid "Select project code for this line item" msgstr "" @@ -4572,32 +4579,16 @@ msgstr "" msgid "Subscribe to notifications for this category" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:388 -msgid "Assign Batch Code and Serial Numbers" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:390 -msgid "Assign Batch Code" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:410 -msgid "Choose Location" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:418 -msgid "Item Destination selected" -msgstr "" - #: src/forms/PurchaseOrderForms.tsx:421 #~ msgid "Assign Batch Code{0}" #~ msgstr "Assign Batch Code{0}" -#: src/forms/PurchaseOrderForms.tsx:428 -msgid "Part category default location selected" +#: src/forms/PurchaseOrderForms.tsx:440 +msgid "Assign Batch Code and Serial Numbers" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:438 -msgid "Received stock location selected" +#: src/forms/PurchaseOrderForms.tsx:442 +msgid "Assign Batch Code" msgstr "" #: src/forms/PurchaseOrderForms.tsx:444 @@ -4605,94 +4596,110 @@ msgstr "" #~ msgid "Remove item from list" #~ msgstr "Remove item from list" -#: src/forms/PurchaseOrderForms.tsx:446 +#: src/forms/PurchaseOrderForms.tsx:462 +msgid "Choose Location" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:470 +msgid "Item Destination selected" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:480 +msgid "Part category default location selected" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:490 +msgid "Received stock location selected" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:498 msgid "Default location selected" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:507 +#: src/forms/PurchaseOrderForms.tsx:559 msgid "Set Location" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:524 -msgid "Set Expiry Date" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:532 -#: src/forms/StockForms.tsx:693 -msgid "Adjust Packaging" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:540 -#: src/forms/StockForms.tsx:684 -#: src/hooks/UseStockAdjustActions.tsx:148 -msgid "Change Status" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:546 -msgid "Add Note" -msgstr "" - #: src/forms/PurchaseOrderForms.tsx:566 #~ msgid "Serial numbers" #~ msgstr "Serial numbers" +#: src/forms/PurchaseOrderForms.tsx:576 +msgid "Set Expiry Date" +msgstr "" + #: src/forms/PurchaseOrderForms.tsx:582 #~ msgid "Store at line item destination" #~ msgstr "Store at line item destination" -#: src/forms/PurchaseOrderForms.tsx:610 -msgid "Store at default location" +#: src/forms/PurchaseOrderForms.tsx:584 +#: src/forms/StockForms.tsx:693 +msgid "Adjust Packaging" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:625 -msgid "Store at line item destination " +#: src/forms/PurchaseOrderForms.tsx:592 +#: src/forms/StockForms.tsx:684 +#: src/hooks/UseStockAdjustActions.tsx:148 +msgid "Change Status" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:637 -msgid "Store with already received stock" +#: src/forms/PurchaseOrderForms.tsx:598 +msgid "Add Note" msgstr "" #: src/forms/PurchaseOrderForms.tsx:658 #~ msgid "Receive line items" #~ msgstr "Receive line items" -#: src/forms/PurchaseOrderForms.tsx:661 +#: src/forms/PurchaseOrderForms.tsx:662 +msgid "Store at default location" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:677 +msgid "Store at line item destination " +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:689 +msgid "Store with already received stock" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:713 #: src/pages/build/BuildDetail.tsx:340 #: src/pages/stock/StockDetail.tsx:280 #: src/pages/stock/StockDetail.tsx:952 #: src/tables/Filter.tsx:83 -#: src/tables/build/BuildAllocatedStockTable.tsx:128 +#: src/tables/build/BuildAllocatedStockTable.tsx:125 #: src/tables/build/BuildOutputTable.tsx:112 -#: src/tables/part/PartTestResultTable.tsx:260 -#: src/tables/part/PartTestResultTable.tsx:281 +#: src/tables/part/PartTestResultTable.tsx:268 +#: src/tables/part/PartTestResultTable.tsx:289 #: src/tables/sales/SalesOrderAllocationTable.tsx:149 msgid "Batch Code" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:662 +#: src/forms/PurchaseOrderForms.tsx:714 msgid "Enter batch code for received items" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:675 +#: src/forms/PurchaseOrderForms.tsx:727 #: src/forms/StockForms.tsx:218 msgid "Serial Numbers" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:676 +#: src/forms/PurchaseOrderForms.tsx:728 msgid "Enter serial numbers for received items" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:690 +#: src/forms/PurchaseOrderForms.tsx:742 #: src/pages/stock/StockDetail.tsx:382 #: src/tables/stock/StockItemTable.tsx:294 msgid "Expiry Date" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:691 +#: src/forms/PurchaseOrderForms.tsx:743 msgid "Enter an expiry date for received items" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:703 +#: src/forms/PurchaseOrderForms.tsx:755 #: src/forms/StockForms.tsx:728 #: src/pages/company/SupplierPartDetail.tsx:172 #: src/pages/company/SupplierPartDetail.tsx:236 @@ -4701,19 +4708,19 @@ msgstr "" msgid "Packaging" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:727 +#: src/forms/PurchaseOrderForms.tsx:779 #: src/pages/company/SupplierPartDetail.tsx:120 #: src/tables/ColumnRenderers.tsx:332 msgid "Note" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:799 +#: src/forms/PurchaseOrderForms.tsx:851 #: src/pages/company/SupplierPartDetail.tsx:138 #: src/tables/purchasing/SupplierPriceBreakTable.tsx:49 msgid "SKU" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:800 +#: src/forms/PurchaseOrderForms.tsx:852 #: src/tables/part/PartPurchaseOrdersTable.tsx:127 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:213 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:283 @@ -4721,11 +4728,11 @@ msgstr "" msgid "Received" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:817 +#: src/forms/PurchaseOrderForms.tsx:869 msgid "Receive Line Items" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:823 +#: src/forms/PurchaseOrderForms.tsx:875 msgid "Items received" msgstr "" @@ -4737,7 +4744,7 @@ msgstr "" msgid "Item received into stock" msgstr "" -#: src/forms/SalesOrderForms.tsx:401 +#: src/forms/SalesOrderForms.tsx:419 msgid "Leave blank to use the order address" msgstr "" @@ -5932,6 +5939,9 @@ msgstr "" #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:310 #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:401 +#: src/tables/build/BuildAllocatedStockTable.tsx:181 +#: src/tables/build/BuildLineTable.tsx:668 +#: src/tables/sales/SalesOrderAllocationTable.tsx:220 msgid "Confirm Removal" msgstr "" @@ -6870,8 +6880,8 @@ msgstr "" #: src/pages/sales/ReturnOrderDetail.tsx:108 #: src/pages/sales/SalesOrderDetail.tsx:98 #: src/tables/ColumnRenderers.tsx:321 -#: src/tables/build/BuildAllocatedStockTable.tsx:115 -#: src/tables/build/BuildLineTable.tsx:352 +#: src/tables/build/BuildAllocatedStockTable.tsx:112 +#: src/tables/build/BuildLineTable.tsx:353 msgid "Reference" msgstr "" @@ -7132,7 +7142,7 @@ msgstr "" #: src/pages/build/BuildDetail.tsx:742 #: src/pages/stock/StockDetail.tsx:344 -#: src/tables/build/BuildAllocatedStockTable.tsx:85 +#: src/tables/build/BuildAllocatedStockTable.tsx:82 #: src/tables/part/PartBuildAllocationsTable.tsx:45 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:157 #: src/tables/stock/StockTrackingTable.tsx:109 @@ -7600,7 +7610,7 @@ msgstr "" #: src/pages/part/PartDetail.tsx:542 #: src/tables/bom/BomTable.tsx:439 -#: src/tables/build/BuildLineTable.tsx:305 +#: src/tables/build/BuildLineTable.tsx:306 #: src/tables/part/PartTable.tsx:319 #: src/tables/sales/SalesOrderLineItemTable.tsx:138 msgid "Available Stock" @@ -7608,7 +7618,7 @@ msgstr "" #: src/pages/part/PartDetail.tsx:548 #: src/tables/bom/BomTable.tsx:341 -#: src/tables/build/BuildLineTable.tsx:267 +#: src/tables/build/BuildLineTable.tsx:268 #: src/tables/sales/SalesOrderLineItemTable.tsx:180 msgid "On order" msgstr "" @@ -7782,7 +7792,7 @@ msgstr "" #: src/pages/part/PartDetail.tsx:1144 #: src/pages/stock/StockDetail.tsx:884 -#: src/tables/build/BuildLineTable.tsx:761 +#: src/tables/build/BuildLineTable.tsx:768 msgid "Order Stock" msgstr "" @@ -9219,13 +9229,13 @@ msgstr "" #~ msgstr "Show asssmbled items" #: src/tables/bom/BomTable.tsx:315 -#: src/tables/build/BuildLineTable.tsx:276 +#: src/tables/build/BuildLineTable.tsx:277 #: src/tables/part/PartTable.tsx:145 msgid "External stock" msgstr "" #: src/tables/bom/BomTable.tsx:323 -#: src/tables/build/BuildLineTable.tsx:239 +#: src/tables/build/BuildLineTable.tsx:240 msgid "Includes substitute stock" msgstr "" @@ -9234,7 +9244,7 @@ msgstr "" #~ msgstr "Edit Bom Item" #: src/tables/bom/BomTable.tsx:332 -#: src/tables/build/BuildLineTable.tsx:249 +#: src/tables/build/BuildLineTable.tsx:250 #: src/tables/sales/SalesOrderLineItemTable.tsx:166 msgid "Includes variant stock" msgstr "" @@ -9272,8 +9282,8 @@ msgid "Stock Information" msgstr "" #: src/tables/bom/BomTable.tsx:399 -#: src/tables/build/BuildLineTable.tsx:496 -#: src/tables/build/BuildLineTable.tsx:537 +#: src/tables/build/BuildLineTable.tsx:497 +#: src/tables/build/BuildLineTable.tsx:538 msgid "Consumable item" msgstr "" @@ -9282,7 +9292,7 @@ msgid "No available stock" msgstr "" #: src/tables/bom/BomTable.tsx:420 -#: src/tables/build/BuildLineTable.tsx:213 +#: src/tables/build/BuildLineTable.tsx:214 msgid "Show testable items" msgstr "" @@ -9291,7 +9301,7 @@ msgid "Show trackable items" msgstr "" #: src/tables/bom/BomTable.tsx:430 -#: src/tables/build/BuildLineTable.tsx:208 +#: src/tables/build/BuildLineTable.tsx:209 msgid "Show assembled items" msgstr "" @@ -9335,7 +9345,7 @@ msgstr "" #: src/tables/bom/BomTable.tsx:464 #: src/tables/bom/UsedInTable.tsx:85 -#: src/tables/build/BuildLineTable.tsx:202 +#: src/tables/build/BuildLineTable.tsx:203 msgid "Optional" msgstr "" @@ -9345,7 +9355,7 @@ msgid "Show optional items" msgstr "" #: src/tables/bom/BomTable.tsx:469 -#: src/tables/build/BuildLineTable.tsx:197 +#: src/tables/build/BuildLineTable.tsx:198 msgid "Consumable" msgstr "" @@ -9433,7 +9443,7 @@ msgid "Bill of materials cannot be edited, as the part is locked" msgstr "" #: src/tables/bom/UsedInTable.tsx:34 -#: src/tables/build/BuildLineTable.tsx:207 +#: src/tables/build/BuildLineTable.tsx:208 #: src/tables/part/ParametricPartTable.tsx:364 #: src/tables/part/PartBuildAllocationsTable.tsx:60 #: src/tables/part/PartTable.tsx:209 @@ -9455,11 +9465,11 @@ msgstr "" msgid "Show trackable assemblies" msgstr "" -#: src/tables/build/BuildAllocatedStockTable.tsx:67 +#: src/tables/build/BuildAllocatedStockTable.tsx:64 msgid "Allocated to Output" msgstr "" -#: src/tables/build/BuildAllocatedStockTable.tsx:68 +#: src/tables/build/BuildAllocatedStockTable.tsx:65 msgid "Show items allocated to a build output" msgstr "" @@ -9472,7 +9482,7 @@ msgstr "" #~ msgid "Include orders for part variants" #~ msgstr "Include orders for part variants" -#: src/tables/build/BuildAllocatedStockTable.tsx:97 +#: src/tables/build/BuildAllocatedStockTable.tsx:94 #: src/tables/part/PartBuildAllocationsTable.tsx:84 #: src/tables/part/PartPurchaseOrdersTable.tsx:132 #: src/tables/part/PartSalesAllocationsTable.tsx:69 @@ -9482,40 +9492,58 @@ msgid "Order Status" msgstr "" #: src/tables/build/BuildAllocatedStockTable.tsx:164 -#~ msgid "Edit Build Item" -#~ msgstr "Edit Build Item" - -#: src/tables/build/BuildAllocatedStockTable.tsx:167 -#: src/tables/build/BuildLineTable.tsx:650 +#: src/tables/build/BuildLineTable.tsx:651 msgid "Edit Stock Allocation" msgstr "" +#: src/tables/build/BuildAllocatedStockTable.tsx:164 +#~ msgid "Edit Build Item" +#~ msgstr "Edit Build Item" + #: src/tables/build/BuildAllocatedStockTable.tsx:174 #~ msgid "Delete Build Item" #~ msgstr "Delete Build Item" -#: src/tables/build/BuildAllocatedStockTable.tsx:180 -#: src/tables/build/BuildLineTable.tsx:663 -msgid "Delete Stock Allocation" +#: src/tables/build/BuildAllocatedStockTable.tsx:177 +#: src/tables/build/BuildLineTable.tsx:664 +#: src/tables/sales/SalesOrderAllocationTable.tsx:218 +msgid "Remove Allocated Stock" msgstr "" -#: src/tables/build/BuildAllocatedStockTable.tsx:239 +#: src/tables/build/BuildAllocatedStockTable.tsx:180 +#: src/tables/build/BuildLineTable.tsx:663 +#~ msgid "Delete Stock Allocation" +#~ msgstr "Delete Stock Allocation" + +#: src/tables/build/BuildAllocatedStockTable.tsx:182 +#: src/tables/build/BuildLineTable.tsx:669 +#: src/tables/sales/SalesOrderAllocationTable.tsx:221 +msgid "Are you sure you want to remove this allocated stock from the order?" +msgstr "" + +#: src/tables/build/BuildAllocatedStockTable.tsx:242 msgid "Consume" msgstr "" +#: src/tables/build/BuildAllocatedStockTable.tsx:259 +#: src/tables/build/BuildLineTable.tsx:112 +#: src/tables/sales/SalesOrderAllocationTable.tsx:248 +msgid "Remove allocated stock" +msgstr "" + #: src/tables/build/BuildLineTable.tsx:59 #~ msgid "Show lines with available stock" #~ msgstr "Show lines with available stock" -#: src/tables/build/BuildLineTable.tsx:120 +#: src/tables/build/BuildLineTable.tsx:121 msgid "View Stock Item" msgstr "" -#: src/tables/build/BuildLineTable.tsx:183 +#: src/tables/build/BuildLineTable.tsx:184 msgid "Show fully allocated lines" msgstr "" -#: src/tables/build/BuildLineTable.tsx:188 +#: src/tables/build/BuildLineTable.tsx:189 msgid "Show fully consumed lines" msgstr "" @@ -9523,124 +9551,124 @@ msgstr "" #~ msgid "Show allocated lines" #~ msgstr "Show allocated lines" -#: src/tables/build/BuildLineTable.tsx:193 +#: src/tables/build/BuildLineTable.tsx:194 msgid "Show items with sufficient available stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:198 +#: src/tables/build/BuildLineTable.tsx:199 msgid "Show consumable lines" msgstr "" -#: src/tables/build/BuildLineTable.tsx:203 +#: src/tables/build/BuildLineTable.tsx:204 msgid "Show optional lines" msgstr "" -#: src/tables/build/BuildLineTable.tsx:212 +#: src/tables/build/BuildLineTable.tsx:213 #: src/tables/part/PartTable.tsx:233 msgid "Testable" msgstr "" -#: src/tables/build/BuildLineTable.tsx:217 +#: src/tables/build/BuildLineTable.tsx:218 #: src/tables/stock/StockItemTable.tsx:388 msgid "Tracked" msgstr "" -#: src/tables/build/BuildLineTable.tsx:218 +#: src/tables/build/BuildLineTable.tsx:219 msgid "Show tracked lines" msgstr "" -#: src/tables/build/BuildLineTable.tsx:223 +#: src/tables/build/BuildLineTable.tsx:224 msgid "Show items with stock on order" msgstr "" -#: src/tables/build/BuildLineTable.tsx:258 +#: src/tables/build/BuildLineTable.tsx:259 #: src/tables/sales/SalesOrderLineItemTable.tsx:172 msgid "In production" msgstr "" -#: src/tables/build/BuildLineTable.tsx:286 +#: src/tables/build/BuildLineTable.tsx:287 msgid "Insufficient stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:302 +#: src/tables/build/BuildLineTable.tsx:303 #: src/tables/sales/SalesOrderLineItemTable.tsx:160 #: src/tables/stock/StockItemTable.tsx:191 msgid "No stock available" msgstr "" -#: src/tables/build/BuildLineTable.tsx:375 +#: src/tables/build/BuildLineTable.tsx:376 msgid "Gets Inherited" msgstr "" -#: src/tables/build/BuildLineTable.tsx:388 +#: src/tables/build/BuildLineTable.tsx:389 msgid "Unit Quantity" msgstr "" -#: src/tables/build/BuildLineTable.tsx:415 +#: src/tables/build/BuildLineTable.tsx:416 msgid "Setup Quantity" msgstr "" -#: src/tables/build/BuildLineTable.tsx:424 +#: src/tables/build/BuildLineTable.tsx:425 msgid "Attrition" msgstr "" -#: src/tables/build/BuildLineTable.tsx:432 +#: src/tables/build/BuildLineTable.tsx:433 msgid "Rounding Multiple" msgstr "" -#: src/tables/build/BuildLineTable.tsx:441 +#: src/tables/build/BuildLineTable.tsx:442 msgid "BOM Information" msgstr "" -#: src/tables/build/BuildLineTable.tsx:515 +#: src/tables/build/BuildLineTable.tsx:516 #: src/tables/part/PartBuildAllocationsTable.tsx:102 msgid "Fully allocated" msgstr "" -#: src/tables/build/BuildLineTable.tsx:563 +#: src/tables/build/BuildLineTable.tsx:564 #: src/tables/sales/SalesOrderLineItemTable.tsx:311 msgid "Create Build Order" msgstr "" -#: src/tables/build/BuildLineTable.tsx:592 +#: src/tables/build/BuildLineTable.tsx:593 msgid "Auto allocation in progress" msgstr "" -#: src/tables/build/BuildLineTable.tsx:595 -#: src/tables/build/BuildLineTable.tsx:802 +#: src/tables/build/BuildLineTable.tsx:596 +#: src/tables/build/BuildLineTable.tsx:809 msgid "Auto Allocate Stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:596 +#: src/tables/build/BuildLineTable.tsx:597 msgid "Automatically allocate stock to this build according to the selected options" msgstr "" -#: src/tables/build/BuildLineTable.tsx:616 -#: src/tables/build/BuildLineTable.tsx:630 -#: src/tables/build/BuildLineTable.tsx:751 -#: src/tables/build/BuildLineTable.tsx:852 +#: src/tables/build/BuildLineTable.tsx:617 +#: src/tables/build/BuildLineTable.tsx:631 +#: src/tables/build/BuildLineTable.tsx:758 +#: src/tables/build/BuildLineTable.tsx:859 #: src/tables/build/BuildOutputTable.tsx:355 #: src/tables/build/BuildOutputTable.tsx:360 msgid "Deallocate Stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:632 +#: src/tables/build/BuildLineTable.tsx:633 msgid "Deallocate all untracked stock for this build order" msgstr "" -#: src/tables/build/BuildLineTable.tsx:634 +#: src/tables/build/BuildLineTable.tsx:635 msgid "Deallocate stock from the selected line item" msgstr "" -#: src/tables/build/BuildLineTable.tsx:638 +#: src/tables/build/BuildLineTable.tsx:639 msgid "Stock has been deallocated" msgstr "" -#: src/tables/build/BuildLineTable.tsx:771 +#: src/tables/build/BuildLineTable.tsx:778 msgid "Build Stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:784 +#: src/tables/build/BuildLineTable.tsx:791 #: src/tables/sales/SalesOrderLineItemTable.tsx:487 msgid "View Part" msgstr "" @@ -9739,7 +9767,7 @@ msgid "Serialize Build Output" msgstr "" #: src/tables/build/BuildOutputTable.tsx:405 -#: src/tables/part/PartTestResultTable.tsx:310 +#: src/tables/part/PartTestResultTable.tsx:318 #: src/tables/stock/StockItemTable.tsx:328 msgid "Filter by stock status" msgstr "" @@ -9964,8 +9992,8 @@ msgid "View Item" msgstr "" #: src/tables/general/ExtraLineItemTable.tsx:95 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:299 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:403 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:300 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:405 #: src/tables/sales/ReturnOrderLineItemTable.tsx:83 #: src/tables/sales/ReturnOrderLineItemTable.tsx:187 #: src/tables/sales/SalesOrderLineItemTable.tsx:252 @@ -9974,14 +10002,14 @@ msgid "Add Line Item" msgstr "" #: src/tables/general/ExtraLineItemTable.tsx:108 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:320 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:322 #: src/tables/sales/ReturnOrderLineItemTable.tsx:96 #: src/tables/sales/SalesOrderLineItemTable.tsx:271 msgid "Edit Line Item" msgstr "" #: src/tables/general/ExtraLineItemTable.tsx:117 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:329 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:331 #: src/tables/sales/ReturnOrderLineItemTable.tsx:105 #: src/tables/sales/SalesOrderLineItemTable.tsx:280 msgid "Delete Line Item" @@ -10273,7 +10301,7 @@ msgid "Required Stock" msgstr "" #: src/tables/part/PartBuildAllocationsTable.tsx:124 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:381 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:383 msgid "View Build Order" msgstr "" @@ -10617,8 +10645,8 @@ msgstr "" #: src/tables/part/PartTestResultTable.tsx:103 #: src/tables/part/PartTestResultTable.tsx:181 -#: src/tables/part/PartTestResultTable.tsx:320 -#: src/tables/part/PartTestResultTable.tsx:334 +#: src/tables/part/PartTestResultTable.tsx:328 +#: src/tables/part/PartTestResultTable.tsx:342 #: src/tables/stock/StockItemTestResultTable.tsx:296 #: src/tables/stock/StockItemTestResultTable.tsx:368 #: src/tables/stock/StockItemTestResultTable.tsx:429 @@ -10643,7 +10671,7 @@ msgstr "" msgid "No Result" msgstr "" -#: src/tables/part/PartTestResultTable.tsx:298 +#: src/tables/part/PartTestResultTable.tsx:306 msgid "Show build outputs currently in production" msgstr "" @@ -11073,7 +11101,7 @@ msgid "Show manufacturer parts for active manufacturers." msgstr "" #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:115 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:397 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:399 msgid "Import Line Items" msgstr "" @@ -11099,11 +11127,11 @@ msgstr "" #~ msgid "Add line item" #~ msgstr "Add line item" -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:350 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:352 msgid "Receive line item" msgstr "" -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:414 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:416 msgid "Receive items" msgstr "" @@ -11201,25 +11229,25 @@ msgid "Not shipped" msgstr "" #: src/tables/sales/SalesOrderAllocationTable.tsx:211 -#: src/tables/sales/SalesOrderAllocationTable.tsx:229 +#: src/tables/sales/SalesOrderAllocationTable.tsx:235 msgid "Edit Allocation" msgstr "" #: src/tables/sales/SalesOrderAllocationTable.tsx:218 #: src/tables/sales/SalesOrderAllocationTable.tsx:241 -msgid "Delete Allocation" -msgstr "" +#~ msgid "Delete Allocation" +#~ msgstr "Delete Allocation" -#: src/tables/sales/SalesOrderAllocationTable.tsx:252 -#: src/tables/sales/SalesOrderAllocationTable.tsx:253 +#: src/tables/sales/SalesOrderAllocationTable.tsx:261 +#: src/tables/sales/SalesOrderAllocationTable.tsx:262 msgid "View Shipment" msgstr "" -#: src/tables/sales/SalesOrderAllocationTable.tsx:308 +#: src/tables/sales/SalesOrderAllocationTable.tsx:317 msgid "Assign to Shipment" msgstr "" -#: src/tables/sales/SalesOrderAllocationTable.tsx:324 +#: src/tables/sales/SalesOrderAllocationTable.tsx:333 msgid "Assign to shipment" msgstr "" diff --git a/src/frontend/src/locales/de/messages.po b/src/frontend/src/locales/de/messages.po index 19e8ca67b6..71c0f92c93 100644 --- a/src/frontend/src/locales/de/messages.po +++ b/src/frontend/src/locales/de/messages.po @@ -8,7 +8,7 @@ msgstr "" "Language: de\n" "Project-Id-Version: inventree\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2025-11-19 19:39\n" +"PO-Revision-Date: 2025-11-25 11:06\n" "Last-Translator: \n" "Language-Team: German\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" @@ -56,7 +56,7 @@ msgstr "Abbrechen" #: lib/components/RowActions.tsx:136 #: src/components/nav/NavigationDrawer.tsx:190 -#: src/forms/PurchaseOrderForms.tsx:802 +#: src/forms/PurchaseOrderForms.tsx:854 #: src/forms/StockForms.tsx:796 #: src/forms/StockForms.tsx:843 #: src/forms/StockForms.tsx:889 @@ -103,9 +103,9 @@ msgstr "Nein" #: src/forms/BuildForms.tsx:630 #: src/forms/BuildForms.tsx:793 #: src/forms/BuildForms.tsx:896 -#: src/forms/PurchaseOrderForms.tsx:798 +#: src/forms/PurchaseOrderForms.tsx:850 #: src/forms/ReturnOrderForms.tsx:242 -#: src/forms/SalesOrderForms.tsx:305 +#: src/forms/SalesOrderForms.tsx:323 #: src/forms/StockForms.tsx:360 #: src/forms/StockForms.tsx:791 #: src/forms/StockForms.tsx:838 @@ -119,6 +119,7 @@ msgstr "Nein" #: src/pages/build/BuildDetail.tsx:200 #: src/pages/part/PartDetail.tsx:1207 #: src/tables/ColumnRenderers.tsx:91 +#: src/tables/part/PartTestResultTable.tsx:247 #: src/tables/part/RelatedPartTable.tsx:53 #: src/tables/stock/StockTrackingTable.tsx:87 msgid "Part" @@ -158,7 +159,7 @@ msgstr "Testvorlagen für Teil" #: src/components/wizards/OrderPartsWizard.tsx:290 #: src/pages/company/SupplierPartDetail.tsx:413 #: src/pages/stock/StockDetail.tsx:289 -#: src/tables/build/BuildAllocatedStockTable.tsx:155 +#: src/tables/build/BuildAllocatedStockTable.tsx:152 #: src/tables/part/PartPurchaseOrdersTable.tsx:50 #: src/tables/purchasing/SupplierPartTable.tsx:83 #: src/tables/stock/StockItemTable.tsx:247 @@ -201,9 +202,9 @@ msgstr "Teil-Kategorien" #: src/forms/BuildForms.tsx:473 #: src/forms/BuildForms.tsx:633 #: src/forms/BuildForms.tsx:794 -#: src/forms/SalesOrderForms.tsx:307 +#: src/forms/SalesOrderForms.tsx:325 #: src/pages/stock/StockDetail.tsx:1005 -#: src/tables/part/PartTestResultTable.tsx:248 +#: src/tables/part/PartTestResultTable.tsx:256 #: src/tables/stock/StockTrackingTable.tsx:48 #: src/tables/stock/StockTrackingTable.tsx:55 msgid "Stock Item" @@ -517,7 +518,7 @@ msgstr "Auswahlliste" #: src/components/dashboard/DashboardLayout.tsx:281 #: src/components/editors/NotesEditor.tsx:74 #: src/components/editors/TemplateEditor/TemplateEditor.tsx:158 -#: src/components/forms/fields/ApiFormField.tsx:273 +#: src/components/forms/fields/ApiFormField.tsx:237 #: src/components/forms/fields/TableField.tsx:45 #: src/components/importer/ImportDataSelector.tsx:192 #: src/components/importer/ImporterColumnSelector.tsx:234 @@ -642,8 +643,8 @@ msgstr "Barcode-Daten eingeben" #: src/components/barcodes/BarcodeScanDialog.tsx:49 #: src/components/buttons/ScanButton.tsx:15 #: src/components/nav/NavigationDrawer.tsx:122 -#: src/forms/PurchaseOrderForms.tsx:457 -#: src/forms/PurchaseOrderForms.tsx:563 +#: src/forms/PurchaseOrderForms.tsx:509 +#: src/forms/PurchaseOrderForms.tsx:615 msgid "Scan Barcode" msgstr "Barcode scannen" @@ -728,7 +729,7 @@ msgstr "Die Verknüpfung zum zugehörigen Barcode wird entfernt" #: src/components/barcodes/QRCode.tsx:205 #: src/components/items/ActionDropdown.tsx:192 -#: src/forms/PurchaseOrderForms.tsx:554 +#: src/forms/PurchaseOrderForms.tsx:606 msgid "Unlink Barcode" msgstr "Verknüpfung des Barcodes aufheben" @@ -1216,6 +1217,12 @@ msgstr "Verknüpftes Bild von diesem Teil entfernen?" #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:884 #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:903 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:254 +#: src/tables/build/BuildAllocatedStockTable.tsx:178 +#: src/tables/build/BuildAllocatedStockTable.tsx:258 +#: src/tables/build/BuildLineTable.tsx:111 +#: src/tables/build/BuildLineTable.tsx:665 +#: src/tables/sales/SalesOrderAllocationTable.tsx:224 +#: src/tables/sales/SalesOrderAllocationTable.tsx:247 msgid "Remove" msgstr "Entfernen" @@ -1241,7 +1248,7 @@ msgid "Upload Error" msgstr "Upload fehlgeschlagen" #: src/components/details/DetailsImage.tsx:250 -#: src/components/forms/fields/TextField.tsx:65 +#: src/components/forms/fields/AutoFillRightSection.tsx:34 msgid "Clear" msgstr "Leeren" @@ -1817,10 +1824,14 @@ msgstr "Gestoppt" msgid "Running" msgstr "Läuft" -#: src/components/forms/fields/ApiFormField.tsx:233 +#: src/components/forms/fields/ApiFormField.tsx:197 msgid "Select file to upload" msgstr "" +#: src/components/forms/fields/AutoFillRightSection.tsx:47 +msgid "Accept suggested value" +msgstr "" + #: src/components/forms/fields/DateField.tsx:76 msgid "Select date" msgstr "" @@ -1875,10 +1886,6 @@ msgstr "Keine Einträge vorhanden" msgid "Add new row" msgstr "Neue Zeile hinzufügen" -#: src/components/forms/fields/TextField.tsx:82 -msgid "Accept suggested value" -msgstr "" - #: src/components/images/DetailsImage.tsx:252 #~ msgid "Select image" #~ msgstr "Select image" @@ -2225,8 +2232,8 @@ msgstr "Keine Gegengenstände" #: src/pages/part/PartDetail.tsx:994 #: src/pages/stock/StockDetail.tsx:265 #: src/pages/stock/StockDetail.tsx:942 -#: src/tables/build/BuildAllocatedStockTable.tsx:135 -#: src/tables/build/BuildLineTable.tsx:192 +#: src/tables/build/BuildAllocatedStockTable.tsx:132 +#: src/tables/build/BuildLineTable.tsx:193 #: src/tables/part/PartTable.tsx:137 #: src/tables/stock/StockItemTable.tsx:182 #: src/tables/stock/StockItemTable.tsx:343 @@ -2784,7 +2791,7 @@ msgstr "Plugin-Informationen" #: src/pages/sales/SalesOrderDetail.tsx:119 #: src/pages/stock/LocationDetail.tsx:102 #: src/tables/ColumnRenderers.tsx:278 -#: src/tables/build/BuildAllocatedStockTable.tsx:91 +#: src/tables/build/BuildAllocatedStockTable.tsx:88 #: src/tables/machine/MachineTypeTable.tsx:161 #: src/tables/machine/MachineTypeTable.tsx:257 #: src/tables/plugin/PluginListTable.tsx:110 @@ -2966,7 +2973,7 @@ msgstr "Kein Bestand" #: src/pages/company/SupplierPartDetail.tsx:394 #: src/pages/part/PartDetail.tsx:1015 #: src/tables/bom/BomTable.tsx:444 -#: src/tables/build/BuildLineTable.tsx:222 +#: src/tables/build/BuildLineTable.tsx:223 #: src/tables/part/PartTable.tsx:108 msgid "On Order" msgstr "In Bestellung" @@ -2976,7 +2983,7 @@ msgstr "In Bestellung" #: src/pages/part/PartDetail.tsx:587 #: src/pages/part/PartDetail.tsx:1021 #: src/pages/stock/StockDetail.tsx:925 -#: src/tables/part/PartTestResultTable.tsx:297 +#: src/tables/part/PartTestResultTable.tsx:305 #: src/tables/stock/StockItemTable.tsx:359 msgid "In Production" msgstr "In Produktion" @@ -3000,7 +3007,7 @@ msgstr "Kategorie" #: src/components/render/Stock.tsx:114 #: src/components/render/Stock.tsx:132 #: src/forms/BuildForms.tsx:795 -#: src/forms/PurchaseOrderForms.tsx:595 +#: src/forms/PurchaseOrderForms.tsx:647 #: src/forms/StockForms.tsx:792 #: src/forms/StockForms.tsx:839 #: src/forms/StockForms.tsx:885 @@ -3023,7 +3030,7 @@ msgstr "Lagerort" #: src/components/render/Stock.tsx:99 #: src/pages/stock/StockDetail.tsx:198 #: src/pages/stock/StockDetail.tsx:930 -#: src/tables/build/BuildAllocatedStockTable.tsx:121 +#: src/tables/build/BuildAllocatedStockTable.tsx:118 #: src/tables/build/BuildOutputTable.tsx:107 #: src/tables/sales/SalesOrderAllocationTable.tsx:142 msgid "Serial Number" @@ -3034,9 +3041,9 @@ msgstr "Seriennummer" #: src/forms/BuildForms.tsx:240 #: src/forms/BuildForms.tsx:634 #: src/forms/BuildForms.tsx:797 -#: src/forms/PurchaseOrderForms.tsx:801 +#: src/forms/PurchaseOrderForms.tsx:853 #: src/forms/ReturnOrderForms.tsx:243 -#: src/forms/SalesOrderForms.tsx:308 +#: src/forms/SalesOrderForms.tsx:326 #: src/forms/StockForms.tsx:841 #: src/pages/part/PartStockHistoryDetail.tsx:56 #: src/pages/part/PartStockHistoryDetail.tsx:210 @@ -3046,9 +3053,9 @@ msgstr "Seriennummer" #: src/pages/part/pricing/PriceBreakPanel.tsx:172 #: src/pages/stock/StockDetail.tsx:258 #: src/pages/stock/StockDetail.tsx:936 -#: src/tables/build/BuildLineTable.tsx:86 +#: src/tables/build/BuildLineTable.tsx:83 #: src/tables/part/PartPurchaseOrdersTable.tsx:94 -#: src/tables/part/PartTestResultTable.tsx:269 +#: src/tables/part/PartTestResultTable.tsx:277 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:175 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:206 #: src/tables/purchasing/SupplierPriceBreakTable.tsx:69 @@ -3070,7 +3077,7 @@ msgstr "Anzahl" #: src/forms/StockForms.tsx:1048 #: src/forms/StockForms.tsx:1096 #: src/forms/StockForms.tsx:1140 -#: src/tables/build/BuildLineTable.tsx:96 +#: src/tables/build/BuildLineTable.tsx:93 msgid "Batch" msgstr "Losnummer" @@ -3671,7 +3678,7 @@ msgstr "" #: src/components/wizards/ImportPartWizard.tsx:691 msgid "Parameters created successfully!" -msgstr "" +msgstr "Parameter erfolgreich angelegt!" #: src/components/wizards/ImportPartWizard.tsx:719 msgid "Failed to create parameters, please fix the errors and try again" @@ -3755,7 +3762,7 @@ msgid "In Stock" msgstr "Auf Lager" #: src/components/wizards/OrderPartsWizard.tsx:146 -#: src/tables/build/BuildLineTable.tsx:404 +#: src/tables/build/BuildLineTable.tsx:405 msgid "Required Quantity" msgstr "Benötigte Menge" @@ -3847,7 +3854,7 @@ msgid "Please correct the errors in the selected parts" msgstr "Bitte korrigieren Sie die Fehler in den ausgewählten Teilen" #: src/components/wizards/OrderPartsWizard.tsx:587 -#: src/tables/build/BuildLineTable.tsx:815 +#: src/tables/build/BuildLineTable.tsx:822 #: src/tables/part/PartTable.tsx:522 #: src/tables/sales/SalesOrderLineItemTable.tsx:370 msgid "Order Parts" @@ -4349,9 +4356,9 @@ msgstr "Ersatz-Teil hinzugefügt" #: src/forms/BuildForms.tsx:333 #: src/forms/BuildForms.tsx:408 #: src/forms/BuildForms.tsx:685 -#: src/tables/build/BuildAllocatedStockTable.tsx:150 +#: src/tables/build/BuildAllocatedStockTable.tsx:147 #: src/tables/build/BuildOutputTable.tsx:582 -#: src/tables/part/PartTestResultTable.tsx:272 +#: src/tables/part/PartTestResultTable.tsx:280 msgid "Build Output" msgstr "Bauprodukt" @@ -4362,7 +4369,7 @@ msgstr "" #: src/forms/BuildForms.tsx:336 #: src/forms/BuildForms.tsx:411 #: src/forms/BuildForms.tsx:475 -#: src/forms/PurchaseOrderForms.tsx:717 +#: src/forms/PurchaseOrderForms.tsx:769 #: src/forms/ReturnOrderForms.tsx:197 #: src/forms/ReturnOrderForms.tsx:244 #: src/forms/StockForms.tsx:712 @@ -4377,7 +4384,7 @@ msgstr "" #: src/tables/build/BuildOutputTable.tsx:404 #: src/tables/machine/MachineListTable.tsx:387 #: src/tables/part/PartPurchaseOrdersTable.tsx:38 -#: src/tables/part/PartTestResultTable.tsx:309 +#: src/tables/part/PartTestResultTable.tsx:317 #: src/tables/sales/ReturnOrderLineItemTable.tsx:138 #: src/tables/sales/ReturnOrderLineItemTable.tsx:176 #: src/tables/settings/CustomStateTable.tsx:79 @@ -4450,8 +4457,8 @@ msgstr "Bauprodukte wurden abgebrochen" #: src/pages/stock/StockDetail.tsx:153 #: src/tables/bom/BomTable.tsx:134 #: src/tables/bom/UsedInTable.tsx:40 -#: src/tables/build/BuildAllocatedStockTable.tsx:108 -#: src/tables/build/BuildLineTable.tsx:336 +#: src/tables/build/BuildAllocatedStockTable.tsx:105 +#: src/tables/build/BuildLineTable.tsx:337 #: src/tables/build/BuildOrderTable.tsx:79 #: src/tables/part/PartSalesAllocationsTable.tsx:61 #: src/tables/part/RelatedPartTable.tsx:73 @@ -4466,47 +4473,47 @@ msgstr "IPN" #: src/forms/BuildForms.tsx:632 #: src/forms/BuildForms.tsx:796 #: src/forms/BuildForms.tsx:897 -#: src/forms/SalesOrderForms.tsx:306 -#: src/tables/build/BuildAllocatedStockTable.tsx:139 -#: src/tables/build/BuildLineTable.tsx:182 +#: src/forms/SalesOrderForms.tsx:324 +#: src/tables/build/BuildAllocatedStockTable.tsx:136 +#: src/tables/build/BuildLineTable.tsx:183 #: src/tables/sales/SalesOrderLineItemTable.tsx:342 #: src/tables/stock/StockItemTable.tsx:338 msgid "Allocated" msgstr "Zugewiesen" #: src/forms/BuildForms.tsx:667 -#: src/forms/SalesOrderForms.tsx:295 +#: src/forms/SalesOrderForms.tsx:313 #: src/pages/build/BuildDetail.tsx:108 #: src/pages/build/BuildDetail.tsx:326 msgid "Source Location" msgstr "Quell Lagerort" #: src/forms/BuildForms.tsx:668 -#: src/forms/SalesOrderForms.tsx:296 +#: src/forms/SalesOrderForms.tsx:314 msgid "Select the source location for the stock allocation" msgstr "" #: src/forms/BuildForms.tsx:700 -#: src/forms/SalesOrderForms.tsx:336 -#: src/tables/build/BuildLineTable.tsx:574 -#: src/tables/build/BuildLineTable.tsx:731 -#: src/tables/build/BuildLineTable.tsx:830 +#: src/forms/SalesOrderForms.tsx:354 +#: src/tables/build/BuildLineTable.tsx:575 +#: src/tables/build/BuildLineTable.tsx:738 +#: src/tables/build/BuildLineTable.tsx:837 #: src/tables/sales/SalesOrderLineItemTable.tsx:380 #: src/tables/sales/SalesOrderLineItemTable.tsx:406 msgid "Allocate Stock" msgstr "Bestand zuweisen" #: src/forms/BuildForms.tsx:703 -#: src/forms/SalesOrderForms.tsx:341 +#: src/forms/SalesOrderForms.tsx:359 msgid "Stock items allocated" msgstr "" #: src/forms/BuildForms.tsx:816 #: src/forms/BuildForms.tsx:917 -#: src/tables/build/BuildAllocatedStockTable.tsx:240 -#: src/tables/build/BuildAllocatedStockTable.tsx:272 -#: src/tables/build/BuildLineTable.tsx:741 -#: src/tables/build/BuildLineTable.tsx:864 +#: src/tables/build/BuildAllocatedStockTable.tsx:243 +#: src/tables/build/BuildAllocatedStockTable.tsx:279 +#: src/tables/build/BuildLineTable.tsx:748 +#: src/tables/build/BuildLineTable.tsx:871 msgid "Consume Stock" msgstr "Lagerbestand verbrauchen" @@ -4521,21 +4528,21 @@ msgstr "" #~ msgstr "Stock items consumed" #: src/forms/BuildForms.tsx:853 -#: src/tables/build/BuildLineTable.tsx:514 +#: src/tables/build/BuildLineTable.tsx:515 #: src/tables/part/PartBuildAllocationsTable.tsx:101 msgid "Fully consumed" msgstr "komplett verbraucht" #: src/forms/BuildForms.tsx:898 -#: src/tables/build/BuildLineTable.tsx:187 +#: src/tables/build/BuildLineTable.tsx:188 #: src/tables/stock/StockItemTable.tsx:367 msgid "Consumed" msgstr "verbraucht" #: src/forms/CommonForms.tsx:88 -#: src/forms/PurchaseOrderForms.tsx:125 +#: src/forms/PurchaseOrderForms.tsx:176 #: src/forms/ReturnOrderForms.tsx:138 -#: src/forms/SalesOrderForms.tsx:164 +#: src/forms/SalesOrderForms.tsx:182 msgid "Select project code for this line item" msgstr "" @@ -4572,127 +4579,127 @@ msgstr "Übergeordnete Teilkategorie" msgid "Subscribe to notifications for this category" msgstr "Benachrichtigungen für diese Kategorie abonnieren" -#: src/forms/PurchaseOrderForms.tsx:388 -msgid "Assign Batch Code and Serial Numbers" -msgstr "Losnummer- und Seriennummer zuweisen" - -#: src/forms/PurchaseOrderForms.tsx:390 -msgid "Assign Batch Code" -msgstr "Losnummer zuweisen" - -#: src/forms/PurchaseOrderForms.tsx:410 -msgid "Choose Location" -msgstr "Lagerort wählen" - -#: src/forms/PurchaseOrderForms.tsx:418 -msgid "Item Destination selected" -msgstr "Teile-Zielort ausgewählt" - #: src/forms/PurchaseOrderForms.tsx:421 #~ msgid "Assign Batch Code{0}" #~ msgstr "Assign Batch Code{0}" -#: src/forms/PurchaseOrderForms.tsx:428 -msgid "Part category default location selected" -msgstr "Standard-Lagerort der Teile-Kategorie ausgewählt" +#: src/forms/PurchaseOrderForms.tsx:440 +msgid "Assign Batch Code and Serial Numbers" +msgstr "Losnummer- und Seriennummer zuweisen" -#: src/forms/PurchaseOrderForms.tsx:438 -msgid "Received stock location selected" -msgstr "Lagerort zuvor empfangener Artikel ausgewählt" +#: src/forms/PurchaseOrderForms.tsx:442 +msgid "Assign Batch Code" +msgstr "Losnummer zuweisen" #: src/forms/PurchaseOrderForms.tsx:444 #: src/forms/StockForms.tsx:428 #~ msgid "Remove item from list" #~ msgstr "Remove item from list" -#: src/forms/PurchaseOrderForms.tsx:446 +#: src/forms/PurchaseOrderForms.tsx:462 +msgid "Choose Location" +msgstr "Lagerort wählen" + +#: src/forms/PurchaseOrderForms.tsx:470 +msgid "Item Destination selected" +msgstr "Teile-Zielort ausgewählt" + +#: src/forms/PurchaseOrderForms.tsx:480 +msgid "Part category default location selected" +msgstr "Standard-Lagerort der Teile-Kategorie ausgewählt" + +#: src/forms/PurchaseOrderForms.tsx:490 +msgid "Received stock location selected" +msgstr "Lagerort zuvor empfangener Artikel ausgewählt" + +#: src/forms/PurchaseOrderForms.tsx:498 msgid "Default location selected" msgstr "Standard-Lagerort ausgewählt" -#: src/forms/PurchaseOrderForms.tsx:507 +#: src/forms/PurchaseOrderForms.tsx:559 msgid "Set Location" msgstr "Lagerort festlegen" -#: src/forms/PurchaseOrderForms.tsx:524 -msgid "Set Expiry Date" -msgstr "Ablaufdatum festlegen" - -#: src/forms/PurchaseOrderForms.tsx:532 -#: src/forms/StockForms.tsx:693 -msgid "Adjust Packaging" -msgstr "Verpackung anpassen" - -#: src/forms/PurchaseOrderForms.tsx:540 -#: src/forms/StockForms.tsx:684 -#: src/hooks/UseStockAdjustActions.tsx:148 -msgid "Change Status" -msgstr "Status ändern" - -#: src/forms/PurchaseOrderForms.tsx:546 -msgid "Add Note" -msgstr "Notiz hinzufügen" - #: src/forms/PurchaseOrderForms.tsx:566 #~ msgid "Serial numbers" #~ msgstr "Serial numbers" +#: src/forms/PurchaseOrderForms.tsx:576 +msgid "Set Expiry Date" +msgstr "Ablaufdatum festlegen" + #: src/forms/PurchaseOrderForms.tsx:582 #~ msgid "Store at line item destination" #~ msgstr "Store at line item destination" -#: src/forms/PurchaseOrderForms.tsx:610 -msgid "Store at default location" -msgstr "Am Standard-Lagerort einbuchen" +#: src/forms/PurchaseOrderForms.tsx:584 +#: src/forms/StockForms.tsx:693 +msgid "Adjust Packaging" +msgstr "Verpackung anpassen" -#: src/forms/PurchaseOrderForms.tsx:625 -msgid "Store at line item destination " -msgstr "" +#: src/forms/PurchaseOrderForms.tsx:592 +#: src/forms/StockForms.tsx:684 +#: src/hooks/UseStockAdjustActions.tsx:148 +msgid "Change Status" +msgstr "Status ändern" -#: src/forms/PurchaseOrderForms.tsx:637 -msgid "Store with already received stock" -msgstr "Bei bereits vorhandenen Lagerbestand einbuchen" +#: src/forms/PurchaseOrderForms.tsx:598 +msgid "Add Note" +msgstr "Notiz hinzufügen" #: src/forms/PurchaseOrderForms.tsx:658 #~ msgid "Receive line items" #~ msgstr "Receive line items" -#: src/forms/PurchaseOrderForms.tsx:661 +#: src/forms/PurchaseOrderForms.tsx:662 +msgid "Store at default location" +msgstr "Am Standard-Lagerort einbuchen" + +#: src/forms/PurchaseOrderForms.tsx:677 +msgid "Store at line item destination " +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:689 +msgid "Store with already received stock" +msgstr "Bei bereits vorhandenen Lagerbestand einbuchen" + +#: src/forms/PurchaseOrderForms.tsx:713 #: src/pages/build/BuildDetail.tsx:340 #: src/pages/stock/StockDetail.tsx:280 #: src/pages/stock/StockDetail.tsx:952 #: src/tables/Filter.tsx:83 -#: src/tables/build/BuildAllocatedStockTable.tsx:128 +#: src/tables/build/BuildAllocatedStockTable.tsx:125 #: src/tables/build/BuildOutputTable.tsx:112 -#: src/tables/part/PartTestResultTable.tsx:260 -#: src/tables/part/PartTestResultTable.tsx:281 +#: src/tables/part/PartTestResultTable.tsx:268 +#: src/tables/part/PartTestResultTable.tsx:289 #: src/tables/sales/SalesOrderAllocationTable.tsx:149 msgid "Batch Code" msgstr "Losnummer" -#: src/forms/PurchaseOrderForms.tsx:662 +#: src/forms/PurchaseOrderForms.tsx:714 msgid "Enter batch code for received items" msgstr "Losnummern eingeben für empfangene Gegenstände" -#: src/forms/PurchaseOrderForms.tsx:675 +#: src/forms/PurchaseOrderForms.tsx:727 #: src/forms/StockForms.tsx:218 msgid "Serial Numbers" msgstr "Seriennummern" -#: src/forms/PurchaseOrderForms.tsx:676 +#: src/forms/PurchaseOrderForms.tsx:728 msgid "Enter serial numbers for received items" msgstr "Seriennummern eingeben für empfangene Gegenstände" -#: src/forms/PurchaseOrderForms.tsx:690 +#: src/forms/PurchaseOrderForms.tsx:742 #: src/pages/stock/StockDetail.tsx:382 #: src/tables/stock/StockItemTable.tsx:294 msgid "Expiry Date" msgstr "Ablaufdatum" -#: src/forms/PurchaseOrderForms.tsx:691 +#: src/forms/PurchaseOrderForms.tsx:743 msgid "Enter an expiry date for received items" msgstr "Ablaufdatum eingeben für empfangene Gegenstände" -#: src/forms/PurchaseOrderForms.tsx:703 +#: src/forms/PurchaseOrderForms.tsx:755 #: src/forms/StockForms.tsx:728 #: src/pages/company/SupplierPartDetail.tsx:172 #: src/pages/company/SupplierPartDetail.tsx:236 @@ -4701,19 +4708,19 @@ msgstr "Ablaufdatum eingeben für empfangene Gegenstände" msgid "Packaging" msgstr "Verpackung" -#: src/forms/PurchaseOrderForms.tsx:727 +#: src/forms/PurchaseOrderForms.tsx:779 #: src/pages/company/SupplierPartDetail.tsx:120 #: src/tables/ColumnRenderers.tsx:332 msgid "Note" msgstr "Notiz" -#: src/forms/PurchaseOrderForms.tsx:799 +#: src/forms/PurchaseOrderForms.tsx:851 #: src/pages/company/SupplierPartDetail.tsx:138 #: src/tables/purchasing/SupplierPriceBreakTable.tsx:49 msgid "SKU" msgstr "SKU" -#: src/forms/PurchaseOrderForms.tsx:800 +#: src/forms/PurchaseOrderForms.tsx:852 #: src/tables/part/PartPurchaseOrdersTable.tsx:127 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:213 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:283 @@ -4721,11 +4728,11 @@ msgstr "SKU" msgid "Received" msgstr "Erhalten" -#: src/forms/PurchaseOrderForms.tsx:817 +#: src/forms/PurchaseOrderForms.tsx:869 msgid "Receive Line Items" msgstr "Positionen empfangen" -#: src/forms/PurchaseOrderForms.tsx:823 +#: src/forms/PurchaseOrderForms.tsx:875 msgid "Items received" msgstr "Empfangene Gegenstände" @@ -4737,7 +4744,7 @@ msgstr "Teile empfangen" msgid "Item received into stock" msgstr "" -#: src/forms/SalesOrderForms.tsx:401 +#: src/forms/SalesOrderForms.tsx:419 msgid "Leave blank to use the order address" msgstr "" @@ -5932,6 +5939,9 @@ msgstr "" #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:310 #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:401 +#: src/tables/build/BuildAllocatedStockTable.tsx:181 +#: src/tables/build/BuildLineTable.tsx:668 +#: src/tables/sales/SalesOrderAllocationTable.tsx:220 msgid "Confirm Removal" msgstr "" @@ -6870,8 +6880,8 @@ msgstr "Extern" #: src/pages/sales/ReturnOrderDetail.tsx:108 #: src/pages/sales/SalesOrderDetail.tsx:98 #: src/tables/ColumnRenderers.tsx:321 -#: src/tables/build/BuildAllocatedStockTable.tsx:115 -#: src/tables/build/BuildLineTable.tsx:352 +#: src/tables/build/BuildAllocatedStockTable.tsx:112 +#: src/tables/build/BuildLineTable.tsx:353 msgid "Reference" msgstr "Referenz" @@ -7132,7 +7142,7 @@ msgstr "Bestellung stornieren" #: src/pages/build/BuildDetail.tsx:742 #: src/pages/stock/StockDetail.tsx:344 -#: src/tables/build/BuildAllocatedStockTable.tsx:85 +#: src/tables/build/BuildAllocatedStockTable.tsx:82 #: src/tables/part/PartBuildAllocationsTable.tsx:45 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:157 #: src/tables/stock/StockTrackingTable.tsx:109 @@ -7600,7 +7610,7 @@ msgstr "Schlüsselwörter" #: src/pages/part/PartDetail.tsx:542 #: src/tables/bom/BomTable.tsx:439 -#: src/tables/build/BuildLineTable.tsx:305 +#: src/tables/build/BuildLineTable.tsx:306 #: src/tables/part/PartTable.tsx:319 #: src/tables/sales/SalesOrderLineItemTable.tsx:138 msgid "Available Stock" @@ -7608,7 +7618,7 @@ msgstr "Verfügbarer Bestand" #: src/pages/part/PartDetail.tsx:548 #: src/tables/bom/BomTable.tsx:341 -#: src/tables/build/BuildLineTable.tsx:267 +#: src/tables/build/BuildLineTable.tsx:268 #: src/tables/sales/SalesOrderLineItemTable.tsx:180 msgid "On order" msgstr "Bestellt" @@ -7782,7 +7792,7 @@ msgstr "Bestellung" #: src/pages/part/PartDetail.tsx:1144 #: src/pages/stock/StockDetail.tsx:884 -#: src/tables/build/BuildLineTable.tsx:761 +#: src/tables/build/BuildLineTable.tsx:768 msgid "Order Stock" msgstr "Bestand bestellen" @@ -9219,13 +9229,13 @@ msgstr "Virtuelles Teil" #~ msgstr "Show asssmbled items" #: src/tables/bom/BomTable.tsx:315 -#: src/tables/build/BuildLineTable.tsx:276 +#: src/tables/build/BuildLineTable.tsx:277 #: src/tables/part/PartTable.tsx:145 msgid "External stock" msgstr "Externer Bestand" #: src/tables/bom/BomTable.tsx:323 -#: src/tables/build/BuildLineTable.tsx:239 +#: src/tables/build/BuildLineTable.tsx:240 msgid "Includes substitute stock" msgstr "Ersatz Bestand einbeziehen" @@ -9234,7 +9244,7 @@ msgstr "Ersatz Bestand einbeziehen" #~ msgstr "Edit Bom Item" #: src/tables/bom/BomTable.tsx:332 -#: src/tables/build/BuildLineTable.tsx:249 +#: src/tables/build/BuildLineTable.tsx:250 #: src/tables/sales/SalesOrderLineItemTable.tsx:166 msgid "Includes variant stock" msgstr "Alternatives Lager einschließen" @@ -9272,8 +9282,8 @@ msgid "Stock Information" msgstr "Lagerinformationen" #: src/tables/bom/BomTable.tsx:399 -#: src/tables/build/BuildLineTable.tsx:496 -#: src/tables/build/BuildLineTable.tsx:537 +#: src/tables/build/BuildLineTable.tsx:497 +#: src/tables/build/BuildLineTable.tsx:538 msgid "Consumable item" msgstr "Verbrauchsartikel" @@ -9282,7 +9292,7 @@ msgid "No available stock" msgstr "Kein Lagerbestand verfügbar" #: src/tables/bom/BomTable.tsx:420 -#: src/tables/build/BuildLineTable.tsx:213 +#: src/tables/build/BuildLineTable.tsx:214 msgid "Show testable items" msgstr "" @@ -9291,7 +9301,7 @@ msgid "Show trackable items" msgstr "Nachverfolgbare Teile anzeigen" #: src/tables/bom/BomTable.tsx:430 -#: src/tables/build/BuildLineTable.tsx:208 +#: src/tables/build/BuildLineTable.tsx:209 msgid "Show assembled items" msgstr "" @@ -9335,7 +9345,7 @@ msgstr "" #: src/tables/bom/BomTable.tsx:464 #: src/tables/bom/UsedInTable.tsx:85 -#: src/tables/build/BuildLineTable.tsx:202 +#: src/tables/build/BuildLineTable.tsx:203 msgid "Optional" msgstr "Optional" @@ -9345,7 +9355,7 @@ msgid "Show optional items" msgstr "Optionale Elemente anzeigen" #: src/tables/bom/BomTable.tsx:469 -#: src/tables/build/BuildLineTable.tsx:197 +#: src/tables/build/BuildLineTable.tsx:198 msgid "Consumable" msgstr "Verbrauchsmaterial" @@ -9433,7 +9443,7 @@ msgid "Bill of materials cannot be edited, as the part is locked" msgstr "BOM kann nicht bearbeitet werden, weil das Teil gesperrt ist" #: src/tables/bom/UsedInTable.tsx:34 -#: src/tables/build/BuildLineTable.tsx:207 +#: src/tables/build/BuildLineTable.tsx:208 #: src/tables/part/ParametricPartTable.tsx:364 #: src/tables/part/PartBuildAllocationsTable.tsx:60 #: src/tables/part/PartTable.tsx:209 @@ -9455,11 +9465,11 @@ msgstr "Nachverfolgbar" msgid "Show trackable assemblies" msgstr "Nachverfolgbare Baugruppen anzeigen" -#: src/tables/build/BuildAllocatedStockTable.tsx:67 +#: src/tables/build/BuildAllocatedStockTable.tsx:64 msgid "Allocated to Output" msgstr "" -#: src/tables/build/BuildAllocatedStockTable.tsx:68 +#: src/tables/build/BuildAllocatedStockTable.tsx:65 msgid "Show items allocated to a build output" msgstr "" @@ -9472,7 +9482,7 @@ msgstr "" #~ msgid "Include orders for part variants" #~ msgstr "Include orders for part variants" -#: src/tables/build/BuildAllocatedStockTable.tsx:97 +#: src/tables/build/BuildAllocatedStockTable.tsx:94 #: src/tables/part/PartBuildAllocationsTable.tsx:84 #: src/tables/part/PartPurchaseOrdersTable.tsx:132 #: src/tables/part/PartSalesAllocationsTable.tsx:69 @@ -9482,40 +9492,58 @@ msgid "Order Status" msgstr "Bestellstatus" #: src/tables/build/BuildAllocatedStockTable.tsx:164 -#~ msgid "Edit Build Item" -#~ msgstr "Edit Build Item" - -#: src/tables/build/BuildAllocatedStockTable.tsx:167 -#: src/tables/build/BuildLineTable.tsx:650 +#: src/tables/build/BuildLineTable.tsx:651 msgid "Edit Stock Allocation" msgstr "Bestands-Zuordnung bearbeiten" +#: src/tables/build/BuildAllocatedStockTable.tsx:164 +#~ msgid "Edit Build Item" +#~ msgstr "Edit Build Item" + #: src/tables/build/BuildAllocatedStockTable.tsx:174 #~ msgid "Delete Build Item" #~ msgstr "Delete Build Item" +#: src/tables/build/BuildAllocatedStockTable.tsx:177 +#: src/tables/build/BuildLineTable.tsx:664 +#: src/tables/sales/SalesOrderAllocationTable.tsx:218 +msgid "Remove Allocated Stock" +msgstr "" + #: src/tables/build/BuildAllocatedStockTable.tsx:180 #: src/tables/build/BuildLineTable.tsx:663 -msgid "Delete Stock Allocation" -msgstr "Bestands-Zuordnung löschen" +#~ msgid "Delete Stock Allocation" +#~ msgstr "Delete Stock Allocation" -#: src/tables/build/BuildAllocatedStockTable.tsx:239 +#: src/tables/build/BuildAllocatedStockTable.tsx:182 +#: src/tables/build/BuildLineTable.tsx:669 +#: src/tables/sales/SalesOrderAllocationTable.tsx:221 +msgid "Are you sure you want to remove this allocated stock from the order?" +msgstr "" + +#: src/tables/build/BuildAllocatedStockTable.tsx:242 msgid "Consume" msgstr "Verbrauchen" +#: src/tables/build/BuildAllocatedStockTable.tsx:259 +#: src/tables/build/BuildLineTable.tsx:112 +#: src/tables/sales/SalesOrderAllocationTable.tsx:248 +msgid "Remove allocated stock" +msgstr "" + #: src/tables/build/BuildLineTable.tsx:59 #~ msgid "Show lines with available stock" #~ msgstr "Show lines with available stock" -#: src/tables/build/BuildLineTable.tsx:120 +#: src/tables/build/BuildLineTable.tsx:121 msgid "View Stock Item" msgstr "" -#: src/tables/build/BuildLineTable.tsx:183 +#: src/tables/build/BuildLineTable.tsx:184 msgid "Show fully allocated lines" msgstr "" -#: src/tables/build/BuildLineTable.tsx:188 +#: src/tables/build/BuildLineTable.tsx:189 msgid "Show fully consumed lines" msgstr "" @@ -9523,124 +9551,124 @@ msgstr "" #~ msgid "Show allocated lines" #~ msgstr "Show allocated lines" -#: src/tables/build/BuildLineTable.tsx:193 +#: src/tables/build/BuildLineTable.tsx:194 msgid "Show items with sufficient available stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:198 +#: src/tables/build/BuildLineTable.tsx:199 msgid "Show consumable lines" msgstr "Verbrauchsmaterialien anzeigen" -#: src/tables/build/BuildLineTable.tsx:203 +#: src/tables/build/BuildLineTable.tsx:204 msgid "Show optional lines" msgstr "Optionale Positionen anzeigen" -#: src/tables/build/BuildLineTable.tsx:212 +#: src/tables/build/BuildLineTable.tsx:213 #: src/tables/part/PartTable.tsx:233 msgid "Testable" msgstr "Prüfbar" -#: src/tables/build/BuildLineTable.tsx:217 +#: src/tables/build/BuildLineTable.tsx:218 #: src/tables/stock/StockItemTable.tsx:388 msgid "Tracked" msgstr "Nachverfolgbare Freigabe" -#: src/tables/build/BuildLineTable.tsx:218 +#: src/tables/build/BuildLineTable.tsx:219 msgid "Show tracked lines" msgstr "Verfolgbare Positionen anzeigen" -#: src/tables/build/BuildLineTable.tsx:223 +#: src/tables/build/BuildLineTable.tsx:224 msgid "Show items with stock on order" msgstr "" -#: src/tables/build/BuildLineTable.tsx:258 +#: src/tables/build/BuildLineTable.tsx:259 #: src/tables/sales/SalesOrderLineItemTable.tsx:172 msgid "In production" msgstr "In Produktion" -#: src/tables/build/BuildLineTable.tsx:286 +#: src/tables/build/BuildLineTable.tsx:287 msgid "Insufficient stock" msgstr "Nicht genug Lagermenge" -#: src/tables/build/BuildLineTable.tsx:302 +#: src/tables/build/BuildLineTable.tsx:303 #: src/tables/sales/SalesOrderLineItemTable.tsx:160 #: src/tables/stock/StockItemTable.tsx:191 msgid "No stock available" msgstr "Kein Lagerbestand verfügbar" -#: src/tables/build/BuildLineTable.tsx:375 +#: src/tables/build/BuildLineTable.tsx:376 msgid "Gets Inherited" msgstr "Wird vererbt" -#: src/tables/build/BuildLineTable.tsx:388 +#: src/tables/build/BuildLineTable.tsx:389 msgid "Unit Quantity" msgstr "Einheiten Menge" -#: src/tables/build/BuildLineTable.tsx:415 +#: src/tables/build/BuildLineTable.tsx:416 msgid "Setup Quantity" msgstr "" -#: src/tables/build/BuildLineTable.tsx:424 +#: src/tables/build/BuildLineTable.tsx:425 msgid "Attrition" msgstr "" -#: src/tables/build/BuildLineTable.tsx:432 +#: src/tables/build/BuildLineTable.tsx:433 msgid "Rounding Multiple" msgstr "" -#: src/tables/build/BuildLineTable.tsx:441 +#: src/tables/build/BuildLineTable.tsx:442 msgid "BOM Information" msgstr "BOM Information" -#: src/tables/build/BuildLineTable.tsx:515 +#: src/tables/build/BuildLineTable.tsx:516 #: src/tables/part/PartBuildAllocationsTable.tsx:102 msgid "Fully allocated" msgstr "Komplett zugewiesen" -#: src/tables/build/BuildLineTable.tsx:563 +#: src/tables/build/BuildLineTable.tsx:564 #: src/tables/sales/SalesOrderLineItemTable.tsx:311 msgid "Create Build Order" msgstr "" -#: src/tables/build/BuildLineTable.tsx:592 +#: src/tables/build/BuildLineTable.tsx:593 msgid "Auto allocation in progress" msgstr "" -#: src/tables/build/BuildLineTable.tsx:595 -#: src/tables/build/BuildLineTable.tsx:802 +#: src/tables/build/BuildLineTable.tsx:596 +#: src/tables/build/BuildLineTable.tsx:809 msgid "Auto Allocate Stock" msgstr "Bestand automatisch zuordnen" -#: src/tables/build/BuildLineTable.tsx:596 +#: src/tables/build/BuildLineTable.tsx:597 msgid "Automatically allocate stock to this build according to the selected options" msgstr "" -#: src/tables/build/BuildLineTable.tsx:616 -#: src/tables/build/BuildLineTable.tsx:630 -#: src/tables/build/BuildLineTable.tsx:751 -#: src/tables/build/BuildLineTable.tsx:852 +#: src/tables/build/BuildLineTable.tsx:617 +#: src/tables/build/BuildLineTable.tsx:631 +#: src/tables/build/BuildLineTable.tsx:758 +#: src/tables/build/BuildLineTable.tsx:859 #: src/tables/build/BuildOutputTable.tsx:355 #: src/tables/build/BuildOutputTable.tsx:360 msgid "Deallocate Stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:632 +#: src/tables/build/BuildLineTable.tsx:633 msgid "Deallocate all untracked stock for this build order" msgstr "" -#: src/tables/build/BuildLineTable.tsx:634 +#: src/tables/build/BuildLineTable.tsx:635 msgid "Deallocate stock from the selected line item" msgstr "" -#: src/tables/build/BuildLineTable.tsx:638 +#: src/tables/build/BuildLineTable.tsx:639 msgid "Stock has been deallocated" msgstr "" -#: src/tables/build/BuildLineTable.tsx:771 +#: src/tables/build/BuildLineTable.tsx:778 msgid "Build Stock" msgstr "Bestand bauen" -#: src/tables/build/BuildLineTable.tsx:784 +#: src/tables/build/BuildLineTable.tsx:791 #: src/tables/sales/SalesOrderLineItemTable.tsx:487 msgid "View Part" msgstr "Teil anzeigen" @@ -9739,7 +9767,7 @@ msgid "Serialize Build Output" msgstr "" #: src/tables/build/BuildOutputTable.tsx:405 -#: src/tables/part/PartTestResultTable.tsx:310 +#: src/tables/part/PartTestResultTable.tsx:318 #: src/tables/stock/StockItemTable.tsx:328 msgid "Filter by stock status" msgstr "Nach Lagerstatus filtern" @@ -9964,8 +9992,8 @@ msgid "View Item" msgstr "Element anzeigen" #: src/tables/general/ExtraLineItemTable.tsx:95 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:299 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:403 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:300 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:405 #: src/tables/sales/ReturnOrderLineItemTable.tsx:83 #: src/tables/sales/ReturnOrderLineItemTable.tsx:187 #: src/tables/sales/SalesOrderLineItemTable.tsx:252 @@ -9974,14 +10002,14 @@ msgid "Add Line Item" msgstr "Position hinzufügen" #: src/tables/general/ExtraLineItemTable.tsx:108 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:320 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:322 #: src/tables/sales/ReturnOrderLineItemTable.tsx:96 #: src/tables/sales/SalesOrderLineItemTable.tsx:271 msgid "Edit Line Item" msgstr "Position bearbeiten" #: src/tables/general/ExtraLineItemTable.tsx:117 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:329 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:331 #: src/tables/sales/ReturnOrderLineItemTable.tsx:105 #: src/tables/sales/SalesOrderLineItemTable.tsx:280 msgid "Delete Line Item" @@ -10273,7 +10301,7 @@ msgid "Required Stock" msgstr "Benötigter Bestand" #: src/tables/part/PartBuildAllocationsTable.tsx:124 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:381 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:383 msgid "View Build Order" msgstr "" @@ -10617,8 +10645,8 @@ msgstr "" #: src/tables/part/PartTestResultTable.tsx:103 #: src/tables/part/PartTestResultTable.tsx:181 -#: src/tables/part/PartTestResultTable.tsx:320 -#: src/tables/part/PartTestResultTable.tsx:334 +#: src/tables/part/PartTestResultTable.tsx:328 +#: src/tables/part/PartTestResultTable.tsx:342 #: src/tables/stock/StockItemTestResultTable.tsx:296 #: src/tables/stock/StockItemTestResultTable.tsx:368 #: src/tables/stock/StockItemTestResultTable.tsx:429 @@ -10643,7 +10671,7 @@ msgstr "Testergebnisse hinzugefügt" msgid "No Result" msgstr "Kein Ergebnis" -#: src/tables/part/PartTestResultTable.tsx:298 +#: src/tables/part/PartTestResultTable.tsx:306 msgid "Show build outputs currently in production" msgstr "" @@ -11073,7 +11101,7 @@ msgid "Show manufacturer parts for active manufacturers." msgstr "" #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:115 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:397 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:399 msgid "Import Line Items" msgstr "" @@ -11099,11 +11127,11 @@ msgstr "" #~ msgid "Add line item" #~ msgstr "Add line item" -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:350 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:352 msgid "Receive line item" msgstr "Position empfangen" -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:414 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:416 msgid "Receive items" msgstr "Erhaltene Artikel" @@ -11201,25 +11229,25 @@ msgid "Not shipped" msgstr "Nicht versendet" #: src/tables/sales/SalesOrderAllocationTable.tsx:211 -#: src/tables/sales/SalesOrderAllocationTable.tsx:229 +#: src/tables/sales/SalesOrderAllocationTable.tsx:235 msgid "Edit Allocation" msgstr "Zuordnung bearbeiten" #: src/tables/sales/SalesOrderAllocationTable.tsx:218 #: src/tables/sales/SalesOrderAllocationTable.tsx:241 -msgid "Delete Allocation" -msgstr "Zuordnung entfernen" +#~ msgid "Delete Allocation" +#~ msgstr "Delete Allocation" -#: src/tables/sales/SalesOrderAllocationTable.tsx:252 -#: src/tables/sales/SalesOrderAllocationTable.tsx:253 +#: src/tables/sales/SalesOrderAllocationTable.tsx:261 +#: src/tables/sales/SalesOrderAllocationTable.tsx:262 msgid "View Shipment" msgstr "Lieferung anzeigen" -#: src/tables/sales/SalesOrderAllocationTable.tsx:308 +#: src/tables/sales/SalesOrderAllocationTable.tsx:317 msgid "Assign to Shipment" msgstr "Sendung zuweisen" -#: src/tables/sales/SalesOrderAllocationTable.tsx:324 +#: src/tables/sales/SalesOrderAllocationTable.tsx:333 msgid "Assign to shipment" msgstr "Sendung zuweisen" diff --git a/src/frontend/src/locales/el/messages.po b/src/frontend/src/locales/el/messages.po index 8a83aa70d4..b97f1533cd 100644 --- a/src/frontend/src/locales/el/messages.po +++ b/src/frontend/src/locales/el/messages.po @@ -8,7 +8,7 @@ msgstr "" "Language: el\n" "Project-Id-Version: inventree\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2025-11-19 19:39\n" +"PO-Revision-Date: 2025-11-22 06:25\n" "Last-Translator: \n" "Language-Team: Greek\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" @@ -22,12 +22,12 @@ msgstr "" #: src/components/items/ActionDropdown.tsx:289 #: src/pages/Index/Scan.tsx:64 msgid "Duplicate" -msgstr "" +msgstr "Δημιουργία αντιγράφου" #: lib/components/RowActions.tsx:46 #: src/components/items/ActionDropdown.tsx:245 msgid "Edit" -msgstr "" +msgstr "Επεξεργασία" #: lib/components/RowActions.tsx:56 #: src/components/forms/ApiForm.tsx:735 @@ -56,7 +56,7 @@ msgstr "Ακύρωση" #: lib/components/RowActions.tsx:136 #: src/components/nav/NavigationDrawer.tsx:190 -#: src/forms/PurchaseOrderForms.tsx:802 +#: src/forms/PurchaseOrderForms.tsx:854 #: src/forms/StockForms.tsx:796 #: src/forms/StockForms.tsx:843 #: src/forms/StockForms.tsx:889 @@ -65,7 +65,7 @@ msgstr "Ακύρωση" #: src/forms/StockForms.tsx:1050 #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:962 msgid "Actions" -msgstr "" +msgstr "Ενέργειες" #: lib/components/SearchInput.tsx:34 #: src/components/forms/fields/RelatedModelField.tsx:408 @@ -75,25 +75,25 @@ msgstr "" #: src/pages/Index/Settings/UserSettings.tsx:74 #: src/pages/part/PartDetail.tsx:1155 msgid "Search" -msgstr "" +msgstr "Αναζήτηση" #: lib/components/YesNoButton.tsx:20 msgid "Pass" -msgstr "" +msgstr "Επιτυχία" #: lib/components/YesNoButton.tsx:21 msgid "Fail" -msgstr "" +msgstr "Αποτυχία" #: lib/components/YesNoButton.tsx:43 #: src/tables/Filter.tsx:35 msgid "Yes" -msgstr "" +msgstr "Ναι" #: lib/components/YesNoButton.tsx:44 #: src/tables/Filter.tsx:36 msgid "No" -msgstr "" +msgstr "Όχι" #: lib/enums/ModelInformation.tsx:28 #: src/components/wizards/OrderPartsWizard.tsx:279 @@ -103,9 +103,9 @@ msgstr "" #: src/forms/BuildForms.tsx:630 #: src/forms/BuildForms.tsx:793 #: src/forms/BuildForms.tsx:896 -#: src/forms/PurchaseOrderForms.tsx:798 +#: src/forms/PurchaseOrderForms.tsx:850 #: src/forms/ReturnOrderForms.tsx:242 -#: src/forms/SalesOrderForms.tsx:305 +#: src/forms/SalesOrderForms.tsx:323 #: src/forms/StockForms.tsx:360 #: src/forms/StockForms.tsx:791 #: src/forms/StockForms.tsx:838 @@ -119,10 +119,11 @@ msgstr "" #: src/pages/build/BuildDetail.tsx:200 #: src/pages/part/PartDetail.tsx:1207 #: src/tables/ColumnRenderers.tsx:91 +#: src/tables/part/PartTestResultTable.tsx:247 #: src/tables/part/RelatedPartTable.tsx:53 #: src/tables/stock/StockTrackingTable.tsx:87 msgid "Part" -msgstr "Εξάρτημα" +msgstr "Προϊόν" #: lib/enums/ModelInformation.tsx:29 #: lib/enums/Roles.tsx:35 @@ -135,40 +136,40 @@ msgstr "Εξάρτημα" #: src/pages/part/CategoryDetail.tsx:354 #: src/pages/part/PartDetail.tsx:965 msgid "Parts" -msgstr "Εξαρτήματα" +msgstr "Προϊόντα" #: lib/enums/ModelInformation.tsx:37 #: src/pages/Index/Settings/AdminCenter/PartParameterPanel.tsx:13 msgid "Part Parameter Template" -msgstr "Πρότυπο Παραμέτρων Εξαρτημάτων" +msgstr "Πρότυπο Παραμέτρων Προϊόντων" #: lib/enums/ModelInformation.tsx:38 msgid "Part Parameter Templates" -msgstr "Πρότυπα Παραμέτρων Εξαρτημάτων" +msgstr "Πρότυπα Παραμέτρων Προϊόντων" #: lib/enums/ModelInformation.tsx:45 msgid "Part Test Template" -msgstr "Δοκιμαστικό Πρότυπο Εξαρτημάτων" +msgstr "Δοκιμαστικό Πρότυπο Προϊόντων" #: lib/enums/ModelInformation.tsx:46 msgid "Part Test Templates" -msgstr "Δοκιμαστικά Πρότυπα Εξαρτημάτων" +msgstr "Δοκιμαστικά Πρότυπα Προϊόντων" #: lib/enums/ModelInformation.tsx:52 #: src/components/wizards/OrderPartsWizard.tsx:290 #: src/pages/company/SupplierPartDetail.tsx:413 #: src/pages/stock/StockDetail.tsx:289 -#: src/tables/build/BuildAllocatedStockTable.tsx:155 +#: src/tables/build/BuildAllocatedStockTable.tsx:152 #: src/tables/part/PartPurchaseOrdersTable.tsx:50 #: src/tables/purchasing/SupplierPartTable.tsx:83 #: src/tables/stock/StockItemTable.tsx:247 msgid "Supplier Part" -msgstr "Εξάρτημα Προμηθευτή" +msgstr "Προϊόν Προμηθευτή" #: lib/enums/ModelInformation.tsx:53 #: src/pages/purchasing/PurchasingIndex.tsx:92 msgid "Supplier Parts" -msgstr "Εξαρτήματα Προμηθευτή" +msgstr "Προϊόντα Προμηθευτή" #: lib/enums/ModelInformation.tsx:61 #: src/pages/company/ManufacturerPartDetail.tsx:297 @@ -176,18 +177,18 @@ msgstr "Εξαρτήματα Προμηθευτή" #: src/tables/part/PartPurchaseOrdersTable.tsx:56 #: src/tables/stock/StockItemTable.tsx:253 msgid "Manufacturer Part" -msgstr "Εξάρτημα Κατασκευαστή" +msgstr "Προϊόν Κατασκευαστή" #: lib/enums/ModelInformation.tsx:62 #: src/pages/purchasing/PurchasingIndex.tsx:109 msgid "Manufacturer Parts" -msgstr "Εξαρτήματα Κατασκευαστή" +msgstr "Προϊόντα Κατασκευαστή" #: lib/enums/ModelInformation.tsx:70 #: src/pages/part/CategoryDetail.tsx:354 #: src/tables/Filter.tsx:389 msgid "Part Category" -msgstr "" +msgstr "Κατηγορία Προϊόντος" #: lib/enums/ModelInformation.tsx:71 #: lib/enums/Roles.tsx:37 @@ -195,19 +196,19 @@ msgstr "" #: src/pages/part/CategoryDetail.tsx:345 #: src/pages/part/PartDetail.tsx:1196 msgid "Part Categories" -msgstr "" +msgstr "Κατηγορίες Προϊόντων" #: lib/enums/ModelInformation.tsx:79 #: src/forms/BuildForms.tsx:473 #: src/forms/BuildForms.tsx:633 #: src/forms/BuildForms.tsx:794 -#: src/forms/SalesOrderForms.tsx:307 +#: src/forms/SalesOrderForms.tsx:325 #: src/pages/stock/StockDetail.tsx:1005 -#: src/tables/part/PartTestResultTable.tsx:248 +#: src/tables/part/PartTestResultTable.tsx:256 #: src/tables/stock/StockTrackingTable.tsx:48 #: src/tables/stock/StockTrackingTable.tsx:55 msgid "Stock Item" -msgstr "" +msgstr "Προϊόν Αποθέματος" #: lib/enums/ModelInformation.tsx:80 #: lib/enums/Roles.tsx:45 @@ -217,73 +218,73 @@ msgstr "" #: src/pages/stock/LocationDetail.tsx:121 #: src/pages/stock/LocationDetail.tsx:180 msgid "Stock Items" -msgstr "" +msgstr "Προϊόντα Αποθέματος" #: lib/enums/ModelInformation.tsx:88 #: lib/enums/Roles.tsx:47 #: src/pages/stock/LocationDetail.tsx:420 msgid "Stock Location" -msgstr "" +msgstr "Τοποθεσία Αποθέματος" #: lib/enums/ModelInformation.tsx:89 #: src/pages/stock/LocationDetail.tsx:174 #: src/pages/stock/LocationDetail.tsx:412 #: src/pages/stock/StockDetail.tsx:996 msgid "Stock Locations" -msgstr "" +msgstr "Τοποθεσίες Αποθέματος" #: lib/enums/ModelInformation.tsx:97 msgid "Stock Location Type" -msgstr "" +msgstr "Τύπος Τοποθεσίας Αποθέματος" #: lib/enums/ModelInformation.tsx:98 msgid "Stock Location Types" -msgstr "" +msgstr "Τύποι Τοποθεσιών Αποθέματος" #: lib/enums/ModelInformation.tsx:103 #: src/pages/Index/Settings/SystemSettings.tsx:248 #: src/pages/part/PartDetail.tsx:911 msgid "Stock History" -msgstr "" +msgstr "Ιστορικό Αποθέματος" #: lib/enums/ModelInformation.tsx:104 msgid "Stock Histories" -msgstr "" +msgstr "Ιστορικά Αποθέματος" #: lib/enums/ModelInformation.tsx:109 msgid "Build" -msgstr "" +msgstr "Κατασκευή" #: lib/enums/ModelInformation.tsx:110 msgid "Builds" -msgstr "" +msgstr "Κατασκευές" #: lib/enums/ModelInformation.tsx:118 msgid "Build Line" -msgstr "" +msgstr "Γραμμή Κατασκευής" #: lib/enums/ModelInformation.tsx:119 msgid "Build Lines" -msgstr "" +msgstr "Γραμμές Κατασκευής" #: lib/enums/ModelInformation.tsx:126 msgid "Build Item" -msgstr "" +msgstr "Προϊόν Κατασκευής" #: lib/enums/ModelInformation.tsx:127 msgid "Build Items" -msgstr "" +msgstr "Προϊόντα Κατασκευής" #: lib/enums/ModelInformation.tsx:132 #: src/pages/company/CompanyDetail.tsx:340 #: src/tables/company/CompanyTable.tsx:47 #: src/tables/company/ContactTable.tsx:67 msgid "Company" -msgstr "" +msgstr "Εταιρεία" #: lib/enums/ModelInformation.tsx:133 msgid "Companies" -msgstr "" +msgstr "Εταιρείες" #: lib/enums/ModelInformation.tsx:140 #: src/pages/build/BuildDetail.tsx:316 @@ -294,12 +295,12 @@ msgstr "" #: src/tables/Filter.tsx:286 #: src/tables/TableHoverCard.tsx:101 msgid "Project Code" -msgstr "" +msgstr "Κωδικός Έργου" #: lib/enums/ModelInformation.tsx:141 #: src/pages/Index/Settings/AdminCenter/Index.tsx:172 msgid "Project Codes" -msgstr "" +msgstr "Κωδικοί Έργων" #: lib/enums/ModelInformation.tsx:147 #: src/components/wizards/OrderPartsWizard.tsx:338 @@ -310,7 +311,7 @@ msgstr "" #: src/tables/stock/StockItemTable.tsx:239 #: src/tables/stock/StockTrackingTable.tsx:120 msgid "Purchase Order" -msgstr "" +msgstr "Εντολή Αγοράς" #: lib/enums/ModelInformation.tsx:148 #: lib/enums/Roles.tsx:39 @@ -321,15 +322,15 @@ msgstr "" #: src/pages/part/PartDetail.tsx:875 #: src/pages/purchasing/PurchasingIndex.tsx:60 msgid "Purchase Orders" -msgstr "" +msgstr "Εντολές Αγοράς" #: lib/enums/ModelInformation.tsx:156 msgid "Purchase Order Line" -msgstr "" +msgstr "Γραμμή Εντολής Αγοράς" #: lib/enums/ModelInformation.tsx:157 msgid "Purchase Order Lines" -msgstr "" +msgstr "Γραμμές Εντολής Αγοράς" #: lib/enums/ModelInformation.tsx:162 #: src/pages/build/BuildDetail.tsx:289 @@ -343,7 +344,7 @@ msgstr "" #: src/tables/sales/SalesOrderShipmentTable.tsx:122 #: src/tables/stock/StockTrackingTable.tsx:131 msgid "Sales Order" -msgstr "" +msgstr "Εντολή Πώλησης" #: lib/enums/ModelInformation.tsx:163 #: lib/enums/Roles.tsx:43 @@ -353,22 +354,22 @@ msgstr "" #: src/pages/part/PartDetail.tsx:887 #: src/pages/sales/SalesIndex.tsx:84 msgid "Sales Orders" -msgstr "" +msgstr "Εντολές Πώλησης" #: lib/enums/ModelInformation.tsx:171 #: src/pages/sales/SalesOrderShipmentDetail.tsx:477 msgid "Sales Order Shipment" -msgstr "" +msgstr "Αποστολή Εντολής Πώλησης" #: lib/enums/ModelInformation.tsx:172 msgid "Sales Order Shipments" -msgstr "" +msgstr "Αποστολές Εντολών Πώλησης" #: lib/enums/ModelInformation.tsx:179 #: src/pages/sales/ReturnOrderDetail.tsx:549 #: src/tables/stock/StockTrackingTable.tsx:142 msgid "Return Order" -msgstr "" +msgstr "Εντολή Επιστροφής" #: lib/enums/ModelInformation.tsx:180 #: lib/enums/Roles.tsx:41 @@ -378,25 +379,25 @@ msgstr "" #: src/pages/part/PartDetail.tsx:894 #: src/pages/sales/SalesIndex.tsx:117 msgid "Return Orders" -msgstr "" +msgstr "Εντολές Επιστροφής" #: lib/enums/ModelInformation.tsx:188 msgid "Return Order Line Item" -msgstr "" +msgstr "Προϊόν Γραμμής Εντολής Επιστροφής" #: lib/enums/ModelInformation.tsx:189 msgid "Return Order Line Items" -msgstr "" +msgstr "Προϊόντα Γραμμής Εντολής Επιστροφής" #: lib/enums/ModelInformation.tsx:194 #: src/tables/company/AddressTable.tsx:52 msgid "Address" -msgstr "" +msgstr "Διεύθυνση" #: lib/enums/ModelInformation.tsx:195 #: src/pages/company/CompanyDetail.tsx:264 msgid "Addresses" -msgstr "" +msgstr "Διευθύνσεις" #: lib/enums/ModelInformation.tsx:201 #: src/pages/Index/Settings/AccountSettings/AccountDetailPanel.tsx:89 @@ -405,22 +406,22 @@ msgstr "" #: src/pages/sales/ReturnOrderDetail.tsx:207 #: src/pages/sales/SalesOrderDetail.tsx:200 msgid "Contact" -msgstr "" +msgstr "Επαφή" #: lib/enums/ModelInformation.tsx:202 #: src/pages/company/CompanyDetail.tsx:258 #: src/pages/core/CoreIndex.tsx:33 msgid "Contacts" -msgstr "" +msgstr "Επαφές" #: lib/enums/ModelInformation.tsx:208 #: src/tables/ColumnRenderers.tsx:444 msgid "Owner" -msgstr "" +msgstr "Ιδιοκτήτης" #: lib/enums/ModelInformation.tsx:209 msgid "Owners" -msgstr "" +msgstr "Ιδιοκτήτες" #: lib/enums/ModelInformation.tsx:215 #: src/pages/Auth/ChangePassword.tsx:36 @@ -435,7 +436,7 @@ msgstr "" #: src/tables/stock/StockTrackingTable.tsx:190 #: src/tables/stock/StockTrackingTable.tsx:218 msgid "User" -msgstr "" +msgstr "Χρήστης" #: lib/enums/ModelInformation.tsx:216 #: src/components/nav/NavigationDrawer.tsx:105 @@ -443,12 +444,12 @@ msgstr "" #: src/pages/core/CoreIndex.tsx:21 #: src/pages/core/UserDetail.tsx:226 msgid "Users" -msgstr "" +msgstr "Χρήστες" #: lib/enums/ModelInformation.tsx:222 #: src/pages/core/GroupDetail.tsx:78 msgid "Group" -msgstr "" +msgstr "Ομάδα" #: lib/enums/ModelInformation.tsx:223 #: src/components/nav/NavigationDrawer.tsx:111 @@ -458,66 +459,66 @@ msgstr "" #: src/pages/core/UserDetail.tsx:99 #: src/tables/settings/UserTable.tsx:276 msgid "Groups" -msgstr "" +msgstr "Ομάδες" #: lib/enums/ModelInformation.tsx:230 msgid "Import Session" -msgstr "" +msgstr "Συνεδρία Εισαγωγής" #: lib/enums/ModelInformation.tsx:231 msgid "Import Sessions" -msgstr "" +msgstr "Συνεδρίες Εισαγωγής" #: lib/enums/ModelInformation.tsx:238 msgid "Label Template" -msgstr "" +msgstr "Πρότυπο Ετικέτας" #: lib/enums/ModelInformation.tsx:239 #: src/pages/Index/Settings/AdminCenter/Index.tsx:209 msgid "Label Templates" -msgstr "" +msgstr "Πρότυπα Ετικετών" #: lib/enums/ModelInformation.tsx:246 msgid "Report Template" -msgstr "" +msgstr "Πρότυπο Αναφοράς" #: lib/enums/ModelInformation.tsx:247 #: src/pages/Index/Settings/AdminCenter/Index.tsx:215 msgid "Report Templates" -msgstr "" +msgstr "Πρότυπα Αναφορών" #: lib/enums/ModelInformation.tsx:254 #: src/components/plugins/PluginDrawer.tsx:145 msgid "Plugin Configuration" -msgstr "" +msgstr "Ρύθμιση Plugin" #: lib/enums/ModelInformation.tsx:255 msgid "Plugin Configurations" -msgstr "" +msgstr "Ρυθμίσεις Plugin" #: lib/enums/ModelInformation.tsx:262 msgid "Content Type" -msgstr "" +msgstr "Τύπος Περιεχομένου" #: lib/enums/ModelInformation.tsx:263 msgid "Content Types" -msgstr "" +msgstr "Τύποι Περιεχομένου" #: lib/enums/ModelInformation.tsx:268 msgid "Selection List" -msgstr "" +msgstr "Λίστα Επιλογών" #: lib/enums/ModelInformation.tsx:269 #: src/pages/Index/Settings/AdminCenter/PartParameterPanel.tsx:21 msgid "Selection Lists" -msgstr "" +msgstr "Λίστες Επιλογών" #: lib/enums/ModelInformation.tsx:275 #: src/components/barcodes/BarcodeInput.tsx:114 #: src/components/dashboard/DashboardLayout.tsx:281 #: src/components/editors/NotesEditor.tsx:74 #: src/components/editors/TemplateEditor/TemplateEditor.tsx:158 -#: src/components/forms/fields/ApiFormField.tsx:273 +#: src/components/forms/fields/ApiFormField.tsx:237 #: src/components/forms/fields/TableField.tsx:45 #: src/components/importer/ImportDataSelector.tsx:192 #: src/components/importer/ImporterColumnSelector.tsx:234 @@ -545,17 +546,17 @@ msgstr "" #: src/tables/settings/EmailTable.tsx:109 #: src/tables/stock/StockItemTestResultTable.tsx:338 msgid "Error" -msgstr "" +msgstr "Σφάλμα" #: lib/enums/ModelInformation.tsx:276 #: src/tables/machine/MachineListTable.tsx:402 #: src/tables/machine/MachineTypeTable.tsx:299 msgid "Errors" -msgstr "" +msgstr "Σφάλματα" #: lib/enums/Roles.tsx:31 msgid "Admin" -msgstr "" +msgstr "Διαχειριστής" #: lib/enums/Roles.tsx:33 #: src/defaults/actions.tsx:135 @@ -564,7 +565,7 @@ msgstr "" #: src/pages/part/PartDetail.tsx:904 #: src/pages/sales/SalesOrderDetail.tsx:421 msgid "Build Orders" -msgstr "" +msgstr "Εντολές Κατασκευής" #: lib/enums/Roles.tsx:50 #: src/pages/Index/Settings/AdminCenter/Index.tsx:202 @@ -573,7 +574,7 @@ msgstr "" #: src/components/Boundary.tsx:12 msgid "Error rendering component" -msgstr "" +msgstr "Σφάλμα κατά την απόδοση του component" #: src/components/Boundary.tsx:14 msgid "An error occurred while rendering this component. Refer to the console for more information." @@ -585,75 +586,75 @@ msgstr "" #: src/components/barcodes/BarcodeCameraInput.tsx:103 msgid "Error while scanning" -msgstr "" +msgstr "Σφάλμα κατά τη σάρωση" #: src/components/barcodes/BarcodeCameraInput.tsx:117 msgid "Error while stopping" -msgstr "" +msgstr "Σφάλμα κατά τη διακοπή" #: src/components/barcodes/BarcodeCameraInput.tsx:159 msgid "Start scanning by selecting a camera and pressing the play button." -msgstr "" +msgstr "Ξεκινήστε τη σάρωση επιλέγοντας μια κάμερα και πατώντας το κουμπί αναπαραγωγής." #: src/components/barcodes/BarcodeCameraInput.tsx:180 msgid "Stop scanning" -msgstr "" +msgstr "Διακοπή σάρωσης" #: src/components/barcodes/BarcodeCameraInput.tsx:190 msgid "Start scanning" -msgstr "" +msgstr "Έναρξη σάρωσης" #: src/components/barcodes/BarcodeInput.tsx:34 #: src/tables/general/BarcodeScanTable.tsx:55 #: src/tables/settings/BarcodeScanHistoryTable.tsx:64 msgid "Barcode" -msgstr "" +msgstr "Γραμμοκώδικας" #: src/components/barcodes/BarcodeInput.tsx:35 #: src/components/barcodes/BarcodeKeyboardInput.tsx:18 #: src/defaults/actions.tsx:85 msgid "Scan" -msgstr "" +msgstr "Σάρωση" #: src/components/barcodes/BarcodeInput.tsx:53 msgid "Camera Input" -msgstr "" +msgstr "Είσοδος Κάμερας" #: src/components/barcodes/BarcodeInput.tsx:63 msgid "Scanner Input" -msgstr "" +msgstr "Είσοδος Σαρωτή" #: src/components/barcodes/BarcodeInput.tsx:105 msgid "Barcode Data" -msgstr "" +msgstr "Δεδομένα Γραμμοκώδικα" #: src/components/barcodes/BarcodeInput.tsx:109 msgid "No barcode data" -msgstr "" +msgstr "Δεν υπάρχουν δεδομένα γραμμοκώδικα" #: src/components/barcodes/BarcodeInput.tsx:110 msgid "Scan or enter barcode data" -msgstr "" +msgstr "Σαρώστε ή εισάγετε δεδομένα γραμμοκώδικα" #: src/components/barcodes/BarcodeKeyboardInput.tsx:64 msgid "Enter barcode data" -msgstr "" +msgstr "Εισάγετε δεδομένα γραμμοκώδικα" #: src/components/barcodes/BarcodeScanDialog.tsx:49 #: src/components/buttons/ScanButton.tsx:15 #: src/components/nav/NavigationDrawer.tsx:122 -#: src/forms/PurchaseOrderForms.tsx:457 -#: src/forms/PurchaseOrderForms.tsx:563 +#: src/forms/PurchaseOrderForms.tsx:509 +#: src/forms/PurchaseOrderForms.tsx:615 msgid "Scan Barcode" -msgstr "" +msgstr "Σάρωση Γραμμοκώδικα" #: src/components/barcodes/BarcodeScanDialog.tsx:105 msgid "No matching item found" -msgstr "" +msgstr "Δεν βρέθηκε αντίστοιχο Προϊόν" #: src/components/barcodes/BarcodeScanDialog.tsx:134 msgid "Barcode does not match the expected model type" -msgstr "" +msgstr "Ο γραμμοκώδικας δεν ταιριάζει με τον αναμενόμενο τύπο μοντέλου" #: src/components/barcodes/BarcodeScanDialog.tsx:145 #: src/components/editors/NotesEditor.tsx:84 @@ -669,48 +670,48 @@ msgstr "Επιτυχία" #: src/components/barcodes/BarcodeScanDialog.tsx:151 msgid "Failed to handle barcode" -msgstr "" +msgstr "Αποτυχία επεξεργασίας γραμμοκώδικα" #: src/components/barcodes/BarcodeScanDialog.tsx:167 #: src/pages/Index/Scan.tsx:129 msgid "Failed to scan barcode" -msgstr "" +msgstr "Αποτυχία σάρωσης γραμμοκώδικα" #: src/components/barcodes/QRCode.tsx:94 msgid "Low (7%)" -msgstr "" +msgstr "Χαμηλό (7%)" #: src/components/barcodes/QRCode.tsx:95 msgid "Medium (15%)" -msgstr "" +msgstr "Μεσαίο (15%)" #: src/components/barcodes/QRCode.tsx:96 msgid "Quartile (25%)" -msgstr "" +msgstr "Τεταρτημόριο (25%)" #: src/components/barcodes/QRCode.tsx:97 msgid "High (30%)" -msgstr "" +msgstr "Υψηλό (30%)" #: src/components/barcodes/QRCode.tsx:107 msgid "Custom barcode" -msgstr "" +msgstr "Προσαρμοσμένος γραμμοκώδικας" #: src/components/barcodes/QRCode.tsx:108 msgid "A custom barcode is registered for this item. The shown code is not that custom barcode." -msgstr "" +msgstr "Ένας προσαρμοσμένος γραμμοκώδικας είναι καταχωρημένος για αυτό το Προϊόν. Ο εμφανιζόμενος κωδικός δεν είναι ο προσαρμοσμένος." #: src/components/barcodes/QRCode.tsx:127 msgid "Barcode Data:" -msgstr "" +msgstr "Δεδομένα Γραμμοκώδικα:" #: src/components/barcodes/QRCode.tsx:138 msgid "Select Error Correction Level" -msgstr "" +msgstr "Επιλογή Επιπέδου Διόρθωσης Σφαλμάτων" #: src/components/barcodes/QRCode.tsx:170 msgid "Failed to link barcode" -msgstr "" +msgstr "Αποτυχία σύνδεσης γραμμοκώδικα" #: src/components/barcodes/QRCode.tsx:179 #: src/pages/part/PartDetail.tsx:521 @@ -720,21 +721,21 @@ msgstr "" #: src/pages/sales/SalesOrderShipmentDetail.tsx:122 #: src/pages/stock/StockDetail.tsx:186 msgid "Link" -msgstr "" +msgstr "Σύνδεση" #: src/components/barcodes/QRCode.tsx:200 msgid "This will remove the link to the associated barcode" -msgstr "" +msgstr "Αυτό θα αφαιρέσει τη σύνδεση με τον σχετικό γραμμοκώδικα" #: src/components/barcodes/QRCode.tsx:205 #: src/components/items/ActionDropdown.tsx:192 -#: src/forms/PurchaseOrderForms.tsx:554 +#: src/forms/PurchaseOrderForms.tsx:606 msgid "Unlink Barcode" -msgstr "" +msgstr "Αποσύνδεση Γραμμοκώδικα" #: src/components/buttons/AdminButton.tsx:86 msgid "Open in admin interface" -msgstr "" +msgstr "Άνοιγμα στο περιβάλλον διαχειριστή" #: src/components/buttons/CopyButton.tsx:18 #~ msgid "Copy to clipboard" @@ -750,11 +751,11 @@ msgstr "Αντιγραφή" #: src/components/buttons/PrintingActions.tsx:56 msgid "Printing Labels" -msgstr "" +msgstr "Εκτύπωση Ετικετών" #: src/components/buttons/PrintingActions.tsx:61 msgid "Printing Reports" -msgstr "" +msgstr "Εκτύπωση Αναφορών" #: src/components/buttons/PrintingActions.tsx:77 #~ msgid "Printing" @@ -774,12 +775,12 @@ msgstr "" #: src/components/buttons/PrintingActions.tsx:124 msgid "Print Label" -msgstr "" +msgstr "Εκτύπωση Ετικέτας" #: src/components/buttons/PrintingActions.tsx:134 #: src/components/buttons/PrintingActions.tsx:168 msgid "Print" -msgstr "" +msgstr "Εκτύπωση" #: src/components/buttons/PrintingActions.tsx:152 #~ msgid "Generate" @@ -795,27 +796,27 @@ msgstr "" #: src/components/buttons/PrintingActions.tsx:161 msgid "Print Report" -msgstr "" +msgstr "Εκτύπωση Αναφοράς" #: src/components/buttons/PrintingActions.tsx:189 msgid "Printing Actions" -msgstr "" +msgstr "Ενέργειες Εκτύπωσης" #: src/components/buttons/PrintingActions.tsx:195 msgid "Print Labels" -msgstr "" +msgstr "Εκτύπωση Ετικετών" #: src/components/buttons/PrintingActions.tsx:201 msgid "Print Reports" -msgstr "" +msgstr "Εκτύπωση Αναφορών" #: src/components/buttons/RemoveRowButton.tsx:9 msgid "Remove this row" -msgstr "" +msgstr "Αφαίρεση αυτής της γραμμής" #: src/components/buttons/SSOButton.tsx:40 msgid "You will be redirected to the provider for further actions." -msgstr "" +msgstr "Θα ανακατευθυνθείτε στον πάροχο για περαιτέρω ενέργειες." #: src/components/buttons/SSOButton.tsx:44 #~ msgid "This provider is not full set up." @@ -831,7 +832,7 @@ msgstr "" #: src/components/buttons/ScanButton.tsx:19 msgid "Open Barcode Scanner" -msgstr "" +msgstr "Άνοιγμα Σαρωτή Γραμμοκώδικα" #: src/components/buttons/ScanButton.tsx:20 #~ msgid "Open QR code scanner" @@ -839,11 +840,11 @@ msgstr "" #: src/components/buttons/SpotlightButton.tsx:12 msgid "Open spotlight" -msgstr "" +msgstr "Άνοιγμα spotlight" #: src/components/buttons/StarredToggleButton.tsx:36 msgid "Subscription Updated" -msgstr "" +msgstr "Η συνδρομή ενημερώθηκε" #: src/components/buttons/StarredToggleButton.tsx:57 #~ msgid "Unsubscribe from part" @@ -851,63 +852,63 @@ msgstr "" #: src/components/buttons/StarredToggleButton.tsx:66 msgid "Unsubscribe from notifications" -msgstr "" +msgstr "Απεγγραφή από τις ειδοποιήσεις" #: src/components/buttons/StarredToggleButton.tsx:67 msgid "Subscribe to notifications" -msgstr "" +msgstr "Εγγραφή στις ειδοποιήσεις" #: src/components/calendar/Calendar.tsx:102 #: src/components/calendar/Calendar.tsx:165 msgid "Calendar Filters" -msgstr "" +msgstr "Φίλτρα Ημερολογίου" #: src/components/calendar/Calendar.tsx:117 msgid "Previous month" -msgstr "" +msgstr "Προηγούμενος μήνας" #: src/components/calendar/Calendar.tsx:126 msgid "Select month" -msgstr "" +msgstr "Επιλογή μήνα" #: src/components/calendar/Calendar.tsx:147 msgid "Next month" -msgstr "" +msgstr "Επόμενος μήνας" #: src/components/calendar/Calendar.tsx:178 #: src/tables/InvenTreeTableHeader.tsx:294 msgid "Download data" -msgstr "" +msgstr "Λήψη δεδομένων" #: src/components/calendar/OrderCalendar.tsx:132 msgid "Order Updated" -msgstr "" +msgstr "Η παραγγελία ενημερώθηκε" #: src/components/calendar/OrderCalendar.tsx:142 msgid "Error updating order" -msgstr "" +msgstr "Σφάλμα κατά την ενημέρωση της παραγγελίας" #: src/components/calendar/OrderCalendar.tsx:178 #: src/tables/Filter.tsx:152 msgid "Overdue" -msgstr "" +msgstr "Εκπρόθεσμο" #: src/components/dashboard/DashboardLayout.tsx:282 msgid "Failed to load dashboard widgets." -msgstr "" +msgstr "Αποτυχία φόρτωσης widgets του πίνακα ελέγχου." #: src/components/dashboard/DashboardLayout.tsx:293 msgid "No Widgets Selected" -msgstr "" +msgstr "Δεν έχουν επιλεγεί Widgets" #: src/components/dashboard/DashboardLayout.tsx:296 msgid "Use the menu to add widgets to the dashboard" -msgstr "" +msgstr "Χρησιμοποιήστε το μενού για να προσθέσετε widgets στον πίνακα ελέγχου" #: src/components/dashboard/DashboardMenu.tsx:62 #: src/components/dashboard/DashboardMenu.tsx:138 msgid "Accept Layout" -msgstr "" +msgstr "Αποδοχή Διάταξης" #: src/components/dashboard/DashboardMenu.tsx:94 #: src/components/nav/NavigationDrawer.tsx:64 @@ -915,264 +916,264 @@ msgstr "" #: src/defaults/links.tsx:31 #: src/pages/Index/Home.tsx:8 msgid "Dashboard" -msgstr "" +msgstr "Πίνακας Ελέγχου" #: src/components/dashboard/DashboardMenu.tsx:102 msgid "Edit Layout" -msgstr "" +msgstr "Επεξεργασία Διάταξης" #: src/components/dashboard/DashboardMenu.tsx:111 msgid "Add Widget" -msgstr "" +msgstr "Προσθήκη Widget" #: src/components/dashboard/DashboardMenu.tsx:120 msgid "Remove Widgets" -msgstr "" +msgstr "Αφαίρεση Widgets" #: src/components/dashboard/DashboardMenu.tsx:129 msgid "Clear Widgets" -msgstr "" +msgstr "Εκκαθάριση Widgets" #: src/components/dashboard/DashboardWidget.tsx:81 msgid "Remove this widget from the dashboard" -msgstr "" +msgstr "Αφαίρεση αυτού του widget από τον πίνακα ελέγχου" #: src/components/dashboard/DashboardWidgetDrawer.tsx:77 msgid "Filter dashboard widgets" -msgstr "" +msgstr "Φιλτράρισμα widgets του πίνακα ελέγχου" #: src/components/dashboard/DashboardWidgetDrawer.tsx:98 msgid "Add this widget to the dashboard" -msgstr "" +msgstr "Προσθήκη αυτού του widget στον πίνακα ελέγχου" #: src/components/dashboard/DashboardWidgetDrawer.tsx:123 msgid "No Widgets Available" -msgstr "" +msgstr "Δεν υπάρχουν διαθέσιμα Widgets" #: src/components/dashboard/DashboardWidgetDrawer.tsx:124 msgid "There are no more widgets available for the dashboard" -msgstr "" +msgstr "Δεν υπάρχουν άλλα διαθέσιμα widgets για τον πίνακα ελέγχου" #: src/components/dashboard/DashboardWidgetLibrary.tsx:24 msgid "Subscribed Parts" -msgstr "" +msgstr "Εγγεγραμμένα Προϊόντα" #: src/components/dashboard/DashboardWidgetLibrary.tsx:25 msgid "Show the number of parts which you have subscribed to" -msgstr "" +msgstr "Εμφανίζει τον αριθμό Προϊόντων στα οποία είστε εγγεγραμμένος" #: src/components/dashboard/DashboardWidgetLibrary.tsx:31 msgid "Subscribed Categories" -msgstr "" +msgstr "Εγγεγραμμένες Κατηγορίες" #: src/components/dashboard/DashboardWidgetLibrary.tsx:32 msgid "Show the number of part categories which you have subscribed to" -msgstr "" +msgstr "Εμφανίζει τον αριθμό κατηγοριών στις οποίες είστε εγγεγραμμένος" #: src/components/dashboard/DashboardWidgetLibrary.tsx:41 msgid "Invalid BOMs" -msgstr "" +msgstr "Μη έγκυρα BOM" #: src/components/dashboard/DashboardWidgetLibrary.tsx:42 msgid "Assemblies requiring bill of materials validation" -msgstr "" +msgstr "Συναρμολογήσεις που απαιτούν επικύρωση λίστας υλικών" #: src/components/dashboard/DashboardWidgetLibrary.tsx:53 #: src/tables/part/PartTable.tsx:263 msgid "Low Stock" -msgstr "" +msgstr "Χαμηλό Απόθεμα" #: src/components/dashboard/DashboardWidgetLibrary.tsx:55 msgid "Show the number of parts which are low on stock" -msgstr "" +msgstr "Εμφανίζει τον αριθμό Προϊόντων που έχουν χαμηλό απόθεμα" #: src/components/dashboard/DashboardWidgetLibrary.tsx:64 msgid "Required for Build Orders" -msgstr "" +msgstr "Απαιτούνται για Εντολές Κατασκευής" #: src/components/dashboard/DashboardWidgetLibrary.tsx:66 msgid "Show parts which are required for active build orders" -msgstr "" +msgstr "Εμφανίζει Προϊόντα που απαιτούνται για ενεργές εντολές κατασκευής" #: src/components/dashboard/DashboardWidgetLibrary.tsx:71 msgid "Expired Stock Items" -msgstr "" +msgstr "Ληγμένα Προϊόντα Αποθέματος" #: src/components/dashboard/DashboardWidgetLibrary.tsx:73 msgid "Show the number of stock items which have expired" -msgstr "" +msgstr "Εμφανίζει τον αριθμό Προϊόντων αποθέματος που έχουν λήξει" #: src/components/dashboard/DashboardWidgetLibrary.tsx:79 msgid "Stale Stock Items" -msgstr "" +msgstr "Παρωχημένα Προϊόντα Αποθέματος" #: src/components/dashboard/DashboardWidgetLibrary.tsx:81 msgid "Show the number of stock items which are stale" -msgstr "" +msgstr "Εμφανίζει τον αριθμό Προϊόντων αποθέματος που είναι παρωχημένα" #: src/components/dashboard/DashboardWidgetLibrary.tsx:87 msgid "Active Build Orders" -msgstr "" +msgstr "Ενεργές Εντολές Κατασκευής" #: src/components/dashboard/DashboardWidgetLibrary.tsx:89 msgid "Show the number of build orders which are currently active" -msgstr "" +msgstr "Εμφανίζει τον αριθμό εντολών κατασκευής που είναι ενεργές" #: src/components/dashboard/DashboardWidgetLibrary.tsx:94 msgid "Overdue Build Orders" -msgstr "" +msgstr "Εκπρόθεσμες Εντολές Κατασκευής" #: src/components/dashboard/DashboardWidgetLibrary.tsx:96 msgid "Show the number of build orders which are overdue" -msgstr "" +msgstr "Εμφανίζει τον αριθμό εντολών κατασκευής που είναι εκπρόθεσμες" #: src/components/dashboard/DashboardWidgetLibrary.tsx:101 msgid "Assigned Build Orders" -msgstr "" +msgstr "Ανατεθειμένες Εντολές Κατασκευής" #: src/components/dashboard/DashboardWidgetLibrary.tsx:103 msgid "Show the number of build orders which are assigned to you" -msgstr "" +msgstr "Εμφανίζει τον αριθμό εντολών κατασκευής που σας έχουν ανατεθεί" #: src/components/dashboard/DashboardWidgetLibrary.tsx:108 msgid "Active Sales Orders" -msgstr "" +msgstr "Ενεργές Εντολές Πώλησης" #: src/components/dashboard/DashboardWidgetLibrary.tsx:110 msgid "Show the number of sales orders which are currently active" -msgstr "" +msgstr "Εμφανίζει τον αριθμό εντολών πώλησης που είναι ενεργές" #: src/components/dashboard/DashboardWidgetLibrary.tsx:115 msgid "Overdue Sales Orders" -msgstr "" +msgstr "Εκπρόθεσμες Εντολές Πώλησης" #: src/components/dashboard/DashboardWidgetLibrary.tsx:117 msgid "Show the number of sales orders which are overdue" -msgstr "" +msgstr "Εμφανίζει τον αριθμό εντολών πώλησης που είναι εκπρόθεσμες" #: src/components/dashboard/DashboardWidgetLibrary.tsx:122 msgid "Assigned Sales Orders" -msgstr "" +msgstr "Ανατεθειμένες Εντολές Πώλησης" #: src/components/dashboard/DashboardWidgetLibrary.tsx:124 msgid "Show the number of sales orders which are assigned to you" -msgstr "" +msgstr "Εμφανίζει τον αριθμό εντολών πώλησης που σας έχουν ανατεθεί" #: src/components/dashboard/DashboardWidgetLibrary.tsx:129 #: src/pages/sales/SalesIndex.tsx:105 msgid "Pending Shipments" -msgstr "" +msgstr "Εκκρεμείς Αποστολές" #: src/components/dashboard/DashboardWidgetLibrary.tsx:131 msgid "Show the number of pending sales order shipments" -msgstr "" +msgstr "Εμφανίζει τον αριθμό εκκρεμών αποστολών εντολών πώλησης" #: src/components/dashboard/DashboardWidgetLibrary.tsx:136 msgid "Active Purchase Orders" -msgstr "" +msgstr "Ενεργές Εντολές Αγοράς" #: src/components/dashboard/DashboardWidgetLibrary.tsx:138 msgid "Show the number of purchase orders which are currently active" -msgstr "" +msgstr "Εμφανίζει τον αριθμό εντολών αγοράς που είναι ενεργές" #: src/components/dashboard/DashboardWidgetLibrary.tsx:143 msgid "Overdue Purchase Orders" -msgstr "" +msgstr "Εκπρόθεσμες Εντολές Αγοράς" #: src/components/dashboard/DashboardWidgetLibrary.tsx:145 msgid "Show the number of purchase orders which are overdue" -msgstr "" +msgstr "Εμφανίζει τον αριθμό εντολών αγοράς που είναι εκπρόθεσμες" #: src/components/dashboard/DashboardWidgetLibrary.tsx:150 msgid "Assigned Purchase Orders" -msgstr "" +msgstr "Ανατεθειμένες Εντολές Αγοράς" #: src/components/dashboard/DashboardWidgetLibrary.tsx:152 msgid "Show the number of purchase orders which are assigned to you" -msgstr "" +msgstr "Εμφανίζει τον αριθμό εντολών αγοράς που σας έχουν ανατεθεί" #: src/components/dashboard/DashboardWidgetLibrary.tsx:157 msgid "Active Return Orders" -msgstr "" +msgstr "Ενεργές Εντολές Επιστροφής" #: src/components/dashboard/DashboardWidgetLibrary.tsx:159 msgid "Show the number of return orders which are currently active" -msgstr "" +msgstr "Εμφανίζει τον αριθμό εντολών επιστροφής που είναι ενεργές" #: src/components/dashboard/DashboardWidgetLibrary.tsx:164 msgid "Overdue Return Orders" -msgstr "" +msgstr "Εκπρόθεσμες Εντολές Επιστροφής" #: src/components/dashboard/DashboardWidgetLibrary.tsx:166 msgid "Show the number of return orders which are overdue" -msgstr "" +msgstr "Εμφανίζει τον αριθμό εντολών επιστροφής που είναι εκπρόθεσμες" #: src/components/dashboard/DashboardWidgetLibrary.tsx:171 msgid "Assigned Return Orders" -msgstr "" +msgstr "Ανατεθειμένες Εντολές Επιστροφής" #: src/components/dashboard/DashboardWidgetLibrary.tsx:173 msgid "Show the number of return orders which are assigned to you" -msgstr "" +msgstr "Εμφανίζει τον αριθμό εντολών επιστροφής που σας έχουν ανατεθεί" #: src/components/dashboard/DashboardWidgetLibrary.tsx:193 #: src/components/dashboard/widgets/GetStartedWidget.tsx:15 #: src/defaults/links.tsx:86 msgid "Getting Started" -msgstr "" +msgstr "Ξεκινώντας" #: src/components/dashboard/DashboardWidgetLibrary.tsx:194 #: src/defaults/links.tsx:89 msgid "Getting started with InvenTree" -msgstr "" +msgstr "Ξεκινώντας με το InvenTree" #: src/components/dashboard/DashboardWidgetLibrary.tsx:201 #: src/components/dashboard/widgets/NewsWidget.tsx:123 msgid "News Updates" -msgstr "" +msgstr "Ενημερώσεις Ειδήσεων" #: src/components/dashboard/DashboardWidgetLibrary.tsx:202 msgid "The latest news from InvenTree" -msgstr "" +msgstr "Οι τελευταίες ειδήσεις από το InvenTree" #: src/components/dashboard/widgets/ColorToggleWidget.tsx:18 #: src/components/nav/MainMenu.tsx:93 msgid "Change Color Mode" -msgstr "" +msgstr "Αλλαγή λειτουργίας χρώματος" #: src/components/dashboard/widgets/ColorToggleWidget.tsx:23 msgid "Change the color mode of the user interface" -msgstr "" +msgstr "Αλλάξτε τη λειτουργία χρώματος του περιβάλλοντος χρήστη" #: src/components/dashboard/widgets/LanguageSelectWidget.tsx:18 msgid "Change Language" -msgstr "" +msgstr "Αλλαγή γλώσσας" #: src/components/dashboard/widgets/LanguageSelectWidget.tsx:23 msgid "Change the language of the user interface" -msgstr "" +msgstr "Αλλάξτε τη γλώσσα του περιβάλλοντος χρήστη" #: src/components/dashboard/widgets/NewsWidget.tsx:60 #: src/components/nav/NotificationDrawer.tsx:94 #: src/pages/Notifications.tsx:53 msgid "Mark as read" -msgstr "" +msgstr "Σήμανση ως αναγνωσμένο" #: src/components/dashboard/widgets/NewsWidget.tsx:115 msgid "Requires Superuser" -msgstr "" +msgstr "Απαιτεί Superuser" #: src/components/dashboard/widgets/NewsWidget.tsx:116 msgid "This widget requires superuser permissions" -msgstr "" +msgstr "Αυτό το widget απαιτεί δικαιώματα superuser" #: src/components/dashboard/widgets/NewsWidget.tsx:133 msgid "No News" -msgstr "" +msgstr "Δεν υπάρχουν νέα" #: src/components/dashboard/widgets/NewsWidget.tsx:134 msgid "There are no unread news items" -msgstr "" +msgstr "Δεν υπάρχουν μη αναγνωσμένα νέα" #: src/components/details/Details.tsx:117 #~ msgid "Email:" @@ -1184,22 +1185,22 @@ msgstr "" #: src/pages/core/UserDetail.tsx:203 #: src/tables/settings/UserTable.tsx:410 msgid "Superuser" -msgstr "" +msgstr "Superuser" #: src/components/details/Details.tsx:124 #: src/pages/core/UserDetail.tsx:87 #: src/pages/core/UserDetail.tsx:200 #: src/tables/settings/UserTable.tsx:405 msgid "Staff" -msgstr "" +msgstr "Προσωπικό" #: src/components/details/Details.tsx:125 msgid "Email: " -msgstr "" +msgstr "Email: " #: src/components/details/Details.tsx:411 msgid "No name defined" -msgstr "" +msgstr "Δεν έχει οριστεί όνομα" #: src/components/details/DetailsImage.tsx:77 msgid "Remove Image" @@ -1216,6 +1217,12 @@ msgstr "Αφαίρεση της σχετικής εικόνας από αυτό #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:884 #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:903 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:254 +#: src/tables/build/BuildAllocatedStockTable.tsx:178 +#: src/tables/build/BuildAllocatedStockTable.tsx:258 +#: src/tables/build/BuildLineTable.tsx:111 +#: src/tables/build/BuildLineTable.tsx:665 +#: src/tables/sales/SalesOrderAllocationTable.tsx:224 +#: src/tables/sales/SalesOrderAllocationTable.tsx:247 msgid "Remove" msgstr "Αφαίρεση" @@ -1229,19 +1236,19 @@ msgstr "Κάντε κλικ για να επιλέξετε αρχείο(α)" #: src/components/details/DetailsImage.tsx:172 msgid "Image uploaded" -msgstr "" +msgstr "Η εικόνα μεταφορτώθηκε" #: src/components/details/DetailsImage.tsx:173 msgid "Image has been uploaded successfully" -msgstr "" +msgstr "Η εικόνα μεταφορτώθηκε με επιτυχία" #: src/components/details/DetailsImage.tsx:180 #: src/tables/general/AttachmentTable.tsx:201 msgid "Upload Error" -msgstr "" +msgstr "Σφάλμα μεταφόρτωσης" #: src/components/details/DetailsImage.tsx:250 -#: src/components/forms/fields/TextField.tsx:65 +#: src/components/forms/fields/AutoFillRightSection.tsx:34 msgid "Clear" msgstr "Εκκαθάριση" @@ -1263,7 +1270,7 @@ msgstr "Επιλέξτε εικόνα" #: src/components/details/DetailsImage.tsx:324 msgid "Download remote image" -msgstr "" +msgstr "Λήψη απομακρυσμένης εικόνας" #: src/components/details/DetailsImage.tsx:339 msgid "Upload new image" @@ -1279,11 +1286,11 @@ msgstr "Διαγραφή εικόνας" #: src/components/details/DetailsImage.tsx:393 msgid "Download Image" -msgstr "" +msgstr "Λήψη εικόνας" #: src/components/details/DetailsImage.tsx:398 msgid "Image downloaded successfully" -msgstr "" +msgstr "Η εικόνα λήφθηκε με επιτυχία" #: src/components/details/PartIcons.tsx:43 #~ msgid "Part is a template part (variants can be made from this part)" @@ -1315,23 +1322,23 @@ msgstr "" #: src/components/editors/NotesEditor.tsx:75 msgid "Image upload failed" -msgstr "" +msgstr "Αποτυχία μεταφόρτωσης εικόνας" #: src/components/editors/NotesEditor.tsx:85 msgid "Image uploaded successfully" -msgstr "" +msgstr "Η εικόνα μεταφορτώθηκε με επιτυχία" #: src/components/editors/NotesEditor.tsx:119 msgid "Notes saved successfully" -msgstr "" +msgstr "Οι σημειώσεις αποθηκεύτηκαν με επιτυχία" #: src/components/editors/NotesEditor.tsx:130 msgid "Failed to save notes" -msgstr "" +msgstr "Αποτυχία αποθήκευσης σημειώσεων" #: src/components/editors/NotesEditor.tsx:133 msgid "Error Saving Notes" -msgstr "" +msgstr "Σφάλμα αποθήκευσης σημειώσεων" #: src/components/editors/NotesEditor.tsx:151 #~ msgid "Disable Editing" @@ -1339,15 +1346,15 @@ msgstr "" #: src/components/editors/NotesEditor.tsx:153 msgid "Save Notes" -msgstr "" +msgstr "Αποθήκευση σημειώσεων" #: src/components/editors/NotesEditor.tsx:172 msgid "Close Editor" -msgstr "" +msgstr "Κλείσιμο επεξεργαστή" #: src/components/editors/NotesEditor.tsx:179 msgid "Enable Editing" -msgstr "" +msgstr "Ενεργοποίηση επεξεργασίας" #: src/components/editors/NotesEditor.tsx:198 #~ msgid "Preview Notes" @@ -1367,7 +1374,7 @@ msgstr "Κωδικός" #: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:50 msgid "Error rendering preview" -msgstr "" +msgstr "Σφάλμα δημιουργίας προεπισκόπησης" #: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:120 msgid "Preview not available, click \"Reload Preview\"." @@ -1391,12 +1398,12 @@ msgstr "Σφάλμα αποθήκευσης προτύπου" #: src/components/editors/TemplateEditor/TemplateEditor.tsx:159 msgid "Could not load the template from the server." -msgstr "" +msgstr "Δεν ήταν δυνατή η φόρτωση του προτύπου από τον διακομιστή." #: src/components/editors/TemplateEditor/TemplateEditor.tsx:176 #: src/components/editors/TemplateEditor/TemplateEditor.tsx:319 msgid "Save & Reload Preview" -msgstr "" +msgstr "Αποθήκευση & Επαναφόρτωση Προεπισκόπησης" #: src/components/editors/TemplateEditor/TemplateEditor.tsx:181 msgid "Are you sure you want to Save & Reload the preview?" @@ -1420,7 +1427,7 @@ msgstr "Η προεπισκόπηση ενημερώθηκε με επιτυχί #: src/components/editors/TemplateEditor/TemplateEditor.tsx:236 msgid "An unknown error occurred while rendering the preview." -msgstr "" +msgstr "Προέκυψε άγνωστο σφάλμα κατά την απόδοση της προεπισκόπησης." #: src/components/editors/TemplateEditor/TemplateEditor.tsx:263 #~ msgid "Save & Reload preview" @@ -1444,7 +1451,7 @@ msgstr "Αποθήκευση του τρέχοντος προτύπου και #: src/components/editors/TemplateEditor/TemplateEditor.tsx:379 msgid "Select instance to preview" -msgstr "" +msgstr "Επιλέξτε Προϊόν για προεπισκόπηση" #: src/components/editors/TemplateEditor/TemplateEditor.tsx:423 msgid "Error rendering template" @@ -1452,52 +1459,52 @@ msgstr "Σφάλμα αποτύπωσης προτύπου" #: src/components/errors/ClientError.tsx:23 msgid "Client Error" -msgstr "" +msgstr "Σφάλμα πελάτη" #: src/components/errors/ClientError.tsx:24 msgid "Client error occurred" -msgstr "" +msgstr "Προέκυψε σφάλμα πελάτη" #: src/components/errors/GenericErrorPage.tsx:50 msgid "Status Code" -msgstr "" +msgstr "Κωδικός κατάστασης" #: src/components/errors/GenericErrorPage.tsx:63 msgid "Return to the index page" -msgstr "" +msgstr "Επιστροφή στην αρχική σελίδα" #: src/components/errors/NotAuthenticated.tsx:8 msgid "Not Authenticated" -msgstr "" +msgstr "Μη πιστοποιημένος" #: src/components/errors/NotAuthenticated.tsx:9 msgid "You are not logged in." -msgstr "" +msgstr "Δεν έχετε συνδεθεί." #: src/components/errors/NotFound.tsx:8 msgid "Page Not Found" -msgstr "" +msgstr "Η σελίδα δεν βρέθηκε" #: src/components/errors/NotFound.tsx:9 msgid "This page does not exist" -msgstr "" +msgstr "Αυτή η σελίδα δεν υπάρχει" #: src/components/errors/PermissionDenied.tsx:8 #: src/functions/notifications.tsx:25 msgid "Permission Denied" -msgstr "" +msgstr "Άρνηση πρόσβασης" #: src/components/errors/PermissionDenied.tsx:9 msgid "You do not have permission to view this page." -msgstr "" +msgstr "Δεν έχετε δικαίωμα πρόσβασης σε αυτήν τη σελίδα." #: src/components/errors/ServerError.tsx:8 msgid "Server Error" -msgstr "" +msgstr "Σφάλμα διακομιστή" #: src/components/errors/ServerError.tsx:9 msgid "A server error occurred" -msgstr "" +msgstr "Προέκυψε σφάλμα διακομιστή" #: src/components/forms/ApiForm.tsx:103 #: src/components/forms/ApiForm.tsx:594 @@ -1510,7 +1517,7 @@ msgstr "Σφάλμα Φόρμας" #: src/components/forms/ApiForm.tsx:604 msgid "Errors exist for one or more form fields" -msgstr "" +msgstr "Υπάρχουν σφάλματα σε ένα ή περισσότερα πεδία της φόρμας" #: src/components/forms/ApiForm.tsx:715 #: src/hooks/UseForm.tsx:133 @@ -1543,14 +1550,14 @@ msgstr "Επιτυχής σύνδεση" #: src/components/forms/AuthenticationForm.tsx:74 msgid "Logged in successfully" -msgstr "" +msgstr "Συνδεθήκατε με επιτυχία" #: src/components/forms/AuthenticationForm.tsx:81 #: src/components/forms/AuthenticationForm.tsx:89 #: src/functions/auth.tsx:132 #: src/functions/auth.tsx:141 msgid "Login failed" -msgstr "" +msgstr "Αποτυχία σύνδεσης" #: src/components/forms/AuthenticationForm.tsx:82 #: src/components/forms/AuthenticationForm.tsx:90 @@ -1558,31 +1565,31 @@ msgstr "" #: src/functions/auth.tsx:133 #: src/functions/auth.tsx:313 msgid "Check your input and try again." -msgstr "" +msgstr "Ελέγξτε τα στοιχεία σας και προσπαθήστε ξανά." #: src/components/forms/AuthenticationForm.tsx:100 #: src/functions/auth.tsx:304 msgid "Mail delivery successful" -msgstr "" +msgstr "Το email στάλθηκε με επιτυχία" #: src/components/forms/AuthenticationForm.tsx:101 msgid "Check your inbox for the login link. If you have an account, you will receive a login link. Check in spam too." -msgstr "" +msgstr "Ελέγξτε το inbox σας για τον σύνδεσμο σύνδεσης. Αν έχετε λογαριασμό, θα λάβετε έναν σύνδεσμο. Ελέγξτε και τα spam." #: src/components/forms/AuthenticationForm.tsx:105 msgid "Mail delivery failed" -msgstr "" +msgstr "Αποτυχία αποστολής email" #: src/components/forms/AuthenticationForm.tsx:125 msgid "Or continue with other methods" -msgstr "" +msgstr "Ή συνεχίστε με άλλες μεθόδους" #: src/components/forms/AuthenticationForm.tsx:136 #: src/components/forms/AuthenticationForm.tsx:296 #: src/pages/Index/Settings/AccountSettings/AccountDetailPanel.tsx:64 #: src/pages/core/UserDetail.tsx:48 msgid "Username" -msgstr "" +msgstr "Όνομα χρήστη" #: src/components/forms/AuthenticationForm.tsx:136 #~ msgid "I will use username and password" @@ -1591,107 +1598,107 @@ msgstr "" #: src/components/forms/AuthenticationForm.tsx:138 #: src/components/forms/AuthenticationForm.tsx:298 msgid "Your username" -msgstr "" +msgstr "Το όνομα χρήστη σας" #: src/components/forms/AuthenticationForm.tsx:143 #: src/components/forms/AuthenticationForm.tsx:311 #: src/pages/Auth/ResetPassword.tsx:34 #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:193 msgid "Password" -msgstr "" +msgstr "Κωδικός πρόσβασης" #: src/components/forms/AuthenticationForm.tsx:145 #: src/components/forms/AuthenticationForm.tsx:313 msgid "Your password" -msgstr "" +msgstr "Ο κωδικός πρόσβασής σας" #: src/components/forms/AuthenticationForm.tsx:164 msgid "Reset password" -msgstr "" +msgstr "Επαναφορά κωδικού" #: src/components/forms/AuthenticationForm.tsx:173 #: src/components/forms/AuthenticationForm.tsx:303 #: src/pages/Auth/Reset.tsx:17 #: src/pages/core/UserDetail.tsx:71 msgid "Email" -msgstr "" +msgstr "Email" #: src/components/forms/AuthenticationForm.tsx:174 #: src/pages/Auth/Reset.tsx:18 msgid "We will send you a link to login - if you are registered" -msgstr "" +msgstr "Θα σας στείλουμε έναν σύνδεσμο σύνδεσης — αν είστε εγγεγραμμένος" #: src/components/forms/AuthenticationForm.tsx:190 msgid "Send me an email" -msgstr "" +msgstr "Στείλτε μου email" #: src/components/forms/AuthenticationForm.tsx:192 msgid "Use username and password" -msgstr "" +msgstr "Χρήση ονόματος χρήστη και κωδικού" #: src/components/forms/AuthenticationForm.tsx:201 msgid "Log In" -msgstr "" +msgstr "Σύνδεση" #: src/components/forms/AuthenticationForm.tsx:203 #: src/pages/Auth/Reset.tsx:26 msgid "Send Email" -msgstr "" +msgstr "Αποστολή Email" #: src/components/forms/AuthenticationForm.tsx:239 msgid "Passwords do not match" -msgstr "" +msgstr "Οι κωδικοί δεν ταιριάζουν" #: src/components/forms/AuthenticationForm.tsx:256 msgid "Registration successful" -msgstr "" +msgstr "Επιτυχής εγγραφή" #: src/components/forms/AuthenticationForm.tsx:257 msgid "Please confirm your email address to complete the registration" -msgstr "" +msgstr "Επιβεβαιώστε το email σας για να ολοκληρωθεί η εγγραφή" #: src/components/forms/AuthenticationForm.tsx:280 msgid "Input error" -msgstr "" +msgstr "Σφάλμα εισαγωγής" #: src/components/forms/AuthenticationForm.tsx:281 msgid "Check your input and try again. " -msgstr "" +msgstr "Ελέγξτε τα στοιχεία και προσπαθήστε ξανά. " #: src/components/forms/AuthenticationForm.tsx:305 msgid "This will be used for a confirmation" -msgstr "" +msgstr "Αυτό θα χρησιμοποιηθεί για επιβεβαίωση" #: src/components/forms/AuthenticationForm.tsx:318 msgid "Password repeat" -msgstr "" +msgstr "Επανάληψη κωδικού" #: src/components/forms/AuthenticationForm.tsx:320 msgid "Repeat password" -msgstr "" +msgstr "Επαναλάβετε τον κωδικό" #: src/components/forms/AuthenticationForm.tsx:332 #: src/pages/Auth/Login.tsx:121 #: src/pages/Auth/Register.tsx:13 msgid "Register" -msgstr "" +msgstr "Εγγραφή" #: src/components/forms/AuthenticationForm.tsx:338 msgid "Or use SSO" -msgstr "" +msgstr "Ή χρησιμοποιήστε SSO" #: src/components/forms/AuthenticationForm.tsx:348 msgid "Registration not active" -msgstr "" +msgstr "Η εγγραφή δεν είναι ενεργή" #: src/components/forms/AuthenticationForm.tsx:349 msgid "This might be related to missing mail settings or could be a deliberate decision." -msgstr "" +msgstr "Αυτό μπορεί να οφείλεται σε ελλιπείς ρυθμίσεις email ή να είναι σκόπιμη επιλογή." #: src/components/forms/HostOptionsForm.tsx:36 #: src/components/forms/HostOptionsForm.tsx:67 msgid "Host" -msgstr "" +msgstr "Υπολογιστής/Host" #: src/components/forms/HostOptionsForm.tsx:42 #: src/components/forms/HostOptionsForm.tsx:70 @@ -1714,22 +1721,22 @@ msgstr "" #: src/tables/settings/PendingTasksTable.tsx:37 #: src/tables/stock/LocationTypesTable.tsx:74 msgid "Name" -msgstr "" +msgstr "Όνομα" #: src/components/forms/HostOptionsForm.tsx:75 msgid "No one here..." -msgstr "" +msgstr "Κανένας εδώ..." #: src/components/forms/HostOptionsForm.tsx:86 msgid "Add Host" -msgstr "" +msgstr "Προσθήκη Host" #: src/components/forms/HostOptionsForm.tsx:90 #: src/components/items/RoleTable.tsx:224 #: src/components/items/TransferList.tsx:215 #: src/components/items/TransferList.tsx:223 msgid "Save" -msgstr "" +msgstr "Αποθήκευση" #: src/components/forms/InstanceOptions.tsx:43 #~ msgid "Select destination instance" @@ -1737,12 +1744,12 @@ msgstr "" #: src/components/forms/InstanceOptions.tsx:58 msgid "Select Server" -msgstr "" +msgstr "Επιλέξτε Διακομιστή" #: src/components/forms/InstanceOptions.tsx:68 #: src/components/forms/InstanceOptions.tsx:92 msgid "Edit host options" -msgstr "" +msgstr "Επεξεργασία επιλογών host" #: src/components/forms/InstanceOptions.tsx:71 #~ msgid "Edit possible host options" @@ -1750,7 +1757,7 @@ msgstr "" #: src/components/forms/InstanceOptions.tsx:76 msgid "Save host selection" -msgstr "" +msgstr "Αποθήκευση επιλογής host" #: src/components/forms/InstanceOptions.tsx:98 #~ msgid "Version: {0}" @@ -1771,26 +1778,26 @@ msgstr "" #: src/components/forms/InstanceOptions.tsx:118 #: src/pages/Index/Settings/SystemSettings.tsx:45 msgid "Server" -msgstr "" +msgstr "Διακομιστής" #: src/components/forms/InstanceOptions.tsx:130 #: src/components/plugins/PluginDrawer.tsx:88 #: src/tables/plugin/PluginListTable.tsx:127 msgid "Version" -msgstr "" +msgstr "Έκδοση" #: src/components/forms/InstanceOptions.tsx:136 #: src/components/modals/AboutInvenTreeModal.tsx:124 #: src/components/modals/ServerInfoModal.tsx:34 msgid "API Version" -msgstr "" +msgstr "Έκδοση API" #: src/components/forms/InstanceOptions.tsx:142 #: src/components/nav/NavigationDrawer.tsx:197 #: src/pages/Index/Settings/AdminCenter/Index.tsx:228 #: src/pages/Index/Settings/AdminCenter/PluginManagementPanel.tsx:46 msgid "Plugins" -msgstr "" +msgstr "Plugins" #: src/components/forms/InstanceOptions.tsx:143 #: src/tables/part/PartTestTemplateTable.tsx:117 @@ -1798,86 +1805,86 @@ msgstr "" #: src/tables/settings/TemplateTable.tsx:362 #: src/tables/stock/StockItemTestResultTable.tsx:419 msgid "Enabled" -msgstr "" +msgstr "Ενεργό" #: src/components/forms/InstanceOptions.tsx:143 msgid "Disabled" -msgstr "" +msgstr "Ανενεργό" #: src/components/forms/InstanceOptions.tsx:149 msgid "Worker" -msgstr "" +msgstr "Worker" #: src/components/forms/InstanceOptions.tsx:150 #: src/tables/settings/FailedTasksTable.tsx:48 msgid "Stopped" -msgstr "" +msgstr "Σταματημένο" #: src/components/forms/InstanceOptions.tsx:150 msgid "Running" -msgstr "" +msgstr "Σε λειτουργία" -#: src/components/forms/fields/ApiFormField.tsx:233 +#: src/components/forms/fields/ApiFormField.tsx:197 msgid "Select file to upload" -msgstr "" +msgstr "Επιλέξτε αρχείο για μεταφόρτωση" + +#: src/components/forms/fields/AutoFillRightSection.tsx:47 +msgid "Accept suggested value" +msgstr "Αποδοχή προτεινόμενης τιμής" #: src/components/forms/fields/DateField.tsx:76 msgid "Select date" -msgstr "" +msgstr "Επιλέξτε ημερομηνία" #: src/components/forms/fields/IconField.tsx:83 msgid "No icon selected" -msgstr "" +msgstr "Δεν επιλέχθηκε εικονίδιο" #: src/components/forms/fields/IconField.tsx:161 msgid "Uncategorized" -msgstr "" +msgstr "Χωρίς κατηγορία" #: src/components/forms/fields/IconField.tsx:211 #: src/components/nav/Layout.tsx:138 #: src/tables/part/PartThumbTable.tsx:199 msgid "Search..." -msgstr "" +msgstr "Αναζήτηση..." #: src/components/forms/fields/IconField.tsx:225 #: src/components/wizards/ImportPartWizard.tsx:304 msgid "Select category" -msgstr "" +msgstr "Επιλέξτε κατηγορία" #: src/components/forms/fields/IconField.tsx:234 msgid "Select pack" -msgstr "" +msgstr "Επιλέξτε πακέτο" #. placeholder {0}: filteredIcons.length #: src/components/forms/fields/IconField.tsx:239 msgid "{0} icons" -msgstr "" +msgstr "{0} εικονίδια" #: src/components/forms/fields/RelatedModelField.tsx:409 #: src/components/modals/AboutInvenTreeModal.tsx:96 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:383 msgid "Loading" -msgstr "" +msgstr "Φόρτωση" #: src/components/forms/fields/RelatedModelField.tsx:411 msgid "No results found" -msgstr "" +msgstr "Δεν βρέθηκαν αποτελέσματα" #: src/components/forms/fields/TableField.tsx:46 msgid "modelRenderer entry required for tables" -msgstr "" +msgstr "Απαιτείται modelRenderer για πίνακες" #: src/components/forms/fields/TableField.tsx:187 msgid "No entries available" -msgstr "" +msgstr "Δεν υπάρχουν διαθέσιμες εγγραφές" #: src/components/forms/fields/TableField.tsx:198 msgid "Add new row" -msgstr "" - -#: src/components/forms/fields/TextField.tsx:82 -msgid "Accept suggested value" -msgstr "" +msgstr "Προσθήκη νέας γραμμής" #: src/components/images/DetailsImage.tsx:252 #~ msgid "Select image" @@ -1885,65 +1892,65 @@ msgstr "" #: src/components/images/Thumbnail.tsx:12 msgid "Thumbnail" -msgstr "" +msgstr "Μικρογραφία" #: src/components/importer/ImportDataSelector.tsx:175 msgid "Importing Rows" -msgstr "" +msgstr "Γίνεται εισαγωγή γραμμών" #: src/components/importer/ImportDataSelector.tsx:176 msgid "Please wait while the data is imported" -msgstr "" +msgstr "Παρακαλώ περιμένετε ενώ γίνεται η εισαγωγή δεδομένων" #: src/components/importer/ImportDataSelector.tsx:193 msgid "An error occurred while importing data" -msgstr "" +msgstr "Παρουσιάστηκε σφάλμα κατά την εισαγωγή δεδομένων" #: src/components/importer/ImportDataSelector.tsx:214 msgid "Edit Data" -msgstr "" +msgstr "Επεξεργασία δεδομένων" #: src/components/importer/ImportDataSelector.tsx:246 msgid "Delete Row" -msgstr "" +msgstr "Διαγραφή γραμμής" #: src/components/importer/ImportDataSelector.tsx:276 msgid "Row" -msgstr "" +msgstr "Γραμμή" #: src/components/importer/ImportDataSelector.tsx:294 msgid "Row contains errors" -msgstr "" +msgstr "Η γραμμή περιέχει σφάλματα" #: src/components/importer/ImportDataSelector.tsx:335 msgid "Accept" -msgstr "" +msgstr "Αποδοχή" #: src/components/importer/ImportDataSelector.tsx:368 msgid "Valid" -msgstr "" +msgstr "Έγκυρο" #: src/components/importer/ImportDataSelector.tsx:369 msgid "Filter by row validation status" -msgstr "" +msgstr "Φιλτράρισμα ανά κατάσταση εγκυρότητας" #: src/components/importer/ImportDataSelector.tsx:374 #: src/components/wizards/WizardDrawer.tsx:113 #: src/tables/build/BuildOutputTable.tsx:533 msgid "Complete" -msgstr "" +msgstr "Ολοκληρωμένο" #: src/components/importer/ImportDataSelector.tsx:375 msgid "Filter by row completion status" -msgstr "" +msgstr "Φιλτράρισμα ανά κατάσταση ολοκλήρωσης" #: src/components/importer/ImportDataSelector.tsx:393 msgid "Import selected rows" -msgstr "" +msgstr "Εισαγωγή επιλεγμένων γραμμών" #: src/components/importer/ImportDataSelector.tsx:408 msgid "Processing Data" -msgstr "" +msgstr "Επεξεργασία δεδομένων" #: src/components/importer/ImporterColumnSelector.tsx:56 #: src/components/importer/ImporterColumnSelector.tsx:203 @@ -1951,11 +1958,11 @@ msgstr "" #: src/functions/api.tsx:60 #: src/functions/auth.tsx:364 msgid "An error occurred" -msgstr "" +msgstr "Παρουσιάστηκε σφάλμα" #: src/components/importer/ImporterColumnSelector.tsx:69 msgid "Select column, or leave blank to ignore this field." -msgstr "" +msgstr "Επιλέξτε στήλη ή αφήστε κενό για να αγνοηθεί το πεδίο." #: src/components/importer/ImporterColumnSelector.tsx:91 #~ msgid "Select a column from the data file" @@ -1971,55 +1978,55 @@ msgstr "" #: src/components/importer/ImporterColumnSelector.tsx:209 msgid "Ignore this field" -msgstr "" +msgstr "Αγνόηση αυτού του πεδίου" #: src/components/importer/ImporterColumnSelector.tsx:223 msgid "Mapping data columns to database fields" -msgstr "" +msgstr "Αντιστοίχιση στηλών δεδομένων με πεδία βάσης δεδομένων" #: src/components/importer/ImporterColumnSelector.tsx:228 msgid "Accept Column Mapping" -msgstr "" +msgstr "Αποδοχή αντιστοίχισης στηλών" #: src/components/importer/ImporterColumnSelector.tsx:241 msgid "Database Field" -msgstr "" +msgstr "Πεδίο βάσης δεδομένων" #: src/components/importer/ImporterColumnSelector.tsx:242 msgid "Field Description" -msgstr "" +msgstr "Περιγραφή πεδίου" #: src/components/importer/ImporterColumnSelector.tsx:243 msgid "Imported Column" -msgstr "" +msgstr "Εισαγόμενη στήλη" #: src/components/importer/ImporterColumnSelector.tsx:244 msgid "Default Value" -msgstr "" +msgstr "Προεπιλεγμένη τιμή" #: src/components/importer/ImporterDrawer.tsx:43 msgid "Upload File" -msgstr "" +msgstr "Μεταφόρτωση αρχείου" #: src/components/importer/ImporterDrawer.tsx:44 msgid "Map Columns" -msgstr "" +msgstr "Αντιστοίχιση στηλών" #: src/components/importer/ImporterDrawer.tsx:45 msgid "Import Data" -msgstr "" +msgstr "Εισαγωγή δεδομένων" #: src/components/importer/ImporterDrawer.tsx:46 msgid "Process Data" -msgstr "" +msgstr "Επεξεργασία δεδομένων" #: src/components/importer/ImporterDrawer.tsx:47 msgid "Complete Import" -msgstr "" +msgstr "Ολοκλήρωση εισαγωγής" #: src/components/importer/ImporterDrawer.tsx:89 msgid "Failed to fetch import session data" -msgstr "" +msgstr "Αποτυχία λήψης δεδομένων συνεδρίας εισαγωγής" #: src/components/importer/ImporterDrawer.tsx:97 #~ msgid "Cancel import session" @@ -2027,11 +2034,11 @@ msgstr "" #: src/components/importer/ImporterDrawer.tsx:104 msgid "Import Complete" -msgstr "" +msgstr "Η εισαγωγή ολοκληρώθηκε" #: src/components/importer/ImporterDrawer.tsx:107 msgid "Data has been imported successfully" -msgstr "" +msgstr "Τα δεδομένα εισήχθησαν με επιτυχία" #: src/components/importer/ImporterDrawer.tsx:109 #: src/components/modals/AboutInvenTreeModal.tsx:205 @@ -2040,7 +2047,7 @@ msgstr "" #: src/forms/BomForms.tsx:132 #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:685 msgid "Close" -msgstr "" +msgstr "Κλείσιμο" #: src/components/importer/ImporterDrawer.tsx:119 #~ msgid "Import session has unknown status" @@ -2048,7 +2055,7 @@ msgstr "" #: src/components/importer/ImporterDrawer.tsx:128 msgid "Importing Data" -msgstr "" +msgstr "Γίνεται εισαγωγή δεδομένων" #: src/components/importer/ImporterImportProgress.tsx:36 #~ msgid "Importing Records" @@ -2060,11 +2067,11 @@ msgstr "" #: src/components/importer/ImporterStatus.tsx:19 msgid "Unknown Status" -msgstr "" +msgstr "Άγνωστη κατάσταση" #: src/components/items/ActionDropdown.tsx:135 msgid "Options" -msgstr "" +msgstr "Επιλογές" #: src/components/items/ActionDropdown.tsx:162 #~ msgid "Link custom barcode" @@ -2074,44 +2081,44 @@ msgstr "" #: src/tables/InvenTreeTableHeader.tsx:193 #: src/tables/InvenTreeTableHeader.tsx:194 msgid "Barcode Actions" -msgstr "" +msgstr "Ενέργειες Barcode" #: src/components/items/ActionDropdown.tsx:176 msgid "View Barcode" -msgstr "" +msgstr "Προβολή Barcode" #: src/components/items/ActionDropdown.tsx:178 msgid "View barcode" -msgstr "" +msgstr "Προβολή barcode" #: src/components/items/ActionDropdown.tsx:184 msgid "Link Barcode" -msgstr "" +msgstr "Σύνδεση Barcode" #: src/components/items/ActionDropdown.tsx:186 msgid "Link a custom barcode to this item" -msgstr "" +msgstr "Σύνδεση προσαρμοσμένου barcode με αυτό το στοιχείο" #: src/components/items/ActionDropdown.tsx:194 msgid "Unlink custom barcode" -msgstr "" +msgstr "Αποσύνδεση προσαρμοσμένου barcode" #: src/components/items/ActionDropdown.tsx:246 msgid "Edit item" -msgstr "" +msgstr "Επεξεργασία Προϊόντος" #: src/components/items/ActionDropdown.tsx:258 msgid "Delete item" -msgstr "" +msgstr "Διαγραφή Προϊόντος" #: src/components/items/ActionDropdown.tsx:266 #: src/components/items/ActionDropdown.tsx:267 msgid "Hold" -msgstr "" +msgstr "Κράτηση" #: src/components/items/ActionDropdown.tsx:290 msgid "Duplicate item" -msgstr "" +msgstr "Αντιγραφή Προϊόντος" #: src/components/items/BarcodeInput.tsx:24 #~ msgid "Scan barcode data here using barcode scanner" @@ -2119,18 +2126,18 @@ msgstr "" #: src/components/items/ColorToggle.tsx:17 msgid "Toggle color scheme" -msgstr "" +msgstr "Εναλλαγή χρωματικού θέματος" #: src/components/items/DocTooltip.tsx:92 #: src/components/items/GettingStartedCarousel.tsx:20 msgid "Read More" -msgstr "" +msgstr "Διαβάστε περισσότερα" #: src/components/items/ErrorItem.tsx:8 #: src/functions/api.tsx:51 #: src/tables/settings/PendingTasksTable.tsx:80 msgid "Unknown error" -msgstr "" +msgstr "Άγνωστο σφάλμα" #: src/components/items/ErrorItem.tsx:13 #~ msgid "An error occurred:" @@ -2142,20 +2149,20 @@ msgstr "" #: src/components/items/InfoItem.tsx:27 msgid "None" -msgstr "" +msgstr "Κανένα" #: src/components/items/InvenTreeLogo.tsx:23 msgid "InvenTree Logo" -msgstr "" +msgstr "Λογότυπο InvenTree" #: src/components/items/LanguageToggle.tsx:21 msgid "Select language" -msgstr "" +msgstr "Επιλέξτε γλώσσα" #: src/components/items/OnlyStaff.tsx:10 #: src/components/modals/AboutInvenTreeModal.tsx:50 msgid "This information is only available for staff users" -msgstr "" +msgstr "Αυτές οι πληροφορίες είναι διαθέσιμες μόνο σε προσωπικό" #: src/components/items/Placeholder.tsx:14 #~ msgid "This feature/button/site is a placeholder for a feature that is not implemented, only partial or intended for testing." @@ -2167,11 +2174,11 @@ msgstr "" #: src/components/items/RoleTable.tsx:81 msgid "Updating" -msgstr "" +msgstr "Γίνεται ενημέρωση" #: src/components/items/RoleTable.tsx:82 msgid "Updating group roles" -msgstr "" +msgstr "Ενημέρωση ρόλων ομάδας" #: src/components/items/RoleTable.tsx:118 #: src/components/settings/ConfigValueList.tsx:42 @@ -2179,63 +2186,63 @@ msgstr "" #: src/pages/part/pricing/VariantPricingPanel.tsx:51 #: src/tables/purchasing/SupplierPartTable.tsx:155 msgid "Updated" -msgstr "" +msgstr "Ενημερώθηκε" #: src/components/items/RoleTable.tsx:119 msgid "Group roles updated" -msgstr "" +msgstr "Οι ρόλοι της ομάδας ενημερώθηκαν" #: src/components/items/RoleTable.tsx:135 msgid "Role" -msgstr "" +msgstr "Ρόλος" #: src/components/items/RoleTable.tsx:140 #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:892 msgid "View" -msgstr "" +msgstr "Προβολή" #: src/components/items/RoleTable.tsx:145 msgid "Change" -msgstr "" +msgstr "Αλλαγή" #: src/components/items/RoleTable.tsx:150 #: src/forms/StockForms.tsx:927 #: src/tables/stock/StockItemTestResultTable.tsx:367 msgid "Add" -msgstr "" +msgstr "Προσθήκη" #: src/components/items/RoleTable.tsx:203 msgid "Reset group roles" -msgstr "" +msgstr "Επαναφορά ρόλων ομάδας" #: src/components/items/RoleTable.tsx:212 msgid "Reset" -msgstr "" +msgstr "Επαναφορά" #: src/components/items/RoleTable.tsx:215 msgid "Save group roles" -msgstr "" +msgstr "Αποθήκευση ρόλων ομάδας" #: src/components/items/TransferList.tsx:65 msgid "No items" -msgstr "" +msgstr "Κανένα στοιχείο" #: src/components/items/TransferList.tsx:161 #: src/components/render/Stock.tsx:102 #: src/pages/part/PartDetail.tsx:994 #: src/pages/stock/StockDetail.tsx:265 #: src/pages/stock/StockDetail.tsx:942 -#: src/tables/build/BuildAllocatedStockTable.tsx:135 -#: src/tables/build/BuildLineTable.tsx:192 +#: src/tables/build/BuildAllocatedStockTable.tsx:132 +#: src/tables/build/BuildLineTable.tsx:193 #: src/tables/part/PartTable.tsx:137 #: src/tables/stock/StockItemTable.tsx:182 #: src/tables/stock/StockItemTable.tsx:343 msgid "Available" -msgstr "" +msgstr "Διαθέσιμο" #: src/components/items/TransferList.tsx:162 msgid "Selected" -msgstr "" +msgstr "Επιλεγμένο" #: src/components/modals/AboutInvenTreeModal.tsx:103 #~ msgid "Your InvenTree version status is" @@ -2243,31 +2250,31 @@ msgstr "" #: src/components/modals/AboutInvenTreeModal.tsx:118 msgid "InvenTree Version" -msgstr "" +msgstr "Έκδοση InvenTree" #: src/components/modals/AboutInvenTreeModal.tsx:130 msgid "Python Version" -msgstr "" +msgstr "Έκδοση Python" #: src/components/modals/AboutInvenTreeModal.tsx:135 msgid "Django Version" -msgstr "" +msgstr "Έκδοση Django" #: src/components/modals/AboutInvenTreeModal.tsx:144 msgid "Commit Hash" -msgstr "" +msgstr "Commit Hash" #: src/components/modals/AboutInvenTreeModal.tsx:149 msgid "Commit Date" -msgstr "" +msgstr "Ημερομηνία Commit" #: src/components/modals/AboutInvenTreeModal.tsx:154 msgid "Commit Branch" -msgstr "" +msgstr "Branch Commit" #: src/components/modals/AboutInvenTreeModal.tsx:165 msgid "Version Information" -msgstr "" +msgstr "Πληροφορίες Έκδοσης" #: src/components/modals/AboutInvenTreeModal.tsx:165 #~ msgid "Credits" @@ -2283,25 +2290,25 @@ msgstr "" #: src/components/modals/AboutInvenTreeModal.tsx:174 msgid "Links" -msgstr "" +msgstr "Σύνδεσμοι" #: src/components/modals/AboutInvenTreeModal.tsx:180 #: src/components/nav/NavigationDrawer.tsx:208 #: src/defaults/actions.tsx:48 msgid "Documentation" -msgstr "" +msgstr "Τεκμηρίωση" #: src/components/modals/AboutInvenTreeModal.tsx:181 msgid "Source Code" -msgstr "" +msgstr "Πηγαίος Κώδικας" #: src/components/modals/AboutInvenTreeModal.tsx:182 msgid "Mobile App" -msgstr "" +msgstr "Εφαρμογή κινητού" #: src/components/modals/AboutInvenTreeModal.tsx:183 msgid "Submit Bug Report" -msgstr "" +msgstr "Υποβολή αναφοράς σφάλματος" #: src/components/modals/AboutInvenTreeModal.tsx:189 #: src/components/modals/ServerInfoModal.tsx:147 @@ -2310,39 +2317,39 @@ msgstr "" #: src/components/modals/AboutInvenTreeModal.tsx:195 msgid "Copy version information" -msgstr "" +msgstr "Αντιγραφή πληροφοριών έκδοσης" #: src/components/modals/AboutInvenTreeModal.tsx:215 msgid "Development Version" -msgstr "" +msgstr "Έκδοση ανάπτυξης" #: src/components/modals/AboutInvenTreeModal.tsx:217 msgid "Up to Date" -msgstr "" +msgstr "Ενημερωμένο" #: src/components/modals/AboutInvenTreeModal.tsx:219 msgid "Update Available" -msgstr "" +msgstr "Διαθέσιμη ενημέρωση" #: src/components/modals/LicenseModal.tsx:41 msgid "No license text available" -msgstr "" +msgstr "Δεν υπάρχει διαθέσιμο κείμενο άδειας" #: src/components/modals/LicenseModal.tsx:48 msgid "No Information provided - this is likely a server issue" -msgstr "" +msgstr "Δεν δόθηκαν πληροφορίες — πιθανό πρόβλημα διακομιστή" #: src/components/modals/LicenseModal.tsx:81 msgid "Loading license information" -msgstr "" +msgstr "Φόρτωση πληροφοριών άδειας" #: src/components/modals/LicenseModal.tsx:87 msgid "Failed to fetch license information" -msgstr "" +msgstr "Αποτυχία λήψης πληροφοριών άδειας" #: src/components/modals/LicenseModal.tsx:99 msgid "{key} Packages" -msgstr "" +msgstr "Πακέτα {key}" #: src/components/modals/QrCodeModal.tsx:24 #~ msgid "Unknown response" @@ -2358,11 +2365,11 @@ msgstr "" #: src/components/modals/ServerInfoModal.tsx:22 msgid "Instance Name" -msgstr "" +msgstr "Όνομα instance" #: src/components/modals/ServerInfoModal.tsx:28 msgid "Server Version" -msgstr "" +msgstr "Έκδοση διακομιστή" #: src/components/modals/ServerInfoModal.tsx:38 #~ msgid "Bebug Mode" @@ -2370,57 +2377,57 @@ msgstr "" #: src/components/modals/ServerInfoModal.tsx:40 msgid "Database" -msgstr "" +msgstr "Βάση δεδομένων" #: src/components/modals/ServerInfoModal.tsx:49 #: src/components/nav/Alerts.tsx:118 msgid "Debug Mode" -msgstr "" +msgstr "Λειτουργία αποσφαλμάτωσης" #: src/components/modals/ServerInfoModal.tsx:54 msgid "Server is running in debug mode" -msgstr "" +msgstr "Ο διακομιστής λειτουργεί σε debug mode" #: src/components/modals/ServerInfoModal.tsx:62 msgid "Docker Mode" -msgstr "" +msgstr "Λειτουργία Docker" #: src/components/modals/ServerInfoModal.tsx:65 msgid "Server is deployed using docker" -msgstr "" +msgstr "Ο διακομιστής έχει αναπτυχθεί μέσω Docker" #: src/components/modals/ServerInfoModal.tsx:71 msgid "Plugin Support" -msgstr "" +msgstr "Υποστήριξη plugin" #: src/components/modals/ServerInfoModal.tsx:76 msgid "Plugin support enabled" -msgstr "" +msgstr "Η υποστήριξη plugin είναι ενεργή" #: src/components/modals/ServerInfoModal.tsx:78 msgid "Plugin support disabled" -msgstr "" +msgstr "Η υποστήριξη plugin είναι απενεργοποιημένη" #: src/components/modals/ServerInfoModal.tsx:85 msgid "Server status" -msgstr "" +msgstr "Κατάσταση διακομιστή" #: src/components/modals/ServerInfoModal.tsx:91 msgid "Healthy" -msgstr "" +msgstr "Υγιής" #: src/components/modals/ServerInfoModal.tsx:93 msgid "Issues detected" -msgstr "" +msgstr "Εντοπίστηκαν προβλήματα" #: src/components/modals/ServerInfoModal.tsx:102 #: src/components/nav/Alerts.tsx:125 msgid "Background Worker" -msgstr "" +msgstr "Background Worker" #: src/components/modals/ServerInfoModal.tsx:107 msgid "The background worker process is not running" -msgstr "" +msgstr "Η διεργασία background worker δεν εκτελείται" #: src/components/modals/ServerInfoModal.tsx:107 #~ msgid "The Background worker process is not running." @@ -2429,7 +2436,7 @@ msgstr "" #: src/components/modals/ServerInfoModal.tsx:115 #: src/pages/Index/Settings/AdminCenter/Index.tsx:129 msgid "Email Settings" -msgstr "" +msgstr "Ρυθμίσεις email" #: src/components/modals/ServerInfoModal.tsx:118 #~ msgid "Email settings not configured" @@ -2438,43 +2445,43 @@ msgstr "" #: src/components/modals/ServerInfoModal.tsx:120 #: src/components/nav/Alerts.tsx:141 msgid "Email settings not configured." -msgstr "" +msgstr "Οι ρυθμίσεις email δεν έχουν διαμορφωθεί." #: src/components/nav/Alerts.tsx:57 msgid "Alerts" -msgstr "" +msgstr "Ειδοποιήσεις" #: src/components/nav/Alerts.tsx:120 msgid "The server is running in debug mode." -msgstr "" +msgstr "Ο διακομιστής λειτουργεί σε debug mode." #: src/components/nav/Alerts.tsx:127 msgid "The background worker process is not running." -msgstr "" +msgstr "Η διεργασία background worker δεν εκτελείται." #: src/components/nav/Alerts.tsx:132 msgid "Server Restart" -msgstr "" +msgstr "Επανεκκίνηση διακομιστή" #: src/components/nav/Alerts.tsx:134 msgid "The server requires a restart to apply changes." -msgstr "" +msgstr "Απαιτείται επανεκκίνηση του διακομιστή για να εφαρμοστούν οι αλλαγές." #: src/components/nav/Alerts.tsx:139 msgid "Email settings" -msgstr "" +msgstr "Ρυθμίσεις email" #: src/components/nav/Alerts.tsx:146 msgid "Database Migrations" -msgstr "" +msgstr "Μεταναστεύσεις βάσης δεδομένων" #: src/components/nav/Alerts.tsx:148 msgid "There are pending database migrations." -msgstr "" +msgstr "Υπάρχουν εκκρεμείς μεταναστεύσεις στη βάση δεδομένων." #: src/components/nav/Alerts.tsx:163 msgid "Learn more about {code}" -msgstr "" +msgstr "Μάθετε περισσότερα για {code}" #: src/components/nav/Header.tsx:188 #: src/components/nav/NavigationDrawer.tsx:134 @@ -2484,11 +2491,11 @@ msgstr "" #: src/pages/Notifications.tsx:45 #: src/pages/Notifications.tsx:130 msgid "Notifications" -msgstr "" +msgstr "Ειδοποιήσεις" #: src/components/nav/Layout.tsx:141 msgid "Nothing found..." -msgstr "" +msgstr "Δεν βρέθηκε τίποτα..." #: src/components/nav/MainMenu.tsx:40 #: src/pages/Index/Profile/Profile.tsx:15 @@ -2500,7 +2507,7 @@ msgstr "" #: src/pages/Index/Settings/AdminCenter/EmailManagementPanel.tsx:21 #: src/pages/Index/Settings/AdminCenter/UserManagementPanel.tsx:39 msgid "Settings" -msgstr "" +msgstr "Ρυθμίσεις" #: src/components/nav/MainMenu.tsx:59 #: src/defaults/menuItems.tsx:15 @@ -2514,7 +2521,7 @@ msgstr "" #: src/pages/Index/Settings/UserSettings.tsx:141 #: src/pages/Index/Settings/UserSettings.tsx:145 msgid "User Settings" -msgstr "" +msgstr "Ρυθμίσεις χρήστη" #: src/components/nav/MainMenu.tsx:61 #: src/pages/Index/Settings/UserSettings.tsx:145 @@ -2532,7 +2539,7 @@ msgstr "" #: src/pages/Index/Settings/SystemSettings.tsx:348 #: src/pages/Index/Settings/SystemSettings.tsx:353 msgid "System Settings" -msgstr "" +msgstr "Ρυθμίσεις συστήματος" #: src/components/nav/MainMenu.tsx:71 #~ msgid "Switch to pseudo language" @@ -2545,18 +2552,18 @@ msgstr "" #: src/pages/Index/Settings/AdminCenter/Index.tsx:293 #: src/pages/Index/Settings/AdminCenter/Index.tsx:298 msgid "Admin Center" -msgstr "" +msgstr "Κέντρο διαχείρισης" #: src/components/nav/MainMenu.tsx:99 #: src/defaults/actions.tsx:57 #: src/defaults/links.tsx:140 #: src/defaults/links.tsx:186 msgid "About InvenTree" -msgstr "" +msgstr "Σχετικά με το InvenTree" #: src/components/nav/MainMenu.tsx:108 msgid "Logout" -msgstr "" +msgstr "Αποσύνδεση" #: src/components/nav/NavHoverMenu.tsx:84 #~ msgid "View all" @@ -2587,14 +2594,14 @@ msgstr "" #: src/pages/stock/StockDetail.tsx:642 #: src/tables/stock/StockItemTable.tsx:85 msgid "Stock" -msgstr "" +msgstr "Απόθεμα" #: src/components/nav/NavigationDrawer.tsx:84 #: src/defaults/links.tsx:48 #: src/pages/build/BuildDetail.tsx:748 #: src/pages/build/BuildIndex.tsx:102 msgid "Manufacturing" -msgstr "" +msgstr "Κατασκευή" #: src/components/nav/NavigationDrawer.tsx:91 #: src/defaults/links.tsx:54 @@ -2605,7 +2612,7 @@ msgstr "" #: src/pages/purchasing/PurchaseOrderDetail.tsx:553 #: src/pages/purchasing/PurchasingIndex.tsx:122 msgid "Purchasing" -msgstr "" +msgstr "Προμήθειες" #: src/components/nav/NavigationDrawer.tsx:98 #: src/defaults/links.tsx:60 @@ -2615,56 +2622,56 @@ msgstr "" #: src/pages/sales/SalesOrderDetail.tsx:619 #: src/pages/sales/SalesOrderShipmentDetail.tsx:480 msgid "Sales" -msgstr "" +msgstr "Πωλήσεις" #: src/components/nav/NavigationDrawer.tsx:180 msgid "Navigation" -msgstr "" +msgstr "Πλοήγηση" #: src/components/nav/NavigationDrawer.tsx:214 msgid "About" -msgstr "" +msgstr "Σχετικά" #: src/components/nav/NavigationTree.tsx:212 msgid "Error loading navigation tree." -msgstr "" +msgstr "Σφάλμα φόρτωσης του δέντρου πλοήγησης." #: src/components/nav/NotificationDrawer.tsx:183 #: src/pages/Notifications.tsx:74 msgid "Mark all as read" -msgstr "" +msgstr "Σήμανση όλων ως αναγνωσμένων" #: src/components/nav/NotificationDrawer.tsx:193 msgid "View all notifications" -msgstr "" +msgstr "Προβολή όλων των ειδοποιήσεων" #: src/components/nav/NotificationDrawer.tsx:216 msgid "You have no unread notifications." -msgstr "" +msgstr "Δεν υπάρχουν μη αναγνωσμένες ειδοποιήσεις." #: src/components/nav/NotificationDrawer.tsx:238 msgid "Error loading notifications." -msgstr "" +msgstr "Σφάλμα φόρτωσης ειδοποιήσεων." #: src/components/nav/SearchDrawer.tsx:106 msgid "No Overview Available" -msgstr "" +msgstr "Δεν υπάρχει διαθέσιμη επισκόπηση" #: src/components/nav/SearchDrawer.tsx:107 msgid "No overview available for this model type" -msgstr "" +msgstr "Δεν υπάρχει διαθέσιμη επισκόπηση για αυτόν τον τύπο μοντέλου" #: src/components/nav/SearchDrawer.tsx:125 msgid "View all results" -msgstr "" +msgstr "Προβολή όλων των αποτελεσμάτων" #: src/components/nav/SearchDrawer.tsx:140 msgid "results" -msgstr "" +msgstr "αποτελέσματα" #: src/components/nav/SearchDrawer.tsx:144 msgid "Remove search group" -msgstr "" +msgstr "Αφαίρεση ομάδας αναζήτησης" #: src/components/nav/SearchDrawer.tsx:288 #: src/pages/company/ManufacturerPartDetail.tsx:192 @@ -2672,18 +2679,18 @@ msgstr "" #: src/pages/part/PartSupplierDetail.tsx:15 #: src/pages/purchasing/PurchasingIndex.tsx:81 msgid "Suppliers" -msgstr "" +msgstr "Προμηθευτές" #: src/components/nav/SearchDrawer.tsx:298 #: src/pages/part/PartSupplierDetail.tsx:23 #: src/pages/purchasing/PurchasingIndex.tsx:98 msgid "Manufacturers" -msgstr "" +msgstr "Κατασκευαστές" #: src/components/nav/SearchDrawer.tsx:308 #: src/pages/sales/SalesIndex.tsx:138 msgid "Customers" -msgstr "" +msgstr "Πελάτες" #: src/components/nav/SearchDrawer.tsx:462 #~ msgid "No results" @@ -2691,84 +2698,84 @@ msgstr "" #: src/components/nav/SearchDrawer.tsx:477 msgid "Enter search text" -msgstr "" +msgstr "Εισάγετε κείμενο αναζήτησης" #: src/components/nav/SearchDrawer.tsx:488 msgid "Refresh search results" -msgstr "" +msgstr "Ανανέωση αποτελεσμάτων αναζήτησης" #: src/components/nav/SearchDrawer.tsx:499 #: src/components/nav/SearchDrawer.tsx:506 msgid "Search Options" -msgstr "" +msgstr "Επιλογές αναζήτησης" #: src/components/nav/SearchDrawer.tsx:509 msgid "Whole word search" -msgstr "" +msgstr "Αναζήτηση ολόκληρης λέξης" #: src/components/nav/SearchDrawer.tsx:518 msgid "Regex search" -msgstr "" +msgstr "Αναζήτηση με regex" #: src/components/nav/SearchDrawer.tsx:527 msgid "Notes search" -msgstr "" +msgstr "Αναζήτηση στις σημειώσεις" #: src/components/nav/SearchDrawer.tsx:575 msgid "An error occurred during search query" -msgstr "" +msgstr "Παρουσιάστηκε σφάλμα κατά την αναζήτηση" #: src/components/nav/SearchDrawer.tsx:586 #: src/tables/part/PartTestTemplateTable.tsx:82 msgid "No Results" -msgstr "" +msgstr "Κανένα αποτέλεσμα" #: src/components/nav/SearchDrawer.tsx:589 msgid "No results available for search query" -msgstr "" +msgstr "Δεν υπάρχουν αποτελέσματα για το ερώτημα αναζήτησης" #: src/components/panels/AttachmentPanel.tsx:18 msgid "Attachments" -msgstr "" +msgstr "Συνημμένα" #: src/components/panels/NotesPanel.tsx:23 #: src/tables/part/PartTestResultTable.tsx:214 #: src/tables/stock/StockTrackingTable.tsx:212 msgid "Notes" -msgstr "" +msgstr "Σημειώσεις" #: src/components/panels/PanelGroup.tsx:158 msgid "Plugin Provided" -msgstr "" +msgstr "Παρέχεται από πρόσθετο" #: src/components/panels/PanelGroup.tsx:280 msgid "Collapse panels" -msgstr "" +msgstr "Σύμπτυξη πλαισίων" #: src/components/panels/PanelGroup.tsx:280 msgid "Expand panels" -msgstr "" +msgstr "Ανάπτυξη πλαισίων" #: src/components/plugins/LocateItemButton.tsx:68 #: src/components/plugins/LocateItemButton.tsx:88 msgid "Locate Item" -msgstr "" +msgstr "Εντοπισμός Προϊόντος" #: src/components/plugins/LocateItemButton.tsx:70 msgid "Item location requested" -msgstr "" +msgstr "Ζητήθηκε εντοπισμός Προϊόντος" #: src/components/plugins/PluginDrawer.tsx:47 msgid "Plugin Inactive" -msgstr "" +msgstr "Ανενεργό πρόσθετο" #: src/components/plugins/PluginDrawer.tsx:50 msgid "Plugin is not active" -msgstr "" +msgstr "Το πρόσθετο δεν είναι ενεργό" #: src/components/plugins/PluginDrawer.tsx:59 msgid "Plugin Information" -msgstr "" +msgstr "Πληροφορίες πρόσθετου" #: src/components/plugins/PluginDrawer.tsx:73 #: src/forms/selectionListFields.tsx:102 @@ -2784,16 +2791,16 @@ msgstr "" #: src/pages/sales/SalesOrderDetail.tsx:119 #: src/pages/stock/LocationDetail.tsx:102 #: src/tables/ColumnRenderers.tsx:278 -#: src/tables/build/BuildAllocatedStockTable.tsx:91 +#: src/tables/build/BuildAllocatedStockTable.tsx:88 #: src/tables/machine/MachineTypeTable.tsx:161 #: src/tables/machine/MachineTypeTable.tsx:257 #: src/tables/plugin/PluginListTable.tsx:110 msgid "Description" -msgstr "" +msgstr "Περιγραφή" #: src/components/plugins/PluginDrawer.tsx:78 msgid "Author" -msgstr "" +msgstr "Συγγραφέας" #: src/components/plugins/PluginDrawer.tsx:83 #: src/pages/part/pricing/PurchaseHistoryPanel.tsx:41 @@ -2801,7 +2808,7 @@ msgstr "" #: src/tables/ColumnRenderers.tsx:473 #: src/tables/part/PartTestResultTable.tsx:222 msgid "Date" -msgstr "" +msgstr "Ημερομηνία" #: src/components/plugins/PluginDrawer.tsx:93 #: src/forms/selectionListFields.tsx:103 @@ -2825,15 +2832,15 @@ msgstr "" #: src/tables/settings/UserTable.tsx:400 #: src/tables/stock/StockItemTable.tsx:322 msgid "Active" -msgstr "" +msgstr "Ενεργό" #: src/components/plugins/PluginDrawer.tsx:105 msgid "Package Name" -msgstr "" +msgstr "Όνομα πακέτου" #: src/components/plugins/PluginDrawer.tsx:111 msgid "Installation Path" -msgstr "" +msgstr "Μονοπάτι εγκατάστασης" #: src/components/plugins/PluginDrawer.tsx:116 #: src/tables/machine/MachineTypeTable.tsx:184 @@ -2841,18 +2848,18 @@ msgstr "" #: src/tables/plugin/PluginListTable.tsx:101 #: src/tables/plugin/PluginListTable.tsx:417 msgid "Builtin" -msgstr "" +msgstr "Ενσωματωμένο" #: src/components/plugins/PluginDrawer.tsx:121 msgid "Package" -msgstr "" +msgstr "Πακέτο" #: src/components/plugins/PluginDrawer.tsx:133 #: src/pages/Index/Settings/AdminCenter/PluginManagementPanel.tsx:55 #: src/pages/Index/Settings/SystemSettings.tsx:331 #: src/pages/Index/Settings/UserSettings.tsx:128 msgid "Plugin Settings" -msgstr "" +msgstr "Ρυθμίσεις πρόσθετου" #: src/components/plugins/PluginPanel.tsx:87 #~ msgid "Error occurred while rendering plugin content" @@ -2881,31 +2888,31 @@ msgstr "" #: src/components/plugins/PluginUIFeature.tsx:103 msgid "Error occurred while rendering the template editor." -msgstr "" +msgstr "Παρουσιάστηκε σφάλμα κατά την απόδοση του επεξεργαστή προτύπων." #: src/components/plugins/PluginUIFeature.tsx:120 msgid "Error Loading Plugin Editor" -msgstr "" +msgstr "Σφάλμα φόρτωσης του επεξεργαστή πρόσθετων" #: src/components/plugins/PluginUIFeature.tsx:158 msgid "Error occurred while rendering the template preview." -msgstr "" +msgstr "Παρουσιάστηκε σφάλμα κατά την απόδοση της προεπισκόπησης προτύπου." #: src/components/plugins/PluginUIFeature.tsx:169 msgid "Error Loading Plugin Preview" -msgstr "" +msgstr "Σφάλμα φόρτωσης προεπισκόπησης πρόσθετου" #: src/components/plugins/RemoteComponent.tsx:111 msgid "Invalid source or function name" -msgstr "" +msgstr "Μη έγκυρη πηγή ή όνομα συνάρτησης" #: src/components/plugins/RemoteComponent.tsx:143 msgid "Error Loading Content" -msgstr "" +msgstr "Σφάλμα φόρτωσης περιεχομένου" #: src/components/plugins/RemoteComponent.tsx:147 msgid "Error occurred while loading plugin content" -msgstr "" +msgstr "Παρουσιάστηκε σφάλμα κατά τη φόρτωση περιεχομένου πρόσθετου" #: src/components/render/Instance.tsx:238 #~ msgid "Unknown model: {model}" @@ -2913,7 +2920,7 @@ msgstr "" #: src/components/render/Instance.tsx:249 msgid "Unknown model: {model_name}" -msgstr "" +msgstr "Άγνωστο μοντέλο: {model_name}" #: src/components/render/ModelType.tsx:234 #~ msgid "Purchase Order Line Item" @@ -2934,7 +2941,7 @@ msgstr "" #: src/components/render/Order.tsx:122 #: src/tables/sales/SalesOrderAllocationTable.tsx:173 msgid "Shipment" -msgstr "" +msgstr "Αποστολή" #: src/components/render/Part.tsx:28 #: src/components/render/Plugin.tsx:17 @@ -2958,7 +2965,7 @@ msgstr "Εικονικό" #: src/tables/bom/BomTable.tsx:307 #: src/tables/part/PartTable.tsx:152 msgid "No stock" -msgstr "" +msgstr "Χωρίς απόθεμα" #: src/components/render/Part.tsx:47 #: src/components/wizards/OrderPartsWizard.tsx:135 @@ -2966,25 +2973,25 @@ msgstr "" #: src/pages/company/SupplierPartDetail.tsx:394 #: src/pages/part/PartDetail.tsx:1015 #: src/tables/bom/BomTable.tsx:444 -#: src/tables/build/BuildLineTable.tsx:222 +#: src/tables/build/BuildLineTable.tsx:223 #: src/tables/part/PartTable.tsx:108 msgid "On Order" -msgstr "" +msgstr "Σε παραγγελία" #: src/components/render/Part.tsx:55 #: src/components/wizards/OrderPartsWizard.tsx:141 #: src/pages/part/PartDetail.tsx:587 #: src/pages/part/PartDetail.tsx:1021 #: src/pages/stock/StockDetail.tsx:925 -#: src/tables/part/PartTestResultTable.tsx:297 +#: src/tables/part/PartTestResultTable.tsx:305 #: src/tables/stock/StockItemTable.tsx:359 msgid "In Production" -msgstr "" +msgstr "Σε παραγωγή" #: src/components/render/Part.tsx:74 #: src/tables/stock/StockTrackingTable.tsx:206 msgid "Details" -msgstr "" +msgstr "Λεπτομέρειες" #: src/components/render/Part.tsx:112 #: src/components/wizards/ImportPartWizard.tsx:806 @@ -2994,13 +3001,13 @@ msgstr "" #: src/tables/notifications/NotificationTable.tsx:32 #: src/tables/part/PartCategoryTemplateTable.tsx:78 msgid "Category" -msgstr "" +msgstr "Κατηγορία" #: src/components/render/Stock.tsx:36 #: src/components/render/Stock.tsx:114 #: src/components/render/Stock.tsx:132 #: src/forms/BuildForms.tsx:795 -#: src/forms/PurchaseOrderForms.tsx:595 +#: src/forms/PurchaseOrderForms.tsx:647 #: src/forms/StockForms.tsx:792 #: src/forms/StockForms.tsx:839 #: src/forms/StockForms.tsx:885 @@ -3018,25 +3025,25 @@ msgstr "" #: src/tables/Filter.tsx:400 #: src/tables/stock/StockTrackingTable.tsx:98 msgid "Location" -msgstr "" +msgstr "Τοποθεσία" #: src/components/render/Stock.tsx:99 #: src/pages/stock/StockDetail.tsx:198 #: src/pages/stock/StockDetail.tsx:930 -#: src/tables/build/BuildAllocatedStockTable.tsx:121 +#: src/tables/build/BuildAllocatedStockTable.tsx:118 #: src/tables/build/BuildOutputTable.tsx:107 #: src/tables/sales/SalesOrderAllocationTable.tsx:142 msgid "Serial Number" -msgstr "" +msgstr "Σειριακός αριθμός" #: src/components/render/Stock.tsx:104 #: src/components/wizards/OrderPartsWizard.tsx:377 #: src/forms/BuildForms.tsx:240 #: src/forms/BuildForms.tsx:634 #: src/forms/BuildForms.tsx:797 -#: src/forms/PurchaseOrderForms.tsx:801 +#: src/forms/PurchaseOrderForms.tsx:853 #: src/forms/ReturnOrderForms.tsx:243 -#: src/forms/SalesOrderForms.tsx:308 +#: src/forms/SalesOrderForms.tsx:326 #: src/forms/StockForms.tsx:841 #: src/pages/part/PartStockHistoryDetail.tsx:56 #: src/pages/part/PartStockHistoryDetail.tsx:210 @@ -3046,16 +3053,16 @@ msgstr "" #: src/pages/part/pricing/PriceBreakPanel.tsx:172 #: src/pages/stock/StockDetail.tsx:258 #: src/pages/stock/StockDetail.tsx:936 -#: src/tables/build/BuildLineTable.tsx:86 +#: src/tables/build/BuildLineTable.tsx:83 #: src/tables/part/PartPurchaseOrdersTable.tsx:94 -#: src/tables/part/PartTestResultTable.tsx:269 +#: src/tables/part/PartTestResultTable.tsx:277 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:175 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:206 #: src/tables/purchasing/SupplierPriceBreakTable.tsx:69 #: src/tables/sales/ReturnOrderLineItemTable.tsx:124 #: src/tables/stock/StockTrackingTable.tsx:72 msgid "Quantity" -msgstr "" +msgstr "Ποσότητα" #: src/components/render/Stock.tsx:117 #: src/forms/BuildForms.tsx:335 @@ -3070,9 +3077,9 @@ msgstr "" #: src/forms/StockForms.tsx:1048 #: src/forms/StockForms.tsx:1096 #: src/forms/StockForms.tsx:1140 -#: src/tables/build/BuildLineTable.tsx:96 +#: src/tables/build/BuildLineTable.tsx:93 msgid "Batch" -msgstr "" +msgstr "Παραγωγική παρτίδα" #: src/components/settings/ConfigValueList.tsx:33 #~ msgid "<0>{0} is set via {1} and was last set {2}" @@ -3080,21 +3087,21 @@ msgstr "" #: src/components/settings/ConfigValueList.tsx:36 msgid "Setting" -msgstr "" +msgstr "Ρύθμιση" #: src/components/settings/ConfigValueList.tsx:39 msgid "Source" -msgstr "" +msgstr "Πηγή" #: src/components/settings/QuickAction.tsx:47 msgid "Act" -msgstr "" +msgstr "Ενέργεια" #: src/components/settings/QuickAction.tsx:73 #: src/components/settings/QuickAction.tsx:113 #: src/tables/settings/ProjectCodeTable.tsx:46 msgid "Add Project Code" -msgstr "" +msgstr "Προσθήκη κωδικού έργου" #: src/components/settings/QuickAction.tsx:78 #: src/components/settings/QuickAction.tsx:124 @@ -3102,59 +3109,59 @@ msgstr "" #: src/tables/settings/CustomStateTable.tsx:140 #: src/tables/settings/CustomStateTable.tsx:202 msgid "Add State" -msgstr "" +msgstr "Προσθήκη κατάστασης" #: src/components/settings/QuickAction.tsx:85 msgid "Open an Issue" -msgstr "" +msgstr "Άνοιγμα αιτήματος" #: src/components/settings/QuickAction.tsx:86 msgid "Report a bug or request a feature on GitHub" -msgstr "" +msgstr "Αναφορά σφάλματος ή αιτήματος λειτουργίας στο GitHub" #: src/components/settings/QuickAction.tsx:88 msgid "Open Issue" -msgstr "" +msgstr "Άνοιγμα αιτήματος" #: src/components/settings/QuickAction.tsx:97 msgid "Add New Group" -msgstr "" +msgstr "Προσθήκη νέας ομάδας" #: src/components/settings/QuickAction.tsx:98 msgid "Create a new group to manage your users" -msgstr "" +msgstr "Δημιουργία νέας ομάδας για τη διαχείριση χρηστών" #: src/components/settings/QuickAction.tsx:100 msgid "New Group" -msgstr "" +msgstr "Νέα ομάδα" #: src/components/settings/QuickAction.tsx:105 msgid "Add New User" -msgstr "" +msgstr "Προσθήκη νέου χρήστη" #: src/components/settings/QuickAction.tsx:106 msgid "Create a new user to manage your groups" -msgstr "" +msgstr "Δημιουργία νέου χρήστη για διαχείριση ομάδων" #: src/components/settings/QuickAction.tsx:108 msgid "New User" -msgstr "" +msgstr "Νέος χρήστης" #: src/components/settings/QuickAction.tsx:114 msgid "Create a new project code to organize your items" -msgstr "" +msgstr "Δημιουργία νέου κωδικού έργου για οργάνωση Προϊόντων" #: src/components/settings/QuickAction.tsx:116 msgid "Add Code" -msgstr "" +msgstr "Προσθήκη κωδικού" #: src/components/settings/QuickAction.tsx:121 msgid "Add Custom State" -msgstr "" +msgstr "Προσθήκη προσαρμοσμένης κατάστασης" #: src/components/settings/QuickAction.tsx:122 msgid "Create a new custom state for your workflow" -msgstr "" +msgstr "Δημιουργία προσαρμοσμένης κατάστασης για τη ροή εργασίας" #: src/components/settings/SettingItem.tsx:47 #: src/components/settings/SettingItem.tsx:100 @@ -3163,40 +3170,40 @@ msgstr "" #: src/components/settings/SettingList.tsx:72 msgid "Edit Setting" -msgstr "" +msgstr "Επεξεργασία ρύθμισης" #: src/components/settings/SettingList.tsx:85 msgid "Setting {key} updated successfully" -msgstr "" +msgstr "Η ρύθμιση {key} ενημερώθηκε με επιτυχία" #: src/components/settings/SettingList.tsx:114 msgid "Setting updated" -msgstr "" +msgstr "Η ρύθμιση ενημερώθηκε" #. placeholder {0}: setting.key #: src/components/settings/SettingList.tsx:115 msgid "Setting {0} updated successfully" -msgstr "" +msgstr "Η ρύθμιση {0} ενημερώθηκε με επιτυχία" #: src/components/settings/SettingList.tsx:124 msgid "Error editing setting" -msgstr "" +msgstr "Σφάλμα κατά την επεξεργασία της ρύθμισης" #: src/components/settings/SettingList.tsx:140 msgid "Error loading settings" -msgstr "" +msgstr "Σφάλμα φόρτωσης ρυθμίσεων" #: src/components/settings/SettingList.tsx:151 msgid "No Settings" -msgstr "" +msgstr "Δεν υπάρχουν ρυθμίσεις" #: src/components/settings/SettingList.tsx:152 msgid "There are no configurable settings available" -msgstr "" +msgstr "Δεν υπάρχουν διαθέσιμες ρυθμίσεις προς διαμόρφωση" #: src/components/settings/SettingList.tsx:189 msgid "No settings specified" -msgstr "" +msgstr "Δεν καθορίστηκαν ρυθμίσεις" #: src/components/tables/FilterGroup.tsx:29 #~ msgid "Add table filter" @@ -3560,15 +3567,15 @@ msgstr "" #: src/components/wizards/ImportPartWizard.tsx:105 msgid "Exact Match" -msgstr "" +msgstr "Ακριβής αντιστοιχία" #: src/components/wizards/ImportPartWizard.tsx:112 msgid "Current part" -msgstr "" +msgstr "Τρέχον Προϊόν" #: src/components/wizards/ImportPartWizard.tsx:118 msgid "Already Imported" -msgstr "" +msgstr "Έχει ήδη εισαχθεί" #: src/components/wizards/ImportPartWizard.tsx:205 #: src/pages/company/CompanyDetail.tsx:136 @@ -3583,116 +3590,116 @@ msgstr "" #: src/tables/purchasing/PurchaseOrderTable.tsx:109 #: src/tables/purchasing/SupplierPriceBreakTable.tsx:40 msgid "Supplier" -msgstr "" +msgstr "Προμηθευτής" #: src/components/wizards/ImportPartWizard.tsx:221 #: src/forms/StockForms.tsx:614 msgid "Loading..." -msgstr "" +msgstr "Φόρτωση..." #: src/components/wizards/ImportPartWizard.tsx:223 msgid "Error fetching suppliers" -msgstr "" +msgstr "Σφάλμα κατά την ανάκτηση προμηθευτών" #: src/components/wizards/ImportPartWizard.tsx:224 msgid "Select supplier" -msgstr "" +msgstr "Επιλέξτε προμηθευτή" #. placeholder {0}: searchResults.length #: src/components/wizards/ImportPartWizard.tsx:246 msgid "Found {0} results" -msgstr "" +msgstr "Βρέθηκαν {0} αποτελέσματα" #: src/components/wizards/ImportPartWizard.tsx:259 msgid "Import this part" -msgstr "" +msgstr "Εισαγωγή αυτού του προϊόντος" #: src/components/wizards/ImportPartWizard.tsx:313 msgid "Are you sure you want to import this part into the selected category now?" -msgstr "" +msgstr "Είστε σίγουρος ότι θέλετε να εισαγάγετε αυτό το Προϊόν στην επιλεγμένη κατηγορία τώρα;" #: src/components/wizards/ImportPartWizard.tsx:326 msgid "Import Now" -msgstr "" +msgstr "Εισαγωγή τώρα" #: src/components/wizards/ImportPartWizard.tsx:372 msgid "Select and edit the parameters you want to add to this part." -msgstr "" +msgstr "Επιλέξτε και επεξεργαστείτε τις παραμέτρους που θέλετε να προσθέσετε σε αυτό το Προϊόν." #: src/components/wizards/ImportPartWizard.tsx:379 msgid "Default category parameters" -msgstr "" +msgstr "Προεπιλεγμένες παράμετροι κατηγορίας" #: src/components/wizards/ImportPartWizard.tsx:391 msgid "Other parameters" -msgstr "" +msgstr "Άλλες παράμετροι" #: src/components/wizards/ImportPartWizard.tsx:446 msgid "Add a new parameter" -msgstr "" +msgstr "Προσθήκη νέας παραμέτρου" #: src/components/wizards/ImportPartWizard.tsx:468 msgid "Skip" -msgstr "" +msgstr "Παράλειψη" #: src/components/wizards/ImportPartWizard.tsx:476 msgid "Create Parameters" -msgstr "" +msgstr "Δημιουργία παραμέτρων" #: src/components/wizards/ImportPartWizard.tsx:493 msgid "Create initial stock for the imported part." -msgstr "" +msgstr "Δημιουργία αρχικού αποθέματος για το εισαγόμενο Προϊόν." #: src/components/wizards/ImportPartWizard.tsx:511 msgid "Next" -msgstr "" +msgstr "Επόμενο" #: src/components/wizards/ImportPartWizard.tsx:540 #: src/pages/part/PartDetail.tsx:1046 #: src/tables/part/PartTable.tsx:408 msgid "Edit Part" -msgstr "" +msgstr "Επεξεργασία Προϊόντος" #: src/components/wizards/ImportPartWizard.tsx:567 msgid "Part imported successfully!" -msgstr "" +msgstr "Το Προϊόν εισήχθη με επιτυχία!" #: src/components/wizards/ImportPartWizard.tsx:576 msgid "Failed to import part: " -msgstr "" +msgstr "Αποτυχία εισαγωγής Προϊόντος: " #: src/components/wizards/ImportPartWizard.tsx:641 msgid "Are you sure, you want to import the supplier and manufacturer part into this part?" -msgstr "" +msgstr "Είστε σίγουρος ότι θέλετε να εισαγάγετε το προμηθευτή και τον κατασκευαστή σε αυτό το Προϊόν;" #: src/components/wizards/ImportPartWizard.tsx:655 msgid "Import" -msgstr "" +msgstr "Εισαγωγή" #: src/components/wizards/ImportPartWizard.tsx:691 msgid "Parameters created successfully!" -msgstr "" +msgstr "Οι παράμετροι δημιουργήθηκαν με επιτυχία!" #: src/components/wizards/ImportPartWizard.tsx:719 msgid "Failed to create parameters, please fix the errors and try again" -msgstr "" +msgstr "Αποτυχία δημιουργίας παραμέτρων, διορθώστε τα σφάλματα και προσπαθήστε ξανά" #. placeholder {0}: supplierPart?.supplier #: src/components/wizards/ImportPartWizard.tsx:739 msgid "Part imported successfully from supplier {0}." -msgstr "" +msgstr "Το Προϊόν εισήχθη με επιτυχία από τον προμηθευτή {0}." #: src/components/wizards/ImportPartWizard.tsx:752 msgid "Open Part" -msgstr "" +msgstr "Άνοιγμα Προϊόντος" #: src/components/wizards/ImportPartWizard.tsx:759 msgid "Open Supplier Part" -msgstr "" +msgstr "Άνοιγμα Προϊόντος προμηθευτή" #: src/components/wizards/ImportPartWizard.tsx:766 msgid "Open Manufacturer Part" -msgstr "" +msgstr "Άνοιγμα Προϊόντος κατασκευαστή" #: src/components/wizards/ImportPartWizard.tsx:797 #: src/tables/part/PartTable.tsx:499 @@ -3701,41 +3708,41 @@ msgstr "" #: src/components/wizards/ImportPartWizard.tsx:802 msgid "Import Supplier Part" -msgstr "" +msgstr "Εισαγωγή Προϊόντος προμηθευτή" #: src/components/wizards/ImportPartWizard.tsx:804 msgid "Search Supplier Part" -msgstr "" +msgstr "Αναζήτηση Προϊόντος προμηθευτή" #: src/components/wizards/ImportPartWizard.tsx:806 #: src/pages/company/ManufacturerPartDetail.tsx:166 #: src/pages/part/PartDetail.tsx:793 msgid "Parameters" -msgstr "" +msgstr "Παράμετροι" #: src/components/wizards/ImportPartWizard.tsx:806 msgid "Confirm import" -msgstr "" +msgstr "Επιβεβαίωση εισαγωγής" #: src/components/wizards/ImportPartWizard.tsx:808 msgid "Done" -msgstr "" +msgstr "Ολοκληρώθηκε" #: src/components/wizards/OrderPartsWizard.tsx:75 msgid "Error fetching part requirements" -msgstr "" +msgstr "Σφάλμα κατά την ανάκτηση απαιτήσεων Προϊόντος" #: src/components/wizards/OrderPartsWizard.tsx:113 msgid "Requirements" -msgstr "" +msgstr "Απαιτήσεις" #: src/components/wizards/OrderPartsWizard.tsx:117 msgid "Build Requirements" -msgstr "" +msgstr "Απαιτήσεις παραγωγής" #: src/components/wizards/OrderPartsWizard.tsx:123 msgid "Sales Requirements" -msgstr "" +msgstr "Απαιτήσεις πωλήσεων" #: src/components/wizards/OrderPartsWizard.tsx:129 #: src/forms/StockForms.tsx:887 @@ -3752,42 +3759,42 @@ msgstr "" #: src/tables/Filter.tsx:92 #: src/tables/purchasing/SupplierPartTable.tsx:230 msgid "In Stock" -msgstr "" +msgstr "Σε απόθεμα" #: src/components/wizards/OrderPartsWizard.tsx:146 -#: src/tables/build/BuildLineTable.tsx:404 +#: src/tables/build/BuildLineTable.tsx:405 msgid "Required Quantity" -msgstr "" +msgstr "Απαιτούμενη ποσότητα" #: src/components/wizards/OrderPartsWizard.tsx:203 msgid "New Purchase Order" -msgstr "" +msgstr "Νέα παραγγελία αγοράς" #: src/components/wizards/OrderPartsWizard.tsx:205 msgid "Purchase order created" -msgstr "" +msgstr "Η παραγγελία αγοράς δημιουργήθηκε" #: src/components/wizards/OrderPartsWizard.tsx:217 msgid "New Supplier Part" -msgstr "" +msgstr "Νέο Προϊόν προμηθευτή" #: src/components/wizards/OrderPartsWizard.tsx:219 #: src/tables/purchasing/SupplierPartTable.tsx:180 #: src/tables/purchasing/SupplierPartTable.tsx:258 msgid "Supplier part created" -msgstr "" +msgstr "Το Προϊόν προμηθευτή δημιουργήθηκε" #: src/components/wizards/OrderPartsWizard.tsx:247 msgid "Add to Purchase Order" -msgstr "" +msgstr "Προσθήκη στην παραγγελία αγοράς" #: src/components/wizards/OrderPartsWizard.tsx:259 msgid "Part added to purchase order" -msgstr "" +msgstr "Το Προϊόν προστέθηκε στην παραγγελία αγοράς" #: src/components/wizards/OrderPartsWizard.tsx:303 msgid "Select supplier part" -msgstr "" +msgstr "Επιλέξτε Προϊόν προμηθευτή" #: src/components/wizards/OrderPartsWizard.tsx:323 msgid "Copy supplier part number" @@ -3795,63 +3802,63 @@ msgstr "" #: src/components/wizards/OrderPartsWizard.tsx:326 msgid "New supplier part" -msgstr "" +msgstr "Νέο Προϊόν προμηθευτή" #: src/components/wizards/OrderPartsWizard.tsx:350 msgid "Select purchase order" -msgstr "" +msgstr "Επιλέξτε παραγγελία αγοράς" #: src/components/wizards/OrderPartsWizard.tsx:364 msgid "New purchase order" -msgstr "" +msgstr "Νέα παραγγελία αγοράς" #: src/components/wizards/OrderPartsWizard.tsx:420 msgid "Add to selected purchase order" -msgstr "" +msgstr "Προσθήκη στην επιλεγμένη παραγγελία αγοράς" #: src/components/wizards/OrderPartsWizard.tsx:432 #: src/components/wizards/OrderPartsWizard.tsx:545 msgid "No parts selected" -msgstr "" +msgstr "Δεν επιλέχθηκαν προϊόντα" #: src/components/wizards/OrderPartsWizard.tsx:433 msgid "No purchaseable parts selected" -msgstr "" +msgstr "Δεν επιλέχθηκαν αγοραζόμενα Προϊόντα" #: src/components/wizards/OrderPartsWizard.tsx:469 msgid "Parts Added" -msgstr "" +msgstr "Τα Προϊόντα προστέθηκαν" #: src/components/wizards/OrderPartsWizard.tsx:470 msgid "All selected parts added to a purchase order" -msgstr "" +msgstr "Όλα τα επιλεγμένα Προϊόντα προστέθηκαν σε παραγγελία αγοράς" #: src/components/wizards/OrderPartsWizard.tsx:546 msgid "You must select at least one part to order" -msgstr "" +msgstr "Πρέπει να επιλέξετε τουλάχιστον ένα Προϊόν για παραγγελία" #: src/components/wizards/OrderPartsWizard.tsx:557 msgid "Supplier part is required" -msgstr "" +msgstr "Απαιτείται Προϊόν προμηθευτή" #: src/components/wizards/OrderPartsWizard.tsx:561 msgid "Quantity is required" -msgstr "" +msgstr "Απαιτείται ποσότητα" #: src/components/wizards/OrderPartsWizard.tsx:574 msgid "Invalid part selection" -msgstr "" +msgstr "Μη έγκυρη επιλογή Προϊόντος" #: src/components/wizards/OrderPartsWizard.tsx:576 msgid "Please correct the errors in the selected parts" -msgstr "" +msgstr "Παρακαλώ διορθώστε τα σφάλματα στα επιλεγμένα Προϊόντα" #: src/components/wizards/OrderPartsWizard.tsx:587 -#: src/tables/build/BuildLineTable.tsx:815 +#: src/tables/build/BuildLineTable.tsx:822 #: src/tables/part/PartTable.tsx:522 #: src/tables/sales/SalesOrderLineItemTable.tsx:370 msgid "Order Parts" -msgstr "" +msgstr "Παραγγελία Προϊόντων" #: src/contexts/LanguageContext.tsx:22 #~ msgid "Arabic" @@ -4012,74 +4019,74 @@ msgstr "" #: src/defaults/actions.tsx:42 msgid "Go to the InvenTree dashboard" -msgstr "" +msgstr "Μετάβαση στο InvenTree dashboard" #: src/defaults/actions.tsx:49 msgid "Visit the documentation to learn more about InvenTree" -msgstr "" +msgstr "Επισκεφθείτε την τεκμηρίωση για να μάθετε περισσότερα για το InvenTree" #: src/defaults/actions.tsx:58 msgid "About the InvenTree org" -msgstr "" +msgstr "Σχετικά με τον οργανισμό InvenTree" #: src/defaults/actions.tsx:64 msgid "Server Information" -msgstr "" +msgstr "Πληροφορίες διακομιστή" #: src/defaults/actions.tsx:65 #: src/defaults/links.tsx:169 msgid "About this InvenTree instance" -msgstr "" +msgstr "Σχετικά με αυτήν την εγκατάσταση InvenTree" #: src/defaults/actions.tsx:71 #: src/defaults/links.tsx:153 #: src/defaults/links.tsx:175 msgid "License Information" -msgstr "" +msgstr "Πληροφορίες άδειας" #: src/defaults/actions.tsx:72 msgid "Licenses for dependencies of the service" -msgstr "" +msgstr "Άδειες για τις εξαρτήσεις της υπηρεσίας" #: src/defaults/actions.tsx:78 msgid "Open Navigation" -msgstr "" +msgstr "Άνοιγμα πλοήγησης" #: src/defaults/actions.tsx:79 msgid "Open the main navigation menu" -msgstr "" +msgstr "Άνοιγμα του κύριου μενού πλοήγησης" #: src/defaults/actions.tsx:86 msgid "Scan a barcode or QR code" -msgstr "" +msgstr "Σάρωση barcode ή QR code" #: src/defaults/actions.tsx:94 msgid "Go to your user settings" -msgstr "" +msgstr "Μετάβαση στις ρυθμίσεις χρήστη" #: src/defaults/actions.tsx:105 msgid "Go to Purchase Orders" -msgstr "" +msgstr "Μετάβαση στις Εντολές Αγοράς" #: src/defaults/actions.tsx:115 msgid "Go to Sales Orders" -msgstr "" +msgstr "Μετάβαση στις Εντολές Πώλησης" #: src/defaults/actions.tsx:126 msgid "Go to Return Orders" -msgstr "" +msgstr "Μετάβαση στις Εντολές Επιστροφής" #: src/defaults/actions.tsx:136 msgid "Go to Build Orders" -msgstr "" +msgstr "Μετάβαση στις Εντολές Κατασκευής" #: src/defaults/actions.tsx:145 msgid "Go to System Settings" -msgstr "" +msgstr "Μετάβαση στις Ρυθμίσεις Συστήματος" #: src/defaults/actions.tsx:154 msgid "Go to the Admin Center" -msgstr "" +msgstr "Μετάβαση στο Κέντρο Διαχείρισης" #: src/defaults/dashboardItems.tsx:29 #~ msgid "Latest Parts" @@ -4153,35 +4160,35 @@ msgstr "" #: src/defaults/links.tsx:93 msgid "API" -msgstr "" +msgstr "API" #: src/defaults/links.tsx:96 msgid "InvenTree API documentation" -msgstr "" +msgstr "Τεκμηρίωση API του InvenTree" #: src/defaults/links.tsx:100 msgid "Developer Manual" -msgstr "" +msgstr "Εγχειρίδιο Προγραμματιστή" #: src/defaults/links.tsx:103 msgid "InvenTree developer manual" -msgstr "" +msgstr "Εγχειρίδιο προγραμματιστών του InvenTree" #: src/defaults/links.tsx:107 msgid "FAQ" -msgstr "" +msgstr "Συχνές Ερωτήσεις" #: src/defaults/links.tsx:110 msgid "Frequently asked questions" -msgstr "" +msgstr "Συχνές ερωτήσεις" #: src/defaults/links.tsx:114 msgid "GitHub Repository" -msgstr "" +msgstr "Αποθετήριο GitHub" #: src/defaults/links.tsx:117 msgid "InvenTree source code on GitHub" -msgstr "" +msgstr "Πηγαίος κώδικας του InvenTree στο GitHub" #: src/defaults/links.tsx:117 #~ msgid "Licenses for packages used by InvenTree" @@ -4190,7 +4197,7 @@ msgstr "" #: src/defaults/links.tsx:127 #: src/defaults/links.tsx:168 msgid "System Information" -msgstr "" +msgstr "Πληροφορίες Συστήματος" #: src/defaults/links.tsx:134 #~ msgid "Licenses" @@ -4198,11 +4205,11 @@ msgstr "" #: src/defaults/links.tsx:176 msgid "Licenses for dependencies of the InvenTree software" -msgstr "" +msgstr "Άδειες για τις εξαρτήσεις του λογισμικού InvenTree" #: src/defaults/links.tsx:187 msgid "About the InvenTree Project" -msgstr "" +msgstr "Σχετικά με το έργο InvenTree" #: src/defaults/menuItems.tsx:7 #~ msgid "Open sourcea" @@ -4322,19 +4329,19 @@ msgstr "" #: src/forms/BomForms.tsx:109 msgid "Substitute Part" -msgstr "" +msgstr "Προϊόν υποκατάστασης" #: src/forms/BomForms.tsx:126 msgid "Edit BOM Substitutes" -msgstr "" +msgstr "Επεξεργασία υποκαταστάτων BOM" #: src/forms/BomForms.tsx:133 msgid "Add Substitute" -msgstr "" +msgstr "Προσθήκη υποκατάστατου" #: src/forms/BomForms.tsx:134 msgid "Substitute added" -msgstr "" +msgstr "Το υποκατάστατο προστέθηκε" #: src/forms/BuildForms.tsx:112 #: src/forms/BuildForms.tsx:217 @@ -4349,20 +4356,20 @@ msgstr "" #: src/forms/BuildForms.tsx:333 #: src/forms/BuildForms.tsx:408 #: src/forms/BuildForms.tsx:685 -#: src/tables/build/BuildAllocatedStockTable.tsx:150 +#: src/tables/build/BuildAllocatedStockTable.tsx:147 #: src/tables/build/BuildOutputTable.tsx:582 -#: src/tables/part/PartTestResultTable.tsx:272 +#: src/tables/part/PartTestResultTable.tsx:280 msgid "Build Output" -msgstr "" +msgstr "Αποτέλεσμα κατασκευής" #: src/forms/BuildForms.tsx:334 msgid "Quantity to Complete" -msgstr "" +msgstr "Ποσότητα προς ολοκλήρωση" #: src/forms/BuildForms.tsx:336 #: src/forms/BuildForms.tsx:411 #: src/forms/BuildForms.tsx:475 -#: src/forms/PurchaseOrderForms.tsx:717 +#: src/forms/PurchaseOrderForms.tsx:769 #: src/forms/ReturnOrderForms.tsx:197 #: src/forms/ReturnOrderForms.tsx:244 #: src/forms/StockForms.tsx:712 @@ -4377,7 +4384,7 @@ msgstr "" #: src/tables/build/BuildOutputTable.tsx:404 #: src/tables/machine/MachineListTable.tsx:387 #: src/tables/part/PartPurchaseOrdersTable.tsx:38 -#: src/tables/part/PartTestResultTable.tsx:309 +#: src/tables/part/PartTestResultTable.tsx:317 #: src/tables/sales/ReturnOrderLineItemTable.tsx:138 #: src/tables/sales/ReturnOrderLineItemTable.tsx:176 #: src/tables/settings/CustomStateTable.tsx:79 @@ -4386,15 +4393,15 @@ msgstr "" #: src/tables/stock/StockItemTable.tsx:327 #: src/tables/stock/StockTrackingTable.tsx:65 msgid "Status" -msgstr "" +msgstr "Κατάσταση" #: src/forms/BuildForms.tsx:358 msgid "Complete Build Outputs" -msgstr "" +msgstr "Ολοκλήρωση αποτελεσμάτων κατασκευής" #: src/forms/BuildForms.tsx:361 msgid "Build outputs have been completed" -msgstr "" +msgstr "Τα αποτελέσματα κατασκευής ολοκληρώθηκαν" #: src/forms/BuildForms.tsx:408 #~ msgid "Selected build outputs will be deleted" @@ -4402,24 +4409,24 @@ msgstr "" #: src/forms/BuildForms.tsx:409 msgid "Quantity to Scrap" -msgstr "" +msgstr "Ποσότητα προς απόρριψη" #: src/forms/BuildForms.tsx:429 #: src/forms/BuildForms.tsx:431 msgid "Scrap Build Outputs" -msgstr "" +msgstr "Απόρριψη αποτελεσμάτων κατασκευής" #: src/forms/BuildForms.tsx:434 msgid "Selected build outputs will be completed, but marked as scrapped" -msgstr "" +msgstr "Τα επιλεγμένα αποτελέσματα κατασκευής θα ολοκληρωθούν αλλά θα σημανθούν ως απορριφθέντα" #: src/forms/BuildForms.tsx:436 msgid "Allocated stock items will be consumed" -msgstr "" +msgstr "Τα δεσμευμένα είδη αποθέματος θα καταναλωθούν" #: src/forms/BuildForms.tsx:442 msgid "Build outputs have been scrapped" -msgstr "" +msgstr "Τα αποτελέσματα κατασκευής έχουν απορριφθεί" #: src/forms/BuildForms.tsx:470 #~ msgid "Remove line" @@ -4428,19 +4435,19 @@ msgstr "" #: src/forms/BuildForms.tsx:485 #: src/forms/BuildForms.tsx:487 msgid "Cancel Build Outputs" -msgstr "" +msgstr "Ακύρωση αποτελεσμάτων κατασκευής" #: src/forms/BuildForms.tsx:489 msgid "Selected build outputs will be removed" -msgstr "" +msgstr "Τα επιλεγμένα αποτελέσματα κατασκευής θα αφαιρεθούν" #: src/forms/BuildForms.tsx:491 msgid "Allocated stock items will be returned to stock" -msgstr "" +msgstr "Τα δεσμευμένα είδη θα επιστραφούν στο απόθεμα" #: src/forms/BuildForms.tsx:498 msgid "Build outputs have been cancelled" -msgstr "" +msgstr "Τα αποτελέσματα κατασκευής ακυρώθηκαν" #: src/forms/BuildForms.tsx:631 #: src/pages/build/BuildDetail.tsx:207 @@ -4450,8 +4457,8 @@ msgstr "" #: src/pages/stock/StockDetail.tsx:153 #: src/tables/bom/BomTable.tsx:134 #: src/tables/bom/UsedInTable.tsx:40 -#: src/tables/build/BuildAllocatedStockTable.tsx:108 -#: src/tables/build/BuildLineTable.tsx:336 +#: src/tables/build/BuildAllocatedStockTable.tsx:105 +#: src/tables/build/BuildLineTable.tsx:337 #: src/tables/build/BuildOrderTable.tsx:79 #: src/tables/part/PartSalesAllocationsTable.tsx:61 #: src/tables/part/RelatedPartTable.tsx:73 @@ -4461,54 +4468,54 @@ msgstr "" #: src/tables/sales/SalesOrderLineItemTable.tsx:99 #: src/tables/stock/StockItemTable.tsx:69 msgid "IPN" -msgstr "" +msgstr "IPN" #: src/forms/BuildForms.tsx:632 #: src/forms/BuildForms.tsx:796 #: src/forms/BuildForms.tsx:897 -#: src/forms/SalesOrderForms.tsx:306 -#: src/tables/build/BuildAllocatedStockTable.tsx:139 -#: src/tables/build/BuildLineTable.tsx:182 +#: src/forms/SalesOrderForms.tsx:324 +#: src/tables/build/BuildAllocatedStockTable.tsx:136 +#: src/tables/build/BuildLineTable.tsx:183 #: src/tables/sales/SalesOrderLineItemTable.tsx:342 #: src/tables/stock/StockItemTable.tsx:338 msgid "Allocated" -msgstr "" +msgstr "Δεσμευμένο" #: src/forms/BuildForms.tsx:667 -#: src/forms/SalesOrderForms.tsx:295 +#: src/forms/SalesOrderForms.tsx:313 #: src/pages/build/BuildDetail.tsx:108 #: src/pages/build/BuildDetail.tsx:326 msgid "Source Location" -msgstr "" +msgstr "Τοποθεσία προέλευσης" #: src/forms/BuildForms.tsx:668 -#: src/forms/SalesOrderForms.tsx:296 +#: src/forms/SalesOrderForms.tsx:314 msgid "Select the source location for the stock allocation" -msgstr "" +msgstr "Επιλέξτε την τοποθεσία προέλευσης για τη δέσμευση αποθέματος" #: src/forms/BuildForms.tsx:700 -#: src/forms/SalesOrderForms.tsx:336 -#: src/tables/build/BuildLineTable.tsx:574 -#: src/tables/build/BuildLineTable.tsx:731 -#: src/tables/build/BuildLineTable.tsx:830 +#: src/forms/SalesOrderForms.tsx:354 +#: src/tables/build/BuildLineTable.tsx:575 +#: src/tables/build/BuildLineTable.tsx:738 +#: src/tables/build/BuildLineTable.tsx:837 #: src/tables/sales/SalesOrderLineItemTable.tsx:380 #: src/tables/sales/SalesOrderLineItemTable.tsx:406 msgid "Allocate Stock" -msgstr "" +msgstr "Δέσμευση αποθέματος" #: src/forms/BuildForms.tsx:703 -#: src/forms/SalesOrderForms.tsx:341 +#: src/forms/SalesOrderForms.tsx:359 msgid "Stock items allocated" -msgstr "" +msgstr "Τα είδη αποθέματος δεσμεύτηκαν" #: src/forms/BuildForms.tsx:816 #: src/forms/BuildForms.tsx:917 -#: src/tables/build/BuildAllocatedStockTable.tsx:240 -#: src/tables/build/BuildAllocatedStockTable.tsx:272 -#: src/tables/build/BuildLineTable.tsx:741 -#: src/tables/build/BuildLineTable.tsx:864 +#: src/tables/build/BuildAllocatedStockTable.tsx:243 +#: src/tables/build/BuildAllocatedStockTable.tsx:279 +#: src/tables/build/BuildLineTable.tsx:748 +#: src/tables/build/BuildLineTable.tsx:871 msgid "Consume Stock" -msgstr "" +msgstr "Κατανάλωση αποθέματος" #: src/forms/BuildForms.tsx:817 #: src/forms/BuildForms.tsx:918 @@ -4521,23 +4528,23 @@ msgstr "" #~ msgstr "Stock items consumed" #: src/forms/BuildForms.tsx:853 -#: src/tables/build/BuildLineTable.tsx:514 +#: src/tables/build/BuildLineTable.tsx:515 #: src/tables/part/PartBuildAllocationsTable.tsx:101 msgid "Fully consumed" -msgstr "" +msgstr "Πλήρως καταναλωμένο" #: src/forms/BuildForms.tsx:898 -#: src/tables/build/BuildLineTable.tsx:187 +#: src/tables/build/BuildLineTable.tsx:188 #: src/tables/stock/StockItemTable.tsx:367 msgid "Consumed" -msgstr "" +msgstr "Καταναλωμένο" #: src/forms/CommonForms.tsx:88 -#: src/forms/PurchaseOrderForms.tsx:125 +#: src/forms/PurchaseOrderForms.tsx:176 #: src/forms/ReturnOrderForms.tsx:138 -#: src/forms/SalesOrderForms.tsx:164 +#: src/forms/SalesOrderForms.tsx:182 msgid "Select project code for this line item" -msgstr "" +msgstr "Επιλέξτε κωδικό έργου για αυτό το Προϊόν" #: src/forms/CompanyForms.tsx:150 #~ msgid "Company updated" @@ -4550,11 +4557,11 @@ msgstr "" #: src/tables/part/PartCategoryTable.tsx:94 #: src/tables/part/PartTable.tsx:325 msgid "Subscribed" -msgstr "" +msgstr "Σε εγγραφή" #: src/forms/PartForms.tsx:86 msgid "Subscribe to notifications for this part" -msgstr "" +msgstr "Εγγραφή σε ειδοποιήσεις για αυτό το Προϊόν" #: src/forms/PartForms.tsx:108 #~ msgid "Part created" @@ -4566,180 +4573,180 @@ msgstr "" #: src/forms/PartForms.tsx:193 msgid "Parent part category" -msgstr "" +msgstr "Γονική κατηγορία Προϊόντος" #: src/forms/PartForms.tsx:208 msgid "Subscribe to notifications for this category" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:388 -msgid "Assign Batch Code and Serial Numbers" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:390 -msgid "Assign Batch Code" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:410 -msgid "Choose Location" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:418 -msgid "Item Destination selected" -msgstr "" +msgstr "Εγγραφή σε ειδοποιήσεις για αυτή την κατηγορία" #: src/forms/PurchaseOrderForms.tsx:421 #~ msgid "Assign Batch Code{0}" #~ msgstr "Assign Batch Code{0}" -#: src/forms/PurchaseOrderForms.tsx:428 -msgid "Part category default location selected" -msgstr "" +#: src/forms/PurchaseOrderForms.tsx:440 +msgid "Assign Batch Code and Serial Numbers" +msgstr "Ανάθεση κωδικού παρτίδας και σειριακών αριθμών" -#: src/forms/PurchaseOrderForms.tsx:438 -msgid "Received stock location selected" -msgstr "" +#: src/forms/PurchaseOrderForms.tsx:442 +msgid "Assign Batch Code" +msgstr "Ανάθεση κωδικού παρτίδας" #: src/forms/PurchaseOrderForms.tsx:444 #: src/forms/StockForms.tsx:428 #~ msgid "Remove item from list" #~ msgstr "Remove item from list" -#: src/forms/PurchaseOrderForms.tsx:446 +#: src/forms/PurchaseOrderForms.tsx:462 +msgid "Choose Location" +msgstr "Επιλογή τοποθεσίας" + +#: src/forms/PurchaseOrderForms.tsx:470 +msgid "Item Destination selected" +msgstr "Επιλέχθηκε προορισμός Προϊόντος" + +#: src/forms/PurchaseOrderForms.tsx:480 +msgid "Part category default location selected" +msgstr "Επιλέχθηκε η προεπιλεγμένη τοποθεσία της κατηγορίας" + +#: src/forms/PurchaseOrderForms.tsx:490 +msgid "Received stock location selected" +msgstr "Επιλέχθηκε τοποθεσία παραληφθέντος αποθέματος" + +#: src/forms/PurchaseOrderForms.tsx:498 msgid "Default location selected" -msgstr "" +msgstr "Επιλέχθηκε η προεπιλεγμένη τοποθεσία" -#: src/forms/PurchaseOrderForms.tsx:507 +#: src/forms/PurchaseOrderForms.tsx:559 msgid "Set Location" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:524 -msgid "Set Expiry Date" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:532 -#: src/forms/StockForms.tsx:693 -msgid "Adjust Packaging" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:540 -#: src/forms/StockForms.tsx:684 -#: src/hooks/UseStockAdjustActions.tsx:148 -msgid "Change Status" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:546 -msgid "Add Note" -msgstr "" +msgstr "Ορισμός τοποθεσίας" #: src/forms/PurchaseOrderForms.tsx:566 #~ msgid "Serial numbers" #~ msgstr "Serial numbers" +#: src/forms/PurchaseOrderForms.tsx:576 +msgid "Set Expiry Date" +msgstr "Ορισμός ημερομηνίας λήξης" + #: src/forms/PurchaseOrderForms.tsx:582 #~ msgid "Store at line item destination" #~ msgstr "Store at line item destination" -#: src/forms/PurchaseOrderForms.tsx:610 -msgid "Store at default location" -msgstr "" +#: src/forms/PurchaseOrderForms.tsx:584 +#: src/forms/StockForms.tsx:693 +msgid "Adjust Packaging" +msgstr "Προσαρμογή συσκευασίας" -#: src/forms/PurchaseOrderForms.tsx:625 -msgid "Store at line item destination " -msgstr "" +#: src/forms/PurchaseOrderForms.tsx:592 +#: src/forms/StockForms.tsx:684 +#: src/hooks/UseStockAdjustActions.tsx:148 +msgid "Change Status" +msgstr "Αλλαγή κατάστασης" -#: src/forms/PurchaseOrderForms.tsx:637 -msgid "Store with already received stock" -msgstr "" +#: src/forms/PurchaseOrderForms.tsx:598 +msgid "Add Note" +msgstr "Προσθήκη σημείωσης" #: src/forms/PurchaseOrderForms.tsx:658 #~ msgid "Receive line items" #~ msgstr "Receive line items" -#: src/forms/PurchaseOrderForms.tsx:661 +#: src/forms/PurchaseOrderForms.tsx:662 +msgid "Store at default location" +msgstr "Αποθήκευση στην προεπιλεγμένη τοποθεσία" + +#: src/forms/PurchaseOrderForms.tsx:677 +msgid "Store at line item destination " +msgstr "Αποθήκευση στον προορισμό της γραμμής " + +#: src/forms/PurchaseOrderForms.tsx:689 +msgid "Store with already received stock" +msgstr "Αποθήκευση με ήδη παραληφθέν απόθεμα" + +#: src/forms/PurchaseOrderForms.tsx:713 #: src/pages/build/BuildDetail.tsx:340 #: src/pages/stock/StockDetail.tsx:280 #: src/pages/stock/StockDetail.tsx:952 #: src/tables/Filter.tsx:83 -#: src/tables/build/BuildAllocatedStockTable.tsx:128 +#: src/tables/build/BuildAllocatedStockTable.tsx:125 #: src/tables/build/BuildOutputTable.tsx:112 -#: src/tables/part/PartTestResultTable.tsx:260 -#: src/tables/part/PartTestResultTable.tsx:281 +#: src/tables/part/PartTestResultTable.tsx:268 +#: src/tables/part/PartTestResultTable.tsx:289 #: src/tables/sales/SalesOrderAllocationTable.tsx:149 msgid "Batch Code" -msgstr "" +msgstr "Κωδικός παρτίδας" -#: src/forms/PurchaseOrderForms.tsx:662 +#: src/forms/PurchaseOrderForms.tsx:714 msgid "Enter batch code for received items" -msgstr "" +msgstr "Εισαγάγετε κωδικό παρτίδας για τα παραληφθέντα είδη" -#: src/forms/PurchaseOrderForms.tsx:675 +#: src/forms/PurchaseOrderForms.tsx:727 #: src/forms/StockForms.tsx:218 msgid "Serial Numbers" -msgstr "" +msgstr "Σειριακοί αριθμοί" -#: src/forms/PurchaseOrderForms.tsx:676 +#: src/forms/PurchaseOrderForms.tsx:728 msgid "Enter serial numbers for received items" -msgstr "" +msgstr "Εισαγάγετε σειριακούς αριθμούς για τα παραληφθέντα είδη" -#: src/forms/PurchaseOrderForms.tsx:690 +#: src/forms/PurchaseOrderForms.tsx:742 #: src/pages/stock/StockDetail.tsx:382 #: src/tables/stock/StockItemTable.tsx:294 msgid "Expiry Date" -msgstr "" +msgstr "Ημερομηνία λήξης" -#: src/forms/PurchaseOrderForms.tsx:691 +#: src/forms/PurchaseOrderForms.tsx:743 msgid "Enter an expiry date for received items" -msgstr "" +msgstr "Εισαγάγετε ημερομηνία λήξης για τα παραληφθέντα είδη" -#: src/forms/PurchaseOrderForms.tsx:703 +#: src/forms/PurchaseOrderForms.tsx:755 #: src/forms/StockForms.tsx:728 #: src/pages/company/SupplierPartDetail.tsx:172 #: src/pages/company/SupplierPartDetail.tsx:236 #: src/pages/stock/StockDetail.tsx:419 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:227 msgid "Packaging" -msgstr "" +msgstr "Συσκευασία" -#: src/forms/PurchaseOrderForms.tsx:727 +#: src/forms/PurchaseOrderForms.tsx:779 #: src/pages/company/SupplierPartDetail.tsx:120 #: src/tables/ColumnRenderers.tsx:332 msgid "Note" -msgstr "" +msgstr "Σημείωση" -#: src/forms/PurchaseOrderForms.tsx:799 +#: src/forms/PurchaseOrderForms.tsx:851 #: src/pages/company/SupplierPartDetail.tsx:138 #: src/tables/purchasing/SupplierPriceBreakTable.tsx:49 msgid "SKU" -msgstr "" +msgstr "SKU" -#: src/forms/PurchaseOrderForms.tsx:800 +#: src/forms/PurchaseOrderForms.tsx:852 #: src/tables/part/PartPurchaseOrdersTable.tsx:127 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:213 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:283 #: src/tables/sales/ReturnOrderLineItemTable.tsx:171 msgid "Received" -msgstr "" +msgstr "Παραλήφθηκε" -#: src/forms/PurchaseOrderForms.tsx:817 +#: src/forms/PurchaseOrderForms.tsx:869 msgid "Receive Line Items" -msgstr "" +msgstr "Παραλαβή Προϊόντων γραμμής" -#: src/forms/PurchaseOrderForms.tsx:823 +#: src/forms/PurchaseOrderForms.tsx:875 msgid "Items received" -msgstr "" +msgstr "Ελήφθησαν τα είδη" #: src/forms/ReturnOrderForms.tsx:257 msgid "Receive Items" -msgstr "" +msgstr "Παραλαβή ειδών" #: src/forms/ReturnOrderForms.tsx:264 msgid "Item received into stock" -msgstr "" +msgstr "Το είδος παραλήφθηκε στην αποθήκη" -#: src/forms/SalesOrderForms.tsx:401 +#: src/forms/SalesOrderForms.tsx:419 msgid "Leave blank to use the order address" -msgstr "" +msgstr "Αφήστε κενό για χρήση της διεύθυνσης της παραγγελίας" #: src/forms/StockForms.tsx:110 #~ msgid "Create Stock Item" @@ -4751,201 +4758,201 @@ msgstr "" #: src/forms/StockForms.tsx:196 msgid "Add given quantity as packs instead of individual items" -msgstr "" +msgstr "Προσθέστε την ποσότητα ως πακέτα αντί για μεμονωμένα είδη" #: src/forms/StockForms.tsx:210 msgid "Enter initial quantity for this stock item" -msgstr "" +msgstr "Εισαγάγετε αρχική ποσότητα για αυτό το είδος" #: src/forms/StockForms.tsx:220 msgid "Enter serial numbers for new stock (or leave blank)" -msgstr "" +msgstr "Εισαγάγετε σειριακούς αριθμούς για νέο απόθεμα (ή αφήστε κενό)" #: src/forms/StockForms.tsx:240 msgid "Stock Status" -msgstr "" +msgstr "Κατάσταση αποθέματος" #: src/forms/StockForms.tsx:317 #: src/pages/stock/StockDetail.tsx:686 #: src/tables/stock/StockItemTable.tsx:525 #: src/tables/stock/StockItemTable.tsx:572 msgid "Add Stock Item" -msgstr "" +msgstr "Προσθήκη είδους αποθέματος" #: src/forms/StockForms.tsx:361 msgid "Select the part to install" -msgstr "" +msgstr "Επιλέξτε το Προϊόν προς εγκατάσταση" #: src/forms/StockForms.tsx:487 msgid "Confirm Stock Transfer" -msgstr "" +msgstr "Επιβεβαίωση μεταφοράς αποθέματος" #: src/forms/StockForms.tsx:672 msgid "Move to default location" -msgstr "" +msgstr "Μετακίνηση στην προεπιλεγμένη τοποθεσία" #: src/forms/StockForms.tsx:795 msgid "Move" -msgstr "" +msgstr "Μετακίνηση" #: src/forms/StockForms.tsx:842 msgid "Return" -msgstr "" +msgstr "Επιστροφή" #: src/forms/StockForms.tsx:963 #: src/pages/Index/Scan.tsx:182 msgid "Count" -msgstr "" +msgstr "Καταμέτρηση" #: src/forms/StockForms.tsx:1246 #: src/hooks/UseStockAdjustActions.tsx:108 msgid "Add Stock" -msgstr "" +msgstr "Προσθήκη αποθέματος" #: src/forms/StockForms.tsx:1247 msgid "Stock added" -msgstr "" +msgstr "Το απόθεμα προστέθηκε" #: src/forms/StockForms.tsx:1250 msgid "Increase the quantity of the selected stock items by a given amount." -msgstr "" +msgstr "Αυξήστε την ποσότητα των επιλεγμένων ειδών αποθέματος κατά μια δεδομένη τιμή." #: src/forms/StockForms.tsx:1261 #: src/hooks/UseStockAdjustActions.tsx:118 msgid "Remove Stock" -msgstr "" +msgstr "Αφαίρεση αποθέματος" #: src/forms/StockForms.tsx:1262 msgid "Stock removed" -msgstr "" +msgstr "Το απόθεμα αφαιρέθηκε" #: src/forms/StockForms.tsx:1265 msgid "Decrease the quantity of the selected stock items by a given amount." -msgstr "" +msgstr "Μείωση της ποσότητας των επιλεγμένων ειδών αποθέματος κατά μια δεδομένη τιμή." #: src/forms/StockForms.tsx:1276 #: src/hooks/UseStockAdjustActions.tsx:128 msgid "Transfer Stock" -msgstr "" +msgstr "Μεταφορά αποθέματος" #: src/forms/StockForms.tsx:1277 msgid "Stock transferred" -msgstr "" +msgstr "Το απόθεμα μεταφέρθηκε" #: src/forms/StockForms.tsx:1280 msgid "Transfer selected items to the specified location." -msgstr "" +msgstr "Μεταφέρετε τα επιλεγμένα είδη στην καθορισμένη τοποθεσία." #: src/forms/StockForms.tsx:1291 #: src/hooks/UseStockAdjustActions.tsx:168 msgid "Return Stock" -msgstr "" +msgstr "Επιστροφή αποθέματος" #: src/forms/StockForms.tsx:1292 msgid "Stock returned" -msgstr "" +msgstr "Το απόθεμα επιστράφηκε" #: src/forms/StockForms.tsx:1295 msgid "Return selected items into stock, to the specified location." -msgstr "" +msgstr "Επιστροφή των επιλεγμένων ειδών στο απόθεμα, στην καθορισμένη τοποθεσία." #: src/forms/StockForms.tsx:1306 #: src/hooks/UseStockAdjustActions.tsx:98 msgid "Count Stock" -msgstr "" +msgstr "Καταμέτρηση αποθέματος" #: src/forms/StockForms.tsx:1307 msgid "Stock counted" -msgstr "" +msgstr "Το απόθεμα καταμετρήθηκε" #: src/forms/StockForms.tsx:1310 msgid "Count the selected stock items, and adjust the quantity accordingly." -msgstr "" +msgstr "Καταμετρήστε τα επιλεγμένα είδη αποθέματος και προσαρμόστε την ποσότητα ανάλογα." #: src/forms/StockForms.tsx:1321 msgid "Change Stock Status" -msgstr "" +msgstr "Αλλαγή κατάστασης αποθέματος" #: src/forms/StockForms.tsx:1322 msgid "Stock status changed" -msgstr "" +msgstr "Η κατάσταση αποθέματος άλλαξε" #: src/forms/StockForms.tsx:1325 msgid "Change the status of the selected stock items." -msgstr "" +msgstr "Αλλαγή της κατάστασης των επιλεγμένων ειδών αποθέματος." #: src/forms/StockForms.tsx:1336 #: src/hooks/UseStockAdjustActions.tsx:138 msgid "Merge Stock" -msgstr "" +msgstr "Συγχώνευση αποθέματος" #: src/forms/StockForms.tsx:1337 msgid "Stock merged" -msgstr "" +msgstr "Το απόθεμα συγχωνεύτηκε" #: src/forms/StockForms.tsx:1339 msgid "Merge Stock Items" -msgstr "" +msgstr "Συγχώνευση ειδών αποθέματος" #: src/forms/StockForms.tsx:1341 msgid "Merge operation cannot be reversed" -msgstr "" +msgstr "Η ενέργεια συγχώνευσης δεν μπορεί να αναιρεθεί" #: src/forms/StockForms.tsx:1342 msgid "Tracking information may be lost when merging items" -msgstr "" +msgstr "Οι πληροφορίες ιχνηλάτησης μπορεί να χαθούν κατά τη συγχώνευση" #: src/forms/StockForms.tsx:1343 msgid "Supplier information may be lost when merging items" -msgstr "" +msgstr "Οι πληροφορίες προμηθευτή μπορεί να χαθούν κατά τη συγχώνευση" #: src/forms/StockForms.tsx:1361 msgid "Assign Stock to Customer" -msgstr "" +msgstr "Ανάθεση αποθέματος σε πελάτη" #: src/forms/StockForms.tsx:1362 msgid "Stock assigned to customer" -msgstr "" +msgstr "Το απόθεμα ανατέθηκε στον πελάτη" #: src/forms/StockForms.tsx:1372 msgid "Delete Stock Items" -msgstr "" +msgstr "Διαγραφή ειδών αποθέματος" #: src/forms/StockForms.tsx:1373 msgid "Stock deleted" -msgstr "" +msgstr "Το απόθεμα διαγράφηκε" #: src/forms/StockForms.tsx:1376 msgid "This operation will permanently delete the selected stock items." -msgstr "" +msgstr "Αυτή η ενέργεια θα διαγράψει μόνιμα τα επιλεγμένα είδη αποθέματος." #: src/forms/StockForms.tsx:1385 msgid "Parent stock location" -msgstr "" +msgstr "Γονική τοποθεσία αποθέματος" #: src/forms/StockForms.tsx:1512 msgid "Find Serial Number" -msgstr "" +msgstr "Εύρεση σειριακού αριθμού" #: src/forms/StockForms.tsx:1523 msgid "No matching items" -msgstr "" +msgstr "Δεν βρέθηκαν αντίστοιχα είδη" #: src/forms/StockForms.tsx:1529 msgid "Multiple matching items" -msgstr "" +msgstr "Πολλαπλά αντίστοιχα είδη" #: src/forms/StockForms.tsx:1538 msgid "Invalid response from server" -msgstr "" +msgstr "Μη έγκυρη απόκριση από τον διακομιστή" #: src/forms/selectionListFields.tsx:95 msgid "Entries" -msgstr "" +msgstr "Καταχωρήσεις" #: src/forms/selectionListFields.tsx:96 msgid "List of entries to choose from" -msgstr "" +msgstr "Λίστα διαθέσιμων καταχωρήσεων προς επιλογή" #: src/forms/selectionListFields.tsx:100 #: src/pages/part/PartStockHistoryDetail.tsx:59 @@ -4956,35 +4963,35 @@ msgstr "" #: src/tables/purchasing/ManufacturerPartParameterTable.tsx:42 #: src/tables/stock/StockItemTestResultTable.tsx:207 msgid "Value" -msgstr "" +msgstr "Τιμή" #: src/forms/selectionListFields.tsx:101 msgid "Label" -msgstr "" +msgstr "Ετικέτα" #: src/functions/api.tsx:33 msgid "Bad request" -msgstr "" +msgstr "Εσφαλμένο αίτημα" #: src/functions/api.tsx:36 msgid "Unauthorized" -msgstr "" +msgstr "Μη εξουσιοδοτημένο" #: src/functions/api.tsx:39 msgid "Forbidden" -msgstr "" +msgstr "Απαγορευμένο" #: src/functions/api.tsx:42 msgid "Not found" -msgstr "" +msgstr "Δεν βρέθηκε" #: src/functions/api.tsx:45 msgid "Method not allowed" -msgstr "" +msgstr "Μη επιτρεπόμενη μέθοδος" #: src/functions/api.tsx:48 msgid "Internal server error" -msgstr "" +msgstr "Εσωτερικό σφάλμα διακομιστή" #: src/functions/auth.tsx:34 #~ msgid "Error fetching token from server." @@ -5009,16 +5016,16 @@ msgstr "" #: src/functions/auth.tsx:123 #: src/functions/auth.tsx:344 msgid "Already logged in" -msgstr "" +msgstr "Ήδη συνδεδεμένος" #: src/functions/auth.tsx:124 #: src/functions/auth.tsx:345 msgid "There is a conflicting session on the server for this browser. Please logout of that first." -msgstr "" +msgstr "Υπάρχει αντικρουόμενη συνεδρία στον διακομιστή για αυτόν τον browser. Παρακαλώ αποσυνδεθείτε πρώτα από αυτή." #: src/functions/auth.tsx:142 msgid "No response from server." -msgstr "" +msgstr "Δεν υπάρχει απόκριση από τον διακομιστή." #: src/functions/auth.tsx:142 #~ msgid "Found an existing login - using it to log you in." @@ -5030,77 +5037,77 @@ msgstr "" #: src/functions/auth.tsx:179 msgid "MFA Login successful" -msgstr "" +msgstr "Επιτυχής σύνδεση με MFA" #: src/functions/auth.tsx:180 msgid "MFA details were automatically provided in the browser" -msgstr "" +msgstr "Οι λεπτομέρειες MFA παρέχθηκαν αυτόματα από τον browser" #: src/functions/auth.tsx:209 msgid "Logged Out" -msgstr "" +msgstr "Αποσυνδεθήκατε" #: src/functions/auth.tsx:210 msgid "Successfully logged out" -msgstr "" +msgstr "Αποσυνδεθήκατε με επιτυχία" #: src/functions/auth.tsx:249 msgid "Language changed" -msgstr "" +msgstr "Η γλώσσα άλλαξε" #: src/functions/auth.tsx:250 msgid "Your active language has been changed to the one set in your profile" -msgstr "" +msgstr "Η ενεργή γλώσσα σας άλλαξε σε αυτή που έχει οριστεί στο προφίλ σας" #: src/functions/auth.tsx:270 msgid "Theme changed" -msgstr "" +msgstr "Το θέμα άλλαξε" #: src/functions/auth.tsx:271 msgid "Your active theme has been changed to the one set in your profile" -msgstr "" +msgstr "Το ενεργό θέμα άλλαξε σε αυτό που έχει οριστεί στο προφίλ σας" #: src/functions/auth.tsx:305 msgid "Check your inbox for a reset link. This only works if you have an account. Check in spam too." -msgstr "" +msgstr "Ελέγξτε τα εισερχόμενά σας για τον σύνδεσμο επαναφοράς. Λειτουργεί μόνο αν έχετε λογαριασμό. Ελέγξτε και στα spam." #: src/functions/auth.tsx:312 #: src/functions/auth.tsx:569 msgid "Reset failed" -msgstr "" +msgstr "Η επαναφορά απέτυχε" #: src/functions/auth.tsx:401 msgid "Logged In" -msgstr "" +msgstr "Συνδεθήκατε" #: src/functions/auth.tsx:402 msgid "Successfully logged in" -msgstr "" +msgstr "Συνδεθήκατε με επιτυχία" #: src/functions/auth.tsx:529 msgid "Failed to set up MFA" -msgstr "" +msgstr "Αποτυχία ρύθμισης MFA" #: src/functions/auth.tsx:559 msgid "Password set" -msgstr "" +msgstr "Ο κωδικός ορίστηκε" #: src/functions/auth.tsx:560 #: src/functions/auth.tsx:669 msgid "The password was set successfully. You can now login with your new password" -msgstr "" +msgstr "Ο κωδικός ορίστηκε με επιτυχία. Μπορείτε πλέον να συνδεθείτε με τον νέο σας κωδικό" #: src/functions/auth.tsx:634 msgid "Password could not be changed" -msgstr "" +msgstr "Ο κωδικός δεν μπόρεσε να αλλάξει" #: src/functions/auth.tsx:652 msgid "The two password fields didn’t match" -msgstr "" +msgstr "Οι δύο πεδία κωδικού δεν ταιριάζουν" #: src/functions/auth.tsx:668 msgid "Password Changed" -msgstr "" +msgstr "Ο κωδικός άλλαξε" #: src/functions/forms.tsx:50 #~ msgid "Form method not provided" @@ -5120,11 +5127,11 @@ msgstr "" #: src/functions/notifications.tsx:13 msgid "Not implemented" -msgstr "" +msgstr "Δεν έχει υλοποιηθεί" #: src/functions/notifications.tsx:14 msgid "This feature is not yet implemented" -msgstr "" +msgstr "Αυτή η λειτουργία δεν έχει υλοποιηθεί ακόμη" #: src/functions/notifications.tsx:24 #~ msgid "Permission denied" @@ -5132,68 +5139,68 @@ msgstr "" #: src/functions/notifications.tsx:26 msgid "You do not have permission to perform this action" -msgstr "" +msgstr "Δεν έχετε δικαιώματα για να πραγματοποιήσετε αυτή την ενέργεια" #: src/functions/notifications.tsx:37 msgid "Invalid Return Code" -msgstr "" +msgstr "Μη έγκυρος κωδικός επιστροφής" #: src/functions/notifications.tsx:38 msgid "Server returned status {returnCode}" -msgstr "" +msgstr "Ο διακομιστής επέστρεψε κατάσταση {returnCode}" #: src/functions/notifications.tsx:48 msgid "Timeout" -msgstr "" +msgstr "Λήξη χρόνου" #: src/functions/notifications.tsx:49 msgid "The request timed out" -msgstr "" +msgstr "Το αίτημα έληξε χρονικά" #: src/hooks/UseDataExport.tsx:34 msgid "Exporting Data" -msgstr "" +msgstr "Εξαγωγή δεδομένων" #: src/hooks/UseDataExport.tsx:109 msgid "Export Data" -msgstr "" +msgstr "Εξαγωγή δεδομένων" #: src/hooks/UseDataExport.tsx:112 msgid "Export" -msgstr "" +msgstr "Εξαγωγή" #: src/hooks/UseDataOutput.tsx:57 #: src/hooks/UseDataOutput.tsx:111 msgid "Process failed" -msgstr "" +msgstr "Η διαδικασία απέτυχε" #: src/hooks/UseDataOutput.tsx:75 msgid "Process completed successfully" -msgstr "" +msgstr "Η διαδικασία ολοκληρώθηκε επιτυχώς" #: src/hooks/UseForm.tsx:96 msgid "Item Created" -msgstr "" +msgstr "Το Προϊόν δημιουργήθηκε" #: src/hooks/UseForm.tsx:116 msgid "Item Updated" -msgstr "" +msgstr "Το Προϊόν ενημερώθηκε" #: src/hooks/UseForm.tsx:137 msgid "Items Updated" -msgstr "" +msgstr "Τα Προϊόντα ενημερώθηκαν" #: src/hooks/UseForm.tsx:139 msgid "Update multiple items" -msgstr "" +msgstr "Ενημέρωση πολλών Προϊόντων" #: src/hooks/UseForm.tsx:169 msgid "Item Deleted" -msgstr "" +msgstr "Το Προϊόν διαγράφηκε" #: src/hooks/UseForm.tsx:173 msgid "Are you sure you want to delete this item?" -msgstr "" +msgstr "Είστε σίγουρος ότι θέλετε να διαγράψετε αυτό το Προϊόν;" #: src/hooks/UsePlaceholder.tsx:59 #~ msgid "Latest serial number" @@ -5201,97 +5208,97 @@ msgstr "" #: src/hooks/UseStockAdjustActions.tsx:100 msgid "Count selected stock items" -msgstr "" +msgstr "Καταμέτρηση επιλεγμένων ειδών αποθέματος" #: src/hooks/UseStockAdjustActions.tsx:110 msgid "Add to selected stock items" -msgstr "" +msgstr "Προσθήκη στα επιλεγμένα είδη αποθέματος" #: src/hooks/UseStockAdjustActions.tsx:120 msgid "Remove from selected stock items" -msgstr "" +msgstr "Αφαίρεση από τα επιλεγμένα είδη αποθέματος" #: src/hooks/UseStockAdjustActions.tsx:130 msgid "Transfer selected stock items" -msgstr "" +msgstr "Μεταφορά επιλεγμένων ειδών αποθέματος" #: src/hooks/UseStockAdjustActions.tsx:140 msgid "Merge selected stock items" -msgstr "" +msgstr "Συγχώνευση επιλεγμένων ειδών αποθέματος" #: src/hooks/UseStockAdjustActions.tsx:150 msgid "Change status of selected stock items" -msgstr "" +msgstr "Αλλαγή κατάστασης των επιλεγμένων ειδών αποθέματος" #: src/hooks/UseStockAdjustActions.tsx:158 msgid "Assign Stock" -msgstr "" +msgstr "Ανάθεση Αποθέματος" #: src/hooks/UseStockAdjustActions.tsx:160 msgid "Assign selected stock items to a customer" -msgstr "" +msgstr "Ανάθεση των επιλεγμένων ειδών αποθέματος σε πελάτη" #: src/hooks/UseStockAdjustActions.tsx:170 msgid "Return selected items into stock" -msgstr "" +msgstr "Επιστροφή των επιλεγμένων ειδών στο απόθεμα" #: src/hooks/UseStockAdjustActions.tsx:178 msgid "Delete Stock" -msgstr "" +msgstr "Διαγραφή Αποθέματος" #: src/hooks/UseStockAdjustActions.tsx:180 msgid "Delete selected stock items" -msgstr "" +msgstr "Διαγραφή των επιλεγμένων ειδών αποθέματος" #: src/hooks/UseStockAdjustActions.tsx:205 #: src/pages/part/PartDetail.tsx:1137 msgid "Stock Actions" -msgstr "" +msgstr "Ενέργειες Αποθέματος" #: src/pages/Auth/ChangePassword.tsx:32 #: src/pages/Auth/Reset.tsx:14 msgid "Reset Password" -msgstr "" +msgstr "Επαναφορά Κωδικού" #: src/pages/Auth/ChangePassword.tsx:46 msgid "Current Password" -msgstr "" +msgstr "Τρέχων Κωδικός" #: src/pages/Auth/ChangePassword.tsx:47 msgid "Enter your current password" -msgstr "" +msgstr "Εισαγάγετε τον τρέχοντα κωδικό σας" #: src/pages/Auth/ChangePassword.tsx:53 msgid "New Password" -msgstr "" +msgstr "Νέος Κωδικός" #: src/pages/Auth/ChangePassword.tsx:54 msgid "Enter your new password" -msgstr "" +msgstr "Εισαγάγετε τον νέο σας κωδικό" #: src/pages/Auth/ChangePassword.tsx:60 msgid "Confirm New Password" -msgstr "" +msgstr "Επιβεβαίωση Νέου Κωδικού" #: src/pages/Auth/ChangePassword.tsx:61 msgid "Confirm your new password" -msgstr "" +msgstr "Επιβεβαιώστε τον νέο σας κωδικό" #: src/pages/Auth/ChangePassword.tsx:80 msgid "Confirm" -msgstr "" +msgstr "Επιβεβαίωση" #: src/pages/Auth/Layout.tsx:59 msgid "Log off" -msgstr "" +msgstr "Αποσύνδεση" #: src/pages/Auth/LoggedIn.tsx:19 msgid "Checking if you are already logged in" -msgstr "" +msgstr "Έλεγχος εάν είστε ήδη συνδεδεμένος" #: src/pages/Auth/Login.tsx:32 msgid "No selection" -msgstr "" +msgstr "Καμία επιλογή" #: src/pages/Auth/Login.tsx:91 #~ msgid "Welcome, log in below" @@ -5303,15 +5310,15 @@ msgstr "" #: src/pages/Auth/Login.tsx:100 msgid "Login" -msgstr "" +msgstr "Σύνδεση" #: src/pages/Auth/Login.tsx:106 msgid "Logging you in" -msgstr "" +msgstr "Γίνεται σύνδεση…" #: src/pages/Auth/Login.tsx:113 msgid "Don't have an account?" -msgstr "" +msgstr "Δεν έχετε λογαριασμό;" #: src/pages/Auth/Logout.tsx:22 #~ msgid "Logging out" @@ -5329,40 +5336,40 @@ msgstr "" #: src/pages/Auth/MFA.tsx:29 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:77 msgid "Multi-Factor Authentication" -msgstr "" +msgstr "Έλεγχος Ταυτότητας Πολλαπλών Παραγόντων" #: src/pages/Auth/MFA.tsx:33 #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:217 msgid "TOTP Code" -msgstr "" +msgstr "Κωδικός TOTP" #: src/pages/Auth/MFA.tsx:35 msgid "Enter one of your codes: {mfa_types}" -msgstr "" +msgstr "Εισαγάγετε έναν από τους κωδικούς σας: {mfa_types}" #: src/pages/Auth/MFA.tsx:42 msgid "Remember this device" -msgstr "" +msgstr "Να θυμάσαι αυτή τη συσκευή" #: src/pages/Auth/MFA.tsx:44 msgid "If enabled, you will not be asked for MFA on this device for 30 days." -msgstr "" +msgstr "Αν ενεργοποιηθεί, δεν θα σας ζητηθεί MFA σε αυτή τη συσκευή για 30 ημέρες." #: src/pages/Auth/MFA.tsx:53 msgid "Log in" -msgstr "" +msgstr "Σύνδεση" #: src/pages/Auth/MFASetup.tsx:23 msgid "MFA Setup Required" -msgstr "" +msgstr "Απαιτείται ρύθμιση MFA" #: src/pages/Auth/MFASetup.tsx:34 msgid "Add TOTP" -msgstr "" +msgstr "Προσθήκη TOTP" #: src/pages/Auth/Register.tsx:23 msgid "Go back to login" -msgstr "" +msgstr "Επιστροφή στη σύνδεση" #: src/pages/Auth/Reset.tsx:41 #: src/pages/Auth/Set-Password.tsx:112 @@ -5372,11 +5379,11 @@ msgstr "" #: src/pages/Auth/ResetPassword.tsx:22 #: src/pages/Auth/VerifyEmail.tsx:19 msgid "Key invalid" -msgstr "" +msgstr "Μη έγκυρο κλειδί" #: src/pages/Auth/ResetPassword.tsx:23 msgid "You need to provide a valid key to set a new password. Check your inbox for a reset link." -msgstr "" +msgstr "Πρέπει να δώσετε ένα έγκυρο κλειδί για να ορίσετε νέο κωδικό. Ελέγξτε τα εισερχόμενά σας για τον σύνδεσμο επαναφοράς." #: src/pages/Auth/ResetPassword.tsx:30 #~ msgid "Token invalid" @@ -5384,7 +5391,7 @@ msgstr "" #: src/pages/Auth/ResetPassword.tsx:31 msgid "Set new password" -msgstr "" +msgstr "Ορισμός νέου κωδικού" #: src/pages/Auth/ResetPassword.tsx:31 #~ msgid "You need to provide a valid token to set a new password. Check your inbox for a reset link." @@ -5392,11 +5399,11 @@ msgstr "" #: src/pages/Auth/ResetPassword.tsx:35 msgid "The desired new password" -msgstr "" +msgstr "Ο επιθυμητός νέος κωδικός" #: src/pages/Auth/ResetPassword.tsx:44 msgid "Send Password" -msgstr "" +msgstr "Αποστολή κωδικού" #: src/pages/Auth/Set-Password.tsx:49 #~ msgid "No token provided" @@ -5408,24 +5415,24 @@ msgstr "" #: src/pages/Auth/VerifyEmail.tsx:20 msgid "You need to provide a valid key." -msgstr "" +msgstr "Πρέπει να δώσετε ένα έγκυρο κλειδί." #: src/pages/Auth/VerifyEmail.tsx:28 msgid "Verify Email" -msgstr "" +msgstr "Επαλήθευση Email" #: src/pages/Auth/VerifyEmail.tsx:30 msgid "Verify" -msgstr "" +msgstr "Επαλήθευση" #. placeholder {0}: error.statusText #: src/pages/ErrorPage.tsx:16 msgid "Error: {0}" -msgstr "" +msgstr "Σφάλμα: {0}" #: src/pages/ErrorPage.tsx:23 msgid "An unexpected error has occurred" -msgstr "" +msgstr "Προέκυψε ένα απρόσμενο σφάλμα" #: src/pages/ErrorPage.tsx:28 #~ msgid "Sorry, an unexpected error has occurred." @@ -5585,27 +5592,27 @@ msgstr "" #: src/pages/Index/Scan.tsx:65 msgid "Item already scanned" -msgstr "" +msgstr "Το Προϊόν έχει ήδη σαρωθεί" #: src/pages/Index/Scan.tsx:82 msgid "API Error" -msgstr "" +msgstr "Σφάλμα API" #: src/pages/Index/Scan.tsx:83 msgid "Failed to fetch instance data" -msgstr "" +msgstr "Αποτυχία λήψης δεδομένων της εγκατάστασης" #: src/pages/Index/Scan.tsx:130 msgid "Scan Error" -msgstr "" +msgstr "Σφάλμα σάρωσης" #: src/pages/Index/Scan.tsx:162 msgid "Selected elements are not known" -msgstr "" +msgstr "Τα επιλεγμένα στοιχεία δεν είναι γνωστά" #: src/pages/Index/Scan.tsx:169 msgid "Multiple object types selected" -msgstr "" +msgstr "Επιλέχθηκαν πολλοί τύποι Προϊόντων" #: src/pages/Index/Scan.tsx:175 #~ msgid "Actions ..." @@ -5613,24 +5620,24 @@ msgstr "" #: src/pages/Index/Scan.tsx:177 msgid "Actions ... " -msgstr "" +msgstr "Ενέργειες ... " #: src/pages/Index/Scan.tsx:194 #: src/pages/Index/Scan.tsx:198 msgid "Barcode Scanning" -msgstr "" +msgstr "Σάρωση barcode" #: src/pages/Index/Scan.tsx:207 msgid "Barcode Input" -msgstr "" +msgstr "Εισαγωγή barcode" #: src/pages/Index/Scan.tsx:214 msgid "Action" -msgstr "" +msgstr "Ενέργεια" #: src/pages/Index/Scan.tsx:217 msgid "No Items Selected" -msgstr "" +msgstr "Δεν έχουν επιλεγεί Προϊόντα" #: src/pages/Index/Scan.tsx:217 #~ msgid "Manual input" @@ -5638,7 +5645,7 @@ msgstr "" #: src/pages/Index/Scan.tsx:218 msgid "Scan and select items to perform actions" -msgstr "" +msgstr "Σαρώστε και επιλέξτε Προϊόντα για να εκτελέσετε ενέργειες" #: src/pages/Index/Scan.tsx:218 #~ msgid "Image Barcode" @@ -5647,11 +5654,11 @@ msgstr "" #. placeholder {0}: selection.length #: src/pages/Index/Scan.tsx:223 msgid "{0} items selected" -msgstr "" +msgstr "Έχουν επιλεγεί {0} Προϊόντα" #: src/pages/Index/Scan.tsx:235 msgid "Scanned Items" -msgstr "" +msgstr "Σαρωμένα Προϊόντα" #: src/pages/Index/Scan.tsx:276 #~ msgid "Actions for {0}" @@ -5753,7 +5760,7 @@ msgstr "" #: src/pages/Index/Settings/AccountSettings/AccountDetailPanel.tsx:33 #: src/pages/Index/Settings/AccountSettings/AccountDetailPanel.tsx:113 msgid "Edit Account Information" -msgstr "" +msgstr "Επεξεργασία πληροφοριών λογαριασμού" #: src/pages/Index/Settings/AccountSettings/AccountDetailPanel.tsx:34 #~ msgid "User details updated" @@ -5761,7 +5768,7 @@ msgstr "" #: src/pages/Index/Settings/AccountSettings/AccountDetailPanel.tsx:37 msgid "Account details updated" -msgstr "" +msgstr "Τα στοιχεία λογαριασμού ενημερώθηκαν" #: src/pages/Index/Settings/AccountSettings/AccountDetailPanel.tsx:46 #~ msgid "User Actions" @@ -5774,7 +5781,7 @@ msgstr "" #: src/pages/Index/Settings/AccountSettings/AccountDetailPanel.tsx:55 #: src/pages/Index/Settings/AccountSettings/AccountDetailPanel.tsx:136 msgid "Edit Profile Information" -msgstr "" +msgstr "Επεξεργασία πληροφοριών προφίλ" #: src/pages/Index/Settings/AccountSettings/AccountDetailPanel.tsx:55 #~ msgid "Last name" @@ -5790,7 +5797,7 @@ msgstr "" #: src/pages/Index/Settings/AccountSettings/AccountDetailPanel.tsx:59 msgid "Profile details updated" -msgstr "" +msgstr "Τα στοιχεία προφίλ ενημερώθηκαν" #: src/pages/Index/Settings/AccountSettings/AccountDetailPanel.tsx:61 #~ msgid "Last name: {0}" @@ -5799,12 +5806,12 @@ msgstr "" #: src/pages/Index/Settings/AccountSettings/AccountDetailPanel.tsx:65 #: src/pages/core/UserDetail.tsx:55 msgid "First Name" -msgstr "" +msgstr "Όνομα" #: src/pages/Index/Settings/AccountSettings/AccountDetailPanel.tsx:66 #: src/pages/core/UserDetail.tsx:63 msgid "Last Name" -msgstr "" +msgstr "Επώνυμο" #: src/pages/Index/Settings/AccountSettings/AccountDetailPanel.tsx:67 #~ msgid "First name:" @@ -5816,66 +5823,66 @@ msgstr "" #: src/pages/Index/Settings/AccountSettings/AccountDetailPanel.tsx:72 msgid "Staff Access" -msgstr "" +msgstr "Πρόσβαση προσωπικού" #: src/pages/Index/Settings/AccountSettings/AccountDetailPanel.tsx:85 #: src/pages/core/UserDetail.tsx:119 #: src/tables/settings/CustomStateTable.tsx:101 msgid "Display Name" -msgstr "" +msgstr "Όνομα Εμφάνισης" #: src/pages/Index/Settings/AccountSettings/AccountDetailPanel.tsx:86 #: src/pages/core/UserDetail.tsx:127 msgid "Position" -msgstr "" +msgstr "Θέση" #: src/pages/Index/Settings/AccountSettings/AccountDetailPanel.tsx:90 #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:953 msgid "Type" -msgstr "" +msgstr "Τύπος" #: src/pages/Index/Settings/AccountSettings/AccountDetailPanel.tsx:91 #: src/pages/core/UserDetail.tsx:143 msgid "Organisation" -msgstr "" +msgstr "Οργανισμός" #: src/pages/Index/Settings/AccountSettings/AccountDetailPanel.tsx:92 msgid "Primary Group" -msgstr "" +msgstr "Κύρια Ομάδα" #: src/pages/Index/Settings/AccountSettings/AccountDetailPanel.tsx:104 msgid "Account Details" -msgstr "" +msgstr "Στοιχεία Λογαριασμού" #: src/pages/Index/Settings/AccountSettings/AccountDetailPanel.tsx:107 msgid "Account Actions" -msgstr "" +msgstr "Ενέργειες Λογαριασμού" #: src/pages/Index/Settings/AccountSettings/AccountDetailPanel.tsx:111 msgid "Edit Account" -msgstr "" +msgstr "Επεξεργασία Λογαριασμού" #: src/pages/Index/Settings/AccountSettings/AccountDetailPanel.tsx:117 #: src/tables/settings/UserTable.tsx:322 msgid "Change Password" -msgstr "" +msgstr "Αλλαγή Κωδικού" #: src/pages/Index/Settings/AccountSettings/AccountDetailPanel.tsx:119 msgid "Change User Password" -msgstr "" +msgstr "Αλλαγή Κωδικού Χρήστη" #: src/pages/Index/Settings/AccountSettings/AccountDetailPanel.tsx:131 msgid "Profile Details" -msgstr "" +msgstr "Στοιχεία Προφίλ" #: src/pages/Index/Settings/AccountSettings/AccountDetailPanel.tsx:134 msgid "Edit Profile" -msgstr "" +msgstr "Επεξεργασία Προφίλ" #. placeholder {0}: item.label #: src/pages/Index/Settings/AccountSettings/AccountDetailPanel.tsx:153 msgid "{0}" -msgstr "" +msgstr "{0}" #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:103 msgid "Reauthentication Succeeded" @@ -5908,7 +5915,7 @@ msgstr "" #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:195 msgid "Enter your password" -msgstr "" +msgstr "Εισαγάγετε τον κωδικό σας" #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:219 msgid "Enter one of your TOTP codes" @@ -5932,6 +5939,9 @@ msgstr "" #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:310 #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:401 +#: src/tables/build/BuildAllocatedStockTable.tsx:181 +#: src/tables/build/BuildLineTable.tsx:668 +#: src/tables/sales/SalesOrderAllocationTable.tsx:220 msgid "Confirm Removal" msgstr "" @@ -5985,11 +5995,11 @@ msgstr "" #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:532 msgid "Error registering TOTP token" -msgstr "" +msgstr "Σφάλμα κατά την καταχώριση του TOTP token" #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:551 msgid "Register TOTP Token" -msgstr "" +msgstr "Καταχώριση TOTP Token" #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:596 msgid "Error fetching recovery codes" @@ -5999,7 +6009,7 @@ msgstr "" #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:648 #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:852 msgid "Recovery Codes" -msgstr "" +msgstr "Κωδικοί Ανάκτησης" #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:650 msgid "The following one time recovery codes are available for use" @@ -6043,41 +6053,41 @@ msgstr "" #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:845 msgid "TOTP" -msgstr "" +msgstr "TOTP" #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:846 msgid "Time-based One-Time Password" -msgstr "" +msgstr "Κωδικός μίας χρήσης βασισμένος στον χρόνο" #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:853 msgid "One-Time pre-generated recovery codes" -msgstr "" +msgstr "Προ-δημιουργημένοι κωδικοί ανάκτησης μίας χρήσης" #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:859 msgid "WebAuthn" -msgstr "" +msgstr "WebAuthn" #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:860 msgid "Web Authentication (WebAuthn) is a web standard for secure authentication" -msgstr "" +msgstr "Το Web Authentication (WebAuthn) είναι ένα πρότυπο ιστού για ασφαλή ταυτοποίηση" #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:956 msgid "Last used at" -msgstr "" +msgstr "Τελευταία χρήση στις" #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:959 msgid "Created at" -msgstr "" +msgstr "Δημιουργήθηκε στις" #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:970 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:190 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:348 msgid "Not Configured" -msgstr "" +msgstr "Μη Διαμορφωμένο" #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:974 msgid "No multi-factor tokens configured for this account" -msgstr "" +msgstr "Δεν έχουν ρυθμιστεί multi-factor tokens για αυτόν τον λογαριασμό" #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:979 msgid "Register Authentication Method" @@ -6093,19 +6103,19 @@ msgstr "" #: src/pages/Index/Settings/AccountSettings/QrRegistrationForm.tsx:27 msgid "Secret" -msgstr "" +msgstr "Μυστικό" #: src/pages/Index/Settings/AccountSettings/QrRegistrationForm.tsx:40 msgid "One-Time Password" -msgstr "" +msgstr "Κωδικός Μίας Χρήσης" #: src/pages/Index/Settings/AccountSettings/QrRegistrationForm.tsx:41 msgid "Enter the TOTP code to ensure it registered correctly" -msgstr "" +msgstr "Εισαγάγετε τον κωδικό TOTP για να επιβεβαιώσετε ότι καταχωρήθηκε σωστά" #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:51 msgid "Email Addresses" -msgstr "" +msgstr "Διευθύνσεις Email" #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:55 #~ msgid "Single Sign On Accounts" @@ -6113,11 +6123,11 @@ msgstr "" #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:59 msgid "Single Sign On" -msgstr "" +msgstr "Single Sign On" #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:67 msgid "Not enabled" -msgstr "" +msgstr "Μη ενεργοποιημένο" #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:69 #~ msgid "Multifactor" @@ -6125,7 +6135,7 @@ msgstr "" #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:70 msgid "Single Sign On is not enabled for this server " -msgstr "" +msgstr "Το Single Sign On δεν είναι ενεργοποιημένο για αυτόν τον διακομιστή" #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:71 #~ msgid "Single Sign On is not enabled for this server" @@ -6137,11 +6147,11 @@ msgstr "" #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:85 msgid "Access Tokens" -msgstr "" +msgstr "Κλειδιά Πρόσβασης" #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:94 msgid "Session Information" -msgstr "" +msgstr "Πληροφορίες Συνεδρίας" #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:132 #: src/tables/general/BarcodeScanTable.tsx:60 @@ -6149,55 +6159,55 @@ msgstr "" #: src/tables/settings/EmailTable.tsx:131 #: src/tables/settings/ErrorTable.tsx:59 msgid "Timestamp" -msgstr "" +msgstr "Χρονική Σήμανση" #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:133 msgid "Method" -msgstr "" +msgstr "Μέθοδος" #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:176 msgid "Error while updating email" -msgstr "" +msgstr "Σφάλμα κατά την ενημέρωση του email" #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:193 msgid "Currently no email addresses are registered." -msgstr "" +msgstr "Δεν υπάρχουν καταχωρημένες διευθύνσεις email." #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:201 msgid "The following email addresses are associated with your account:" -msgstr "" +msgstr "Οι παρακάτω διευθύνσεις email συνδέονται με τον λογαριασμό σας:" #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:214 msgid "Primary" -msgstr "" +msgstr "Κύρια" #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:219 msgid "Verified" -msgstr "" +msgstr "Επαληθευμένο" #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:223 msgid "Unverified" -msgstr "" +msgstr "Μη Επαληθευμένο" #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:241 msgid "Make Primary" -msgstr "" +msgstr "Ορισμός ως Κύριο" #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:247 msgid "Re-send Verification" -msgstr "" +msgstr "Επαναποστολή Επαλήθευσης" #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:261 msgid "Add Email Address" -msgstr "" +msgstr "Προσθήκη Διεύθυνσης Email" #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:263 msgid "E-Mail" -msgstr "" +msgstr "E-Mail" #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:264 msgid "E-Mail address" -msgstr "" +msgstr "Διεύθυνση E-Mail" #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:270 #~ msgid "Provider has not been configured" @@ -6205,7 +6215,7 @@ msgstr "" #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:276 msgid "Error while adding email" -msgstr "" +msgstr "Σφάλμα κατά την προσθήκη email" #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:280 #~ msgid "Not configured" @@ -6217,7 +6227,7 @@ msgstr "" #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:287 msgid "Add Email" -msgstr "" +msgstr "Προσθήκη Email" #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:293 #~ msgid "You can sign in to your account using any of the following third party accounts" @@ -6225,15 +6235,15 @@ msgstr "" #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:351 msgid "There are no providers connected to this account." -msgstr "" +msgstr "Δεν υπάρχουν συνδεδεμένοι πάροχοι σε αυτόν τον λογαριασμό." #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:360 msgid "You can sign in to your account using any of the following providers" -msgstr "" +msgstr "Μπορείτε να συνδεθείτε στον λογαριασμό σας χρησιμοποιώντας οποιονδήποτε από τους παρακάτω παρόχους" #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:373 msgid "Remove Provider Link" -msgstr "" +msgstr "Αφαίρεση σύνδεσης παρόχου" #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:556 #~ msgid "Unused Codes" @@ -6278,7 +6288,7 @@ msgstr "" #: src/pages/Index/Settings/AccountSettings/UserThemePanel.tsx:61 msgid "Display Settings" -msgstr "" +msgstr "Ρυθμίσεις Εμφάνισης" #: src/pages/Index/Settings/AccountSettings/UserThemePanel.tsx:65 #~ msgid "bars" @@ -6290,7 +6300,7 @@ msgstr "" #: src/pages/Index/Settings/AccountSettings/UserThemePanel.tsx:67 msgid "Language" -msgstr "" +msgstr "Γλώσσα" #: src/pages/Index/Settings/AccountSettings/UserThemePanel.tsx:67 #~ msgid "dots" @@ -6298,7 +6308,7 @@ msgstr "" #: src/pages/Index/Settings/AccountSettings/UserThemePanel.tsx:78 msgid "Use pseudo language" -msgstr "" +msgstr "Χρήση ψευδογλώσσας" #: src/pages/Index/Settings/AccountSettings/UserThemePanel.tsx:81 #~ msgid "Theme" @@ -6306,7 +6316,7 @@ msgstr "" #: src/pages/Index/Settings/AccountSettings/UserThemePanel.tsx:85 msgid "Color Mode" -msgstr "" +msgstr "Λειτουργία χρώματος" #: src/pages/Index/Settings/AccountSettings/UserThemePanel.tsx:87 #~ msgid "Primary color" @@ -6314,39 +6324,39 @@ msgstr "" #: src/pages/Index/Settings/AccountSettings/UserThemePanel.tsx:96 msgid "Highlight color" -msgstr "" +msgstr "Χρώμα επισήμανσης" #: src/pages/Index/Settings/AccountSettings/UserThemePanel.tsx:110 msgid "Example" -msgstr "" +msgstr "Παράδειγμα" #: src/pages/Index/Settings/AccountSettings/UserThemePanel.tsx:116 msgid "White color" -msgstr "" +msgstr "Λευκό χρώμα" #: src/pages/Index/Settings/AccountSettings/UserThemePanel.tsx:139 msgid "Black color" -msgstr "" +msgstr "Μαύρο χρώμα" #: src/pages/Index/Settings/AccountSettings/UserThemePanel.tsx:162 msgid "Border Radius" -msgstr "" +msgstr "Καμπυλότητα γωνιών" #: src/pages/Index/Settings/AccountSettings/UserThemePanel.tsx:178 msgid "Loader" -msgstr "" +msgstr "Δείκτης φόρτωσης" #: src/pages/Index/Settings/AccountSettings/UserThemePanel.tsx:185 msgid "Bars" -msgstr "" +msgstr "Ράβδοι" #: src/pages/Index/Settings/AccountSettings/UserThemePanel.tsx:186 msgid "Oval" -msgstr "" +msgstr "Οβάλ" #: src/pages/Index/Settings/AccountSettings/UserThemePanel.tsx:187 msgid "Dots" -msgstr "" +msgstr "Τελείες" #: src/pages/Index/Settings/AccountSettings/useConfirm.tsx:93 #~ msgid "Reauthentication" @@ -6363,63 +6373,63 @@ msgstr "" #: src/pages/Index/Settings/AdminCenter/CurrencyManagementPanel.tsx:28 #: src/tables/ColumnRenderers.tsx:538 msgid "Currency" -msgstr "" +msgstr "Νόμισμα" #: src/pages/Index/Settings/AdminCenter/CurrencyManagementPanel.tsx:33 msgid "Rate" -msgstr "" +msgstr "Ισοτιμία" #: src/pages/Index/Settings/AdminCenter/CurrencyManagementPanel.tsx:46 msgid "Exchange rates updated" -msgstr "" +msgstr "Οι ισοτιμίες ενημερώθηκαν" #: src/pages/Index/Settings/AdminCenter/CurrencyManagementPanel.tsx:53 msgid "Exchange rate update error" -msgstr "" +msgstr "Σφάλμα ενημέρωσης ισοτιμιών" #: src/pages/Index/Settings/AdminCenter/CurrencyManagementPanel.tsx:63 msgid "Refresh currency exchange rates" -msgstr "" +msgstr "Ανανέωση ισοτιμιών νομισμάτων" #: src/pages/Index/Settings/AdminCenter/CurrencyManagementPanel.tsx:99 msgid "Last fetched" -msgstr "" +msgstr "Τελευταία λήψη" #: src/pages/Index/Settings/AdminCenter/CurrencyManagementPanel.tsx:100 msgid "Base currency" -msgstr "" +msgstr "Βασικό νόμισμα" #: src/pages/Index/Settings/AdminCenter/EmailManagementPanel.tsx:13 msgid "Email Messages" -msgstr "" +msgstr "Μηνύματα email" #: src/pages/Index/Settings/AdminCenter/HomePanel.tsx:22 msgid "Active Alerts" -msgstr "" +msgstr "Ενεργές ειδοποιήσεις" #: src/pages/Index/Settings/AdminCenter/HomePanel.tsx:27 msgid "Inactive Alerts" -msgstr "" +msgstr "Ανενεργές ειδοποιήσεις" #: src/pages/Index/Settings/AdminCenter/HomePanel.tsx:38 msgid "Admin Center Information" -msgstr "" +msgstr "Πληροφορίες Κέντρου Διαχείρισης" #: src/pages/Index/Settings/AdminCenter/HomePanel.tsx:44 msgid "The home panel (and the whole Admin Center) is a new feature starting with the new UI and was previously (before 1.0) not available." -msgstr "" +msgstr "Το κεντρικό πάνελ (και συνολικά το Κέντρο Διαχείρισης) είναι νέα λειτουργία που ξεκινά με το νέο UI και παλαιότερα (πριν την 1.0) δεν ήταν διαθέσιμη." #: src/pages/Index/Settings/AdminCenter/HomePanel.tsx:51 msgid "The admin center provides a centralized location for all administration functionality and is meant to replace all interaction with the (django) backend admin interface." -msgstr "" +msgstr "Το κέντρο διαχείρισης παρέχει έναν κεντρικό χώρο για όλες τις λειτουργίες διαχείρισης και προορίζεται να αντικαταστήσει κάθε αλληλεπίδραση με το backend admin (Django)." #: src/pages/Index/Settings/AdminCenter/HomePanel.tsx:58 msgid "Please open feature requests (after checking the tracker) for any existing backend admin functionality you are missing in this UI. The backend admin interface should be used carefully and seldom." -msgstr "" +msgstr "Άνοιξε αιτήματα νέων λειτουργιών (αφού ελέγξεις πρώτα το tracker) για οποιαδήποτε δυνατότητα του backend admin λείπει από αυτό το UI. Η διεπαφή backend admin πρέπει να χρησιμοποιείται σπάνια και με προσοχή." #: src/pages/Index/Settings/AdminCenter/HomePanel.tsx:76 msgid "Quick Actions" -msgstr "" +msgstr "Γρήγορες ενέργειες" #: src/pages/Index/Settings/AdminCenter/Index.tsx:107 #~ msgid "User Management" @@ -6427,11 +6437,11 @@ msgstr "" #: src/pages/Index/Settings/AdminCenter/Index.tsx:115 msgid "Home" -msgstr "" +msgstr "Αρχική" #: src/pages/Index/Settings/AdminCenter/Index.tsx:122 msgid "Users / Access" -msgstr "" +msgstr "Χρήστες / Πρόσβαση" #: src/pages/Index/Settings/AdminCenter/Index.tsx:127 #~ msgid "Templates" @@ -6439,27 +6449,27 @@ msgstr "" #: src/pages/Index/Settings/AdminCenter/Index.tsx:136 msgid "Data Import" -msgstr "" +msgstr "Εισαγωγή δεδομένων" #: src/pages/Index/Settings/AdminCenter/Index.tsx:142 msgid "Data Export" -msgstr "" +msgstr "Εξαγωγή δεδομένων" #: src/pages/Index/Settings/AdminCenter/Index.tsx:148 msgid "Barcode Scans" -msgstr "" +msgstr "Σαρώσεις barcode" #: src/pages/Index/Settings/AdminCenter/Index.tsx:154 msgid "Background Tasks" -msgstr "" +msgstr "Εργασίες παρασκηνίου" #: src/pages/Index/Settings/AdminCenter/Index.tsx:160 msgid "Error Reports" -msgstr "" +msgstr "Αναφορές σφαλμάτων" #: src/pages/Index/Settings/AdminCenter/Index.tsx:166 msgid "Currencies" -msgstr "" +msgstr "Νομίσματα" #: src/pages/Index/Settings/AdminCenter/Index.tsx:170 #~ msgid "Location types" @@ -6467,26 +6477,26 @@ msgstr "" #: src/pages/Index/Settings/AdminCenter/Index.tsx:183 msgid "Custom States" -msgstr "" +msgstr "Προσαρμοσμένες καταστάσεις" #: src/pages/Index/Settings/AdminCenter/Index.tsx:189 #: src/pages/Index/Settings/AdminCenter/UnitManagementPanel.tsx:57 msgid "Custom Units" -msgstr "" +msgstr "Προσαρμοσμένες μονάδες" #: src/pages/Index/Settings/AdminCenter/Index.tsx:195 #: src/pages/part/CategoryDetail.tsx:313 msgid "Part Parameters" -msgstr "" +msgstr "Παράμετροι Προϊόντων" #: src/pages/Index/Settings/AdminCenter/Index.tsx:202 #: src/pages/part/CategoryDetail.tsx:306 msgid "Category Parameters" -msgstr "" +msgstr "Παράμετροι Κατηγορίας" #: src/pages/Index/Settings/AdminCenter/Index.tsx:221 msgid "Location Types" -msgstr "" +msgstr "Τύποι Τοποθεσιών" #: src/pages/Index/Settings/AdminCenter/Index.tsx:226 #~ msgid "Add a new user" @@ -6496,33 +6506,33 @@ msgstr "" #: src/pages/Index/Settings/AdminCenter/MachineManagementPanel.tsx:52 #: src/tables/machine/MachineTypeTable.tsx:325 msgid "Machines" -msgstr "" +msgstr "Μηχανήματα" #: src/pages/Index/Settings/AdminCenter/Index.tsx:247 msgid "Operations" -msgstr "" +msgstr "Λειτουργίες" #: src/pages/Index/Settings/AdminCenter/Index.tsx:259 msgid "Data Management" -msgstr "" +msgstr "Διαχείριση Δεδομένων" #: src/pages/Index/Settings/AdminCenter/Index.tsx:270 #: src/pages/Index/Settings/SystemSettings.tsx:175 #: src/pages/Index/Settings/UserSettings.tsx:118 msgid "Reporting" -msgstr "" +msgstr "Αναφορές" #: src/pages/Index/Settings/AdminCenter/Index.tsx:275 msgid "PLM" -msgstr "" +msgstr "PLM" #: src/pages/Index/Settings/AdminCenter/Index.tsx:285 msgid "Extend / Integrate" -msgstr "" +msgstr "Επέκταση / Ενσωμάτωση" #: src/pages/Index/Settings/AdminCenter/Index.tsx:299 msgid "Advanced Options" -msgstr "" +msgstr "Προχωρημένες Επιλογές" #: src/pages/Index/Settings/AdminCenter/LabelTemplatePanel.tsx:40 #~ msgid "Generated Labels" @@ -6538,7 +6548,7 @@ msgstr "" #: src/pages/Index/Settings/AdminCenter/MachineManagementPanel.tsx:60 msgid "Machine Drivers" -msgstr "" +msgstr "Οδηγοί Μηχανημάτων" #: src/pages/Index/Settings/AdminCenter/MachineManagementPanel.tsx:62 #~ msgid "There are no machine registry errors." @@ -6546,37 +6556,37 @@ msgstr "" #: src/pages/Index/Settings/AdminCenter/MachineManagementPanel.tsx:68 msgid "Machine Types" -msgstr "" +msgstr "Τύποι Μηχανημάτων" #: src/pages/Index/Settings/AdminCenter/MachineManagementPanel.tsx:76 msgid "Machine Errors" -msgstr "" +msgstr "Σφάλματα Μηχανημάτων" #: src/pages/Index/Settings/AdminCenter/MachineManagementPanel.tsx:89 msgid "Registry Registry Errors" -msgstr "" +msgstr "Σφάλματα Μητρώου" #: src/pages/Index/Settings/AdminCenter/MachineManagementPanel.tsx:92 msgid "There are machine registry errors" -msgstr "" +msgstr "Υπάρχουν σφάλματα μητρώου μηχανημάτων" #: src/pages/Index/Settings/AdminCenter/MachineManagementPanel.tsx:98 msgid "Machine Registry Errors" -msgstr "" +msgstr "Σφάλματα Μητρώου Μηχανημάτων" #: src/pages/Index/Settings/AdminCenter/MachineManagementPanel.tsx:101 msgid "There are no machine registry errors" -msgstr "" +msgstr "Δεν υπάρχουν σφάλματα μητρώου μηχανημάτων" #: src/pages/Index/Settings/AdminCenter/MachineManagementPanel.tsx:122 #: src/tables/machine/MachineListTable.tsx:502 msgid "Machine Settings" -msgstr "" +msgstr "Ρυθμίσεις Μηχανημάτων" #: src/pages/Index/Settings/AdminCenter/PluginManagementPanel.tsx:33 #: src/tables/settings/UserTable.tsx:195 msgid "Info" -msgstr "" +msgstr "Πληροφορίες" #: src/pages/Index/Settings/AdminCenter/PluginManagementPanel.tsx:33 #~ msgid "Plugin Error Stack" @@ -6584,7 +6594,7 @@ msgstr "" #: src/pages/Index/Settings/AdminCenter/PluginManagementPanel.tsx:37 msgid "External plugins are not enabled for this InvenTree installation." -msgstr "" +msgstr "Τα εξωτερικά πρόσθετα δεν είναι ενεργά σε αυτή την εγκατάσταση του InvenTree." #: src/pages/Index/Settings/AdminCenter/PluginManagementPanel.tsx:45 #~ msgid "Warning" @@ -6596,23 +6606,23 @@ msgstr "" #: src/pages/Index/Settings/AdminCenter/PluginManagementPanel.tsx:76 msgid "Plugin Errors" -msgstr "" +msgstr "Σφάλματα πρόσθετων" #: src/pages/Index/Settings/AdminCenter/ReportTemplatePanel.tsx:16 msgid "Page Size" -msgstr "" +msgstr "Μέγεθος Σελίδας" #: src/pages/Index/Settings/AdminCenter/ReportTemplatePanel.tsx:19 msgid "Landscape" -msgstr "" +msgstr "Οριζόντιος προσανατολισμός" #: src/pages/Index/Settings/AdminCenter/ReportTemplatePanel.tsx:25 msgid "Merge" -msgstr "" +msgstr "Συγχώνευση" #: src/pages/Index/Settings/AdminCenter/ReportTemplatePanel.tsx:31 msgid "Attach to Model" -msgstr "" +msgstr "Σύνδεση με Μοντέλο" #: src/pages/Index/Settings/AdminCenter/ReportTemplatePanel.tsx:55 #~ msgid "Generated Reports" @@ -6624,11 +6634,11 @@ msgstr "" #: src/pages/Index/Settings/AdminCenter/TaskManagementPanel.tsx:30 msgid "Background worker not running" -msgstr "" +msgstr "Η εργασία παρασκηνίου δεν εκτελείται" #: src/pages/Index/Settings/AdminCenter/TaskManagementPanel.tsx:31 msgid "The background task manager service is not running. Contact your system administrator." -msgstr "" +msgstr "Η υπηρεσία εργασιών παρασκηνίου δεν εκτελείται. Επικοινώνησε με τον διαχειριστή συστήματος." #: src/pages/Index/Settings/AdminCenter/TaskManagementPanel.tsx:35 #~ msgid "Background Worker Not Running" @@ -6637,17 +6647,17 @@ msgstr "" #: src/pages/Index/Settings/AdminCenter/TaskManagementPanel.tsx:38 #: src/pages/Index/Settings/AdminCenter/TaskManagementPanel.tsx:47 msgid "Pending Tasks" -msgstr "" +msgstr "Εκκρεμείς εργασίες" #: src/pages/Index/Settings/AdminCenter/TaskManagementPanel.tsx:39 #: src/pages/Index/Settings/AdminCenter/TaskManagementPanel.tsx:55 msgid "Scheduled Tasks" -msgstr "" +msgstr "Προγραμματισμένες εργασίες" #: src/pages/Index/Settings/AdminCenter/TaskManagementPanel.tsx:40 #: src/pages/Index/Settings/AdminCenter/TaskManagementPanel.tsx:63 msgid "Failed Tasks" -msgstr "" +msgstr "Αποτυχημένες εργασίες" #: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:67 #~ msgid "Stock item" @@ -6683,19 +6693,19 @@ msgstr "" #: src/pages/Index/Settings/AdminCenter/UnitManagementPanel.tsx:21 msgid "Alias" -msgstr "" +msgstr "Συντόμευση" #: src/pages/Index/Settings/AdminCenter/UnitManagementPanel.tsx:22 msgid "Dimensionless" -msgstr "" +msgstr "Άνευ διαστάσεων" #: src/pages/Index/Settings/AdminCenter/UnitManagementPanel.tsx:65 msgid "All units" -msgstr "" +msgstr "Όλες οι μονάδες" #: src/pages/Index/Settings/AdminCenter/UserManagementPanel.tsx:31 msgid "Tokens" -msgstr "" +msgstr "Tokens" #: src/pages/Index/Settings/AdminCenter/UserManagementPanel.tsx:32 #~ msgid "Select settings relevant for user lifecycle. More available in" @@ -6707,15 +6717,15 @@ msgstr "" #: src/pages/Index/Settings/PluginSettingsGroup.tsx:99 msgid "The settings below are specific to each available plugin" -msgstr "" +msgstr "Οι παρακάτω ρυθμίσεις είναι ειδικές για κάθε διαθέσιμο πρόσθετο" #: src/pages/Index/Settings/SystemSettings.tsx:77 msgid "Authentication" -msgstr "" +msgstr "Ταυτοποίηση" #: src/pages/Index/Settings/SystemSettings.tsx:103 msgid "Barcodes" -msgstr "" +msgstr "Barcodes" #: src/pages/Index/Settings/SystemSettings.tsx:118 #~ msgid "Physical Units" @@ -6728,11 +6738,11 @@ msgstr "" #: src/pages/Index/Settings/SystemSettings.tsx:127 #: src/pages/Index/Settings/UserSettings.tsx:112 msgid "The settings below are specific to each available notification method" -msgstr "" +msgstr "Οι παρακάτω ρυθμίσεις είναι ειδικές για κάθε διαθέσιμη μέθοδο ειδοποίησης" #: src/pages/Index/Settings/SystemSettings.tsx:133 msgid "Pricing" -msgstr "" +msgstr "Τιμολόγηση" #: src/pages/Index/Settings/SystemSettings.tsx:135 #~ msgid "Exchange Rates" @@ -6740,7 +6750,7 @@ msgstr "" #: src/pages/Index/Settings/SystemSettings.tsx:169 msgid "Labels" -msgstr "" +msgstr "Ετικέτες" #: src/pages/Index/Settings/SystemSettings.tsx:317 #~ msgid "Switch to User Setting" @@ -6748,15 +6758,15 @@ msgstr "" #: src/pages/Index/Settings/UserSettings.tsx:41 msgid "Account" -msgstr "" +msgstr "Λογαριασμός" #: src/pages/Index/Settings/UserSettings.tsx:47 msgid "Security" -msgstr "" +msgstr "Ασφάλεια" #: src/pages/Index/Settings/UserSettings.tsx:53 msgid "Display Options" -msgstr "" +msgstr "Επιλογές εμφάνισης" #: src/pages/Index/Settings/UserSettings.tsx:159 #~ msgid "Switch to System Setting" @@ -6780,11 +6790,11 @@ msgstr "" #: src/pages/Notifications.tsx:83 msgid "History" -msgstr "" +msgstr "Ιστορικό" #: src/pages/Notifications.tsx:91 msgid "Mark as unread" -msgstr "" +msgstr "Σήμανση ως μη αναγνωσμένο" #: src/pages/Notifications.tsx:146 #~ msgid "Delete notifications" @@ -6792,15 +6802,15 @@ msgstr "" #: src/pages/build/BuildDetail.tsx:69 msgid "No Required Items" -msgstr "" +msgstr "Δεν υπάρχουν απαιτούμενα Προϊόντα" #: src/pages/build/BuildDetail.tsx:71 msgid "This build order does not have any required items." -msgstr "" +msgstr "Η εντολή κατασκευής δεν έχει απαιτούμενα Προϊόντα." #: src/pages/build/BuildDetail.tsx:72 msgid "The assembled part may not have a Bill of Materials (BOM) defined, or the BOM is empty." -msgstr "" +msgstr "Το συναρμολογημένο Προϊόν μπορεί να μην έχει ορισμένο BOM ή το BOM είναι άδειο." #: src/pages/build/BuildDetail.tsx:80 #~ msgid "Build Status" @@ -6833,7 +6843,7 @@ msgstr "" #: src/tables/build/BuildOrderTable.tsx:83 #: src/tables/stock/StockItemTable.tsx:74 msgid "Revision" -msgstr "" +msgstr "Αναθεώρηση" #: src/pages/build/BuildDetail.tsx:221 #~ msgid "Edit build order" @@ -6849,7 +6859,7 @@ msgstr "" #: src/pages/sales/SalesOrderDetail.tsx:131 #: src/pages/stock/StockDetail.tsx:176 msgid "Custom Status" -msgstr "" +msgstr "Προσαρμοσμένη κατάσταση" #: src/pages/build/BuildDetail.tsx:231 #~ msgid "Delete build order" @@ -6863,43 +6873,43 @@ msgstr "" #: src/tables/build/BuildOrderTable.tsx:183 #: src/tables/stock/StockLocationTable.tsx:48 msgid "External" -msgstr "" +msgstr "Εξωτερικό" #: src/pages/build/BuildDetail.tsx:244 #: src/pages/purchasing/PurchaseOrderDetail.tsx:141 #: src/pages/sales/ReturnOrderDetail.tsx:108 #: src/pages/sales/SalesOrderDetail.tsx:98 #: src/tables/ColumnRenderers.tsx:321 -#: src/tables/build/BuildAllocatedStockTable.tsx:115 -#: src/tables/build/BuildLineTable.tsx:352 +#: src/tables/build/BuildAllocatedStockTable.tsx:112 +#: src/tables/build/BuildLineTable.tsx:353 msgid "Reference" -msgstr "" +msgstr "Αναφορά" #: src/pages/build/BuildDetail.tsx:258 msgid "Parent Build" -msgstr "" +msgstr "Γονική κατασκευή" #: src/pages/build/BuildDetail.tsx:269 msgid "Build Quantity" -msgstr "" +msgstr "Ποσότητα Κατασκευής" #: src/pages/build/BuildDetail.tsx:275 #: src/pages/part/PartDetail.tsx:598 #: src/tables/bom/BomTable.tsx:365 #: src/tables/bom/BomTable.tsx:407 msgid "Can Build" -msgstr "" +msgstr "Μπορεί να Κατασκευαστεί" #: src/pages/build/BuildDetail.tsx:284 #: src/pages/build/BuildDetail.tsx:474 msgid "Completed Outputs" -msgstr "" +msgstr "Ολοκληρωμένες Παραγωγές" #: src/pages/build/BuildDetail.tsx:301 #: src/tables/Filter.tsx:381 #: src/tables/build/BuildOrderTable.tsx:143 msgid "Issued By" -msgstr "" +msgstr "Εκδόθηκε Από" #: src/pages/build/BuildDetail.tsx:309 #: src/pages/part/PartDetail.tsx:691 @@ -6909,15 +6919,15 @@ msgstr "" #: src/tables/ColumnRenderers.tsx:464 #: src/tables/Filter.tsx:319 msgid "Responsible" -msgstr "" +msgstr "Υπεύθυνος" #: src/pages/build/BuildDetail.tsx:327 msgid "Any location" -msgstr "" +msgstr "Οποιαδήποτε τοποθεσία" #: src/pages/build/BuildDetail.tsx:334 msgid "Destination Location" -msgstr "" +msgstr "Τοποθεσία Προορισμού" #: src/pages/build/BuildDetail.tsx:347 #: src/pages/part/PartDetail.tsx:727 @@ -6928,7 +6938,7 @@ msgstr "" #: src/tables/settings/ApiTokenTable.tsx:97 #: src/tables/settings/PendingTasksTable.tsx:41 msgid "Created" -msgstr "" +msgstr "Δημιουργήθηκε" #: src/pages/build/BuildDetail.tsx:358 #: src/pages/purchasing/PurchaseOrderDetail.tsx:286 @@ -6936,7 +6946,7 @@ msgstr "" #: src/pages/sales/SalesOrderDetail.tsx:257 #: src/tables/ColumnRenderers.tsx:486 msgid "Start Date" -msgstr "" +msgstr "Ημερομηνία Έναρξης" #: src/pages/build/BuildDetail.tsx:366 #: src/pages/purchasing/PurchaseOrderDetail.tsx:294 @@ -6947,7 +6957,7 @@ msgstr "" #: src/tables/sales/ReturnOrderLineItemTable.tsx:154 #: src/tables/sales/SalesOrderLineItemTable.tsx:134 msgid "Target Date" -msgstr "" +msgstr "Ημερομηνία Στόχος" #: src/pages/build/BuildDetail.tsx:368 #~ msgid "Reporting Actions" @@ -6957,7 +6967,7 @@ msgstr "" #: src/tables/build/BuildOrderTable.tsx:93 #: src/tables/sales/SalesOrderLineItemTable.tsx:347 msgid "Completed" -msgstr "" +msgstr "Ολοκληρώθηκε" #: src/pages/build/BuildDetail.tsx:374 #~ msgid "Print build report" @@ -6965,34 +6975,34 @@ msgstr "" #: src/pages/build/BuildDetail.tsx:410 msgid "Build Details" -msgstr "" +msgstr "Λεπτομέρειες Κατασκευής" #: src/pages/build/BuildDetail.tsx:416 msgid "Required Parts" -msgstr "" +msgstr "Απαιτούμενα Προϊόντα" #: src/pages/build/BuildDetail.tsx:428 #: src/pages/sales/SalesOrderDetail.tsx:407 #: src/pages/sales/SalesOrderShipmentDetail.tsx:261 #: src/tables/part/PartSalesAllocationsTable.tsx:73 msgid "Allocated Stock" -msgstr "" +msgstr "Δεσμευμένο Απόθεμα" #: src/pages/build/BuildDetail.tsx:444 msgid "Consumed Stock" -msgstr "" +msgstr "Καταναλωμένο Απόθεμα" #: src/pages/build/BuildDetail.tsx:461 msgid "Incomplete Outputs" -msgstr "" +msgstr "Μη Ολοκληρωμένες Παραγωγές" #: src/pages/build/BuildDetail.tsx:489 msgid "External Orders" -msgstr "" +msgstr "Εξωτερικές Παραγγελίες" #: src/pages/build/BuildDetail.tsx:503 msgid "Child Build Orders" -msgstr "" +msgstr "Θυγατρικές Εντολές Κατασκευής" #: src/pages/build/BuildDetail.tsx:513 #: src/pages/part/PartDetail.tsx:937 @@ -7000,144 +7010,144 @@ msgstr "" #: src/tables/build/BuildOutputTable.tsx:654 #: src/tables/stock/StockItemTestResultTable.tsx:173 msgid "Test Results" -msgstr "" +msgstr "Αποτελέσματα Δοκιμών" #: src/pages/build/BuildDetail.tsx:550 msgid "Edit Build Order" -msgstr "" +msgstr "Επεξεργασία Εντολής Κατασκευής" #: src/pages/build/BuildDetail.tsx:572 #: src/tables/build/BuildOrderTable.tsx:207 #: src/tables/build/BuildOrderTable.tsx:223 msgid "Add Build Order" -msgstr "" +msgstr "Προσθήκη Εντολής Κατασκευής" #: src/pages/build/BuildDetail.tsx:582 msgid "Cancel Build Order" -msgstr "" +msgstr "Ακύρωση Εντολής Κατασκευής" #: src/pages/build/BuildDetail.tsx:584 #: src/pages/purchasing/PurchaseOrderDetail.tsx:416 #: src/pages/sales/ReturnOrderDetail.tsx:427 #: src/pages/sales/SalesOrderDetail.tsx:454 msgid "Order cancelled" -msgstr "" +msgstr "Η παραγγελία ακυρώθηκε" #: src/pages/build/BuildDetail.tsx:585 #: src/pages/purchasing/PurchaseOrderDetail.tsx:415 #: src/pages/sales/ReturnOrderDetail.tsx:426 #: src/pages/sales/SalesOrderDetail.tsx:453 msgid "Cancel this order" -msgstr "" +msgstr "Ακύρωση της παραγγελίας" #: src/pages/build/BuildDetail.tsx:594 msgid "Hold Build Order" -msgstr "" +msgstr "Πάγωμα Εντολής Κατασκευής" #: src/pages/build/BuildDetail.tsx:596 #: src/pages/purchasing/PurchaseOrderDetail.tsx:423 #: src/pages/sales/ReturnOrderDetail.tsx:434 #: src/pages/sales/SalesOrderDetail.tsx:461 msgid "Place this order on hold" -msgstr "" +msgstr "Τοποθέτηση παραγγελίας σε αναμονή" #: src/pages/build/BuildDetail.tsx:597 #: src/pages/purchasing/PurchaseOrderDetail.tsx:424 #: src/pages/sales/ReturnOrderDetail.tsx:435 #: src/pages/sales/SalesOrderDetail.tsx:462 msgid "Order placed on hold" -msgstr "" +msgstr "Η παραγγελία τέθηκε σε αναμονή" #: src/pages/build/BuildDetail.tsx:602 msgid "Issue Build Order" -msgstr "" +msgstr "Έκδοση Εντολής Κατασκευής" #: src/pages/build/BuildDetail.tsx:604 #: src/pages/purchasing/PurchaseOrderDetail.tsx:407 #: src/pages/sales/ReturnOrderDetail.tsx:418 #: src/pages/sales/SalesOrderDetail.tsx:445 msgid "Issue this order" -msgstr "" +msgstr "Έκδοση παραγγελίας" #: src/pages/build/BuildDetail.tsx:605 #: src/pages/purchasing/PurchaseOrderDetail.tsx:408 #: src/pages/sales/ReturnOrderDetail.tsx:419 #: src/pages/sales/SalesOrderDetail.tsx:446 msgid "Order issued" -msgstr "" +msgstr "Η παραγγελία εκδόθηκε" #: src/pages/build/BuildDetail.tsx:624 msgid "Complete Build Order" -msgstr "" +msgstr "Ολοκλήρωση Εντολής Κατασκευής" #: src/pages/build/BuildDetail.tsx:630 #: src/pages/purchasing/PurchaseOrderDetail.tsx:436 #: src/pages/sales/ReturnOrderDetail.tsx:442 #: src/pages/sales/SalesOrderDetail.tsx:480 msgid "Mark this order as complete" -msgstr "" +msgstr "Σήμανση παραγγελίας ως ολοκληρωμένη" #: src/pages/build/BuildDetail.tsx:633 #: src/pages/purchasing/PurchaseOrderDetail.tsx:430 #: src/pages/sales/ReturnOrderDetail.tsx:443 #: src/pages/sales/SalesOrderDetail.tsx:481 msgid "Order completed" -msgstr "" +msgstr "Η παραγγελία ολοκληρώθηκε" #: src/pages/build/BuildDetail.tsx:660 #: src/pages/purchasing/PurchaseOrderDetail.tsx:459 #: src/pages/sales/ReturnOrderDetail.tsx:470 #: src/pages/sales/SalesOrderDetail.tsx:516 msgid "Issue Order" -msgstr "" +msgstr "Έκδοση Παραγγελίας" #: src/pages/build/BuildDetail.tsx:667 #: src/pages/purchasing/PurchaseOrderDetail.tsx:466 #: src/pages/sales/ReturnOrderDetail.tsx:477 #: src/pages/sales/SalesOrderDetail.tsx:530 msgid "Complete Order" -msgstr "" +msgstr "Ολοκλήρωση Παραγγελίας" #: src/pages/build/BuildDetail.tsx:686 msgid "Build Order Actions" -msgstr "" +msgstr "Ενέργειες Εντολής Κατασκευής" #: src/pages/build/BuildDetail.tsx:691 #: src/pages/purchasing/PurchaseOrderDetail.tsx:489 #: src/pages/sales/ReturnOrderDetail.tsx:500 #: src/pages/sales/SalesOrderDetail.tsx:554 msgid "Edit order" -msgstr "" +msgstr "Επεξεργασία παραγγελίας" #: src/pages/build/BuildDetail.tsx:695 #: src/pages/purchasing/PurchaseOrderDetail.tsx:497 #: src/pages/sales/ReturnOrderDetail.tsx:506 #: src/pages/sales/SalesOrderDetail.tsx:559 msgid "Duplicate order" -msgstr "" +msgstr "Αντιγραφή παραγγελίας" #: src/pages/build/BuildDetail.tsx:699 #: src/pages/purchasing/PurchaseOrderDetail.tsx:500 #: src/pages/sales/ReturnOrderDetail.tsx:511 #: src/pages/sales/SalesOrderDetail.tsx:562 msgid "Hold order" -msgstr "" +msgstr "Κατάψυξη παραγγελίας" #: src/pages/build/BuildDetail.tsx:704 #: src/pages/purchasing/PurchaseOrderDetail.tsx:505 #: src/pages/sales/ReturnOrderDetail.tsx:516 #: src/pages/sales/SalesOrderDetail.tsx:567 msgid "Cancel order" -msgstr "" +msgstr "Ακύρωση παραγγελίας" #: src/pages/build/BuildDetail.tsx:742 #: src/pages/stock/StockDetail.tsx:344 -#: src/tables/build/BuildAllocatedStockTable.tsx:85 +#: src/tables/build/BuildAllocatedStockTable.tsx:82 #: src/tables/part/PartBuildAllocationsTable.tsx:45 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:157 #: src/tables/stock/StockTrackingTable.tsx:109 msgid "Build Order" -msgstr "" +msgstr "Εντολή Κατασκευής" #: src/pages/build/BuildIndex.tsx:23 #~ msgid "Build order created" @@ -7146,7 +7156,7 @@ msgstr "" #: src/pages/build/BuildIndex.tsx:29 #: src/tables/build/BuildOrderTable.tsx:184 msgid "Show external build orders" -msgstr "" +msgstr "Εμφάνιση εξωτερικών εντολών κατασκευής" #: src/pages/build/BuildIndex.tsx:39 #~ msgid "New Build Order" @@ -7157,34 +7167,34 @@ msgstr "" #: src/pages/sales/SalesIndex.tsx:92 #: src/pages/sales/SalesIndex.tsx:125 msgid "Table View" -msgstr "" +msgstr "Προβολή Πίνακα" #: src/pages/build/BuildIndex.tsx:86 #: src/pages/purchasing/PurchasingIndex.tsx:72 #: src/pages/sales/SalesIndex.tsx:95 #: src/pages/sales/SalesIndex.tsx:128 msgid "Calendar View" -msgstr "" +msgstr "Προβολή Ημερολογίου" #: src/pages/company/CompanyDetail.tsx:99 msgid "Website" -msgstr "" +msgstr "Ιστοσελίδα" #: src/pages/company/CompanyDetail.tsx:107 msgid "Phone Number" -msgstr "" +msgstr "Τηλέφωνο" #: src/pages/company/CompanyDetail.tsx:114 msgid "Email Address" -msgstr "" +msgstr "Διεύθυνση Email" #: src/pages/company/CompanyDetail.tsx:121 msgid "Tax ID" -msgstr "" +msgstr "ΑΦΜ" #: src/pages/company/CompanyDetail.tsx:131 msgid "Default Currency" -msgstr "" +msgstr "Προεπιλεγμένο Νόμισμα" #: src/pages/company/CompanyDetail.tsx:142 #: src/pages/company/ManufacturerDetail.tsx:8 @@ -7195,7 +7205,7 @@ msgstr "" #: src/tables/company/CompanyTable.tsx:101 #: src/tables/purchasing/SupplierPartTable.tsx:89 msgid "Manufacturer" -msgstr "" +msgstr "Κατασκευαστής" #: src/pages/company/CompanyDetail.tsx:148 #: src/pages/company/CustomerDetail.tsx:8 @@ -7210,7 +7220,7 @@ msgstr "" #: src/tables/sales/SalesOrderTable.tsx:133 #: src/tables/stock/StockTrackingTable.tsx:153 msgid "Customer" -msgstr "" +msgstr "Πελάτης" #: src/pages/company/CompanyDetail.tsx:175 #~ msgid "Edit company" @@ -7218,11 +7228,11 @@ msgstr "" #: src/pages/company/CompanyDetail.tsx:181 msgid "Company Details" -msgstr "" +msgstr "Στοιχεία Εταιρείας" #: src/pages/company/CompanyDetail.tsx:187 msgid "Supplied Parts" -msgstr "" +msgstr "Προμηθευόμενα Προϊόντα" #: src/pages/company/CompanyDetail.tsx:189 #~ msgid "Delete company" @@ -7230,79 +7240,79 @@ msgstr "" #: src/pages/company/CompanyDetail.tsx:194 msgid "Manufactured Parts" -msgstr "" +msgstr "Κατασκευασμένα Προϊόντα" #: src/pages/company/CompanyDetail.tsx:241 msgid "Assigned Stock" -msgstr "" +msgstr "Ανατεθειμένο Απόθεμα" #: src/pages/company/CompanyDetail.tsx:282 #: src/tables/company/CompanyTable.tsx:82 msgid "Edit Company" -msgstr "" +msgstr "Επεξεργασία Εταιρείας" #: src/pages/company/CompanyDetail.tsx:290 msgid "Delete Company" -msgstr "" +msgstr "Διαγραφή Εταιρείας" #: src/pages/company/CompanyDetail.tsx:305 msgid "Company Actions" -msgstr "" +msgstr "Ενέργειες Εταιρείας" #: src/pages/company/ManufacturerPartDetail.tsx:78 #: src/pages/company/SupplierPartDetail.tsx:89 msgid "Internal Part" -msgstr "" +msgstr "Εσωτερικό Προϊόν" #: src/pages/company/ManufacturerPartDetail.tsx:112 msgid "Manufacturer Part Number" -msgstr "" +msgstr "Κωδικός Προϊόντος Κατασκευαστή" #: src/pages/company/ManufacturerPartDetail.tsx:129 #: src/pages/company/SupplierPartDetail.tsx:113 msgid "External Link" -msgstr "" +msgstr "Εξωτερικός Σύνδεσμος" #: src/pages/company/ManufacturerPartDetail.tsx:148 #: src/pages/company/SupplierPartDetail.tsx:232 #: src/pages/part/PartDetail.tsx:787 msgid "Part Details" -msgstr "" +msgstr "Στοιχεία Προϊόντος" #: src/pages/company/ManufacturerPartDetail.tsx:151 msgid "Manufacturer Details" -msgstr "" +msgstr "Στοιχεία Κατασκευαστή" #: src/pages/company/ManufacturerPartDetail.tsx:160 msgid "Manufacturer Part Details" -msgstr "" +msgstr "Στοιχεία Προϊόντος Κατασκευαστή" #: src/pages/company/ManufacturerPartDetail.tsx:178 #: src/pages/company/SupplierPartDetail.tsx:252 #: src/pages/purchasing/PurchaseOrderDetail.tsx:381 msgid "Received Stock" -msgstr "" +msgstr "Παραληφθέν Απόθεμα" #: src/pages/company/ManufacturerPartDetail.tsx:220 #: src/tables/purchasing/ManufacturerPartTable.tsx:108 msgid "Edit Manufacturer Part" -msgstr "" +msgstr "Επεξεργασία Προϊόντος Κατασκευαστή" #: src/pages/company/ManufacturerPartDetail.tsx:227 #: src/tables/purchasing/ManufacturerPartTable.tsx:96 #: src/tables/purchasing/ManufacturerPartTable.tsx:115 #: src/tables/purchasing/ManufacturerPartTable.tsx:156 msgid "Add Manufacturer Part" -msgstr "" +msgstr "Προσθήκη Προϊόντος Κατασκευαστή" #: src/pages/company/ManufacturerPartDetail.tsx:239 #: src/tables/purchasing/ManufacturerPartTable.tsx:126 msgid "Delete Manufacturer Part" -msgstr "" +msgstr "Διαγραφή Προϊόντος Κατασκευαστή" #: src/pages/company/ManufacturerPartDetail.tsx:254 msgid "Manufacturer Part Actions" -msgstr "" +msgstr "Ενέργειες Προϊόντος Κατασκευαστή" #: src/pages/company/ManufacturerPartDetail.tsx:281 #~ msgid "ManufacturerPart" @@ -7311,7 +7321,7 @@ msgstr "" #: src/pages/company/SupplierPartDetail.tsx:104 #: src/tables/part/RelatedPartTable.tsx:82 msgid "Part Description" -msgstr "" +msgstr "Περιγραφή Προϊόντος" #: src/pages/company/SupplierPartDetail.tsx:179 #: src/tables/part/PartPurchaseOrdersTable.tsx:73 @@ -7319,203 +7329,203 @@ msgstr "" #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:233 #: src/tables/purchasing/SupplierPartTable.tsx:138 msgid "Pack Quantity" -msgstr "" +msgstr "Ποσότητα Συσκευασίας" #: src/pages/company/SupplierPartDetail.tsx:204 msgid "Supplier Availability" -msgstr "" +msgstr "Διαθεσιμότητα Προμηθευτή" #: src/pages/company/SupplierPartDetail.tsx:212 msgid "Availability Updated" -msgstr "" +msgstr "Η Διαθεσιμότητα Ενημερώθηκε" #: src/pages/company/SupplierPartDetail.tsx:237 msgid "Availability" -msgstr "" +msgstr "Διαθεσιμότητα" #: src/pages/company/SupplierPartDetail.tsx:246 msgid "Supplier Part Details" -msgstr "" +msgstr "Στοιχεία Προϊόντος Προμηθευτή" #: src/pages/company/SupplierPartDetail.tsx:279 #: src/pages/part/PartPricingPanel.tsx:113 #: src/pages/part/pricing/PricingOverviewPanel.tsx:239 msgid "Supplier Pricing" -msgstr "" +msgstr "Τιμολόγηση Προμηθευτή" #: src/pages/company/SupplierPartDetail.tsx:308 msgid "Supplier Part Actions" -msgstr "" +msgstr "Ενέργειες Προϊόντος Προμηθευτή" #: src/pages/company/SupplierPartDetail.tsx:332 #: src/tables/purchasing/SupplierPartTable.tsx:244 msgid "Edit Supplier Part" -msgstr "" +msgstr "Επεξεργασία Προϊόντος Προμηθευτή" #: src/pages/company/SupplierPartDetail.tsx:340 #: src/tables/purchasing/SupplierPartTable.tsx:264 msgid "Delete Supplier Part" -msgstr "" +msgstr "Διαγραφή Προϊόντος Προμηθευτή" #: src/pages/company/SupplierPartDetail.tsx:348 #: src/tables/purchasing/SupplierPartTable.tsx:172 #: src/tables/purchasing/SupplierPartTable.tsx:251 msgid "Add Supplier Part" -msgstr "" +msgstr "Προσθήκη Προϊόντος Προμηθευτή" #: src/pages/company/SupplierPartDetail.tsx:388 #: src/pages/part/PartDetail.tsx:1003 msgid "No Stock" -msgstr "" +msgstr "Χωρίς Απόθεμα" #: src/pages/core/CoreIndex.tsx:46 #: src/pages/core/GroupDetail.tsx:81 #: src/pages/core/UserDetail.tsx:224 msgid "System Overview" -msgstr "" +msgstr "Επισκόπηση Συστήματος" #: src/pages/core/GroupDetail.tsx:45 msgid "Group Name" -msgstr "" +msgstr "Όνομα Ομάδας" #: src/pages/core/GroupDetail.tsx:52 #: src/pages/core/GroupDetail.tsx:67 #: src/tables/settings/GroupTable.tsx:85 msgid "Group Details" -msgstr "" +msgstr "Στοιχεία Ομάδας" #: src/pages/core/GroupDetail.tsx:55 #: src/tables/settings/GroupTable.tsx:112 msgid "Group Roles" -msgstr "" +msgstr "Ρόλοι Ομάδας" #: src/pages/core/UserDetail.tsx:175 #: src/tables/ColumnRenderers.tsx:418 msgid "User Information" -msgstr "" +msgstr "Πληροφορίες Χρήστη" #: src/pages/core/UserDetail.tsx:176 msgid "User Permissions" -msgstr "" +msgstr "Δικαιώματα Χρήστη" #: src/pages/core/UserDetail.tsx:178 msgid "User Profile" -msgstr "" +msgstr "Προφίλ Χρήστη" #: src/pages/core/UserDetail.tsx:188 #: src/tables/settings/UserTable.tsx:164 msgid "User Details" -msgstr "" +msgstr "Στοιχεία Χρήστη" #: src/pages/core/UserDetail.tsx:206 msgid "Basic user" -msgstr "" +msgstr "Βασικός χρήστης" #: src/pages/part/CategoryDetail.tsx:100 #: src/pages/stock/LocationDetail.tsx:94 #: src/tables/settings/ErrorTable.tsx:63 #: src/tables/settings/ErrorTable.tsx:108 msgid "Path" -msgstr "" +msgstr "Διαδρομή" #: src/pages/part/CategoryDetail.tsx:116 msgid "Parent Category" -msgstr "" +msgstr "Γονική Κατηγορία" #: src/pages/part/CategoryDetail.tsx:139 #: src/pages/part/CategoryDetail.tsx:271 msgid "Subcategories" -msgstr "" +msgstr "Υποκατηγορίες" #: src/pages/part/CategoryDetail.tsx:146 #: src/pages/stock/LocationDetail.tsx:134 #: src/tables/part/PartCategoryTable.tsx:89 #: src/tables/stock/StockLocationTable.tsx:43 msgid "Structural" -msgstr "" +msgstr "Δομικό" #: src/pages/part/CategoryDetail.tsx:152 msgid "Parent default location" -msgstr "" +msgstr "Προεπιλεγμένη τοποθεσία γονικής" #: src/pages/part/CategoryDetail.tsx:159 msgid "Default location" -msgstr "" +msgstr "Προεπιλεγμένη τοποθεσία" #: src/pages/part/CategoryDetail.tsx:170 msgid "Top level part category" -msgstr "" +msgstr "Κατηγορία Προϊόντων κορυφαίου επιπέδου" #: src/pages/part/CategoryDetail.tsx:180 #: src/pages/part/CategoryDetail.tsx:248 #: src/tables/part/PartCategoryTable.tsx:122 msgid "Edit Part Category" -msgstr "" +msgstr "Επεξεργασία Κατηγορίας Προϊόντων" #: src/pages/part/CategoryDetail.tsx:189 msgid "Move items to parent category" -msgstr "" +msgstr "Μετακίνηση Προϊόντων στη γονική κατηγορία" #: src/pages/part/CategoryDetail.tsx:193 #: src/pages/stock/LocationDetail.tsx:226 msgid "Delete items" -msgstr "" +msgstr "Διαγραφή Προϊόντων" #: src/pages/part/CategoryDetail.tsx:201 #: src/pages/part/CategoryDetail.tsx:253 msgid "Delete Part Category" -msgstr "" +msgstr "Διαγραφή Κατηγορίας Προϊόντων" #: src/pages/part/CategoryDetail.tsx:204 msgid "Parts Action" -msgstr "" +msgstr "Ενέργεια Προϊόντων" #: src/pages/part/CategoryDetail.tsx:205 msgid "Action for parts in this category" -msgstr "" +msgstr "Ενέργεια για τα Προϊόντα αυτής της κατηγορίας" #: src/pages/part/CategoryDetail.tsx:211 msgid "Child Categories Action" -msgstr "" +msgstr "Ενέργεια Υποκατηγοριών" #: src/pages/part/CategoryDetail.tsx:212 msgid "Action for child categories in this category" -msgstr "" +msgstr "Ενέργεια για τις υποκατηγορίες αυτής της κατηγορίας" #: src/pages/part/CategoryDetail.tsx:244 #: src/tables/part/PartCategoryTable.tsx:143 msgid "Category Actions" -msgstr "" +msgstr "Ενέργειες Κατηγορίας" #: src/pages/part/CategoryDetail.tsx:265 msgid "Category Details" -msgstr "" +msgstr "Στοιχεία Κατηγορίας" #: src/pages/part/PartAllocationPanel.tsx:21 #: src/pages/stock/StockDetail.tsx:555 #: src/tables/part/PartTable.tsx:121 msgid "Build Order Allocations" -msgstr "" +msgstr "Κατανομές Εντολών Κατασκευής" #: src/pages/part/PartAllocationPanel.tsx:31 #: src/pages/stock/StockDetail.tsx:570 #: src/tables/part/PartTable.tsx:129 msgid "Sales Order Allocations" -msgstr "" +msgstr "Κατανομές Παραγγελιών Πώλησης" #: src/pages/part/PartDetail.tsx:180 #: src/pages/part/PartDetail.tsx:183 #: src/pages/part/PartDetail.tsx:227 msgid "Validate BOM" -msgstr "" +msgstr "Έλεγχος BOM" #: src/pages/part/PartDetail.tsx:184 msgid "Do you want to validate the bill of materials for this assembly?" -msgstr "" +msgstr "Θέλετε να επικυρώσετε το BOM για αυτό το συναρμολόγημα;" #: src/pages/part/PartDetail.tsx:187 msgid "Bill of materials scheduled for validation" -msgstr "" +msgstr "Το BOM προγραμματίστηκε για επικύρωση" #: src/pages/part/PartDetail.tsx:187 #~ msgid "BOM validated" @@ -7523,32 +7533,32 @@ msgstr "" #: src/pages/part/PartDetail.tsx:205 msgid "BOM Validated" -msgstr "" +msgstr "Το BOM Επικυρώθηκε" #: src/pages/part/PartDetail.tsx:206 msgid "The Bill of Materials for this part has been validated" -msgstr "" +msgstr "Το BOM για αυτό το Προϊόν έχει επικυρωθεί" #: src/pages/part/PartDetail.tsx:210 #: src/pages/part/PartDetail.tsx:215 msgid "BOM Not Validated" -msgstr "" +msgstr "Το BOM Δεν Έχει Επικυρωθεί" #: src/pages/part/PartDetail.tsx:211 msgid "The Bill of Materials for this part has previously been checked, but requires revalidation" -msgstr "" +msgstr "Το BOM για αυτό το Προϊόν έχει ελεγχθεί παλαιότερα, αλλά απαιτεί επανεπικύρωση" #: src/pages/part/PartDetail.tsx:216 msgid "The Bill of Materials for this part has not yet been validated" -msgstr "" +msgstr "Το BOM για αυτό το Προϊόν δεν έχει επικυρωθεί ακόμη" #: src/pages/part/PartDetail.tsx:247 msgid "Validated On" -msgstr "" +msgstr "Επικυρώθηκε Στις" #: src/pages/part/PartDetail.tsx:252 msgid "Validated By" -msgstr "" +msgstr "Επικυρώθηκε Από" #: src/pages/part/PartDetail.tsx:286 #~ msgid "Variant Stock" @@ -7568,26 +7578,26 @@ msgstr "" #: src/pages/part/PartDetail.tsx:466 msgid "Variant of" -msgstr "" +msgstr "Παραλλαγή του" #: src/pages/part/PartDetail.tsx:473 msgid "Revision of" -msgstr "" +msgstr "Αναθεώρηση του" #: src/pages/part/PartDetail.tsx:493 #: src/tables/ColumnRenderers.tsx:209 #: src/tables/ColumnRenderers.tsx:218 msgid "Default Location" -msgstr "" +msgstr "Προεπιλεγμένη Τοποθεσία" #: src/pages/part/PartDetail.tsx:500 msgid "Category Default Location" -msgstr "" +msgstr "Προεπιλεγμένη Τοποθεσία Κατηγορίας" #: src/pages/part/PartDetail.tsx:507 #: src/tables/purchasing/ManufacturerPartParameterTable.tsx:48 msgid "Units" -msgstr "" +msgstr "Μονάδες" #: src/pages/part/PartDetail.tsx:510 #~ msgid "Stocktake By" @@ -7596,38 +7606,38 @@ msgstr "" #: src/pages/part/PartDetail.tsx:514 #: src/tables/settings/PendingTasksTable.tsx:51 msgid "Keywords" -msgstr "" +msgstr "Λέξεις-Κλειδιά" #: src/pages/part/PartDetail.tsx:542 #: src/tables/bom/BomTable.tsx:439 -#: src/tables/build/BuildLineTable.tsx:305 +#: src/tables/build/BuildLineTable.tsx:306 #: src/tables/part/PartTable.tsx:319 #: src/tables/sales/SalesOrderLineItemTable.tsx:138 msgid "Available Stock" -msgstr "" +msgstr "Διαθέσιμο Απόθεμα" #: src/pages/part/PartDetail.tsx:548 #: src/tables/bom/BomTable.tsx:341 -#: src/tables/build/BuildLineTable.tsx:267 +#: src/tables/build/BuildLineTable.tsx:268 #: src/tables/sales/SalesOrderLineItemTable.tsx:180 msgid "On order" -msgstr "" +msgstr "Σε παραγγελία" #: src/pages/part/PartDetail.tsx:555 msgid "Required for Orders" -msgstr "" +msgstr "Απαιτείται για Παραγγελίες" #: src/pages/part/PartDetail.tsx:566 msgid "Allocated to Build Orders" -msgstr "" +msgstr "Δεσμευμένο για Εντολές Κατασκευής" #: src/pages/part/PartDetail.tsx:578 msgid "Allocated to Sales Orders" -msgstr "" +msgstr "Δεσμευμένο για Παραγγελίες Πώλησης" #: src/pages/part/PartDetail.tsx:605 msgid "Minimum Stock" -msgstr "" +msgstr "Ελάχιστο Απόθεμα" #: src/pages/part/PartDetail.tsx:613 #~ msgid "Scheduling" @@ -7637,45 +7647,45 @@ msgstr "" #: src/tables/part/ParametricPartTable.tsx:359 #: src/tables/part/PartTable.tsx:203 msgid "Locked" -msgstr "" +msgstr "Κλειδωμένο" #: src/pages/part/PartDetail.tsx:626 msgid "Template Part" -msgstr "" +msgstr "Πρότυπο Προϊόν" #: src/pages/part/PartDetail.tsx:631 #: src/tables/bom/BomTable.tsx:429 msgid "Assembled Part" -msgstr "" +msgstr "Συναρμολογημένο Προϊόν" #: src/pages/part/PartDetail.tsx:636 msgid "Component Part" -msgstr "" +msgstr "Προϊόν Συστατικού" #: src/pages/part/PartDetail.tsx:641 #: src/tables/bom/BomTable.tsx:419 msgid "Testable Part" -msgstr "" +msgstr "Ελέγξιμο Προϊόν" #: src/pages/part/PartDetail.tsx:647 #: src/tables/bom/BomTable.tsx:424 msgid "Trackable Part" -msgstr "" +msgstr "Ανιχνεύσιμο Προϊόν" #: src/pages/part/PartDetail.tsx:652 msgid "Purchaseable Part" -msgstr "" +msgstr "Αγοράσιμο Προϊόν" #: src/pages/part/PartDetail.tsx:658 msgid "Saleable Part" -msgstr "" +msgstr "Πωλήσιμο Προϊόν" #: src/pages/part/PartDetail.tsx:663 #: src/pages/part/PartDetail.tsx:1033 #: src/tables/bom/BomTable.tsx:150 #: src/tables/bom/BomTable.tsx:434 msgid "Virtual Part" -msgstr "" +msgstr "Εικονικό Προϊόν" #: src/pages/part/PartDetail.tsx:678 #: src/pages/purchasing/PurchaseOrderDetail.tsx:271 @@ -7683,69 +7693,69 @@ msgstr "" #: src/pages/sales/SalesOrderDetail.tsx:242 #: src/tables/ColumnRenderers.tsx:502 msgid "Creation Date" -msgstr "" +msgstr "Ημερομηνία Δημιουργίας" #: src/pages/part/PartDetail.tsx:683 #: src/tables/ColumnRenderers.tsx:435 #: src/tables/Filter.tsx:373 msgid "Created By" -msgstr "" +msgstr "Δημιουργήθηκε Από" #: src/pages/part/PartDetail.tsx:698 msgid "Default Supplier" -msgstr "" +msgstr "Προεπιλεγμένος Προμηθευτής" #: src/pages/part/PartDetail.tsx:704 msgid "Default Expiry" -msgstr "" +msgstr "Προεπιλεγμένη Λήξη" #: src/pages/part/PartDetail.tsx:709 msgid "days" -msgstr "" +msgstr "ημέρες" #: src/pages/part/PartDetail.tsx:719 #: src/pages/part/pricing/BomPricingPanel.tsx:79 #: src/pages/part/pricing/VariantPricingPanel.tsx:95 #: src/tables/part/PartTable.tsx:179 msgid "Price Range" -msgstr "" +msgstr "Εύρος Τιμής" #: src/pages/part/PartDetail.tsx:729 msgid "Latest Serial Number" -msgstr "" +msgstr "Τελευταίος Σειριακός Αριθμός" #: src/pages/part/PartDetail.tsx:757 msgid "Select Part Revision" -msgstr "" +msgstr "Επιλογή Αναθεώρησης Προϊόντος" #: src/pages/part/PartDetail.tsx:823 msgid "Variants" -msgstr "" +msgstr "Παραλλαγές" #: src/pages/part/PartDetail.tsx:830 #: src/pages/stock/StockDetail.tsx:542 msgid "Allocations" -msgstr "" +msgstr "Δεσμεύσεις" #: src/pages/part/PartDetail.tsx:837 msgid "Bill of Materials" -msgstr "" +msgstr "Κατάλογος Υλικών (BOM)" #: src/pages/part/PartDetail.tsx:849 msgid "Used In" -msgstr "" +msgstr "Χρησιμοποιείται Σε" #: src/pages/part/PartDetail.tsx:856 msgid "Part Pricing" -msgstr "" +msgstr "Τιμολόγηση Προϊόντος" #: src/pages/part/PartDetail.tsx:926 msgid "Test Templates" -msgstr "" +msgstr "Πρότυπα Δοκιμών" #: src/pages/part/PartDetail.tsx:948 msgid "Related Parts" -msgstr "" +msgstr "Σχετικά Προϊόντα" #: src/pages/part/PartDetail.tsx:956 #~ msgid "Count part stock" @@ -7759,41 +7769,41 @@ msgstr "" #: src/tables/part/PartTestTemplateTable.tsx:112 #: src/tables/stock/StockItemTestResultTable.tsx:404 msgid "Required" -msgstr "" +msgstr "Απαιτείται" #: src/pages/part/PartDetail.tsx:1058 #: src/tables/part/PartTable.tsx:396 #: src/tables/part/PartTable.tsx:449 msgid "Add Part" -msgstr "" +msgstr "Προσθήκη Προϊόντος" #: src/pages/part/PartDetail.tsx:1072 msgid "Delete Part" -msgstr "" +msgstr "Διαγραφή Προϊόντος" #: src/pages/part/PartDetail.tsx:1081 msgid "Deleting this part cannot be reversed" -msgstr "" +msgstr "Η διαγραφή αυτού του Προϊόντος δεν μπορεί να αναιρεθεί" #: src/pages/part/PartDetail.tsx:1143 #: src/pages/stock/StockDetail.tsx:883 msgid "Order" -msgstr "" +msgstr "Παραγγελία" #: src/pages/part/PartDetail.tsx:1144 #: src/pages/stock/StockDetail.tsx:884 -#: src/tables/build/BuildLineTable.tsx:761 +#: src/tables/build/BuildLineTable.tsx:768 msgid "Order Stock" -msgstr "" +msgstr "Παραγγελία Αποθέματος" #: src/pages/part/PartDetail.tsx:1156 msgid "Search by serial number" -msgstr "" +msgstr "Αναζήτηση με σειριακό αριθμό" #: src/pages/part/PartDetail.tsx:1164 #: src/tables/part/PartTable.tsx:506 msgid "Part Actions" -msgstr "" +msgstr "Ενέργειες Προϊόντος" #: src/pages/part/PartIndex.tsx:29 #~ msgid "Categories" @@ -7801,41 +7811,41 @@ msgstr "" #: src/pages/part/PartPricingPanel.tsx:72 msgid "No pricing data found for this part." -msgstr "" +msgstr "Δεν βρέθηκαν δεδομένα τιμολόγησης για αυτό το Προϊόν." #: src/pages/part/PartPricingPanel.tsx:87 #: src/pages/part/pricing/PricingOverviewPanel.tsx:332 msgid "Pricing Overview" -msgstr "" +msgstr "Επισκόπηση Τιμολόγησης" #: src/pages/part/PartPricingPanel.tsx:93 msgid "Purchase History" -msgstr "" +msgstr "Ιστορικό Αγορών" #: src/pages/part/PartPricingPanel.tsx:107 #: src/pages/part/pricing/PricingOverviewPanel.tsx:211 msgid "Internal Pricing" -msgstr "" +msgstr "Εσωτερική Τιμολόγηση" #: src/pages/part/PartPricingPanel.tsx:122 #: src/pages/part/pricing/PricingOverviewPanel.tsx:221 msgid "BOM Pricing" -msgstr "" +msgstr "Τιμολόγηση BOM" #: src/pages/part/PartPricingPanel.tsx:129 #: src/pages/part/pricing/PricingOverviewPanel.tsx:249 msgid "Variant Pricing" -msgstr "" +msgstr "Τιμολόγηση Παραλλαγών" #: src/pages/part/PartPricingPanel.tsx:141 #: src/pages/part/pricing/PricingOverviewPanel.tsx:258 msgid "Sale Pricing" -msgstr "" +msgstr "Τιμολόγηση Πώλησης" #: src/pages/part/PartPricingPanel.tsx:147 #: src/pages/part/pricing/PricingOverviewPanel.tsx:267 msgid "Sale History" -msgstr "" +msgstr "Ιστορικό Πωλήσεων" #: src/pages/part/PartSchedulingDetail.tsx:51 #: src/pages/part/PartSchedulingDetail.tsx:291 @@ -7872,28 +7882,28 @@ msgstr "" #: src/pages/part/PartStockHistoryDetail.tsx:80 msgid "Edit Stocktake Entry" -msgstr "" +msgstr "Επεξεργασία Καταχώρησης Απογραφής" #: src/pages/part/PartStockHistoryDetail.tsx:88 msgid "Delete Stocktake Entry" -msgstr "" +msgstr "Διαγραφή Καταχώρησης Απογραφής" #: src/pages/part/PartStockHistoryDetail.tsx:107 #: src/pages/part/PartStockHistoryDetail.tsx:211 #: src/pages/stock/StockDetail.tsx:402 #: src/tables/stock/StockItemTable.tsx:271 msgid "Stock Value" -msgstr "" +msgstr "Αξία Αποθέματος" #: src/pages/part/PartStockHistoryDetail.tsx:240 #: src/pages/part/pricing/PricingOverviewPanel.tsx:334 msgid "Minimum Value" -msgstr "" +msgstr "Ελάχιστη Αξία" #: src/pages/part/PartStockHistoryDetail.tsx:246 #: src/pages/part/pricing/PricingOverviewPanel.tsx:335 msgid "Maximum Value" -msgstr "" +msgstr "Μέγιστη Αξία" #: src/pages/part/PartStocktakeDetail.tsx:99 #: src/tables/settings/StocktakeReportTable.tsx:70 @@ -7921,26 +7931,26 @@ msgstr "" #: src/tables/sales/SalesOrderLineItemTable.tsx:124 #: src/tables/sales/SalesOrderTable.tsx:175 msgid "Total Price" -msgstr "" +msgstr "Συνολική Τιμή" #: src/pages/part/pricing/BomPricingPanel.tsx:78 #: src/pages/part/pricing/BomPricingPanel.tsx:102 #: src/tables/bom/UsedInTable.tsx:54 #: src/tables/part/PartTable.tsx:227 msgid "Component" -msgstr "" +msgstr "Συστατικό" #: src/pages/part/pricing/BomPricingPanel.tsx:81 #: src/pages/part/pricing/VariantPricingPanel.tsx:35 #: src/pages/part/pricing/VariantPricingPanel.tsx:97 msgid "Minimum Price" -msgstr "" +msgstr "Ελάχιστη Τιμή" #: src/pages/part/pricing/BomPricingPanel.tsx:82 #: src/pages/part/pricing/VariantPricingPanel.tsx:43 #: src/pages/part/pricing/VariantPricingPanel.tsx:98 msgid "Maximum Price" -msgstr "" +msgstr "Μέγιστη Τιμή" #: src/pages/part/pricing/BomPricingPanel.tsx:112 #~ msgid "Minimum Total Price" @@ -7962,131 +7972,131 @@ msgstr "" #: src/tables/purchasing/SupplierPriceBreakTable.tsx:84 #: src/tables/stock/StockItemTable.tsx:259 msgid "Unit Price" -msgstr "" +msgstr "Τιμή Μονάδας" #: src/pages/part/pricing/BomPricingPanel.tsx:217 msgid "Pie Chart" -msgstr "" +msgstr "Γράφημα Πίτας" #: src/pages/part/pricing/BomPricingPanel.tsx:218 msgid "Bar Chart" -msgstr "" +msgstr "Ραβδόγραμμα" #: src/pages/part/pricing/PriceBreakPanel.tsx:58 #: src/pages/part/pricing/PriceBreakPanel.tsx:111 #: src/tables/purchasing/SupplierPriceBreakTable.tsx:134 #: src/tables/purchasing/SupplierPriceBreakTable.tsx:162 msgid "Add Price Break" -msgstr "" +msgstr "Προσθήκη Κλίμακας Τιμής" #: src/pages/part/pricing/PriceBreakPanel.tsx:71 #: src/tables/purchasing/SupplierPriceBreakTable.tsx:146 msgid "Edit Price Break" -msgstr "" +msgstr "Επεξεργασία Κλίμακας Τιμής" #: src/pages/part/pricing/PriceBreakPanel.tsx:81 #: src/tables/purchasing/SupplierPriceBreakTable.tsx:154 msgid "Delete Price Break" -msgstr "" +msgstr "Διαγραφή Κλίμακας Τιμής" #: src/pages/part/pricing/PriceBreakPanel.tsx:95 msgid "Price Break" -msgstr "" +msgstr "Κλίμακα Τιμής" #: src/pages/part/pricing/PriceBreakPanel.tsx:171 msgid "Price" -msgstr "" +msgstr "Τιμή" #: src/pages/part/pricing/PricingOverviewPanel.tsx:74 msgid "Refreshing pricing data" -msgstr "" +msgstr "Ανανέωση δεδομένων τιμολόγησης" #: src/pages/part/pricing/PricingOverviewPanel.tsx:94 msgid "Pricing data updated" -msgstr "" +msgstr "Τα δεδομένα τιμολόγησης ενημερώθηκαν" #: src/pages/part/pricing/PricingOverviewPanel.tsx:101 msgid "Failed to update pricing data" -msgstr "" +msgstr "Αποτυχία ενημέρωσης δεδομένων τιμολόγησης" #: src/pages/part/pricing/PricingOverviewPanel.tsx:129 msgid "Edit Pricing" -msgstr "" +msgstr "Επεξεργασία Τιμολόγησης" #: src/pages/part/pricing/PricingOverviewPanel.tsx:141 msgid "Pricing Category" -msgstr "" +msgstr "Κατηγορία Τιμολόγησης" #: src/pages/part/pricing/PricingOverviewPanel.tsx:160 msgid "Minimum" -msgstr "" +msgstr "Ελάχιστο" #: src/pages/part/pricing/PricingOverviewPanel.tsx:173 msgid "Maximum" -msgstr "" +msgstr "Μέγιστο" #: src/pages/part/pricing/PricingOverviewPanel.tsx:192 msgid "Override Pricing" -msgstr "" +msgstr "Παράκαμψη Τιμολόγησης" #: src/pages/part/pricing/PricingOverviewPanel.tsx:203 msgid "Overall Pricing" -msgstr "" +msgstr "Συνολική Τιμολόγηση" #: src/pages/part/pricing/PricingOverviewPanel.tsx:229 msgid "Purchase Pricing" -msgstr "" +msgstr "Τιμολόγηση Αγορών" #: src/pages/part/pricing/PricingOverviewPanel.tsx:288 #: src/pages/stock/StockDetail.tsx:426 #: src/tables/part/PartParameterTable.tsx:121 #: src/tables/stock/StockItemTable.tsx:300 msgid "Last Updated" -msgstr "" +msgstr "Τελευταία Ενημέρωση" #: src/pages/part/pricing/PricingOverviewPanel.tsx:292 msgid "Pricing Not Set" -msgstr "" +msgstr "Η Τιμολόγηση Δεν Έχει Οριστεί" #: src/pages/part/pricing/PricingOverviewPanel.tsx:293 msgid "Pricing data has not been calculated for this part" -msgstr "" +msgstr "Τα δεδομένα τιμολόγησης δεν έχουν υπολογιστεί για αυτό το Προϊόν" #: src/pages/part/pricing/PricingOverviewPanel.tsx:297 msgid "Pricing Actions" -msgstr "" +msgstr "Ενέργειες Τιμολόγησης" #: src/pages/part/pricing/PricingOverviewPanel.tsx:300 msgid "Refresh" -msgstr "" +msgstr "Ανανέωση" #: src/pages/part/pricing/PricingOverviewPanel.tsx:301 msgid "Refresh pricing data" -msgstr "" +msgstr "Ανανέωση δεδομένων τιμολόγησης" #: src/pages/part/pricing/PricingOverviewPanel.tsx:316 msgid "Edit pricing data" -msgstr "" +msgstr "Επεξεργασία δεδομένων τιμολόγησης" #: src/pages/part/pricing/PricingPanel.tsx:24 msgid "No data available" -msgstr "" +msgstr "Δεν υπάρχουν διαθέσιμα δεδομένα" #: src/pages/part/pricing/PricingPanel.tsx:65 msgid "No Data" -msgstr "" +msgstr "Χωρίς Δεδομένα" #: src/pages/part/pricing/PricingPanel.tsx:66 msgid "No pricing data available" -msgstr "" +msgstr "Δεν υπάρχουν διαθέσιμα δεδομένα τιμολόγησης" #: src/pages/part/pricing/PricingPanel.tsx:77 msgid "Loading pricing data" -msgstr "" +msgstr "Φόρτωση δεδομένων τιμολόγησης" #: src/pages/part/pricing/PurchaseHistoryPanel.tsx:48 msgid "Purchase Price" -msgstr "" +msgstr "Τιμή Αγοράς" #: src/pages/part/pricing/SaleHistoryPanel.tsx:24 #~ msgid "Sale Order" @@ -8095,31 +8105,31 @@ msgstr "" #: src/pages/part/pricing/SaleHistoryPanel.tsx:44 #: src/pages/part/pricing/SaleHistoryPanel.tsx:87 msgid "Sale Price" -msgstr "" +msgstr "Τιμή Πώλησης" #: src/pages/part/pricing/SupplierPricingPanel.tsx:69 #: src/tables/purchasing/SupplierPriceBreakTable.tsx:75 msgid "Supplier Price" -msgstr "" +msgstr "Τιμή Προμηθευτή" #: src/pages/part/pricing/VariantPricingPanel.tsx:29 #: src/pages/part/pricing/VariantPricingPanel.tsx:94 msgid "Variant Part" -msgstr "" +msgstr "Παραλλαγή Προϊόντος" #: src/pages/purchasing/PurchaseOrderDetail.tsx:89 msgid "Edit Purchase Order" -msgstr "" +msgstr "Επεξεργασία Εντολής Αγοράς" #: src/pages/purchasing/PurchaseOrderDetail.tsx:125 #: src/tables/purchasing/PurchaseOrderTable.tsx:154 #: src/tables/purchasing/PurchaseOrderTable.tsx:167 msgid "Add Purchase Order" -msgstr "" +msgstr "Προσθήκη Εντολής Αγοράς" #: src/pages/purchasing/PurchaseOrderDetail.tsx:147 msgid "Supplier Reference" -msgstr "" +msgstr "Αναφορά Προμηθευτή" #: src/pages/purchasing/PurchaseOrderDetail.tsx:159 #: src/pages/sales/ReturnOrderDetail.tsx:126 @@ -8131,18 +8141,18 @@ msgstr "" #: src/pages/sales/ReturnOrderDetail.tsx:160 #: src/pages/sales/SalesOrderDetail.tsx:144 msgid "Completed Line Items" -msgstr "" +msgstr "Ολοκληρωμένες Γραμμές Είδους" #: src/pages/purchasing/PurchaseOrderDetail.tsx:196 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:272 msgid "Destination" -msgstr "" +msgstr "Προορισμός" #: src/pages/purchasing/PurchaseOrderDetail.tsx:202 #: src/pages/sales/ReturnOrderDetail.tsx:167 #: src/pages/sales/SalesOrderDetail.tsx:161 msgid "Order Currency" -msgstr "" +msgstr "Νόμισμα Παραγγελίας" #: src/pages/purchasing/PurchaseOrderDetail.tsx:207 #: src/pages/sales/ReturnOrderDetail.tsx:183 @@ -8154,25 +8164,25 @@ msgstr "" #: src/pages/sales/ReturnOrderDetail.tsx:174 #: src/pages/sales/SalesOrderDetail.tsx:167 msgid "Total Cost" -msgstr "" +msgstr "Συνολικό Κόστος" #: src/pages/purchasing/PurchaseOrderDetail.tsx:237 #: src/pages/sales/ReturnOrderDetail.tsx:215 #: src/pages/sales/SalesOrderDetail.tsx:208 msgid "Contact Email" -msgstr "" +msgstr "Email Επικοινωνίας" #: src/pages/purchasing/PurchaseOrderDetail.tsx:245 #: src/pages/sales/ReturnOrderDetail.tsx:223 #: src/pages/sales/SalesOrderDetail.tsx:216 msgid "Contact Phone" -msgstr "" +msgstr "Τηλέφωνο Επικοινωνίας" #: src/pages/purchasing/PurchaseOrderDetail.tsx:278 #: src/pages/sales/ReturnOrderDetail.tsx:257 #: src/pages/sales/SalesOrderDetail.tsx:249 msgid "Issue Date" -msgstr "" +msgstr "Ημερομηνία Έκδοσης" #: src/pages/purchasing/PurchaseOrderDetail.tsx:303 #: src/pages/sales/ReturnOrderDetail.tsx:281 @@ -8181,13 +8191,13 @@ msgstr "" #: src/tables/build/BuildOrderTable.tsx:137 #: src/tables/part/PartPurchaseOrdersTable.tsx:106 msgid "Completion Date" -msgstr "" +msgstr "Ημερομηνία Ολοκλήρωσης" #: src/pages/purchasing/PurchaseOrderDetail.tsx:333 #: src/pages/sales/ReturnOrderDetail.tsx:311 #: src/pages/sales/SalesOrderDetail.tsx:349 msgid "Order Details" -msgstr "" +msgstr "Λεπτομέρειες Παραγγελίας" #: src/pages/purchasing/PurchaseOrderDetail.tsx:339 #: src/pages/purchasing/PurchaseOrderDetail.tsx:348 @@ -8197,52 +8207,52 @@ msgstr "" #: src/pages/sales/SalesOrderDetail.tsx:355 #: src/pages/sales/SalesOrderDetail.tsx:364 msgid "Line Items" -msgstr "" +msgstr "Γραμμές Ειδών" #: src/pages/purchasing/PurchaseOrderDetail.tsx:363 #: src/pages/sales/ReturnOrderDetail.tsx:341 #: src/pages/sales/SalesOrderDetail.tsx:378 msgid "Extra Line Items" -msgstr "" +msgstr "Επιπλέον Γραμμές Ειδών" #: src/pages/purchasing/PurchaseOrderDetail.tsx:405 msgid "Issue Purchase Order" -msgstr "" +msgstr "Έκδοση Εντολής Αγοράς" #: src/pages/purchasing/PurchaseOrderDetail.tsx:413 msgid "Cancel Purchase Order" -msgstr "" +msgstr "Ακύρωση Εντολής Αγοράς" #: src/pages/purchasing/PurchaseOrderDetail.tsx:421 msgid "Hold Purchase Order" -msgstr "" +msgstr "Παύση Εντολής Αγοράς" #: src/pages/purchasing/PurchaseOrderDetail.tsx:429 msgid "Complete Purchase Order" -msgstr "" +msgstr "Ολοκλήρωση Εντολής Αγοράς" #: src/pages/purchasing/PurchaseOrderDetail.tsx:485 #: src/pages/sales/ReturnOrderDetail.tsx:496 #: src/pages/sales/SalesOrderDetail.tsx:549 msgid "Order Actions" -msgstr "" +msgstr "Ενέργειες Παραγγελίας" #: src/pages/sales/ReturnOrderDetail.tsx:114 #: src/pages/sales/SalesOrderDetail.tsx:104 #: src/pages/sales/SalesOrderShipmentDetail.tsx:134 #: src/tables/sales/SalesOrderTable.tsx:141 msgid "Customer Reference" -msgstr "" +msgstr "Αναφορά Πελάτη" #: src/pages/sales/ReturnOrderDetail.tsx:195 msgid "Return Address" -msgstr "" +msgstr "Διεύθυνση Επιστροφής" #: src/pages/sales/ReturnOrderDetail.tsx:201 #: src/pages/sales/SalesOrderDetail.tsx:194 #: src/pages/sales/SalesOrderShipmentDetail.tsx:181 msgid "Not specified" -msgstr "" +msgstr "Δεν έχει καθοριστεί" #: src/pages/sales/ReturnOrderDetail.tsx:349 #~ msgid "Order canceled" @@ -8250,117 +8260,117 @@ msgstr "" #: src/pages/sales/ReturnOrderDetail.tsx:389 msgid "Edit Return Order" -msgstr "" +msgstr "Επεξεργασία Εντολής Επιστροφής" #: src/pages/sales/ReturnOrderDetail.tsx:407 #: src/tables/sales/ReturnOrderTable.tsx:154 #: src/tables/sales/ReturnOrderTable.tsx:167 msgid "Add Return Order" -msgstr "" +msgstr "Προσθήκη Εντολής Επιστροφής" #: src/pages/sales/ReturnOrderDetail.tsx:416 msgid "Issue Return Order" -msgstr "" +msgstr "Έκδοση Εντολής Επιστροφής" #: src/pages/sales/ReturnOrderDetail.tsx:424 msgid "Cancel Return Order" -msgstr "" +msgstr "Ακύρωση Εντολής Επιστροφής" #: src/pages/sales/ReturnOrderDetail.tsx:432 msgid "Hold Return Order" -msgstr "" +msgstr "Παύση Εντολής Επιστροφής" #: src/pages/sales/ReturnOrderDetail.tsx:440 msgid "Complete Return Order" -msgstr "" +msgstr "Ολοκλήρωση Εντολής Επιστροφής" #: src/pages/sales/SalesOrderDetail.tsx:153 msgid "Completed Shipments" -msgstr "" +msgstr "Ολοκληρωμένες Αποστολές" #: src/pages/sales/SalesOrderDetail.tsx:188 #: src/pages/sales/SalesOrderShipmentDetail.tsx:170 msgid "Shipping Address" -msgstr "" +msgstr "Διεύθυνση Αποστολής" #: src/pages/sales/SalesOrderDetail.tsx:316 msgid "Edit Sales Order" -msgstr "" +msgstr "Επεξεργασία Εντολής Πώλησης" #: src/pages/sales/SalesOrderDetail.tsx:338 #: src/tables/sales/SalesOrderTable.tsx:108 #: src/tables/sales/SalesOrderTable.tsx:121 msgid "Add Sales Order" -msgstr "" +msgstr "Προσθήκη Εντολής Πώλησης" #: src/pages/sales/SalesOrderDetail.tsx:396 #: src/tables/sales/SalesOrderTable.tsx:147 msgid "Shipments" -msgstr "" +msgstr "Αποστολές" #: src/pages/sales/SalesOrderDetail.tsx:443 msgid "Issue Sales Order" -msgstr "" +msgstr "Έκδοση Εντολής Πώλησης" #: src/pages/sales/SalesOrderDetail.tsx:451 msgid "Cancel Sales Order" -msgstr "" +msgstr "Ακύρωση Εντολής Πώλησης" #: src/pages/sales/SalesOrderDetail.tsx:459 msgid "Hold Sales Order" -msgstr "" +msgstr "Παύση Εντολής Πώλησης" #: src/pages/sales/SalesOrderDetail.tsx:467 msgid "Ship Sales Order" -msgstr "" +msgstr "Αποστολή Εντολής Πώλησης" #: src/pages/sales/SalesOrderDetail.tsx:469 msgid "Ship this order?" -msgstr "" +msgstr "Αποστολή αυτής της παραγγελίας;" #: src/pages/sales/SalesOrderDetail.tsx:470 msgid "Order shipped" -msgstr "" +msgstr "Η παραγγελία αποστάλθηκε" #: src/pages/sales/SalesOrderDetail.tsx:478 msgid "Complete Sales Order" -msgstr "" +msgstr "Ολοκλήρωση Εντολής Πώλησης" #: src/pages/sales/SalesOrderDetail.tsx:523 msgid "Ship Order" -msgstr "" +msgstr "Αποστολή Παραγγελίας" #: src/pages/sales/SalesOrderShipmentDetail.tsx:142 #: src/tables/sales/SalesOrderShipmentTable.tsx:135 msgid "Shipment Reference" -msgstr "" +msgstr "Αναφορά Αποστολής" #: src/pages/sales/SalesOrderShipmentDetail.tsx:148 msgid "Tracking Number" -msgstr "" +msgstr "Αριθμός Παρακολούθησης" #: src/pages/sales/SalesOrderShipmentDetail.tsx:156 msgid "Invoice Number" -msgstr "" +msgstr "Αριθμός Τιμολογίου" #: src/pages/sales/SalesOrderShipmentDetail.tsx:191 msgid "Allocated Items" -msgstr "" +msgstr "Δεσμευμένα Είδη" #: src/pages/sales/SalesOrderShipmentDetail.tsx:196 msgid "Checked By" -msgstr "" +msgstr "Ελέγχθηκε Από" #: src/pages/sales/SalesOrderShipmentDetail.tsx:202 msgid "Not checked" -msgstr "" +msgstr "Δεν ελέγχθηκε" #: src/pages/sales/SalesOrderShipmentDetail.tsx:208 #: src/tables/ColumnRenderers.tsx:518 #: src/tables/sales/SalesOrderAllocationTable.tsx:182 #: src/tables/sales/SalesOrderShipmentTable.tsx:168 msgid "Shipment Date" -msgstr "" +msgstr "Ημερομηνία Αποστολής" #: src/pages/sales/SalesOrderShipmentDetail.tsx:211 #~ msgid "Assigned Items" @@ -8369,156 +8379,156 @@ msgstr "" #: src/pages/sales/SalesOrderShipmentDetail.tsx:216 #: src/tables/sales/SalesOrderShipmentTable.tsx:172 msgid "Delivery Date" -msgstr "" +msgstr "Ημερομηνία Παράδοσης" #: src/pages/sales/SalesOrderShipmentDetail.tsx:255 msgid "Shipment Details" -msgstr "" +msgstr "Λεπτομέρειες Αποστολής" #: src/pages/sales/SalesOrderShipmentDetail.tsx:294 #: src/pages/sales/SalesOrderShipmentDetail.tsx:438 #: src/tables/sales/SalesOrderShipmentTable.tsx:90 msgid "Edit Shipment" -msgstr "" +msgstr "Επεξεργασία Αποστολής" #: src/pages/sales/SalesOrderShipmentDetail.tsx:301 #: src/pages/sales/SalesOrderShipmentDetail.tsx:457 #: src/tables/sales/SalesOrderShipmentTable.tsx:82 msgid "Cancel Shipment" -msgstr "" +msgstr "Ακύρωση Αποστολής" #: src/pages/sales/SalesOrderShipmentDetail.tsx:314 #: src/tables/sales/SalesOrderShipmentTable.tsx:98 #: src/tables/sales/SalesOrderShipmentTable.tsx:193 msgid "Complete Shipment" -msgstr "" +msgstr "Ολοκλήρωση Αποστολής" #: src/pages/sales/SalesOrderShipmentDetail.tsx:326 #: src/pages/sales/SalesOrderShipmentDetail.tsx:328 msgid "Check Shipment" -msgstr "" +msgstr "Έλεγχος Αποστολής" #: src/pages/sales/SalesOrderShipmentDetail.tsx:329 msgid "Marking the shipment as checked indicates that you have verified that all items included in this shipment are correct" -msgstr "" +msgstr "Η σήμανση της αποστολής ως ελεγμένη δηλώνει ότι έχετε επαληθεύσει πως όλα τα είδη στην αποστολή είναι σωστά" #: src/pages/sales/SalesOrderShipmentDetail.tsx:339 msgid "Shipment marked as checked" -msgstr "" +msgstr "Η αποστολή σημειώθηκε ως ελεγμένη" #: src/pages/sales/SalesOrderShipmentDetail.tsx:346 #: src/pages/sales/SalesOrderShipmentDetail.tsx:348 msgid "Uncheck Shipment" -msgstr "" +msgstr "Αναίρεση Ελέγχου Αποστολής" #: src/pages/sales/SalesOrderShipmentDetail.tsx:349 msgid "Marking the shipment as unchecked indicates that the shipment requires further verification" -msgstr "" +msgstr "Η σήμανση της αποστολής ως μη ελεγμένη δηλώνει ότι απαιτείται επιπλέον έλεγχος" #: src/pages/sales/SalesOrderShipmentDetail.tsx:359 msgid "Shipment marked as unchecked" -msgstr "" +msgstr "Η αποστολή σημειώθηκε ως μη ελεγμένη" #: src/pages/sales/SalesOrderShipmentDetail.tsx:371 #: src/tables/part/PartPurchaseOrdersTable.tsx:122 msgid "Pending" -msgstr "" +msgstr "Σε εκκρεμότητα" #: src/pages/sales/SalesOrderShipmentDetail.tsx:377 #: src/tables/sales/SalesOrderShipmentTable.tsx:147 #: src/tables/sales/SalesOrderShipmentTable.tsx:254 msgid "Checked" -msgstr "" +msgstr "Ελεγμένο" #: src/pages/sales/SalesOrderShipmentDetail.tsx:383 msgid "Not Checked" -msgstr "" +msgstr "Μη Ελεγμένο" #: src/pages/sales/SalesOrderShipmentDetail.tsx:389 #: src/tables/sales/SalesOrderShipmentTable.tsx:154 #: src/tables/sales/SalesOrderShipmentTable.tsx:259 msgid "Shipped" -msgstr "" +msgstr "Απεσταλμένο" #: src/pages/sales/SalesOrderShipmentDetail.tsx:395 #: src/tables/sales/SalesOrderShipmentTable.tsx:161 #: src/tables/sales/SalesOrderShipmentTable.tsx:264 #: src/tables/settings/EmailTable.tsx:31 msgid "Delivered" -msgstr "" +msgstr "Παραδόθηκε" #: src/pages/sales/SalesOrderShipmentDetail.tsx:410 msgid "Send Shipment" -msgstr "" +msgstr "Αποστολή Δέματος" #: src/pages/sales/SalesOrderShipmentDetail.tsx:433 msgid "Shipment Actions" -msgstr "" +msgstr "Ενέργειες Αποστολής" #: src/pages/sales/SalesOrderShipmentDetail.tsx:442 msgid "Check" -msgstr "" +msgstr "Έλεγχος" #: src/pages/sales/SalesOrderShipmentDetail.tsx:443 msgid "Mark shipment as checked" -msgstr "" +msgstr "Σήμανση αποστολής ως ελεγμένη" #: src/pages/sales/SalesOrderShipmentDetail.tsx:449 msgid "Uncheck" -msgstr "" +msgstr "Αναίρεση Ελέγχου" #: src/pages/sales/SalesOrderShipmentDetail.tsx:450 msgid "Mark shipment as unchecked" -msgstr "" +msgstr "Σήμανση αποστολής ως μη ελεγμένη" #: src/pages/stock/LocationDetail.tsx:110 msgid "Parent Location" -msgstr "" +msgstr "Μητρική Τοποθεσία" #: src/pages/stock/LocationDetail.tsx:128 #: src/pages/stock/LocationDetail.tsx:174 msgid "Sublocations" -msgstr "" +msgstr "Υποτοποθεσίες" #: src/pages/stock/LocationDetail.tsx:146 #: src/tables/stock/StockLocationTable.tsx:57 msgid "Location Type" -msgstr "" +msgstr "Τύπος Τοποθεσίας" #: src/pages/stock/LocationDetail.tsx:157 msgid "Top level stock location" -msgstr "" +msgstr "Κορυφαία τοποθεσία αποθέματος" #: src/pages/stock/LocationDetail.tsx:168 msgid "Location Details" -msgstr "" +msgstr "Λεπτομέρειες Τοποθεσίας" #: src/pages/stock/LocationDetail.tsx:194 msgid "Default Parts" -msgstr "" +msgstr "Προεπιλεγμένα Προϊόντα" #: src/pages/stock/LocationDetail.tsx:213 #: src/pages/stock/LocationDetail.tsx:374 #: src/tables/stock/StockLocationTable.tsx:121 msgid "Edit Stock Location" -msgstr "" +msgstr "Επεξεργασία Τοποθεσίας Αποθέματος" #: src/pages/stock/LocationDetail.tsx:222 msgid "Move items to parent location" -msgstr "" +msgstr "Μετακίνηση ειδών στη μητρική τοποθεσία" #: src/pages/stock/LocationDetail.tsx:234 #: src/pages/stock/LocationDetail.tsx:379 msgid "Delete Stock Location" -msgstr "" +msgstr "Διαγραφή Τοποθεσίας Αποθέματος" #: src/pages/stock/LocationDetail.tsx:237 msgid "Items Action" -msgstr "" +msgstr "Ενέργεια για Είδη" #: src/pages/stock/LocationDetail.tsx:239 msgid "Action for stock items in this location" -msgstr "" +msgstr "Ενέργεια για τα είδη αποθέματος σε αυτή την τοποθεσία" #: src/pages/stock/LocationDetail.tsx:243 #~ msgid "Child Locations Action" @@ -8526,46 +8536,46 @@ msgstr "" #: src/pages/stock/LocationDetail.tsx:244 msgid "Locations Action" -msgstr "" +msgstr "Ενέργεια Τοποθεσιών" #: src/pages/stock/LocationDetail.tsx:246 msgid "Action for child locations in this location" -msgstr "" +msgstr "Ενέργεια για τις θυγατρικές τοποθεσίες σε αυτή την τοποθεσία" #: src/pages/stock/LocationDetail.tsx:280 msgid "Scan Stock Item" -msgstr "" +msgstr "Σάρωση Είδους Αποθέματος" #: src/pages/stock/LocationDetail.tsx:298 #: src/pages/stock/StockDetail.tsx:812 msgid "Scanned stock item into location" -msgstr "" +msgstr "Το είδος αποθέματος σαρώθηκε στην τοποθεσία" #: src/pages/stock/LocationDetail.tsx:304 #: src/pages/stock/StockDetail.tsx:818 msgid "Error scanning stock item" -msgstr "" +msgstr "Σφάλμα κατά τη σάρωση είδους αποθέματος" #: src/pages/stock/LocationDetail.tsx:311 msgid "Scan Stock Location" -msgstr "" +msgstr "Σάρωση Τοποθεσίας Αποθέματος" #: src/pages/stock/LocationDetail.tsx:323 msgid "Scanned stock location into location" -msgstr "" +msgstr "Η τοποθεσία αποθέματος σαρώθηκε επιτυχώς" #: src/pages/stock/LocationDetail.tsx:329 msgid "Error scanning stock location" -msgstr "" +msgstr "Σφάλμα κατά τη σάρωση τοποθεσίας αποθέματος" #: src/pages/stock/LocationDetail.tsx:370 #: src/tables/stock/StockLocationTable.tsx:142 msgid "Location Actions" -msgstr "" +msgstr "Ενέργειες Τοποθεσίας" #: src/pages/stock/StockDetail.tsx:147 msgid "Base Part" -msgstr "" +msgstr "Βασικό Προϊόν" #: src/pages/stock/StockDetail.tsx:155 #~ msgid "Link custom barcode to stock item" @@ -8585,7 +8595,7 @@ msgstr "" #: src/pages/stock/StockDetail.tsx:206 msgid "Previous serial number" -msgstr "" +msgstr "Προηγούμενος σειριακός αριθμός" #: src/pages/stock/StockDetail.tsx:217 #~ msgid "Delete stock item" @@ -8593,35 +8603,35 @@ msgstr "" #: src/pages/stock/StockDetail.tsx:228 msgid "Find serial number" -msgstr "" +msgstr "Εύρεση σειριακού αριθμού" #: src/pages/stock/StockDetail.tsx:234 msgid "Next serial number" -msgstr "" +msgstr "Επόμενος σειριακός αριθμός" #: src/pages/stock/StockDetail.tsx:272 msgid "Allocated to Orders" -msgstr "" +msgstr "Δεσμευμένο για Παραγγελίες" #: src/pages/stock/StockDetail.tsx:305 msgid "Installed In" -msgstr "" +msgstr "Εγκατεστημένο Σε" #: src/pages/stock/StockDetail.tsx:325 msgid "Parent Item" -msgstr "" +msgstr "Μητρικό Είδος" #: src/pages/stock/StockDetail.tsx:329 msgid "Parent stock item" -msgstr "" +msgstr "Μητρικό είδος αποθέματος" #: src/pages/stock/StockDetail.tsx:335 msgid "Consumed By" -msgstr "" +msgstr "Καταναλώθηκε Από" #: src/pages/stock/StockDetail.tsx:432 msgid "Last Stocktake" -msgstr "" +msgstr "Τελευταία Απογραφή" #: src/pages/stock/StockDetail.tsx:433 #~ msgid "Duplicate stock item" @@ -8629,11 +8639,11 @@ msgstr "" #: src/pages/stock/StockDetail.tsx:526 msgid "Stock Details" -msgstr "" +msgstr "Λεπτομέρειες Αποθέματος" #: src/pages/stock/StockDetail.tsx:532 msgid "Stock Tracking" -msgstr "" +msgstr "Παρακολούθηση Αποθέματος" #: src/pages/stock/StockDetail.tsx:571 #~ msgid "Test Data" @@ -8641,15 +8651,15 @@ msgstr "" #: src/pages/stock/StockDetail.tsx:601 msgid "Installed Items" -msgstr "" +msgstr "Εγκατεστημένα Είδη" #: src/pages/stock/StockDetail.tsx:608 msgid "Child Items" -msgstr "" +msgstr "Θυγατρικά Είδη" #: src/pages/stock/StockDetail.tsx:661 msgid "Edit Stock Item" -msgstr "" +msgstr "Επεξεργασία Είδους Αποθέματος" #: src/pages/stock/StockDetail.tsx:671 #: src/tables/stock/StockItemTable.tsx:452 @@ -8668,15 +8678,15 @@ msgstr "" #: src/pages/stock/StockDetail.tsx:703 msgid "Items Created" -msgstr "" +msgstr "Δημιουργήθηκαν Είδη" #: src/pages/stock/StockDetail.tsx:704 msgid "Created {n} stock items" -msgstr "" +msgstr "Δημιουργήθηκαν {n} είδη αποθέματος" #: src/pages/stock/StockDetail.tsx:721 msgid "Delete Stock Item" -msgstr "" +msgstr "Διαγραφή Είδους Αποθέματος" #: src/pages/stock/StockDetail.tsx:762 #~ msgid "Return Stock Item" @@ -8688,7 +8698,7 @@ msgstr "" #: src/pages/stock/StockDetail.tsx:770 msgid "Serialize Stock Item" -msgstr "" +msgstr "Μετατροπή σε Σειριακό Είδος" #: src/pages/stock/StockDetail.tsx:777 #~ msgid "Item returned to stock" @@ -8697,23 +8707,23 @@ msgstr "" #: src/pages/stock/StockDetail.tsx:786 #: src/tables/stock/StockItemTable.tsx:539 msgid "Stock item serialized" -msgstr "" +msgstr "Το είδος αποθέματος σειριοποιήθηκε" #: src/pages/stock/StockDetail.tsx:794 msgid "Scan Into Location" -msgstr "" +msgstr "Σάρωση στην Τοποθεσία" #: src/pages/stock/StockDetail.tsx:852 msgid "Scan into location" -msgstr "" +msgstr "Σάρωση στην τοποθεσία" #: src/pages/stock/StockDetail.tsx:854 msgid "Scan this item into a location" -msgstr "" +msgstr "Σάρωση του είδους σε μια τοποθεσία" #: src/pages/stock/StockDetail.tsx:866 msgid "Stock Operations" -msgstr "" +msgstr "Λειτουργίες Αποθέματος" #: src/pages/stock/StockDetail.tsx:868 #~ msgid "Count stock" @@ -8722,11 +8732,11 @@ msgstr "" #: src/pages/stock/StockDetail.tsx:871 #: src/tables/build/BuildOutputTable.tsx:522 msgid "Serialize" -msgstr "" +msgstr "Σειριοποίηση" #: src/pages/stock/StockDetail.tsx:872 msgid "Serialize stock" -msgstr "" +msgstr "Σειριοποίηση αποθέματος" #: src/pages/stock/StockDetail.tsx:890 #~ msgid "Return from customer" @@ -8734,7 +8744,7 @@ msgstr "" #: src/pages/stock/StockDetail.tsx:897 msgid "Stock Item Actions" -msgstr "" +msgstr "Ενέργειες Είδους Αποθέματος" #: src/pages/stock/StockDetail.tsx:900 #~ msgid "Transfer" @@ -8751,21 +8761,21 @@ msgstr "" #: src/pages/stock/StockDetail.tsx:966 #: src/tables/stock/StockItemTable.tsx:404 msgid "Stale" -msgstr "" +msgstr "Μπαγιάτικο / Παρωχημένο" #: src/pages/stock/StockDetail.tsx:972 #: src/tables/stock/StockItemTable.tsx:398 msgid "Expired" -msgstr "" +msgstr "Έχει λήξει" #: src/pages/stock/StockDetail.tsx:978 msgid "Unavailable" -msgstr "" +msgstr "Μη διαθέσιμο" #: src/states/IconState.tsx:47 #: src/states/IconState.tsx:77 msgid "Error loading icon package from server" -msgstr "" +msgstr "Σφάλμα φόρτωσης πακέτου εικονιδίων από τον διακομιστή" #: src/tables/ColumnRenderers.tsx:41 #~ msgid "Part is locked" @@ -8773,18 +8783,18 @@ msgstr "" #: src/tables/ColumnRenderers.tsx:68 msgid "Part is not active" -msgstr "Το εξάρτημα είναι ανενεργό" +msgstr "Το Προϊόν δεν είναι ενεργό" #: src/tables/ColumnRenderers.tsx:73 #: src/tables/bom/BomTable.tsx:657 #: src/tables/part/PartParameterTable.tsx:227 #: src/tables/part/PartTestTemplateTable.tsx:258 msgid "Part is Locked" -msgstr "" +msgstr "Το Προϊόν είναι Κλειδωμένο" #: src/tables/ColumnRenderers.tsx:78 msgid "You are subscribed to notifications for this part" -msgstr "" +msgstr "Είστε εγγεγραμμένος σε ειδοποιήσεις για αυτό το Προϊόν" #: src/tables/ColumnRenderers.tsx:93 #~ msgid "No location set" @@ -8793,7 +8803,7 @@ msgstr "" #: src/tables/ColumnSelect.tsx:16 #: src/tables/ColumnSelect.tsx:23 msgid "Select Columns" -msgstr "" +msgstr "Επιλογή Στηλών" #: src/tables/DownloadAction.tsx:13 #~ msgid "Excel" @@ -8825,27 +8835,27 @@ msgstr "" #: src/tables/Filter.tsx:75 msgid "Has Batch Code" -msgstr "" +msgstr "Έχει Κωδικό Παρτίδας" #: src/tables/Filter.tsx:76 msgid "Show items which have a batch code" -msgstr "" +msgstr "Εμφάνιση ειδών με κωδικό παρτίδας" #: src/tables/Filter.tsx:84 msgid "Filter items by batch code" -msgstr "" +msgstr "Φιλτράρισμα ειδών ανά κωδικό παρτίδας" #: src/tables/Filter.tsx:93 msgid "Show items which are in stock" -msgstr "" +msgstr "Εμφάνιση ειδών που είναι σε απόθεμα" #: src/tables/Filter.tsx:100 msgid "Is Serialized" -msgstr "" +msgstr "Είναι Σειριοποιημένο" #: src/tables/Filter.tsx:101 msgid "Show items which have a serial number" -msgstr "" +msgstr "Εμφάνιση ειδών με σειριακό αριθμό" #: src/tables/Filter.tsx:106 #~ msgid "Show overdue orders" @@ -8853,235 +8863,235 @@ msgstr "" #: src/tables/Filter.tsx:108 msgid "Serial" -msgstr "" +msgstr "Σειριακός" #: src/tables/Filter.tsx:109 msgid "Filter items by serial number" -msgstr "" +msgstr "Φιλτράρισμα ειδών ανά σειριακό αριθμό" #: src/tables/Filter.tsx:117 msgid "Serial Below" -msgstr "" +msgstr "Σειριακός Κάτω Από" #: src/tables/Filter.tsx:118 msgid "Show items with serial numbers less than or equal to a given value" -msgstr "" +msgstr "Εμφάνιση ειδών με σειριακό αριθμό μικρότερο ή ίσο από την τιμή" #: src/tables/Filter.tsx:126 msgid "Serial Above" -msgstr "" +msgstr "Σειριακός Πάνω Από" #: src/tables/Filter.tsx:127 msgid "Show items with serial numbers greater than or equal to a given value" -msgstr "" +msgstr "Εμφάνιση ειδών με σειριακό αριθμό μεγαλύτερο ή ίσο από την τιμή" #: src/tables/Filter.tsx:136 msgid "Assigned to me" -msgstr "" +msgstr "Ανατεθειμένα σε εμένα" #: src/tables/Filter.tsx:137 msgid "Show orders assigned to me" -msgstr "" +msgstr "Εμφάνιση παραγγελιών που έχουν ανατεθεί σε εμένα" #: src/tables/Filter.tsx:144 #: src/tables/sales/SalesOrderAllocationTable.tsx:88 msgid "Outstanding" -msgstr "" +msgstr "Εκκρεμή" #: src/tables/Filter.tsx:145 msgid "Show outstanding items" -msgstr "" +msgstr "Εμφάνιση εκκρεμών ειδών" #: src/tables/Filter.tsx:153 msgid "Show overdue items" -msgstr "" +msgstr "Εμφάνιση εκπρόθεσμων ειδών" #: src/tables/Filter.tsx:160 msgid "Minimum Date" -msgstr "" +msgstr "Ελάχιστη Ημερομηνία" #: src/tables/Filter.tsx:161 msgid "Show items after this date" -msgstr "" +msgstr "Εμφάνιση ειδών μετά από αυτή την ημερομηνία" #: src/tables/Filter.tsx:169 msgid "Maximum Date" -msgstr "" +msgstr "Μέγιστη Ημερομηνία" #: src/tables/Filter.tsx:170 msgid "Show items before this date" -msgstr "" +msgstr "Εμφάνιση ειδών πριν από αυτή την ημερομηνία" #: src/tables/Filter.tsx:178 msgid "Created Before" -msgstr "" +msgstr "Δημιουργήθηκε Πριν Από" #: src/tables/Filter.tsx:179 msgid "Show items created before this date" -msgstr "" +msgstr "Εμφάνιση ειδών που δημιουργήθηκαν πριν από αυτή την ημερομηνία" #: src/tables/Filter.tsx:187 msgid "Created After" -msgstr "" +msgstr "Δημιουργήθηκε Μετά Από" #: src/tables/Filter.tsx:188 msgid "Show items created after this date" -msgstr "" +msgstr "Εμφάνιση ειδών που δημιουργήθηκαν μετά από αυτή την ημερομηνία" #: src/tables/Filter.tsx:196 msgid "Start Date Before" -msgstr "" +msgstr "Ημερομηνία Έναρξης Πριν Από" #: src/tables/Filter.tsx:197 msgid "Show items with a start date before this date" -msgstr "" +msgstr "Εμφάνιση ειδών με ημερομηνία έναρξης πριν από αυτή την ημερομηνία" #: src/tables/Filter.tsx:205 msgid "Start Date After" -msgstr "" +msgstr "Ημερομηνία Έναρξης Μετά Από" #: src/tables/Filter.tsx:206 msgid "Show items with a start date after this date" -msgstr "" +msgstr "Εμφάνιση ειδών με ημερομηνία έναρξης μετά από αυτή την ημερομηνία" #: src/tables/Filter.tsx:214 msgid "Target Date Before" -msgstr "" +msgstr "Ημερομηνία-Στόχος Πριν Από" #: src/tables/Filter.tsx:215 msgid "Show items with a target date before this date" -msgstr "" +msgstr "Εμφάνιση ειδών με ημερομηνία-στόχο πριν από αυτή την ημερομηνία" #: src/tables/Filter.tsx:223 msgid "Target Date After" -msgstr "" +msgstr "Ημερομηνία-Στόχος Μετά Από" #: src/tables/Filter.tsx:224 msgid "Show items with a target date after this date" -msgstr "" +msgstr "Εμφάνιση ειδών με ημερομηνία-στόχο μετά από αυτή την ημερομηνία" #: src/tables/Filter.tsx:232 msgid "Completed Before" -msgstr "" +msgstr "Ολοκληρώθηκε Πριν Από" #: src/tables/Filter.tsx:233 msgid "Show items completed before this date" -msgstr "" +msgstr "Εμφάνιση ειδών που ολοκληρώθηκαν πριν από αυτή την ημερομηνία" #: src/tables/Filter.tsx:241 msgid "Completed After" -msgstr "" +msgstr "Ολοκληρώθηκε Μετά Από" #: src/tables/Filter.tsx:242 msgid "Show items completed after this date" -msgstr "" +msgstr "Εμφάνιση ειδών που ολοκληρώθηκαν μετά από αυτή την ημερομηνία" #: src/tables/Filter.tsx:254 msgid "Has Project Code" -msgstr "" +msgstr "Έχει Κωδικό Έργου" #: src/tables/Filter.tsx:255 msgid "Show orders with an assigned project code" -msgstr "" +msgstr "Εμφάνιση παραγγελιών με καταχωρημένο κωδικό έργου" #: src/tables/Filter.tsx:264 msgid "Include Variants" -msgstr "" +msgstr "Συμπερίληψη Παραλλαγών" #: src/tables/Filter.tsx:265 msgid "Include results for part variants" -msgstr "" +msgstr "Συμπερίληψη αποτελεσμάτων για παραλλαγές Προϊόντων" #: src/tables/Filter.tsx:275 #: src/tables/part/PartPurchaseOrdersTable.tsx:133 msgid "Filter by order status" -msgstr "" +msgstr "Φιλτράρισμα ανά κατάσταση παραγγελίας" #: src/tables/Filter.tsx:287 msgid "Filter by project code" -msgstr "" +msgstr "Φιλτράρισμα ανά κωδικό έργου" #: src/tables/Filter.tsx:320 msgid "Filter by responsible owner" -msgstr "" +msgstr "Φιλτράρισμα ανά υπεύθυνο ιδιοκτήτη" #: src/tables/Filter.tsx:336 #: src/tables/settings/ApiTokenTable.tsx:127 #: src/tables/stock/StockTrackingTable.tsx:191 msgid "Filter by user" -msgstr "" +msgstr "Φιλτράρισμα ανά χρήστη" #: src/tables/Filter.tsx:348 msgid "Filter by manufacturer" -msgstr "" +msgstr "Φιλτράρισμα ανά κατασκευαστή" #: src/tables/Filter.tsx:361 msgid "Filter by supplier" -msgstr "" +msgstr "Φιλτράρισμα ανά προμηθευτή" #: src/tables/Filter.tsx:374 msgid "Filter by user who created the order" -msgstr "" +msgstr "Φιλτράρισμα ανά χρήστη που δημιούργησε την παραγγελία" #: src/tables/Filter.tsx:382 msgid "Filter by user who issued the order" -msgstr "" +msgstr "Φιλτράρισμα ανά χρήστη που εξέδωσε την παραγγελία" #: src/tables/Filter.tsx:390 msgid "Filter by part category" -msgstr "" +msgstr "Φιλτράρισμα ανά κατηγορία Προϊόντος" #: src/tables/Filter.tsx:401 msgid "Filter by stock location" -msgstr "" +msgstr "Φιλτράρισμα ανά τοποθεσία αποθέματος" #: src/tables/FilterSelectDrawer.tsx:59 msgid "Remove filter" -msgstr "" +msgstr "Αφαίρεση φίλτρου" #: src/tables/FilterSelectDrawer.tsx:102 #: src/tables/FilterSelectDrawer.tsx:104 #: src/tables/FilterSelectDrawer.tsx:151 msgid "Select filter value" -msgstr "" +msgstr "Επιλογή τιμής φίλτρου" #: src/tables/FilterSelectDrawer.tsx:116 msgid "Enter filter value" -msgstr "" +msgstr "Εισαγωγή τιμής φίλτρου" #: src/tables/FilterSelectDrawer.tsx:138 msgid "Select date value" -msgstr "" +msgstr "Επιλογή ημερομηνίας" #: src/tables/FilterSelectDrawer.tsx:260 msgid "Select filter" -msgstr "" +msgstr "Επιλογή φίλτρου" #: src/tables/FilterSelectDrawer.tsx:261 msgid "Filter" -msgstr "" +msgstr "Φίλτρο" #: src/tables/FilterSelectDrawer.tsx:313 #: src/tables/InvenTreeTableHeader.tsx:260 msgid "Table Filters" -msgstr "" +msgstr "Φίλτρα Πίνακα" #: src/tables/FilterSelectDrawer.tsx:346 msgid "Add Filter" -msgstr "" +msgstr "Προσθήκη Φίλτρου" #: src/tables/FilterSelectDrawer.tsx:355 msgid "Clear Filters" -msgstr "" +msgstr "Καθαρισμός Φίλτρων" #: src/tables/InvenTreeTable.tsx:45 #: src/tables/InvenTreeTable.tsx:488 msgid "No records found" -msgstr "" +msgstr "Δεν βρέθηκαν εγγραφές" #: src/tables/InvenTreeTable.tsx:152 msgid "Error loading table options" -msgstr "" +msgstr "Σφάλμα φόρτωσης επιλογών πίνακα" #: src/tables/InvenTreeTable.tsx:250 #~ msgid "Failed to load table options" @@ -9093,7 +9103,7 @@ msgstr "" #: src/tables/InvenTreeTable.tsx:529 msgid "Server returned incorrect data type" -msgstr "" +msgstr "Ο διακομιστής επέστρεψε λανθασμένο τύπο δεδομένων" #: src/tables/InvenTreeTable.tsx:535 #~ msgid "Deleted records" @@ -9113,7 +9123,7 @@ msgstr "" #: src/tables/InvenTreeTable.tsx:562 msgid "Error loading table data" -msgstr "" +msgstr "Σφάλμα φόρτωσης δεδομένων πίνακα" #: src/tables/InvenTreeTable.tsx:594 #: src/tables/InvenTreeTable.tsx:595 @@ -9127,11 +9137,11 @@ msgstr "" #: src/tables/InvenTreeTable.tsx:691 msgid "View details" -msgstr "" +msgstr "Προβολή λεπτομερειών" #: src/tables/InvenTreeTable.tsx:694 msgid "View {model}" -msgstr "" +msgstr "Προβολή {model}" #: src/tables/InvenTreeTable.tsx:712 #~ msgid "Table filters" @@ -9143,41 +9153,41 @@ msgstr "" #: src/tables/InvenTreeTableHeader.tsx:104 msgid "Delete Selected Items" -msgstr "" +msgstr "Διαγραφή Επιλεγμένων Ειδών" #: src/tables/InvenTreeTableHeader.tsx:108 msgid "Are you sure you want to delete the selected items?" -msgstr "" +msgstr "Είστε βέβαιοι ότι θέλετε να διαγράψετε τα επιλεγμένα είδη;" #: src/tables/InvenTreeTableHeader.tsx:110 #: src/tables/plugin/PluginListTable.tsx:316 msgid "This action cannot be undone" -msgstr "" +msgstr "Αυτή η ενέργεια δεν μπορεί να αναιρεθεί" #: src/tables/InvenTreeTableHeader.tsx:121 msgid "Items deleted" -msgstr "" +msgstr "Τα είδη διαγράφηκαν" #: src/tables/InvenTreeTableHeader.tsx:126 msgid "Failed to delete items" -msgstr "" +msgstr "Αποτυχία διαγραφής ειδών" #: src/tables/InvenTreeTableHeader.tsx:177 msgid "Custom table filters are active" -msgstr "" +msgstr "Τα προσαρμοσμένα φίλτρα πίνακα είναι ενεργά" #: src/tables/InvenTreeTableHeader.tsx:203 #: src/tables/general/BarcodeScanTable.tsx:93 msgid "Delete selected records" -msgstr "" +msgstr "Διαγραφή επιλεγμένων εγγραφών" #: src/tables/InvenTreeTableHeader.tsx:223 msgid "Refresh data" -msgstr "" +msgstr "Ανανέωση δεδομένων" #: src/tables/InvenTreeTableHeader.tsx:272 msgid "Active Filters" -msgstr "" +msgstr "Ενεργά Φίλτρα" #: src/tables/TableHoverCard.tsx:35 #~ msgid "item-{idx}" @@ -9189,19 +9199,19 @@ msgstr "" #: src/tables/bom/BomTable.tsx:102 msgid "This BOM item is defined for a different parent" -msgstr "" +msgstr "Αυτό το στοιχείο BOM έχει οριστεί για διαφορετικό γονικό" #: src/tables/bom/BomTable.tsx:118 msgid "Part Information" -msgstr "" +msgstr "Πληροφορίες Προϊόντος" #: src/tables/bom/BomTable.tsx:121 msgid "This BOM item has not been validated" -msgstr "" +msgstr "Αυτό το στοιχείο BOM δεν έχει επικυρωθεί" #: src/tables/bom/BomTable.tsx:240 msgid "Substitutes" -msgstr "" +msgstr "Υποκατάστατα" #: src/tables/bom/BomTable.tsx:301 #~ msgid "Create BOM Item" @@ -9212,32 +9222,32 @@ msgstr "" #: src/tables/sales/SalesOrderLineItemTable.tsx:199 #: src/tables/sales/SalesOrderLineItemTable.tsx:216 msgid "Virtual part" -msgstr "" +msgstr "Εικονικό Προϊόν" #: src/tables/bom/BomTable.tsx:310 #~ msgid "Show asssmbled items" #~ msgstr "Show asssmbled items" #: src/tables/bom/BomTable.tsx:315 -#: src/tables/build/BuildLineTable.tsx:276 +#: src/tables/build/BuildLineTable.tsx:277 #: src/tables/part/PartTable.tsx:145 msgid "External stock" -msgstr "" +msgstr "Εξωτερικό απόθεμα" #: src/tables/bom/BomTable.tsx:323 -#: src/tables/build/BuildLineTable.tsx:239 +#: src/tables/build/BuildLineTable.tsx:240 msgid "Includes substitute stock" -msgstr "" +msgstr "Περιλαμβάνει υποκατάστατο απόθεμα" #: src/tables/bom/BomTable.tsx:331 #~ msgid "Edit Bom Item" #~ msgstr "Edit Bom Item" #: src/tables/bom/BomTable.tsx:332 -#: src/tables/build/BuildLineTable.tsx:249 +#: src/tables/build/BuildLineTable.tsx:250 #: src/tables/sales/SalesOrderLineItemTable.tsx:166 msgid "Includes variant stock" -msgstr "" +msgstr "Περιλαμβάνει απόθεμα παραλλαγών" #: src/tables/bom/BomTable.tsx:333 #~ msgid "Bom item updated" @@ -9250,7 +9260,7 @@ msgstr "" #: src/tables/bom/BomTable.tsx:349 #: src/tables/part/PartTable.tsx:114 msgid "Building" -msgstr "" +msgstr "Σε κατασκευή" #: src/tables/bom/BomTable.tsx:349 #~ msgid "Bom item deleted" @@ -9269,147 +9279,147 @@ msgstr "" #: src/tables/sales/SalesOrderLineItemTable.tsx:189 #: src/tables/stock/StockItemTable.tsx:222 msgid "Stock Information" -msgstr "" +msgstr "Πληροφορίες αποθέματος" #: src/tables/bom/BomTable.tsx:399 -#: src/tables/build/BuildLineTable.tsx:496 -#: src/tables/build/BuildLineTable.tsx:537 +#: src/tables/build/BuildLineTable.tsx:497 +#: src/tables/build/BuildLineTable.tsx:538 msgid "Consumable item" -msgstr "" +msgstr "Αναλώσιμο στοιχείο" #: src/tables/bom/BomTable.tsx:402 msgid "No available stock" -msgstr "" +msgstr "Δεν υπάρχει διαθέσιμο απόθεμα" #: src/tables/bom/BomTable.tsx:420 -#: src/tables/build/BuildLineTable.tsx:213 +#: src/tables/build/BuildLineTable.tsx:214 msgid "Show testable items" -msgstr "" +msgstr "Εμφάνιση δοκιμασμένων στοιχείων" #: src/tables/bom/BomTable.tsx:425 msgid "Show trackable items" -msgstr "" +msgstr "Εμφάνιση ιχνηλάσιμων στοιχείων" #: src/tables/bom/BomTable.tsx:430 -#: src/tables/build/BuildLineTable.tsx:208 +#: src/tables/build/BuildLineTable.tsx:209 msgid "Show assembled items" -msgstr "" +msgstr "Εμφάνιση συναρμολογημένων στοιχείων" #: src/tables/bom/BomTable.tsx:435 msgid "Show virtual items" -msgstr "" +msgstr "Εμφάνιση εικονικών στοιχείων" #: src/tables/bom/BomTable.tsx:440 msgid "Show items with available stock" -msgstr "" +msgstr "Εμφάνιση Προϊόντων με διαθέσιμο απόθεμα" #: src/tables/bom/BomTable.tsx:445 msgid "Show items on order" -msgstr "" +msgstr "Εμφάνιση Προϊόντων σε παραγγελία" #: src/tables/bom/BomTable.tsx:449 msgid "Validated" -msgstr "" +msgstr "Επικυρωμένο" #: src/tables/bom/BomTable.tsx:450 msgid "Show validated items" -msgstr "" +msgstr "Εμφάνιση επικυρωμένων στοιχείων" #: src/tables/bom/BomTable.tsx:454 #: src/tables/bom/UsedInTable.tsx:80 msgid "Inherited" -msgstr "" +msgstr "Κληρονομημένο" #: src/tables/bom/BomTable.tsx:455 #: src/tables/bom/UsedInTable.tsx:81 msgid "Show inherited items" -msgstr "" +msgstr "Εμφάνιση κληρονομημένων στοιχείων" #: src/tables/bom/BomTable.tsx:459 msgid "Allow Variants" -msgstr "" +msgstr "Να επιτρέπονται παραλλαγές" #: src/tables/bom/BomTable.tsx:460 msgid "Show items which allow variant substitution" -msgstr "" +msgstr "Εμφάνιση Προϊόντων που επιτρέπουν αντικατάσταση παραλλαγών" #: src/tables/bom/BomTable.tsx:464 #: src/tables/bom/UsedInTable.tsx:85 -#: src/tables/build/BuildLineTable.tsx:202 +#: src/tables/build/BuildLineTable.tsx:203 msgid "Optional" -msgstr "" +msgstr "Προαιρετικό" #: src/tables/bom/BomTable.tsx:465 #: src/tables/bom/UsedInTable.tsx:86 msgid "Show optional items" -msgstr "" +msgstr "Εμφάνιση προαιρετικών στοιχείων" #: src/tables/bom/BomTable.tsx:469 -#: src/tables/build/BuildLineTable.tsx:197 +#: src/tables/build/BuildLineTable.tsx:198 msgid "Consumable" -msgstr "" +msgstr "Αναλώσιμο" #: src/tables/bom/BomTable.tsx:470 msgid "Show consumable items" -msgstr "" +msgstr "Εμφάνιση αναλώσιμων στοιχείων" #: src/tables/bom/BomTable.tsx:474 #: src/tables/part/PartTable.tsx:313 msgid "Has Pricing" -msgstr "" +msgstr "Έχει τιμολόγηση" #: src/tables/bom/BomTable.tsx:475 msgid "Show items with pricing" -msgstr "" +msgstr "Εμφάνιση στοιχείων με τιμολόγηση" #: src/tables/bom/BomTable.tsx:497 msgid "Import BOM Data" -msgstr "" +msgstr "Εισαγωγή δεδομένων BOM" #: src/tables/bom/BomTable.tsx:507 #: src/tables/bom/BomTable.tsx:631 msgid "Add BOM Item" -msgstr "" +msgstr "Προσθήκη στοιχείου BOM" #: src/tables/bom/BomTable.tsx:512 msgid "BOM item created" -msgstr "" +msgstr "Το στοιχείο BOM δημιουργήθηκε" #: src/tables/bom/BomTable.tsx:519 msgid "Edit BOM Item" -msgstr "" +msgstr "Επεξεργασία στοιχείου BOM" #: src/tables/bom/BomTable.tsx:521 msgid "BOM item updated" -msgstr "" +msgstr "Το στοιχείο BOM ενημερώθηκε" #: src/tables/bom/BomTable.tsx:528 msgid "Delete BOM Item" -msgstr "" +msgstr "Διαγραφή στοιχείου BOM" #: src/tables/bom/BomTable.tsx:529 msgid "BOM item deleted" -msgstr "" +msgstr "Το στοιχείο BOM διαγράφηκε" #: src/tables/bom/BomTable.tsx:549 msgid "BOM item validated" -msgstr "" +msgstr "Το στοιχείο BOM επικυρώθηκε" #: src/tables/bom/BomTable.tsx:558 msgid "Failed to validate BOM item" -msgstr "" +msgstr "Αποτυχία επικύρωσης στοιχείου BOM" #: src/tables/bom/BomTable.tsx:570 msgid "View BOM" -msgstr "" +msgstr "Προβολή BOM" #: src/tables/bom/BomTable.tsx:581 msgid "Validate BOM Line" -msgstr "" +msgstr "Επικύρωση γραμμής BOM" #: src/tables/bom/BomTable.tsx:600 msgid "Edit Substitutes" -msgstr "" +msgstr "Επεξεργασία υποκατάστατων" #: src/tables/bom/BomTable.tsx:625 msgid "Add BOM Items" @@ -9422,7 +9432,7 @@ msgstr "" #: src/tables/bom/BomTable.tsx:637 #: src/tables/part/PartTable.tsx:546 msgid "Import from File" -msgstr "" +msgstr "Εισαγωγή από αρχείο" #: src/tables/bom/BomTable.tsx:639 msgid "Import BOM items from a file" @@ -9430,38 +9440,38 @@ msgstr "" #: src/tables/bom/BomTable.tsx:662 msgid "Bill of materials cannot be edited, as the part is locked" -msgstr "" +msgstr "Το BOM δεν μπορεί να επεξεργαστεί, επειδή το Προϊόν είναι κλειδωμένο" #: src/tables/bom/UsedInTable.tsx:34 -#: src/tables/build/BuildLineTable.tsx:207 +#: src/tables/build/BuildLineTable.tsx:208 #: src/tables/part/ParametricPartTable.tsx:364 #: src/tables/part/PartBuildAllocationsTable.tsx:60 #: src/tables/part/PartTable.tsx:209 #: src/tables/stock/StockItemTable.tsx:333 msgid "Assembly" -msgstr "" +msgstr "Συναρμολόγηση" #: src/tables/bom/UsedInTable.tsx:91 msgid "Show active assemblies" -msgstr "" +msgstr "Εμφάνιση ενεργών συναρμολογήσεων" #: src/tables/bom/UsedInTable.tsx:95 #: src/tables/part/PartTable.tsx:239 #: src/tables/part/PartVariantTable.tsx:30 msgid "Trackable" -msgstr "" +msgstr "Ιχνηλάσιμο" #: src/tables/bom/UsedInTable.tsx:96 msgid "Show trackable assemblies" -msgstr "" +msgstr "Εμφάνιση ιχνηλάσιμων συναρμολογήσεων" -#: src/tables/build/BuildAllocatedStockTable.tsx:67 +#: src/tables/build/BuildAllocatedStockTable.tsx:64 msgid "Allocated to Output" -msgstr "" +msgstr "Δεσμευμένο για αποτέλεσμα" -#: src/tables/build/BuildAllocatedStockTable.tsx:68 +#: src/tables/build/BuildAllocatedStockTable.tsx:65 msgid "Show items allocated to a build output" -msgstr "" +msgstr "Εμφάνιση Προϊόντων δεσμευμένων για αποτέλεσμα κατασκευής" #: src/tables/build/BuildAllocatedStockTable.tsx:73 #: src/tables/build/BuildOrderTable.tsx:197 @@ -9472,178 +9482,196 @@ msgstr "" #~ msgid "Include orders for part variants" #~ msgstr "Include orders for part variants" -#: src/tables/build/BuildAllocatedStockTable.tsx:97 +#: src/tables/build/BuildAllocatedStockTable.tsx:94 #: src/tables/part/PartBuildAllocationsTable.tsx:84 #: src/tables/part/PartPurchaseOrdersTable.tsx:132 #: src/tables/part/PartSalesAllocationsTable.tsx:69 #: src/tables/sales/SalesOrderAllocationTable.tsx:122 #: src/tables/sales/SalesOrderShipmentTable.tsx:130 msgid "Order Status" -msgstr "" +msgstr "Κατάσταση παραγγελίας" + +#: src/tables/build/BuildAllocatedStockTable.tsx:164 +#: src/tables/build/BuildLineTable.tsx:651 +msgid "Edit Stock Allocation" +msgstr "Επεξεργασία κατανομής αποθέματος" #: src/tables/build/BuildAllocatedStockTable.tsx:164 #~ msgid "Edit Build Item" #~ msgstr "Edit Build Item" -#: src/tables/build/BuildAllocatedStockTable.tsx:167 -#: src/tables/build/BuildLineTable.tsx:650 -msgid "Edit Stock Allocation" -msgstr "" - #: src/tables/build/BuildAllocatedStockTable.tsx:174 #~ msgid "Delete Build Item" #~ msgstr "Delete Build Item" -#: src/tables/build/BuildAllocatedStockTable.tsx:180 -#: src/tables/build/BuildLineTable.tsx:663 -msgid "Delete Stock Allocation" +#: src/tables/build/BuildAllocatedStockTable.tsx:177 +#: src/tables/build/BuildLineTable.tsx:664 +#: src/tables/sales/SalesOrderAllocationTable.tsx:218 +msgid "Remove Allocated Stock" msgstr "" -#: src/tables/build/BuildAllocatedStockTable.tsx:239 +#: src/tables/build/BuildAllocatedStockTable.tsx:180 +#: src/tables/build/BuildLineTable.tsx:663 +#~ msgid "Delete Stock Allocation" +#~ msgstr "Delete Stock Allocation" + +#: src/tables/build/BuildAllocatedStockTable.tsx:182 +#: src/tables/build/BuildLineTable.tsx:669 +#: src/tables/sales/SalesOrderAllocationTable.tsx:221 +msgid "Are you sure you want to remove this allocated stock from the order?" +msgstr "" + +#: src/tables/build/BuildAllocatedStockTable.tsx:242 msgid "Consume" +msgstr "Κατανάλωση" + +#: src/tables/build/BuildAllocatedStockTable.tsx:259 +#: src/tables/build/BuildLineTable.tsx:112 +#: src/tables/sales/SalesOrderAllocationTable.tsx:248 +msgid "Remove allocated stock" msgstr "" #: src/tables/build/BuildLineTable.tsx:59 #~ msgid "Show lines with available stock" #~ msgstr "Show lines with available stock" -#: src/tables/build/BuildLineTable.tsx:120 +#: src/tables/build/BuildLineTable.tsx:121 msgid "View Stock Item" -msgstr "" +msgstr "Προβολή Προϊόντος αποθέματος" -#: src/tables/build/BuildLineTable.tsx:183 +#: src/tables/build/BuildLineTable.tsx:184 msgid "Show fully allocated lines" -msgstr "" +msgstr "Εμφάνιση πλήρως δεσμευμένων γραμμών" -#: src/tables/build/BuildLineTable.tsx:188 +#: src/tables/build/BuildLineTable.tsx:189 msgid "Show fully consumed lines" -msgstr "" +msgstr "Εμφάνιση πλήρως καταναλωμένων γραμμών" #: src/tables/build/BuildLineTable.tsx:189 #~ msgid "Show allocated lines" #~ msgstr "Show allocated lines" -#: src/tables/build/BuildLineTable.tsx:193 +#: src/tables/build/BuildLineTable.tsx:194 msgid "Show items with sufficient available stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:198 +#: src/tables/build/BuildLineTable.tsx:199 msgid "Show consumable lines" -msgstr "" +msgstr "Εμφάνιση αναλώσιμων γραμμών" -#: src/tables/build/BuildLineTable.tsx:203 +#: src/tables/build/BuildLineTable.tsx:204 msgid "Show optional lines" -msgstr "" +msgstr "Εμφάνιση προαιρετικών γραμμών" -#: src/tables/build/BuildLineTable.tsx:212 +#: src/tables/build/BuildLineTable.tsx:213 #: src/tables/part/PartTable.tsx:233 msgid "Testable" -msgstr "" - -#: src/tables/build/BuildLineTable.tsx:217 -#: src/tables/stock/StockItemTable.tsx:388 -msgid "Tracked" -msgstr "" +msgstr "Δοκιμασμένο" #: src/tables/build/BuildLineTable.tsx:218 -msgid "Show tracked lines" -msgstr "" +#: src/tables/stock/StockItemTable.tsx:388 +msgid "Tracked" +msgstr "Ιχνηλάσιμο" -#: src/tables/build/BuildLineTable.tsx:223 +#: src/tables/build/BuildLineTable.tsx:219 +msgid "Show tracked lines" +msgstr "Εμφάνιση ιχνηλάσιμων γραμμών" + +#: src/tables/build/BuildLineTable.tsx:224 msgid "Show items with stock on order" msgstr "" -#: src/tables/build/BuildLineTable.tsx:258 +#: src/tables/build/BuildLineTable.tsx:259 #: src/tables/sales/SalesOrderLineItemTable.tsx:172 msgid "In production" -msgstr "" +msgstr "Σε παραγωγή" -#: src/tables/build/BuildLineTable.tsx:286 +#: src/tables/build/BuildLineTable.tsx:287 msgid "Insufficient stock" -msgstr "" +msgstr "Ανεπαρκές απόθεμα" -#: src/tables/build/BuildLineTable.tsx:302 +#: src/tables/build/BuildLineTable.tsx:303 #: src/tables/sales/SalesOrderLineItemTable.tsx:160 #: src/tables/stock/StockItemTable.tsx:191 msgid "No stock available" -msgstr "" +msgstr "Δεν υπάρχει διαθέσιμο απόθεμα" -#: src/tables/build/BuildLineTable.tsx:375 +#: src/tables/build/BuildLineTable.tsx:376 msgid "Gets Inherited" -msgstr "" +msgstr "Κληρονομείται" -#: src/tables/build/BuildLineTable.tsx:388 +#: src/tables/build/BuildLineTable.tsx:389 msgid "Unit Quantity" -msgstr "" +msgstr "Ποσότητα μονάδας" -#: src/tables/build/BuildLineTable.tsx:415 +#: src/tables/build/BuildLineTable.tsx:416 msgid "Setup Quantity" -msgstr "" +msgstr "Ποσότητα ρύθμισης" -#: src/tables/build/BuildLineTable.tsx:424 +#: src/tables/build/BuildLineTable.tsx:425 msgid "Attrition" -msgstr "" +msgstr "Φθορά" -#: src/tables/build/BuildLineTable.tsx:432 +#: src/tables/build/BuildLineTable.tsx:433 msgid "Rounding Multiple" -msgstr "" +msgstr "Στρογγυλοποίηση πολλαπλάσιου" -#: src/tables/build/BuildLineTable.tsx:441 +#: src/tables/build/BuildLineTable.tsx:442 msgid "BOM Information" -msgstr "" +msgstr "Πληροφορίες BOM" -#: src/tables/build/BuildLineTable.tsx:515 +#: src/tables/build/BuildLineTable.tsx:516 #: src/tables/part/PartBuildAllocationsTable.tsx:102 msgid "Fully allocated" -msgstr "" +msgstr "Πλήρως δεσμευμένο" -#: src/tables/build/BuildLineTable.tsx:563 +#: src/tables/build/BuildLineTable.tsx:564 #: src/tables/sales/SalesOrderLineItemTable.tsx:311 msgid "Create Build Order" -msgstr "" +msgstr "Δημιουργία εντολής κατασκευής" -#: src/tables/build/BuildLineTable.tsx:592 +#: src/tables/build/BuildLineTable.tsx:593 msgid "Auto allocation in progress" -msgstr "" - -#: src/tables/build/BuildLineTable.tsx:595 -#: src/tables/build/BuildLineTable.tsx:802 -msgid "Auto Allocate Stock" -msgstr "" +msgstr "Αυτόματη κατανομή σε εξέλιξη" #: src/tables/build/BuildLineTable.tsx:596 -msgid "Automatically allocate stock to this build according to the selected options" -msgstr "" +#: src/tables/build/BuildLineTable.tsx:809 +msgid "Auto Allocate Stock" +msgstr "Αυτόματη κατανομή αποθέματος" -#: src/tables/build/BuildLineTable.tsx:616 -#: src/tables/build/BuildLineTable.tsx:630 -#: src/tables/build/BuildLineTable.tsx:751 -#: src/tables/build/BuildLineTable.tsx:852 +#: src/tables/build/BuildLineTable.tsx:597 +msgid "Automatically allocate stock to this build according to the selected options" +msgstr "Αυτόματη κατανομή αποθέματος σε αυτή την κατασκευή σύμφωνα με τις επιλεγμένες επιλογές" + +#: src/tables/build/BuildLineTable.tsx:617 +#: src/tables/build/BuildLineTable.tsx:631 +#: src/tables/build/BuildLineTable.tsx:758 +#: src/tables/build/BuildLineTable.tsx:859 #: src/tables/build/BuildOutputTable.tsx:355 #: src/tables/build/BuildOutputTable.tsx:360 msgid "Deallocate Stock" -msgstr "" +msgstr "Αποδέσμευση αποθέματος" -#: src/tables/build/BuildLineTable.tsx:632 +#: src/tables/build/BuildLineTable.tsx:633 msgid "Deallocate all untracked stock for this build order" -msgstr "" +msgstr "Αποδέσμευση όλου του μη παρακολουθούμενου αποθέματος για αυτή την παραγγελία κατασκευής" -#: src/tables/build/BuildLineTable.tsx:634 +#: src/tables/build/BuildLineTable.tsx:635 msgid "Deallocate stock from the selected line item" -msgstr "" +msgstr "Αποδέσμευση αποθέματος από το επιλεγμένο στοιχείο γραμμής" -#: src/tables/build/BuildLineTable.tsx:638 +#: src/tables/build/BuildLineTable.tsx:639 msgid "Stock has been deallocated" -msgstr "" +msgstr "Το απόθεμα αποδεσμεύτηκε" -#: src/tables/build/BuildLineTable.tsx:771 +#: src/tables/build/BuildLineTable.tsx:778 msgid "Build Stock" -msgstr "" +msgstr "Κατασκευή αποθέματος" -#: src/tables/build/BuildLineTable.tsx:784 +#: src/tables/build/BuildLineTable.tsx:791 #: src/tables/sales/SalesOrderLineItemTable.tsx:487 msgid "View Part" -msgstr "" +msgstr "Προβολή Προϊόντος" #: src/tables/build/BuildOrderTable.tsx:116 #~ msgid "Cascade" @@ -9677,28 +9705,28 @@ msgstr "" #: src/tables/sales/ReturnOrderTable.tsx:79 #: src/tables/sales/SalesOrderTable.tsx:80 msgid "Has Target Date" -msgstr "" +msgstr "Έχει ημερομηνία στόχο" #: src/tables/build/BuildOrderTable.tsx:167 #: src/tables/purchasing/PurchaseOrderTable.tsx:84 #: src/tables/sales/ReturnOrderTable.tsx:80 #: src/tables/sales/SalesOrderTable.tsx:81 msgid "Show orders with a target date" -msgstr "" +msgstr "Εμφάνιση παραγγελιών με ημερομηνία στόχο" #: src/tables/build/BuildOrderTable.tsx:172 #: src/tables/purchasing/PurchaseOrderTable.tsx:89 #: src/tables/sales/ReturnOrderTable.tsx:85 #: src/tables/sales/SalesOrderTable.tsx:86 msgid "Has Start Date" -msgstr "" +msgstr "Έχει ημερομηνία έναρξης" #: src/tables/build/BuildOrderTable.tsx:173 #: src/tables/purchasing/PurchaseOrderTable.tsx:90 #: src/tables/sales/ReturnOrderTable.tsx:86 #: src/tables/sales/SalesOrderTable.tsx:87 msgid "Show orders with a start date" -msgstr "" +msgstr "Εμφάνιση παραγγελιών με ημερομηνία έναρξης" #: src/tables/build/BuildOrderTable.tsx:179 #~ msgid "Filter by user who issued this order" @@ -9706,7 +9734,7 @@ msgstr "" #: src/tables/build/BuildOutputTable.tsx:100 msgid "Build Output Stock Allocation" -msgstr "" +msgstr "Κατανομή αποθέματος εξόδου κατασκευής" #: src/tables/build/BuildOutputTable.tsx:161 #~ msgid "Delete build output" @@ -9715,11 +9743,11 @@ msgstr "" #: src/tables/build/BuildOutputTable.tsx:290 #: src/tables/build/BuildOutputTable.tsx:475 msgid "Add Build Output" -msgstr "" +msgstr "Προσθήκη εξόδου κατασκευής" #: src/tables/build/BuildOutputTable.tsx:293 msgid "Build output created" -msgstr "" +msgstr "Η έξοδος κατασκευής δημιουργήθηκε" #: src/tables/build/BuildOutputTable.tsx:304 #~ msgid "Edit build output" @@ -9728,41 +9756,41 @@ msgstr "" #: src/tables/build/BuildOutputTable.tsx:346 #: src/tables/build/BuildOutputTable.tsx:543 msgid "Edit Build Output" -msgstr "" +msgstr "Επεξεργασία εξόδου κατασκευής" #: src/tables/build/BuildOutputTable.tsx:362 msgid "This action will deallocate all stock from the selected build output" -msgstr "" +msgstr "Αυτή η ενέργεια θα αποδεσμεύσει όλο το απόθεμα από την επιλεγμένη έξοδο κατασκευής" #: src/tables/build/BuildOutputTable.tsx:387 msgid "Serialize Build Output" -msgstr "" +msgstr "Σειριοποίηση εξόδου κατασκευής" #: src/tables/build/BuildOutputTable.tsx:405 -#: src/tables/part/PartTestResultTable.tsx:310 +#: src/tables/part/PartTestResultTable.tsx:318 #: src/tables/stock/StockItemTable.tsx:328 msgid "Filter by stock status" -msgstr "" +msgstr "Φιλτράρισμα κατά κατάσταση αποθέματος" #: src/tables/build/BuildOutputTable.tsx:442 msgid "Complete selected outputs" -msgstr "" +msgstr "Ολοκλήρωση επιλεγμένων εξόδων" #: src/tables/build/BuildOutputTable.tsx:453 msgid "Scrap selected outputs" -msgstr "" +msgstr "Απόρριψη επιλεγμένων εξόδων" #: src/tables/build/BuildOutputTable.tsx:464 msgid "Cancel selected outputs" -msgstr "" +msgstr "Ακύρωση επιλεγμένων εξόδων" #: src/tables/build/BuildOutputTable.tsx:494 msgid "Allocate" -msgstr "" +msgstr "Κατανομή" #: src/tables/build/BuildOutputTable.tsx:495 msgid "Allocate stock to build output" -msgstr "" +msgstr "Κατανομή αποθέματος στην έξοδο κατασκευής" #: src/tables/build/BuildOutputTable.tsx:498 #~ msgid "View Build Output" @@ -9770,73 +9798,73 @@ msgstr "" #: src/tables/build/BuildOutputTable.tsx:508 msgid "Deallocate" -msgstr "" +msgstr "Αποδέσμευση" #: src/tables/build/BuildOutputTable.tsx:509 msgid "Deallocate stock from build output" -msgstr "" +msgstr "Αποδέσμευση αποθέματος από την έξοδο κατασκευής" #: src/tables/build/BuildOutputTable.tsx:523 msgid "Serialize build output" -msgstr "" +msgstr "Σειριοποίηση εξόδου κατασκευής" #: src/tables/build/BuildOutputTable.tsx:534 msgid "Complete build output" -msgstr "" +msgstr "Ολοκλήρωση εξόδου κατασκευής" #: src/tables/build/BuildOutputTable.tsx:550 msgid "Scrap" -msgstr "" +msgstr "Απόρριψη" #: src/tables/build/BuildOutputTable.tsx:551 msgid "Scrap build output" -msgstr "" +msgstr "Απόρριψη εξόδου κατασκευής" #: src/tables/build/BuildOutputTable.tsx:561 msgid "Cancel build output" -msgstr "" +msgstr "Ακύρωση εξόδου κατασκευής" #: src/tables/build/BuildOutputTable.tsx:610 msgid "Allocated Lines" -msgstr "" +msgstr "Κατανεμημένες γραμμές" #: src/tables/build/BuildOutputTable.tsx:625 msgid "Required Tests" -msgstr "" +msgstr "Απαιτούμενες δοκιμές" #: src/tables/build/BuildOutputTable.tsx:700 msgid "External Build" -msgstr "" +msgstr "Εξωτερική κατασκευή" #: src/tables/build/BuildOutputTable.tsx:702 msgid "This build order is fulfilled by an external purchase order" -msgstr "" +msgstr "Αυτή η εντολή κατασκευής εκτελείται μέσω εξωτερικής εντολής αγοράς" #: src/tables/company/AddressTable.tsx:122 #: src/tables/company/AddressTable.tsx:187 msgid "Add Address" -msgstr "" +msgstr "Προσθήκη διεύθυνσης" #: src/tables/company/AddressTable.tsx:127 msgid "Address created" -msgstr "" +msgstr "Η διεύθυνση δημιουργήθηκε" #: src/tables/company/AddressTable.tsx:136 msgid "Edit Address" -msgstr "" +msgstr "Επεξεργασία διεύθυνσης" #: src/tables/company/AddressTable.tsx:144 msgid "Delete Address" -msgstr "" +msgstr "Διαγραφή διεύθυνσης" #: src/tables/company/AddressTable.tsx:145 msgid "Are you sure you want to delete this address?" -msgstr "" +msgstr "Είστε βέβαιοι ότι θέλετε να διαγράψετε αυτή τη διεύθυνση;" #: src/tables/company/CompanyTable.tsx:70 #: src/tables/company/CompanyTable.tsx:120 msgid "Add Company" -msgstr "" +msgstr "Προσθήκη εταιρείας" #: src/tables/company/CompanyTable.tsx:71 #~ msgid "New Company" @@ -9844,39 +9872,39 @@ msgstr "" #: src/tables/company/CompanyTable.tsx:92 msgid "Show active companies" -msgstr "" +msgstr "Εμφάνιση ενεργών εταιρειών" #: src/tables/company/CompanyTable.tsx:97 msgid "Show companies which are suppliers" -msgstr "" +msgstr "Εμφάνιση εταιρειών που είναι προμηθευτές" #: src/tables/company/CompanyTable.tsx:102 msgid "Show companies which are manufacturers" -msgstr "" +msgstr "Εμφάνιση εταιρειών που είναι κατασκευαστές" #: src/tables/company/CompanyTable.tsx:107 msgid "Show companies which are customers" -msgstr "" +msgstr "Εμφάνιση εταιρειών που είναι πελάτες" #: src/tables/company/ContactTable.tsx:99 msgid "Edit Contact" -msgstr "" +msgstr "Επεξεργασία επαφής" #: src/tables/company/ContactTable.tsx:106 msgid "Add Contact" -msgstr "" +msgstr "Προσθήκη επαφής" #: src/tables/company/ContactTable.tsx:117 msgid "Delete Contact" -msgstr "" +msgstr "Διαγραφή επαφής" #: src/tables/company/ContactTable.tsx:158 msgid "Add contact" -msgstr "" +msgstr "Προσθήκη επαφής" #: src/tables/general/AttachmentTable.tsx:108 msgid "Uploading file {filename}" -msgstr "" +msgstr "Μεταφόρτωση αρχείου {filename}" #: src/tables/general/AttachmentTable.tsx:139 #~ msgid "File uploaded" @@ -9889,23 +9917,23 @@ msgstr "" #: src/tables/general/AttachmentTable.tsx:160 #: src/tables/general/AttachmentTable.tsx:174 msgid "Uploading File" -msgstr "" +msgstr "Μεταφόρτωση αρχείου" #: src/tables/general/AttachmentTable.tsx:185 msgid "File Uploaded" -msgstr "" +msgstr "Το αρχείο μεταφορτώθηκε" #: src/tables/general/AttachmentTable.tsx:186 msgid "File {name} uploaded successfully" -msgstr "" +msgstr "Το αρχείο {name} μεταφορτώθηκε με επιτυχία" #: src/tables/general/AttachmentTable.tsx:202 msgid "File could not be uploaded" -msgstr "" +msgstr "Το αρχείο δεν μπόρεσε να μεταφορτωθεί" #: src/tables/general/AttachmentTable.tsx:253 msgid "Upload Attachment" -msgstr "" +msgstr "Μεταφόρτωση συνημμένου" #: src/tables/general/AttachmentTable.tsx:254 #~ msgid "Upload attachment" @@ -9913,93 +9941,93 @@ msgstr "" #: src/tables/general/AttachmentTable.tsx:263 msgid "Edit Attachment" -msgstr "" +msgstr "Επεξεργασία συνημμένου" #: src/tables/general/AttachmentTable.tsx:277 msgid "Delete Attachment" -msgstr "" +msgstr "Διαγραφή συνημμένου" #: src/tables/general/AttachmentTable.tsx:287 msgid "Is Link" -msgstr "" +msgstr "Είναι σύνδεσμος" #: src/tables/general/AttachmentTable.tsx:288 msgid "Show link attachments" -msgstr "" +msgstr "Εμφάνιση συνημμένων συνδέσμων" #: src/tables/general/AttachmentTable.tsx:292 msgid "Is File" -msgstr "" +msgstr "Είναι αρχείο" #: src/tables/general/AttachmentTable.tsx:293 msgid "Show file attachments" -msgstr "" +msgstr "Εμφάνιση συνημμένων αρχείων" #: src/tables/general/AttachmentTable.tsx:302 msgid "Add attachment" -msgstr "" +msgstr "Προσθήκη συνημμένου" #: src/tables/general/AttachmentTable.tsx:313 msgid "Add external link" -msgstr "" +msgstr "Προσθήκη εξωτερικού συνδέσμου" #: src/tables/general/AttachmentTable.tsx:361 msgid "No attachments found" -msgstr "" +msgstr "Δεν βρέθηκαν συνημμένα" #: src/tables/general/AttachmentTable.tsx:400 msgid "Drag attachment file here to upload" -msgstr "" +msgstr "Σύρετε το συνημμένο εδώ για μεταφόρτωση" #: src/tables/general/BarcodeScanTable.tsx:35 msgid "Item" -msgstr "" +msgstr "Προϊόν" #: src/tables/general/BarcodeScanTable.tsx:50 msgid "Model" -msgstr "" +msgstr "Μοντέλο" #: src/tables/general/BarcodeScanTable.tsx:75 msgid "View Item" -msgstr "" +msgstr "Προβολή Προϊόντος" #: src/tables/general/ExtraLineItemTable.tsx:95 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:299 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:403 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:300 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:405 #: src/tables/sales/ReturnOrderLineItemTable.tsx:83 #: src/tables/sales/ReturnOrderLineItemTable.tsx:187 #: src/tables/sales/SalesOrderLineItemTable.tsx:252 #: src/tables/sales/SalesOrderLineItemTable.tsx:357 msgid "Add Line Item" -msgstr "" +msgstr "Προσθήκη γραμμής" #: src/tables/general/ExtraLineItemTable.tsx:108 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:320 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:322 #: src/tables/sales/ReturnOrderLineItemTable.tsx:96 #: src/tables/sales/SalesOrderLineItemTable.tsx:271 msgid "Edit Line Item" -msgstr "" +msgstr "Επεξεργασία γραμμής" #: src/tables/general/ExtraLineItemTable.tsx:117 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:329 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:331 #: src/tables/sales/ReturnOrderLineItemTable.tsx:105 #: src/tables/sales/SalesOrderLineItemTable.tsx:280 msgid "Delete Line Item" -msgstr "" +msgstr "Διαγραφή γραμμής" #: src/tables/general/ExtraLineItemTable.tsx:155 msgid "Add Extra Line Item" -msgstr "" +msgstr "Προσθήκη επιπλέον γραμμής" #: src/tables/machine/MachineListTable.tsx:133 msgid "Machine restarted" -msgstr "" +msgstr "Το μηχάνημα επανεκκινήθηκε" #: src/tables/machine/MachineListTable.tsx:235 #: src/tables/machine/MachineListTable.tsx:297 #: src/tables/machine/MachineListTable.tsx:729 msgid "Edit machine" -msgstr "" +msgstr "Επεξεργασία μηχανήματος" #: src/tables/machine/MachineListTable.tsx:235 #~ msgid "Are you sure you want to remove the machine \"{0}\"?" @@ -10008,26 +10036,26 @@ msgstr "" #: src/tables/machine/MachineListTable.tsx:249 #: src/tables/machine/MachineListTable.tsx:301 msgid "Delete machine" -msgstr "" +msgstr "Διαγραφή μηχανήματος" #: src/tables/machine/MachineListTable.tsx:250 #: src/tables/machine/MachineListTable.tsx:692 msgid "Machine successfully deleted." -msgstr "" +msgstr "Το μηχάνημα διαγράφηκε με επιτυχία." #: src/tables/machine/MachineListTable.tsx:255 #: src/tables/machine/MachineListTable.tsx:697 msgid "Are you sure you want to remove this machine?" -msgstr "" +msgstr "Είστε βέβαιοι ότι θέλετε να αφαιρέσετε αυτό το μηχάνημα;" #: src/tables/machine/MachineListTable.tsx:285 msgid "Machine" -msgstr "" +msgstr "Μηχάνημα" #: src/tables/machine/MachineListTable.tsx:290 #: src/tables/machine/MachineListTable.tsx:568 msgid "Restart required" -msgstr "" +msgstr "Απαιτείται επανεκκίνηση" #: src/tables/machine/MachineListTable.tsx:291 #~ msgid "Machine information" @@ -10035,19 +10063,19 @@ msgstr "" #: src/tables/machine/MachineListTable.tsx:294 msgid "Machine Actions" -msgstr "" +msgstr "Ενέργειες μηχανήματος" #: src/tables/machine/MachineListTable.tsx:306 msgid "Restart" -msgstr "" +msgstr "Επανεκκίνηση" #: src/tables/machine/MachineListTable.tsx:308 msgid "Restart machine" -msgstr "" +msgstr "Επανεκκίνηση μηχανήματος" #: src/tables/machine/MachineListTable.tsx:310 msgid "manual restart required" -msgstr "" +msgstr "απαιτείται χειροκίνητη επανεκκίνηση" #: src/tables/machine/MachineListTable.tsx:315 #~ msgid "Machine Information" @@ -10055,29 +10083,29 @@ msgstr "" #: src/tables/machine/MachineListTable.tsx:343 msgid "General" -msgstr "" +msgstr "Γενικά" #: src/tables/machine/MachineListTable.tsx:353 #: src/tables/machine/MachineListTable.tsx:804 msgid "Machine Type" -msgstr "" +msgstr "Τύπος μηχανήματος" #: src/tables/machine/MachineListTable.tsx:366 msgid "Machine Driver" -msgstr "" +msgstr "Οδηγός μηχανήματος" #: src/tables/machine/MachineListTable.tsx:381 msgid "Initialized" -msgstr "" +msgstr "Αρχικοποιήθηκε" #: src/tables/machine/MachineListTable.tsx:410 #: src/tables/machine/MachineTypeTable.tsx:307 msgid "No errors reported" -msgstr "" +msgstr "Δεν αναφέρθηκαν σφάλματα" #: src/tables/machine/MachineListTable.tsx:431 msgid "Properties" -msgstr "" +msgstr "Ιδιότητες" #: src/tables/machine/MachineListTable.tsx:494 #~ msgid "Create machine" @@ -10085,7 +10113,7 @@ msgstr "" #: src/tables/machine/MachineListTable.tsx:521 msgid "Driver Settings" -msgstr "" +msgstr "Ρυθμίσεις οδηγού" #: src/tables/machine/MachineListTable.tsx:561 #~ msgid "Machine detail" @@ -10093,40 +10121,40 @@ msgstr "" #: src/tables/machine/MachineListTable.tsx:648 msgid "Add Machine" -msgstr "" +msgstr "Προσθήκη μηχανήματος" #: src/tables/machine/MachineListTable.tsx:691 #: src/tables/machine/MachineListTable.tsx:736 msgid "Delete Machine" -msgstr "" +msgstr "Διαγραφή μηχανήματος" #: src/tables/machine/MachineListTable.tsx:704 msgid "Edit Machine" -msgstr "" +msgstr "Επεξεργασία μηχανήματος" #: src/tables/machine/MachineListTable.tsx:718 msgid "Restart Machine" -msgstr "" +msgstr "Επανεκκίνηση μηχανήματος" #: src/tables/machine/MachineListTable.tsx:749 msgid "Add machine" -msgstr "" +msgstr "Προσθήκη μηχανήματος" #: src/tables/machine/MachineListTable.tsx:765 msgid "Machine Detail" -msgstr "" +msgstr "Λεπτομέρειες μηχανήματος" #: src/tables/machine/MachineListTable.tsx:813 msgid "Driver" -msgstr "" +msgstr "Οδηγός" #: src/tables/machine/MachineTypeTable.tsx:72 msgid "Driver Type" -msgstr "" +msgstr "Τύπος οδηγού" #: src/tables/machine/MachineTypeTable.tsx:76 msgid "Builtin driver" -msgstr "" +msgstr "Ενσωματωμένος οδηγός" #: src/tables/machine/MachineTypeTable.tsx:99 #~ msgid "Machine type information" @@ -10134,15 +10162,15 @@ msgstr "" #: src/tables/machine/MachineTypeTable.tsx:128 msgid "Not Found" -msgstr "" +msgstr "Δεν βρέθηκε" #: src/tables/machine/MachineTypeTable.tsx:131 msgid "Machine type not found." -msgstr "" +msgstr "Ο τύπος μηχανήματος δεν βρέθηκε." #: src/tables/machine/MachineTypeTable.tsx:141 msgid "Machine Type Information" -msgstr "" +msgstr "Πληροφορίες τύπου μηχανήματος" #: src/tables/machine/MachineTypeTable.tsx:148 #~ msgid "Available drivers" @@ -10151,33 +10179,33 @@ msgstr "" #: src/tables/machine/MachineTypeTable.tsx:156 #: src/tables/machine/MachineTypeTable.tsx:255 msgid "Slug" -msgstr "" +msgstr "Slug" #: src/tables/machine/MachineTypeTable.tsx:167 #: src/tables/machine/MachineTypeTable.tsx:276 msgid "Provider plugin" -msgstr "" +msgstr "Plugin παρόχου" #: src/tables/machine/MachineTypeTable.tsx:179 #: src/tables/machine/MachineTypeTable.tsx:288 msgid "Provider file" -msgstr "" +msgstr "Αρχείο παρόχου" #: src/tables/machine/MachineTypeTable.tsx:194 msgid "Available Drivers" -msgstr "" +msgstr "Διαθέσιμοι οδηγοί" #: src/tables/machine/MachineTypeTable.tsx:234 msgid "Machine driver not found." -msgstr "" +msgstr "Ο οδηγός μηχανήματος δεν βρέθηκε." #: src/tables/machine/MachineTypeTable.tsx:242 msgid "Machine driver information" -msgstr "" +msgstr "Πληροφορίες οδηγού μηχανήματος" #: src/tables/machine/MachineTypeTable.tsx:262 msgid "Machine type" -msgstr "" +msgstr "Τύπος μηχανήματος" #: src/tables/machine/MachineTypeTable.tsx:338 #~ msgid "Machine type detail" @@ -10189,33 +10217,33 @@ msgstr "" #: src/tables/machine/MachineTypeTable.tsx:362 msgid "Builtin type" -msgstr "" +msgstr "Ενσωματωμένος τύπος" #: src/tables/machine/MachineTypeTable.tsx:371 msgid "Machine Type Detail" -msgstr "" +msgstr "Λεπτομέρειες τύπου μηχανήματος" #: src/tables/machine/MachineTypeTable.tsx:381 msgid "Machine Driver Detail" -msgstr "" +msgstr "Λεπτομέρειες οδηγού μηχανήματος" #: src/tables/notifications/NotificationTable.tsx:26 msgid "Age" -msgstr "" +msgstr "Ηλικία" #: src/tables/notifications/NotificationTable.tsx:37 msgid "Notification" -msgstr "" +msgstr "Ειδοποίηση" #: src/tables/notifications/NotificationTable.tsx:41 #: src/tables/plugin/PluginErrorTable.tsx:37 #: src/tables/settings/ErrorTable.tsx:50 msgid "Message" -msgstr "" +msgstr "Μήνυμα" #: src/tables/part/ParametricPartTable.tsx:78 msgid "Click to edit" -msgstr "" +msgstr "Κάντε κλικ για επεξεργασία" #: src/tables/part/ParametricPartTable.tsx:82 #~ msgid "Edit parameter" @@ -10223,118 +10251,118 @@ msgstr "" #: src/tables/part/ParametricPartTable.tsx:244 msgid "Add Part Parameter" -msgstr "" +msgstr "Προσθήκη παραμέτρου προϊόντος" #: src/tables/part/ParametricPartTable.tsx:258 #: src/tables/part/PartParameterTable.tsx:164 #: src/tables/part/PartParameterTable.tsx:187 msgid "Edit Part Parameter" -msgstr "" +msgstr "Επεξεργασία παραμέτρου προϊόντος" #: src/tables/part/ParametricPartTable.tsx:355 msgid "Show active parts" -msgstr "" +msgstr "Εμφάνιση ενεργών προϊόντων" #: src/tables/part/ParametricPartTable.tsx:360 msgid "Show locked parts" -msgstr "" +msgstr "Εμφάνιση κλειδωμένων προϊόντων" #: src/tables/part/ParametricPartTable.tsx:365 msgid "Show assembly parts" -msgstr "" +msgstr "Εμφάνιση προϊόντων συναρμολόγησης" #: src/tables/part/ParametricPartTableFilters.tsx:36 msgid "True" -msgstr "" +msgstr "Αληθές" #: src/tables/part/ParametricPartTableFilters.tsx:37 msgid "False" -msgstr "" +msgstr "Ψευδές" #: src/tables/part/ParametricPartTableFilters.tsx:47 #: src/tables/part/ParametricPartTableFilters.tsx:80 msgid "Select a choice" -msgstr "" +msgstr "Επιλέξτε τιμή" #: src/tables/part/ParametricPartTableFilters.tsx:100 msgid "Enter a value" -msgstr "" +msgstr "Εισαγάγετε μια τιμή" #: src/tables/part/PartBuildAllocationsTable.tsx:64 msgid "Assembly IPN" -msgstr "" +msgstr "IPN συναρμολόγησης" #: src/tables/part/PartBuildAllocationsTable.tsx:73 msgid "Part IPN" -msgstr "" +msgstr "IPN προϊόντος" #: src/tables/part/PartBuildAllocationsTable.tsx:91 msgid "Required Stock" -msgstr "" +msgstr "Απαιτούμενο απόθεμα" #: src/tables/part/PartBuildAllocationsTable.tsx:124 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:381 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:383 msgid "View Build Order" -msgstr "" +msgstr "Προβολή εντολής παραγωγής" #: src/tables/part/PartCategoryTable.tsx:51 msgid "You are subscribed to notifications for this category" -msgstr "" +msgstr "Έχετε εγγραφεί σε ειδοποιήσεις για αυτήν την κατηγορία" #: src/tables/part/PartCategoryTable.tsx:84 #: src/tables/part/PartTable.tsx:221 msgid "Include Subcategories" -msgstr "" +msgstr "Συμπερίληψη υποκατηγοριών" #: src/tables/part/PartCategoryTable.tsx:85 msgid "Include subcategories in results" -msgstr "" +msgstr "Συμπερίλαβε τις υποκατηγορίες στα αποτελέσματα" #: src/tables/part/PartCategoryTable.tsx:90 msgid "Show structural categories" -msgstr "" +msgstr "Εμφάνιση δομικών κατηγοριών" #: src/tables/part/PartCategoryTable.tsx:95 msgid "Show categories to which the user is subscribed" -msgstr "" +msgstr "Εμφάνιση κατηγοριών στις οποίες ο χρήστης είναι εγγεγραμμένος" #: src/tables/part/PartCategoryTable.tsx:104 msgid "New Part Category" -msgstr "" +msgstr "Νέα κατηγορία προϊόντων" #: src/tables/part/PartCategoryTable.tsx:130 msgid "Set Parent Category" -msgstr "" +msgstr "Ορισμός γονικής κατηγορίας" #: src/tables/part/PartCategoryTable.tsx:148 #: src/tables/stock/StockLocationTable.tsx:147 msgid "Set Parent" -msgstr "" +msgstr "Ορισμός γονικού" #: src/tables/part/PartCategoryTable.tsx:150 msgid "Set parent category for the selected items" -msgstr "" +msgstr "Ορισμός γονικής κατηγορίας για τα επιλεγμένα στοιχεία" #: src/tables/part/PartCategoryTable.tsx:161 msgid "Add Part Category" -msgstr "" +msgstr "Προσθήκη κατηγορίας προϊόντων" #: src/tables/part/PartCategoryTemplateTable.tsx:49 #: src/tables/part/PartCategoryTemplateTable.tsx:143 msgid "Add Category Parameter" -msgstr "" +msgstr "Προσθήκη παραμέτρου κατηγορίας" #: src/tables/part/PartCategoryTemplateTable.tsx:57 msgid "Edit Category Parameter" -msgstr "" +msgstr "Επεξεργασία παραμέτρου κατηγορίας" #: src/tables/part/PartCategoryTemplateTable.tsx:65 msgid "Delete Category Parameter" -msgstr "" +msgstr "Διαγραφή παραμέτρου κατηγορίας" #: src/tables/part/PartCategoryTemplateTable.tsx:87 msgid "Parameter Template" -msgstr "" +msgstr "Πρότυπο παραμέτρου" #: src/tables/part/PartCategoryTemplateTable.tsx:93 #~ msgid "[{0}]" @@ -10342,75 +10370,75 @@ msgstr "" #: src/tables/part/PartParameterTable.tsx:108 msgid "Internal Units" -msgstr "" +msgstr "Εσωτερικές μονάδες" #: src/tables/part/PartParameterTable.tsx:128 #: src/tables/part/PartParameterTable.tsx:138 msgid "Updated By" -msgstr "" +msgstr "Ενημερώθηκε από" #: src/tables/part/PartParameterTable.tsx:139 msgid "Filter by user who last updated the parameter" -msgstr "" +msgstr "Φιλτράρισμα ανά χρήστη που ενημέρωσε τελευταίος την παράμετρο" #: src/tables/part/PartParameterTable.tsx:148 msgid "New Part Parameter" -msgstr "" +msgstr "Νέα παράμετρος προϊόντος" #: src/tables/part/PartParameterTable.tsx:173 #: src/tables/part/PartParameterTable.tsx:195 msgid "Delete Part Parameter" -msgstr "" +msgstr "Διαγραφή παραμέτρου προϊόντος" #: src/tables/part/PartParameterTable.tsx:213 msgid "Add parameter" -msgstr "" +msgstr "Προσθήκη παραμέτρου" #: src/tables/part/PartParameterTable.tsx:232 msgid "Part parameters cannot be edited, as the part is locked" -msgstr "" +msgstr "Οι παράμετροι προϊόντος δεν μπορούν να επεξεργαστούν επειδή το προϊόν είναι κλειδωμένο" #: src/tables/part/PartParameterTemplateTable.tsx:36 msgid "Checkbox" -msgstr "" +msgstr "Checkbox" #: src/tables/part/PartParameterTemplateTable.tsx:37 msgid "Show checkbox templates" -msgstr "" +msgstr "Εμφάνιση προτύπων checkbox" #: src/tables/part/PartParameterTemplateTable.tsx:41 msgid "Has choices" -msgstr "" +msgstr "Έχει επιλογές" #: src/tables/part/PartParameterTemplateTable.tsx:42 msgid "Show templates with choices" -msgstr "" +msgstr "Εμφάνιση προτύπων με επιλογές" #: src/tables/part/PartParameterTemplateTable.tsx:46 #: src/tables/part/PartTable.tsx:245 msgid "Has Units" -msgstr "" +msgstr "Έχει μονάδες" #: src/tables/part/PartParameterTemplateTable.tsx:47 msgid "Show templates with units" -msgstr "" +msgstr "Εμφάνιση προτύπων με μονάδες" #: src/tables/part/PartParameterTemplateTable.tsx:91 #: src/tables/part/PartParameterTemplateTable.tsx:166 msgid "Add Parameter Template" -msgstr "" +msgstr "Προσθήκη προτύπου παραμέτρου" #: src/tables/part/PartParameterTemplateTable.tsx:105 msgid "Duplicate Parameter Template" -msgstr "" +msgstr "Αντιγραφή προτύπου παραμέτρου" #: src/tables/part/PartParameterTemplateTable.tsx:117 msgid "Edit Parameter Template" -msgstr "" +msgstr "Επεξεργασία προτύπου παραμέτρου" #: src/tables/part/PartParameterTemplateTable.tsx:128 msgid "Delete Parameter Template" -msgstr "" +msgstr "Διαγραφή προτύπου παραμέτρου" #: src/tables/part/PartParameterTemplateTable.tsx:141 #~ msgid "Add parameter template" @@ -10419,148 +10447,148 @@ msgstr "" #: src/tables/part/PartPurchaseOrdersTable.tsx:79 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:197 msgid "Total Quantity" -msgstr "" +msgstr "Συνολική ποσότητα" #: src/tables/part/PartPurchaseOrdersTable.tsx:123 msgid "Show pending orders" -msgstr "" +msgstr "Εμφάνιση εκκρεμών παραγγελιών" #: src/tables/part/PartPurchaseOrdersTable.tsx:128 msgid "Show received items" -msgstr "" +msgstr "Εμφάνιση παραληφθέντων Προϊόντων" #: src/tables/part/PartSalesAllocationsTable.tsx:90 #: src/tables/sales/SalesOrderShipmentTable.tsx:218 msgid "View Sales Order" -msgstr "" +msgstr "Προβολή παραγγελίας πώλησης" #: src/tables/part/PartTable.tsx:99 msgid "Minimum stock" -msgstr "" +msgstr "Ελάχιστο απόθεμα" #: src/tables/part/PartTable.tsx:198 msgid "Filter by part active status" -msgstr "" +msgstr "Φιλτράρισμα κατά ενεργή κατάσταση προϊόντος" #: src/tables/part/PartTable.tsx:204 msgid "Filter by part locked status" -msgstr "" +msgstr "Φιλτράρισμα κατά κλειδωμένα προϊόντα" #: src/tables/part/PartTable.tsx:210 msgid "Filter by assembly attribute" -msgstr "" +msgstr "Φιλτράρισμα κατά χαρακτηριστικό συναρμολόγησης" #: src/tables/part/PartTable.tsx:215 msgid "BOM Valid" -msgstr "" +msgstr "Έγκυρο BOM" #: src/tables/part/PartTable.tsx:216 msgid "Filter by parts with a valid BOM" -msgstr "" +msgstr "Φιλτράρισμα προϊόντων με έγκυρο BOM" #: src/tables/part/PartTable.tsx:222 msgid "Include parts in subcategories" -msgstr "" +msgstr "Συμπερίληψη προϊόντων σε υποκατηγορίες" #: src/tables/part/PartTable.tsx:228 msgid "Filter by component attribute" -msgstr "" +msgstr "Φιλτράρισμα κατά χαρακτηριστικό Προϊόντος" #: src/tables/part/PartTable.tsx:234 msgid "Filter by testable attribute" -msgstr "" +msgstr "Φιλτράρισμα κατά δυνατότητα δοκιμής" #: src/tables/part/PartTable.tsx:240 msgid "Filter by trackable attribute" -msgstr "" +msgstr "Φιλτράρισμα κατά δυνατότητα ιχνηλάτησης" #: src/tables/part/PartTable.tsx:246 msgid "Filter by parts which have units" -msgstr "" +msgstr "Φιλτράρισμα προϊόντων με μονάδες" #: src/tables/part/PartTable.tsx:251 msgid "Has IPN" -msgstr "" +msgstr "Έχει IPN" #: src/tables/part/PartTable.tsx:252 msgid "Filter by parts which have an internal part number" -msgstr "" +msgstr "Φιλτράρισμα προϊόντων με εσωτερικό κωδικό" #: src/tables/part/PartTable.tsx:257 msgid "Has Stock" -msgstr "" +msgstr "Έχει απόθεμα" #: src/tables/part/PartTable.tsx:258 msgid "Filter by parts which have stock" -msgstr "" +msgstr "Φιλτράρισμα προϊόντων με διαθέσιμο απόθεμα" #: src/tables/part/PartTable.tsx:264 msgid "Filter by parts which have low stock" -msgstr "" +msgstr "Φιλτράρισμα προϊόντων με χαμηλό απόθεμα" #: src/tables/part/PartTable.tsx:269 msgid "Purchaseable" -msgstr "" +msgstr "Αγοράσιμα" #: src/tables/part/PartTable.tsx:270 msgid "Filter by parts which are purchaseable" -msgstr "" +msgstr "Φιλτράρισμα προϊόντων που μπορούν να αγοραστούν" #: src/tables/part/PartTable.tsx:275 msgid "Salable" -msgstr "" +msgstr "Πωλήσιμα" #: src/tables/part/PartTable.tsx:276 msgid "Filter by parts which are salable" -msgstr "" +msgstr "Φιλτράρισμα προϊόντων που μπορούν να πωληθούν" #: src/tables/part/PartTable.tsx:282 msgid "Filter by parts which are virtual" -msgstr "" +msgstr "Φιλτράρισμα εικονικών προϊόντων" #: src/tables/part/PartTable.tsx:286 msgid "Not Virtual" -msgstr "" +msgstr "Μη εικονικά" #: src/tables/part/PartTable.tsx:291 msgid "Is Template" -msgstr "" +msgstr "Είναι πρότυπο" #: src/tables/part/PartTable.tsx:292 msgid "Filter by parts which are templates" -msgstr "" +msgstr "Φιλτράρισμα προϊόντων που είναι πρότυπα" #: src/tables/part/PartTable.tsx:297 msgid "Is Variant" -msgstr "" +msgstr "Είναι παραλλαγή" #: src/tables/part/PartTable.tsx:298 msgid "Filter by parts which are variants" -msgstr "" +msgstr "Φιλτράρισμα προϊόντων που είναι παραλλαγές" #: src/tables/part/PartTable.tsx:303 msgid "Is Revision" -msgstr "" +msgstr "Είναι αναθεώρηση" #: src/tables/part/PartTable.tsx:304 msgid "Filter by parts which are revisions" -msgstr "" +msgstr "Φιλτράρισμα προϊόντων που είναι αναθεωρήσεις" #: src/tables/part/PartTable.tsx:308 msgid "Has Revisions" -msgstr "" +msgstr "Έχει αναθεωρήσεις" #: src/tables/part/PartTable.tsx:309 msgid "Filter by parts which have revisions" -msgstr "" +msgstr "Φιλτράρισμα προϊόντων με αναθεωρήσεις" #: src/tables/part/PartTable.tsx:314 msgid "Filter by parts which have pricing information" -msgstr "" +msgstr "Φιλτράρισμα προϊόντων με πληροφορίες τιμολόγησης" #: src/tables/part/PartTable.tsx:320 msgid "Filter by parts which have available stock" -msgstr "" +msgstr "Φιλτράρισμα προϊόντων με διαθέσιμο απόθεμα" #: src/tables/part/PartTable.tsx:322 #~ msgid "Has Stocktake" @@ -10572,161 +10600,161 @@ msgstr "" #: src/tables/part/PartTable.tsx:326 msgid "Filter by parts to which the user is subscribed" -msgstr "" +msgstr "Φιλτράρισμα προϊόντων στα οποία ο χρήστης έχει εγγραφεί" #: src/tables/part/PartTable.tsx:377 msgid "Import Parts" -msgstr "" +msgstr "Εισαγωγή προϊόντων" #: src/tables/part/PartTable.tsx:464 #: src/tables/part/PartTable.tsx:512 msgid "Set Category" -msgstr "" +msgstr "Ορισμός κατηγορίας" #: src/tables/part/PartTable.tsx:514 msgid "Set category for selected parts" -msgstr "" +msgstr "Ορισμός κατηγορίας για τα επιλεγμένα προϊόντα" #: src/tables/part/PartTable.tsx:524 msgid "Order selected parts" -msgstr "" +msgstr "Παραγγελία επιλεγμένων προϊόντων" #: src/tables/part/PartTable.tsx:534 msgid "Add Parts" -msgstr "" +msgstr "Προσθήκη προϊόντων" #: src/tables/part/PartTable.tsx:540 msgid "Create Part" -msgstr "" +msgstr "Δημιουργία προϊόντος" #: src/tables/part/PartTable.tsx:542 msgid "Create a new part" -msgstr "" +msgstr "Δημιουργία νέου προϊόντος" #: src/tables/part/PartTable.tsx:548 msgid "Import parts from a file" -msgstr "" +msgstr "Εισαγωγή εξαρτημάτων από αρχείο" #: src/tables/part/PartTable.tsx:553 msgid "Import from Supplier" -msgstr "" +msgstr "Εισαγωγή από προμηθευτή" #: src/tables/part/PartTable.tsx:555 msgid "Import parts from a supplier plugin" -msgstr "" +msgstr "Εισαγωγή εξαρτημάτων από πρόσθετο προμηθευτή" #: src/tables/part/PartTestResultTable.tsx:103 #: src/tables/part/PartTestResultTable.tsx:181 -#: src/tables/part/PartTestResultTable.tsx:320 -#: src/tables/part/PartTestResultTable.tsx:334 +#: src/tables/part/PartTestResultTable.tsx:328 +#: src/tables/part/PartTestResultTable.tsx:342 #: src/tables/stock/StockItemTestResultTable.tsx:296 #: src/tables/stock/StockItemTestResultTable.tsx:368 #: src/tables/stock/StockItemTestResultTable.tsx:429 msgid "Add Test Result" -msgstr "" +msgstr "Προσθήκη αποτελέσματος δοκιμής" #: src/tables/part/PartTestResultTable.tsx:110 #: src/tables/stock/StockItemTestResultTable.tsx:298 msgid "Test result added" -msgstr "" +msgstr "Το αποτέλεσμα δοκιμής προστέθηκε" #: src/tables/part/PartTestResultTable.tsx:142 msgid "Add Test Results" -msgstr "" +msgstr "Προσθήκη αποτελεσμάτων δοκιμής" #: src/tables/part/PartTestResultTable.tsx:152 msgid "Test results added" -msgstr "" +msgstr "Τα αποτελέσματα δοκιμής προστέθηκαν" #: src/tables/part/PartTestResultTable.tsx:180 #: src/tables/stock/StockItemTestResultTable.tsx:197 msgid "No Result" -msgstr "" +msgstr "Κανένα αποτέλεσμα" -#: src/tables/part/PartTestResultTable.tsx:298 +#: src/tables/part/PartTestResultTable.tsx:306 msgid "Show build outputs currently in production" -msgstr "" +msgstr "Εμφάνιση εξόδων παραγωγής που βρίσκονται σε εξέλιξη" #: src/tables/part/PartTestTemplateTable.tsx:56 msgid "Test is defined for a parent template part" -msgstr "" +msgstr "Η δοκιμή έχει οριστεί για γονικό πρότυπο εξαρτήματος" #: src/tables/part/PartTestTemplateTable.tsx:70 msgid "Template Details" -msgstr "" +msgstr "Λεπτομέρειες προτύπου" #: src/tables/part/PartTestTemplateTable.tsx:80 msgid "Results" -msgstr "" +msgstr "Αποτελέσματα" #: src/tables/part/PartTestTemplateTable.tsx:113 msgid "Show required tests" -msgstr "" +msgstr "Εμφάνιση απαιτούμενων δοκιμών" #: src/tables/part/PartTestTemplateTable.tsx:118 msgid "Show enabled tests" -msgstr "" +msgstr "Εμφάνιση ενεργών δοκιμών" #: src/tables/part/PartTestTemplateTable.tsx:122 msgid "Requires Value" -msgstr "" +msgstr "Απαιτεί τιμή" #: src/tables/part/PartTestTemplateTable.tsx:123 msgid "Show tests that require a value" -msgstr "" +msgstr "Εμφάνιση δοκιμών που απαιτούν τιμή" #: src/tables/part/PartTestTemplateTable.tsx:127 msgid "Requires Attachment" -msgstr "" +msgstr "Απαιτεί συνημμένο" #: src/tables/part/PartTestTemplateTable.tsx:128 msgid "Show tests that require an attachment" -msgstr "" +msgstr "Εμφάνιση δοκιμών που απαιτούν συνημμένο" #: src/tables/part/PartTestTemplateTable.tsx:132 msgid "Include Inherited" -msgstr "" +msgstr "Συμπερίληψη κληρονομημένων" #: src/tables/part/PartTestTemplateTable.tsx:133 msgid "Show tests from inherited templates" -msgstr "" +msgstr "Εμφάνιση δοκιμών από κληρονομημένα πρότυπα" #: src/tables/part/PartTestTemplateTable.tsx:137 msgid "Has Results" -msgstr "" +msgstr "Έχει αποτελέσματα" #: src/tables/part/PartTestTemplateTable.tsx:138 msgid "Show tests which have recorded results" -msgstr "" +msgstr "Εμφάνιση δοκιμών με καταγεγραμμένα αποτελέσματα" #: src/tables/part/PartTestTemplateTable.tsx:160 #: src/tables/part/PartTestTemplateTable.tsx:243 msgid "Add Test Template" -msgstr "" +msgstr "Προσθήκη προτύπου δοκιμής" #: src/tables/part/PartTestTemplateTable.tsx:176 msgid "Edit Test Template" -msgstr "" +msgstr "Επεξεργασία προτύπου δοκιμής" #: src/tables/part/PartTestTemplateTable.tsx:187 msgid "Delete Test Template" -msgstr "" +msgstr "Διαγραφή προτύπου δοκιμής" #: src/tables/part/PartTestTemplateTable.tsx:189 msgid "This action cannot be reversed" -msgstr "" +msgstr "Αυτή η ενέργεια δεν μπορεί να αναιρεθεί" #: src/tables/part/PartTestTemplateTable.tsx:191 msgid "Any tests results associated with this template will be deleted" -msgstr "" +msgstr "Όλα τα αποτελέσματα δοκιμών που σχετίζονται με αυτό το πρότυπο θα διαγραφούν" #: src/tables/part/PartTestTemplateTable.tsx:209 msgid "View Parent Part" -msgstr "" +msgstr "Προβολή γονικού εξαρτήματος" #: src/tables/part/PartTestTemplateTable.tsx:263 msgid "Part templates cannot be edited, as the part is locked" -msgstr "" +msgstr "Τα πρότυπα εξαρτημάτων δεν μπορούν να επεξεργαστούν, καθώς το εξάρτημα είναι κλειδωμένο" #: src/tables/part/PartThumbTable.tsx:222 msgid "Select" @@ -10734,28 +10762,28 @@ msgstr "Επιλέξτε" #: src/tables/part/PartVariantTable.tsx:16 msgid "Show active variants" -msgstr "" +msgstr "Εμφάνιση ενεργών παραλλαγών" #: src/tables/part/PartVariantTable.tsx:20 msgid "Template" -msgstr "" +msgstr "Πρότυπο" #: src/tables/part/PartVariantTable.tsx:21 msgid "Show template variants" -msgstr "" +msgstr "Εμφάνιση παραλλαγών προτύπου" #: src/tables/part/PartVariantTable.tsx:26 msgid "Show virtual variants" -msgstr "" +msgstr "Εμφάνιση εικονικών παραλλαγών" #: src/tables/part/PartVariantTable.tsx:31 msgid "Show trackable variants" -msgstr "" +msgstr "Εμφάνιση ιχνηλάσιμων παραλλαγών" #: src/tables/part/RelatedPartTable.tsx:104 #: src/tables/part/RelatedPartTable.tsx:137 msgid "Add Related Part" -msgstr "" +msgstr "Προσθήκη σχετικού εξαρτήματος" #: src/tables/part/RelatedPartTable.tsx:109 #~ msgid "Add related part" @@ -10763,45 +10791,45 @@ msgstr "" #: src/tables/part/RelatedPartTable.tsx:119 msgid "Delete Related Part" -msgstr "" +msgstr "Διαγραφή σχετικού εξαρτήματος" #: src/tables/part/RelatedPartTable.tsx:126 msgid "Edit Related Part" -msgstr "" +msgstr "Επεξεργασία σχετικού εξαρτήματος" #: src/tables/part/SelectionListTable.tsx:64 #: src/tables/part/SelectionListTable.tsx:115 msgid "Add Selection List" -msgstr "" +msgstr "Προσθήκη λίστας επιλογής" #: src/tables/part/SelectionListTable.tsx:76 msgid "Edit Selection List" -msgstr "" +msgstr "Επεξεργασία λίστας επιλογής" #: src/tables/part/SelectionListTable.tsx:84 msgid "Delete Selection List" -msgstr "" +msgstr "Διαγραφή λίστας επιλογής" #: src/tables/plugin/PluginErrorTable.tsx:29 msgid "Stage" -msgstr "" +msgstr "Στάδιο" #: src/tables/plugin/PluginListTable.tsx:43 msgid "Plugin is active" -msgstr "" +msgstr "Το πρόσθετο είναι ενεργό" #: src/tables/plugin/PluginListTable.tsx:49 msgid "Plugin is inactive" -msgstr "" +msgstr "Το πρόσθετο είναι ανενεργό" #: src/tables/plugin/PluginListTable.tsx:56 msgid "Plugin is not installed" -msgstr "" +msgstr "Το πρόσθετο δεν είναι εγκατεστημένο" #: src/tables/plugin/PluginListTable.tsx:78 #: src/tables/settings/ExportSessionTable.tsx:33 msgid "Plugin" -msgstr "" +msgstr "Plugin" #: src/tables/plugin/PluginListTable.tsx:95 #~ msgid "Plugin with key {pluginKey} not found" @@ -10814,7 +10842,7 @@ msgstr "" #: src/tables/plugin/PluginListTable.tsx:106 #: src/tables/plugin/PluginListTable.tsx:422 msgid "Mandatory" -msgstr "" +msgstr "Υποχρεωτικό" #: src/tables/plugin/PluginListTable.tsx:113 #~ msgid "Plugin with id {id} not found" @@ -10822,7 +10850,7 @@ msgstr "" #: src/tables/plugin/PluginListTable.tsx:120 msgid "Description not available" -msgstr "" +msgstr "Δεν υπάρχει διαθέσιμη περιγραφή" #: src/tables/plugin/PluginListTable.tsx:122 #~ msgid "Plugin information" @@ -10844,19 +10872,19 @@ msgstr "" #: src/tables/plugin/PluginListTable.tsx:153 msgid "Confirm plugin activation" -msgstr "" +msgstr "Επιβεβαίωση ενεργοποίησης plugin" #: src/tables/plugin/PluginListTable.tsx:154 msgid "Confirm plugin deactivation" -msgstr "" +msgstr "Επιβεβαίωση απενεργοποίησης plugin" #: src/tables/plugin/PluginListTable.tsx:159 msgid "The selected plugin will be activated" -msgstr "" +msgstr "Το επιλεγμένο plugin θα ενεργοποιηθεί" #: src/tables/plugin/PluginListTable.tsx:160 msgid "The selected plugin will be deactivated" -msgstr "" +msgstr "Το επιλεγμένο plugin θα απενεργοποιηθεί" #: src/tables/plugin/PluginListTable.tsx:163 #~ msgid "Package information" @@ -10864,15 +10892,15 @@ msgstr "" #: src/tables/plugin/PluginListTable.tsx:178 msgid "Deactivate" -msgstr "" +msgstr "Απενεργοποίηση" #: src/tables/plugin/PluginListTable.tsx:192 msgid "Activate" -msgstr "" +msgstr "Ενεργοποίηση" #: src/tables/plugin/PluginListTable.tsx:193 msgid "Activate selected plugin" -msgstr "" +msgstr "Ενεργοποίηση επιλεγμένου plugin" #: src/tables/plugin/PluginListTable.tsx:197 #~ msgid "Plugin settings" @@ -10880,32 +10908,32 @@ msgstr "" #: src/tables/plugin/PluginListTable.tsx:205 msgid "Update selected plugin" -msgstr "" +msgstr "Ενημέρωση επιλεγμένου plugin" #: src/tables/plugin/PluginListTable.tsx:224 #: src/tables/stock/InstalledItemsTable.tsx:107 msgid "Uninstall" -msgstr "" +msgstr "Απεγκατάσταση" #: src/tables/plugin/PluginListTable.tsx:225 msgid "Uninstall selected plugin" -msgstr "" +msgstr "Απεγκατάσταση επιλεγμένου plugin" #: src/tables/plugin/PluginListTable.tsx:244 msgid "Delete selected plugin configuration" -msgstr "" +msgstr "Διαγραφή ρυθμίσεων του επιλεγμένου plugin" #: src/tables/plugin/PluginListTable.tsx:260 msgid "Activate Plugin" -msgstr "" +msgstr "Ενεργοποίηση Plugin" #: src/tables/plugin/PluginListTable.tsx:267 msgid "The plugin was activated" -msgstr "" +msgstr "Το plugin ενεργοποιήθηκε" #: src/tables/plugin/PluginListTable.tsx:268 msgid "The plugin was deactivated" -msgstr "" +msgstr "Το plugin απενεργοποιήθηκε" #: src/tables/plugin/PluginListTable.tsx:280 #~ msgid "Install plugin" @@ -10914,19 +10942,19 @@ msgstr "" #: src/tables/plugin/PluginListTable.tsx:281 #: src/tables/plugin/PluginListTable.tsx:368 msgid "Install Plugin" -msgstr "" +msgstr "Εγκατάσταση Plugin" #: src/tables/plugin/PluginListTable.tsx:294 msgid "Install" -msgstr "" +msgstr "Εγκατάσταση" #: src/tables/plugin/PluginListTable.tsx:295 msgid "Plugin installed successfully" -msgstr "" +msgstr "Το plugin εγκαταστάθηκε με επιτυχία" #: src/tables/plugin/PluginListTable.tsx:300 msgid "Uninstall Plugin" -msgstr "" +msgstr "Απεγκατάσταση Plugin" #: src/tables/plugin/PluginListTable.tsx:308 #~ msgid "This action cannot be undone." @@ -10934,23 +10962,23 @@ msgstr "" #: src/tables/plugin/PluginListTable.tsx:312 msgid "Confirm plugin uninstall" -msgstr "" +msgstr "Επιβεβαίωση απεγκατάστασης plugin" #: src/tables/plugin/PluginListTable.tsx:315 msgid "The selected plugin will be uninstalled." -msgstr "" +msgstr "Το επιλεγμένο plugin θα απεγκατασταθεί." #: src/tables/plugin/PluginListTable.tsx:320 msgid "Plugin uninstalled successfully" -msgstr "" +msgstr "Το plugin απεγκαταστάθηκε με επιτυχία" #: src/tables/plugin/PluginListTable.tsx:328 msgid "Delete Plugin" -msgstr "" +msgstr "Διαγραφή Plugin" #: src/tables/plugin/PluginListTable.tsx:329 msgid "Deleting this plugin configuration will remove all associated settings and data. Are you sure you want to delete this plugin?" -msgstr "" +msgstr "Η διαγραφή αυτής της ρύθμισης plugin θα αφαιρέσει όλες τις συνδεδεμένες ρυθμίσεις και δεδομένα. Είστε βέβαιοι ότι θέλετε να διαγράψετε αυτό το plugin;" #: src/tables/plugin/PluginListTable.tsx:338 #~ msgid "Deactivate Plugin" @@ -10958,11 +10986,11 @@ msgstr "" #: src/tables/plugin/PluginListTable.tsx:342 msgid "Plugins reloaded" -msgstr "" +msgstr "Τα plugins φορτώθηκαν ξανά" #: src/tables/plugin/PluginListTable.tsx:343 msgid "Plugins were reloaded successfully" -msgstr "" +msgstr "Τα plugins φορτώθηκαν ξανά με επιτυχία" #: src/tables/plugin/PluginListTable.tsx:354 #~ msgid "The following plugin will be activated" @@ -10974,7 +11002,7 @@ msgstr "" #: src/tables/plugin/PluginListTable.tsx:361 msgid "Reload Plugins" -msgstr "" +msgstr "Επαναφόρτωση Plugins" #: src/tables/plugin/PluginListTable.tsx:376 #~ msgid "Activating plugin" @@ -10986,7 +11014,7 @@ msgstr "" #: src/tables/plugin/PluginListTable.tsx:385 msgid "Plugin Detail" -msgstr "" +msgstr "Λεπτομέρειες Plugin" #: src/tables/plugin/PluginListTable.tsx:392 #~ msgid "Plugin updated" @@ -10998,12 +11026,12 @@ msgstr "" #: src/tables/plugin/PluginListTable.tsx:427 msgid "Sample" -msgstr "" +msgstr "Δείγμα" #: src/tables/plugin/PluginListTable.tsx:432 #: src/tables/stock/StockItemTable.tsx:372 msgid "Installed" -msgstr "" +msgstr "Εγκατεστημένο" #: src/tables/plugin/PluginListTable.tsx:615 #~ msgid "Plugin detail" @@ -11016,7 +11044,7 @@ msgstr "" #: src/tables/purchasing/ManufacturerPartParameterTable.tsx:63 #: src/tables/purchasing/ManufacturerPartParameterTable.tsx:112 msgid "Add Parameter" -msgstr "" +msgstr "Προσθήκη παραμέτρου" #: src/tables/purchasing/ManufacturerPartParameterTable.tsx:73 #~ msgid "Parameter deleted" @@ -11024,7 +11052,7 @@ msgstr "" #: src/tables/purchasing/ManufacturerPartParameterTable.tsx:74 msgid "Edit Parameter" -msgstr "" +msgstr "Επεξεργασία παραμέτρου" #: src/tables/purchasing/ManufacturerPartParameterTable.tsx:74 #~ msgid "Are you sure you want to delete this parameter?" @@ -11032,7 +11060,7 @@ msgstr "" #: src/tables/purchasing/ManufacturerPartParameterTable.tsx:82 msgid "Delete Parameter" -msgstr "" +msgstr "Διαγραφή παραμέτρου" #: src/tables/purchasing/ManufacturerPartTable.tsx:63 #~ msgid "Create Manufacturer Part" @@ -11041,7 +11069,7 @@ msgstr "" #: src/tables/purchasing/ManufacturerPartTable.tsx:82 #: src/tables/purchasing/SupplierPartTable.tsx:99 msgid "MPN" -msgstr "" +msgstr "MPN" #: src/tables/purchasing/ManufacturerPartTable.tsx:100 #~ msgid "Manufacturer part updated" @@ -11058,40 +11086,40 @@ msgstr "" #: src/tables/purchasing/ManufacturerPartTable.tsx:134 #: src/tables/purchasing/SupplierPartTable.tsx:220 msgid "Active Part" -msgstr "" +msgstr "Ενεργό προϊόν" #: src/tables/purchasing/ManufacturerPartTable.tsx:135 msgid "Show manufacturer parts for active internal parts." -msgstr "" +msgstr "Εμφάνιση προϊόντων κατασκευαστή για ενεργά εσωτερικά προϊόντα." #: src/tables/purchasing/ManufacturerPartTable.tsx:140 msgid "Active Manufacturer" -msgstr "" +msgstr "Ενεργός κατασκευαστής" #: src/tables/purchasing/ManufacturerPartTable.tsx:142 msgid "Show manufacturer parts for active manufacturers." -msgstr "" +msgstr "Εμφάνιση προϊόντων για ενεργούς κατασκευαστές." #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:115 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:397 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:399 msgid "Import Line Items" -msgstr "" +msgstr "Εισαγωγή γραμμών παραγγελίας" #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:237 msgid "Supplier Code" -msgstr "" +msgstr "Κωδικός προμηθευτή" #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:244 msgid "Supplier Link" -msgstr "" +msgstr "Σύνδεσμος προμηθευτή" #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:251 msgid "Manufacturer Code" -msgstr "" +msgstr "Κωδικός κατασκευαστή" #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:284 msgid "Show line items which have been received" -msgstr "" +msgstr "Εμφάνιση γραμμών που έχουν παραληφθεί" #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:344 #: src/tables/sales/ReturnOrderLineItemTable.tsx:160 @@ -11099,21 +11127,21 @@ msgstr "" #~ msgid "Add line item" #~ msgstr "Add line item" -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:350 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:352 msgid "Receive line item" -msgstr "" +msgstr "Παραλαβή γραμμής" -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:414 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:416 msgid "Receive items" -msgstr "" +msgstr "Παραλαβή Προϊόντων" #: src/tables/purchasing/SupplierPartTable.tsx:129 msgid "Base units" -msgstr "" +msgstr "Βασικές μονάδες" #: src/tables/purchasing/SupplierPartTable.tsx:192 msgid "Add supplier part" -msgstr "" +msgstr "Προσθήκη προϊόντος προμηθευτή" #: src/tables/purchasing/SupplierPartTable.tsx:193 #~ msgid "Supplier part updated" @@ -11121,7 +11149,7 @@ msgstr "" #: src/tables/purchasing/SupplierPartTable.tsx:200 msgid "Import supplier part" -msgstr "" +msgstr "Εισαγωγή προϊόντος προμηθευτή" #: src/tables/purchasing/SupplierPartTable.tsx:205 #~ msgid "Supplier part deleted" @@ -11133,95 +11161,95 @@ msgstr "" #: src/tables/purchasing/SupplierPartTable.tsx:216 msgid "Show active supplier parts" -msgstr "" +msgstr "Εμφάνιση ενεργών προϊόντων προμηθευτή" #: src/tables/purchasing/SupplierPartTable.tsx:221 msgid "Show active internal parts" -msgstr "" +msgstr "Εμφάνιση ενεργών εσωτερικών προϊόντων" #: src/tables/purchasing/SupplierPartTable.tsx:225 msgid "Active Supplier" -msgstr "" +msgstr "Ενεργός προμηθευτής" #: src/tables/purchasing/SupplierPartTable.tsx:226 msgid "Show active suppliers" -msgstr "" +msgstr "Εμφάνιση ενεργών προμηθευτών" #: src/tables/purchasing/SupplierPartTable.tsx:231 msgid "Show supplier parts with stock" -msgstr "" +msgstr "Εμφάνιση προϊόντων προμηθευτή με απόθεμα" #: src/tables/sales/ReturnOrderLineItemTable.tsx:158 msgid "Received Date" -msgstr "" +msgstr "Ημερομηνία παραλαβής" #: src/tables/sales/ReturnOrderLineItemTable.tsx:172 msgid "Show items which have been received" -msgstr "" +msgstr "Εμφάνιση Προϊόντων που έχουν παραληφθεί" #: src/tables/sales/ReturnOrderLineItemTable.tsx:177 msgid "Filter by line item status" -msgstr "" +msgstr "Φιλτράρισμα βάσει κατάστασης γραμμής" #: src/tables/sales/ReturnOrderLineItemTable.tsx:195 msgid "Receive selected items" -msgstr "" +msgstr "Παραλαβή επιλεγμένων Προϊόντων" #: src/tables/sales/ReturnOrderLineItemTable.tsx:230 msgid "Receive Item" -msgstr "" +msgstr "Παραλαβή Προϊόντος" #: src/tables/sales/SalesOrderAllocationTable.tsx:89 msgid "Show outstanding allocations" -msgstr "" +msgstr "Εμφάνιση μη ολοκληρωμένων δεσμεύσεων" #: src/tables/sales/SalesOrderAllocationTable.tsx:93 msgid "Assigned to Shipment" -msgstr "" +msgstr "Ανατέθηκε σε αποστολή" #: src/tables/sales/SalesOrderAllocationTable.tsx:94 msgid "Show allocations assigned to a shipment" -msgstr "" +msgstr "Εμφάνιση δεσμεύσεων που έχουν ανατεθεί σε αποστολή" #: src/tables/sales/SalesOrderAllocationTable.tsx:156 msgid "Available Quantity" -msgstr "" +msgstr "Διαθέσιμη ποσότητα" #: src/tables/sales/SalesOrderAllocationTable.tsx:163 msgid "Allocated Quantity" -msgstr "" +msgstr "Δεσμευμένη ποσότητα" #: src/tables/sales/SalesOrderAllocationTable.tsx:177 #: src/tables/sales/SalesOrderAllocationTable.tsx:191 msgid "No shipment" -msgstr "" +msgstr "Καμία αποστολή" #: src/tables/sales/SalesOrderAllocationTable.tsx:189 msgid "Not shipped" -msgstr "" +msgstr "Δεν έχει αποσταλεί" #: src/tables/sales/SalesOrderAllocationTable.tsx:211 -#: src/tables/sales/SalesOrderAllocationTable.tsx:229 +#: src/tables/sales/SalesOrderAllocationTable.tsx:235 msgid "Edit Allocation" -msgstr "" +msgstr "Επεξεργασία δέσμευσης" #: src/tables/sales/SalesOrderAllocationTable.tsx:218 #: src/tables/sales/SalesOrderAllocationTable.tsx:241 -msgid "Delete Allocation" -msgstr "" +#~ msgid "Delete Allocation" +#~ msgstr "Delete Allocation" -#: src/tables/sales/SalesOrderAllocationTable.tsx:252 -#: src/tables/sales/SalesOrderAllocationTable.tsx:253 +#: src/tables/sales/SalesOrderAllocationTable.tsx:261 +#: src/tables/sales/SalesOrderAllocationTable.tsx:262 msgid "View Shipment" -msgstr "" +msgstr "Προβολή αποστολής" -#: src/tables/sales/SalesOrderAllocationTable.tsx:308 +#: src/tables/sales/SalesOrderAllocationTable.tsx:317 msgid "Assign to Shipment" -msgstr "" +msgstr "Ανάθεση σε αποστολή" -#: src/tables/sales/SalesOrderAllocationTable.tsx:324 +#: src/tables/sales/SalesOrderAllocationTable.tsx:333 msgid "Assign to shipment" -msgstr "" +msgstr "Ανάθεση σε αποστολή" #: src/tables/sales/SalesOrderLineItemTable.tsx:280 #~ msgid "Allocate stock" @@ -11233,27 +11261,27 @@ msgstr "" #: src/tables/sales/SalesOrderLineItemTable.tsx:293 msgid "Allocate Serial Numbers" -msgstr "" +msgstr "Δέσμευση σειριακών αριθμών" #: src/tables/sales/SalesOrderLineItemTable.tsx:343 msgid "Show lines which are fully allocated" -msgstr "" +msgstr "Εμφάνιση γραμμών με πλήρη δέσμευση" #: src/tables/sales/SalesOrderLineItemTable.tsx:348 msgid "Show lines which are completed" -msgstr "" +msgstr "Εμφάνιση ολοκληρωμένων γραμμών" #: src/tables/sales/SalesOrderLineItemTable.tsx:421 msgid "Allocate serials" -msgstr "" +msgstr "Δέσμευση σειριακών" #: src/tables/sales/SalesOrderLineItemTable.tsx:439 msgid "Build stock" -msgstr "" +msgstr "Παραγωγή αποθέματος" #: src/tables/sales/SalesOrderLineItemTable.tsx:457 msgid "Order stock" -msgstr "" +msgstr "Παραγγελία αποθέματος" #: src/tables/sales/SalesOrderShipmentTable.tsx:51 #~ msgid "Delete Shipment" @@ -11261,136 +11289,136 @@ msgstr "" #: src/tables/sales/SalesOrderShipmentTable.tsx:72 msgid "Create Shipment" -msgstr "" +msgstr "Δημιουργία αποστολής" #: src/tables/sales/SalesOrderShipmentTable.tsx:143 msgid "Items" -msgstr "" +msgstr "Προϊόντα" #: src/tables/sales/SalesOrderShipmentTable.tsx:203 msgid "Edit shipment" -msgstr "" +msgstr "Επεξεργασία αποστολής" #: src/tables/sales/SalesOrderShipmentTable.tsx:211 msgid "Cancel shipment" -msgstr "" +msgstr "Ακύρωση αποστολής" #: src/tables/sales/SalesOrderShipmentTable.tsx:241 msgid "Add shipment" -msgstr "" +msgstr "Προσθήκη αποστολής" #: src/tables/sales/SalesOrderShipmentTable.tsx:255 msgid "Show shipments which have been checked" -msgstr "" +msgstr "Εμφάνιση ελεγμένων αποστολών" #: src/tables/sales/SalesOrderShipmentTable.tsx:260 msgid "Show shipments which have been shipped" -msgstr "" +msgstr "Εμφάνιση αποστολών που έχουν σταλεί" #: src/tables/sales/SalesOrderShipmentTable.tsx:265 msgid "Show shipments which have been delivered" -msgstr "" +msgstr "Εμφάνιση παραδομένων αποστολών" #: src/tables/settings/ApiTokenTable.tsx:30 #: src/tables/settings/ApiTokenTable.tsx:44 msgid "Generate Token" -msgstr "" +msgstr "Δημιουργία token" #: src/tables/settings/ApiTokenTable.tsx:32 msgid "Token generated" -msgstr "" +msgstr "Το token δημιουργήθηκε" #: src/tables/settings/ApiTokenTable.tsx:67 #: src/tables/settings/ApiTokenTable.tsx:117 msgid "Revoked" -msgstr "" +msgstr "Ανακλημένο" #: src/tables/settings/ApiTokenTable.tsx:71 #: src/tables/settings/ApiTokenTable.tsx:179 msgid "Token" -msgstr "" +msgstr "Token" #: src/tables/settings/ApiTokenTable.tsx:78 msgid "In Use" -msgstr "" +msgstr "Σε χρήση" #: src/tables/settings/ApiTokenTable.tsx:87 msgid "Last Seen" -msgstr "" +msgstr "Τελευταία εμφάνιση" #: src/tables/settings/ApiTokenTable.tsx:92 msgid "Expiry" -msgstr "" +msgstr "Λήξη" #: src/tables/settings/ApiTokenTable.tsx:118 msgid "Show revoked tokens" -msgstr "" +msgstr "Εμφάνιση ανακλημένων tokens" #: src/tables/settings/ApiTokenTable.tsx:137 msgid "Revoke" -msgstr "" +msgstr "Ανάκληση" #: src/tables/settings/ApiTokenTable.tsx:161 msgid "Error revoking token" -msgstr "" +msgstr "Σφάλμα κατά την ανάκληση token" #: src/tables/settings/ApiTokenTable.tsx:183 msgid "Tokens are only shown once - make sure to note it down." -msgstr "" +msgstr "Τα tokens εμφανίζονται μόνο μία φορά — σημειώστε τα." #: src/tables/settings/BarcodeScanHistoryTable.tsx:60 msgid "Barcode Information" -msgstr "" +msgstr "Πληροφορίες barcode" #: src/tables/settings/BarcodeScanHistoryTable.tsx:85 msgid "Endpoint" -msgstr "" +msgstr "Endpoint" #: src/tables/settings/BarcodeScanHistoryTable.tsx:89 #: src/tables/settings/BarcodeScanHistoryTable.tsx:208 #: src/tables/stock/StockItemTestResultTable.tsx:191 msgid "Result" -msgstr "" +msgstr "Αποτέλεσμα" #: src/tables/settings/BarcodeScanHistoryTable.tsx:97 msgid "Context" -msgstr "" +msgstr "Συμφραζόμενα" #: src/tables/settings/BarcodeScanHistoryTable.tsx:118 msgid "Response" -msgstr "" +msgstr "Απόκριση" #: src/tables/settings/BarcodeScanHistoryTable.tsx:209 msgid "Filter by result" -msgstr "" +msgstr "Φιλτράρισμα βάσει αποτελέσματος" #: src/tables/settings/BarcodeScanHistoryTable.tsx:223 msgid "Delete Barcode Scan Record" -msgstr "" +msgstr "Διαγραφή καταγραφής barcode" #: src/tables/settings/BarcodeScanHistoryTable.tsx:249 msgid "Barcode Scan Details" -msgstr "" +msgstr "Λεπτομέρειες σάρωσης barcode" #: src/tables/settings/BarcodeScanHistoryTable.tsx:259 msgid "Logging Disabled" -msgstr "" +msgstr "Η καταγραφή είναι απενεργοποιημένη" #: src/tables/settings/BarcodeScanHistoryTable.tsx:261 msgid "Barcode logging is not enabled" -msgstr "" +msgstr "Η καταγραφή barcode δεν είναι ενεργή" #: src/tables/settings/CustomStateTable.tsx:63 msgid "Status Group" -msgstr "" +msgstr "Ομάδα κατάστασης" #: src/tables/settings/CustomStateTable.tsx:84 msgid "Logical State" -msgstr "" +msgstr "Λογική κατάσταση" #: src/tables/settings/CustomStateTable.tsx:96 msgid "Identifier" -msgstr "" +msgstr "Αναγνωριστικό" #: src/tables/settings/CustomStateTable.tsx:115 #~ msgid "Add state" @@ -11398,88 +11426,88 @@ msgstr "" #: src/tables/settings/CustomStateTable.tsx:153 msgid "Edit State" -msgstr "" +msgstr "Επεξεργασία κατάστασης" #: src/tables/settings/CustomStateTable.tsx:161 msgid "Delete State" -msgstr "" +msgstr "Διαγραφή κατάστασης" #: src/tables/settings/CustomUnitsTable.tsx:54 msgid "Add Custom Unit" -msgstr "" +msgstr "Προσθήκη προσαρμοσμένης μονάδας" #: src/tables/settings/CustomUnitsTable.tsx:64 msgid "Edit Custom Unit" -msgstr "" +msgstr "Επεξεργασία προσαρμοσμένης μονάδας" #: src/tables/settings/CustomUnitsTable.tsx:72 msgid "Delete Custom Unit" -msgstr "" +msgstr "Διαγραφή προσαρμοσμένης μονάδας" #: src/tables/settings/CustomUnitsTable.tsx:103 msgid "Add custom unit" -msgstr "" +msgstr "Προσθήκη προσαρμοσμένης μονάδας" #: src/tables/settings/EmailTable.tsx:25 msgid "Announced" -msgstr "" +msgstr "Ανακοινώθηκε" #: src/tables/settings/EmailTable.tsx:27 msgid "Sent" -msgstr "" +msgstr "Εστάλη" #: src/tables/settings/EmailTable.tsx:29 msgid "Failed" -msgstr "" +msgstr "Απέτυχε" #: src/tables/settings/EmailTable.tsx:33 msgid "Read" -msgstr "" +msgstr "Αναγνώστηκε" #: src/tables/settings/EmailTable.tsx:35 msgid "Confirmed" -msgstr "" +msgstr "Επιβεβαιώθηκε" #: src/tables/settings/EmailTable.tsx:43 #: src/tables/settings/EmailTable.tsx:58 msgid "Send Test Email" -msgstr "" +msgstr "Αποστολή δοκιμαστικού email" #: src/tables/settings/EmailTable.tsx:45 msgid "Email sent successfully" -msgstr "" +msgstr "Το email στάλθηκε επιτυχώς" #: src/tables/settings/EmailTable.tsx:71 msgid "Delete Email" -msgstr "" +msgstr "Διαγραφή email" #: src/tables/settings/EmailTable.tsx:72 msgid "Email deleted successfully" -msgstr "" +msgstr "Το email διαγράφηκε επιτυχώς" #: src/tables/settings/EmailTable.tsx:80 msgid "Subject" -msgstr "" +msgstr "Θέμα" #: src/tables/settings/EmailTable.tsx:85 msgid "To" -msgstr "" +msgstr "Προς" #: src/tables/settings/EmailTable.tsx:90 msgid "Sender" -msgstr "" +msgstr "Αποστολέας" #: src/tables/settings/EmailTable.tsx:122 msgid "Direction" -msgstr "" +msgstr "Κατεύθυνση" #: src/tables/settings/EmailTable.tsx:125 msgid "Incoming" -msgstr "" +msgstr "Εισερχόμενο" #: src/tables/settings/EmailTable.tsx:125 msgid "Outgoing" -msgstr "" +msgstr "Εξερχόμενο" #: src/tables/settings/ErrorTable.tsx:51 #~ msgid "Delete error report" @@ -11487,85 +11515,85 @@ msgstr "" #: src/tables/settings/ErrorTable.tsx:67 msgid "Traceback" -msgstr "" +msgstr "Ιχνηλάτηση" #: src/tables/settings/ErrorTable.tsx:103 msgid "When" -msgstr "" +msgstr "Πότε" #: src/tables/settings/ErrorTable.tsx:113 msgid "Error Information" -msgstr "" +msgstr "Πληροφορίες σφάλματος" #: src/tables/settings/ErrorTable.tsx:123 msgid "Delete Error Report" -msgstr "" +msgstr "Διαγραφή αναφοράς σφάλματος" #: src/tables/settings/ErrorTable.tsx:125 msgid "Are you sure you want to delete this error report?" -msgstr "" +msgstr "Είστε βέβαιοι ότι θέλετε να διαγράψετε αυτήν την αναφορά σφάλματος;" #: src/tables/settings/ErrorTable.tsx:127 msgid "Error report deleted" -msgstr "" +msgstr "Η αναφορά σφάλματος διαγράφηκε" #: src/tables/settings/ErrorTable.tsx:146 #: src/tables/settings/FailedTasksTable.tsx:65 msgid "Error Details" -msgstr "" +msgstr "Λεπτομέρειες σφάλματος" #: src/tables/settings/ExportSessionTable.tsx:28 msgid "Output Type" -msgstr "" +msgstr "Τύπος εξόδου" #: src/tables/settings/ExportSessionTable.tsx:38 msgid "Exported On" -msgstr "" +msgstr "Εξήχθη στις" #: src/tables/settings/ExportSessionTable.tsx:59 msgid "Delete Output" -msgstr "" +msgstr "Διαγραφή εξόδου" #: src/tables/settings/FailedTasksTable.tsx:32 #: src/tables/settings/PendingTasksTable.tsx:28 #: src/tables/settings/ScheduledTasksTable.tsx:19 msgid "Task" -msgstr "" +msgstr "Εργασία" #: src/tables/settings/FailedTasksTable.tsx:38 #: src/tables/settings/PendingTasksTable.tsx:33 msgid "Task ID" -msgstr "" +msgstr "ID εργασίας" #: src/tables/settings/FailedTasksTable.tsx:42 #: src/tables/stock/StockItemTestResultTable.tsx:233 msgid "Started" -msgstr "" +msgstr "Ξεκίνησε" #: src/tables/settings/FailedTasksTable.tsx:54 msgid "Attempts" -msgstr "" +msgstr "Προσπάθειες" #: src/tables/settings/FailedTasksTable.tsx:92 msgid "No Information" -msgstr "" +msgstr "Καμία πληροφορία" #: src/tables/settings/FailedTasksTable.tsx:93 msgid "No error details are available for this task" -msgstr "" +msgstr "Δεν υπάρχουν διαθέσιμες λεπτομέρειες σφάλματος για αυτήν την εργασία" #: src/tables/settings/GroupTable.tsx:71 msgid "Group with id {id} not found" -msgstr "" +msgstr "Δεν βρέθηκε ομάδα με id {id}" #: src/tables/settings/GroupTable.tsx:73 msgid "An error occurred while fetching group details" -msgstr "" +msgstr "Παρουσιάστηκε σφάλμα κατά την ανάκτηση λεπτομερειών ομάδας" #: src/tables/settings/GroupTable.tsx:96 #: src/tables/settings/GroupTable.tsx:257 msgid "Name of the user group" -msgstr "" +msgstr "Όνομα ομάδας χρηστών" #: src/tables/settings/GroupTable.tsx:117 #~ msgid "Permission set" @@ -11574,23 +11602,23 @@ msgstr "" #: src/tables/settings/GroupTable.tsx:170 #: src/tables/settings/UserTable.tsx:315 msgid "Open Profile" -msgstr "" +msgstr "Άνοιγμα προφίλ" #: src/tables/settings/GroupTable.tsx:185 msgid "Delete group" -msgstr "" +msgstr "Διαγραφή ομάδας" #: src/tables/settings/GroupTable.tsx:186 msgid "Group deleted" -msgstr "" +msgstr "Η ομάδα διαγράφηκε" #: src/tables/settings/GroupTable.tsx:188 msgid "Are you sure you want to delete this group?" -msgstr "" +msgstr "Είστε βέβαιοι ότι θέλετε να διαγράψετε αυτήν την ομάδα;" #: src/tables/settings/GroupTable.tsx:200 msgid "Add group" -msgstr "" +msgstr "Προσθήκη ομάδας" #: src/tables/settings/GroupTable.tsx:213 #~ msgid "Edit group" @@ -11598,78 +11626,78 @@ msgstr "" #: src/tables/settings/GroupTable.tsx:221 msgid "Edit Group" -msgstr "" +msgstr "Επεξεργασία ομάδας" #: src/tables/settings/GroupTable.tsx:253 msgid "Add Group" -msgstr "" +msgstr "Προσθήκη ομάδας" #: src/tables/settings/ImportSessionTable.tsx:38 msgid "Delete Import Session" -msgstr "" +msgstr "Διαγραφή συνεδρίας εισαγωγής" #: src/tables/settings/ImportSessionTable.tsx:44 #: src/tables/settings/ImportSessionTable.tsx:129 msgid "Create Import Session" -msgstr "" +msgstr "Δημιουργία συνεδρίας εισαγωγής" #: src/tables/settings/ImportSessionTable.tsx:72 msgid "Uploaded" -msgstr "" +msgstr "Μεταφορτώθηκε" #: src/tables/settings/ImportSessionTable.tsx:83 msgid "Imported Rows" -msgstr "" +msgstr "Γραμμές που εισήχθησαν" #: src/tables/settings/ImportSessionTable.tsx:111 #: src/tables/settings/TemplateTable.tsx:368 msgid "Model Type" -msgstr "" +msgstr "Τύπος μοντέλου" #: src/tables/settings/ImportSessionTable.tsx:112 #: src/tables/settings/TemplateTable.tsx:369 msgid "Filter by target model type" -msgstr "" +msgstr "Φιλτράρισμα κατά τύπο μοντέλου προορισμού" #: src/tables/settings/ImportSessionTable.tsx:118 msgid "Filter by import session status" -msgstr "" +msgstr "Φιλτράρισμα κατά κατάσταση συνεδρίας εισαγωγής" #: src/tables/settings/PendingTasksTable.tsx:47 msgid "Arguments" -msgstr "" +msgstr "Ορίσματα" #: src/tables/settings/PendingTasksTable.tsx:61 msgid "Remove all pending tasks" -msgstr "" +msgstr "Αφαίρεση όλων των εκκρεμών εργασιών" #: src/tables/settings/PendingTasksTable.tsx:69 msgid "All pending tasks deleted" -msgstr "" +msgstr "Όλες οι εκκρεμείς εργασίες διαγράφηκαν" #: src/tables/settings/PendingTasksTable.tsx:76 msgid "Error while deleting all pending tasks" -msgstr "" +msgstr "Σφάλμα κατά τη διαγραφή όλων των εκκρεμών εργασιών" #: src/tables/settings/ProjectCodeTable.tsx:58 msgid "Edit Project Code" -msgstr "" +msgstr "Επεξεργασία κωδικού έργου" #: src/tables/settings/ProjectCodeTable.tsx:66 msgid "Delete Project Code" -msgstr "" +msgstr "Διαγραφή κωδικού έργου" #: src/tables/settings/ProjectCodeTable.tsx:97 msgid "Add project code" -msgstr "" +msgstr "Προσθήκη κωδικού έργου" #: src/tables/settings/ScheduledTasksTable.tsx:28 msgid "Last Run" -msgstr "" +msgstr "Τελευταία εκτέλεση" #: src/tables/settings/ScheduledTasksTable.tsx:50 msgid "Next Run" -msgstr "" +msgstr "Επόμενη εκτέλεση" #: src/tables/settings/StocktakeReportTable.tsx:28 #~ msgid "Report" @@ -11697,11 +11725,11 @@ msgstr "" #: src/tables/settings/TemplateTable.tsx:165 msgid "Template not found" -msgstr "" +msgstr "Το πρότυπο δεν βρέθηκε" #: src/tables/settings/TemplateTable.tsx:167 msgid "An error occurred while fetching template details" -msgstr "" +msgstr "Παρουσιάστηκε σφάλμα κατά την ανάκτηση λεπτομερειών προτύπου" #: src/tables/settings/TemplateTable.tsx:243 #~ msgid "Add new" @@ -11713,32 +11741,32 @@ msgstr "" #: src/tables/settings/TemplateTable.tsx:261 msgid "Modify" -msgstr "" +msgstr "Τροποποίηση" #: src/tables/settings/TemplateTable.tsx:262 msgid "Modify template file" -msgstr "" +msgstr "Τροποποίηση αρχείου προτύπου" #: src/tables/settings/TemplateTable.tsx:313 #: src/tables/settings/TemplateTable.tsx:381 msgid "Edit Template" -msgstr "" +msgstr "Επεξεργασία προτύπου" #: src/tables/settings/TemplateTable.tsx:321 msgid "Delete template" -msgstr "" +msgstr "Διαγραφή προτύπου" #: src/tables/settings/TemplateTable.tsx:327 msgid "Add Template" -msgstr "" +msgstr "Προσθήκη προτύπου" #: src/tables/settings/TemplateTable.tsx:340 msgid "Add template" -msgstr "" +msgstr "Προσθήκη προτύπου" #: src/tables/settings/TemplateTable.tsx:363 msgid "Filter by enabled status" -msgstr "" +msgstr "Φιλτράρισμα κατά κατάσταση ενεργοποίησης" #: src/tables/settings/TemplateTable.tsx:420 #~ msgid "Report Output" @@ -11746,23 +11774,23 @@ msgstr "" #: src/tables/settings/UserTable.tsx:123 msgid "Groups updated" -msgstr "" +msgstr "Οι ομάδες ενημερώθηκαν" #: src/tables/settings/UserTable.tsx:124 msgid "User groups updated successfully" -msgstr "" +msgstr "Οι ομάδες χρήστη ενημερώθηκαν με επιτυχία" #: src/tables/settings/UserTable.tsx:131 msgid "Error updating user groups" -msgstr "" +msgstr "Σφάλμα κατά την ενημέρωση των ομάδων χρήστη" #: src/tables/settings/UserTable.tsx:150 msgid "User with id {id} not found" -msgstr "" +msgstr "Ο χρήστης με id {id} δεν βρέθηκε" #: src/tables/settings/UserTable.tsx:152 msgid "An error occurred while fetching user details" -msgstr "" +msgstr "Παρουσιάστηκε σφάλμα κατά την ανάκτηση των στοιχείων χρήστη" #: src/tables/settings/UserTable.tsx:154 #~ msgid "No groups" @@ -11770,35 +11798,35 @@ msgstr "" #: src/tables/settings/UserTable.tsx:178 msgid "Is Active" -msgstr "" +msgstr "Είναι ενεργός" #: src/tables/settings/UserTable.tsx:179 msgid "Designates whether this user should be treated as active. Unselect this instead of deleting accounts." -msgstr "" +msgstr "Ορίζει αν ο χρήστης θα θεωρείται ενεργός. Αποεπιλέξτε το αντί να διαγράψετε λογαριασμούς." #: src/tables/settings/UserTable.tsx:183 msgid "Is Staff" -msgstr "" +msgstr "Είναι προσωπικό" #: src/tables/settings/UserTable.tsx:184 msgid "Designates whether the user can log into the django admin site." -msgstr "" +msgstr "Ορίζει αν ο χρήστης μπορεί να συνδεθεί στο django admin." #: src/tables/settings/UserTable.tsx:188 msgid "Is Superuser" -msgstr "" +msgstr "Είναι υπερδιαχειριστής" #: src/tables/settings/UserTable.tsx:189 msgid "Designates that this user has all permissions without explicitly assigning them." -msgstr "" +msgstr "Ορίζει ότι αυτός ο χρήστης έχει όλα τα δικαιώματα χωρίς ρητή ανάθεσή τους." #: src/tables/settings/UserTable.tsx:199 msgid "You cannot edit the rights for the currently logged-in user." -msgstr "" +msgstr "Δεν μπορείτε να επεξεργαστείτε τα δικαιώματα του τρέχοντος συνδεδεμένου χρήστη." #: src/tables/settings/UserTable.tsx:218 msgid "User Groups" -msgstr "" +msgstr "Ομάδες χρηστών" #: src/tables/settings/UserTable.tsx:305 #~ msgid "Edit user" @@ -11806,153 +11834,153 @@ msgstr "" #: src/tables/settings/UserTable.tsx:332 msgid "Lock user" -msgstr "" +msgstr "Κλείδωμα χρήστη" #: src/tables/settings/UserTable.tsx:342 msgid "Unlock user" -msgstr "" +msgstr "Ξεκλείδωμα χρήστη" #: src/tables/settings/UserTable.tsx:358 msgid "Delete user" -msgstr "" +msgstr "Διαγραφή χρήστη" #: src/tables/settings/UserTable.tsx:359 msgid "User deleted" -msgstr "" +msgstr "Ο χρήστης διαγράφηκε" #: src/tables/settings/UserTable.tsx:362 msgid "Are you sure you want to delete this user?" -msgstr "" +msgstr "Είστε σίγουροι ότι θέλετε να διαγράψετε αυτόν τον χρήστη;" #: src/tables/settings/UserTable.tsx:372 msgid "Set Password" -msgstr "" +msgstr "Ορισμός κωδικού" #: src/tables/settings/UserTable.tsx:377 msgid "Password updated" -msgstr "" +msgstr "Ο κωδικός ενημερώθηκε" #: src/tables/settings/UserTable.tsx:388 msgid "Add user" -msgstr "" +msgstr "Προσθήκη χρήστη" #: src/tables/settings/UserTable.tsx:401 msgid "Show active users" -msgstr "" +msgstr "Εμφάνιση ενεργών χρηστών" #: src/tables/settings/UserTable.tsx:406 msgid "Show staff users" -msgstr "" +msgstr "Εμφάνιση χρηστών προσωπικού" #: src/tables/settings/UserTable.tsx:411 msgid "Show superusers" -msgstr "" +msgstr "Εμφάνιση υπερδιαχειριστών" #: src/tables/settings/UserTable.tsx:430 msgid "Edit User" -msgstr "" +msgstr "Επεξεργασία χρήστη" #: src/tables/settings/UserTable.tsx:463 msgid "Add User" -msgstr "" +msgstr "Προσθήκη χρήστη" #: src/tables/settings/UserTable.tsx:471 msgid "Added user" -msgstr "" +msgstr "Ο χρήστης προστέθηκε" #: src/tables/settings/UserTable.tsx:481 msgid "User updated" -msgstr "" +msgstr "Ο χρήστης ενημερώθηκε" #: src/tables/settings/UserTable.tsx:482 msgid "User updated successfully" -msgstr "" +msgstr "Ο χρήστης ενημερώθηκε με επιτυχία" #: src/tables/settings/UserTable.tsx:488 msgid "Error updating user" -msgstr "" +msgstr "Σφάλμα κατά την ενημέρωση χρήστη" #: src/tables/stock/InstalledItemsTable.tsx:38 #: src/tables/stock/InstalledItemsTable.tsx:90 msgid "Install Item" -msgstr "" +msgstr "Εγκατάσταση Προϊόντος" #: src/tables/stock/InstalledItemsTable.tsx:40 msgid "Item installed" -msgstr "" +msgstr "Το Προϊόν εγκαταστάθηκε" #: src/tables/stock/InstalledItemsTable.tsx:51 msgid "Uninstall Item" -msgstr "" +msgstr "Απεγκατάσταση Προϊόντος" #: src/tables/stock/InstalledItemsTable.tsx:53 msgid "Item uninstalled" -msgstr "" +msgstr "Το Προϊόν απεγκαταστάθηκε" #: src/tables/stock/InstalledItemsTable.tsx:108 msgid "Uninstall stock item" -msgstr "" +msgstr "Απεγκατάσταση αποθέματος" #: src/tables/stock/LocationTypesTable.tsx:44 #: src/tables/stock/LocationTypesTable.tsx:111 msgid "Add Location Type" -msgstr "" +msgstr "Προσθήκη τύπου τοποθεσίας" #: src/tables/stock/LocationTypesTable.tsx:52 msgid "Edit Location Type" -msgstr "" +msgstr "Επεξεργασία τύπου τοποθεσίας" #: src/tables/stock/LocationTypesTable.tsx:60 msgid "Delete Location Type" -msgstr "" +msgstr "Διαγραφή τύπου τοποθεσίας" #: src/tables/stock/LocationTypesTable.tsx:68 msgid "Icon" -msgstr "" +msgstr "Εικονίδιο" #: src/tables/stock/StockItemTable.tsx:106 msgid "This stock item is in production" -msgstr "" +msgstr "Αυτό το Προϊόν αποθέματος είναι σε παραγωγή" #: src/tables/stock/StockItemTable.tsx:113 msgid "This stock item has been assigned to a sales order" -msgstr "" +msgstr "Αυτό το Προϊόν αποθέματος έχει ανατεθεί σε παραγγελία πώλησης" #: src/tables/stock/StockItemTable.tsx:120 msgid "This stock item has been assigned to a customer" -msgstr "" +msgstr "Αυτό το Προϊόν αποθέματος έχει ανατεθεί σε πελάτη" #: src/tables/stock/StockItemTable.tsx:127 msgid "This stock item is installed in another stock item" -msgstr "" +msgstr "Αυτό το Προϊόν αποθέματος είναι εγκατεστημένο σε άλλο Προϊόν αποθέματος" #: src/tables/stock/StockItemTable.tsx:134 msgid "This stock item has been consumed by a build order" -msgstr "" +msgstr "Αυτό το Προϊόν αποθέματος έχει καταναλωθεί από εντολή παραγωγής" #: src/tables/stock/StockItemTable.tsx:141 msgid "This stock item is unavailable" -msgstr "" +msgstr "Αυτό το Προϊόν αποθέματος δεν είναι διαθέσιμο" #: src/tables/stock/StockItemTable.tsx:150 msgid "This stock item has expired" -msgstr "" +msgstr "Αυτό το Προϊόν αποθέματος έχει λήξει" #: src/tables/stock/StockItemTable.tsx:154 msgid "This stock item is stale" -msgstr "" +msgstr "Αυτό το Προϊόν αποθέματος είναι παλιό" #: src/tables/stock/StockItemTable.tsx:166 msgid "This stock item is fully allocated" -msgstr "" +msgstr "Αυτό το Προϊόν αποθέματος έχει πλήρως δεσμευτεί" #: src/tables/stock/StockItemTable.tsx:173 msgid "This stock item is partially allocated" -msgstr "" +msgstr "Αυτό το Προϊόν αποθέματος έχει μερικώς δεσμευτεί" #: src/tables/stock/StockItemTable.tsx:201 msgid "This stock item has been depleted" -msgstr "" +msgstr "Αυτό το Προϊόν αποθέματος έχει εξαντληθεί" #: src/tables/stock/StockItemTable.tsx:301 #~ msgid "Show stock for assmebled parts" @@ -11960,44 +11988,44 @@ msgstr "" #: src/tables/stock/StockItemTable.tsx:305 msgid "Stocktake Date" -msgstr "" +msgstr "Ημερομηνία απογραφής" #: src/tables/stock/StockItemTable.tsx:323 msgid "Show stock for active parts" -msgstr "" +msgstr "Εμφάνιση αποθέματος για ενεργά προϊόντα" #: src/tables/stock/StockItemTable.tsx:334 msgid "Show stock for assembled parts" -msgstr "" +msgstr "Εμφάνιση αποθέματος για συναρμολογημένα προϊόντα" #: src/tables/stock/StockItemTable.tsx:339 msgid "Show items which have been allocated" -msgstr "" +msgstr "Εμφάνιση Προϊόντων που έχουν δεσμευτεί" #: src/tables/stock/StockItemTable.tsx:344 msgid "Show items which are available" -msgstr "" +msgstr "Εμφάνιση διαθέσιμων Προϊόντων" #: src/tables/stock/StockItemTable.tsx:348 #: src/tables/stock/StockLocationTable.tsx:38 msgid "Include Sublocations" -msgstr "" +msgstr "Συμπερίληψη υποτοποθεσιών" #: src/tables/stock/StockItemTable.tsx:349 msgid "Include stock in sublocations" -msgstr "" +msgstr "Συμπερίληψη αποθέματος σε υποτοποθεσίες" #: src/tables/stock/StockItemTable.tsx:353 msgid "Depleted" -msgstr "" +msgstr "Εξαντλημένο" #: src/tables/stock/StockItemTable.tsx:354 msgid "Show depleted stock items" -msgstr "" +msgstr "Εμφάνιση εξαντλημένου αποθέματος" #: src/tables/stock/StockItemTable.tsx:360 msgid "Show items which are in production" -msgstr "" +msgstr "Εμφάνιση Προϊόντων σε παραγωγή" #: src/tables/stock/StockItemTable.tsx:362 #~ msgid "Include stock items for variant parts" @@ -12005,31 +12033,31 @@ msgstr "" #: src/tables/stock/StockItemTable.tsx:368 msgid "Show items which have been consumed by a build order" -msgstr "" +msgstr "Εμφάνιση Προϊόντων που έχουν καταναλωθεί από εντολή παραγωγής" #: src/tables/stock/StockItemTable.tsx:373 msgid "Show stock items which are installed in other items" -msgstr "" +msgstr "Εμφάνιση Προϊόντων αποθέματος που είναι εγκατεστημένα σε άλλα Προϊόντα" #: src/tables/stock/StockItemTable.tsx:377 msgid "Sent to Customer" -msgstr "" +msgstr "Απεσταλμένα σε πελάτη" #: src/tables/stock/StockItemTable.tsx:378 msgid "Show items which have been sent to a customer" -msgstr "" +msgstr "Εμφάνιση Προϊόντων που έχουν αποσταλεί σε πελάτη" #: src/tables/stock/StockItemTable.tsx:389 msgid "Show tracked items" -msgstr "" +msgstr "Εμφάνιση ιχνηλάσιμων Προϊόντων" #: src/tables/stock/StockItemTable.tsx:393 msgid "Has Purchase Price" -msgstr "" +msgstr "Έχει τιμή αγοράς" #: src/tables/stock/StockItemTable.tsx:394 msgid "Show items which have a purchase price" -msgstr "" +msgstr "Εμφάνιση Προϊόντων που έχουν τιμή αγοράς" #: src/tables/stock/StockItemTable.tsx:397 #~ msgid "Serial Number LTE" @@ -12037,7 +12065,7 @@ msgstr "" #: src/tables/stock/StockItemTable.tsx:399 msgid "Show items which have expired" -msgstr "" +msgstr "Εμφάνιση Προϊόντων που έχουν λήξει" #: src/tables/stock/StockItemTable.tsx:403 #~ msgid "Serial Number GTE" @@ -12045,63 +12073,63 @@ msgstr "" #: src/tables/stock/StockItemTable.tsx:405 msgid "Show items which are stale" -msgstr "" +msgstr "Εμφάνιση Προϊόντων που είναι παλαιωμένα" #: src/tables/stock/StockItemTable.tsx:410 msgid "Expired Before" -msgstr "" +msgstr "Έληξαν πριν από" #: src/tables/stock/StockItemTable.tsx:411 msgid "Show items which expired before this date" -msgstr "" +msgstr "Εμφάνιση Προϊόντων που έληξαν πριν από αυτή την ημερομηνία" #: src/tables/stock/StockItemTable.tsx:417 msgid "Expired After" -msgstr "" +msgstr "Έληξαν μετά από" #: src/tables/stock/StockItemTable.tsx:418 msgid "Show items which expired after this date" -msgstr "" +msgstr "Εμφάνιση Προϊόντων που έληξαν μετά από αυτή την ημερομηνία" #: src/tables/stock/StockItemTable.tsx:424 msgid "Updated Before" -msgstr "" +msgstr "Ενημερώθηκαν πριν από" #: src/tables/stock/StockItemTable.tsx:425 msgid "Show items updated before this date" -msgstr "" +msgstr "Εμφάνιση Προϊόντων που ενημερώθηκαν πριν από αυτή την ημερομηνία" #: src/tables/stock/StockItemTable.tsx:430 msgid "Updated After" -msgstr "" +msgstr "Ενημερώθηκαν μετά από" #: src/tables/stock/StockItemTable.tsx:431 msgid "Show items updated after this date" -msgstr "" +msgstr "Εμφάνιση Προϊόντων που ενημερώθηκαν μετά από αυτή την ημερομηνία" #: src/tables/stock/StockItemTable.tsx:436 msgid "Stocktake Before" -msgstr "" +msgstr "Απογραφή πριν από" #: src/tables/stock/StockItemTable.tsx:437 msgid "Show items counted before this date" -msgstr "" +msgstr "Εμφάνιση Προϊόντων που απογράφηκαν πριν από αυτή την ημερομηνία" #: src/tables/stock/StockItemTable.tsx:442 msgid "Stocktake After" -msgstr "" +msgstr "Απογραφή μετά από" #: src/tables/stock/StockItemTable.tsx:443 msgid "Show items counted after this date" -msgstr "" +msgstr "Εμφάνιση Προϊόντων που απογράφηκαν μετά από αυτή την ημερομηνία" #: src/tables/stock/StockItemTable.tsx:448 msgid "External Location" -msgstr "" +msgstr "Εξωτερική τοποθεσία" #: src/tables/stock/StockItemTable.tsx:449 msgid "Show items in an external location" -msgstr "" +msgstr "Εμφάνιση Προϊόντων σε εξωτερική τοποθεσία" #: src/tables/stock/StockItemTable.tsx:528 #~ msgid "Delete stock items" @@ -12109,7 +12137,7 @@ msgstr "" #: src/tables/stock/StockItemTable.tsx:559 msgid "Order items" -msgstr "" +msgstr "Παραγγελία Προϊόντων" #: src/tables/stock/StockItemTable.tsx:595 #~ msgid "Add a new stock item" @@ -12157,81 +12185,81 @@ msgstr "" #: src/tables/stock/StockItemTestResultTable.tsx:144 msgid "Test" -msgstr "" +msgstr "Τεστ" #: src/tables/stock/StockItemTestResultTable.tsx:180 msgid "Test result for installed stock item" -msgstr "" +msgstr "Αποτέλεσμα τεστ για εγκατεστημένο Προϊόν αποθέματος" #: src/tables/stock/StockItemTestResultTable.tsx:211 msgid "Attachment" -msgstr "" +msgstr "Συνημμένο" #: src/tables/stock/StockItemTestResultTable.tsx:227 msgid "Test station" -msgstr "" +msgstr "Σταθμός δοκιμής" #: src/tables/stock/StockItemTestResultTable.tsx:249 msgid "Finished" -msgstr "" +msgstr "Ολοκληρώθηκε" #: src/tables/stock/StockItemTestResultTable.tsx:307 #: src/tables/stock/StockItemTestResultTable.tsx:378 msgid "Edit Test Result" -msgstr "" +msgstr "Επεξεργασία αποτελέσματος τεστ" #: src/tables/stock/StockItemTestResultTable.tsx:309 msgid "Test result updated" -msgstr "" +msgstr "Το αποτέλεσμα του τεστ ενημερώθηκε" #: src/tables/stock/StockItemTestResultTable.tsx:315 #: src/tables/stock/StockItemTestResultTable.tsx:387 msgid "Delete Test Result" -msgstr "" +msgstr "Διαγραφή αποτελέσματος τεστ" #: src/tables/stock/StockItemTestResultTable.tsx:317 msgid "Test result deleted" -msgstr "" +msgstr "Το αποτέλεσμα του τεστ διαγράφηκε" #: src/tables/stock/StockItemTestResultTable.tsx:331 msgid "Test Passed" -msgstr "" +msgstr "Επιτυχής δοκιμή" #: src/tables/stock/StockItemTestResultTable.tsx:332 msgid "Test result has been recorded" -msgstr "" +msgstr "Το αποτέλεσμα του τεστ καταχωρήθηκε" #: src/tables/stock/StockItemTestResultTable.tsx:339 msgid "Failed to record test result" -msgstr "" +msgstr "Αποτυχία καταγραφής αποτελέσματος τεστ" #: src/tables/stock/StockItemTestResultTable.tsx:356 msgid "Pass Test" -msgstr "" +msgstr "Επιτυχής Δοκιμή" #: src/tables/stock/StockItemTestResultTable.tsx:405 msgid "Show results for required tests" -msgstr "" +msgstr "Εμφάνιση αποτελεσμάτων για υποχρεωτικά τεστ" #: src/tables/stock/StockItemTestResultTable.tsx:409 msgid "Include Installed" -msgstr "" +msgstr "Συμπερίληψη εγκατεστημένων" #: src/tables/stock/StockItemTestResultTable.tsx:410 msgid "Show results for installed stock items" -msgstr "" +msgstr "Εμφάνιση αποτελεσμάτων για εγκατεστημένα Προϊόντα" #: src/tables/stock/StockItemTestResultTable.tsx:414 msgid "Passed" -msgstr "" +msgstr "Επιτυχία" #: src/tables/stock/StockItemTestResultTable.tsx:415 msgid "Show only passed tests" -msgstr "" +msgstr "Εμφάνιση μόνο επιτυχημένων τεστ" #: src/tables/stock/StockItemTestResultTable.tsx:420 msgid "Show results for enabled tests" -msgstr "" +msgstr "Εμφάνιση αποτελεσμάτων για ενεργά τεστ" #: src/tables/stock/StockLocationTable.tsx:38 #~ msgid "structural" @@ -12239,7 +12267,7 @@ msgstr "" #: src/tables/stock/StockLocationTable.tsx:39 msgid "Include sublocations in results" -msgstr "" +msgstr "Συμπερίληψη υποτοποθεσιών στα αποτελέσματα" #: src/tables/stock/StockLocationTable.tsx:43 #~ msgid "external" @@ -12247,44 +12275,44 @@ msgstr "" #: src/tables/stock/StockLocationTable.tsx:44 msgid "Show structural locations" -msgstr "" +msgstr "Εμφάνιση δομικών τοποθεσιών" #: src/tables/stock/StockLocationTable.tsx:49 msgid "Show external locations" -msgstr "" +msgstr "Εμφάνιση εξωτερικών τοποθεσιών" #: src/tables/stock/StockLocationTable.tsx:53 msgid "Has location type" -msgstr "" +msgstr "Έχει τύπο τοποθεσίας" #: src/tables/stock/StockLocationTable.tsx:58 msgid "Filter by location type" -msgstr "" +msgstr "Φιλτράρισμα κατά τύπο τοποθεσίας" #: src/tables/stock/StockLocationTable.tsx:105 #: src/tables/stock/StockLocationTable.tsx:160 msgid "Add Stock Location" -msgstr "" +msgstr "Προσθήκη τοποθεσίας αποθέματος" #: src/tables/stock/StockLocationTable.tsx:129 msgid "Set Parent Location" -msgstr "" +msgstr "Ορισμός μητρικής τοποθεσίας" #: src/tables/stock/StockLocationTable.tsx:149 msgid "Set parent location for the selected items" -msgstr "" +msgstr "Ορισμός μητρικής τοποθεσίας για τα επιλεγμένα Προϊόντα" #: src/tables/stock/StockTrackingTable.tsx:77 msgid "Added" -msgstr "" +msgstr "Προστέθηκε" #: src/tables/stock/StockTrackingTable.tsx:82 msgid "Removed" -msgstr "" +msgstr "Αφαιρέθηκε" #: src/tables/stock/StockTrackingTable.tsx:221 msgid "No user information" -msgstr "" +msgstr "Δεν υπάρχουν πληροφορίες χρήστη" #: src/tables/stock/TestStatisticsTable.tsx:34 #: src/tables/stock/TestStatisticsTable.tsx:64 @@ -12293,7 +12321,7 @@ msgstr "" #: src/views/MobileAppView.tsx:25 msgid "Mobile viewport detected" -msgstr "" +msgstr "Ανιχνεύτηκε προβολή κινητού" #: src/views/MobileAppView.tsx:25 #~ msgid "Platform UI is optimized for Tablets and Desktops, you can use the official app for a mobile experience." @@ -12301,13 +12329,13 @@ msgstr "" #: src/views/MobileAppView.tsx:28 msgid "InvenTree UI is optimized for Tablets and Desktops, you can use the official app for a mobile experience." -msgstr "" +msgstr "Το περιβάλλον του InvenTree είναι βελτιστοποιημένο για Tablets και Desktops, μπορείτε να χρησιμοποιήσετε την επίσημη εφαρμογή για εμπειρία κινητού." #: src/views/MobileAppView.tsx:34 msgid "Read the docs" -msgstr "" +msgstr "Διαβάστε την τεκμηρίωση" #: src/views/MobileAppView.tsx:42 msgid "Ignore and continue to Desktop view" -msgstr "" +msgstr "Παράβλεψη και συνέχεια στην προβολή Desktop" diff --git a/src/frontend/src/locales/en/messages.po b/src/frontend/src/locales/en/messages.po index e3497aca87..6b2d1e0e2e 100644 --- a/src/frontend/src/locales/en/messages.po +++ b/src/frontend/src/locales/en/messages.po @@ -51,7 +51,7 @@ msgstr "Cancel" #: lib/components/RowActions.tsx:136 #: src/components/nav/NavigationDrawer.tsx:190 -#: src/forms/PurchaseOrderForms.tsx:802 +#: src/forms/PurchaseOrderForms.tsx:854 #: src/forms/StockForms.tsx:796 #: src/forms/StockForms.tsx:843 #: src/forms/StockForms.tsx:889 @@ -98,9 +98,9 @@ msgstr "No" #: src/forms/BuildForms.tsx:630 #: src/forms/BuildForms.tsx:793 #: src/forms/BuildForms.tsx:896 -#: src/forms/PurchaseOrderForms.tsx:798 +#: src/forms/PurchaseOrderForms.tsx:850 #: src/forms/ReturnOrderForms.tsx:242 -#: src/forms/SalesOrderForms.tsx:305 +#: src/forms/SalesOrderForms.tsx:323 #: src/forms/StockForms.tsx:360 #: src/forms/StockForms.tsx:791 #: src/forms/StockForms.tsx:838 @@ -114,6 +114,7 @@ msgstr "No" #: src/pages/build/BuildDetail.tsx:200 #: src/pages/part/PartDetail.tsx:1207 #: src/tables/ColumnRenderers.tsx:91 +#: src/tables/part/PartTestResultTable.tsx:247 #: src/tables/part/RelatedPartTable.tsx:53 #: src/tables/stock/StockTrackingTable.tsx:87 msgid "Part" @@ -153,7 +154,7 @@ msgstr "Part Test Templates" #: src/components/wizards/OrderPartsWizard.tsx:290 #: src/pages/company/SupplierPartDetail.tsx:413 #: src/pages/stock/StockDetail.tsx:289 -#: src/tables/build/BuildAllocatedStockTable.tsx:155 +#: src/tables/build/BuildAllocatedStockTable.tsx:152 #: src/tables/part/PartPurchaseOrdersTable.tsx:50 #: src/tables/purchasing/SupplierPartTable.tsx:83 #: src/tables/stock/StockItemTable.tsx:247 @@ -196,9 +197,9 @@ msgstr "Part Categories" #: src/forms/BuildForms.tsx:473 #: src/forms/BuildForms.tsx:633 #: src/forms/BuildForms.tsx:794 -#: src/forms/SalesOrderForms.tsx:307 +#: src/forms/SalesOrderForms.tsx:325 #: src/pages/stock/StockDetail.tsx:1005 -#: src/tables/part/PartTestResultTable.tsx:248 +#: src/tables/part/PartTestResultTable.tsx:256 #: src/tables/stock/StockTrackingTable.tsx:48 #: src/tables/stock/StockTrackingTable.tsx:55 msgid "Stock Item" @@ -512,7 +513,7 @@ msgstr "Selection Lists" #: src/components/dashboard/DashboardLayout.tsx:281 #: src/components/editors/NotesEditor.tsx:74 #: src/components/editors/TemplateEditor/TemplateEditor.tsx:158 -#: src/components/forms/fields/ApiFormField.tsx:273 +#: src/components/forms/fields/ApiFormField.tsx:237 #: src/components/forms/fields/TableField.tsx:45 #: src/components/importer/ImportDataSelector.tsx:192 #: src/components/importer/ImporterColumnSelector.tsx:234 @@ -637,8 +638,8 @@ msgstr "Enter barcode data" #: src/components/barcodes/BarcodeScanDialog.tsx:49 #: src/components/buttons/ScanButton.tsx:15 #: src/components/nav/NavigationDrawer.tsx:122 -#: src/forms/PurchaseOrderForms.tsx:457 -#: src/forms/PurchaseOrderForms.tsx:563 +#: src/forms/PurchaseOrderForms.tsx:509 +#: src/forms/PurchaseOrderForms.tsx:615 msgid "Scan Barcode" msgstr "Scan Barcode" @@ -723,7 +724,7 @@ msgstr "This will remove the link to the associated barcode" #: src/components/barcodes/QRCode.tsx:205 #: src/components/items/ActionDropdown.tsx:192 -#: src/forms/PurchaseOrderForms.tsx:554 +#: src/forms/PurchaseOrderForms.tsx:606 msgid "Unlink Barcode" msgstr "Unlink Barcode" @@ -1211,6 +1212,12 @@ msgstr "Remove the associated image from this item?" #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:884 #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:903 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:254 +#: src/tables/build/BuildAllocatedStockTable.tsx:178 +#: src/tables/build/BuildAllocatedStockTable.tsx:258 +#: src/tables/build/BuildLineTable.tsx:111 +#: src/tables/build/BuildLineTable.tsx:665 +#: src/tables/sales/SalesOrderAllocationTable.tsx:224 +#: src/tables/sales/SalesOrderAllocationTable.tsx:247 msgid "Remove" msgstr "Remove" @@ -1236,7 +1243,7 @@ msgid "Upload Error" msgstr "Upload Error" #: src/components/details/DetailsImage.tsx:250 -#: src/components/forms/fields/TextField.tsx:65 +#: src/components/forms/fields/AutoFillRightSection.tsx:34 msgid "Clear" msgstr "Clear" @@ -1812,10 +1819,14 @@ msgstr "Stopped" msgid "Running" msgstr "Running" -#: src/components/forms/fields/ApiFormField.tsx:233 +#: src/components/forms/fields/ApiFormField.tsx:197 msgid "Select file to upload" msgstr "Select file to upload" +#: src/components/forms/fields/AutoFillRightSection.tsx:47 +msgid "Accept suggested value" +msgstr "Accept suggested value" + #: src/components/forms/fields/DateField.tsx:76 msgid "Select date" msgstr "Select date" @@ -1870,10 +1881,6 @@ msgstr "No entries available" msgid "Add new row" msgstr "Add new row" -#: src/components/forms/fields/TextField.tsx:82 -msgid "Accept suggested value" -msgstr "Accept suggested value" - #: src/components/images/DetailsImage.tsx:252 #~ msgid "Select image" #~ msgstr "Select image" @@ -2220,8 +2227,8 @@ msgstr "No items" #: src/pages/part/PartDetail.tsx:994 #: src/pages/stock/StockDetail.tsx:265 #: src/pages/stock/StockDetail.tsx:942 -#: src/tables/build/BuildAllocatedStockTable.tsx:135 -#: src/tables/build/BuildLineTable.tsx:192 +#: src/tables/build/BuildAllocatedStockTable.tsx:132 +#: src/tables/build/BuildLineTable.tsx:193 #: src/tables/part/PartTable.tsx:137 #: src/tables/stock/StockItemTable.tsx:182 #: src/tables/stock/StockItemTable.tsx:343 @@ -2779,7 +2786,7 @@ msgstr "Plugin Information" #: src/pages/sales/SalesOrderDetail.tsx:119 #: src/pages/stock/LocationDetail.tsx:102 #: src/tables/ColumnRenderers.tsx:278 -#: src/tables/build/BuildAllocatedStockTable.tsx:91 +#: src/tables/build/BuildAllocatedStockTable.tsx:88 #: src/tables/machine/MachineTypeTable.tsx:161 #: src/tables/machine/MachineTypeTable.tsx:257 #: src/tables/plugin/PluginListTable.tsx:110 @@ -2961,7 +2968,7 @@ msgstr "No stock" #: src/pages/company/SupplierPartDetail.tsx:394 #: src/pages/part/PartDetail.tsx:1015 #: src/tables/bom/BomTable.tsx:444 -#: src/tables/build/BuildLineTable.tsx:222 +#: src/tables/build/BuildLineTable.tsx:223 #: src/tables/part/PartTable.tsx:108 msgid "On Order" msgstr "On Order" @@ -2971,7 +2978,7 @@ msgstr "On Order" #: src/pages/part/PartDetail.tsx:587 #: src/pages/part/PartDetail.tsx:1021 #: src/pages/stock/StockDetail.tsx:925 -#: src/tables/part/PartTestResultTable.tsx:297 +#: src/tables/part/PartTestResultTable.tsx:305 #: src/tables/stock/StockItemTable.tsx:359 msgid "In Production" msgstr "In Production" @@ -2995,7 +3002,7 @@ msgstr "Category" #: src/components/render/Stock.tsx:114 #: src/components/render/Stock.tsx:132 #: src/forms/BuildForms.tsx:795 -#: src/forms/PurchaseOrderForms.tsx:595 +#: src/forms/PurchaseOrderForms.tsx:647 #: src/forms/StockForms.tsx:792 #: src/forms/StockForms.tsx:839 #: src/forms/StockForms.tsx:885 @@ -3018,7 +3025,7 @@ msgstr "Location" #: src/components/render/Stock.tsx:99 #: src/pages/stock/StockDetail.tsx:198 #: src/pages/stock/StockDetail.tsx:930 -#: src/tables/build/BuildAllocatedStockTable.tsx:121 +#: src/tables/build/BuildAllocatedStockTable.tsx:118 #: src/tables/build/BuildOutputTable.tsx:107 #: src/tables/sales/SalesOrderAllocationTable.tsx:142 msgid "Serial Number" @@ -3029,9 +3036,9 @@ msgstr "Serial Number" #: src/forms/BuildForms.tsx:240 #: src/forms/BuildForms.tsx:634 #: src/forms/BuildForms.tsx:797 -#: src/forms/PurchaseOrderForms.tsx:801 +#: src/forms/PurchaseOrderForms.tsx:853 #: src/forms/ReturnOrderForms.tsx:243 -#: src/forms/SalesOrderForms.tsx:308 +#: src/forms/SalesOrderForms.tsx:326 #: src/forms/StockForms.tsx:841 #: src/pages/part/PartStockHistoryDetail.tsx:56 #: src/pages/part/PartStockHistoryDetail.tsx:210 @@ -3041,9 +3048,9 @@ msgstr "Serial Number" #: src/pages/part/pricing/PriceBreakPanel.tsx:172 #: src/pages/stock/StockDetail.tsx:258 #: src/pages/stock/StockDetail.tsx:936 -#: src/tables/build/BuildLineTable.tsx:86 +#: src/tables/build/BuildLineTable.tsx:83 #: src/tables/part/PartPurchaseOrdersTable.tsx:94 -#: src/tables/part/PartTestResultTable.tsx:269 +#: src/tables/part/PartTestResultTable.tsx:277 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:175 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:206 #: src/tables/purchasing/SupplierPriceBreakTable.tsx:69 @@ -3065,7 +3072,7 @@ msgstr "Quantity" #: src/forms/StockForms.tsx:1048 #: src/forms/StockForms.tsx:1096 #: src/forms/StockForms.tsx:1140 -#: src/tables/build/BuildLineTable.tsx:96 +#: src/tables/build/BuildLineTable.tsx:93 msgid "Batch" msgstr "Batch" @@ -3750,7 +3757,7 @@ msgid "In Stock" msgstr "In Stock" #: src/components/wizards/OrderPartsWizard.tsx:146 -#: src/tables/build/BuildLineTable.tsx:404 +#: src/tables/build/BuildLineTable.tsx:405 msgid "Required Quantity" msgstr "Required Quantity" @@ -3842,7 +3849,7 @@ msgid "Please correct the errors in the selected parts" msgstr "Please correct the errors in the selected parts" #: src/components/wizards/OrderPartsWizard.tsx:587 -#: src/tables/build/BuildLineTable.tsx:815 +#: src/tables/build/BuildLineTable.tsx:822 #: src/tables/part/PartTable.tsx:522 #: src/tables/sales/SalesOrderLineItemTable.tsx:370 msgid "Order Parts" @@ -4344,9 +4351,9 @@ msgstr "Substitute added" #: src/forms/BuildForms.tsx:333 #: src/forms/BuildForms.tsx:408 #: src/forms/BuildForms.tsx:685 -#: src/tables/build/BuildAllocatedStockTable.tsx:150 +#: src/tables/build/BuildAllocatedStockTable.tsx:147 #: src/tables/build/BuildOutputTable.tsx:582 -#: src/tables/part/PartTestResultTable.tsx:272 +#: src/tables/part/PartTestResultTable.tsx:280 msgid "Build Output" msgstr "Build Output" @@ -4357,7 +4364,7 @@ msgstr "Quantity to Complete" #: src/forms/BuildForms.tsx:336 #: src/forms/BuildForms.tsx:411 #: src/forms/BuildForms.tsx:475 -#: src/forms/PurchaseOrderForms.tsx:717 +#: src/forms/PurchaseOrderForms.tsx:769 #: src/forms/ReturnOrderForms.tsx:197 #: src/forms/ReturnOrderForms.tsx:244 #: src/forms/StockForms.tsx:712 @@ -4372,7 +4379,7 @@ msgstr "Quantity to Complete" #: src/tables/build/BuildOutputTable.tsx:404 #: src/tables/machine/MachineListTable.tsx:387 #: src/tables/part/PartPurchaseOrdersTable.tsx:38 -#: src/tables/part/PartTestResultTable.tsx:309 +#: src/tables/part/PartTestResultTable.tsx:317 #: src/tables/sales/ReturnOrderLineItemTable.tsx:138 #: src/tables/sales/ReturnOrderLineItemTable.tsx:176 #: src/tables/settings/CustomStateTable.tsx:79 @@ -4445,8 +4452,8 @@ msgstr "Build outputs have been cancelled" #: src/pages/stock/StockDetail.tsx:153 #: src/tables/bom/BomTable.tsx:134 #: src/tables/bom/UsedInTable.tsx:40 -#: src/tables/build/BuildAllocatedStockTable.tsx:108 -#: src/tables/build/BuildLineTable.tsx:336 +#: src/tables/build/BuildAllocatedStockTable.tsx:105 +#: src/tables/build/BuildLineTable.tsx:337 #: src/tables/build/BuildOrderTable.tsx:79 #: src/tables/part/PartSalesAllocationsTable.tsx:61 #: src/tables/part/RelatedPartTable.tsx:73 @@ -4461,47 +4468,47 @@ msgstr "IPN" #: src/forms/BuildForms.tsx:632 #: src/forms/BuildForms.tsx:796 #: src/forms/BuildForms.tsx:897 -#: src/forms/SalesOrderForms.tsx:306 -#: src/tables/build/BuildAllocatedStockTable.tsx:139 -#: src/tables/build/BuildLineTable.tsx:182 +#: src/forms/SalesOrderForms.tsx:324 +#: src/tables/build/BuildAllocatedStockTable.tsx:136 +#: src/tables/build/BuildLineTable.tsx:183 #: src/tables/sales/SalesOrderLineItemTable.tsx:342 #: src/tables/stock/StockItemTable.tsx:338 msgid "Allocated" msgstr "Allocated" #: src/forms/BuildForms.tsx:667 -#: src/forms/SalesOrderForms.tsx:295 +#: src/forms/SalesOrderForms.tsx:313 #: src/pages/build/BuildDetail.tsx:108 #: src/pages/build/BuildDetail.tsx:326 msgid "Source Location" msgstr "Source Location" #: src/forms/BuildForms.tsx:668 -#: src/forms/SalesOrderForms.tsx:296 +#: src/forms/SalesOrderForms.tsx:314 msgid "Select the source location for the stock allocation" msgstr "Select the source location for the stock allocation" #: src/forms/BuildForms.tsx:700 -#: src/forms/SalesOrderForms.tsx:336 -#: src/tables/build/BuildLineTable.tsx:574 -#: src/tables/build/BuildLineTable.tsx:731 -#: src/tables/build/BuildLineTable.tsx:830 +#: src/forms/SalesOrderForms.tsx:354 +#: src/tables/build/BuildLineTable.tsx:575 +#: src/tables/build/BuildLineTable.tsx:738 +#: src/tables/build/BuildLineTable.tsx:837 #: src/tables/sales/SalesOrderLineItemTable.tsx:380 #: src/tables/sales/SalesOrderLineItemTable.tsx:406 msgid "Allocate Stock" msgstr "Allocate Stock" #: src/forms/BuildForms.tsx:703 -#: src/forms/SalesOrderForms.tsx:341 +#: src/forms/SalesOrderForms.tsx:359 msgid "Stock items allocated" msgstr "Stock items allocated" #: src/forms/BuildForms.tsx:816 #: src/forms/BuildForms.tsx:917 -#: src/tables/build/BuildAllocatedStockTable.tsx:240 -#: src/tables/build/BuildAllocatedStockTable.tsx:272 -#: src/tables/build/BuildLineTable.tsx:741 -#: src/tables/build/BuildLineTable.tsx:864 +#: src/tables/build/BuildAllocatedStockTable.tsx:243 +#: src/tables/build/BuildAllocatedStockTable.tsx:279 +#: src/tables/build/BuildLineTable.tsx:748 +#: src/tables/build/BuildLineTable.tsx:871 msgid "Consume Stock" msgstr "Consume Stock" @@ -4516,21 +4523,21 @@ msgstr "Stock items scheduled to be consumed" #~ msgstr "Stock items consumed" #: src/forms/BuildForms.tsx:853 -#: src/tables/build/BuildLineTable.tsx:514 +#: src/tables/build/BuildLineTable.tsx:515 #: src/tables/part/PartBuildAllocationsTable.tsx:101 msgid "Fully consumed" msgstr "Fully consumed" #: src/forms/BuildForms.tsx:898 -#: src/tables/build/BuildLineTable.tsx:187 +#: src/tables/build/BuildLineTable.tsx:188 #: src/tables/stock/StockItemTable.tsx:367 msgid "Consumed" msgstr "Consumed" #: src/forms/CommonForms.tsx:88 -#: src/forms/PurchaseOrderForms.tsx:125 +#: src/forms/PurchaseOrderForms.tsx:176 #: src/forms/ReturnOrderForms.tsx:138 -#: src/forms/SalesOrderForms.tsx:164 +#: src/forms/SalesOrderForms.tsx:182 msgid "Select project code for this line item" msgstr "Select project code for this line item" @@ -4567,127 +4574,127 @@ msgstr "Parent part category" msgid "Subscribe to notifications for this category" msgstr "Subscribe to notifications for this category" -#: src/forms/PurchaseOrderForms.tsx:388 -msgid "Assign Batch Code and Serial Numbers" -msgstr "Assign Batch Code and Serial Numbers" - -#: src/forms/PurchaseOrderForms.tsx:390 -msgid "Assign Batch Code" -msgstr "Assign Batch Code" - -#: src/forms/PurchaseOrderForms.tsx:410 -msgid "Choose Location" -msgstr "Choose Location" - -#: src/forms/PurchaseOrderForms.tsx:418 -msgid "Item Destination selected" -msgstr "Item Destination selected" - #: src/forms/PurchaseOrderForms.tsx:421 #~ msgid "Assign Batch Code{0}" #~ msgstr "Assign Batch Code{0}" -#: src/forms/PurchaseOrderForms.tsx:428 -msgid "Part category default location selected" -msgstr "Part category default location selected" +#: src/forms/PurchaseOrderForms.tsx:440 +msgid "Assign Batch Code and Serial Numbers" +msgstr "Assign Batch Code and Serial Numbers" -#: src/forms/PurchaseOrderForms.tsx:438 -msgid "Received stock location selected" -msgstr "Received stock location selected" +#: src/forms/PurchaseOrderForms.tsx:442 +msgid "Assign Batch Code" +msgstr "Assign Batch Code" #: src/forms/PurchaseOrderForms.tsx:444 #: src/forms/StockForms.tsx:428 #~ msgid "Remove item from list" #~ msgstr "Remove item from list" -#: src/forms/PurchaseOrderForms.tsx:446 +#: src/forms/PurchaseOrderForms.tsx:462 +msgid "Choose Location" +msgstr "Choose Location" + +#: src/forms/PurchaseOrderForms.tsx:470 +msgid "Item Destination selected" +msgstr "Item Destination selected" + +#: src/forms/PurchaseOrderForms.tsx:480 +msgid "Part category default location selected" +msgstr "Part category default location selected" + +#: src/forms/PurchaseOrderForms.tsx:490 +msgid "Received stock location selected" +msgstr "Received stock location selected" + +#: src/forms/PurchaseOrderForms.tsx:498 msgid "Default location selected" msgstr "Default location selected" -#: src/forms/PurchaseOrderForms.tsx:507 +#: src/forms/PurchaseOrderForms.tsx:559 msgid "Set Location" msgstr "Set Location" -#: src/forms/PurchaseOrderForms.tsx:524 -msgid "Set Expiry Date" -msgstr "Set Expiry Date" - -#: src/forms/PurchaseOrderForms.tsx:532 -#: src/forms/StockForms.tsx:693 -msgid "Adjust Packaging" -msgstr "Adjust Packaging" - -#: src/forms/PurchaseOrderForms.tsx:540 -#: src/forms/StockForms.tsx:684 -#: src/hooks/UseStockAdjustActions.tsx:148 -msgid "Change Status" -msgstr "Change Status" - -#: src/forms/PurchaseOrderForms.tsx:546 -msgid "Add Note" -msgstr "Add Note" - #: src/forms/PurchaseOrderForms.tsx:566 #~ msgid "Serial numbers" #~ msgstr "Serial numbers" +#: src/forms/PurchaseOrderForms.tsx:576 +msgid "Set Expiry Date" +msgstr "Set Expiry Date" + #: src/forms/PurchaseOrderForms.tsx:582 #~ msgid "Store at line item destination" #~ msgstr "Store at line item destination" -#: src/forms/PurchaseOrderForms.tsx:610 -msgid "Store at default location" -msgstr "Store at default location" +#: src/forms/PurchaseOrderForms.tsx:584 +#: src/forms/StockForms.tsx:693 +msgid "Adjust Packaging" +msgstr "Adjust Packaging" -#: src/forms/PurchaseOrderForms.tsx:625 -msgid "Store at line item destination " -msgstr "Store at line item destination " +#: src/forms/PurchaseOrderForms.tsx:592 +#: src/forms/StockForms.tsx:684 +#: src/hooks/UseStockAdjustActions.tsx:148 +msgid "Change Status" +msgstr "Change Status" -#: src/forms/PurchaseOrderForms.tsx:637 -msgid "Store with already received stock" -msgstr "Store with already received stock" +#: src/forms/PurchaseOrderForms.tsx:598 +msgid "Add Note" +msgstr "Add Note" #: src/forms/PurchaseOrderForms.tsx:658 #~ msgid "Receive line items" #~ msgstr "Receive line items" -#: src/forms/PurchaseOrderForms.tsx:661 +#: src/forms/PurchaseOrderForms.tsx:662 +msgid "Store at default location" +msgstr "Store at default location" + +#: src/forms/PurchaseOrderForms.tsx:677 +msgid "Store at line item destination " +msgstr "Store at line item destination " + +#: src/forms/PurchaseOrderForms.tsx:689 +msgid "Store with already received stock" +msgstr "Store with already received stock" + +#: src/forms/PurchaseOrderForms.tsx:713 #: src/pages/build/BuildDetail.tsx:340 #: src/pages/stock/StockDetail.tsx:280 #: src/pages/stock/StockDetail.tsx:952 #: src/tables/Filter.tsx:83 -#: src/tables/build/BuildAllocatedStockTable.tsx:128 +#: src/tables/build/BuildAllocatedStockTable.tsx:125 #: src/tables/build/BuildOutputTable.tsx:112 -#: src/tables/part/PartTestResultTable.tsx:260 -#: src/tables/part/PartTestResultTable.tsx:281 +#: src/tables/part/PartTestResultTable.tsx:268 +#: src/tables/part/PartTestResultTable.tsx:289 #: src/tables/sales/SalesOrderAllocationTable.tsx:149 msgid "Batch Code" msgstr "Batch Code" -#: src/forms/PurchaseOrderForms.tsx:662 +#: src/forms/PurchaseOrderForms.tsx:714 msgid "Enter batch code for received items" msgstr "Enter batch code for received items" -#: src/forms/PurchaseOrderForms.tsx:675 +#: src/forms/PurchaseOrderForms.tsx:727 #: src/forms/StockForms.tsx:218 msgid "Serial Numbers" msgstr "Serial Numbers" -#: src/forms/PurchaseOrderForms.tsx:676 +#: src/forms/PurchaseOrderForms.tsx:728 msgid "Enter serial numbers for received items" msgstr "Enter serial numbers for received items" -#: src/forms/PurchaseOrderForms.tsx:690 +#: src/forms/PurchaseOrderForms.tsx:742 #: src/pages/stock/StockDetail.tsx:382 #: src/tables/stock/StockItemTable.tsx:294 msgid "Expiry Date" msgstr "Expiry Date" -#: src/forms/PurchaseOrderForms.tsx:691 +#: src/forms/PurchaseOrderForms.tsx:743 msgid "Enter an expiry date for received items" msgstr "Enter an expiry date for received items" -#: src/forms/PurchaseOrderForms.tsx:703 +#: src/forms/PurchaseOrderForms.tsx:755 #: src/forms/StockForms.tsx:728 #: src/pages/company/SupplierPartDetail.tsx:172 #: src/pages/company/SupplierPartDetail.tsx:236 @@ -4696,19 +4703,19 @@ msgstr "Enter an expiry date for received items" msgid "Packaging" msgstr "Packaging" -#: src/forms/PurchaseOrderForms.tsx:727 +#: src/forms/PurchaseOrderForms.tsx:779 #: src/pages/company/SupplierPartDetail.tsx:120 #: src/tables/ColumnRenderers.tsx:332 msgid "Note" msgstr "Note" -#: src/forms/PurchaseOrderForms.tsx:799 +#: src/forms/PurchaseOrderForms.tsx:851 #: src/pages/company/SupplierPartDetail.tsx:138 #: src/tables/purchasing/SupplierPriceBreakTable.tsx:49 msgid "SKU" msgstr "SKU" -#: src/forms/PurchaseOrderForms.tsx:800 +#: src/forms/PurchaseOrderForms.tsx:852 #: src/tables/part/PartPurchaseOrdersTable.tsx:127 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:213 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:283 @@ -4716,11 +4723,11 @@ msgstr "SKU" msgid "Received" msgstr "Received" -#: src/forms/PurchaseOrderForms.tsx:817 +#: src/forms/PurchaseOrderForms.tsx:869 msgid "Receive Line Items" msgstr "Receive Line Items" -#: src/forms/PurchaseOrderForms.tsx:823 +#: src/forms/PurchaseOrderForms.tsx:875 msgid "Items received" msgstr "Items received" @@ -4732,7 +4739,7 @@ msgstr "Receive Items" msgid "Item received into stock" msgstr "Item received into stock" -#: src/forms/SalesOrderForms.tsx:401 +#: src/forms/SalesOrderForms.tsx:419 msgid "Leave blank to use the order address" msgstr "Leave blank to use the order address" @@ -5927,6 +5934,9 @@ msgstr "Remove WebAuthn Credential" #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:310 #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:401 +#: src/tables/build/BuildAllocatedStockTable.tsx:181 +#: src/tables/build/BuildLineTable.tsx:668 +#: src/tables/sales/SalesOrderAllocationTable.tsx:220 msgid "Confirm Removal" msgstr "Confirm Removal" @@ -6865,8 +6875,8 @@ msgstr "External" #: src/pages/sales/ReturnOrderDetail.tsx:108 #: src/pages/sales/SalesOrderDetail.tsx:98 #: src/tables/ColumnRenderers.tsx:321 -#: src/tables/build/BuildAllocatedStockTable.tsx:115 -#: src/tables/build/BuildLineTable.tsx:352 +#: src/tables/build/BuildAllocatedStockTable.tsx:112 +#: src/tables/build/BuildLineTable.tsx:353 msgid "Reference" msgstr "Reference" @@ -7127,7 +7137,7 @@ msgstr "Cancel order" #: src/pages/build/BuildDetail.tsx:742 #: src/pages/stock/StockDetail.tsx:344 -#: src/tables/build/BuildAllocatedStockTable.tsx:85 +#: src/tables/build/BuildAllocatedStockTable.tsx:82 #: src/tables/part/PartBuildAllocationsTable.tsx:45 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:157 #: src/tables/stock/StockTrackingTable.tsx:109 @@ -7595,7 +7605,7 @@ msgstr "Keywords" #: src/pages/part/PartDetail.tsx:542 #: src/tables/bom/BomTable.tsx:439 -#: src/tables/build/BuildLineTable.tsx:305 +#: src/tables/build/BuildLineTable.tsx:306 #: src/tables/part/PartTable.tsx:319 #: src/tables/sales/SalesOrderLineItemTable.tsx:138 msgid "Available Stock" @@ -7603,7 +7613,7 @@ msgstr "Available Stock" #: src/pages/part/PartDetail.tsx:548 #: src/tables/bom/BomTable.tsx:341 -#: src/tables/build/BuildLineTable.tsx:267 +#: src/tables/build/BuildLineTable.tsx:268 #: src/tables/sales/SalesOrderLineItemTable.tsx:180 msgid "On order" msgstr "On order" @@ -7777,7 +7787,7 @@ msgstr "Order" #: src/pages/part/PartDetail.tsx:1144 #: src/pages/stock/StockDetail.tsx:884 -#: src/tables/build/BuildLineTable.tsx:761 +#: src/tables/build/BuildLineTable.tsx:768 msgid "Order Stock" msgstr "Order Stock" @@ -9214,13 +9224,13 @@ msgstr "Virtual part" #~ msgstr "Show asssmbled items" #: src/tables/bom/BomTable.tsx:315 -#: src/tables/build/BuildLineTable.tsx:276 +#: src/tables/build/BuildLineTable.tsx:277 #: src/tables/part/PartTable.tsx:145 msgid "External stock" msgstr "External stock" #: src/tables/bom/BomTable.tsx:323 -#: src/tables/build/BuildLineTable.tsx:239 +#: src/tables/build/BuildLineTable.tsx:240 msgid "Includes substitute stock" msgstr "Includes substitute stock" @@ -9229,7 +9239,7 @@ msgstr "Includes substitute stock" #~ msgstr "Edit Bom Item" #: src/tables/bom/BomTable.tsx:332 -#: src/tables/build/BuildLineTable.tsx:249 +#: src/tables/build/BuildLineTable.tsx:250 #: src/tables/sales/SalesOrderLineItemTable.tsx:166 msgid "Includes variant stock" msgstr "Includes variant stock" @@ -9267,8 +9277,8 @@ msgid "Stock Information" msgstr "Stock Information" #: src/tables/bom/BomTable.tsx:399 -#: src/tables/build/BuildLineTable.tsx:496 -#: src/tables/build/BuildLineTable.tsx:537 +#: src/tables/build/BuildLineTable.tsx:497 +#: src/tables/build/BuildLineTable.tsx:538 msgid "Consumable item" msgstr "Consumable item" @@ -9277,7 +9287,7 @@ msgid "No available stock" msgstr "No available stock" #: src/tables/bom/BomTable.tsx:420 -#: src/tables/build/BuildLineTable.tsx:213 +#: src/tables/build/BuildLineTable.tsx:214 msgid "Show testable items" msgstr "Show testable items" @@ -9286,7 +9296,7 @@ msgid "Show trackable items" msgstr "Show trackable items" #: src/tables/bom/BomTable.tsx:430 -#: src/tables/build/BuildLineTable.tsx:208 +#: src/tables/build/BuildLineTable.tsx:209 msgid "Show assembled items" msgstr "Show assembled items" @@ -9330,7 +9340,7 @@ msgstr "Show items which allow variant substitution" #: src/tables/bom/BomTable.tsx:464 #: src/tables/bom/UsedInTable.tsx:85 -#: src/tables/build/BuildLineTable.tsx:202 +#: src/tables/build/BuildLineTable.tsx:203 msgid "Optional" msgstr "Optional" @@ -9340,7 +9350,7 @@ msgid "Show optional items" msgstr "Show optional items" #: src/tables/bom/BomTable.tsx:469 -#: src/tables/build/BuildLineTable.tsx:197 +#: src/tables/build/BuildLineTable.tsx:198 msgid "Consumable" msgstr "Consumable" @@ -9428,7 +9438,7 @@ msgid "Bill of materials cannot be edited, as the part is locked" msgstr "Bill of materials cannot be edited, as the part is locked" #: src/tables/bom/UsedInTable.tsx:34 -#: src/tables/build/BuildLineTable.tsx:207 +#: src/tables/build/BuildLineTable.tsx:208 #: src/tables/part/ParametricPartTable.tsx:364 #: src/tables/part/PartBuildAllocationsTable.tsx:60 #: src/tables/part/PartTable.tsx:209 @@ -9450,11 +9460,11 @@ msgstr "Trackable" msgid "Show trackable assemblies" msgstr "Show trackable assemblies" -#: src/tables/build/BuildAllocatedStockTable.tsx:67 +#: src/tables/build/BuildAllocatedStockTable.tsx:64 msgid "Allocated to Output" msgstr "Allocated to Output" -#: src/tables/build/BuildAllocatedStockTable.tsx:68 +#: src/tables/build/BuildAllocatedStockTable.tsx:65 msgid "Show items allocated to a build output" msgstr "Show items allocated to a build output" @@ -9467,7 +9477,7 @@ msgstr "Show items allocated to a build output" #~ msgid "Include orders for part variants" #~ msgstr "Include orders for part variants" -#: src/tables/build/BuildAllocatedStockTable.tsx:97 +#: src/tables/build/BuildAllocatedStockTable.tsx:94 #: src/tables/part/PartBuildAllocationsTable.tsx:84 #: src/tables/part/PartPurchaseOrdersTable.tsx:132 #: src/tables/part/PartSalesAllocationsTable.tsx:69 @@ -9477,40 +9487,58 @@ msgid "Order Status" msgstr "Order Status" #: src/tables/build/BuildAllocatedStockTable.tsx:164 -#~ msgid "Edit Build Item" -#~ msgstr "Edit Build Item" - -#: src/tables/build/BuildAllocatedStockTable.tsx:167 -#: src/tables/build/BuildLineTable.tsx:650 +#: src/tables/build/BuildLineTable.tsx:651 msgid "Edit Stock Allocation" msgstr "Edit Stock Allocation" +#: src/tables/build/BuildAllocatedStockTable.tsx:164 +#~ msgid "Edit Build Item" +#~ msgstr "Edit Build Item" + #: src/tables/build/BuildAllocatedStockTable.tsx:174 #~ msgid "Delete Build Item" #~ msgstr "Delete Build Item" +#: src/tables/build/BuildAllocatedStockTable.tsx:177 +#: src/tables/build/BuildLineTable.tsx:664 +#: src/tables/sales/SalesOrderAllocationTable.tsx:218 +msgid "Remove Allocated Stock" +msgstr "Remove Allocated Stock" + #: src/tables/build/BuildAllocatedStockTable.tsx:180 #: src/tables/build/BuildLineTable.tsx:663 -msgid "Delete Stock Allocation" -msgstr "Delete Stock Allocation" +#~ msgid "Delete Stock Allocation" +#~ msgstr "Delete Stock Allocation" -#: src/tables/build/BuildAllocatedStockTable.tsx:239 +#: src/tables/build/BuildAllocatedStockTable.tsx:182 +#: src/tables/build/BuildLineTable.tsx:669 +#: src/tables/sales/SalesOrderAllocationTable.tsx:221 +msgid "Are you sure you want to remove this allocated stock from the order?" +msgstr "Are you sure you want to remove this allocated stock from the order?" + +#: src/tables/build/BuildAllocatedStockTable.tsx:242 msgid "Consume" msgstr "Consume" +#: src/tables/build/BuildAllocatedStockTable.tsx:259 +#: src/tables/build/BuildLineTable.tsx:112 +#: src/tables/sales/SalesOrderAllocationTable.tsx:248 +msgid "Remove allocated stock" +msgstr "Remove allocated stock" + #: src/tables/build/BuildLineTable.tsx:59 #~ msgid "Show lines with available stock" #~ msgstr "Show lines with available stock" -#: src/tables/build/BuildLineTable.tsx:120 +#: src/tables/build/BuildLineTable.tsx:121 msgid "View Stock Item" msgstr "View Stock Item" -#: src/tables/build/BuildLineTable.tsx:183 +#: src/tables/build/BuildLineTable.tsx:184 msgid "Show fully allocated lines" msgstr "Show fully allocated lines" -#: src/tables/build/BuildLineTable.tsx:188 +#: src/tables/build/BuildLineTable.tsx:189 msgid "Show fully consumed lines" msgstr "Show fully consumed lines" @@ -9518,124 +9546,124 @@ msgstr "Show fully consumed lines" #~ msgid "Show allocated lines" #~ msgstr "Show allocated lines" -#: src/tables/build/BuildLineTable.tsx:193 +#: src/tables/build/BuildLineTable.tsx:194 msgid "Show items with sufficient available stock" msgstr "Show items with sufficient available stock" -#: src/tables/build/BuildLineTable.tsx:198 +#: src/tables/build/BuildLineTable.tsx:199 msgid "Show consumable lines" msgstr "Show consumable lines" -#: src/tables/build/BuildLineTable.tsx:203 +#: src/tables/build/BuildLineTable.tsx:204 msgid "Show optional lines" msgstr "Show optional lines" -#: src/tables/build/BuildLineTable.tsx:212 +#: src/tables/build/BuildLineTable.tsx:213 #: src/tables/part/PartTable.tsx:233 msgid "Testable" msgstr "Testable" -#: src/tables/build/BuildLineTable.tsx:217 +#: src/tables/build/BuildLineTable.tsx:218 #: src/tables/stock/StockItemTable.tsx:388 msgid "Tracked" msgstr "Tracked" -#: src/tables/build/BuildLineTable.tsx:218 +#: src/tables/build/BuildLineTable.tsx:219 msgid "Show tracked lines" msgstr "Show tracked lines" -#: src/tables/build/BuildLineTable.tsx:223 +#: src/tables/build/BuildLineTable.tsx:224 msgid "Show items with stock on order" msgstr "Show items with stock on order" -#: src/tables/build/BuildLineTable.tsx:258 +#: src/tables/build/BuildLineTable.tsx:259 #: src/tables/sales/SalesOrderLineItemTable.tsx:172 msgid "In production" msgstr "In production" -#: src/tables/build/BuildLineTable.tsx:286 +#: src/tables/build/BuildLineTable.tsx:287 msgid "Insufficient stock" msgstr "Insufficient stock" -#: src/tables/build/BuildLineTable.tsx:302 +#: src/tables/build/BuildLineTable.tsx:303 #: src/tables/sales/SalesOrderLineItemTable.tsx:160 #: src/tables/stock/StockItemTable.tsx:191 msgid "No stock available" msgstr "No stock available" -#: src/tables/build/BuildLineTable.tsx:375 +#: src/tables/build/BuildLineTable.tsx:376 msgid "Gets Inherited" msgstr "Gets Inherited" -#: src/tables/build/BuildLineTable.tsx:388 +#: src/tables/build/BuildLineTable.tsx:389 msgid "Unit Quantity" msgstr "Unit Quantity" -#: src/tables/build/BuildLineTable.tsx:415 +#: src/tables/build/BuildLineTable.tsx:416 msgid "Setup Quantity" msgstr "Setup Quantity" -#: src/tables/build/BuildLineTable.tsx:424 +#: src/tables/build/BuildLineTable.tsx:425 msgid "Attrition" msgstr "Attrition" -#: src/tables/build/BuildLineTable.tsx:432 +#: src/tables/build/BuildLineTable.tsx:433 msgid "Rounding Multiple" msgstr "Rounding Multiple" -#: src/tables/build/BuildLineTable.tsx:441 +#: src/tables/build/BuildLineTable.tsx:442 msgid "BOM Information" msgstr "BOM Information" -#: src/tables/build/BuildLineTable.tsx:515 +#: src/tables/build/BuildLineTable.tsx:516 #: src/tables/part/PartBuildAllocationsTable.tsx:102 msgid "Fully allocated" msgstr "Fully allocated" -#: src/tables/build/BuildLineTable.tsx:563 +#: src/tables/build/BuildLineTable.tsx:564 #: src/tables/sales/SalesOrderLineItemTable.tsx:311 msgid "Create Build Order" msgstr "Create Build Order" -#: src/tables/build/BuildLineTable.tsx:592 +#: src/tables/build/BuildLineTable.tsx:593 msgid "Auto allocation in progress" msgstr "Auto allocation in progress" -#: src/tables/build/BuildLineTable.tsx:595 -#: src/tables/build/BuildLineTable.tsx:802 +#: src/tables/build/BuildLineTable.tsx:596 +#: src/tables/build/BuildLineTable.tsx:809 msgid "Auto Allocate Stock" msgstr "Auto Allocate Stock" -#: src/tables/build/BuildLineTable.tsx:596 +#: src/tables/build/BuildLineTable.tsx:597 msgid "Automatically allocate stock to this build according to the selected options" msgstr "Automatically allocate stock to this build according to the selected options" -#: src/tables/build/BuildLineTable.tsx:616 -#: src/tables/build/BuildLineTable.tsx:630 -#: src/tables/build/BuildLineTable.tsx:751 -#: src/tables/build/BuildLineTable.tsx:852 +#: src/tables/build/BuildLineTable.tsx:617 +#: src/tables/build/BuildLineTable.tsx:631 +#: src/tables/build/BuildLineTable.tsx:758 +#: src/tables/build/BuildLineTable.tsx:859 #: src/tables/build/BuildOutputTable.tsx:355 #: src/tables/build/BuildOutputTable.tsx:360 msgid "Deallocate Stock" msgstr "Deallocate Stock" -#: src/tables/build/BuildLineTable.tsx:632 +#: src/tables/build/BuildLineTable.tsx:633 msgid "Deallocate all untracked stock for this build order" msgstr "Deallocate all untracked stock for this build order" -#: src/tables/build/BuildLineTable.tsx:634 +#: src/tables/build/BuildLineTable.tsx:635 msgid "Deallocate stock from the selected line item" msgstr "Deallocate stock from the selected line item" -#: src/tables/build/BuildLineTable.tsx:638 +#: src/tables/build/BuildLineTable.tsx:639 msgid "Stock has been deallocated" msgstr "Stock has been deallocated" -#: src/tables/build/BuildLineTable.tsx:771 +#: src/tables/build/BuildLineTable.tsx:778 msgid "Build Stock" msgstr "Build Stock" -#: src/tables/build/BuildLineTable.tsx:784 +#: src/tables/build/BuildLineTable.tsx:791 #: src/tables/sales/SalesOrderLineItemTable.tsx:487 msgid "View Part" msgstr "View Part" @@ -9734,7 +9762,7 @@ msgid "Serialize Build Output" msgstr "Serialize Build Output" #: src/tables/build/BuildOutputTable.tsx:405 -#: src/tables/part/PartTestResultTable.tsx:310 +#: src/tables/part/PartTestResultTable.tsx:318 #: src/tables/stock/StockItemTable.tsx:328 msgid "Filter by stock status" msgstr "Filter by stock status" @@ -9959,8 +9987,8 @@ msgid "View Item" msgstr "View Item" #: src/tables/general/ExtraLineItemTable.tsx:95 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:299 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:403 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:300 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:405 #: src/tables/sales/ReturnOrderLineItemTable.tsx:83 #: src/tables/sales/ReturnOrderLineItemTable.tsx:187 #: src/tables/sales/SalesOrderLineItemTable.tsx:252 @@ -9969,14 +9997,14 @@ msgid "Add Line Item" msgstr "Add Line Item" #: src/tables/general/ExtraLineItemTable.tsx:108 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:320 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:322 #: src/tables/sales/ReturnOrderLineItemTable.tsx:96 #: src/tables/sales/SalesOrderLineItemTable.tsx:271 msgid "Edit Line Item" msgstr "Edit Line Item" #: src/tables/general/ExtraLineItemTable.tsx:117 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:329 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:331 #: src/tables/sales/ReturnOrderLineItemTable.tsx:105 #: src/tables/sales/SalesOrderLineItemTable.tsx:280 msgid "Delete Line Item" @@ -10268,7 +10296,7 @@ msgid "Required Stock" msgstr "Required Stock" #: src/tables/part/PartBuildAllocationsTable.tsx:124 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:381 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:383 msgid "View Build Order" msgstr "View Build Order" @@ -10612,8 +10640,8 @@ msgstr "Import parts from a supplier plugin" #: src/tables/part/PartTestResultTable.tsx:103 #: src/tables/part/PartTestResultTable.tsx:181 -#: src/tables/part/PartTestResultTable.tsx:320 -#: src/tables/part/PartTestResultTable.tsx:334 +#: src/tables/part/PartTestResultTable.tsx:328 +#: src/tables/part/PartTestResultTable.tsx:342 #: src/tables/stock/StockItemTestResultTable.tsx:296 #: src/tables/stock/StockItemTestResultTable.tsx:368 #: src/tables/stock/StockItemTestResultTable.tsx:429 @@ -10638,7 +10666,7 @@ msgstr "Test results added" msgid "No Result" msgstr "No Result" -#: src/tables/part/PartTestResultTable.tsx:298 +#: src/tables/part/PartTestResultTable.tsx:306 msgid "Show build outputs currently in production" msgstr "Show build outputs currently in production" @@ -11068,7 +11096,7 @@ msgid "Show manufacturer parts for active manufacturers." msgstr "Show manufacturer parts for active manufacturers." #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:115 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:397 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:399 msgid "Import Line Items" msgstr "Import Line Items" @@ -11094,11 +11122,11 @@ msgstr "Show line items which have been received" #~ msgid "Add line item" #~ msgstr "Add line item" -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:350 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:352 msgid "Receive line item" msgstr "Receive line item" -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:414 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:416 msgid "Receive items" msgstr "Receive items" @@ -11196,25 +11224,25 @@ msgid "Not shipped" msgstr "Not shipped" #: src/tables/sales/SalesOrderAllocationTable.tsx:211 -#: src/tables/sales/SalesOrderAllocationTable.tsx:229 +#: src/tables/sales/SalesOrderAllocationTable.tsx:235 msgid "Edit Allocation" msgstr "Edit Allocation" #: src/tables/sales/SalesOrderAllocationTable.tsx:218 #: src/tables/sales/SalesOrderAllocationTable.tsx:241 -msgid "Delete Allocation" -msgstr "Delete Allocation" +#~ msgid "Delete Allocation" +#~ msgstr "Delete Allocation" -#: src/tables/sales/SalesOrderAllocationTable.tsx:252 -#: src/tables/sales/SalesOrderAllocationTable.tsx:253 +#: src/tables/sales/SalesOrderAllocationTable.tsx:261 +#: src/tables/sales/SalesOrderAllocationTable.tsx:262 msgid "View Shipment" msgstr "View Shipment" -#: src/tables/sales/SalesOrderAllocationTable.tsx:308 +#: src/tables/sales/SalesOrderAllocationTable.tsx:317 msgid "Assign to Shipment" msgstr "Assign to Shipment" -#: src/tables/sales/SalesOrderAllocationTable.tsx:324 +#: src/tables/sales/SalesOrderAllocationTable.tsx:333 msgid "Assign to shipment" msgstr "Assign to shipment" diff --git a/src/frontend/src/locales/es/messages.po b/src/frontend/src/locales/es/messages.po index cca8ae62d7..b87f237ad3 100644 --- a/src/frontend/src/locales/es/messages.po +++ b/src/frontend/src/locales/es/messages.po @@ -8,7 +8,7 @@ msgstr "" "Language: es\n" "Project-Id-Version: inventree\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2025-11-19 19:39\n" +"PO-Revision-Date: 2025-11-22 06:25\n" "Last-Translator: \n" "Language-Team: Spanish\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" @@ -56,7 +56,7 @@ msgstr "Cancelar" #: lib/components/RowActions.tsx:136 #: src/components/nav/NavigationDrawer.tsx:190 -#: src/forms/PurchaseOrderForms.tsx:802 +#: src/forms/PurchaseOrderForms.tsx:854 #: src/forms/StockForms.tsx:796 #: src/forms/StockForms.tsx:843 #: src/forms/StockForms.tsx:889 @@ -103,9 +103,9 @@ msgstr "No" #: src/forms/BuildForms.tsx:630 #: src/forms/BuildForms.tsx:793 #: src/forms/BuildForms.tsx:896 -#: src/forms/PurchaseOrderForms.tsx:798 +#: src/forms/PurchaseOrderForms.tsx:850 #: src/forms/ReturnOrderForms.tsx:242 -#: src/forms/SalesOrderForms.tsx:305 +#: src/forms/SalesOrderForms.tsx:323 #: src/forms/StockForms.tsx:360 #: src/forms/StockForms.tsx:791 #: src/forms/StockForms.tsx:838 @@ -119,6 +119,7 @@ msgstr "No" #: src/pages/build/BuildDetail.tsx:200 #: src/pages/part/PartDetail.tsx:1207 #: src/tables/ColumnRenderers.tsx:91 +#: src/tables/part/PartTestResultTable.tsx:247 #: src/tables/part/RelatedPartTable.tsx:53 #: src/tables/stock/StockTrackingTable.tsx:87 msgid "Part" @@ -158,7 +159,7 @@ msgstr "Plantillas de prueba de piezas" #: src/components/wizards/OrderPartsWizard.tsx:290 #: src/pages/company/SupplierPartDetail.tsx:413 #: src/pages/stock/StockDetail.tsx:289 -#: src/tables/build/BuildAllocatedStockTable.tsx:155 +#: src/tables/build/BuildAllocatedStockTable.tsx:152 #: src/tables/part/PartPurchaseOrdersTable.tsx:50 #: src/tables/purchasing/SupplierPartTable.tsx:83 #: src/tables/stock/StockItemTable.tsx:247 @@ -201,9 +202,9 @@ msgstr "Categorías de Pieza" #: src/forms/BuildForms.tsx:473 #: src/forms/BuildForms.tsx:633 #: src/forms/BuildForms.tsx:794 -#: src/forms/SalesOrderForms.tsx:307 +#: src/forms/SalesOrderForms.tsx:325 #: src/pages/stock/StockDetail.tsx:1005 -#: src/tables/part/PartTestResultTable.tsx:248 +#: src/tables/part/PartTestResultTable.tsx:256 #: src/tables/stock/StockTrackingTable.tsx:48 #: src/tables/stock/StockTrackingTable.tsx:55 msgid "Stock Item" @@ -517,7 +518,7 @@ msgstr "Listas de Selección" #: src/components/dashboard/DashboardLayout.tsx:281 #: src/components/editors/NotesEditor.tsx:74 #: src/components/editors/TemplateEditor/TemplateEditor.tsx:158 -#: src/components/forms/fields/ApiFormField.tsx:273 +#: src/components/forms/fields/ApiFormField.tsx:237 #: src/components/forms/fields/TableField.tsx:45 #: src/components/importer/ImportDataSelector.tsx:192 #: src/components/importer/ImporterColumnSelector.tsx:234 @@ -642,8 +643,8 @@ msgstr "Introduce datos de código de barras" #: src/components/barcodes/BarcodeScanDialog.tsx:49 #: src/components/buttons/ScanButton.tsx:15 #: src/components/nav/NavigationDrawer.tsx:122 -#: src/forms/PurchaseOrderForms.tsx:457 -#: src/forms/PurchaseOrderForms.tsx:563 +#: src/forms/PurchaseOrderForms.tsx:509 +#: src/forms/PurchaseOrderForms.tsx:615 msgid "Scan Barcode" msgstr "Escanear código de barras" @@ -728,7 +729,7 @@ msgstr "Esto eliminará el enlace al código de barras asociado" #: src/components/barcodes/QRCode.tsx:205 #: src/components/items/ActionDropdown.tsx:192 -#: src/forms/PurchaseOrderForms.tsx:554 +#: src/forms/PurchaseOrderForms.tsx:606 msgid "Unlink Barcode" msgstr "Desvincular Código de Barras" @@ -1216,6 +1217,12 @@ msgstr "¿Eliminar la imagen asociada de este elemento?" #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:884 #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:903 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:254 +#: src/tables/build/BuildAllocatedStockTable.tsx:178 +#: src/tables/build/BuildAllocatedStockTable.tsx:258 +#: src/tables/build/BuildLineTable.tsx:111 +#: src/tables/build/BuildLineTable.tsx:665 +#: src/tables/sales/SalesOrderAllocationTable.tsx:224 +#: src/tables/sales/SalesOrderAllocationTable.tsx:247 msgid "Remove" msgstr "Eliminar" @@ -1241,7 +1248,7 @@ msgid "Upload Error" msgstr "Error de subida" #: src/components/details/DetailsImage.tsx:250 -#: src/components/forms/fields/TextField.tsx:65 +#: src/components/forms/fields/AutoFillRightSection.tsx:34 msgid "Clear" msgstr "Borrar" @@ -1817,10 +1824,14 @@ msgstr "Detenido" msgid "Running" msgstr "Ejecutándose" -#: src/components/forms/fields/ApiFormField.tsx:233 +#: src/components/forms/fields/ApiFormField.tsx:197 msgid "Select file to upload" msgstr "" +#: src/components/forms/fields/AutoFillRightSection.tsx:47 +msgid "Accept suggested value" +msgstr "" + #: src/components/forms/fields/DateField.tsx:76 msgid "Select date" msgstr "" @@ -1875,10 +1886,6 @@ msgstr "No hay entradas disponibles" msgid "Add new row" msgstr "Añadir fila nueva" -#: src/components/forms/fields/TextField.tsx:82 -msgid "Accept suggested value" -msgstr "" - #: src/components/images/DetailsImage.tsx:252 #~ msgid "Select image" #~ msgstr "Select image" @@ -2225,8 +2232,8 @@ msgstr "" #: src/pages/part/PartDetail.tsx:994 #: src/pages/stock/StockDetail.tsx:265 #: src/pages/stock/StockDetail.tsx:942 -#: src/tables/build/BuildAllocatedStockTable.tsx:135 -#: src/tables/build/BuildLineTable.tsx:192 +#: src/tables/build/BuildAllocatedStockTable.tsx:132 +#: src/tables/build/BuildLineTable.tsx:193 #: src/tables/part/PartTable.tsx:137 #: src/tables/stock/StockItemTable.tsx:182 #: src/tables/stock/StockItemTable.tsx:343 @@ -2784,7 +2791,7 @@ msgstr "Información del complemento" #: src/pages/sales/SalesOrderDetail.tsx:119 #: src/pages/stock/LocationDetail.tsx:102 #: src/tables/ColumnRenderers.tsx:278 -#: src/tables/build/BuildAllocatedStockTable.tsx:91 +#: src/tables/build/BuildAllocatedStockTable.tsx:88 #: src/tables/machine/MachineTypeTable.tsx:161 #: src/tables/machine/MachineTypeTable.tsx:257 #: src/tables/plugin/PluginListTable.tsx:110 @@ -2966,7 +2973,7 @@ msgstr "Sin Stock" #: src/pages/company/SupplierPartDetail.tsx:394 #: src/pages/part/PartDetail.tsx:1015 #: src/tables/bom/BomTable.tsx:444 -#: src/tables/build/BuildLineTable.tsx:222 +#: src/tables/build/BuildLineTable.tsx:223 #: src/tables/part/PartTable.tsx:108 msgid "On Order" msgstr "En pedido" @@ -2976,7 +2983,7 @@ msgstr "En pedido" #: src/pages/part/PartDetail.tsx:587 #: src/pages/part/PartDetail.tsx:1021 #: src/pages/stock/StockDetail.tsx:925 -#: src/tables/part/PartTestResultTable.tsx:297 +#: src/tables/part/PartTestResultTable.tsx:305 #: src/tables/stock/StockItemTable.tsx:359 msgid "In Production" msgstr "En producción" @@ -3000,7 +3007,7 @@ msgstr "Categoría" #: src/components/render/Stock.tsx:114 #: src/components/render/Stock.tsx:132 #: src/forms/BuildForms.tsx:795 -#: src/forms/PurchaseOrderForms.tsx:595 +#: src/forms/PurchaseOrderForms.tsx:647 #: src/forms/StockForms.tsx:792 #: src/forms/StockForms.tsx:839 #: src/forms/StockForms.tsx:885 @@ -3023,7 +3030,7 @@ msgstr "Ubicación" #: src/components/render/Stock.tsx:99 #: src/pages/stock/StockDetail.tsx:198 #: src/pages/stock/StockDetail.tsx:930 -#: src/tables/build/BuildAllocatedStockTable.tsx:121 +#: src/tables/build/BuildAllocatedStockTable.tsx:118 #: src/tables/build/BuildOutputTable.tsx:107 #: src/tables/sales/SalesOrderAllocationTable.tsx:142 msgid "Serial Number" @@ -3034,9 +3041,9 @@ msgstr "Número de serie" #: src/forms/BuildForms.tsx:240 #: src/forms/BuildForms.tsx:634 #: src/forms/BuildForms.tsx:797 -#: src/forms/PurchaseOrderForms.tsx:801 +#: src/forms/PurchaseOrderForms.tsx:853 #: src/forms/ReturnOrderForms.tsx:243 -#: src/forms/SalesOrderForms.tsx:308 +#: src/forms/SalesOrderForms.tsx:326 #: src/forms/StockForms.tsx:841 #: src/pages/part/PartStockHistoryDetail.tsx:56 #: src/pages/part/PartStockHistoryDetail.tsx:210 @@ -3046,9 +3053,9 @@ msgstr "Número de serie" #: src/pages/part/pricing/PriceBreakPanel.tsx:172 #: src/pages/stock/StockDetail.tsx:258 #: src/pages/stock/StockDetail.tsx:936 -#: src/tables/build/BuildLineTable.tsx:86 +#: src/tables/build/BuildLineTable.tsx:83 #: src/tables/part/PartPurchaseOrdersTable.tsx:94 -#: src/tables/part/PartTestResultTable.tsx:269 +#: src/tables/part/PartTestResultTable.tsx:277 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:175 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:206 #: src/tables/purchasing/SupplierPriceBreakTable.tsx:69 @@ -3070,7 +3077,7 @@ msgstr "Cantidad" #: src/forms/StockForms.tsx:1048 #: src/forms/StockForms.tsx:1096 #: src/forms/StockForms.tsx:1140 -#: src/tables/build/BuildLineTable.tsx:96 +#: src/tables/build/BuildLineTable.tsx:93 msgid "Batch" msgstr "Lote" @@ -3755,7 +3762,7 @@ msgid "In Stock" msgstr "Disponible" #: src/components/wizards/OrderPartsWizard.tsx:146 -#: src/tables/build/BuildLineTable.tsx:404 +#: src/tables/build/BuildLineTable.tsx:405 msgid "Required Quantity" msgstr "Cantidad requerida" @@ -3847,7 +3854,7 @@ msgid "Please correct the errors in the selected parts" msgstr "" #: src/components/wizards/OrderPartsWizard.tsx:587 -#: src/tables/build/BuildLineTable.tsx:815 +#: src/tables/build/BuildLineTable.tsx:822 #: src/tables/part/PartTable.tsx:522 #: src/tables/sales/SalesOrderLineItemTable.tsx:370 msgid "Order Parts" @@ -4349,9 +4356,9 @@ msgstr "" #: src/forms/BuildForms.tsx:333 #: src/forms/BuildForms.tsx:408 #: src/forms/BuildForms.tsx:685 -#: src/tables/build/BuildAllocatedStockTable.tsx:150 +#: src/tables/build/BuildAllocatedStockTable.tsx:147 #: src/tables/build/BuildOutputTable.tsx:582 -#: src/tables/part/PartTestResultTable.tsx:272 +#: src/tables/part/PartTestResultTable.tsx:280 msgid "Build Output" msgstr "" @@ -4362,7 +4369,7 @@ msgstr "" #: src/forms/BuildForms.tsx:336 #: src/forms/BuildForms.tsx:411 #: src/forms/BuildForms.tsx:475 -#: src/forms/PurchaseOrderForms.tsx:717 +#: src/forms/PurchaseOrderForms.tsx:769 #: src/forms/ReturnOrderForms.tsx:197 #: src/forms/ReturnOrderForms.tsx:244 #: src/forms/StockForms.tsx:712 @@ -4377,7 +4384,7 @@ msgstr "" #: src/tables/build/BuildOutputTable.tsx:404 #: src/tables/machine/MachineListTable.tsx:387 #: src/tables/part/PartPurchaseOrdersTable.tsx:38 -#: src/tables/part/PartTestResultTable.tsx:309 +#: src/tables/part/PartTestResultTable.tsx:317 #: src/tables/sales/ReturnOrderLineItemTable.tsx:138 #: src/tables/sales/ReturnOrderLineItemTable.tsx:176 #: src/tables/settings/CustomStateTable.tsx:79 @@ -4450,8 +4457,8 @@ msgstr "Salidas de Construcción han sido canceladas" #: src/pages/stock/StockDetail.tsx:153 #: src/tables/bom/BomTable.tsx:134 #: src/tables/bom/UsedInTable.tsx:40 -#: src/tables/build/BuildAllocatedStockTable.tsx:108 -#: src/tables/build/BuildLineTable.tsx:336 +#: src/tables/build/BuildAllocatedStockTable.tsx:105 +#: src/tables/build/BuildLineTable.tsx:337 #: src/tables/build/BuildOrderTable.tsx:79 #: src/tables/part/PartSalesAllocationsTable.tsx:61 #: src/tables/part/RelatedPartTable.tsx:73 @@ -4466,47 +4473,47 @@ msgstr "IPN" #: src/forms/BuildForms.tsx:632 #: src/forms/BuildForms.tsx:796 #: src/forms/BuildForms.tsx:897 -#: src/forms/SalesOrderForms.tsx:306 -#: src/tables/build/BuildAllocatedStockTable.tsx:139 -#: src/tables/build/BuildLineTable.tsx:182 +#: src/forms/SalesOrderForms.tsx:324 +#: src/tables/build/BuildAllocatedStockTable.tsx:136 +#: src/tables/build/BuildLineTable.tsx:183 #: src/tables/sales/SalesOrderLineItemTable.tsx:342 #: src/tables/stock/StockItemTable.tsx:338 msgid "Allocated" msgstr "Asignado" #: src/forms/BuildForms.tsx:667 -#: src/forms/SalesOrderForms.tsx:295 +#: src/forms/SalesOrderForms.tsx:313 #: src/pages/build/BuildDetail.tsx:108 #: src/pages/build/BuildDetail.tsx:326 msgid "Source Location" msgstr "Ubicación origen" #: src/forms/BuildForms.tsx:668 -#: src/forms/SalesOrderForms.tsx:296 +#: src/forms/SalesOrderForms.tsx:314 msgid "Select the source location for the stock allocation" msgstr "Seleccione la ubicación de origen para la asignación de stock" #: src/forms/BuildForms.tsx:700 -#: src/forms/SalesOrderForms.tsx:336 -#: src/tables/build/BuildLineTable.tsx:574 -#: src/tables/build/BuildLineTable.tsx:731 -#: src/tables/build/BuildLineTable.tsx:830 +#: src/forms/SalesOrderForms.tsx:354 +#: src/tables/build/BuildLineTable.tsx:575 +#: src/tables/build/BuildLineTable.tsx:738 +#: src/tables/build/BuildLineTable.tsx:837 #: src/tables/sales/SalesOrderLineItemTable.tsx:380 #: src/tables/sales/SalesOrderLineItemTable.tsx:406 msgid "Allocate Stock" msgstr "Asignar Stock" #: src/forms/BuildForms.tsx:703 -#: src/forms/SalesOrderForms.tsx:341 +#: src/forms/SalesOrderForms.tsx:359 msgid "Stock items allocated" msgstr "Artículos de stock seleccionados" #: src/forms/BuildForms.tsx:816 #: src/forms/BuildForms.tsx:917 -#: src/tables/build/BuildAllocatedStockTable.tsx:240 -#: src/tables/build/BuildAllocatedStockTable.tsx:272 -#: src/tables/build/BuildLineTable.tsx:741 -#: src/tables/build/BuildLineTable.tsx:864 +#: src/tables/build/BuildAllocatedStockTable.tsx:243 +#: src/tables/build/BuildAllocatedStockTable.tsx:279 +#: src/tables/build/BuildLineTable.tsx:748 +#: src/tables/build/BuildLineTable.tsx:871 msgid "Consume Stock" msgstr "" @@ -4521,21 +4528,21 @@ msgstr "" #~ msgstr "Stock items consumed" #: src/forms/BuildForms.tsx:853 -#: src/tables/build/BuildLineTable.tsx:514 +#: src/tables/build/BuildLineTable.tsx:515 #: src/tables/part/PartBuildAllocationsTable.tsx:101 msgid "Fully consumed" msgstr "" #: src/forms/BuildForms.tsx:898 -#: src/tables/build/BuildLineTable.tsx:187 +#: src/tables/build/BuildLineTable.tsx:188 #: src/tables/stock/StockItemTable.tsx:367 msgid "Consumed" msgstr "Consumido" #: src/forms/CommonForms.tsx:88 -#: src/forms/PurchaseOrderForms.tsx:125 +#: src/forms/PurchaseOrderForms.tsx:176 #: src/forms/ReturnOrderForms.tsx:138 -#: src/forms/SalesOrderForms.tsx:164 +#: src/forms/SalesOrderForms.tsx:182 msgid "Select project code for this line item" msgstr "" @@ -4572,127 +4579,127 @@ msgstr "Categoría superior de pieza" msgid "Subscribe to notifications for this category" msgstr "Suscribirse a las notificaciones de esta categoría" -#: src/forms/PurchaseOrderForms.tsx:388 -msgid "Assign Batch Code and Serial Numbers" -msgstr "Asignar código de lote y números de serie" - -#: src/forms/PurchaseOrderForms.tsx:390 -msgid "Assign Batch Code" -msgstr "Asignar código de lote" - -#: src/forms/PurchaseOrderForms.tsx:410 -msgid "Choose Location" -msgstr "Elegir ubicación" - -#: src/forms/PurchaseOrderForms.tsx:418 -msgid "Item Destination selected" -msgstr "Destino de artículo seleccionado" - #: src/forms/PurchaseOrderForms.tsx:421 #~ msgid "Assign Batch Code{0}" #~ msgstr "Assign Batch Code{0}" -#: src/forms/PurchaseOrderForms.tsx:428 -msgid "Part category default location selected" -msgstr "Ubicación por defecto de la categoría de pieza eleccionada" +#: src/forms/PurchaseOrderForms.tsx:440 +msgid "Assign Batch Code and Serial Numbers" +msgstr "Asignar código de lote y números de serie" -#: src/forms/PurchaseOrderForms.tsx:438 -msgid "Received stock location selected" -msgstr "Seleccionada ubicación de existencias recibidas" +#: src/forms/PurchaseOrderForms.tsx:442 +msgid "Assign Batch Code" +msgstr "Asignar código de lote" #: src/forms/PurchaseOrderForms.tsx:444 #: src/forms/StockForms.tsx:428 #~ msgid "Remove item from list" #~ msgstr "Remove item from list" -#: src/forms/PurchaseOrderForms.tsx:446 +#: src/forms/PurchaseOrderForms.tsx:462 +msgid "Choose Location" +msgstr "Elegir ubicación" + +#: src/forms/PurchaseOrderForms.tsx:470 +msgid "Item Destination selected" +msgstr "Destino de artículo seleccionado" + +#: src/forms/PurchaseOrderForms.tsx:480 +msgid "Part category default location selected" +msgstr "Ubicación por defecto de la categoría de pieza eleccionada" + +#: src/forms/PurchaseOrderForms.tsx:490 +msgid "Received stock location selected" +msgstr "Seleccionada ubicación de existencias recibidas" + +#: src/forms/PurchaseOrderForms.tsx:498 msgid "Default location selected" msgstr "Ubicación por defecto seleccionada" -#: src/forms/PurchaseOrderForms.tsx:507 +#: src/forms/PurchaseOrderForms.tsx:559 msgid "Set Location" msgstr "Establecer ubicación" -#: src/forms/PurchaseOrderForms.tsx:524 -msgid "Set Expiry Date" -msgstr "Establecer Fecha de Vencimiento" - -#: src/forms/PurchaseOrderForms.tsx:532 -#: src/forms/StockForms.tsx:693 -msgid "Adjust Packaging" -msgstr "Ajustar empaquetado" - -#: src/forms/PurchaseOrderForms.tsx:540 -#: src/forms/StockForms.tsx:684 -#: src/hooks/UseStockAdjustActions.tsx:148 -msgid "Change Status" -msgstr "Cambiar Estado" - -#: src/forms/PurchaseOrderForms.tsx:546 -msgid "Add Note" -msgstr "Añadir Nota" - #: src/forms/PurchaseOrderForms.tsx:566 #~ msgid "Serial numbers" #~ msgstr "Serial numbers" +#: src/forms/PurchaseOrderForms.tsx:576 +msgid "Set Expiry Date" +msgstr "Establecer Fecha de Vencimiento" + #: src/forms/PurchaseOrderForms.tsx:582 #~ msgid "Store at line item destination" #~ msgstr "Store at line item destination" -#: src/forms/PurchaseOrderForms.tsx:610 -msgid "Store at default location" -msgstr "Guardar en la ubicación predeterminada" +#: src/forms/PurchaseOrderForms.tsx:584 +#: src/forms/StockForms.tsx:693 +msgid "Adjust Packaging" +msgstr "Ajustar empaquetado" -#: src/forms/PurchaseOrderForms.tsx:625 -msgid "Store at line item destination " -msgstr "" +#: src/forms/PurchaseOrderForms.tsx:592 +#: src/forms/StockForms.tsx:684 +#: src/hooks/UseStockAdjustActions.tsx:148 +msgid "Change Status" +msgstr "Cambiar Estado" -#: src/forms/PurchaseOrderForms.tsx:637 -msgid "Store with already received stock" -msgstr "Guardar con cantidad ya recibida" +#: src/forms/PurchaseOrderForms.tsx:598 +msgid "Add Note" +msgstr "Añadir Nota" #: src/forms/PurchaseOrderForms.tsx:658 #~ msgid "Receive line items" #~ msgstr "Receive line items" -#: src/forms/PurchaseOrderForms.tsx:661 +#: src/forms/PurchaseOrderForms.tsx:662 +msgid "Store at default location" +msgstr "Guardar en la ubicación predeterminada" + +#: src/forms/PurchaseOrderForms.tsx:677 +msgid "Store at line item destination " +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:689 +msgid "Store with already received stock" +msgstr "Guardar con cantidad ya recibida" + +#: src/forms/PurchaseOrderForms.tsx:713 #: src/pages/build/BuildDetail.tsx:340 #: src/pages/stock/StockDetail.tsx:280 #: src/pages/stock/StockDetail.tsx:952 #: src/tables/Filter.tsx:83 -#: src/tables/build/BuildAllocatedStockTable.tsx:128 +#: src/tables/build/BuildAllocatedStockTable.tsx:125 #: src/tables/build/BuildOutputTable.tsx:112 -#: src/tables/part/PartTestResultTable.tsx:260 -#: src/tables/part/PartTestResultTable.tsx:281 +#: src/tables/part/PartTestResultTable.tsx:268 +#: src/tables/part/PartTestResultTable.tsx:289 #: src/tables/sales/SalesOrderAllocationTable.tsx:149 msgid "Batch Code" msgstr "Código de lote" -#: src/forms/PurchaseOrderForms.tsx:662 +#: src/forms/PurchaseOrderForms.tsx:714 msgid "Enter batch code for received items" msgstr "Introduzca el código de lote para los artículos recibidos" -#: src/forms/PurchaseOrderForms.tsx:675 +#: src/forms/PurchaseOrderForms.tsx:727 #: src/forms/StockForms.tsx:218 msgid "Serial Numbers" msgstr "Números de serie" -#: src/forms/PurchaseOrderForms.tsx:676 +#: src/forms/PurchaseOrderForms.tsx:728 msgid "Enter serial numbers for received items" msgstr "Introduzca números de serie para los elementos recibidos" -#: src/forms/PurchaseOrderForms.tsx:690 +#: src/forms/PurchaseOrderForms.tsx:742 #: src/pages/stock/StockDetail.tsx:382 #: src/tables/stock/StockItemTable.tsx:294 msgid "Expiry Date" msgstr "Fecha de Expiración" -#: src/forms/PurchaseOrderForms.tsx:691 +#: src/forms/PurchaseOrderForms.tsx:743 msgid "Enter an expiry date for received items" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:703 +#: src/forms/PurchaseOrderForms.tsx:755 #: src/forms/StockForms.tsx:728 #: src/pages/company/SupplierPartDetail.tsx:172 #: src/pages/company/SupplierPartDetail.tsx:236 @@ -4701,19 +4708,19 @@ msgstr "" msgid "Packaging" msgstr "Empaquetado" -#: src/forms/PurchaseOrderForms.tsx:727 +#: src/forms/PurchaseOrderForms.tsx:779 #: src/pages/company/SupplierPartDetail.tsx:120 #: src/tables/ColumnRenderers.tsx:332 msgid "Note" msgstr "Nota" -#: src/forms/PurchaseOrderForms.tsx:799 +#: src/forms/PurchaseOrderForms.tsx:851 #: src/pages/company/SupplierPartDetail.tsx:138 #: src/tables/purchasing/SupplierPriceBreakTable.tsx:49 msgid "SKU" msgstr "Número De Referencia" -#: src/forms/PurchaseOrderForms.tsx:800 +#: src/forms/PurchaseOrderForms.tsx:852 #: src/tables/part/PartPurchaseOrdersTable.tsx:127 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:213 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:283 @@ -4721,11 +4728,11 @@ msgstr "Número De Referencia" msgid "Received" msgstr "Recibido" -#: src/forms/PurchaseOrderForms.tsx:817 +#: src/forms/PurchaseOrderForms.tsx:869 msgid "Receive Line Items" msgstr "Recibir ítem de línea" -#: src/forms/PurchaseOrderForms.tsx:823 +#: src/forms/PurchaseOrderForms.tsx:875 msgid "Items received" msgstr "Artículos Recibidos" @@ -4737,7 +4744,7 @@ msgstr "Recibir Artículos" msgid "Item received into stock" msgstr "Artículo recibido en existencias" -#: src/forms/SalesOrderForms.tsx:401 +#: src/forms/SalesOrderForms.tsx:419 msgid "Leave blank to use the order address" msgstr "" @@ -5932,6 +5939,9 @@ msgstr "" #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:310 #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:401 +#: src/tables/build/BuildAllocatedStockTable.tsx:181 +#: src/tables/build/BuildLineTable.tsx:668 +#: src/tables/sales/SalesOrderAllocationTable.tsx:220 msgid "Confirm Removal" msgstr "" @@ -6870,8 +6880,8 @@ msgstr "Externo" #: src/pages/sales/ReturnOrderDetail.tsx:108 #: src/pages/sales/SalesOrderDetail.tsx:98 #: src/tables/ColumnRenderers.tsx:321 -#: src/tables/build/BuildAllocatedStockTable.tsx:115 -#: src/tables/build/BuildLineTable.tsx:352 +#: src/tables/build/BuildAllocatedStockTable.tsx:112 +#: src/tables/build/BuildLineTable.tsx:353 msgid "Reference" msgstr "Referencia" @@ -7132,7 +7142,7 @@ msgstr "Cancelar pedido" #: src/pages/build/BuildDetail.tsx:742 #: src/pages/stock/StockDetail.tsx:344 -#: src/tables/build/BuildAllocatedStockTable.tsx:85 +#: src/tables/build/BuildAllocatedStockTable.tsx:82 #: src/tables/part/PartBuildAllocationsTable.tsx:45 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:157 #: src/tables/stock/StockTrackingTable.tsx:109 @@ -7600,7 +7610,7 @@ msgstr "Palabras claves" #: src/pages/part/PartDetail.tsx:542 #: src/tables/bom/BomTable.tsx:439 -#: src/tables/build/BuildLineTable.tsx:305 +#: src/tables/build/BuildLineTable.tsx:306 #: src/tables/part/PartTable.tsx:319 #: src/tables/sales/SalesOrderLineItemTable.tsx:138 msgid "Available Stock" @@ -7608,7 +7618,7 @@ msgstr "Existencias disponibles" #: src/pages/part/PartDetail.tsx:548 #: src/tables/bom/BomTable.tsx:341 -#: src/tables/build/BuildLineTable.tsx:267 +#: src/tables/build/BuildLineTable.tsx:268 #: src/tables/sales/SalesOrderLineItemTable.tsx:180 msgid "On order" msgstr "En pedido" @@ -7782,7 +7792,7 @@ msgstr "Orden" #: src/pages/part/PartDetail.tsx:1144 #: src/pages/stock/StockDetail.tsx:884 -#: src/tables/build/BuildLineTable.tsx:761 +#: src/tables/build/BuildLineTable.tsx:768 msgid "Order Stock" msgstr "" @@ -9219,13 +9229,13 @@ msgstr "" #~ msgstr "Show asssmbled items" #: src/tables/bom/BomTable.tsx:315 -#: src/tables/build/BuildLineTable.tsx:276 +#: src/tables/build/BuildLineTable.tsx:277 #: src/tables/part/PartTable.tsx:145 msgid "External stock" msgstr "Existencias externas" #: src/tables/bom/BomTable.tsx:323 -#: src/tables/build/BuildLineTable.tsx:239 +#: src/tables/build/BuildLineTable.tsx:240 msgid "Includes substitute stock" msgstr "Incluye existencias sustitutas" @@ -9234,7 +9244,7 @@ msgstr "Incluye existencias sustitutas" #~ msgstr "Edit Bom Item" #: src/tables/bom/BomTable.tsx:332 -#: src/tables/build/BuildLineTable.tsx:249 +#: src/tables/build/BuildLineTable.tsx:250 #: src/tables/sales/SalesOrderLineItemTable.tsx:166 msgid "Includes variant stock" msgstr "Incluye existencias variantes" @@ -9272,8 +9282,8 @@ msgid "Stock Information" msgstr "" #: src/tables/bom/BomTable.tsx:399 -#: src/tables/build/BuildLineTable.tsx:496 -#: src/tables/build/BuildLineTable.tsx:537 +#: src/tables/build/BuildLineTable.tsx:497 +#: src/tables/build/BuildLineTable.tsx:538 msgid "Consumable item" msgstr "" @@ -9282,7 +9292,7 @@ msgid "No available stock" msgstr "" #: src/tables/bom/BomTable.tsx:420 -#: src/tables/build/BuildLineTable.tsx:213 +#: src/tables/build/BuildLineTable.tsx:214 msgid "Show testable items" msgstr "" @@ -9291,7 +9301,7 @@ msgid "Show trackable items" msgstr "" #: src/tables/bom/BomTable.tsx:430 -#: src/tables/build/BuildLineTable.tsx:208 +#: src/tables/build/BuildLineTable.tsx:209 msgid "Show assembled items" msgstr "" @@ -9335,7 +9345,7 @@ msgstr "" #: src/tables/bom/BomTable.tsx:464 #: src/tables/bom/UsedInTable.tsx:85 -#: src/tables/build/BuildLineTable.tsx:202 +#: src/tables/build/BuildLineTable.tsx:203 msgid "Optional" msgstr "" @@ -9345,7 +9355,7 @@ msgid "Show optional items" msgstr "" #: src/tables/bom/BomTable.tsx:469 -#: src/tables/build/BuildLineTable.tsx:197 +#: src/tables/build/BuildLineTable.tsx:198 msgid "Consumable" msgstr "" @@ -9433,7 +9443,7 @@ msgid "Bill of materials cannot be edited, as the part is locked" msgstr "" #: src/tables/bom/UsedInTable.tsx:34 -#: src/tables/build/BuildLineTable.tsx:207 +#: src/tables/build/BuildLineTable.tsx:208 #: src/tables/part/ParametricPartTable.tsx:364 #: src/tables/part/PartBuildAllocationsTable.tsx:60 #: src/tables/part/PartTable.tsx:209 @@ -9455,11 +9465,11 @@ msgstr "" msgid "Show trackable assemblies" msgstr "" -#: src/tables/build/BuildAllocatedStockTable.tsx:67 +#: src/tables/build/BuildAllocatedStockTable.tsx:64 msgid "Allocated to Output" msgstr "" -#: src/tables/build/BuildAllocatedStockTable.tsx:68 +#: src/tables/build/BuildAllocatedStockTable.tsx:65 msgid "Show items allocated to a build output" msgstr "" @@ -9472,7 +9482,7 @@ msgstr "" #~ msgid "Include orders for part variants" #~ msgstr "Include orders for part variants" -#: src/tables/build/BuildAllocatedStockTable.tsx:97 +#: src/tables/build/BuildAllocatedStockTable.tsx:94 #: src/tables/part/PartBuildAllocationsTable.tsx:84 #: src/tables/part/PartPurchaseOrdersTable.tsx:132 #: src/tables/part/PartSalesAllocationsTable.tsx:69 @@ -9482,40 +9492,58 @@ msgid "Order Status" msgstr "" #: src/tables/build/BuildAllocatedStockTable.tsx:164 -#~ msgid "Edit Build Item" -#~ msgstr "Edit Build Item" - -#: src/tables/build/BuildAllocatedStockTable.tsx:167 -#: src/tables/build/BuildLineTable.tsx:650 +#: src/tables/build/BuildLineTable.tsx:651 msgid "Edit Stock Allocation" msgstr "Editar asignación de existencias" +#: src/tables/build/BuildAllocatedStockTable.tsx:164 +#~ msgid "Edit Build Item" +#~ msgstr "Edit Build Item" + #: src/tables/build/BuildAllocatedStockTable.tsx:174 #~ msgid "Delete Build Item" #~ msgstr "Delete Build Item" +#: src/tables/build/BuildAllocatedStockTable.tsx:177 +#: src/tables/build/BuildLineTable.tsx:664 +#: src/tables/sales/SalesOrderAllocationTable.tsx:218 +msgid "Remove Allocated Stock" +msgstr "" + #: src/tables/build/BuildAllocatedStockTable.tsx:180 #: src/tables/build/BuildLineTable.tsx:663 -msgid "Delete Stock Allocation" -msgstr "Borrar asignación de existencias" +#~ msgid "Delete Stock Allocation" +#~ msgstr "Delete Stock Allocation" -#: src/tables/build/BuildAllocatedStockTable.tsx:239 +#: src/tables/build/BuildAllocatedStockTable.tsx:182 +#: src/tables/build/BuildLineTable.tsx:669 +#: src/tables/sales/SalesOrderAllocationTable.tsx:221 +msgid "Are you sure you want to remove this allocated stock from the order?" +msgstr "" + +#: src/tables/build/BuildAllocatedStockTable.tsx:242 msgid "Consume" msgstr "" +#: src/tables/build/BuildAllocatedStockTable.tsx:259 +#: src/tables/build/BuildLineTable.tsx:112 +#: src/tables/sales/SalesOrderAllocationTable.tsx:248 +msgid "Remove allocated stock" +msgstr "" + #: src/tables/build/BuildLineTable.tsx:59 #~ msgid "Show lines with available stock" #~ msgstr "Show lines with available stock" -#: src/tables/build/BuildLineTable.tsx:120 +#: src/tables/build/BuildLineTable.tsx:121 msgid "View Stock Item" msgstr "Ver artículo de existencias" -#: src/tables/build/BuildLineTable.tsx:183 +#: src/tables/build/BuildLineTable.tsx:184 msgid "Show fully allocated lines" msgstr "" -#: src/tables/build/BuildLineTable.tsx:188 +#: src/tables/build/BuildLineTable.tsx:189 msgid "Show fully consumed lines" msgstr "" @@ -9523,124 +9551,124 @@ msgstr "" #~ msgid "Show allocated lines" #~ msgstr "Show allocated lines" -#: src/tables/build/BuildLineTable.tsx:193 +#: src/tables/build/BuildLineTable.tsx:194 msgid "Show items with sufficient available stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:198 +#: src/tables/build/BuildLineTable.tsx:199 msgid "Show consumable lines" msgstr "" -#: src/tables/build/BuildLineTable.tsx:203 +#: src/tables/build/BuildLineTable.tsx:204 msgid "Show optional lines" msgstr "" -#: src/tables/build/BuildLineTable.tsx:212 +#: src/tables/build/BuildLineTable.tsx:213 #: src/tables/part/PartTable.tsx:233 msgid "Testable" msgstr "" -#: src/tables/build/BuildLineTable.tsx:217 +#: src/tables/build/BuildLineTable.tsx:218 #: src/tables/stock/StockItemTable.tsx:388 msgid "Tracked" msgstr "" -#: src/tables/build/BuildLineTable.tsx:218 +#: src/tables/build/BuildLineTable.tsx:219 msgid "Show tracked lines" msgstr "" -#: src/tables/build/BuildLineTable.tsx:223 +#: src/tables/build/BuildLineTable.tsx:224 msgid "Show items with stock on order" msgstr "" -#: src/tables/build/BuildLineTable.tsx:258 +#: src/tables/build/BuildLineTable.tsx:259 #: src/tables/sales/SalesOrderLineItemTable.tsx:172 msgid "In production" msgstr "" -#: src/tables/build/BuildLineTable.tsx:286 +#: src/tables/build/BuildLineTable.tsx:287 msgid "Insufficient stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:302 +#: src/tables/build/BuildLineTable.tsx:303 #: src/tables/sales/SalesOrderLineItemTable.tsx:160 #: src/tables/stock/StockItemTable.tsx:191 msgid "No stock available" msgstr "" -#: src/tables/build/BuildLineTable.tsx:375 +#: src/tables/build/BuildLineTable.tsx:376 msgid "Gets Inherited" msgstr "" -#: src/tables/build/BuildLineTable.tsx:388 +#: src/tables/build/BuildLineTable.tsx:389 msgid "Unit Quantity" msgstr "" -#: src/tables/build/BuildLineTable.tsx:415 +#: src/tables/build/BuildLineTable.tsx:416 msgid "Setup Quantity" msgstr "" -#: src/tables/build/BuildLineTable.tsx:424 +#: src/tables/build/BuildLineTable.tsx:425 msgid "Attrition" msgstr "" -#: src/tables/build/BuildLineTable.tsx:432 +#: src/tables/build/BuildLineTable.tsx:433 msgid "Rounding Multiple" msgstr "" -#: src/tables/build/BuildLineTable.tsx:441 +#: src/tables/build/BuildLineTable.tsx:442 msgid "BOM Information" msgstr "" -#: src/tables/build/BuildLineTable.tsx:515 +#: src/tables/build/BuildLineTable.tsx:516 #: src/tables/part/PartBuildAllocationsTable.tsx:102 msgid "Fully allocated" msgstr "" -#: src/tables/build/BuildLineTable.tsx:563 +#: src/tables/build/BuildLineTable.tsx:564 #: src/tables/sales/SalesOrderLineItemTable.tsx:311 msgid "Create Build Order" msgstr "" -#: src/tables/build/BuildLineTable.tsx:592 +#: src/tables/build/BuildLineTable.tsx:593 msgid "Auto allocation in progress" msgstr "Auto asignación en progreso" -#: src/tables/build/BuildLineTable.tsx:595 -#: src/tables/build/BuildLineTable.tsx:802 +#: src/tables/build/BuildLineTable.tsx:596 +#: src/tables/build/BuildLineTable.tsx:809 msgid "Auto Allocate Stock" msgstr "Autoasignar stock" -#: src/tables/build/BuildLineTable.tsx:596 +#: src/tables/build/BuildLineTable.tsx:597 msgid "Automatically allocate stock to this build according to the selected options" msgstr "Asignar stock automáticamente a esta construcción de acuerdo a las opciones seleccionadas" -#: src/tables/build/BuildLineTable.tsx:616 -#: src/tables/build/BuildLineTable.tsx:630 -#: src/tables/build/BuildLineTable.tsx:751 -#: src/tables/build/BuildLineTable.tsx:852 +#: src/tables/build/BuildLineTable.tsx:617 +#: src/tables/build/BuildLineTable.tsx:631 +#: src/tables/build/BuildLineTable.tsx:758 +#: src/tables/build/BuildLineTable.tsx:859 #: src/tables/build/BuildOutputTable.tsx:355 #: src/tables/build/BuildOutputTable.tsx:360 msgid "Deallocate Stock" msgstr "Deshacer asignación de existencias" -#: src/tables/build/BuildLineTable.tsx:632 +#: src/tables/build/BuildLineTable.tsx:633 msgid "Deallocate all untracked stock for this build order" msgstr "Deshacer asignación de todo el stock sin seguimiento para este pedido" -#: src/tables/build/BuildLineTable.tsx:634 +#: src/tables/build/BuildLineTable.tsx:635 msgid "Deallocate stock from the selected line item" msgstr "Deshacer asignación de existencias de la línea de artículo seleccionada" -#: src/tables/build/BuildLineTable.tsx:638 +#: src/tables/build/BuildLineTable.tsx:639 msgid "Stock has been deallocated" msgstr "Deshecha asignación de existencias" -#: src/tables/build/BuildLineTable.tsx:771 +#: src/tables/build/BuildLineTable.tsx:778 msgid "Build Stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:784 +#: src/tables/build/BuildLineTable.tsx:791 #: src/tables/sales/SalesOrderLineItemTable.tsx:487 msgid "View Part" msgstr "Ver pieza" @@ -9739,7 +9767,7 @@ msgid "Serialize Build Output" msgstr "" #: src/tables/build/BuildOutputTable.tsx:405 -#: src/tables/part/PartTestResultTable.tsx:310 +#: src/tables/part/PartTestResultTable.tsx:318 #: src/tables/stock/StockItemTable.tsx:328 msgid "Filter by stock status" msgstr "" @@ -9964,8 +9992,8 @@ msgid "View Item" msgstr "" #: src/tables/general/ExtraLineItemTable.tsx:95 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:299 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:403 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:300 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:405 #: src/tables/sales/ReturnOrderLineItemTable.tsx:83 #: src/tables/sales/ReturnOrderLineItemTable.tsx:187 #: src/tables/sales/SalesOrderLineItemTable.tsx:252 @@ -9974,14 +10002,14 @@ msgid "Add Line Item" msgstr "Añadir Artículo de Línea" #: src/tables/general/ExtraLineItemTable.tsx:108 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:320 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:322 #: src/tables/sales/ReturnOrderLineItemTable.tsx:96 #: src/tables/sales/SalesOrderLineItemTable.tsx:271 msgid "Edit Line Item" msgstr "Editar artículo de línea" #: src/tables/general/ExtraLineItemTable.tsx:117 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:329 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:331 #: src/tables/sales/ReturnOrderLineItemTable.tsx:105 #: src/tables/sales/SalesOrderLineItemTable.tsx:280 msgid "Delete Line Item" @@ -10273,7 +10301,7 @@ msgid "Required Stock" msgstr "Stock requerido" #: src/tables/part/PartBuildAllocationsTable.tsx:124 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:381 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:383 msgid "View Build Order" msgstr "Ver orden de construcción" @@ -10617,8 +10645,8 @@ msgstr "" #: src/tables/part/PartTestResultTable.tsx:103 #: src/tables/part/PartTestResultTable.tsx:181 -#: src/tables/part/PartTestResultTable.tsx:320 -#: src/tables/part/PartTestResultTable.tsx:334 +#: src/tables/part/PartTestResultTable.tsx:328 +#: src/tables/part/PartTestResultTable.tsx:342 #: src/tables/stock/StockItemTestResultTable.tsx:296 #: src/tables/stock/StockItemTestResultTable.tsx:368 #: src/tables/stock/StockItemTestResultTable.tsx:429 @@ -10643,7 +10671,7 @@ msgstr "" msgid "No Result" msgstr "" -#: src/tables/part/PartTestResultTable.tsx:298 +#: src/tables/part/PartTestResultTable.tsx:306 msgid "Show build outputs currently in production" msgstr "" @@ -11073,7 +11101,7 @@ msgid "Show manufacturer parts for active manufacturers." msgstr "" #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:115 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:397 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:399 msgid "Import Line Items" msgstr "" @@ -11099,11 +11127,11 @@ msgstr "Mostrar elementos de línea que han sido recibidos" #~ msgid "Add line item" #~ msgstr "Add line item" -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:350 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:352 msgid "Receive line item" msgstr "" -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:414 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:416 msgid "Receive items" msgstr "" @@ -11201,25 +11229,25 @@ msgid "Not shipped" msgstr "No enviado" #: src/tables/sales/SalesOrderAllocationTable.tsx:211 -#: src/tables/sales/SalesOrderAllocationTable.tsx:229 +#: src/tables/sales/SalesOrderAllocationTable.tsx:235 msgid "Edit Allocation" msgstr "Editar Asignación" #: src/tables/sales/SalesOrderAllocationTable.tsx:218 #: src/tables/sales/SalesOrderAllocationTable.tsx:241 -msgid "Delete Allocation" -msgstr "Borrar asignación" +#~ msgid "Delete Allocation" +#~ msgstr "Delete Allocation" -#: src/tables/sales/SalesOrderAllocationTable.tsx:252 -#: src/tables/sales/SalesOrderAllocationTable.tsx:253 +#: src/tables/sales/SalesOrderAllocationTable.tsx:261 +#: src/tables/sales/SalesOrderAllocationTable.tsx:262 msgid "View Shipment" msgstr "Ver envío" -#: src/tables/sales/SalesOrderAllocationTable.tsx:308 +#: src/tables/sales/SalesOrderAllocationTable.tsx:317 msgid "Assign to Shipment" msgstr "" -#: src/tables/sales/SalesOrderAllocationTable.tsx:324 +#: src/tables/sales/SalesOrderAllocationTable.tsx:333 msgid "Assign to shipment" msgstr "" diff --git a/src/frontend/src/locales/es_MX/messages.po b/src/frontend/src/locales/es_MX/messages.po index 1889ee6c36..9e6d0d661c 100644 --- a/src/frontend/src/locales/es_MX/messages.po +++ b/src/frontend/src/locales/es_MX/messages.po @@ -8,7 +8,7 @@ msgstr "" "Language: es_MX\n" "Project-Id-Version: inventree\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2025-11-19 19:39\n" +"PO-Revision-Date: 2025-11-22 06:25\n" "Last-Translator: \n" "Language-Team: Spanish, Mexico\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" @@ -56,7 +56,7 @@ msgstr "Cancelar" #: lib/components/RowActions.tsx:136 #: src/components/nav/NavigationDrawer.tsx:190 -#: src/forms/PurchaseOrderForms.tsx:802 +#: src/forms/PurchaseOrderForms.tsx:854 #: src/forms/StockForms.tsx:796 #: src/forms/StockForms.tsx:843 #: src/forms/StockForms.tsx:889 @@ -103,9 +103,9 @@ msgstr "No" #: src/forms/BuildForms.tsx:630 #: src/forms/BuildForms.tsx:793 #: src/forms/BuildForms.tsx:896 -#: src/forms/PurchaseOrderForms.tsx:798 +#: src/forms/PurchaseOrderForms.tsx:850 #: src/forms/ReturnOrderForms.tsx:242 -#: src/forms/SalesOrderForms.tsx:305 +#: src/forms/SalesOrderForms.tsx:323 #: src/forms/StockForms.tsx:360 #: src/forms/StockForms.tsx:791 #: src/forms/StockForms.tsx:838 @@ -119,6 +119,7 @@ msgstr "No" #: src/pages/build/BuildDetail.tsx:200 #: src/pages/part/PartDetail.tsx:1207 #: src/tables/ColumnRenderers.tsx:91 +#: src/tables/part/PartTestResultTable.tsx:247 #: src/tables/part/RelatedPartTable.tsx:53 #: src/tables/stock/StockTrackingTable.tsx:87 msgid "Part" @@ -158,7 +159,7 @@ msgstr "Plantillas de prueba de piezas" #: src/components/wizards/OrderPartsWizard.tsx:290 #: src/pages/company/SupplierPartDetail.tsx:413 #: src/pages/stock/StockDetail.tsx:289 -#: src/tables/build/BuildAllocatedStockTable.tsx:155 +#: src/tables/build/BuildAllocatedStockTable.tsx:152 #: src/tables/part/PartPurchaseOrdersTable.tsx:50 #: src/tables/purchasing/SupplierPartTable.tsx:83 #: src/tables/stock/StockItemTable.tsx:247 @@ -201,9 +202,9 @@ msgstr "Categorías de Pieza" #: src/forms/BuildForms.tsx:473 #: src/forms/BuildForms.tsx:633 #: src/forms/BuildForms.tsx:794 -#: src/forms/SalesOrderForms.tsx:307 +#: src/forms/SalesOrderForms.tsx:325 #: src/pages/stock/StockDetail.tsx:1005 -#: src/tables/part/PartTestResultTable.tsx:248 +#: src/tables/part/PartTestResultTable.tsx:256 #: src/tables/stock/StockTrackingTable.tsx:48 #: src/tables/stock/StockTrackingTable.tsx:55 msgid "Stock Item" @@ -517,7 +518,7 @@ msgstr "Listas de Selección" #: src/components/dashboard/DashboardLayout.tsx:281 #: src/components/editors/NotesEditor.tsx:74 #: src/components/editors/TemplateEditor/TemplateEditor.tsx:158 -#: src/components/forms/fields/ApiFormField.tsx:273 +#: src/components/forms/fields/ApiFormField.tsx:237 #: src/components/forms/fields/TableField.tsx:45 #: src/components/importer/ImportDataSelector.tsx:192 #: src/components/importer/ImporterColumnSelector.tsx:234 @@ -642,8 +643,8 @@ msgstr "Introduce datos del código de barras" #: src/components/barcodes/BarcodeScanDialog.tsx:49 #: src/components/buttons/ScanButton.tsx:15 #: src/components/nav/NavigationDrawer.tsx:122 -#: src/forms/PurchaseOrderForms.tsx:457 -#: src/forms/PurchaseOrderForms.tsx:563 +#: src/forms/PurchaseOrderForms.tsx:509 +#: src/forms/PurchaseOrderForms.tsx:615 msgid "Scan Barcode" msgstr "Escanear código de barras" @@ -728,7 +729,7 @@ msgstr "Esto eliminará el enlace al código de barras asociado" #: src/components/barcodes/QRCode.tsx:205 #: src/components/items/ActionDropdown.tsx:192 -#: src/forms/PurchaseOrderForms.tsx:554 +#: src/forms/PurchaseOrderForms.tsx:606 msgid "Unlink Barcode" msgstr "Desvincular Código de Barras" @@ -1216,6 +1217,12 @@ msgstr "¿Eliminar imagen asociada al artículo?" #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:884 #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:903 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:254 +#: src/tables/build/BuildAllocatedStockTable.tsx:178 +#: src/tables/build/BuildAllocatedStockTable.tsx:258 +#: src/tables/build/BuildLineTable.tsx:111 +#: src/tables/build/BuildLineTable.tsx:665 +#: src/tables/sales/SalesOrderAllocationTable.tsx:224 +#: src/tables/sales/SalesOrderAllocationTable.tsx:247 msgid "Remove" msgstr "Eliminar" @@ -1241,7 +1248,7 @@ msgid "Upload Error" msgstr "Error al subir" #: src/components/details/DetailsImage.tsx:250 -#: src/components/forms/fields/TextField.tsx:65 +#: src/components/forms/fields/AutoFillRightSection.tsx:34 msgid "Clear" msgstr "Borrar" @@ -1817,10 +1824,14 @@ msgstr "Detenido" msgid "Running" msgstr "En ejecución" -#: src/components/forms/fields/ApiFormField.tsx:233 +#: src/components/forms/fields/ApiFormField.tsx:197 msgid "Select file to upload" msgstr "" +#: src/components/forms/fields/AutoFillRightSection.tsx:47 +msgid "Accept suggested value" +msgstr "" + #: src/components/forms/fields/DateField.tsx:76 msgid "Select date" msgstr "" @@ -1875,10 +1886,6 @@ msgstr "No hay entradas disponibles" msgid "Add new row" msgstr "Añadir fila nueva" -#: src/components/forms/fields/TextField.tsx:82 -msgid "Accept suggested value" -msgstr "" - #: src/components/images/DetailsImage.tsx:252 #~ msgid "Select image" #~ msgstr "Select image" @@ -2225,8 +2232,8 @@ msgstr "" #: src/pages/part/PartDetail.tsx:994 #: src/pages/stock/StockDetail.tsx:265 #: src/pages/stock/StockDetail.tsx:942 -#: src/tables/build/BuildAllocatedStockTable.tsx:135 -#: src/tables/build/BuildLineTable.tsx:192 +#: src/tables/build/BuildAllocatedStockTable.tsx:132 +#: src/tables/build/BuildLineTable.tsx:193 #: src/tables/part/PartTable.tsx:137 #: src/tables/stock/StockItemTable.tsx:182 #: src/tables/stock/StockItemTable.tsx:343 @@ -2784,7 +2791,7 @@ msgstr "Información del complemento" #: src/pages/sales/SalesOrderDetail.tsx:119 #: src/pages/stock/LocationDetail.tsx:102 #: src/tables/ColumnRenderers.tsx:278 -#: src/tables/build/BuildAllocatedStockTable.tsx:91 +#: src/tables/build/BuildAllocatedStockTable.tsx:88 #: src/tables/machine/MachineTypeTable.tsx:161 #: src/tables/machine/MachineTypeTable.tsx:257 #: src/tables/plugin/PluginListTable.tsx:110 @@ -2966,7 +2973,7 @@ msgstr "Sin existencias" #: src/pages/company/SupplierPartDetail.tsx:394 #: src/pages/part/PartDetail.tsx:1015 #: src/tables/bom/BomTable.tsx:444 -#: src/tables/build/BuildLineTable.tsx:222 +#: src/tables/build/BuildLineTable.tsx:223 #: src/tables/part/PartTable.tsx:108 msgid "On Order" msgstr "En pedido" @@ -2976,7 +2983,7 @@ msgstr "En pedido" #: src/pages/part/PartDetail.tsx:587 #: src/pages/part/PartDetail.tsx:1021 #: src/pages/stock/StockDetail.tsx:925 -#: src/tables/part/PartTestResultTable.tsx:297 +#: src/tables/part/PartTestResultTable.tsx:305 #: src/tables/stock/StockItemTable.tsx:359 msgid "In Production" msgstr "En producción" @@ -3000,7 +3007,7 @@ msgstr "Categoría" #: src/components/render/Stock.tsx:114 #: src/components/render/Stock.tsx:132 #: src/forms/BuildForms.tsx:795 -#: src/forms/PurchaseOrderForms.tsx:595 +#: src/forms/PurchaseOrderForms.tsx:647 #: src/forms/StockForms.tsx:792 #: src/forms/StockForms.tsx:839 #: src/forms/StockForms.tsx:885 @@ -3023,7 +3030,7 @@ msgstr "Ubicación" #: src/components/render/Stock.tsx:99 #: src/pages/stock/StockDetail.tsx:198 #: src/pages/stock/StockDetail.tsx:930 -#: src/tables/build/BuildAllocatedStockTable.tsx:121 +#: src/tables/build/BuildAllocatedStockTable.tsx:118 #: src/tables/build/BuildOutputTable.tsx:107 #: src/tables/sales/SalesOrderAllocationTable.tsx:142 msgid "Serial Number" @@ -3034,9 +3041,9 @@ msgstr "Número de serie" #: src/forms/BuildForms.tsx:240 #: src/forms/BuildForms.tsx:634 #: src/forms/BuildForms.tsx:797 -#: src/forms/PurchaseOrderForms.tsx:801 +#: src/forms/PurchaseOrderForms.tsx:853 #: src/forms/ReturnOrderForms.tsx:243 -#: src/forms/SalesOrderForms.tsx:308 +#: src/forms/SalesOrderForms.tsx:326 #: src/forms/StockForms.tsx:841 #: src/pages/part/PartStockHistoryDetail.tsx:56 #: src/pages/part/PartStockHistoryDetail.tsx:210 @@ -3046,9 +3053,9 @@ msgstr "Número de serie" #: src/pages/part/pricing/PriceBreakPanel.tsx:172 #: src/pages/stock/StockDetail.tsx:258 #: src/pages/stock/StockDetail.tsx:936 -#: src/tables/build/BuildLineTable.tsx:86 +#: src/tables/build/BuildLineTable.tsx:83 #: src/tables/part/PartPurchaseOrdersTable.tsx:94 -#: src/tables/part/PartTestResultTable.tsx:269 +#: src/tables/part/PartTestResultTable.tsx:277 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:175 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:206 #: src/tables/purchasing/SupplierPriceBreakTable.tsx:69 @@ -3070,7 +3077,7 @@ msgstr "Cantidad" #: src/forms/StockForms.tsx:1048 #: src/forms/StockForms.tsx:1096 #: src/forms/StockForms.tsx:1140 -#: src/tables/build/BuildLineTable.tsx:96 +#: src/tables/build/BuildLineTable.tsx:93 msgid "Batch" msgstr "Lote" @@ -3755,7 +3762,7 @@ msgid "In Stock" msgstr "En Stock" #: src/components/wizards/OrderPartsWizard.tsx:146 -#: src/tables/build/BuildLineTable.tsx:404 +#: src/tables/build/BuildLineTable.tsx:405 msgid "Required Quantity" msgstr "Cantidad requerida" @@ -3847,7 +3854,7 @@ msgid "Please correct the errors in the selected parts" msgstr "Por favor, corrija los errores en las partes seleccionadas" #: src/components/wizards/OrderPartsWizard.tsx:587 -#: src/tables/build/BuildLineTable.tsx:815 +#: src/tables/build/BuildLineTable.tsx:822 #: src/tables/part/PartTable.tsx:522 #: src/tables/sales/SalesOrderLineItemTable.tsx:370 msgid "Order Parts" @@ -4349,9 +4356,9 @@ msgstr "" #: src/forms/BuildForms.tsx:333 #: src/forms/BuildForms.tsx:408 #: src/forms/BuildForms.tsx:685 -#: src/tables/build/BuildAllocatedStockTable.tsx:150 +#: src/tables/build/BuildAllocatedStockTable.tsx:147 #: src/tables/build/BuildOutputTable.tsx:582 -#: src/tables/part/PartTestResultTable.tsx:272 +#: src/tables/part/PartTestResultTable.tsx:280 msgid "Build Output" msgstr "" @@ -4362,7 +4369,7 @@ msgstr "" #: src/forms/BuildForms.tsx:336 #: src/forms/BuildForms.tsx:411 #: src/forms/BuildForms.tsx:475 -#: src/forms/PurchaseOrderForms.tsx:717 +#: src/forms/PurchaseOrderForms.tsx:769 #: src/forms/ReturnOrderForms.tsx:197 #: src/forms/ReturnOrderForms.tsx:244 #: src/forms/StockForms.tsx:712 @@ -4377,7 +4384,7 @@ msgstr "" #: src/tables/build/BuildOutputTable.tsx:404 #: src/tables/machine/MachineListTable.tsx:387 #: src/tables/part/PartPurchaseOrdersTable.tsx:38 -#: src/tables/part/PartTestResultTable.tsx:309 +#: src/tables/part/PartTestResultTable.tsx:317 #: src/tables/sales/ReturnOrderLineItemTable.tsx:138 #: src/tables/sales/ReturnOrderLineItemTable.tsx:176 #: src/tables/settings/CustomStateTable.tsx:79 @@ -4450,8 +4457,8 @@ msgstr "Las salidas de la construcción han sido canceladas" #: src/pages/stock/StockDetail.tsx:153 #: src/tables/bom/BomTable.tsx:134 #: src/tables/bom/UsedInTable.tsx:40 -#: src/tables/build/BuildAllocatedStockTable.tsx:108 -#: src/tables/build/BuildLineTable.tsx:336 +#: src/tables/build/BuildAllocatedStockTable.tsx:105 +#: src/tables/build/BuildLineTable.tsx:337 #: src/tables/build/BuildOrderTable.tsx:79 #: src/tables/part/PartSalesAllocationsTable.tsx:61 #: src/tables/part/RelatedPartTable.tsx:73 @@ -4466,47 +4473,47 @@ msgstr "IPN" #: src/forms/BuildForms.tsx:632 #: src/forms/BuildForms.tsx:796 #: src/forms/BuildForms.tsx:897 -#: src/forms/SalesOrderForms.tsx:306 -#: src/tables/build/BuildAllocatedStockTable.tsx:139 -#: src/tables/build/BuildLineTable.tsx:182 +#: src/forms/SalesOrderForms.tsx:324 +#: src/tables/build/BuildAllocatedStockTable.tsx:136 +#: src/tables/build/BuildLineTable.tsx:183 #: src/tables/sales/SalesOrderLineItemTable.tsx:342 #: src/tables/stock/StockItemTable.tsx:338 msgid "Allocated" msgstr "Asignado" #: src/forms/BuildForms.tsx:667 -#: src/forms/SalesOrderForms.tsx:295 +#: src/forms/SalesOrderForms.tsx:313 #: src/pages/build/BuildDetail.tsx:108 #: src/pages/build/BuildDetail.tsx:326 msgid "Source Location" msgstr "Ubicación origen" #: src/forms/BuildForms.tsx:668 -#: src/forms/SalesOrderForms.tsx:296 +#: src/forms/SalesOrderForms.tsx:314 msgid "Select the source location for the stock allocation" msgstr "Seleccione la ubicación de origen para la asignación de stock" #: src/forms/BuildForms.tsx:700 -#: src/forms/SalesOrderForms.tsx:336 -#: src/tables/build/BuildLineTable.tsx:574 -#: src/tables/build/BuildLineTable.tsx:731 -#: src/tables/build/BuildLineTable.tsx:830 +#: src/forms/SalesOrderForms.tsx:354 +#: src/tables/build/BuildLineTable.tsx:575 +#: src/tables/build/BuildLineTable.tsx:738 +#: src/tables/build/BuildLineTable.tsx:837 #: src/tables/sales/SalesOrderLineItemTable.tsx:380 #: src/tables/sales/SalesOrderLineItemTable.tsx:406 msgid "Allocate Stock" msgstr "Stock Asignado" #: src/forms/BuildForms.tsx:703 -#: src/forms/SalesOrderForms.tsx:341 +#: src/forms/SalesOrderForms.tsx:359 msgid "Stock items allocated" msgstr "Artículos de stock seleccionados" #: src/forms/BuildForms.tsx:816 #: src/forms/BuildForms.tsx:917 -#: src/tables/build/BuildAllocatedStockTable.tsx:240 -#: src/tables/build/BuildAllocatedStockTable.tsx:272 -#: src/tables/build/BuildLineTable.tsx:741 -#: src/tables/build/BuildLineTable.tsx:864 +#: src/tables/build/BuildAllocatedStockTable.tsx:243 +#: src/tables/build/BuildAllocatedStockTable.tsx:279 +#: src/tables/build/BuildLineTable.tsx:748 +#: src/tables/build/BuildLineTable.tsx:871 msgid "Consume Stock" msgstr "" @@ -4521,21 +4528,21 @@ msgstr "" #~ msgstr "Stock items consumed" #: src/forms/BuildForms.tsx:853 -#: src/tables/build/BuildLineTable.tsx:514 +#: src/tables/build/BuildLineTable.tsx:515 #: src/tables/part/PartBuildAllocationsTable.tsx:101 msgid "Fully consumed" msgstr "" #: src/forms/BuildForms.tsx:898 -#: src/tables/build/BuildLineTable.tsx:187 +#: src/tables/build/BuildLineTable.tsx:188 #: src/tables/stock/StockItemTable.tsx:367 msgid "Consumed" msgstr "Consumido" #: src/forms/CommonForms.tsx:88 -#: src/forms/PurchaseOrderForms.tsx:125 +#: src/forms/PurchaseOrderForms.tsx:176 #: src/forms/ReturnOrderForms.tsx:138 -#: src/forms/SalesOrderForms.tsx:164 +#: src/forms/SalesOrderForms.tsx:182 msgid "Select project code for this line item" msgstr "" @@ -4572,127 +4579,127 @@ msgstr "Categoría superior de pieza" msgid "Subscribe to notifications for this category" msgstr "Suscribirse a las notificaciones de esta categoría" -#: src/forms/PurchaseOrderForms.tsx:388 -msgid "Assign Batch Code and Serial Numbers" -msgstr "Asignar código de lote y números de serie" - -#: src/forms/PurchaseOrderForms.tsx:390 -msgid "Assign Batch Code" -msgstr "Asignar código de lote" - -#: src/forms/PurchaseOrderForms.tsx:410 -msgid "Choose Location" -msgstr "Elegir ubicación" - -#: src/forms/PurchaseOrderForms.tsx:418 -msgid "Item Destination selected" -msgstr "Destino de artículo seleccionado" - #: src/forms/PurchaseOrderForms.tsx:421 #~ msgid "Assign Batch Code{0}" #~ msgstr "Assign Batch Code{0}" -#: src/forms/PurchaseOrderForms.tsx:428 -msgid "Part category default location selected" -msgstr "Ubicación por defecto de la categoría de pieza eleccionada" +#: src/forms/PurchaseOrderForms.tsx:440 +msgid "Assign Batch Code and Serial Numbers" +msgstr "Asignar código de lote y números de serie" -#: src/forms/PurchaseOrderForms.tsx:438 -msgid "Received stock location selected" -msgstr "Seleccionada ubicación de existencias recibidas" +#: src/forms/PurchaseOrderForms.tsx:442 +msgid "Assign Batch Code" +msgstr "Asignar código de lote" #: src/forms/PurchaseOrderForms.tsx:444 #: src/forms/StockForms.tsx:428 #~ msgid "Remove item from list" #~ msgstr "Remove item from list" -#: src/forms/PurchaseOrderForms.tsx:446 +#: src/forms/PurchaseOrderForms.tsx:462 +msgid "Choose Location" +msgstr "Elegir ubicación" + +#: src/forms/PurchaseOrderForms.tsx:470 +msgid "Item Destination selected" +msgstr "Destino de artículo seleccionado" + +#: src/forms/PurchaseOrderForms.tsx:480 +msgid "Part category default location selected" +msgstr "Ubicación por defecto de la categoría de pieza eleccionada" + +#: src/forms/PurchaseOrderForms.tsx:490 +msgid "Received stock location selected" +msgstr "Seleccionada ubicación de existencias recibidas" + +#: src/forms/PurchaseOrderForms.tsx:498 msgid "Default location selected" msgstr "Ubicación por defecto seleccionada" -#: src/forms/PurchaseOrderForms.tsx:507 +#: src/forms/PurchaseOrderForms.tsx:559 msgid "Set Location" msgstr "Establecer ubicación" -#: src/forms/PurchaseOrderForms.tsx:524 -msgid "Set Expiry Date" -msgstr "Establecer la fecha de caducidad" - -#: src/forms/PurchaseOrderForms.tsx:532 -#: src/forms/StockForms.tsx:693 -msgid "Adjust Packaging" -msgstr "Ajustar empaquetado" - -#: src/forms/PurchaseOrderForms.tsx:540 -#: src/forms/StockForms.tsx:684 -#: src/hooks/UseStockAdjustActions.tsx:148 -msgid "Change Status" -msgstr "Cambiar Estado" - -#: src/forms/PurchaseOrderForms.tsx:546 -msgid "Add Note" -msgstr "Añadir Nota" - #: src/forms/PurchaseOrderForms.tsx:566 #~ msgid "Serial numbers" #~ msgstr "Serial numbers" +#: src/forms/PurchaseOrderForms.tsx:576 +msgid "Set Expiry Date" +msgstr "Establecer la fecha de caducidad" + #: src/forms/PurchaseOrderForms.tsx:582 #~ msgid "Store at line item destination" #~ msgstr "Store at line item destination" -#: src/forms/PurchaseOrderForms.tsx:610 -msgid "Store at default location" -msgstr "Guardar en la ubicación predeterminada" +#: src/forms/PurchaseOrderForms.tsx:584 +#: src/forms/StockForms.tsx:693 +msgid "Adjust Packaging" +msgstr "Ajustar empaquetado" -#: src/forms/PurchaseOrderForms.tsx:625 -msgid "Store at line item destination " -msgstr "" +#: src/forms/PurchaseOrderForms.tsx:592 +#: src/forms/StockForms.tsx:684 +#: src/hooks/UseStockAdjustActions.tsx:148 +msgid "Change Status" +msgstr "Cambiar Estado" -#: src/forms/PurchaseOrderForms.tsx:637 -msgid "Store with already received stock" -msgstr "Guardar con cantidad ya recibida" +#: src/forms/PurchaseOrderForms.tsx:598 +msgid "Add Note" +msgstr "Añadir Nota" #: src/forms/PurchaseOrderForms.tsx:658 #~ msgid "Receive line items" #~ msgstr "Receive line items" -#: src/forms/PurchaseOrderForms.tsx:661 +#: src/forms/PurchaseOrderForms.tsx:662 +msgid "Store at default location" +msgstr "Guardar en la ubicación predeterminada" + +#: src/forms/PurchaseOrderForms.tsx:677 +msgid "Store at line item destination " +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:689 +msgid "Store with already received stock" +msgstr "Guardar con cantidad ya recibida" + +#: src/forms/PurchaseOrderForms.tsx:713 #: src/pages/build/BuildDetail.tsx:340 #: src/pages/stock/StockDetail.tsx:280 #: src/pages/stock/StockDetail.tsx:952 #: src/tables/Filter.tsx:83 -#: src/tables/build/BuildAllocatedStockTable.tsx:128 +#: src/tables/build/BuildAllocatedStockTable.tsx:125 #: src/tables/build/BuildOutputTable.tsx:112 -#: src/tables/part/PartTestResultTable.tsx:260 -#: src/tables/part/PartTestResultTable.tsx:281 +#: src/tables/part/PartTestResultTable.tsx:268 +#: src/tables/part/PartTestResultTable.tsx:289 #: src/tables/sales/SalesOrderAllocationTable.tsx:149 msgid "Batch Code" msgstr "Código de lote" -#: src/forms/PurchaseOrderForms.tsx:662 +#: src/forms/PurchaseOrderForms.tsx:714 msgid "Enter batch code for received items" msgstr "Introduzca el código de lote para los artículos recibidos" -#: src/forms/PurchaseOrderForms.tsx:675 +#: src/forms/PurchaseOrderForms.tsx:727 #: src/forms/StockForms.tsx:218 msgid "Serial Numbers" msgstr "Números de serie" -#: src/forms/PurchaseOrderForms.tsx:676 +#: src/forms/PurchaseOrderForms.tsx:728 msgid "Enter serial numbers for received items" msgstr "Introduzca números de serie para los elementos recibidos" -#: src/forms/PurchaseOrderForms.tsx:690 +#: src/forms/PurchaseOrderForms.tsx:742 #: src/pages/stock/StockDetail.tsx:382 #: src/tables/stock/StockItemTable.tsx:294 msgid "Expiry Date" msgstr "Fecha de caducidad" -#: src/forms/PurchaseOrderForms.tsx:691 +#: src/forms/PurchaseOrderForms.tsx:743 msgid "Enter an expiry date for received items" msgstr "Introduzca una fecha de caducidad para los artículos recibidos" -#: src/forms/PurchaseOrderForms.tsx:703 +#: src/forms/PurchaseOrderForms.tsx:755 #: src/forms/StockForms.tsx:728 #: src/pages/company/SupplierPartDetail.tsx:172 #: src/pages/company/SupplierPartDetail.tsx:236 @@ -4701,19 +4708,19 @@ msgstr "Introduzca una fecha de caducidad para los artículos recibidos" msgid "Packaging" msgstr "Empaquetado" -#: src/forms/PurchaseOrderForms.tsx:727 +#: src/forms/PurchaseOrderForms.tsx:779 #: src/pages/company/SupplierPartDetail.tsx:120 #: src/tables/ColumnRenderers.tsx:332 msgid "Note" msgstr "Nota" -#: src/forms/PurchaseOrderForms.tsx:799 +#: src/forms/PurchaseOrderForms.tsx:851 #: src/pages/company/SupplierPartDetail.tsx:138 #: src/tables/purchasing/SupplierPriceBreakTable.tsx:49 msgid "SKU" msgstr "SKU" -#: src/forms/PurchaseOrderForms.tsx:800 +#: src/forms/PurchaseOrderForms.tsx:852 #: src/tables/part/PartPurchaseOrdersTable.tsx:127 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:213 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:283 @@ -4721,11 +4728,11 @@ msgstr "SKU" msgid "Received" msgstr "Recibido" -#: src/forms/PurchaseOrderForms.tsx:817 +#: src/forms/PurchaseOrderForms.tsx:869 msgid "Receive Line Items" msgstr "Recibir partidas" -#: src/forms/PurchaseOrderForms.tsx:823 +#: src/forms/PurchaseOrderForms.tsx:875 msgid "Items received" msgstr "Artículos recibidos" @@ -4737,7 +4744,7 @@ msgstr "Recibir artículos" msgid "Item received into stock" msgstr "Artículo recibido en existencias" -#: src/forms/SalesOrderForms.tsx:401 +#: src/forms/SalesOrderForms.tsx:419 msgid "Leave blank to use the order address" msgstr "" @@ -5932,6 +5939,9 @@ msgstr "" #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:310 #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:401 +#: src/tables/build/BuildAllocatedStockTable.tsx:181 +#: src/tables/build/BuildLineTable.tsx:668 +#: src/tables/sales/SalesOrderAllocationTable.tsx:220 msgid "Confirm Removal" msgstr "" @@ -6870,8 +6880,8 @@ msgstr "" #: src/pages/sales/ReturnOrderDetail.tsx:108 #: src/pages/sales/SalesOrderDetail.tsx:98 #: src/tables/ColumnRenderers.tsx:321 -#: src/tables/build/BuildAllocatedStockTable.tsx:115 -#: src/tables/build/BuildLineTable.tsx:352 +#: src/tables/build/BuildAllocatedStockTable.tsx:112 +#: src/tables/build/BuildLineTable.tsx:353 msgid "Reference" msgstr "Referencia" @@ -7132,7 +7142,7 @@ msgstr "Cancelar pedido" #: src/pages/build/BuildDetail.tsx:742 #: src/pages/stock/StockDetail.tsx:344 -#: src/tables/build/BuildAllocatedStockTable.tsx:85 +#: src/tables/build/BuildAllocatedStockTable.tsx:82 #: src/tables/part/PartBuildAllocationsTable.tsx:45 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:157 #: src/tables/stock/StockTrackingTable.tsx:109 @@ -7600,7 +7610,7 @@ msgstr "Palabras claves" #: src/pages/part/PartDetail.tsx:542 #: src/tables/bom/BomTable.tsx:439 -#: src/tables/build/BuildLineTable.tsx:305 +#: src/tables/build/BuildLineTable.tsx:306 #: src/tables/part/PartTable.tsx:319 #: src/tables/sales/SalesOrderLineItemTable.tsx:138 msgid "Available Stock" @@ -7608,7 +7618,7 @@ msgstr "Existencias disponibles" #: src/pages/part/PartDetail.tsx:548 #: src/tables/bom/BomTable.tsx:341 -#: src/tables/build/BuildLineTable.tsx:267 +#: src/tables/build/BuildLineTable.tsx:268 #: src/tables/sales/SalesOrderLineItemTable.tsx:180 msgid "On order" msgstr "En pedido" @@ -7782,7 +7792,7 @@ msgstr "Pedido" #: src/pages/part/PartDetail.tsx:1144 #: src/pages/stock/StockDetail.tsx:884 -#: src/tables/build/BuildLineTable.tsx:761 +#: src/tables/build/BuildLineTable.tsx:768 msgid "Order Stock" msgstr "" @@ -9219,13 +9229,13 @@ msgstr "" #~ msgstr "Show asssmbled items" #: src/tables/bom/BomTable.tsx:315 -#: src/tables/build/BuildLineTable.tsx:276 +#: src/tables/build/BuildLineTable.tsx:277 #: src/tables/part/PartTable.tsx:145 msgid "External stock" msgstr "" #: src/tables/bom/BomTable.tsx:323 -#: src/tables/build/BuildLineTable.tsx:239 +#: src/tables/build/BuildLineTable.tsx:240 msgid "Includes substitute stock" msgstr "" @@ -9234,7 +9244,7 @@ msgstr "" #~ msgstr "Edit Bom Item" #: src/tables/bom/BomTable.tsx:332 -#: src/tables/build/BuildLineTable.tsx:249 +#: src/tables/build/BuildLineTable.tsx:250 #: src/tables/sales/SalesOrderLineItemTable.tsx:166 msgid "Includes variant stock" msgstr "" @@ -9272,8 +9282,8 @@ msgid "Stock Information" msgstr "" #: src/tables/bom/BomTable.tsx:399 -#: src/tables/build/BuildLineTable.tsx:496 -#: src/tables/build/BuildLineTable.tsx:537 +#: src/tables/build/BuildLineTable.tsx:497 +#: src/tables/build/BuildLineTable.tsx:538 msgid "Consumable item" msgstr "" @@ -9282,7 +9292,7 @@ msgid "No available stock" msgstr "" #: src/tables/bom/BomTable.tsx:420 -#: src/tables/build/BuildLineTable.tsx:213 +#: src/tables/build/BuildLineTable.tsx:214 msgid "Show testable items" msgstr "" @@ -9291,7 +9301,7 @@ msgid "Show trackable items" msgstr "" #: src/tables/bom/BomTable.tsx:430 -#: src/tables/build/BuildLineTable.tsx:208 +#: src/tables/build/BuildLineTable.tsx:209 msgid "Show assembled items" msgstr "" @@ -9335,7 +9345,7 @@ msgstr "" #: src/tables/bom/BomTable.tsx:464 #: src/tables/bom/UsedInTable.tsx:85 -#: src/tables/build/BuildLineTable.tsx:202 +#: src/tables/build/BuildLineTable.tsx:203 msgid "Optional" msgstr "Opcional" @@ -9345,7 +9355,7 @@ msgid "Show optional items" msgstr "" #: src/tables/bom/BomTable.tsx:469 -#: src/tables/build/BuildLineTable.tsx:197 +#: src/tables/build/BuildLineTable.tsx:198 msgid "Consumable" msgstr "Consumible" @@ -9433,7 +9443,7 @@ msgid "Bill of materials cannot be edited, as the part is locked" msgstr "" #: src/tables/bom/UsedInTable.tsx:34 -#: src/tables/build/BuildLineTable.tsx:207 +#: src/tables/build/BuildLineTable.tsx:208 #: src/tables/part/ParametricPartTable.tsx:364 #: src/tables/part/PartBuildAllocationsTable.tsx:60 #: src/tables/part/PartTable.tsx:209 @@ -9455,11 +9465,11 @@ msgstr "Rastreable" msgid "Show trackable assemblies" msgstr "Mostrar ensamblajes rastreables" -#: src/tables/build/BuildAllocatedStockTable.tsx:67 +#: src/tables/build/BuildAllocatedStockTable.tsx:64 msgid "Allocated to Output" msgstr "" -#: src/tables/build/BuildAllocatedStockTable.tsx:68 +#: src/tables/build/BuildAllocatedStockTable.tsx:65 msgid "Show items allocated to a build output" msgstr "" @@ -9472,7 +9482,7 @@ msgstr "" #~ msgid "Include orders for part variants" #~ msgstr "Include orders for part variants" -#: src/tables/build/BuildAllocatedStockTable.tsx:97 +#: src/tables/build/BuildAllocatedStockTable.tsx:94 #: src/tables/part/PartBuildAllocationsTable.tsx:84 #: src/tables/part/PartPurchaseOrdersTable.tsx:132 #: src/tables/part/PartSalesAllocationsTable.tsx:69 @@ -9482,40 +9492,58 @@ msgid "Order Status" msgstr "" #: src/tables/build/BuildAllocatedStockTable.tsx:164 -#~ msgid "Edit Build Item" -#~ msgstr "Edit Build Item" - -#: src/tables/build/BuildAllocatedStockTable.tsx:167 -#: src/tables/build/BuildLineTable.tsx:650 +#: src/tables/build/BuildLineTable.tsx:651 msgid "Edit Stock Allocation" msgstr "Editar asignación de existencias" +#: src/tables/build/BuildAllocatedStockTable.tsx:164 +#~ msgid "Edit Build Item" +#~ msgstr "Edit Build Item" + #: src/tables/build/BuildAllocatedStockTable.tsx:174 #~ msgid "Delete Build Item" #~ msgstr "Delete Build Item" +#: src/tables/build/BuildAllocatedStockTable.tsx:177 +#: src/tables/build/BuildLineTable.tsx:664 +#: src/tables/sales/SalesOrderAllocationTable.tsx:218 +msgid "Remove Allocated Stock" +msgstr "" + #: src/tables/build/BuildAllocatedStockTable.tsx:180 #: src/tables/build/BuildLineTable.tsx:663 -msgid "Delete Stock Allocation" -msgstr "Eliminar asignación de existencias" +#~ msgid "Delete Stock Allocation" +#~ msgstr "Delete Stock Allocation" -#: src/tables/build/BuildAllocatedStockTable.tsx:239 +#: src/tables/build/BuildAllocatedStockTable.tsx:182 +#: src/tables/build/BuildLineTable.tsx:669 +#: src/tables/sales/SalesOrderAllocationTable.tsx:221 +msgid "Are you sure you want to remove this allocated stock from the order?" +msgstr "" + +#: src/tables/build/BuildAllocatedStockTable.tsx:242 msgid "Consume" msgstr "" +#: src/tables/build/BuildAllocatedStockTable.tsx:259 +#: src/tables/build/BuildLineTable.tsx:112 +#: src/tables/sales/SalesOrderAllocationTable.tsx:248 +msgid "Remove allocated stock" +msgstr "" + #: src/tables/build/BuildLineTable.tsx:59 #~ msgid "Show lines with available stock" #~ msgstr "Show lines with available stock" -#: src/tables/build/BuildLineTable.tsx:120 +#: src/tables/build/BuildLineTable.tsx:121 msgid "View Stock Item" msgstr "Ver artículo de existencias" -#: src/tables/build/BuildLineTable.tsx:183 +#: src/tables/build/BuildLineTable.tsx:184 msgid "Show fully allocated lines" msgstr "" -#: src/tables/build/BuildLineTable.tsx:188 +#: src/tables/build/BuildLineTable.tsx:189 msgid "Show fully consumed lines" msgstr "" @@ -9523,124 +9551,124 @@ msgstr "" #~ msgid "Show allocated lines" #~ msgstr "Show allocated lines" -#: src/tables/build/BuildLineTable.tsx:193 +#: src/tables/build/BuildLineTable.tsx:194 msgid "Show items with sufficient available stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:198 +#: src/tables/build/BuildLineTable.tsx:199 msgid "Show consumable lines" msgstr "" -#: src/tables/build/BuildLineTable.tsx:203 +#: src/tables/build/BuildLineTable.tsx:204 msgid "Show optional lines" msgstr "" -#: src/tables/build/BuildLineTable.tsx:212 +#: src/tables/build/BuildLineTable.tsx:213 #: src/tables/part/PartTable.tsx:233 msgid "Testable" msgstr "" -#: src/tables/build/BuildLineTable.tsx:217 +#: src/tables/build/BuildLineTable.tsx:218 #: src/tables/stock/StockItemTable.tsx:388 msgid "Tracked" msgstr "" -#: src/tables/build/BuildLineTable.tsx:218 +#: src/tables/build/BuildLineTable.tsx:219 msgid "Show tracked lines" msgstr "" -#: src/tables/build/BuildLineTable.tsx:223 +#: src/tables/build/BuildLineTable.tsx:224 msgid "Show items with stock on order" msgstr "" -#: src/tables/build/BuildLineTable.tsx:258 +#: src/tables/build/BuildLineTable.tsx:259 #: src/tables/sales/SalesOrderLineItemTable.tsx:172 msgid "In production" msgstr "" -#: src/tables/build/BuildLineTable.tsx:286 +#: src/tables/build/BuildLineTable.tsx:287 msgid "Insufficient stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:302 +#: src/tables/build/BuildLineTable.tsx:303 #: src/tables/sales/SalesOrderLineItemTable.tsx:160 #: src/tables/stock/StockItemTable.tsx:191 msgid "No stock available" msgstr "" -#: src/tables/build/BuildLineTable.tsx:375 +#: src/tables/build/BuildLineTable.tsx:376 msgid "Gets Inherited" msgstr "" -#: src/tables/build/BuildLineTable.tsx:388 +#: src/tables/build/BuildLineTable.tsx:389 msgid "Unit Quantity" msgstr "" -#: src/tables/build/BuildLineTable.tsx:415 +#: src/tables/build/BuildLineTable.tsx:416 msgid "Setup Quantity" msgstr "" -#: src/tables/build/BuildLineTable.tsx:424 +#: src/tables/build/BuildLineTable.tsx:425 msgid "Attrition" msgstr "" -#: src/tables/build/BuildLineTable.tsx:432 +#: src/tables/build/BuildLineTable.tsx:433 msgid "Rounding Multiple" msgstr "" -#: src/tables/build/BuildLineTable.tsx:441 +#: src/tables/build/BuildLineTable.tsx:442 msgid "BOM Information" msgstr "" -#: src/tables/build/BuildLineTable.tsx:515 +#: src/tables/build/BuildLineTable.tsx:516 #: src/tables/part/PartBuildAllocationsTable.tsx:102 msgid "Fully allocated" msgstr "" -#: src/tables/build/BuildLineTable.tsx:563 +#: src/tables/build/BuildLineTable.tsx:564 #: src/tables/sales/SalesOrderLineItemTable.tsx:311 msgid "Create Build Order" msgstr "" -#: src/tables/build/BuildLineTable.tsx:592 +#: src/tables/build/BuildLineTable.tsx:593 msgid "Auto allocation in progress" msgstr "Auto asignación en progreso" -#: src/tables/build/BuildLineTable.tsx:595 -#: src/tables/build/BuildLineTable.tsx:802 +#: src/tables/build/BuildLineTable.tsx:596 +#: src/tables/build/BuildLineTable.tsx:809 msgid "Auto Allocate Stock" msgstr "Autoasignar stock" -#: src/tables/build/BuildLineTable.tsx:596 +#: src/tables/build/BuildLineTable.tsx:597 msgid "Automatically allocate stock to this build according to the selected options" msgstr "Asignar stock automáticamente a esta construcción de acuerdo a las opciones seleccionadas" -#: src/tables/build/BuildLineTable.tsx:616 -#: src/tables/build/BuildLineTable.tsx:630 -#: src/tables/build/BuildLineTable.tsx:751 -#: src/tables/build/BuildLineTable.tsx:852 +#: src/tables/build/BuildLineTable.tsx:617 +#: src/tables/build/BuildLineTable.tsx:631 +#: src/tables/build/BuildLineTable.tsx:758 +#: src/tables/build/BuildLineTable.tsx:859 #: src/tables/build/BuildOutputTable.tsx:355 #: src/tables/build/BuildOutputTable.tsx:360 msgid "Deallocate Stock" msgstr "Desasignar existencias" -#: src/tables/build/BuildLineTable.tsx:632 +#: src/tables/build/BuildLineTable.tsx:633 msgid "Deallocate all untracked stock for this build order" msgstr "Desasignar todo el stock sin seguimiento para este pedido" -#: src/tables/build/BuildLineTable.tsx:634 +#: src/tables/build/BuildLineTable.tsx:635 msgid "Deallocate stock from the selected line item" msgstr "Desasignar stock de la partida seleccionada" -#: src/tables/build/BuildLineTable.tsx:638 +#: src/tables/build/BuildLineTable.tsx:639 msgid "Stock has been deallocated" msgstr "Stock ha sido desasignado" -#: src/tables/build/BuildLineTable.tsx:771 +#: src/tables/build/BuildLineTable.tsx:778 msgid "Build Stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:784 +#: src/tables/build/BuildLineTable.tsx:791 #: src/tables/sales/SalesOrderLineItemTable.tsx:487 msgid "View Part" msgstr "Ver pieza" @@ -9739,7 +9767,7 @@ msgid "Serialize Build Output" msgstr "" #: src/tables/build/BuildOutputTable.tsx:405 -#: src/tables/part/PartTestResultTable.tsx:310 +#: src/tables/part/PartTestResultTable.tsx:318 #: src/tables/stock/StockItemTable.tsx:328 msgid "Filter by stock status" msgstr "" @@ -9964,8 +9992,8 @@ msgid "View Item" msgstr "" #: src/tables/general/ExtraLineItemTable.tsx:95 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:299 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:403 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:300 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:405 #: src/tables/sales/ReturnOrderLineItemTable.tsx:83 #: src/tables/sales/ReturnOrderLineItemTable.tsx:187 #: src/tables/sales/SalesOrderLineItemTable.tsx:252 @@ -9974,14 +10002,14 @@ msgid "Add Line Item" msgstr "" #: src/tables/general/ExtraLineItemTable.tsx:108 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:320 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:322 #: src/tables/sales/ReturnOrderLineItemTable.tsx:96 #: src/tables/sales/SalesOrderLineItemTable.tsx:271 msgid "Edit Line Item" msgstr "" #: src/tables/general/ExtraLineItemTable.tsx:117 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:329 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:331 #: src/tables/sales/ReturnOrderLineItemTable.tsx:105 #: src/tables/sales/SalesOrderLineItemTable.tsx:280 msgid "Delete Line Item" @@ -10273,7 +10301,7 @@ msgid "Required Stock" msgstr "Stock requerido" #: src/tables/part/PartBuildAllocationsTable.tsx:124 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:381 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:383 msgid "View Build Order" msgstr "Ver orden de construcción" @@ -10617,8 +10645,8 @@ msgstr "" #: src/tables/part/PartTestResultTable.tsx:103 #: src/tables/part/PartTestResultTable.tsx:181 -#: src/tables/part/PartTestResultTable.tsx:320 -#: src/tables/part/PartTestResultTable.tsx:334 +#: src/tables/part/PartTestResultTable.tsx:328 +#: src/tables/part/PartTestResultTable.tsx:342 #: src/tables/stock/StockItemTestResultTable.tsx:296 #: src/tables/stock/StockItemTestResultTable.tsx:368 #: src/tables/stock/StockItemTestResultTable.tsx:429 @@ -10643,7 +10671,7 @@ msgstr "" msgid "No Result" msgstr "" -#: src/tables/part/PartTestResultTable.tsx:298 +#: src/tables/part/PartTestResultTable.tsx:306 msgid "Show build outputs currently in production" msgstr "" @@ -11073,7 +11101,7 @@ msgid "Show manufacturer parts for active manufacturers." msgstr "" #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:115 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:397 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:399 msgid "Import Line Items" msgstr "" @@ -11099,11 +11127,11 @@ msgstr "Mostrar partidas que han sido recibidas" #~ msgid "Add line item" #~ msgstr "Add line item" -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:350 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:352 msgid "Receive line item" msgstr "" -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:414 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:416 msgid "Receive items" msgstr "Recibir artículos" @@ -11201,25 +11229,25 @@ msgid "Not shipped" msgstr "No enviado" #: src/tables/sales/SalesOrderAllocationTable.tsx:211 -#: src/tables/sales/SalesOrderAllocationTable.tsx:229 +#: src/tables/sales/SalesOrderAllocationTable.tsx:235 msgid "Edit Allocation" msgstr "Editar Asignación" #: src/tables/sales/SalesOrderAllocationTable.tsx:218 #: src/tables/sales/SalesOrderAllocationTable.tsx:241 -msgid "Delete Allocation" -msgstr "Eliminar asignación" +#~ msgid "Delete Allocation" +#~ msgstr "Delete Allocation" -#: src/tables/sales/SalesOrderAllocationTable.tsx:252 -#: src/tables/sales/SalesOrderAllocationTable.tsx:253 +#: src/tables/sales/SalesOrderAllocationTable.tsx:261 +#: src/tables/sales/SalesOrderAllocationTable.tsx:262 msgid "View Shipment" msgstr "Ver envío" -#: src/tables/sales/SalesOrderAllocationTable.tsx:308 +#: src/tables/sales/SalesOrderAllocationTable.tsx:317 msgid "Assign to Shipment" msgstr "" -#: src/tables/sales/SalesOrderAllocationTable.tsx:324 +#: src/tables/sales/SalesOrderAllocationTable.tsx:333 msgid "Assign to shipment" msgstr "" diff --git a/src/frontend/src/locales/et/messages.po b/src/frontend/src/locales/et/messages.po index b6ab2a2132..4a5b8028d4 100644 --- a/src/frontend/src/locales/et/messages.po +++ b/src/frontend/src/locales/et/messages.po @@ -8,7 +8,7 @@ msgstr "" "Language: et\n" "Project-Id-Version: inventree\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2025-11-19 19:39\n" +"PO-Revision-Date: 2025-11-22 06:25\n" "Last-Translator: \n" "Language-Team: Estonian\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" @@ -56,7 +56,7 @@ msgstr "Tühista" #: lib/components/RowActions.tsx:136 #: src/components/nav/NavigationDrawer.tsx:190 -#: src/forms/PurchaseOrderForms.tsx:802 +#: src/forms/PurchaseOrderForms.tsx:854 #: src/forms/StockForms.tsx:796 #: src/forms/StockForms.tsx:843 #: src/forms/StockForms.tsx:889 @@ -103,9 +103,9 @@ msgstr "Ei" #: src/forms/BuildForms.tsx:630 #: src/forms/BuildForms.tsx:793 #: src/forms/BuildForms.tsx:896 -#: src/forms/PurchaseOrderForms.tsx:798 +#: src/forms/PurchaseOrderForms.tsx:850 #: src/forms/ReturnOrderForms.tsx:242 -#: src/forms/SalesOrderForms.tsx:305 +#: src/forms/SalesOrderForms.tsx:323 #: src/forms/StockForms.tsx:360 #: src/forms/StockForms.tsx:791 #: src/forms/StockForms.tsx:838 @@ -119,6 +119,7 @@ msgstr "Ei" #: src/pages/build/BuildDetail.tsx:200 #: src/pages/part/PartDetail.tsx:1207 #: src/tables/ColumnRenderers.tsx:91 +#: src/tables/part/PartTestResultTable.tsx:247 #: src/tables/part/RelatedPartTable.tsx:53 #: src/tables/stock/StockTrackingTable.tsx:87 msgid "Part" @@ -158,7 +159,7 @@ msgstr "" #: src/components/wizards/OrderPartsWizard.tsx:290 #: src/pages/company/SupplierPartDetail.tsx:413 #: src/pages/stock/StockDetail.tsx:289 -#: src/tables/build/BuildAllocatedStockTable.tsx:155 +#: src/tables/build/BuildAllocatedStockTable.tsx:152 #: src/tables/part/PartPurchaseOrdersTable.tsx:50 #: src/tables/purchasing/SupplierPartTable.tsx:83 #: src/tables/stock/StockItemTable.tsx:247 @@ -201,9 +202,9 @@ msgstr "" #: src/forms/BuildForms.tsx:473 #: src/forms/BuildForms.tsx:633 #: src/forms/BuildForms.tsx:794 -#: src/forms/SalesOrderForms.tsx:307 +#: src/forms/SalesOrderForms.tsx:325 #: src/pages/stock/StockDetail.tsx:1005 -#: src/tables/part/PartTestResultTable.tsx:248 +#: src/tables/part/PartTestResultTable.tsx:256 #: src/tables/stock/StockTrackingTable.tsx:48 #: src/tables/stock/StockTrackingTable.tsx:55 msgid "Stock Item" @@ -517,7 +518,7 @@ msgstr "" #: src/components/dashboard/DashboardLayout.tsx:281 #: src/components/editors/NotesEditor.tsx:74 #: src/components/editors/TemplateEditor/TemplateEditor.tsx:158 -#: src/components/forms/fields/ApiFormField.tsx:273 +#: src/components/forms/fields/ApiFormField.tsx:237 #: src/components/forms/fields/TableField.tsx:45 #: src/components/importer/ImportDataSelector.tsx:192 #: src/components/importer/ImporterColumnSelector.tsx:234 @@ -642,8 +643,8 @@ msgstr "" #: src/components/barcodes/BarcodeScanDialog.tsx:49 #: src/components/buttons/ScanButton.tsx:15 #: src/components/nav/NavigationDrawer.tsx:122 -#: src/forms/PurchaseOrderForms.tsx:457 -#: src/forms/PurchaseOrderForms.tsx:563 +#: src/forms/PurchaseOrderForms.tsx:509 +#: src/forms/PurchaseOrderForms.tsx:615 msgid "Scan Barcode" msgstr "" @@ -728,7 +729,7 @@ msgstr "See eemaldab lingi seotud vöötikoodile" #: src/components/barcodes/QRCode.tsx:205 #: src/components/items/ActionDropdown.tsx:192 -#: src/forms/PurchaseOrderForms.tsx:554 +#: src/forms/PurchaseOrderForms.tsx:606 msgid "Unlink Barcode" msgstr "Linki ribakood" @@ -1216,6 +1217,12 @@ msgstr "Kas soovite eemaldada seotud pildi sellest üksusest?" #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:884 #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:903 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:254 +#: src/tables/build/BuildAllocatedStockTable.tsx:178 +#: src/tables/build/BuildAllocatedStockTable.tsx:258 +#: src/tables/build/BuildLineTable.tsx:111 +#: src/tables/build/BuildLineTable.tsx:665 +#: src/tables/sales/SalesOrderAllocationTable.tsx:224 +#: src/tables/sales/SalesOrderAllocationTable.tsx:247 msgid "Remove" msgstr "Eemalda" @@ -1241,7 +1248,7 @@ msgid "Upload Error" msgstr "Üleslaadmise tõrge" #: src/components/details/DetailsImage.tsx:250 -#: src/components/forms/fields/TextField.tsx:65 +#: src/components/forms/fields/AutoFillRightSection.tsx:34 msgid "Clear" msgstr "Puhasta" @@ -1817,10 +1824,14 @@ msgstr "" msgid "Running" msgstr "" -#: src/components/forms/fields/ApiFormField.tsx:233 +#: src/components/forms/fields/ApiFormField.tsx:197 msgid "Select file to upload" msgstr "" +#: src/components/forms/fields/AutoFillRightSection.tsx:47 +msgid "Accept suggested value" +msgstr "" + #: src/components/forms/fields/DateField.tsx:76 msgid "Select date" msgstr "" @@ -1875,10 +1886,6 @@ msgstr "Sissekanded puuduvad" msgid "Add new row" msgstr "" -#: src/components/forms/fields/TextField.tsx:82 -msgid "Accept suggested value" -msgstr "" - #: src/components/images/DetailsImage.tsx:252 #~ msgid "Select image" #~ msgstr "Select image" @@ -2225,8 +2232,8 @@ msgstr "" #: src/pages/part/PartDetail.tsx:994 #: src/pages/stock/StockDetail.tsx:265 #: src/pages/stock/StockDetail.tsx:942 -#: src/tables/build/BuildAllocatedStockTable.tsx:135 -#: src/tables/build/BuildLineTable.tsx:192 +#: src/tables/build/BuildAllocatedStockTable.tsx:132 +#: src/tables/build/BuildLineTable.tsx:193 #: src/tables/part/PartTable.tsx:137 #: src/tables/stock/StockItemTable.tsx:182 #: src/tables/stock/StockItemTable.tsx:343 @@ -2784,7 +2791,7 @@ msgstr "" #: src/pages/sales/SalesOrderDetail.tsx:119 #: src/pages/stock/LocationDetail.tsx:102 #: src/tables/ColumnRenderers.tsx:278 -#: src/tables/build/BuildAllocatedStockTable.tsx:91 +#: src/tables/build/BuildAllocatedStockTable.tsx:88 #: src/tables/machine/MachineTypeTable.tsx:161 #: src/tables/machine/MachineTypeTable.tsx:257 #: src/tables/plugin/PluginListTable.tsx:110 @@ -2966,7 +2973,7 @@ msgstr "" #: src/pages/company/SupplierPartDetail.tsx:394 #: src/pages/part/PartDetail.tsx:1015 #: src/tables/bom/BomTable.tsx:444 -#: src/tables/build/BuildLineTable.tsx:222 +#: src/tables/build/BuildLineTable.tsx:223 #: src/tables/part/PartTable.tsx:108 msgid "On Order" msgstr "" @@ -2976,7 +2983,7 @@ msgstr "" #: src/pages/part/PartDetail.tsx:587 #: src/pages/part/PartDetail.tsx:1021 #: src/pages/stock/StockDetail.tsx:925 -#: src/tables/part/PartTestResultTable.tsx:297 +#: src/tables/part/PartTestResultTable.tsx:305 #: src/tables/stock/StockItemTable.tsx:359 msgid "In Production" msgstr "" @@ -3000,7 +3007,7 @@ msgstr "Kategooria" #: src/components/render/Stock.tsx:114 #: src/components/render/Stock.tsx:132 #: src/forms/BuildForms.tsx:795 -#: src/forms/PurchaseOrderForms.tsx:595 +#: src/forms/PurchaseOrderForms.tsx:647 #: src/forms/StockForms.tsx:792 #: src/forms/StockForms.tsx:839 #: src/forms/StockForms.tsx:885 @@ -3023,7 +3030,7 @@ msgstr "Asukoht" #: src/components/render/Stock.tsx:99 #: src/pages/stock/StockDetail.tsx:198 #: src/pages/stock/StockDetail.tsx:930 -#: src/tables/build/BuildAllocatedStockTable.tsx:121 +#: src/tables/build/BuildAllocatedStockTable.tsx:118 #: src/tables/build/BuildOutputTable.tsx:107 #: src/tables/sales/SalesOrderAllocationTable.tsx:142 msgid "Serial Number" @@ -3034,9 +3041,9 @@ msgstr "Seerianumber" #: src/forms/BuildForms.tsx:240 #: src/forms/BuildForms.tsx:634 #: src/forms/BuildForms.tsx:797 -#: src/forms/PurchaseOrderForms.tsx:801 +#: src/forms/PurchaseOrderForms.tsx:853 #: src/forms/ReturnOrderForms.tsx:243 -#: src/forms/SalesOrderForms.tsx:308 +#: src/forms/SalesOrderForms.tsx:326 #: src/forms/StockForms.tsx:841 #: src/pages/part/PartStockHistoryDetail.tsx:56 #: src/pages/part/PartStockHistoryDetail.tsx:210 @@ -3046,9 +3053,9 @@ msgstr "Seerianumber" #: src/pages/part/pricing/PriceBreakPanel.tsx:172 #: src/pages/stock/StockDetail.tsx:258 #: src/pages/stock/StockDetail.tsx:936 -#: src/tables/build/BuildLineTable.tsx:86 +#: src/tables/build/BuildLineTable.tsx:83 #: src/tables/part/PartPurchaseOrdersTable.tsx:94 -#: src/tables/part/PartTestResultTable.tsx:269 +#: src/tables/part/PartTestResultTable.tsx:277 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:175 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:206 #: src/tables/purchasing/SupplierPriceBreakTable.tsx:69 @@ -3070,7 +3077,7 @@ msgstr "Kogus" #: src/forms/StockForms.tsx:1048 #: src/forms/StockForms.tsx:1096 #: src/forms/StockForms.tsx:1140 -#: src/tables/build/BuildLineTable.tsx:96 +#: src/tables/build/BuildLineTable.tsx:93 msgid "Batch" msgstr "" @@ -3755,7 +3762,7 @@ msgid "In Stock" msgstr "Laos" #: src/components/wizards/OrderPartsWizard.tsx:146 -#: src/tables/build/BuildLineTable.tsx:404 +#: src/tables/build/BuildLineTable.tsx:405 msgid "Required Quantity" msgstr "" @@ -3847,7 +3854,7 @@ msgid "Please correct the errors in the selected parts" msgstr "" #: src/components/wizards/OrderPartsWizard.tsx:587 -#: src/tables/build/BuildLineTable.tsx:815 +#: src/tables/build/BuildLineTable.tsx:822 #: src/tables/part/PartTable.tsx:522 #: src/tables/sales/SalesOrderLineItemTable.tsx:370 msgid "Order Parts" @@ -4349,9 +4356,9 @@ msgstr "" #: src/forms/BuildForms.tsx:333 #: src/forms/BuildForms.tsx:408 #: src/forms/BuildForms.tsx:685 -#: src/tables/build/BuildAllocatedStockTable.tsx:150 +#: src/tables/build/BuildAllocatedStockTable.tsx:147 #: src/tables/build/BuildOutputTable.tsx:582 -#: src/tables/part/PartTestResultTable.tsx:272 +#: src/tables/part/PartTestResultTable.tsx:280 msgid "Build Output" msgstr "" @@ -4362,7 +4369,7 @@ msgstr "" #: src/forms/BuildForms.tsx:336 #: src/forms/BuildForms.tsx:411 #: src/forms/BuildForms.tsx:475 -#: src/forms/PurchaseOrderForms.tsx:717 +#: src/forms/PurchaseOrderForms.tsx:769 #: src/forms/ReturnOrderForms.tsx:197 #: src/forms/ReturnOrderForms.tsx:244 #: src/forms/StockForms.tsx:712 @@ -4377,7 +4384,7 @@ msgstr "" #: src/tables/build/BuildOutputTable.tsx:404 #: src/tables/machine/MachineListTable.tsx:387 #: src/tables/part/PartPurchaseOrdersTable.tsx:38 -#: src/tables/part/PartTestResultTable.tsx:309 +#: src/tables/part/PartTestResultTable.tsx:317 #: src/tables/sales/ReturnOrderLineItemTable.tsx:138 #: src/tables/sales/ReturnOrderLineItemTable.tsx:176 #: src/tables/settings/CustomStateTable.tsx:79 @@ -4450,8 +4457,8 @@ msgstr "Ehitustulemused on tühistatud" #: src/pages/stock/StockDetail.tsx:153 #: src/tables/bom/BomTable.tsx:134 #: src/tables/bom/UsedInTable.tsx:40 -#: src/tables/build/BuildAllocatedStockTable.tsx:108 -#: src/tables/build/BuildLineTable.tsx:336 +#: src/tables/build/BuildAllocatedStockTable.tsx:105 +#: src/tables/build/BuildLineTable.tsx:337 #: src/tables/build/BuildOrderTable.tsx:79 #: src/tables/part/PartSalesAllocationsTable.tsx:61 #: src/tables/part/RelatedPartTable.tsx:73 @@ -4466,47 +4473,47 @@ msgstr "IPN" #: src/forms/BuildForms.tsx:632 #: src/forms/BuildForms.tsx:796 #: src/forms/BuildForms.tsx:897 -#: src/forms/SalesOrderForms.tsx:306 -#: src/tables/build/BuildAllocatedStockTable.tsx:139 -#: src/tables/build/BuildLineTable.tsx:182 +#: src/forms/SalesOrderForms.tsx:324 +#: src/tables/build/BuildAllocatedStockTable.tsx:136 +#: src/tables/build/BuildLineTable.tsx:183 #: src/tables/sales/SalesOrderLineItemTable.tsx:342 #: src/tables/stock/StockItemTable.tsx:338 msgid "Allocated" msgstr "Eraldatud" #: src/forms/BuildForms.tsx:667 -#: src/forms/SalesOrderForms.tsx:295 +#: src/forms/SalesOrderForms.tsx:313 #: src/pages/build/BuildDetail.tsx:108 #: src/pages/build/BuildDetail.tsx:326 msgid "Source Location" msgstr "" #: src/forms/BuildForms.tsx:668 -#: src/forms/SalesOrderForms.tsx:296 +#: src/forms/SalesOrderForms.tsx:314 msgid "Select the source location for the stock allocation" msgstr "Valige laoseisu eraldamise alguskoht" #: src/forms/BuildForms.tsx:700 -#: src/forms/SalesOrderForms.tsx:336 -#: src/tables/build/BuildLineTable.tsx:574 -#: src/tables/build/BuildLineTable.tsx:731 -#: src/tables/build/BuildLineTable.tsx:830 +#: src/forms/SalesOrderForms.tsx:354 +#: src/tables/build/BuildLineTable.tsx:575 +#: src/tables/build/BuildLineTable.tsx:738 +#: src/tables/build/BuildLineTable.tsx:837 #: src/tables/sales/SalesOrderLineItemTable.tsx:380 #: src/tables/sales/SalesOrderLineItemTable.tsx:406 msgid "Allocate Stock" msgstr "" #: src/forms/BuildForms.tsx:703 -#: src/forms/SalesOrderForms.tsx:341 +#: src/forms/SalesOrderForms.tsx:359 msgid "Stock items allocated" msgstr "Selle plugina jaoks ei ole sisu esitatud" #: src/forms/BuildForms.tsx:816 #: src/forms/BuildForms.tsx:917 -#: src/tables/build/BuildAllocatedStockTable.tsx:240 -#: src/tables/build/BuildAllocatedStockTable.tsx:272 -#: src/tables/build/BuildLineTable.tsx:741 -#: src/tables/build/BuildLineTable.tsx:864 +#: src/tables/build/BuildAllocatedStockTable.tsx:243 +#: src/tables/build/BuildAllocatedStockTable.tsx:279 +#: src/tables/build/BuildLineTable.tsx:748 +#: src/tables/build/BuildLineTable.tsx:871 msgid "Consume Stock" msgstr "" @@ -4521,21 +4528,21 @@ msgstr "" #~ msgstr "Stock items consumed" #: src/forms/BuildForms.tsx:853 -#: src/tables/build/BuildLineTable.tsx:514 +#: src/tables/build/BuildLineTable.tsx:515 #: src/tables/part/PartBuildAllocationsTable.tsx:101 msgid "Fully consumed" msgstr "" #: src/forms/BuildForms.tsx:898 -#: src/tables/build/BuildLineTable.tsx:187 +#: src/tables/build/BuildLineTable.tsx:188 #: src/tables/stock/StockItemTable.tsx:367 msgid "Consumed" msgstr "" #: src/forms/CommonForms.tsx:88 -#: src/forms/PurchaseOrderForms.tsx:125 +#: src/forms/PurchaseOrderForms.tsx:176 #: src/forms/ReturnOrderForms.tsx:138 -#: src/forms/SalesOrderForms.tsx:164 +#: src/forms/SalesOrderForms.tsx:182 msgid "Select project code for this line item" msgstr "" @@ -4572,127 +4579,127 @@ msgstr "" msgid "Subscribe to notifications for this category" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:388 -msgid "Assign Batch Code and Serial Numbers" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:390 -msgid "Assign Batch Code" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:410 -msgid "Choose Location" -msgstr "Vali asukoht" - -#: src/forms/PurchaseOrderForms.tsx:418 -msgid "Item Destination selected" -msgstr "" - #: src/forms/PurchaseOrderForms.tsx:421 #~ msgid "Assign Batch Code{0}" #~ msgstr "Assign Batch Code{0}" -#: src/forms/PurchaseOrderForms.tsx:428 -msgid "Part category default location selected" -msgstr "Osakategooria vaikimisi asukoht valitud" +#: src/forms/PurchaseOrderForms.tsx:440 +msgid "Assign Batch Code and Serial Numbers" +msgstr "" -#: src/forms/PurchaseOrderForms.tsx:438 -msgid "Received stock location selected" -msgstr "Kättesaadud varude asukoha valitud" +#: src/forms/PurchaseOrderForms.tsx:442 +msgid "Assign Batch Code" +msgstr "" #: src/forms/PurchaseOrderForms.tsx:444 #: src/forms/StockForms.tsx:428 #~ msgid "Remove item from list" #~ msgstr "Remove item from list" -#: src/forms/PurchaseOrderForms.tsx:446 +#: src/forms/PurchaseOrderForms.tsx:462 +msgid "Choose Location" +msgstr "Vali asukoht" + +#: src/forms/PurchaseOrderForms.tsx:470 +msgid "Item Destination selected" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:480 +msgid "Part category default location selected" +msgstr "Osakategooria vaikimisi asukoht valitud" + +#: src/forms/PurchaseOrderForms.tsx:490 +msgid "Received stock location selected" +msgstr "Kättesaadud varude asukoha valitud" + +#: src/forms/PurchaseOrderForms.tsx:498 msgid "Default location selected" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:507 +#: src/forms/PurchaseOrderForms.tsx:559 msgid "Set Location" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:524 -msgid "Set Expiry Date" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:532 -#: src/forms/StockForms.tsx:693 -msgid "Adjust Packaging" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:540 -#: src/forms/StockForms.tsx:684 -#: src/hooks/UseStockAdjustActions.tsx:148 -msgid "Change Status" -msgstr "Muuda staatust" - -#: src/forms/PurchaseOrderForms.tsx:546 -msgid "Add Note" -msgstr "Lisa märkus" - #: src/forms/PurchaseOrderForms.tsx:566 #~ msgid "Serial numbers" #~ msgstr "Serial numbers" +#: src/forms/PurchaseOrderForms.tsx:576 +msgid "Set Expiry Date" +msgstr "" + #: src/forms/PurchaseOrderForms.tsx:582 #~ msgid "Store at line item destination" #~ msgstr "Store at line item destination" -#: src/forms/PurchaseOrderForms.tsx:610 -msgid "Store at default location" +#: src/forms/PurchaseOrderForms.tsx:584 +#: src/forms/StockForms.tsx:693 +msgid "Adjust Packaging" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:625 -msgid "Store at line item destination " -msgstr "" +#: src/forms/PurchaseOrderForms.tsx:592 +#: src/forms/StockForms.tsx:684 +#: src/hooks/UseStockAdjustActions.tsx:148 +msgid "Change Status" +msgstr "Muuda staatust" -#: src/forms/PurchaseOrderForms.tsx:637 -msgid "Store with already received stock" -msgstr "Pood juba saadud varudega" +#: src/forms/PurchaseOrderForms.tsx:598 +msgid "Add Note" +msgstr "Lisa märkus" #: src/forms/PurchaseOrderForms.tsx:658 #~ msgid "Receive line items" #~ msgstr "Receive line items" -#: src/forms/PurchaseOrderForms.tsx:661 +#: src/forms/PurchaseOrderForms.tsx:662 +msgid "Store at default location" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:677 +msgid "Store at line item destination " +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:689 +msgid "Store with already received stock" +msgstr "Pood juba saadud varudega" + +#: src/forms/PurchaseOrderForms.tsx:713 #: src/pages/build/BuildDetail.tsx:340 #: src/pages/stock/StockDetail.tsx:280 #: src/pages/stock/StockDetail.tsx:952 #: src/tables/Filter.tsx:83 -#: src/tables/build/BuildAllocatedStockTable.tsx:128 +#: src/tables/build/BuildAllocatedStockTable.tsx:125 #: src/tables/build/BuildOutputTable.tsx:112 -#: src/tables/part/PartTestResultTable.tsx:260 -#: src/tables/part/PartTestResultTable.tsx:281 +#: src/tables/part/PartTestResultTable.tsx:268 +#: src/tables/part/PartTestResultTable.tsx:289 #: src/tables/sales/SalesOrderAllocationTable.tsx:149 msgid "Batch Code" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:662 +#: src/forms/PurchaseOrderForms.tsx:714 msgid "Enter batch code for received items" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:675 +#: src/forms/PurchaseOrderForms.tsx:727 #: src/forms/StockForms.tsx:218 msgid "Serial Numbers" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:676 +#: src/forms/PurchaseOrderForms.tsx:728 msgid "Enter serial numbers for received items" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:690 +#: src/forms/PurchaseOrderForms.tsx:742 #: src/pages/stock/StockDetail.tsx:382 #: src/tables/stock/StockItemTable.tsx:294 msgid "Expiry Date" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:691 +#: src/forms/PurchaseOrderForms.tsx:743 msgid "Enter an expiry date for received items" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:703 +#: src/forms/PurchaseOrderForms.tsx:755 #: src/forms/StockForms.tsx:728 #: src/pages/company/SupplierPartDetail.tsx:172 #: src/pages/company/SupplierPartDetail.tsx:236 @@ -4701,19 +4708,19 @@ msgstr "" msgid "Packaging" msgstr "Pakkimine" -#: src/forms/PurchaseOrderForms.tsx:727 +#: src/forms/PurchaseOrderForms.tsx:779 #: src/pages/company/SupplierPartDetail.tsx:120 #: src/tables/ColumnRenderers.tsx:332 msgid "Note" msgstr "Märkus" -#: src/forms/PurchaseOrderForms.tsx:799 +#: src/forms/PurchaseOrderForms.tsx:851 #: src/pages/company/SupplierPartDetail.tsx:138 #: src/tables/purchasing/SupplierPriceBreakTable.tsx:49 msgid "SKU" msgstr "Tootekood" -#: src/forms/PurchaseOrderForms.tsx:800 +#: src/forms/PurchaseOrderForms.tsx:852 #: src/tables/part/PartPurchaseOrdersTable.tsx:127 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:213 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:283 @@ -4721,11 +4728,11 @@ msgstr "Tootekood" msgid "Received" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:817 +#: src/forms/PurchaseOrderForms.tsx:869 msgid "Receive Line Items" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:823 +#: src/forms/PurchaseOrderForms.tsx:875 msgid "Items received" msgstr "" @@ -4737,7 +4744,7 @@ msgstr "" msgid "Item received into stock" msgstr "Üksus on laoseisu vastu võetud" -#: src/forms/SalesOrderForms.tsx:401 +#: src/forms/SalesOrderForms.tsx:419 msgid "Leave blank to use the order address" msgstr "" @@ -5932,6 +5939,9 @@ msgstr "" #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:310 #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:401 +#: src/tables/build/BuildAllocatedStockTable.tsx:181 +#: src/tables/build/BuildLineTable.tsx:668 +#: src/tables/sales/SalesOrderAllocationTable.tsx:220 msgid "Confirm Removal" msgstr "" @@ -6870,8 +6880,8 @@ msgstr "Väline" #: src/pages/sales/ReturnOrderDetail.tsx:108 #: src/pages/sales/SalesOrderDetail.tsx:98 #: src/tables/ColumnRenderers.tsx:321 -#: src/tables/build/BuildAllocatedStockTable.tsx:115 -#: src/tables/build/BuildLineTable.tsx:352 +#: src/tables/build/BuildAllocatedStockTable.tsx:112 +#: src/tables/build/BuildLineTable.tsx:353 msgid "Reference" msgstr "Viide" @@ -7132,7 +7142,7 @@ msgstr "Tühista tellimus" #: src/pages/build/BuildDetail.tsx:742 #: src/pages/stock/StockDetail.tsx:344 -#: src/tables/build/BuildAllocatedStockTable.tsx:85 +#: src/tables/build/BuildAllocatedStockTable.tsx:82 #: src/tables/part/PartBuildAllocationsTable.tsx:45 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:157 #: src/tables/stock/StockTrackingTable.tsx:109 @@ -7600,7 +7610,7 @@ msgstr "Märksõnad" #: src/pages/part/PartDetail.tsx:542 #: src/tables/bom/BomTable.tsx:439 -#: src/tables/build/BuildLineTable.tsx:305 +#: src/tables/build/BuildLineTable.tsx:306 #: src/tables/part/PartTable.tsx:319 #: src/tables/sales/SalesOrderLineItemTable.tsx:138 msgid "Available Stock" @@ -7608,7 +7618,7 @@ msgstr "Saadaval laos" #: src/pages/part/PartDetail.tsx:548 #: src/tables/bom/BomTable.tsx:341 -#: src/tables/build/BuildLineTable.tsx:267 +#: src/tables/build/BuildLineTable.tsx:268 #: src/tables/sales/SalesOrderLineItemTable.tsx:180 msgid "On order" msgstr "Tellimisel" @@ -7782,7 +7792,7 @@ msgstr "" #: src/pages/part/PartDetail.tsx:1144 #: src/pages/stock/StockDetail.tsx:884 -#: src/tables/build/BuildLineTable.tsx:761 +#: src/tables/build/BuildLineTable.tsx:768 msgid "Order Stock" msgstr "" @@ -9219,13 +9229,13 @@ msgstr "" #~ msgstr "Show asssmbled items" #: src/tables/bom/BomTable.tsx:315 -#: src/tables/build/BuildLineTable.tsx:276 +#: src/tables/build/BuildLineTable.tsx:277 #: src/tables/part/PartTable.tsx:145 msgid "External stock" msgstr "" #: src/tables/bom/BomTable.tsx:323 -#: src/tables/build/BuildLineTable.tsx:239 +#: src/tables/build/BuildLineTable.tsx:240 msgid "Includes substitute stock" msgstr "Sisaldab asenduslaosid" @@ -9234,7 +9244,7 @@ msgstr "Sisaldab asenduslaosid" #~ msgstr "Edit Bom Item" #: src/tables/bom/BomTable.tsx:332 -#: src/tables/build/BuildLineTable.tsx:249 +#: src/tables/build/BuildLineTable.tsx:250 #: src/tables/sales/SalesOrderLineItemTable.tsx:166 msgid "Includes variant stock" msgstr "" @@ -9272,8 +9282,8 @@ msgid "Stock Information" msgstr "" #: src/tables/bom/BomTable.tsx:399 -#: src/tables/build/BuildLineTable.tsx:496 -#: src/tables/build/BuildLineTable.tsx:537 +#: src/tables/build/BuildLineTable.tsx:497 +#: src/tables/build/BuildLineTable.tsx:538 msgid "Consumable item" msgstr "" @@ -9282,7 +9292,7 @@ msgid "No available stock" msgstr "" #: src/tables/bom/BomTable.tsx:420 -#: src/tables/build/BuildLineTable.tsx:213 +#: src/tables/build/BuildLineTable.tsx:214 msgid "Show testable items" msgstr "" @@ -9291,7 +9301,7 @@ msgid "Show trackable items" msgstr "" #: src/tables/bom/BomTable.tsx:430 -#: src/tables/build/BuildLineTable.tsx:208 +#: src/tables/build/BuildLineTable.tsx:209 msgid "Show assembled items" msgstr "" @@ -9335,7 +9345,7 @@ msgstr "Näita esemeid, mis lubavad variatsiooni asendamist" #: src/tables/bom/BomTable.tsx:464 #: src/tables/bom/UsedInTable.tsx:85 -#: src/tables/build/BuildLineTable.tsx:202 +#: src/tables/build/BuildLineTable.tsx:203 msgid "Optional" msgstr "Valikuline" @@ -9345,7 +9355,7 @@ msgid "Show optional items" msgstr "" #: src/tables/bom/BomTable.tsx:469 -#: src/tables/build/BuildLineTable.tsx:197 +#: src/tables/build/BuildLineTable.tsx:198 msgid "Consumable" msgstr "" @@ -9433,7 +9443,7 @@ msgid "Bill of materials cannot be edited, as the part is locked" msgstr "Tükkide loendit ei saa redigeerida, kuna osa on lukustatud" #: src/tables/bom/UsedInTable.tsx:34 -#: src/tables/build/BuildLineTable.tsx:207 +#: src/tables/build/BuildLineTable.tsx:208 #: src/tables/part/ParametricPartTable.tsx:364 #: src/tables/part/PartBuildAllocationsTable.tsx:60 #: src/tables/part/PartTable.tsx:209 @@ -9455,11 +9465,11 @@ msgstr "Jälgitav" msgid "Show trackable assemblies" msgstr "Näita jälgitavaid koosteid" -#: src/tables/build/BuildAllocatedStockTable.tsx:67 +#: src/tables/build/BuildAllocatedStockTable.tsx:64 msgid "Allocated to Output" msgstr "" -#: src/tables/build/BuildAllocatedStockTable.tsx:68 +#: src/tables/build/BuildAllocatedStockTable.tsx:65 msgid "Show items allocated to a build output" msgstr "Näita esemete eraldatud ehituse väljundit" @@ -9472,7 +9482,7 @@ msgstr "Näita esemete eraldatud ehituse väljundit" #~ msgid "Include orders for part variants" #~ msgstr "Include orders for part variants" -#: src/tables/build/BuildAllocatedStockTable.tsx:97 +#: src/tables/build/BuildAllocatedStockTable.tsx:94 #: src/tables/part/PartBuildAllocationsTable.tsx:84 #: src/tables/part/PartPurchaseOrdersTable.tsx:132 #: src/tables/part/PartSalesAllocationsTable.tsx:69 @@ -9482,40 +9492,58 @@ msgid "Order Status" msgstr "" #: src/tables/build/BuildAllocatedStockTable.tsx:164 -#~ msgid "Edit Build Item" -#~ msgstr "Edit Build Item" - -#: src/tables/build/BuildAllocatedStockTable.tsx:167 -#: src/tables/build/BuildLineTable.tsx:650 +#: src/tables/build/BuildLineTable.tsx:651 msgid "Edit Stock Allocation" msgstr "" +#: src/tables/build/BuildAllocatedStockTable.tsx:164 +#~ msgid "Edit Build Item" +#~ msgstr "Edit Build Item" + #: src/tables/build/BuildAllocatedStockTable.tsx:174 #~ msgid "Delete Build Item" #~ msgstr "Delete Build Item" -#: src/tables/build/BuildAllocatedStockTable.tsx:180 -#: src/tables/build/BuildLineTable.tsx:663 -msgid "Delete Stock Allocation" +#: src/tables/build/BuildAllocatedStockTable.tsx:177 +#: src/tables/build/BuildLineTable.tsx:664 +#: src/tables/sales/SalesOrderAllocationTable.tsx:218 +msgid "Remove Allocated Stock" msgstr "" -#: src/tables/build/BuildAllocatedStockTable.tsx:239 +#: src/tables/build/BuildAllocatedStockTable.tsx:180 +#: src/tables/build/BuildLineTable.tsx:663 +#~ msgid "Delete Stock Allocation" +#~ msgstr "Delete Stock Allocation" + +#: src/tables/build/BuildAllocatedStockTable.tsx:182 +#: src/tables/build/BuildLineTable.tsx:669 +#: src/tables/sales/SalesOrderAllocationTable.tsx:221 +msgid "Are you sure you want to remove this allocated stock from the order?" +msgstr "" + +#: src/tables/build/BuildAllocatedStockTable.tsx:242 msgid "Consume" msgstr "" +#: src/tables/build/BuildAllocatedStockTable.tsx:259 +#: src/tables/build/BuildLineTable.tsx:112 +#: src/tables/sales/SalesOrderAllocationTable.tsx:248 +msgid "Remove allocated stock" +msgstr "" + #: src/tables/build/BuildLineTable.tsx:59 #~ msgid "Show lines with available stock" #~ msgstr "Show lines with available stock" -#: src/tables/build/BuildLineTable.tsx:120 +#: src/tables/build/BuildLineTable.tsx:121 msgid "View Stock Item" msgstr "" -#: src/tables/build/BuildLineTable.tsx:183 +#: src/tables/build/BuildLineTable.tsx:184 msgid "Show fully allocated lines" msgstr "" -#: src/tables/build/BuildLineTable.tsx:188 +#: src/tables/build/BuildLineTable.tsx:189 msgid "Show fully consumed lines" msgstr "" @@ -9523,124 +9551,124 @@ msgstr "" #~ msgid "Show allocated lines" #~ msgstr "Show allocated lines" -#: src/tables/build/BuildLineTable.tsx:193 +#: src/tables/build/BuildLineTable.tsx:194 msgid "Show items with sufficient available stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:198 +#: src/tables/build/BuildLineTable.tsx:199 msgid "Show consumable lines" msgstr "" -#: src/tables/build/BuildLineTable.tsx:203 +#: src/tables/build/BuildLineTable.tsx:204 msgid "Show optional lines" msgstr "" -#: src/tables/build/BuildLineTable.tsx:212 +#: src/tables/build/BuildLineTable.tsx:213 #: src/tables/part/PartTable.tsx:233 msgid "Testable" msgstr "" -#: src/tables/build/BuildLineTable.tsx:217 +#: src/tables/build/BuildLineTable.tsx:218 #: src/tables/stock/StockItemTable.tsx:388 msgid "Tracked" msgstr "" -#: src/tables/build/BuildLineTable.tsx:218 +#: src/tables/build/BuildLineTable.tsx:219 msgid "Show tracked lines" msgstr "" -#: src/tables/build/BuildLineTable.tsx:223 +#: src/tables/build/BuildLineTable.tsx:224 msgid "Show items with stock on order" msgstr "" -#: src/tables/build/BuildLineTable.tsx:258 +#: src/tables/build/BuildLineTable.tsx:259 #: src/tables/sales/SalesOrderLineItemTable.tsx:172 msgid "In production" msgstr "" -#: src/tables/build/BuildLineTable.tsx:286 +#: src/tables/build/BuildLineTable.tsx:287 msgid "Insufficient stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:302 +#: src/tables/build/BuildLineTable.tsx:303 #: src/tables/sales/SalesOrderLineItemTable.tsx:160 #: src/tables/stock/StockItemTable.tsx:191 msgid "No stock available" msgstr "" -#: src/tables/build/BuildLineTable.tsx:375 +#: src/tables/build/BuildLineTable.tsx:376 msgid "Gets Inherited" msgstr "" -#: src/tables/build/BuildLineTable.tsx:388 +#: src/tables/build/BuildLineTable.tsx:389 msgid "Unit Quantity" msgstr "" -#: src/tables/build/BuildLineTable.tsx:415 +#: src/tables/build/BuildLineTable.tsx:416 msgid "Setup Quantity" msgstr "" -#: src/tables/build/BuildLineTable.tsx:424 +#: src/tables/build/BuildLineTable.tsx:425 msgid "Attrition" msgstr "" -#: src/tables/build/BuildLineTable.tsx:432 +#: src/tables/build/BuildLineTable.tsx:433 msgid "Rounding Multiple" msgstr "" -#: src/tables/build/BuildLineTable.tsx:441 +#: src/tables/build/BuildLineTable.tsx:442 msgid "BOM Information" msgstr "" -#: src/tables/build/BuildLineTable.tsx:515 +#: src/tables/build/BuildLineTable.tsx:516 #: src/tables/part/PartBuildAllocationsTable.tsx:102 msgid "Fully allocated" msgstr "" -#: src/tables/build/BuildLineTable.tsx:563 +#: src/tables/build/BuildLineTable.tsx:564 #: src/tables/sales/SalesOrderLineItemTable.tsx:311 msgid "Create Build Order" msgstr "" -#: src/tables/build/BuildLineTable.tsx:592 +#: src/tables/build/BuildLineTable.tsx:593 msgid "Auto allocation in progress" msgstr "Automaatne eraldamine on käimas" -#: src/tables/build/BuildLineTable.tsx:595 -#: src/tables/build/BuildLineTable.tsx:802 +#: src/tables/build/BuildLineTable.tsx:596 +#: src/tables/build/BuildLineTable.tsx:809 msgid "Auto Allocate Stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:596 +#: src/tables/build/BuildLineTable.tsx:597 msgid "Automatically allocate stock to this build according to the selected options" msgstr "Määra laoseis sellele koostetellimusele automaatselt vastavalt valitud valikutele" -#: src/tables/build/BuildLineTable.tsx:616 -#: src/tables/build/BuildLineTable.tsx:630 -#: src/tables/build/BuildLineTable.tsx:751 -#: src/tables/build/BuildLineTable.tsx:852 +#: src/tables/build/BuildLineTable.tsx:617 +#: src/tables/build/BuildLineTable.tsx:631 +#: src/tables/build/BuildLineTable.tsx:758 +#: src/tables/build/BuildLineTable.tsx:859 #: src/tables/build/BuildOutputTable.tsx:355 #: src/tables/build/BuildOutputTable.tsx:360 msgid "Deallocate Stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:632 +#: src/tables/build/BuildLineTable.tsx:633 msgid "Deallocate all untracked stock for this build order" msgstr "Tühista kõik jälgimata laoseisu eraldised selle koostetellimuse jaoks" -#: src/tables/build/BuildLineTable.tsx:634 +#: src/tables/build/BuildLineTable.tsx:635 msgid "Deallocate stock from the selected line item" msgstr "Tühista laoseisu eraldamine valitud reaüksusest" -#: src/tables/build/BuildLineTable.tsx:638 +#: src/tables/build/BuildLineTable.tsx:639 msgid "Stock has been deallocated" msgstr "Laoseisu eraldamine on tühistatud" -#: src/tables/build/BuildLineTable.tsx:771 +#: src/tables/build/BuildLineTable.tsx:778 msgid "Build Stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:784 +#: src/tables/build/BuildLineTable.tsx:791 #: src/tables/sales/SalesOrderLineItemTable.tsx:487 msgid "View Part" msgstr "" @@ -9739,7 +9767,7 @@ msgid "Serialize Build Output" msgstr "" #: src/tables/build/BuildOutputTable.tsx:405 -#: src/tables/part/PartTestResultTable.tsx:310 +#: src/tables/part/PartTestResultTable.tsx:318 #: src/tables/stock/StockItemTable.tsx:328 msgid "Filter by stock status" msgstr "" @@ -9964,8 +9992,8 @@ msgid "View Item" msgstr "" #: src/tables/general/ExtraLineItemTable.tsx:95 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:299 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:403 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:300 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:405 #: src/tables/sales/ReturnOrderLineItemTable.tsx:83 #: src/tables/sales/ReturnOrderLineItemTable.tsx:187 #: src/tables/sales/SalesOrderLineItemTable.tsx:252 @@ -9974,14 +10002,14 @@ msgid "Add Line Item" msgstr "" #: src/tables/general/ExtraLineItemTable.tsx:108 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:320 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:322 #: src/tables/sales/ReturnOrderLineItemTable.tsx:96 #: src/tables/sales/SalesOrderLineItemTable.tsx:271 msgid "Edit Line Item" msgstr "" #: src/tables/general/ExtraLineItemTable.tsx:117 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:329 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:331 #: src/tables/sales/ReturnOrderLineItemTable.tsx:105 #: src/tables/sales/SalesOrderLineItemTable.tsx:280 msgid "Delete Line Item" @@ -10273,7 +10301,7 @@ msgid "Required Stock" msgstr "" #: src/tables/part/PartBuildAllocationsTable.tsx:124 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:381 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:383 msgid "View Build Order" msgstr "" @@ -10617,8 +10645,8 @@ msgstr "" #: src/tables/part/PartTestResultTable.tsx:103 #: src/tables/part/PartTestResultTable.tsx:181 -#: src/tables/part/PartTestResultTable.tsx:320 -#: src/tables/part/PartTestResultTable.tsx:334 +#: src/tables/part/PartTestResultTable.tsx:328 +#: src/tables/part/PartTestResultTable.tsx:342 #: src/tables/stock/StockItemTestResultTable.tsx:296 #: src/tables/stock/StockItemTestResultTable.tsx:368 #: src/tables/stock/StockItemTestResultTable.tsx:429 @@ -10643,7 +10671,7 @@ msgstr "" msgid "No Result" msgstr "Tulemus puudub" -#: src/tables/part/PartTestResultTable.tsx:298 +#: src/tables/part/PartTestResultTable.tsx:306 msgid "Show build outputs currently in production" msgstr "Kuva praegu tootmises olevad ehitustulemid" @@ -11073,7 +11101,7 @@ msgid "Show manufacturer parts for active manufacturers." msgstr "" #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:115 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:397 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:399 msgid "Import Line Items" msgstr "" @@ -11099,11 +11127,11 @@ msgstr "" #~ msgid "Add line item" #~ msgstr "Add line item" -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:350 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:352 msgid "Receive line item" msgstr "" -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:414 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:416 msgid "Receive items" msgstr "" @@ -11201,25 +11229,25 @@ msgid "Not shipped" msgstr "" #: src/tables/sales/SalesOrderAllocationTable.tsx:211 -#: src/tables/sales/SalesOrderAllocationTable.tsx:229 +#: src/tables/sales/SalesOrderAllocationTable.tsx:235 msgid "Edit Allocation" msgstr "" #: src/tables/sales/SalesOrderAllocationTable.tsx:218 #: src/tables/sales/SalesOrderAllocationTable.tsx:241 -msgid "Delete Allocation" -msgstr "" +#~ msgid "Delete Allocation" +#~ msgstr "Delete Allocation" -#: src/tables/sales/SalesOrderAllocationTable.tsx:252 -#: src/tables/sales/SalesOrderAllocationTable.tsx:253 +#: src/tables/sales/SalesOrderAllocationTable.tsx:261 +#: src/tables/sales/SalesOrderAllocationTable.tsx:262 msgid "View Shipment" msgstr "" -#: src/tables/sales/SalesOrderAllocationTable.tsx:308 +#: src/tables/sales/SalesOrderAllocationTable.tsx:317 msgid "Assign to Shipment" msgstr "" -#: src/tables/sales/SalesOrderAllocationTable.tsx:324 +#: src/tables/sales/SalesOrderAllocationTable.tsx:333 msgid "Assign to shipment" msgstr "" diff --git a/src/frontend/src/locales/fa/messages.po b/src/frontend/src/locales/fa/messages.po index 87d7679bdd..cd14a8c42a 100644 --- a/src/frontend/src/locales/fa/messages.po +++ b/src/frontend/src/locales/fa/messages.po @@ -8,7 +8,7 @@ msgstr "" "Language: fa\n" "Project-Id-Version: inventree\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2025-11-19 19:39\n" +"PO-Revision-Date: 2025-11-22 06:25\n" "Last-Translator: \n" "Language-Team: Persian\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" @@ -56,7 +56,7 @@ msgstr "" #: lib/components/RowActions.tsx:136 #: src/components/nav/NavigationDrawer.tsx:190 -#: src/forms/PurchaseOrderForms.tsx:802 +#: src/forms/PurchaseOrderForms.tsx:854 #: src/forms/StockForms.tsx:796 #: src/forms/StockForms.tsx:843 #: src/forms/StockForms.tsx:889 @@ -103,9 +103,9 @@ msgstr "" #: src/forms/BuildForms.tsx:630 #: src/forms/BuildForms.tsx:793 #: src/forms/BuildForms.tsx:896 -#: src/forms/PurchaseOrderForms.tsx:798 +#: src/forms/PurchaseOrderForms.tsx:850 #: src/forms/ReturnOrderForms.tsx:242 -#: src/forms/SalesOrderForms.tsx:305 +#: src/forms/SalesOrderForms.tsx:323 #: src/forms/StockForms.tsx:360 #: src/forms/StockForms.tsx:791 #: src/forms/StockForms.tsx:838 @@ -119,6 +119,7 @@ msgstr "" #: src/pages/build/BuildDetail.tsx:200 #: src/pages/part/PartDetail.tsx:1207 #: src/tables/ColumnRenderers.tsx:91 +#: src/tables/part/PartTestResultTable.tsx:247 #: src/tables/part/RelatedPartTable.tsx:53 #: src/tables/stock/StockTrackingTable.tsx:87 msgid "Part" @@ -158,7 +159,7 @@ msgstr "" #: src/components/wizards/OrderPartsWizard.tsx:290 #: src/pages/company/SupplierPartDetail.tsx:413 #: src/pages/stock/StockDetail.tsx:289 -#: src/tables/build/BuildAllocatedStockTable.tsx:155 +#: src/tables/build/BuildAllocatedStockTable.tsx:152 #: src/tables/part/PartPurchaseOrdersTable.tsx:50 #: src/tables/purchasing/SupplierPartTable.tsx:83 #: src/tables/stock/StockItemTable.tsx:247 @@ -201,9 +202,9 @@ msgstr "" #: src/forms/BuildForms.tsx:473 #: src/forms/BuildForms.tsx:633 #: src/forms/BuildForms.tsx:794 -#: src/forms/SalesOrderForms.tsx:307 +#: src/forms/SalesOrderForms.tsx:325 #: src/pages/stock/StockDetail.tsx:1005 -#: src/tables/part/PartTestResultTable.tsx:248 +#: src/tables/part/PartTestResultTable.tsx:256 #: src/tables/stock/StockTrackingTable.tsx:48 #: src/tables/stock/StockTrackingTable.tsx:55 msgid "Stock Item" @@ -517,7 +518,7 @@ msgstr "" #: src/components/dashboard/DashboardLayout.tsx:281 #: src/components/editors/NotesEditor.tsx:74 #: src/components/editors/TemplateEditor/TemplateEditor.tsx:158 -#: src/components/forms/fields/ApiFormField.tsx:273 +#: src/components/forms/fields/ApiFormField.tsx:237 #: src/components/forms/fields/TableField.tsx:45 #: src/components/importer/ImportDataSelector.tsx:192 #: src/components/importer/ImporterColumnSelector.tsx:234 @@ -642,8 +643,8 @@ msgstr "" #: src/components/barcodes/BarcodeScanDialog.tsx:49 #: src/components/buttons/ScanButton.tsx:15 #: src/components/nav/NavigationDrawer.tsx:122 -#: src/forms/PurchaseOrderForms.tsx:457 -#: src/forms/PurchaseOrderForms.tsx:563 +#: src/forms/PurchaseOrderForms.tsx:509 +#: src/forms/PurchaseOrderForms.tsx:615 msgid "Scan Barcode" msgstr "" @@ -728,7 +729,7 @@ msgstr "" #: src/components/barcodes/QRCode.tsx:205 #: src/components/items/ActionDropdown.tsx:192 -#: src/forms/PurchaseOrderForms.tsx:554 +#: src/forms/PurchaseOrderForms.tsx:606 msgid "Unlink Barcode" msgstr "" @@ -1216,6 +1217,12 @@ msgstr "" #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:884 #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:903 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:254 +#: src/tables/build/BuildAllocatedStockTable.tsx:178 +#: src/tables/build/BuildAllocatedStockTable.tsx:258 +#: src/tables/build/BuildLineTable.tsx:111 +#: src/tables/build/BuildLineTable.tsx:665 +#: src/tables/sales/SalesOrderAllocationTable.tsx:224 +#: src/tables/sales/SalesOrderAllocationTable.tsx:247 msgid "Remove" msgstr "" @@ -1241,7 +1248,7 @@ msgid "Upload Error" msgstr "" #: src/components/details/DetailsImage.tsx:250 -#: src/components/forms/fields/TextField.tsx:65 +#: src/components/forms/fields/AutoFillRightSection.tsx:34 msgid "Clear" msgstr "" @@ -1817,10 +1824,14 @@ msgstr "" msgid "Running" msgstr "" -#: src/components/forms/fields/ApiFormField.tsx:233 +#: src/components/forms/fields/ApiFormField.tsx:197 msgid "Select file to upload" msgstr "" +#: src/components/forms/fields/AutoFillRightSection.tsx:47 +msgid "Accept suggested value" +msgstr "" + #: src/components/forms/fields/DateField.tsx:76 msgid "Select date" msgstr "" @@ -1875,10 +1886,6 @@ msgstr "" msgid "Add new row" msgstr "" -#: src/components/forms/fields/TextField.tsx:82 -msgid "Accept suggested value" -msgstr "" - #: src/components/images/DetailsImage.tsx:252 #~ msgid "Select image" #~ msgstr "Select image" @@ -2225,8 +2232,8 @@ msgstr "" #: src/pages/part/PartDetail.tsx:994 #: src/pages/stock/StockDetail.tsx:265 #: src/pages/stock/StockDetail.tsx:942 -#: src/tables/build/BuildAllocatedStockTable.tsx:135 -#: src/tables/build/BuildLineTable.tsx:192 +#: src/tables/build/BuildAllocatedStockTable.tsx:132 +#: src/tables/build/BuildLineTable.tsx:193 #: src/tables/part/PartTable.tsx:137 #: src/tables/stock/StockItemTable.tsx:182 #: src/tables/stock/StockItemTable.tsx:343 @@ -2784,7 +2791,7 @@ msgstr "" #: src/pages/sales/SalesOrderDetail.tsx:119 #: src/pages/stock/LocationDetail.tsx:102 #: src/tables/ColumnRenderers.tsx:278 -#: src/tables/build/BuildAllocatedStockTable.tsx:91 +#: src/tables/build/BuildAllocatedStockTable.tsx:88 #: src/tables/machine/MachineTypeTable.tsx:161 #: src/tables/machine/MachineTypeTable.tsx:257 #: src/tables/plugin/PluginListTable.tsx:110 @@ -2966,7 +2973,7 @@ msgstr "" #: src/pages/company/SupplierPartDetail.tsx:394 #: src/pages/part/PartDetail.tsx:1015 #: src/tables/bom/BomTable.tsx:444 -#: src/tables/build/BuildLineTable.tsx:222 +#: src/tables/build/BuildLineTable.tsx:223 #: src/tables/part/PartTable.tsx:108 msgid "On Order" msgstr "" @@ -2976,7 +2983,7 @@ msgstr "" #: src/pages/part/PartDetail.tsx:587 #: src/pages/part/PartDetail.tsx:1021 #: src/pages/stock/StockDetail.tsx:925 -#: src/tables/part/PartTestResultTable.tsx:297 +#: src/tables/part/PartTestResultTable.tsx:305 #: src/tables/stock/StockItemTable.tsx:359 msgid "In Production" msgstr "" @@ -3000,7 +3007,7 @@ msgstr "" #: src/components/render/Stock.tsx:114 #: src/components/render/Stock.tsx:132 #: src/forms/BuildForms.tsx:795 -#: src/forms/PurchaseOrderForms.tsx:595 +#: src/forms/PurchaseOrderForms.tsx:647 #: src/forms/StockForms.tsx:792 #: src/forms/StockForms.tsx:839 #: src/forms/StockForms.tsx:885 @@ -3023,7 +3030,7 @@ msgstr "" #: src/components/render/Stock.tsx:99 #: src/pages/stock/StockDetail.tsx:198 #: src/pages/stock/StockDetail.tsx:930 -#: src/tables/build/BuildAllocatedStockTable.tsx:121 +#: src/tables/build/BuildAllocatedStockTable.tsx:118 #: src/tables/build/BuildOutputTable.tsx:107 #: src/tables/sales/SalesOrderAllocationTable.tsx:142 msgid "Serial Number" @@ -3034,9 +3041,9 @@ msgstr "" #: src/forms/BuildForms.tsx:240 #: src/forms/BuildForms.tsx:634 #: src/forms/BuildForms.tsx:797 -#: src/forms/PurchaseOrderForms.tsx:801 +#: src/forms/PurchaseOrderForms.tsx:853 #: src/forms/ReturnOrderForms.tsx:243 -#: src/forms/SalesOrderForms.tsx:308 +#: src/forms/SalesOrderForms.tsx:326 #: src/forms/StockForms.tsx:841 #: src/pages/part/PartStockHistoryDetail.tsx:56 #: src/pages/part/PartStockHistoryDetail.tsx:210 @@ -3046,9 +3053,9 @@ msgstr "" #: src/pages/part/pricing/PriceBreakPanel.tsx:172 #: src/pages/stock/StockDetail.tsx:258 #: src/pages/stock/StockDetail.tsx:936 -#: src/tables/build/BuildLineTable.tsx:86 +#: src/tables/build/BuildLineTable.tsx:83 #: src/tables/part/PartPurchaseOrdersTable.tsx:94 -#: src/tables/part/PartTestResultTable.tsx:269 +#: src/tables/part/PartTestResultTable.tsx:277 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:175 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:206 #: src/tables/purchasing/SupplierPriceBreakTable.tsx:69 @@ -3070,7 +3077,7 @@ msgstr "" #: src/forms/StockForms.tsx:1048 #: src/forms/StockForms.tsx:1096 #: src/forms/StockForms.tsx:1140 -#: src/tables/build/BuildLineTable.tsx:96 +#: src/tables/build/BuildLineTable.tsx:93 msgid "Batch" msgstr "" @@ -3755,7 +3762,7 @@ msgid "In Stock" msgstr "" #: src/components/wizards/OrderPartsWizard.tsx:146 -#: src/tables/build/BuildLineTable.tsx:404 +#: src/tables/build/BuildLineTable.tsx:405 msgid "Required Quantity" msgstr "" @@ -3847,7 +3854,7 @@ msgid "Please correct the errors in the selected parts" msgstr "" #: src/components/wizards/OrderPartsWizard.tsx:587 -#: src/tables/build/BuildLineTable.tsx:815 +#: src/tables/build/BuildLineTable.tsx:822 #: src/tables/part/PartTable.tsx:522 #: src/tables/sales/SalesOrderLineItemTable.tsx:370 msgid "Order Parts" @@ -4349,9 +4356,9 @@ msgstr "" #: src/forms/BuildForms.tsx:333 #: src/forms/BuildForms.tsx:408 #: src/forms/BuildForms.tsx:685 -#: src/tables/build/BuildAllocatedStockTable.tsx:150 +#: src/tables/build/BuildAllocatedStockTable.tsx:147 #: src/tables/build/BuildOutputTable.tsx:582 -#: src/tables/part/PartTestResultTable.tsx:272 +#: src/tables/part/PartTestResultTable.tsx:280 msgid "Build Output" msgstr "" @@ -4362,7 +4369,7 @@ msgstr "" #: src/forms/BuildForms.tsx:336 #: src/forms/BuildForms.tsx:411 #: src/forms/BuildForms.tsx:475 -#: src/forms/PurchaseOrderForms.tsx:717 +#: src/forms/PurchaseOrderForms.tsx:769 #: src/forms/ReturnOrderForms.tsx:197 #: src/forms/ReturnOrderForms.tsx:244 #: src/forms/StockForms.tsx:712 @@ -4377,7 +4384,7 @@ msgstr "" #: src/tables/build/BuildOutputTable.tsx:404 #: src/tables/machine/MachineListTable.tsx:387 #: src/tables/part/PartPurchaseOrdersTable.tsx:38 -#: src/tables/part/PartTestResultTable.tsx:309 +#: src/tables/part/PartTestResultTable.tsx:317 #: src/tables/sales/ReturnOrderLineItemTable.tsx:138 #: src/tables/sales/ReturnOrderLineItemTable.tsx:176 #: src/tables/settings/CustomStateTable.tsx:79 @@ -4450,8 +4457,8 @@ msgstr "" #: src/pages/stock/StockDetail.tsx:153 #: src/tables/bom/BomTable.tsx:134 #: src/tables/bom/UsedInTable.tsx:40 -#: src/tables/build/BuildAllocatedStockTable.tsx:108 -#: src/tables/build/BuildLineTable.tsx:336 +#: src/tables/build/BuildAllocatedStockTable.tsx:105 +#: src/tables/build/BuildLineTable.tsx:337 #: src/tables/build/BuildOrderTable.tsx:79 #: src/tables/part/PartSalesAllocationsTable.tsx:61 #: src/tables/part/RelatedPartTable.tsx:73 @@ -4466,47 +4473,47 @@ msgstr "" #: src/forms/BuildForms.tsx:632 #: src/forms/BuildForms.tsx:796 #: src/forms/BuildForms.tsx:897 -#: src/forms/SalesOrderForms.tsx:306 -#: src/tables/build/BuildAllocatedStockTable.tsx:139 -#: src/tables/build/BuildLineTable.tsx:182 +#: src/forms/SalesOrderForms.tsx:324 +#: src/tables/build/BuildAllocatedStockTable.tsx:136 +#: src/tables/build/BuildLineTable.tsx:183 #: src/tables/sales/SalesOrderLineItemTable.tsx:342 #: src/tables/stock/StockItemTable.tsx:338 msgid "Allocated" msgstr "" #: src/forms/BuildForms.tsx:667 -#: src/forms/SalesOrderForms.tsx:295 +#: src/forms/SalesOrderForms.tsx:313 #: src/pages/build/BuildDetail.tsx:108 #: src/pages/build/BuildDetail.tsx:326 msgid "Source Location" msgstr "" #: src/forms/BuildForms.tsx:668 -#: src/forms/SalesOrderForms.tsx:296 +#: src/forms/SalesOrderForms.tsx:314 msgid "Select the source location for the stock allocation" msgstr "" #: src/forms/BuildForms.tsx:700 -#: src/forms/SalesOrderForms.tsx:336 -#: src/tables/build/BuildLineTable.tsx:574 -#: src/tables/build/BuildLineTable.tsx:731 -#: src/tables/build/BuildLineTable.tsx:830 +#: src/forms/SalesOrderForms.tsx:354 +#: src/tables/build/BuildLineTable.tsx:575 +#: src/tables/build/BuildLineTable.tsx:738 +#: src/tables/build/BuildLineTable.tsx:837 #: src/tables/sales/SalesOrderLineItemTable.tsx:380 #: src/tables/sales/SalesOrderLineItemTable.tsx:406 msgid "Allocate Stock" msgstr "" #: src/forms/BuildForms.tsx:703 -#: src/forms/SalesOrderForms.tsx:341 +#: src/forms/SalesOrderForms.tsx:359 msgid "Stock items allocated" msgstr "" #: src/forms/BuildForms.tsx:816 #: src/forms/BuildForms.tsx:917 -#: src/tables/build/BuildAllocatedStockTable.tsx:240 -#: src/tables/build/BuildAllocatedStockTable.tsx:272 -#: src/tables/build/BuildLineTable.tsx:741 -#: src/tables/build/BuildLineTable.tsx:864 +#: src/tables/build/BuildAllocatedStockTable.tsx:243 +#: src/tables/build/BuildAllocatedStockTable.tsx:279 +#: src/tables/build/BuildLineTable.tsx:748 +#: src/tables/build/BuildLineTable.tsx:871 msgid "Consume Stock" msgstr "" @@ -4521,21 +4528,21 @@ msgstr "" #~ msgstr "Stock items consumed" #: src/forms/BuildForms.tsx:853 -#: src/tables/build/BuildLineTable.tsx:514 +#: src/tables/build/BuildLineTable.tsx:515 #: src/tables/part/PartBuildAllocationsTable.tsx:101 msgid "Fully consumed" msgstr "" #: src/forms/BuildForms.tsx:898 -#: src/tables/build/BuildLineTable.tsx:187 +#: src/tables/build/BuildLineTable.tsx:188 #: src/tables/stock/StockItemTable.tsx:367 msgid "Consumed" msgstr "" #: src/forms/CommonForms.tsx:88 -#: src/forms/PurchaseOrderForms.tsx:125 +#: src/forms/PurchaseOrderForms.tsx:176 #: src/forms/ReturnOrderForms.tsx:138 -#: src/forms/SalesOrderForms.tsx:164 +#: src/forms/SalesOrderForms.tsx:182 msgid "Select project code for this line item" msgstr "" @@ -4572,32 +4579,16 @@ msgstr "" msgid "Subscribe to notifications for this category" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:388 -msgid "Assign Batch Code and Serial Numbers" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:390 -msgid "Assign Batch Code" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:410 -msgid "Choose Location" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:418 -msgid "Item Destination selected" -msgstr "" - #: src/forms/PurchaseOrderForms.tsx:421 #~ msgid "Assign Batch Code{0}" #~ msgstr "Assign Batch Code{0}" -#: src/forms/PurchaseOrderForms.tsx:428 -msgid "Part category default location selected" +#: src/forms/PurchaseOrderForms.tsx:440 +msgid "Assign Batch Code and Serial Numbers" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:438 -msgid "Received stock location selected" +#: src/forms/PurchaseOrderForms.tsx:442 +msgid "Assign Batch Code" msgstr "" #: src/forms/PurchaseOrderForms.tsx:444 @@ -4605,94 +4596,110 @@ msgstr "" #~ msgid "Remove item from list" #~ msgstr "Remove item from list" -#: src/forms/PurchaseOrderForms.tsx:446 +#: src/forms/PurchaseOrderForms.tsx:462 +msgid "Choose Location" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:470 +msgid "Item Destination selected" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:480 +msgid "Part category default location selected" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:490 +msgid "Received stock location selected" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:498 msgid "Default location selected" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:507 +#: src/forms/PurchaseOrderForms.tsx:559 msgid "Set Location" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:524 -msgid "Set Expiry Date" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:532 -#: src/forms/StockForms.tsx:693 -msgid "Adjust Packaging" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:540 -#: src/forms/StockForms.tsx:684 -#: src/hooks/UseStockAdjustActions.tsx:148 -msgid "Change Status" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:546 -msgid "Add Note" -msgstr "" - #: src/forms/PurchaseOrderForms.tsx:566 #~ msgid "Serial numbers" #~ msgstr "Serial numbers" +#: src/forms/PurchaseOrderForms.tsx:576 +msgid "Set Expiry Date" +msgstr "" + #: src/forms/PurchaseOrderForms.tsx:582 #~ msgid "Store at line item destination" #~ msgstr "Store at line item destination" -#: src/forms/PurchaseOrderForms.tsx:610 -msgid "Store at default location" +#: src/forms/PurchaseOrderForms.tsx:584 +#: src/forms/StockForms.tsx:693 +msgid "Adjust Packaging" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:625 -msgid "Store at line item destination " +#: src/forms/PurchaseOrderForms.tsx:592 +#: src/forms/StockForms.tsx:684 +#: src/hooks/UseStockAdjustActions.tsx:148 +msgid "Change Status" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:637 -msgid "Store with already received stock" +#: src/forms/PurchaseOrderForms.tsx:598 +msgid "Add Note" msgstr "" #: src/forms/PurchaseOrderForms.tsx:658 #~ msgid "Receive line items" #~ msgstr "Receive line items" -#: src/forms/PurchaseOrderForms.tsx:661 +#: src/forms/PurchaseOrderForms.tsx:662 +msgid "Store at default location" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:677 +msgid "Store at line item destination " +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:689 +msgid "Store with already received stock" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:713 #: src/pages/build/BuildDetail.tsx:340 #: src/pages/stock/StockDetail.tsx:280 #: src/pages/stock/StockDetail.tsx:952 #: src/tables/Filter.tsx:83 -#: src/tables/build/BuildAllocatedStockTable.tsx:128 +#: src/tables/build/BuildAllocatedStockTable.tsx:125 #: src/tables/build/BuildOutputTable.tsx:112 -#: src/tables/part/PartTestResultTable.tsx:260 -#: src/tables/part/PartTestResultTable.tsx:281 +#: src/tables/part/PartTestResultTable.tsx:268 +#: src/tables/part/PartTestResultTable.tsx:289 #: src/tables/sales/SalesOrderAllocationTable.tsx:149 msgid "Batch Code" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:662 +#: src/forms/PurchaseOrderForms.tsx:714 msgid "Enter batch code for received items" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:675 +#: src/forms/PurchaseOrderForms.tsx:727 #: src/forms/StockForms.tsx:218 msgid "Serial Numbers" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:676 +#: src/forms/PurchaseOrderForms.tsx:728 msgid "Enter serial numbers for received items" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:690 +#: src/forms/PurchaseOrderForms.tsx:742 #: src/pages/stock/StockDetail.tsx:382 #: src/tables/stock/StockItemTable.tsx:294 msgid "Expiry Date" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:691 +#: src/forms/PurchaseOrderForms.tsx:743 msgid "Enter an expiry date for received items" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:703 +#: src/forms/PurchaseOrderForms.tsx:755 #: src/forms/StockForms.tsx:728 #: src/pages/company/SupplierPartDetail.tsx:172 #: src/pages/company/SupplierPartDetail.tsx:236 @@ -4701,19 +4708,19 @@ msgstr "" msgid "Packaging" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:727 +#: src/forms/PurchaseOrderForms.tsx:779 #: src/pages/company/SupplierPartDetail.tsx:120 #: src/tables/ColumnRenderers.tsx:332 msgid "Note" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:799 +#: src/forms/PurchaseOrderForms.tsx:851 #: src/pages/company/SupplierPartDetail.tsx:138 #: src/tables/purchasing/SupplierPriceBreakTable.tsx:49 msgid "SKU" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:800 +#: src/forms/PurchaseOrderForms.tsx:852 #: src/tables/part/PartPurchaseOrdersTable.tsx:127 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:213 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:283 @@ -4721,11 +4728,11 @@ msgstr "" msgid "Received" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:817 +#: src/forms/PurchaseOrderForms.tsx:869 msgid "Receive Line Items" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:823 +#: src/forms/PurchaseOrderForms.tsx:875 msgid "Items received" msgstr "" @@ -4737,7 +4744,7 @@ msgstr "" msgid "Item received into stock" msgstr "" -#: src/forms/SalesOrderForms.tsx:401 +#: src/forms/SalesOrderForms.tsx:419 msgid "Leave blank to use the order address" msgstr "" @@ -5932,6 +5939,9 @@ msgstr "" #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:310 #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:401 +#: src/tables/build/BuildAllocatedStockTable.tsx:181 +#: src/tables/build/BuildLineTable.tsx:668 +#: src/tables/sales/SalesOrderAllocationTable.tsx:220 msgid "Confirm Removal" msgstr "" @@ -6870,8 +6880,8 @@ msgstr "" #: src/pages/sales/ReturnOrderDetail.tsx:108 #: src/pages/sales/SalesOrderDetail.tsx:98 #: src/tables/ColumnRenderers.tsx:321 -#: src/tables/build/BuildAllocatedStockTable.tsx:115 -#: src/tables/build/BuildLineTable.tsx:352 +#: src/tables/build/BuildAllocatedStockTable.tsx:112 +#: src/tables/build/BuildLineTable.tsx:353 msgid "Reference" msgstr "" @@ -7132,7 +7142,7 @@ msgstr "" #: src/pages/build/BuildDetail.tsx:742 #: src/pages/stock/StockDetail.tsx:344 -#: src/tables/build/BuildAllocatedStockTable.tsx:85 +#: src/tables/build/BuildAllocatedStockTable.tsx:82 #: src/tables/part/PartBuildAllocationsTable.tsx:45 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:157 #: src/tables/stock/StockTrackingTable.tsx:109 @@ -7600,7 +7610,7 @@ msgstr "" #: src/pages/part/PartDetail.tsx:542 #: src/tables/bom/BomTable.tsx:439 -#: src/tables/build/BuildLineTable.tsx:305 +#: src/tables/build/BuildLineTable.tsx:306 #: src/tables/part/PartTable.tsx:319 #: src/tables/sales/SalesOrderLineItemTable.tsx:138 msgid "Available Stock" @@ -7608,7 +7618,7 @@ msgstr "" #: src/pages/part/PartDetail.tsx:548 #: src/tables/bom/BomTable.tsx:341 -#: src/tables/build/BuildLineTable.tsx:267 +#: src/tables/build/BuildLineTable.tsx:268 #: src/tables/sales/SalesOrderLineItemTable.tsx:180 msgid "On order" msgstr "" @@ -7782,7 +7792,7 @@ msgstr "" #: src/pages/part/PartDetail.tsx:1144 #: src/pages/stock/StockDetail.tsx:884 -#: src/tables/build/BuildLineTable.tsx:761 +#: src/tables/build/BuildLineTable.tsx:768 msgid "Order Stock" msgstr "" @@ -9219,13 +9229,13 @@ msgstr "" #~ msgstr "Show asssmbled items" #: src/tables/bom/BomTable.tsx:315 -#: src/tables/build/BuildLineTable.tsx:276 +#: src/tables/build/BuildLineTable.tsx:277 #: src/tables/part/PartTable.tsx:145 msgid "External stock" msgstr "" #: src/tables/bom/BomTable.tsx:323 -#: src/tables/build/BuildLineTable.tsx:239 +#: src/tables/build/BuildLineTable.tsx:240 msgid "Includes substitute stock" msgstr "" @@ -9234,7 +9244,7 @@ msgstr "" #~ msgstr "Edit Bom Item" #: src/tables/bom/BomTable.tsx:332 -#: src/tables/build/BuildLineTable.tsx:249 +#: src/tables/build/BuildLineTable.tsx:250 #: src/tables/sales/SalesOrderLineItemTable.tsx:166 msgid "Includes variant stock" msgstr "" @@ -9272,8 +9282,8 @@ msgid "Stock Information" msgstr "" #: src/tables/bom/BomTable.tsx:399 -#: src/tables/build/BuildLineTable.tsx:496 -#: src/tables/build/BuildLineTable.tsx:537 +#: src/tables/build/BuildLineTable.tsx:497 +#: src/tables/build/BuildLineTable.tsx:538 msgid "Consumable item" msgstr "" @@ -9282,7 +9292,7 @@ msgid "No available stock" msgstr "" #: src/tables/bom/BomTable.tsx:420 -#: src/tables/build/BuildLineTable.tsx:213 +#: src/tables/build/BuildLineTable.tsx:214 msgid "Show testable items" msgstr "" @@ -9291,7 +9301,7 @@ msgid "Show trackable items" msgstr "" #: src/tables/bom/BomTable.tsx:430 -#: src/tables/build/BuildLineTable.tsx:208 +#: src/tables/build/BuildLineTable.tsx:209 msgid "Show assembled items" msgstr "" @@ -9335,7 +9345,7 @@ msgstr "" #: src/tables/bom/BomTable.tsx:464 #: src/tables/bom/UsedInTable.tsx:85 -#: src/tables/build/BuildLineTable.tsx:202 +#: src/tables/build/BuildLineTable.tsx:203 msgid "Optional" msgstr "" @@ -9345,7 +9355,7 @@ msgid "Show optional items" msgstr "" #: src/tables/bom/BomTable.tsx:469 -#: src/tables/build/BuildLineTable.tsx:197 +#: src/tables/build/BuildLineTable.tsx:198 msgid "Consumable" msgstr "" @@ -9433,7 +9443,7 @@ msgid "Bill of materials cannot be edited, as the part is locked" msgstr "" #: src/tables/bom/UsedInTable.tsx:34 -#: src/tables/build/BuildLineTable.tsx:207 +#: src/tables/build/BuildLineTable.tsx:208 #: src/tables/part/ParametricPartTable.tsx:364 #: src/tables/part/PartBuildAllocationsTable.tsx:60 #: src/tables/part/PartTable.tsx:209 @@ -9455,11 +9465,11 @@ msgstr "" msgid "Show trackable assemblies" msgstr "" -#: src/tables/build/BuildAllocatedStockTable.tsx:67 +#: src/tables/build/BuildAllocatedStockTable.tsx:64 msgid "Allocated to Output" msgstr "" -#: src/tables/build/BuildAllocatedStockTable.tsx:68 +#: src/tables/build/BuildAllocatedStockTable.tsx:65 msgid "Show items allocated to a build output" msgstr "" @@ -9472,7 +9482,7 @@ msgstr "" #~ msgid "Include orders for part variants" #~ msgstr "Include orders for part variants" -#: src/tables/build/BuildAllocatedStockTable.tsx:97 +#: src/tables/build/BuildAllocatedStockTable.tsx:94 #: src/tables/part/PartBuildAllocationsTable.tsx:84 #: src/tables/part/PartPurchaseOrdersTable.tsx:132 #: src/tables/part/PartSalesAllocationsTable.tsx:69 @@ -9482,40 +9492,58 @@ msgid "Order Status" msgstr "" #: src/tables/build/BuildAllocatedStockTable.tsx:164 -#~ msgid "Edit Build Item" -#~ msgstr "Edit Build Item" - -#: src/tables/build/BuildAllocatedStockTable.tsx:167 -#: src/tables/build/BuildLineTable.tsx:650 +#: src/tables/build/BuildLineTable.tsx:651 msgid "Edit Stock Allocation" msgstr "" +#: src/tables/build/BuildAllocatedStockTable.tsx:164 +#~ msgid "Edit Build Item" +#~ msgstr "Edit Build Item" + #: src/tables/build/BuildAllocatedStockTable.tsx:174 #~ msgid "Delete Build Item" #~ msgstr "Delete Build Item" -#: src/tables/build/BuildAllocatedStockTable.tsx:180 -#: src/tables/build/BuildLineTable.tsx:663 -msgid "Delete Stock Allocation" +#: src/tables/build/BuildAllocatedStockTable.tsx:177 +#: src/tables/build/BuildLineTable.tsx:664 +#: src/tables/sales/SalesOrderAllocationTable.tsx:218 +msgid "Remove Allocated Stock" msgstr "" -#: src/tables/build/BuildAllocatedStockTable.tsx:239 +#: src/tables/build/BuildAllocatedStockTable.tsx:180 +#: src/tables/build/BuildLineTable.tsx:663 +#~ msgid "Delete Stock Allocation" +#~ msgstr "Delete Stock Allocation" + +#: src/tables/build/BuildAllocatedStockTable.tsx:182 +#: src/tables/build/BuildLineTable.tsx:669 +#: src/tables/sales/SalesOrderAllocationTable.tsx:221 +msgid "Are you sure you want to remove this allocated stock from the order?" +msgstr "" + +#: src/tables/build/BuildAllocatedStockTable.tsx:242 msgid "Consume" msgstr "" +#: src/tables/build/BuildAllocatedStockTable.tsx:259 +#: src/tables/build/BuildLineTable.tsx:112 +#: src/tables/sales/SalesOrderAllocationTable.tsx:248 +msgid "Remove allocated stock" +msgstr "" + #: src/tables/build/BuildLineTable.tsx:59 #~ msgid "Show lines with available stock" #~ msgstr "Show lines with available stock" -#: src/tables/build/BuildLineTable.tsx:120 +#: src/tables/build/BuildLineTable.tsx:121 msgid "View Stock Item" msgstr "" -#: src/tables/build/BuildLineTable.tsx:183 +#: src/tables/build/BuildLineTable.tsx:184 msgid "Show fully allocated lines" msgstr "" -#: src/tables/build/BuildLineTable.tsx:188 +#: src/tables/build/BuildLineTable.tsx:189 msgid "Show fully consumed lines" msgstr "" @@ -9523,124 +9551,124 @@ msgstr "" #~ msgid "Show allocated lines" #~ msgstr "Show allocated lines" -#: src/tables/build/BuildLineTable.tsx:193 +#: src/tables/build/BuildLineTable.tsx:194 msgid "Show items with sufficient available stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:198 +#: src/tables/build/BuildLineTable.tsx:199 msgid "Show consumable lines" msgstr "" -#: src/tables/build/BuildLineTable.tsx:203 +#: src/tables/build/BuildLineTable.tsx:204 msgid "Show optional lines" msgstr "" -#: src/tables/build/BuildLineTable.tsx:212 +#: src/tables/build/BuildLineTable.tsx:213 #: src/tables/part/PartTable.tsx:233 msgid "Testable" msgstr "" -#: src/tables/build/BuildLineTable.tsx:217 +#: src/tables/build/BuildLineTable.tsx:218 #: src/tables/stock/StockItemTable.tsx:388 msgid "Tracked" msgstr "" -#: src/tables/build/BuildLineTable.tsx:218 +#: src/tables/build/BuildLineTable.tsx:219 msgid "Show tracked lines" msgstr "" -#: src/tables/build/BuildLineTable.tsx:223 +#: src/tables/build/BuildLineTable.tsx:224 msgid "Show items with stock on order" msgstr "" -#: src/tables/build/BuildLineTable.tsx:258 +#: src/tables/build/BuildLineTable.tsx:259 #: src/tables/sales/SalesOrderLineItemTable.tsx:172 msgid "In production" msgstr "" -#: src/tables/build/BuildLineTable.tsx:286 +#: src/tables/build/BuildLineTable.tsx:287 msgid "Insufficient stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:302 +#: src/tables/build/BuildLineTable.tsx:303 #: src/tables/sales/SalesOrderLineItemTable.tsx:160 #: src/tables/stock/StockItemTable.tsx:191 msgid "No stock available" msgstr "" -#: src/tables/build/BuildLineTable.tsx:375 +#: src/tables/build/BuildLineTable.tsx:376 msgid "Gets Inherited" msgstr "" -#: src/tables/build/BuildLineTable.tsx:388 +#: src/tables/build/BuildLineTable.tsx:389 msgid "Unit Quantity" msgstr "" -#: src/tables/build/BuildLineTable.tsx:415 +#: src/tables/build/BuildLineTable.tsx:416 msgid "Setup Quantity" msgstr "" -#: src/tables/build/BuildLineTable.tsx:424 +#: src/tables/build/BuildLineTable.tsx:425 msgid "Attrition" msgstr "" -#: src/tables/build/BuildLineTable.tsx:432 +#: src/tables/build/BuildLineTable.tsx:433 msgid "Rounding Multiple" msgstr "" -#: src/tables/build/BuildLineTable.tsx:441 +#: src/tables/build/BuildLineTable.tsx:442 msgid "BOM Information" msgstr "" -#: src/tables/build/BuildLineTable.tsx:515 +#: src/tables/build/BuildLineTable.tsx:516 #: src/tables/part/PartBuildAllocationsTable.tsx:102 msgid "Fully allocated" msgstr "" -#: src/tables/build/BuildLineTable.tsx:563 +#: src/tables/build/BuildLineTable.tsx:564 #: src/tables/sales/SalesOrderLineItemTable.tsx:311 msgid "Create Build Order" msgstr "" -#: src/tables/build/BuildLineTable.tsx:592 +#: src/tables/build/BuildLineTable.tsx:593 msgid "Auto allocation in progress" msgstr "" -#: src/tables/build/BuildLineTable.tsx:595 -#: src/tables/build/BuildLineTable.tsx:802 +#: src/tables/build/BuildLineTable.tsx:596 +#: src/tables/build/BuildLineTable.tsx:809 msgid "Auto Allocate Stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:596 +#: src/tables/build/BuildLineTable.tsx:597 msgid "Automatically allocate stock to this build according to the selected options" msgstr "" -#: src/tables/build/BuildLineTable.tsx:616 -#: src/tables/build/BuildLineTable.tsx:630 -#: src/tables/build/BuildLineTable.tsx:751 -#: src/tables/build/BuildLineTable.tsx:852 +#: src/tables/build/BuildLineTable.tsx:617 +#: src/tables/build/BuildLineTable.tsx:631 +#: src/tables/build/BuildLineTable.tsx:758 +#: src/tables/build/BuildLineTable.tsx:859 #: src/tables/build/BuildOutputTable.tsx:355 #: src/tables/build/BuildOutputTable.tsx:360 msgid "Deallocate Stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:632 +#: src/tables/build/BuildLineTable.tsx:633 msgid "Deallocate all untracked stock for this build order" msgstr "" -#: src/tables/build/BuildLineTable.tsx:634 +#: src/tables/build/BuildLineTable.tsx:635 msgid "Deallocate stock from the selected line item" msgstr "" -#: src/tables/build/BuildLineTable.tsx:638 +#: src/tables/build/BuildLineTable.tsx:639 msgid "Stock has been deallocated" msgstr "" -#: src/tables/build/BuildLineTable.tsx:771 +#: src/tables/build/BuildLineTable.tsx:778 msgid "Build Stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:784 +#: src/tables/build/BuildLineTable.tsx:791 #: src/tables/sales/SalesOrderLineItemTable.tsx:487 msgid "View Part" msgstr "" @@ -9739,7 +9767,7 @@ msgid "Serialize Build Output" msgstr "" #: src/tables/build/BuildOutputTable.tsx:405 -#: src/tables/part/PartTestResultTable.tsx:310 +#: src/tables/part/PartTestResultTable.tsx:318 #: src/tables/stock/StockItemTable.tsx:328 msgid "Filter by stock status" msgstr "" @@ -9964,8 +9992,8 @@ msgid "View Item" msgstr "" #: src/tables/general/ExtraLineItemTable.tsx:95 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:299 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:403 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:300 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:405 #: src/tables/sales/ReturnOrderLineItemTable.tsx:83 #: src/tables/sales/ReturnOrderLineItemTable.tsx:187 #: src/tables/sales/SalesOrderLineItemTable.tsx:252 @@ -9974,14 +10002,14 @@ msgid "Add Line Item" msgstr "" #: src/tables/general/ExtraLineItemTable.tsx:108 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:320 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:322 #: src/tables/sales/ReturnOrderLineItemTable.tsx:96 #: src/tables/sales/SalesOrderLineItemTable.tsx:271 msgid "Edit Line Item" msgstr "" #: src/tables/general/ExtraLineItemTable.tsx:117 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:329 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:331 #: src/tables/sales/ReturnOrderLineItemTable.tsx:105 #: src/tables/sales/SalesOrderLineItemTable.tsx:280 msgid "Delete Line Item" @@ -10273,7 +10301,7 @@ msgid "Required Stock" msgstr "" #: src/tables/part/PartBuildAllocationsTable.tsx:124 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:381 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:383 msgid "View Build Order" msgstr "" @@ -10617,8 +10645,8 @@ msgstr "" #: src/tables/part/PartTestResultTable.tsx:103 #: src/tables/part/PartTestResultTable.tsx:181 -#: src/tables/part/PartTestResultTable.tsx:320 -#: src/tables/part/PartTestResultTable.tsx:334 +#: src/tables/part/PartTestResultTable.tsx:328 +#: src/tables/part/PartTestResultTable.tsx:342 #: src/tables/stock/StockItemTestResultTable.tsx:296 #: src/tables/stock/StockItemTestResultTable.tsx:368 #: src/tables/stock/StockItemTestResultTable.tsx:429 @@ -10643,7 +10671,7 @@ msgstr "" msgid "No Result" msgstr "" -#: src/tables/part/PartTestResultTable.tsx:298 +#: src/tables/part/PartTestResultTable.tsx:306 msgid "Show build outputs currently in production" msgstr "" @@ -11073,7 +11101,7 @@ msgid "Show manufacturer parts for active manufacturers." msgstr "" #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:115 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:397 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:399 msgid "Import Line Items" msgstr "" @@ -11099,11 +11127,11 @@ msgstr "" #~ msgid "Add line item" #~ msgstr "Add line item" -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:350 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:352 msgid "Receive line item" msgstr "" -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:414 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:416 msgid "Receive items" msgstr "" @@ -11201,25 +11229,25 @@ msgid "Not shipped" msgstr "" #: src/tables/sales/SalesOrderAllocationTable.tsx:211 -#: src/tables/sales/SalesOrderAllocationTable.tsx:229 +#: src/tables/sales/SalesOrderAllocationTable.tsx:235 msgid "Edit Allocation" msgstr "" #: src/tables/sales/SalesOrderAllocationTable.tsx:218 #: src/tables/sales/SalesOrderAllocationTable.tsx:241 -msgid "Delete Allocation" -msgstr "" +#~ msgid "Delete Allocation" +#~ msgstr "Delete Allocation" -#: src/tables/sales/SalesOrderAllocationTable.tsx:252 -#: src/tables/sales/SalesOrderAllocationTable.tsx:253 +#: src/tables/sales/SalesOrderAllocationTable.tsx:261 +#: src/tables/sales/SalesOrderAllocationTable.tsx:262 msgid "View Shipment" msgstr "" -#: src/tables/sales/SalesOrderAllocationTable.tsx:308 +#: src/tables/sales/SalesOrderAllocationTable.tsx:317 msgid "Assign to Shipment" msgstr "" -#: src/tables/sales/SalesOrderAllocationTable.tsx:324 +#: src/tables/sales/SalesOrderAllocationTable.tsx:333 msgid "Assign to shipment" msgstr "" diff --git a/src/frontend/src/locales/fi/messages.po b/src/frontend/src/locales/fi/messages.po index 6e0dde81aa..45b4c909ae 100644 --- a/src/frontend/src/locales/fi/messages.po +++ b/src/frontend/src/locales/fi/messages.po @@ -8,7 +8,7 @@ msgstr "" "Language: fi\n" "Project-Id-Version: inventree\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2025-11-19 19:39\n" +"PO-Revision-Date: 2025-11-22 06:25\n" "Last-Translator: \n" "Language-Team: Finnish\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" @@ -56,7 +56,7 @@ msgstr "" #: lib/components/RowActions.tsx:136 #: src/components/nav/NavigationDrawer.tsx:190 -#: src/forms/PurchaseOrderForms.tsx:802 +#: src/forms/PurchaseOrderForms.tsx:854 #: src/forms/StockForms.tsx:796 #: src/forms/StockForms.tsx:843 #: src/forms/StockForms.tsx:889 @@ -103,9 +103,9 @@ msgstr "" #: src/forms/BuildForms.tsx:630 #: src/forms/BuildForms.tsx:793 #: src/forms/BuildForms.tsx:896 -#: src/forms/PurchaseOrderForms.tsx:798 +#: src/forms/PurchaseOrderForms.tsx:850 #: src/forms/ReturnOrderForms.tsx:242 -#: src/forms/SalesOrderForms.tsx:305 +#: src/forms/SalesOrderForms.tsx:323 #: src/forms/StockForms.tsx:360 #: src/forms/StockForms.tsx:791 #: src/forms/StockForms.tsx:838 @@ -119,6 +119,7 @@ msgstr "" #: src/pages/build/BuildDetail.tsx:200 #: src/pages/part/PartDetail.tsx:1207 #: src/tables/ColumnRenderers.tsx:91 +#: src/tables/part/PartTestResultTable.tsx:247 #: src/tables/part/RelatedPartTable.tsx:53 #: src/tables/stock/StockTrackingTable.tsx:87 msgid "Part" @@ -158,7 +159,7 @@ msgstr "" #: src/components/wizards/OrderPartsWizard.tsx:290 #: src/pages/company/SupplierPartDetail.tsx:413 #: src/pages/stock/StockDetail.tsx:289 -#: src/tables/build/BuildAllocatedStockTable.tsx:155 +#: src/tables/build/BuildAllocatedStockTable.tsx:152 #: src/tables/part/PartPurchaseOrdersTable.tsx:50 #: src/tables/purchasing/SupplierPartTable.tsx:83 #: src/tables/stock/StockItemTable.tsx:247 @@ -201,9 +202,9 @@ msgstr "" #: src/forms/BuildForms.tsx:473 #: src/forms/BuildForms.tsx:633 #: src/forms/BuildForms.tsx:794 -#: src/forms/SalesOrderForms.tsx:307 +#: src/forms/SalesOrderForms.tsx:325 #: src/pages/stock/StockDetail.tsx:1005 -#: src/tables/part/PartTestResultTable.tsx:248 +#: src/tables/part/PartTestResultTable.tsx:256 #: src/tables/stock/StockTrackingTable.tsx:48 #: src/tables/stock/StockTrackingTable.tsx:55 msgid "Stock Item" @@ -517,7 +518,7 @@ msgstr "" #: src/components/dashboard/DashboardLayout.tsx:281 #: src/components/editors/NotesEditor.tsx:74 #: src/components/editors/TemplateEditor/TemplateEditor.tsx:158 -#: src/components/forms/fields/ApiFormField.tsx:273 +#: src/components/forms/fields/ApiFormField.tsx:237 #: src/components/forms/fields/TableField.tsx:45 #: src/components/importer/ImportDataSelector.tsx:192 #: src/components/importer/ImporterColumnSelector.tsx:234 @@ -642,8 +643,8 @@ msgstr "" #: src/components/barcodes/BarcodeScanDialog.tsx:49 #: src/components/buttons/ScanButton.tsx:15 #: src/components/nav/NavigationDrawer.tsx:122 -#: src/forms/PurchaseOrderForms.tsx:457 -#: src/forms/PurchaseOrderForms.tsx:563 +#: src/forms/PurchaseOrderForms.tsx:509 +#: src/forms/PurchaseOrderForms.tsx:615 msgid "Scan Barcode" msgstr "" @@ -728,7 +729,7 @@ msgstr "" #: src/components/barcodes/QRCode.tsx:205 #: src/components/items/ActionDropdown.tsx:192 -#: src/forms/PurchaseOrderForms.tsx:554 +#: src/forms/PurchaseOrderForms.tsx:606 msgid "Unlink Barcode" msgstr "" @@ -1216,6 +1217,12 @@ msgstr "" #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:884 #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:903 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:254 +#: src/tables/build/BuildAllocatedStockTable.tsx:178 +#: src/tables/build/BuildAllocatedStockTable.tsx:258 +#: src/tables/build/BuildLineTable.tsx:111 +#: src/tables/build/BuildLineTable.tsx:665 +#: src/tables/sales/SalesOrderAllocationTable.tsx:224 +#: src/tables/sales/SalesOrderAllocationTable.tsx:247 msgid "Remove" msgstr "" @@ -1241,7 +1248,7 @@ msgid "Upload Error" msgstr "" #: src/components/details/DetailsImage.tsx:250 -#: src/components/forms/fields/TextField.tsx:65 +#: src/components/forms/fields/AutoFillRightSection.tsx:34 msgid "Clear" msgstr "" @@ -1817,10 +1824,14 @@ msgstr "" msgid "Running" msgstr "" -#: src/components/forms/fields/ApiFormField.tsx:233 +#: src/components/forms/fields/ApiFormField.tsx:197 msgid "Select file to upload" msgstr "" +#: src/components/forms/fields/AutoFillRightSection.tsx:47 +msgid "Accept suggested value" +msgstr "" + #: src/components/forms/fields/DateField.tsx:76 msgid "Select date" msgstr "" @@ -1875,10 +1886,6 @@ msgstr "" msgid "Add new row" msgstr "" -#: src/components/forms/fields/TextField.tsx:82 -msgid "Accept suggested value" -msgstr "" - #: src/components/images/DetailsImage.tsx:252 #~ msgid "Select image" #~ msgstr "Select image" @@ -2225,8 +2232,8 @@ msgstr "" #: src/pages/part/PartDetail.tsx:994 #: src/pages/stock/StockDetail.tsx:265 #: src/pages/stock/StockDetail.tsx:942 -#: src/tables/build/BuildAllocatedStockTable.tsx:135 -#: src/tables/build/BuildLineTable.tsx:192 +#: src/tables/build/BuildAllocatedStockTable.tsx:132 +#: src/tables/build/BuildLineTable.tsx:193 #: src/tables/part/PartTable.tsx:137 #: src/tables/stock/StockItemTable.tsx:182 #: src/tables/stock/StockItemTable.tsx:343 @@ -2784,7 +2791,7 @@ msgstr "" #: src/pages/sales/SalesOrderDetail.tsx:119 #: src/pages/stock/LocationDetail.tsx:102 #: src/tables/ColumnRenderers.tsx:278 -#: src/tables/build/BuildAllocatedStockTable.tsx:91 +#: src/tables/build/BuildAllocatedStockTable.tsx:88 #: src/tables/machine/MachineTypeTable.tsx:161 #: src/tables/machine/MachineTypeTable.tsx:257 #: src/tables/plugin/PluginListTable.tsx:110 @@ -2966,7 +2973,7 @@ msgstr "" #: src/pages/company/SupplierPartDetail.tsx:394 #: src/pages/part/PartDetail.tsx:1015 #: src/tables/bom/BomTable.tsx:444 -#: src/tables/build/BuildLineTable.tsx:222 +#: src/tables/build/BuildLineTable.tsx:223 #: src/tables/part/PartTable.tsx:108 msgid "On Order" msgstr "" @@ -2976,7 +2983,7 @@ msgstr "" #: src/pages/part/PartDetail.tsx:587 #: src/pages/part/PartDetail.tsx:1021 #: src/pages/stock/StockDetail.tsx:925 -#: src/tables/part/PartTestResultTable.tsx:297 +#: src/tables/part/PartTestResultTable.tsx:305 #: src/tables/stock/StockItemTable.tsx:359 msgid "In Production" msgstr "" @@ -3000,7 +3007,7 @@ msgstr "" #: src/components/render/Stock.tsx:114 #: src/components/render/Stock.tsx:132 #: src/forms/BuildForms.tsx:795 -#: src/forms/PurchaseOrderForms.tsx:595 +#: src/forms/PurchaseOrderForms.tsx:647 #: src/forms/StockForms.tsx:792 #: src/forms/StockForms.tsx:839 #: src/forms/StockForms.tsx:885 @@ -3023,7 +3030,7 @@ msgstr "" #: src/components/render/Stock.tsx:99 #: src/pages/stock/StockDetail.tsx:198 #: src/pages/stock/StockDetail.tsx:930 -#: src/tables/build/BuildAllocatedStockTable.tsx:121 +#: src/tables/build/BuildAllocatedStockTable.tsx:118 #: src/tables/build/BuildOutputTable.tsx:107 #: src/tables/sales/SalesOrderAllocationTable.tsx:142 msgid "Serial Number" @@ -3034,9 +3041,9 @@ msgstr "" #: src/forms/BuildForms.tsx:240 #: src/forms/BuildForms.tsx:634 #: src/forms/BuildForms.tsx:797 -#: src/forms/PurchaseOrderForms.tsx:801 +#: src/forms/PurchaseOrderForms.tsx:853 #: src/forms/ReturnOrderForms.tsx:243 -#: src/forms/SalesOrderForms.tsx:308 +#: src/forms/SalesOrderForms.tsx:326 #: src/forms/StockForms.tsx:841 #: src/pages/part/PartStockHistoryDetail.tsx:56 #: src/pages/part/PartStockHistoryDetail.tsx:210 @@ -3046,9 +3053,9 @@ msgstr "" #: src/pages/part/pricing/PriceBreakPanel.tsx:172 #: src/pages/stock/StockDetail.tsx:258 #: src/pages/stock/StockDetail.tsx:936 -#: src/tables/build/BuildLineTable.tsx:86 +#: src/tables/build/BuildLineTable.tsx:83 #: src/tables/part/PartPurchaseOrdersTable.tsx:94 -#: src/tables/part/PartTestResultTable.tsx:269 +#: src/tables/part/PartTestResultTable.tsx:277 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:175 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:206 #: src/tables/purchasing/SupplierPriceBreakTable.tsx:69 @@ -3070,7 +3077,7 @@ msgstr "" #: src/forms/StockForms.tsx:1048 #: src/forms/StockForms.tsx:1096 #: src/forms/StockForms.tsx:1140 -#: src/tables/build/BuildLineTable.tsx:96 +#: src/tables/build/BuildLineTable.tsx:93 msgid "Batch" msgstr "" @@ -3755,7 +3762,7 @@ msgid "In Stock" msgstr "" #: src/components/wizards/OrderPartsWizard.tsx:146 -#: src/tables/build/BuildLineTable.tsx:404 +#: src/tables/build/BuildLineTable.tsx:405 msgid "Required Quantity" msgstr "" @@ -3847,7 +3854,7 @@ msgid "Please correct the errors in the selected parts" msgstr "" #: src/components/wizards/OrderPartsWizard.tsx:587 -#: src/tables/build/BuildLineTable.tsx:815 +#: src/tables/build/BuildLineTable.tsx:822 #: src/tables/part/PartTable.tsx:522 #: src/tables/sales/SalesOrderLineItemTable.tsx:370 msgid "Order Parts" @@ -4349,9 +4356,9 @@ msgstr "" #: src/forms/BuildForms.tsx:333 #: src/forms/BuildForms.tsx:408 #: src/forms/BuildForms.tsx:685 -#: src/tables/build/BuildAllocatedStockTable.tsx:150 +#: src/tables/build/BuildAllocatedStockTable.tsx:147 #: src/tables/build/BuildOutputTable.tsx:582 -#: src/tables/part/PartTestResultTable.tsx:272 +#: src/tables/part/PartTestResultTable.tsx:280 msgid "Build Output" msgstr "" @@ -4362,7 +4369,7 @@ msgstr "" #: src/forms/BuildForms.tsx:336 #: src/forms/BuildForms.tsx:411 #: src/forms/BuildForms.tsx:475 -#: src/forms/PurchaseOrderForms.tsx:717 +#: src/forms/PurchaseOrderForms.tsx:769 #: src/forms/ReturnOrderForms.tsx:197 #: src/forms/ReturnOrderForms.tsx:244 #: src/forms/StockForms.tsx:712 @@ -4377,7 +4384,7 @@ msgstr "" #: src/tables/build/BuildOutputTable.tsx:404 #: src/tables/machine/MachineListTable.tsx:387 #: src/tables/part/PartPurchaseOrdersTable.tsx:38 -#: src/tables/part/PartTestResultTable.tsx:309 +#: src/tables/part/PartTestResultTable.tsx:317 #: src/tables/sales/ReturnOrderLineItemTable.tsx:138 #: src/tables/sales/ReturnOrderLineItemTable.tsx:176 #: src/tables/settings/CustomStateTable.tsx:79 @@ -4450,8 +4457,8 @@ msgstr "" #: src/pages/stock/StockDetail.tsx:153 #: src/tables/bom/BomTable.tsx:134 #: src/tables/bom/UsedInTable.tsx:40 -#: src/tables/build/BuildAllocatedStockTable.tsx:108 -#: src/tables/build/BuildLineTable.tsx:336 +#: src/tables/build/BuildAllocatedStockTable.tsx:105 +#: src/tables/build/BuildLineTable.tsx:337 #: src/tables/build/BuildOrderTable.tsx:79 #: src/tables/part/PartSalesAllocationsTable.tsx:61 #: src/tables/part/RelatedPartTable.tsx:73 @@ -4466,47 +4473,47 @@ msgstr "" #: src/forms/BuildForms.tsx:632 #: src/forms/BuildForms.tsx:796 #: src/forms/BuildForms.tsx:897 -#: src/forms/SalesOrderForms.tsx:306 -#: src/tables/build/BuildAllocatedStockTable.tsx:139 -#: src/tables/build/BuildLineTable.tsx:182 +#: src/forms/SalesOrderForms.tsx:324 +#: src/tables/build/BuildAllocatedStockTable.tsx:136 +#: src/tables/build/BuildLineTable.tsx:183 #: src/tables/sales/SalesOrderLineItemTable.tsx:342 #: src/tables/stock/StockItemTable.tsx:338 msgid "Allocated" msgstr "" #: src/forms/BuildForms.tsx:667 -#: src/forms/SalesOrderForms.tsx:295 +#: src/forms/SalesOrderForms.tsx:313 #: src/pages/build/BuildDetail.tsx:108 #: src/pages/build/BuildDetail.tsx:326 msgid "Source Location" msgstr "" #: src/forms/BuildForms.tsx:668 -#: src/forms/SalesOrderForms.tsx:296 +#: src/forms/SalesOrderForms.tsx:314 msgid "Select the source location for the stock allocation" msgstr "" #: src/forms/BuildForms.tsx:700 -#: src/forms/SalesOrderForms.tsx:336 -#: src/tables/build/BuildLineTable.tsx:574 -#: src/tables/build/BuildLineTable.tsx:731 -#: src/tables/build/BuildLineTable.tsx:830 +#: src/forms/SalesOrderForms.tsx:354 +#: src/tables/build/BuildLineTable.tsx:575 +#: src/tables/build/BuildLineTable.tsx:738 +#: src/tables/build/BuildLineTable.tsx:837 #: src/tables/sales/SalesOrderLineItemTable.tsx:380 #: src/tables/sales/SalesOrderLineItemTable.tsx:406 msgid "Allocate Stock" msgstr "" #: src/forms/BuildForms.tsx:703 -#: src/forms/SalesOrderForms.tsx:341 +#: src/forms/SalesOrderForms.tsx:359 msgid "Stock items allocated" msgstr "" #: src/forms/BuildForms.tsx:816 #: src/forms/BuildForms.tsx:917 -#: src/tables/build/BuildAllocatedStockTable.tsx:240 -#: src/tables/build/BuildAllocatedStockTable.tsx:272 -#: src/tables/build/BuildLineTable.tsx:741 -#: src/tables/build/BuildLineTable.tsx:864 +#: src/tables/build/BuildAllocatedStockTable.tsx:243 +#: src/tables/build/BuildAllocatedStockTable.tsx:279 +#: src/tables/build/BuildLineTable.tsx:748 +#: src/tables/build/BuildLineTable.tsx:871 msgid "Consume Stock" msgstr "" @@ -4521,21 +4528,21 @@ msgstr "" #~ msgstr "Stock items consumed" #: src/forms/BuildForms.tsx:853 -#: src/tables/build/BuildLineTable.tsx:514 +#: src/tables/build/BuildLineTable.tsx:515 #: src/tables/part/PartBuildAllocationsTable.tsx:101 msgid "Fully consumed" msgstr "" #: src/forms/BuildForms.tsx:898 -#: src/tables/build/BuildLineTable.tsx:187 +#: src/tables/build/BuildLineTable.tsx:188 #: src/tables/stock/StockItemTable.tsx:367 msgid "Consumed" msgstr "" #: src/forms/CommonForms.tsx:88 -#: src/forms/PurchaseOrderForms.tsx:125 +#: src/forms/PurchaseOrderForms.tsx:176 #: src/forms/ReturnOrderForms.tsx:138 -#: src/forms/SalesOrderForms.tsx:164 +#: src/forms/SalesOrderForms.tsx:182 msgid "Select project code for this line item" msgstr "" @@ -4572,32 +4579,16 @@ msgstr "" msgid "Subscribe to notifications for this category" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:388 -msgid "Assign Batch Code and Serial Numbers" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:390 -msgid "Assign Batch Code" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:410 -msgid "Choose Location" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:418 -msgid "Item Destination selected" -msgstr "" - #: src/forms/PurchaseOrderForms.tsx:421 #~ msgid "Assign Batch Code{0}" #~ msgstr "Assign Batch Code{0}" -#: src/forms/PurchaseOrderForms.tsx:428 -msgid "Part category default location selected" +#: src/forms/PurchaseOrderForms.tsx:440 +msgid "Assign Batch Code and Serial Numbers" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:438 -msgid "Received stock location selected" +#: src/forms/PurchaseOrderForms.tsx:442 +msgid "Assign Batch Code" msgstr "" #: src/forms/PurchaseOrderForms.tsx:444 @@ -4605,94 +4596,110 @@ msgstr "" #~ msgid "Remove item from list" #~ msgstr "Remove item from list" -#: src/forms/PurchaseOrderForms.tsx:446 +#: src/forms/PurchaseOrderForms.tsx:462 +msgid "Choose Location" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:470 +msgid "Item Destination selected" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:480 +msgid "Part category default location selected" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:490 +msgid "Received stock location selected" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:498 msgid "Default location selected" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:507 +#: src/forms/PurchaseOrderForms.tsx:559 msgid "Set Location" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:524 -msgid "Set Expiry Date" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:532 -#: src/forms/StockForms.tsx:693 -msgid "Adjust Packaging" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:540 -#: src/forms/StockForms.tsx:684 -#: src/hooks/UseStockAdjustActions.tsx:148 -msgid "Change Status" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:546 -msgid "Add Note" -msgstr "" - #: src/forms/PurchaseOrderForms.tsx:566 #~ msgid "Serial numbers" #~ msgstr "Serial numbers" +#: src/forms/PurchaseOrderForms.tsx:576 +msgid "Set Expiry Date" +msgstr "" + #: src/forms/PurchaseOrderForms.tsx:582 #~ msgid "Store at line item destination" #~ msgstr "Store at line item destination" -#: src/forms/PurchaseOrderForms.tsx:610 -msgid "Store at default location" +#: src/forms/PurchaseOrderForms.tsx:584 +#: src/forms/StockForms.tsx:693 +msgid "Adjust Packaging" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:625 -msgid "Store at line item destination " +#: src/forms/PurchaseOrderForms.tsx:592 +#: src/forms/StockForms.tsx:684 +#: src/hooks/UseStockAdjustActions.tsx:148 +msgid "Change Status" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:637 -msgid "Store with already received stock" +#: src/forms/PurchaseOrderForms.tsx:598 +msgid "Add Note" msgstr "" #: src/forms/PurchaseOrderForms.tsx:658 #~ msgid "Receive line items" #~ msgstr "Receive line items" -#: src/forms/PurchaseOrderForms.tsx:661 +#: src/forms/PurchaseOrderForms.tsx:662 +msgid "Store at default location" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:677 +msgid "Store at line item destination " +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:689 +msgid "Store with already received stock" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:713 #: src/pages/build/BuildDetail.tsx:340 #: src/pages/stock/StockDetail.tsx:280 #: src/pages/stock/StockDetail.tsx:952 #: src/tables/Filter.tsx:83 -#: src/tables/build/BuildAllocatedStockTable.tsx:128 +#: src/tables/build/BuildAllocatedStockTable.tsx:125 #: src/tables/build/BuildOutputTable.tsx:112 -#: src/tables/part/PartTestResultTable.tsx:260 -#: src/tables/part/PartTestResultTable.tsx:281 +#: src/tables/part/PartTestResultTable.tsx:268 +#: src/tables/part/PartTestResultTable.tsx:289 #: src/tables/sales/SalesOrderAllocationTable.tsx:149 msgid "Batch Code" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:662 +#: src/forms/PurchaseOrderForms.tsx:714 msgid "Enter batch code for received items" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:675 +#: src/forms/PurchaseOrderForms.tsx:727 #: src/forms/StockForms.tsx:218 msgid "Serial Numbers" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:676 +#: src/forms/PurchaseOrderForms.tsx:728 msgid "Enter serial numbers for received items" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:690 +#: src/forms/PurchaseOrderForms.tsx:742 #: src/pages/stock/StockDetail.tsx:382 #: src/tables/stock/StockItemTable.tsx:294 msgid "Expiry Date" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:691 +#: src/forms/PurchaseOrderForms.tsx:743 msgid "Enter an expiry date for received items" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:703 +#: src/forms/PurchaseOrderForms.tsx:755 #: src/forms/StockForms.tsx:728 #: src/pages/company/SupplierPartDetail.tsx:172 #: src/pages/company/SupplierPartDetail.tsx:236 @@ -4701,19 +4708,19 @@ msgstr "" msgid "Packaging" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:727 +#: src/forms/PurchaseOrderForms.tsx:779 #: src/pages/company/SupplierPartDetail.tsx:120 #: src/tables/ColumnRenderers.tsx:332 msgid "Note" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:799 +#: src/forms/PurchaseOrderForms.tsx:851 #: src/pages/company/SupplierPartDetail.tsx:138 #: src/tables/purchasing/SupplierPriceBreakTable.tsx:49 msgid "SKU" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:800 +#: src/forms/PurchaseOrderForms.tsx:852 #: src/tables/part/PartPurchaseOrdersTable.tsx:127 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:213 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:283 @@ -4721,11 +4728,11 @@ msgstr "" msgid "Received" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:817 +#: src/forms/PurchaseOrderForms.tsx:869 msgid "Receive Line Items" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:823 +#: src/forms/PurchaseOrderForms.tsx:875 msgid "Items received" msgstr "" @@ -4737,7 +4744,7 @@ msgstr "" msgid "Item received into stock" msgstr "" -#: src/forms/SalesOrderForms.tsx:401 +#: src/forms/SalesOrderForms.tsx:419 msgid "Leave blank to use the order address" msgstr "" @@ -5932,6 +5939,9 @@ msgstr "" #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:310 #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:401 +#: src/tables/build/BuildAllocatedStockTable.tsx:181 +#: src/tables/build/BuildLineTable.tsx:668 +#: src/tables/sales/SalesOrderAllocationTable.tsx:220 msgid "Confirm Removal" msgstr "" @@ -6870,8 +6880,8 @@ msgstr "" #: src/pages/sales/ReturnOrderDetail.tsx:108 #: src/pages/sales/SalesOrderDetail.tsx:98 #: src/tables/ColumnRenderers.tsx:321 -#: src/tables/build/BuildAllocatedStockTable.tsx:115 -#: src/tables/build/BuildLineTable.tsx:352 +#: src/tables/build/BuildAllocatedStockTable.tsx:112 +#: src/tables/build/BuildLineTable.tsx:353 msgid "Reference" msgstr "" @@ -7132,7 +7142,7 @@ msgstr "" #: src/pages/build/BuildDetail.tsx:742 #: src/pages/stock/StockDetail.tsx:344 -#: src/tables/build/BuildAllocatedStockTable.tsx:85 +#: src/tables/build/BuildAllocatedStockTable.tsx:82 #: src/tables/part/PartBuildAllocationsTable.tsx:45 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:157 #: src/tables/stock/StockTrackingTable.tsx:109 @@ -7600,7 +7610,7 @@ msgstr "" #: src/pages/part/PartDetail.tsx:542 #: src/tables/bom/BomTable.tsx:439 -#: src/tables/build/BuildLineTable.tsx:305 +#: src/tables/build/BuildLineTable.tsx:306 #: src/tables/part/PartTable.tsx:319 #: src/tables/sales/SalesOrderLineItemTable.tsx:138 msgid "Available Stock" @@ -7608,7 +7618,7 @@ msgstr "" #: src/pages/part/PartDetail.tsx:548 #: src/tables/bom/BomTable.tsx:341 -#: src/tables/build/BuildLineTable.tsx:267 +#: src/tables/build/BuildLineTable.tsx:268 #: src/tables/sales/SalesOrderLineItemTable.tsx:180 msgid "On order" msgstr "" @@ -7782,7 +7792,7 @@ msgstr "" #: src/pages/part/PartDetail.tsx:1144 #: src/pages/stock/StockDetail.tsx:884 -#: src/tables/build/BuildLineTable.tsx:761 +#: src/tables/build/BuildLineTable.tsx:768 msgid "Order Stock" msgstr "" @@ -9219,13 +9229,13 @@ msgstr "" #~ msgstr "Show asssmbled items" #: src/tables/bom/BomTable.tsx:315 -#: src/tables/build/BuildLineTable.tsx:276 +#: src/tables/build/BuildLineTable.tsx:277 #: src/tables/part/PartTable.tsx:145 msgid "External stock" msgstr "" #: src/tables/bom/BomTable.tsx:323 -#: src/tables/build/BuildLineTable.tsx:239 +#: src/tables/build/BuildLineTable.tsx:240 msgid "Includes substitute stock" msgstr "" @@ -9234,7 +9244,7 @@ msgstr "" #~ msgstr "Edit Bom Item" #: src/tables/bom/BomTable.tsx:332 -#: src/tables/build/BuildLineTable.tsx:249 +#: src/tables/build/BuildLineTable.tsx:250 #: src/tables/sales/SalesOrderLineItemTable.tsx:166 msgid "Includes variant stock" msgstr "" @@ -9272,8 +9282,8 @@ msgid "Stock Information" msgstr "" #: src/tables/bom/BomTable.tsx:399 -#: src/tables/build/BuildLineTable.tsx:496 -#: src/tables/build/BuildLineTable.tsx:537 +#: src/tables/build/BuildLineTable.tsx:497 +#: src/tables/build/BuildLineTable.tsx:538 msgid "Consumable item" msgstr "" @@ -9282,7 +9292,7 @@ msgid "No available stock" msgstr "" #: src/tables/bom/BomTable.tsx:420 -#: src/tables/build/BuildLineTable.tsx:213 +#: src/tables/build/BuildLineTable.tsx:214 msgid "Show testable items" msgstr "" @@ -9291,7 +9301,7 @@ msgid "Show trackable items" msgstr "" #: src/tables/bom/BomTable.tsx:430 -#: src/tables/build/BuildLineTable.tsx:208 +#: src/tables/build/BuildLineTable.tsx:209 msgid "Show assembled items" msgstr "" @@ -9335,7 +9345,7 @@ msgstr "" #: src/tables/bom/BomTable.tsx:464 #: src/tables/bom/UsedInTable.tsx:85 -#: src/tables/build/BuildLineTable.tsx:202 +#: src/tables/build/BuildLineTable.tsx:203 msgid "Optional" msgstr "" @@ -9345,7 +9355,7 @@ msgid "Show optional items" msgstr "" #: src/tables/bom/BomTable.tsx:469 -#: src/tables/build/BuildLineTable.tsx:197 +#: src/tables/build/BuildLineTable.tsx:198 msgid "Consumable" msgstr "" @@ -9433,7 +9443,7 @@ msgid "Bill of materials cannot be edited, as the part is locked" msgstr "" #: src/tables/bom/UsedInTable.tsx:34 -#: src/tables/build/BuildLineTable.tsx:207 +#: src/tables/build/BuildLineTable.tsx:208 #: src/tables/part/ParametricPartTable.tsx:364 #: src/tables/part/PartBuildAllocationsTable.tsx:60 #: src/tables/part/PartTable.tsx:209 @@ -9455,11 +9465,11 @@ msgstr "" msgid "Show trackable assemblies" msgstr "" -#: src/tables/build/BuildAllocatedStockTable.tsx:67 +#: src/tables/build/BuildAllocatedStockTable.tsx:64 msgid "Allocated to Output" msgstr "" -#: src/tables/build/BuildAllocatedStockTable.tsx:68 +#: src/tables/build/BuildAllocatedStockTable.tsx:65 msgid "Show items allocated to a build output" msgstr "" @@ -9472,7 +9482,7 @@ msgstr "" #~ msgid "Include orders for part variants" #~ msgstr "Include orders for part variants" -#: src/tables/build/BuildAllocatedStockTable.tsx:97 +#: src/tables/build/BuildAllocatedStockTable.tsx:94 #: src/tables/part/PartBuildAllocationsTable.tsx:84 #: src/tables/part/PartPurchaseOrdersTable.tsx:132 #: src/tables/part/PartSalesAllocationsTable.tsx:69 @@ -9482,40 +9492,58 @@ msgid "Order Status" msgstr "" #: src/tables/build/BuildAllocatedStockTable.tsx:164 -#~ msgid "Edit Build Item" -#~ msgstr "Edit Build Item" - -#: src/tables/build/BuildAllocatedStockTable.tsx:167 -#: src/tables/build/BuildLineTable.tsx:650 +#: src/tables/build/BuildLineTable.tsx:651 msgid "Edit Stock Allocation" msgstr "" +#: src/tables/build/BuildAllocatedStockTable.tsx:164 +#~ msgid "Edit Build Item" +#~ msgstr "Edit Build Item" + #: src/tables/build/BuildAllocatedStockTable.tsx:174 #~ msgid "Delete Build Item" #~ msgstr "Delete Build Item" -#: src/tables/build/BuildAllocatedStockTable.tsx:180 -#: src/tables/build/BuildLineTable.tsx:663 -msgid "Delete Stock Allocation" +#: src/tables/build/BuildAllocatedStockTable.tsx:177 +#: src/tables/build/BuildLineTable.tsx:664 +#: src/tables/sales/SalesOrderAllocationTable.tsx:218 +msgid "Remove Allocated Stock" msgstr "" -#: src/tables/build/BuildAllocatedStockTable.tsx:239 +#: src/tables/build/BuildAllocatedStockTable.tsx:180 +#: src/tables/build/BuildLineTable.tsx:663 +#~ msgid "Delete Stock Allocation" +#~ msgstr "Delete Stock Allocation" + +#: src/tables/build/BuildAllocatedStockTable.tsx:182 +#: src/tables/build/BuildLineTable.tsx:669 +#: src/tables/sales/SalesOrderAllocationTable.tsx:221 +msgid "Are you sure you want to remove this allocated stock from the order?" +msgstr "" + +#: src/tables/build/BuildAllocatedStockTable.tsx:242 msgid "Consume" msgstr "" +#: src/tables/build/BuildAllocatedStockTable.tsx:259 +#: src/tables/build/BuildLineTable.tsx:112 +#: src/tables/sales/SalesOrderAllocationTable.tsx:248 +msgid "Remove allocated stock" +msgstr "" + #: src/tables/build/BuildLineTable.tsx:59 #~ msgid "Show lines with available stock" #~ msgstr "Show lines with available stock" -#: src/tables/build/BuildLineTable.tsx:120 +#: src/tables/build/BuildLineTable.tsx:121 msgid "View Stock Item" msgstr "" -#: src/tables/build/BuildLineTable.tsx:183 +#: src/tables/build/BuildLineTable.tsx:184 msgid "Show fully allocated lines" msgstr "" -#: src/tables/build/BuildLineTable.tsx:188 +#: src/tables/build/BuildLineTable.tsx:189 msgid "Show fully consumed lines" msgstr "" @@ -9523,124 +9551,124 @@ msgstr "" #~ msgid "Show allocated lines" #~ msgstr "Show allocated lines" -#: src/tables/build/BuildLineTable.tsx:193 +#: src/tables/build/BuildLineTable.tsx:194 msgid "Show items with sufficient available stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:198 +#: src/tables/build/BuildLineTable.tsx:199 msgid "Show consumable lines" msgstr "" -#: src/tables/build/BuildLineTable.tsx:203 +#: src/tables/build/BuildLineTable.tsx:204 msgid "Show optional lines" msgstr "" -#: src/tables/build/BuildLineTable.tsx:212 +#: src/tables/build/BuildLineTable.tsx:213 #: src/tables/part/PartTable.tsx:233 msgid "Testable" msgstr "" -#: src/tables/build/BuildLineTable.tsx:217 +#: src/tables/build/BuildLineTable.tsx:218 #: src/tables/stock/StockItemTable.tsx:388 msgid "Tracked" msgstr "" -#: src/tables/build/BuildLineTable.tsx:218 +#: src/tables/build/BuildLineTable.tsx:219 msgid "Show tracked lines" msgstr "" -#: src/tables/build/BuildLineTable.tsx:223 +#: src/tables/build/BuildLineTable.tsx:224 msgid "Show items with stock on order" msgstr "" -#: src/tables/build/BuildLineTable.tsx:258 +#: src/tables/build/BuildLineTable.tsx:259 #: src/tables/sales/SalesOrderLineItemTable.tsx:172 msgid "In production" msgstr "" -#: src/tables/build/BuildLineTable.tsx:286 +#: src/tables/build/BuildLineTable.tsx:287 msgid "Insufficient stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:302 +#: src/tables/build/BuildLineTable.tsx:303 #: src/tables/sales/SalesOrderLineItemTable.tsx:160 #: src/tables/stock/StockItemTable.tsx:191 msgid "No stock available" msgstr "" -#: src/tables/build/BuildLineTable.tsx:375 +#: src/tables/build/BuildLineTable.tsx:376 msgid "Gets Inherited" msgstr "" -#: src/tables/build/BuildLineTable.tsx:388 +#: src/tables/build/BuildLineTable.tsx:389 msgid "Unit Quantity" msgstr "" -#: src/tables/build/BuildLineTable.tsx:415 +#: src/tables/build/BuildLineTable.tsx:416 msgid "Setup Quantity" msgstr "" -#: src/tables/build/BuildLineTable.tsx:424 +#: src/tables/build/BuildLineTable.tsx:425 msgid "Attrition" msgstr "" -#: src/tables/build/BuildLineTable.tsx:432 +#: src/tables/build/BuildLineTable.tsx:433 msgid "Rounding Multiple" msgstr "" -#: src/tables/build/BuildLineTable.tsx:441 +#: src/tables/build/BuildLineTable.tsx:442 msgid "BOM Information" msgstr "" -#: src/tables/build/BuildLineTable.tsx:515 +#: src/tables/build/BuildLineTable.tsx:516 #: src/tables/part/PartBuildAllocationsTable.tsx:102 msgid "Fully allocated" msgstr "" -#: src/tables/build/BuildLineTable.tsx:563 +#: src/tables/build/BuildLineTable.tsx:564 #: src/tables/sales/SalesOrderLineItemTable.tsx:311 msgid "Create Build Order" msgstr "" -#: src/tables/build/BuildLineTable.tsx:592 +#: src/tables/build/BuildLineTable.tsx:593 msgid "Auto allocation in progress" msgstr "" -#: src/tables/build/BuildLineTable.tsx:595 -#: src/tables/build/BuildLineTable.tsx:802 +#: src/tables/build/BuildLineTable.tsx:596 +#: src/tables/build/BuildLineTable.tsx:809 msgid "Auto Allocate Stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:596 +#: src/tables/build/BuildLineTable.tsx:597 msgid "Automatically allocate stock to this build according to the selected options" msgstr "" -#: src/tables/build/BuildLineTable.tsx:616 -#: src/tables/build/BuildLineTable.tsx:630 -#: src/tables/build/BuildLineTable.tsx:751 -#: src/tables/build/BuildLineTable.tsx:852 +#: src/tables/build/BuildLineTable.tsx:617 +#: src/tables/build/BuildLineTable.tsx:631 +#: src/tables/build/BuildLineTable.tsx:758 +#: src/tables/build/BuildLineTable.tsx:859 #: src/tables/build/BuildOutputTable.tsx:355 #: src/tables/build/BuildOutputTable.tsx:360 msgid "Deallocate Stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:632 +#: src/tables/build/BuildLineTable.tsx:633 msgid "Deallocate all untracked stock for this build order" msgstr "" -#: src/tables/build/BuildLineTable.tsx:634 +#: src/tables/build/BuildLineTable.tsx:635 msgid "Deallocate stock from the selected line item" msgstr "" -#: src/tables/build/BuildLineTable.tsx:638 +#: src/tables/build/BuildLineTable.tsx:639 msgid "Stock has been deallocated" msgstr "" -#: src/tables/build/BuildLineTable.tsx:771 +#: src/tables/build/BuildLineTable.tsx:778 msgid "Build Stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:784 +#: src/tables/build/BuildLineTable.tsx:791 #: src/tables/sales/SalesOrderLineItemTable.tsx:487 msgid "View Part" msgstr "" @@ -9739,7 +9767,7 @@ msgid "Serialize Build Output" msgstr "" #: src/tables/build/BuildOutputTable.tsx:405 -#: src/tables/part/PartTestResultTable.tsx:310 +#: src/tables/part/PartTestResultTable.tsx:318 #: src/tables/stock/StockItemTable.tsx:328 msgid "Filter by stock status" msgstr "" @@ -9964,8 +9992,8 @@ msgid "View Item" msgstr "" #: src/tables/general/ExtraLineItemTable.tsx:95 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:299 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:403 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:300 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:405 #: src/tables/sales/ReturnOrderLineItemTable.tsx:83 #: src/tables/sales/ReturnOrderLineItemTable.tsx:187 #: src/tables/sales/SalesOrderLineItemTable.tsx:252 @@ -9974,14 +10002,14 @@ msgid "Add Line Item" msgstr "" #: src/tables/general/ExtraLineItemTable.tsx:108 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:320 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:322 #: src/tables/sales/ReturnOrderLineItemTable.tsx:96 #: src/tables/sales/SalesOrderLineItemTable.tsx:271 msgid "Edit Line Item" msgstr "" #: src/tables/general/ExtraLineItemTable.tsx:117 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:329 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:331 #: src/tables/sales/ReturnOrderLineItemTable.tsx:105 #: src/tables/sales/SalesOrderLineItemTable.tsx:280 msgid "Delete Line Item" @@ -10273,7 +10301,7 @@ msgid "Required Stock" msgstr "" #: src/tables/part/PartBuildAllocationsTable.tsx:124 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:381 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:383 msgid "View Build Order" msgstr "" @@ -10617,8 +10645,8 @@ msgstr "" #: src/tables/part/PartTestResultTable.tsx:103 #: src/tables/part/PartTestResultTable.tsx:181 -#: src/tables/part/PartTestResultTable.tsx:320 -#: src/tables/part/PartTestResultTable.tsx:334 +#: src/tables/part/PartTestResultTable.tsx:328 +#: src/tables/part/PartTestResultTable.tsx:342 #: src/tables/stock/StockItemTestResultTable.tsx:296 #: src/tables/stock/StockItemTestResultTable.tsx:368 #: src/tables/stock/StockItemTestResultTable.tsx:429 @@ -10643,7 +10671,7 @@ msgstr "" msgid "No Result" msgstr "" -#: src/tables/part/PartTestResultTable.tsx:298 +#: src/tables/part/PartTestResultTable.tsx:306 msgid "Show build outputs currently in production" msgstr "" @@ -11073,7 +11101,7 @@ msgid "Show manufacturer parts for active manufacturers." msgstr "" #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:115 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:397 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:399 msgid "Import Line Items" msgstr "" @@ -11099,11 +11127,11 @@ msgstr "" #~ msgid "Add line item" #~ msgstr "Add line item" -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:350 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:352 msgid "Receive line item" msgstr "" -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:414 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:416 msgid "Receive items" msgstr "" @@ -11201,25 +11229,25 @@ msgid "Not shipped" msgstr "" #: src/tables/sales/SalesOrderAllocationTable.tsx:211 -#: src/tables/sales/SalesOrderAllocationTable.tsx:229 +#: src/tables/sales/SalesOrderAllocationTable.tsx:235 msgid "Edit Allocation" msgstr "" #: src/tables/sales/SalesOrderAllocationTable.tsx:218 #: src/tables/sales/SalesOrderAllocationTable.tsx:241 -msgid "Delete Allocation" -msgstr "" +#~ msgid "Delete Allocation" +#~ msgstr "Delete Allocation" -#: src/tables/sales/SalesOrderAllocationTable.tsx:252 -#: src/tables/sales/SalesOrderAllocationTable.tsx:253 +#: src/tables/sales/SalesOrderAllocationTable.tsx:261 +#: src/tables/sales/SalesOrderAllocationTable.tsx:262 msgid "View Shipment" msgstr "" -#: src/tables/sales/SalesOrderAllocationTable.tsx:308 +#: src/tables/sales/SalesOrderAllocationTable.tsx:317 msgid "Assign to Shipment" msgstr "" -#: src/tables/sales/SalesOrderAllocationTable.tsx:324 +#: src/tables/sales/SalesOrderAllocationTable.tsx:333 msgid "Assign to shipment" msgstr "" diff --git a/src/frontend/src/locales/fr/messages.po b/src/frontend/src/locales/fr/messages.po index ab611b3998..9c99ab6fa3 100644 --- a/src/frontend/src/locales/fr/messages.po +++ b/src/frontend/src/locales/fr/messages.po @@ -8,7 +8,7 @@ msgstr "" "Language: fr\n" "Project-Id-Version: inventree\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2025-11-19 19:39\n" +"PO-Revision-Date: 2025-11-22 06:25\n" "Last-Translator: \n" "Language-Team: French\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" @@ -56,7 +56,7 @@ msgstr "Annuler" #: lib/components/RowActions.tsx:136 #: src/components/nav/NavigationDrawer.tsx:190 -#: src/forms/PurchaseOrderForms.tsx:802 +#: src/forms/PurchaseOrderForms.tsx:854 #: src/forms/StockForms.tsx:796 #: src/forms/StockForms.tsx:843 #: src/forms/StockForms.tsx:889 @@ -103,9 +103,9 @@ msgstr "Non" #: src/forms/BuildForms.tsx:630 #: src/forms/BuildForms.tsx:793 #: src/forms/BuildForms.tsx:896 -#: src/forms/PurchaseOrderForms.tsx:798 +#: src/forms/PurchaseOrderForms.tsx:850 #: src/forms/ReturnOrderForms.tsx:242 -#: src/forms/SalesOrderForms.tsx:305 +#: src/forms/SalesOrderForms.tsx:323 #: src/forms/StockForms.tsx:360 #: src/forms/StockForms.tsx:791 #: src/forms/StockForms.tsx:838 @@ -119,6 +119,7 @@ msgstr "Non" #: src/pages/build/BuildDetail.tsx:200 #: src/pages/part/PartDetail.tsx:1207 #: src/tables/ColumnRenderers.tsx:91 +#: src/tables/part/PartTestResultTable.tsx:247 #: src/tables/part/RelatedPartTable.tsx:53 #: src/tables/stock/StockTrackingTable.tsx:87 msgid "Part" @@ -158,7 +159,7 @@ msgstr "Modèles de test de pièces" #: src/components/wizards/OrderPartsWizard.tsx:290 #: src/pages/company/SupplierPartDetail.tsx:413 #: src/pages/stock/StockDetail.tsx:289 -#: src/tables/build/BuildAllocatedStockTable.tsx:155 +#: src/tables/build/BuildAllocatedStockTable.tsx:152 #: src/tables/part/PartPurchaseOrdersTable.tsx:50 #: src/tables/purchasing/SupplierPartTable.tsx:83 #: src/tables/stock/StockItemTable.tsx:247 @@ -201,9 +202,9 @@ msgstr "Catégories de composants" #: src/forms/BuildForms.tsx:473 #: src/forms/BuildForms.tsx:633 #: src/forms/BuildForms.tsx:794 -#: src/forms/SalesOrderForms.tsx:307 +#: src/forms/SalesOrderForms.tsx:325 #: src/pages/stock/StockDetail.tsx:1005 -#: src/tables/part/PartTestResultTable.tsx:248 +#: src/tables/part/PartTestResultTable.tsx:256 #: src/tables/stock/StockTrackingTable.tsx:48 #: src/tables/stock/StockTrackingTable.tsx:55 msgid "Stock Item" @@ -517,7 +518,7 @@ msgstr "Listes Sélectionnées" #: src/components/dashboard/DashboardLayout.tsx:281 #: src/components/editors/NotesEditor.tsx:74 #: src/components/editors/TemplateEditor/TemplateEditor.tsx:158 -#: src/components/forms/fields/ApiFormField.tsx:273 +#: src/components/forms/fields/ApiFormField.tsx:237 #: src/components/forms/fields/TableField.tsx:45 #: src/components/importer/ImportDataSelector.tsx:192 #: src/components/importer/ImporterColumnSelector.tsx:234 @@ -642,8 +643,8 @@ msgstr "Saisissez les données du code-barres" #: src/components/barcodes/BarcodeScanDialog.tsx:49 #: src/components/buttons/ScanButton.tsx:15 #: src/components/nav/NavigationDrawer.tsx:122 -#: src/forms/PurchaseOrderForms.tsx:457 -#: src/forms/PurchaseOrderForms.tsx:563 +#: src/forms/PurchaseOrderForms.tsx:509 +#: src/forms/PurchaseOrderForms.tsx:615 msgid "Scan Barcode" msgstr "Scanner le code-barres" @@ -728,7 +729,7 @@ msgstr "Ceci supprimera le lien vers le code-barres associé" #: src/components/barcodes/QRCode.tsx:205 #: src/components/items/ActionDropdown.tsx:192 -#: src/forms/PurchaseOrderForms.tsx:554 +#: src/forms/PurchaseOrderForms.tsx:606 msgid "Unlink Barcode" msgstr "Délier le code-barre" @@ -1216,6 +1217,12 @@ msgstr "Supprimer l'image associée de cet élément ?" #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:884 #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:903 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:254 +#: src/tables/build/BuildAllocatedStockTable.tsx:178 +#: src/tables/build/BuildAllocatedStockTable.tsx:258 +#: src/tables/build/BuildLineTable.tsx:111 +#: src/tables/build/BuildLineTable.tsx:665 +#: src/tables/sales/SalesOrderAllocationTable.tsx:224 +#: src/tables/sales/SalesOrderAllocationTable.tsx:247 msgid "Remove" msgstr "Supprimer" @@ -1241,7 +1248,7 @@ msgid "Upload Error" msgstr "Erreur de téléchargement" #: src/components/details/DetailsImage.tsx:250 -#: src/components/forms/fields/TextField.tsx:65 +#: src/components/forms/fields/AutoFillRightSection.tsx:34 msgid "Clear" msgstr "Effacer" @@ -1817,10 +1824,14 @@ msgstr "Arrêté" msgid "Running" msgstr "En cours d'exécution" -#: src/components/forms/fields/ApiFormField.tsx:233 +#: src/components/forms/fields/ApiFormField.tsx:197 msgid "Select file to upload" msgstr "" +#: src/components/forms/fields/AutoFillRightSection.tsx:47 +msgid "Accept suggested value" +msgstr "" + #: src/components/forms/fields/DateField.tsx:76 msgid "Select date" msgstr "" @@ -1875,10 +1886,6 @@ msgstr "Aucune entrée n'est disponible" msgid "Add new row" msgstr "Ajouter une nouvelle ligne" -#: src/components/forms/fields/TextField.tsx:82 -msgid "Accept suggested value" -msgstr "" - #: src/components/images/DetailsImage.tsx:252 #~ msgid "Select image" #~ msgstr "Select image" @@ -2225,8 +2232,8 @@ msgstr "Aucun élément" #: src/pages/part/PartDetail.tsx:994 #: src/pages/stock/StockDetail.tsx:265 #: src/pages/stock/StockDetail.tsx:942 -#: src/tables/build/BuildAllocatedStockTable.tsx:135 -#: src/tables/build/BuildLineTable.tsx:192 +#: src/tables/build/BuildAllocatedStockTable.tsx:132 +#: src/tables/build/BuildLineTable.tsx:193 #: src/tables/part/PartTable.tsx:137 #: src/tables/stock/StockItemTable.tsx:182 #: src/tables/stock/StockItemTable.tsx:343 @@ -2784,7 +2791,7 @@ msgstr "Informations sur le plugin" #: src/pages/sales/SalesOrderDetail.tsx:119 #: src/pages/stock/LocationDetail.tsx:102 #: src/tables/ColumnRenderers.tsx:278 -#: src/tables/build/BuildAllocatedStockTable.tsx:91 +#: src/tables/build/BuildAllocatedStockTable.tsx:88 #: src/tables/machine/MachineTypeTable.tsx:161 #: src/tables/machine/MachineTypeTable.tsx:257 #: src/tables/plugin/PluginListTable.tsx:110 @@ -2966,7 +2973,7 @@ msgstr "Aucun stock" #: src/pages/company/SupplierPartDetail.tsx:394 #: src/pages/part/PartDetail.tsx:1015 #: src/tables/bom/BomTable.tsx:444 -#: src/tables/build/BuildLineTable.tsx:222 +#: src/tables/build/BuildLineTable.tsx:223 #: src/tables/part/PartTable.tsx:108 msgid "On Order" msgstr "En Commande" @@ -2976,7 +2983,7 @@ msgstr "En Commande" #: src/pages/part/PartDetail.tsx:587 #: src/pages/part/PartDetail.tsx:1021 #: src/pages/stock/StockDetail.tsx:925 -#: src/tables/part/PartTestResultTable.tsx:297 +#: src/tables/part/PartTestResultTable.tsx:305 #: src/tables/stock/StockItemTable.tsx:359 msgid "In Production" msgstr "En Production" @@ -3000,7 +3007,7 @@ msgstr "Catégorie" #: src/components/render/Stock.tsx:114 #: src/components/render/Stock.tsx:132 #: src/forms/BuildForms.tsx:795 -#: src/forms/PurchaseOrderForms.tsx:595 +#: src/forms/PurchaseOrderForms.tsx:647 #: src/forms/StockForms.tsx:792 #: src/forms/StockForms.tsx:839 #: src/forms/StockForms.tsx:885 @@ -3023,7 +3030,7 @@ msgstr "Emplacement" #: src/components/render/Stock.tsx:99 #: src/pages/stock/StockDetail.tsx:198 #: src/pages/stock/StockDetail.tsx:930 -#: src/tables/build/BuildAllocatedStockTable.tsx:121 +#: src/tables/build/BuildAllocatedStockTable.tsx:118 #: src/tables/build/BuildOutputTable.tsx:107 #: src/tables/sales/SalesOrderAllocationTable.tsx:142 msgid "Serial Number" @@ -3034,9 +3041,9 @@ msgstr "Numéro de série" #: src/forms/BuildForms.tsx:240 #: src/forms/BuildForms.tsx:634 #: src/forms/BuildForms.tsx:797 -#: src/forms/PurchaseOrderForms.tsx:801 +#: src/forms/PurchaseOrderForms.tsx:853 #: src/forms/ReturnOrderForms.tsx:243 -#: src/forms/SalesOrderForms.tsx:308 +#: src/forms/SalesOrderForms.tsx:326 #: src/forms/StockForms.tsx:841 #: src/pages/part/PartStockHistoryDetail.tsx:56 #: src/pages/part/PartStockHistoryDetail.tsx:210 @@ -3046,9 +3053,9 @@ msgstr "Numéro de série" #: src/pages/part/pricing/PriceBreakPanel.tsx:172 #: src/pages/stock/StockDetail.tsx:258 #: src/pages/stock/StockDetail.tsx:936 -#: src/tables/build/BuildLineTable.tsx:86 +#: src/tables/build/BuildLineTable.tsx:83 #: src/tables/part/PartPurchaseOrdersTable.tsx:94 -#: src/tables/part/PartTestResultTable.tsx:269 +#: src/tables/part/PartTestResultTable.tsx:277 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:175 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:206 #: src/tables/purchasing/SupplierPriceBreakTable.tsx:69 @@ -3070,7 +3077,7 @@ msgstr "Quantité" #: src/forms/StockForms.tsx:1048 #: src/forms/StockForms.tsx:1096 #: src/forms/StockForms.tsx:1140 -#: src/tables/build/BuildLineTable.tsx:96 +#: src/tables/build/BuildLineTable.tsx:93 msgid "Batch" msgstr "Lot" @@ -3755,7 +3762,7 @@ msgid "In Stock" msgstr "En Stock" #: src/components/wizards/OrderPartsWizard.tsx:146 -#: src/tables/build/BuildLineTable.tsx:404 +#: src/tables/build/BuildLineTable.tsx:405 msgid "Required Quantity" msgstr "Quantité requise" @@ -3847,7 +3854,7 @@ msgid "Please correct the errors in the selected parts" msgstr "Veuillez corriger les erreurs dans la sélection des pièces" #: src/components/wizards/OrderPartsWizard.tsx:587 -#: src/tables/build/BuildLineTable.tsx:815 +#: src/tables/build/BuildLineTable.tsx:822 #: src/tables/part/PartTable.tsx:522 #: src/tables/sales/SalesOrderLineItemTable.tsx:370 msgid "Order Parts" @@ -4349,9 +4356,9 @@ msgstr "Alternative ajoutée" #: src/forms/BuildForms.tsx:333 #: src/forms/BuildForms.tsx:408 #: src/forms/BuildForms.tsx:685 -#: src/tables/build/BuildAllocatedStockTable.tsx:150 +#: src/tables/build/BuildAllocatedStockTable.tsx:147 #: src/tables/build/BuildOutputTable.tsx:582 -#: src/tables/part/PartTestResultTable.tsx:272 +#: src/tables/part/PartTestResultTable.tsx:280 msgid "Build Output" msgstr "Sortie de la construction" @@ -4362,7 +4369,7 @@ msgstr "" #: src/forms/BuildForms.tsx:336 #: src/forms/BuildForms.tsx:411 #: src/forms/BuildForms.tsx:475 -#: src/forms/PurchaseOrderForms.tsx:717 +#: src/forms/PurchaseOrderForms.tsx:769 #: src/forms/ReturnOrderForms.tsx:197 #: src/forms/ReturnOrderForms.tsx:244 #: src/forms/StockForms.tsx:712 @@ -4377,7 +4384,7 @@ msgstr "" #: src/tables/build/BuildOutputTable.tsx:404 #: src/tables/machine/MachineListTable.tsx:387 #: src/tables/part/PartPurchaseOrdersTable.tsx:38 -#: src/tables/part/PartTestResultTable.tsx:309 +#: src/tables/part/PartTestResultTable.tsx:317 #: src/tables/sales/ReturnOrderLineItemTable.tsx:138 #: src/tables/sales/ReturnOrderLineItemTable.tsx:176 #: src/tables/settings/CustomStateTable.tsx:79 @@ -4450,8 +4457,8 @@ msgstr "Les résultats de construction ont été annulés" #: src/pages/stock/StockDetail.tsx:153 #: src/tables/bom/BomTable.tsx:134 #: src/tables/bom/UsedInTable.tsx:40 -#: src/tables/build/BuildAllocatedStockTable.tsx:108 -#: src/tables/build/BuildLineTable.tsx:336 +#: src/tables/build/BuildAllocatedStockTable.tsx:105 +#: src/tables/build/BuildLineTable.tsx:337 #: src/tables/build/BuildOrderTable.tsx:79 #: src/tables/part/PartSalesAllocationsTable.tsx:61 #: src/tables/part/RelatedPartTable.tsx:73 @@ -4466,47 +4473,47 @@ msgstr "IPN" #: src/forms/BuildForms.tsx:632 #: src/forms/BuildForms.tsx:796 #: src/forms/BuildForms.tsx:897 -#: src/forms/SalesOrderForms.tsx:306 -#: src/tables/build/BuildAllocatedStockTable.tsx:139 -#: src/tables/build/BuildLineTable.tsx:182 +#: src/forms/SalesOrderForms.tsx:324 +#: src/tables/build/BuildAllocatedStockTable.tsx:136 +#: src/tables/build/BuildLineTable.tsx:183 #: src/tables/sales/SalesOrderLineItemTable.tsx:342 #: src/tables/stock/StockItemTable.tsx:338 msgid "Allocated" msgstr "Allouée" #: src/forms/BuildForms.tsx:667 -#: src/forms/SalesOrderForms.tsx:295 +#: src/forms/SalesOrderForms.tsx:313 #: src/pages/build/BuildDetail.tsx:108 #: src/pages/build/BuildDetail.tsx:326 msgid "Source Location" msgstr "Emplacement d'origine" #: src/forms/BuildForms.tsx:668 -#: src/forms/SalesOrderForms.tsx:296 +#: src/forms/SalesOrderForms.tsx:314 msgid "Select the source location for the stock allocation" msgstr "Sélectionnez l'emplacement de la source pour l'allocation du stock" #: src/forms/BuildForms.tsx:700 -#: src/forms/SalesOrderForms.tsx:336 -#: src/tables/build/BuildLineTable.tsx:574 -#: src/tables/build/BuildLineTable.tsx:731 -#: src/tables/build/BuildLineTable.tsx:830 +#: src/forms/SalesOrderForms.tsx:354 +#: src/tables/build/BuildLineTable.tsx:575 +#: src/tables/build/BuildLineTable.tsx:738 +#: src/tables/build/BuildLineTable.tsx:837 #: src/tables/sales/SalesOrderLineItemTable.tsx:380 #: src/tables/sales/SalesOrderLineItemTable.tsx:406 msgid "Allocate Stock" msgstr "Stock alloué" #: src/forms/BuildForms.tsx:703 -#: src/forms/SalesOrderForms.tsx:341 +#: src/forms/SalesOrderForms.tsx:359 msgid "Stock items allocated" msgstr "Éléments du stock alloués" #: src/forms/BuildForms.tsx:816 #: src/forms/BuildForms.tsx:917 -#: src/tables/build/BuildAllocatedStockTable.tsx:240 -#: src/tables/build/BuildAllocatedStockTable.tsx:272 -#: src/tables/build/BuildLineTable.tsx:741 -#: src/tables/build/BuildLineTable.tsx:864 +#: src/tables/build/BuildAllocatedStockTable.tsx:243 +#: src/tables/build/BuildAllocatedStockTable.tsx:279 +#: src/tables/build/BuildLineTable.tsx:748 +#: src/tables/build/BuildLineTable.tsx:871 msgid "Consume Stock" msgstr "Consommer le stock" @@ -4521,21 +4528,21 @@ msgstr "" #~ msgstr "Stock items consumed" #: src/forms/BuildForms.tsx:853 -#: src/tables/build/BuildLineTable.tsx:514 +#: src/tables/build/BuildLineTable.tsx:515 #: src/tables/part/PartBuildAllocationsTable.tsx:101 msgid "Fully consumed" msgstr "Complétement consommé" #: src/forms/BuildForms.tsx:898 -#: src/tables/build/BuildLineTable.tsx:187 +#: src/tables/build/BuildLineTable.tsx:188 #: src/tables/stock/StockItemTable.tsx:367 msgid "Consumed" msgstr "Consommé" #: src/forms/CommonForms.tsx:88 -#: src/forms/PurchaseOrderForms.tsx:125 +#: src/forms/PurchaseOrderForms.tsx:176 #: src/forms/ReturnOrderForms.tsx:138 -#: src/forms/SalesOrderForms.tsx:164 +#: src/forms/SalesOrderForms.tsx:182 msgid "Select project code for this line item" msgstr "" @@ -4572,127 +4579,127 @@ msgstr "Catégorie de pièce parente" msgid "Subscribe to notifications for this category" msgstr "S'abonner aux notifications pour cette catégorie" -#: src/forms/PurchaseOrderForms.tsx:388 -msgid "Assign Batch Code and Serial Numbers" -msgstr "Attribuer un code de lot et des numéros de série" - -#: src/forms/PurchaseOrderForms.tsx:390 -msgid "Assign Batch Code" -msgstr "Attribuer un code de lot" - -#: src/forms/PurchaseOrderForms.tsx:410 -msgid "Choose Location" -msgstr "Choisir l'emplacement" - -#: src/forms/PurchaseOrderForms.tsx:418 -msgid "Item Destination selected" -msgstr "Destination de l'élément sélectionné" - #: src/forms/PurchaseOrderForms.tsx:421 #~ msgid "Assign Batch Code{0}" #~ msgstr "Assign Batch Code{0}" -#: src/forms/PurchaseOrderForms.tsx:428 -msgid "Part category default location selected" -msgstr "Emplacement par défaut de la catégorie" +#: src/forms/PurchaseOrderForms.tsx:440 +msgid "Assign Batch Code and Serial Numbers" +msgstr "Attribuer un code de lot et des numéros de série" -#: src/forms/PurchaseOrderForms.tsx:438 -msgid "Received stock location selected" -msgstr "Emplacement de stock reçu" +#: src/forms/PurchaseOrderForms.tsx:442 +msgid "Assign Batch Code" +msgstr "Attribuer un code de lot" #: src/forms/PurchaseOrderForms.tsx:444 #: src/forms/StockForms.tsx:428 #~ msgid "Remove item from list" #~ msgstr "Remove item from list" -#: src/forms/PurchaseOrderForms.tsx:446 +#: src/forms/PurchaseOrderForms.tsx:462 +msgid "Choose Location" +msgstr "Choisir l'emplacement" + +#: src/forms/PurchaseOrderForms.tsx:470 +msgid "Item Destination selected" +msgstr "Destination de l'élément sélectionné" + +#: src/forms/PurchaseOrderForms.tsx:480 +msgid "Part category default location selected" +msgstr "Emplacement par défaut de la catégorie" + +#: src/forms/PurchaseOrderForms.tsx:490 +msgid "Received stock location selected" +msgstr "Emplacement de stock reçu" + +#: src/forms/PurchaseOrderForms.tsx:498 msgid "Default location selected" msgstr "Emplacement par défaut" -#: src/forms/PurchaseOrderForms.tsx:507 +#: src/forms/PurchaseOrderForms.tsx:559 msgid "Set Location" msgstr "Définir l'emplacement" -#: src/forms/PurchaseOrderForms.tsx:524 -msgid "Set Expiry Date" -msgstr "Indiquer une date d'expiration" - -#: src/forms/PurchaseOrderForms.tsx:532 -#: src/forms/StockForms.tsx:693 -msgid "Adjust Packaging" -msgstr "Ajuster le conditionnement" - -#: src/forms/PurchaseOrderForms.tsx:540 -#: src/forms/StockForms.tsx:684 -#: src/hooks/UseStockAdjustActions.tsx:148 -msgid "Change Status" -msgstr "Changer le statut" - -#: src/forms/PurchaseOrderForms.tsx:546 -msgid "Add Note" -msgstr "Ajouter une note" - #: src/forms/PurchaseOrderForms.tsx:566 #~ msgid "Serial numbers" #~ msgstr "Serial numbers" +#: src/forms/PurchaseOrderForms.tsx:576 +msgid "Set Expiry Date" +msgstr "Indiquer une date d'expiration" + #: src/forms/PurchaseOrderForms.tsx:582 #~ msgid "Store at line item destination" #~ msgstr "Store at line item destination" -#: src/forms/PurchaseOrderForms.tsx:610 -msgid "Store at default location" -msgstr "Stocker à l'emplacement par défaut" +#: src/forms/PurchaseOrderForms.tsx:584 +#: src/forms/StockForms.tsx:693 +msgid "Adjust Packaging" +msgstr "Ajuster le conditionnement" -#: src/forms/PurchaseOrderForms.tsx:625 -msgid "Store at line item destination " -msgstr "Stocker à la destination de l'article " +#: src/forms/PurchaseOrderForms.tsx:592 +#: src/forms/StockForms.tsx:684 +#: src/hooks/UseStockAdjustActions.tsx:148 +msgid "Change Status" +msgstr "Changer le statut" -#: src/forms/PurchaseOrderForms.tsx:637 -msgid "Store with already received stock" -msgstr "Stocker avec le stock déjà reçu" +#: src/forms/PurchaseOrderForms.tsx:598 +msgid "Add Note" +msgstr "Ajouter une note" #: src/forms/PurchaseOrderForms.tsx:658 #~ msgid "Receive line items" #~ msgstr "Receive line items" -#: src/forms/PurchaseOrderForms.tsx:661 +#: src/forms/PurchaseOrderForms.tsx:662 +msgid "Store at default location" +msgstr "Stocker à l'emplacement par défaut" + +#: src/forms/PurchaseOrderForms.tsx:677 +msgid "Store at line item destination " +msgstr "Stocker à la destination de l'article " + +#: src/forms/PurchaseOrderForms.tsx:689 +msgid "Store with already received stock" +msgstr "Stocker avec le stock déjà reçu" + +#: src/forms/PurchaseOrderForms.tsx:713 #: src/pages/build/BuildDetail.tsx:340 #: src/pages/stock/StockDetail.tsx:280 #: src/pages/stock/StockDetail.tsx:952 #: src/tables/Filter.tsx:83 -#: src/tables/build/BuildAllocatedStockTable.tsx:128 +#: src/tables/build/BuildAllocatedStockTable.tsx:125 #: src/tables/build/BuildOutputTable.tsx:112 -#: src/tables/part/PartTestResultTable.tsx:260 -#: src/tables/part/PartTestResultTable.tsx:281 +#: src/tables/part/PartTestResultTable.tsx:268 +#: src/tables/part/PartTestResultTable.tsx:289 #: src/tables/sales/SalesOrderAllocationTable.tsx:149 msgid "Batch Code" msgstr "Barre-code" -#: src/forms/PurchaseOrderForms.tsx:662 +#: src/forms/PurchaseOrderForms.tsx:714 msgid "Enter batch code for received items" msgstr "Saisir le code de lot pour les articles reçus" -#: src/forms/PurchaseOrderForms.tsx:675 +#: src/forms/PurchaseOrderForms.tsx:727 #: src/forms/StockForms.tsx:218 msgid "Serial Numbers" msgstr "Numéros de Série" -#: src/forms/PurchaseOrderForms.tsx:676 +#: src/forms/PurchaseOrderForms.tsx:728 msgid "Enter serial numbers for received items" msgstr "Saisir les numéros de série des articles reçus" -#: src/forms/PurchaseOrderForms.tsx:690 +#: src/forms/PurchaseOrderForms.tsx:742 #: src/pages/stock/StockDetail.tsx:382 #: src/tables/stock/StockItemTable.tsx:294 msgid "Expiry Date" msgstr "Date d'expiration" -#: src/forms/PurchaseOrderForms.tsx:691 +#: src/forms/PurchaseOrderForms.tsx:743 msgid "Enter an expiry date for received items" msgstr "Entrer une date d'expiration pour les articles reçus" -#: src/forms/PurchaseOrderForms.tsx:703 +#: src/forms/PurchaseOrderForms.tsx:755 #: src/forms/StockForms.tsx:728 #: src/pages/company/SupplierPartDetail.tsx:172 #: src/pages/company/SupplierPartDetail.tsx:236 @@ -4701,19 +4708,19 @@ msgstr "Entrer une date d'expiration pour les articles reçus" msgid "Packaging" msgstr "Conditionnement" -#: src/forms/PurchaseOrderForms.tsx:727 +#: src/forms/PurchaseOrderForms.tsx:779 #: src/pages/company/SupplierPartDetail.tsx:120 #: src/tables/ColumnRenderers.tsx:332 msgid "Note" msgstr "Note" -#: src/forms/PurchaseOrderForms.tsx:799 +#: src/forms/PurchaseOrderForms.tsx:851 #: src/pages/company/SupplierPartDetail.tsx:138 #: src/tables/purchasing/SupplierPriceBreakTable.tsx:49 msgid "SKU" msgstr "SKU" -#: src/forms/PurchaseOrderForms.tsx:800 +#: src/forms/PurchaseOrderForms.tsx:852 #: src/tables/part/PartPurchaseOrdersTable.tsx:127 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:213 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:283 @@ -4721,11 +4728,11 @@ msgstr "SKU" msgid "Received" msgstr "Réceptionnée" -#: src/forms/PurchaseOrderForms.tsx:817 +#: src/forms/PurchaseOrderForms.tsx:869 msgid "Receive Line Items" msgstr "Articles reçus" -#: src/forms/PurchaseOrderForms.tsx:823 +#: src/forms/PurchaseOrderForms.tsx:875 msgid "Items received" msgstr "Articles reçus" @@ -4737,7 +4744,7 @@ msgstr "Articles reçus" msgid "Item received into stock" msgstr "Article reçu en stock" -#: src/forms/SalesOrderForms.tsx:401 +#: src/forms/SalesOrderForms.tsx:419 msgid "Leave blank to use the order address" msgstr "" @@ -5932,6 +5939,9 @@ msgstr "" #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:310 #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:401 +#: src/tables/build/BuildAllocatedStockTable.tsx:181 +#: src/tables/build/BuildLineTable.tsx:668 +#: src/tables/sales/SalesOrderAllocationTable.tsx:220 msgid "Confirm Removal" msgstr "" @@ -6870,8 +6880,8 @@ msgstr "Externe" #: src/pages/sales/ReturnOrderDetail.tsx:108 #: src/pages/sales/SalesOrderDetail.tsx:98 #: src/tables/ColumnRenderers.tsx:321 -#: src/tables/build/BuildAllocatedStockTable.tsx:115 -#: src/tables/build/BuildLineTable.tsx:352 +#: src/tables/build/BuildAllocatedStockTable.tsx:112 +#: src/tables/build/BuildLineTable.tsx:353 msgid "Reference" msgstr "Référence" @@ -7132,7 +7142,7 @@ msgstr "Annuler la commande" #: src/pages/build/BuildDetail.tsx:742 #: src/pages/stock/StockDetail.tsx:344 -#: src/tables/build/BuildAllocatedStockTable.tsx:85 +#: src/tables/build/BuildAllocatedStockTable.tsx:82 #: src/tables/part/PartBuildAllocationsTable.tsx:45 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:157 #: src/tables/stock/StockTrackingTable.tsx:109 @@ -7600,7 +7610,7 @@ msgstr "Mots-clés" #: src/pages/part/PartDetail.tsx:542 #: src/tables/bom/BomTable.tsx:439 -#: src/tables/build/BuildLineTable.tsx:305 +#: src/tables/build/BuildLineTable.tsx:306 #: src/tables/part/PartTable.tsx:319 #: src/tables/sales/SalesOrderLineItemTable.tsx:138 msgid "Available Stock" @@ -7608,7 +7618,7 @@ msgstr "Stock disponible" #: src/pages/part/PartDetail.tsx:548 #: src/tables/bom/BomTable.tsx:341 -#: src/tables/build/BuildLineTable.tsx:267 +#: src/tables/build/BuildLineTable.tsx:268 #: src/tables/sales/SalesOrderLineItemTable.tsx:180 msgid "On order" msgstr "Sur commande" @@ -7782,7 +7792,7 @@ msgstr "Commande" #: src/pages/part/PartDetail.tsx:1144 #: src/pages/stock/StockDetail.tsx:884 -#: src/tables/build/BuildLineTable.tsx:761 +#: src/tables/build/BuildLineTable.tsx:768 msgid "Order Stock" msgstr "Stock de commandes" @@ -9219,13 +9229,13 @@ msgstr "Pièce virtuelle" #~ msgstr "Show asssmbled items" #: src/tables/bom/BomTable.tsx:315 -#: src/tables/build/BuildLineTable.tsx:276 +#: src/tables/build/BuildLineTable.tsx:277 #: src/tables/part/PartTable.tsx:145 msgid "External stock" msgstr "Stockage externe" #: src/tables/bom/BomTable.tsx:323 -#: src/tables/build/BuildLineTable.tsx:239 +#: src/tables/build/BuildLineTable.tsx:240 msgid "Includes substitute stock" msgstr "Comprend un stock de remplacement" @@ -9234,7 +9244,7 @@ msgstr "Comprend un stock de remplacement" #~ msgstr "Edit Bom Item" #: src/tables/bom/BomTable.tsx:332 -#: src/tables/build/BuildLineTable.tsx:249 +#: src/tables/build/BuildLineTable.tsx:250 #: src/tables/sales/SalesOrderLineItemTable.tsx:166 msgid "Includes variant stock" msgstr "Inclut le stock de variantes" @@ -9272,8 +9282,8 @@ msgid "Stock Information" msgstr "Information de stock" #: src/tables/bom/BomTable.tsx:399 -#: src/tables/build/BuildLineTable.tsx:496 -#: src/tables/build/BuildLineTable.tsx:537 +#: src/tables/build/BuildLineTable.tsx:497 +#: src/tables/build/BuildLineTable.tsx:538 msgid "Consumable item" msgstr "Article consommable" @@ -9282,7 +9292,7 @@ msgid "No available stock" msgstr "Pas de stock disponible" #: src/tables/bom/BomTable.tsx:420 -#: src/tables/build/BuildLineTable.tsx:213 +#: src/tables/build/BuildLineTable.tsx:214 msgid "Show testable items" msgstr "Afficher les articles testables" @@ -9291,7 +9301,7 @@ msgid "Show trackable items" msgstr "Afficher les articles suivables" #: src/tables/bom/BomTable.tsx:430 -#: src/tables/build/BuildLineTable.tsx:208 +#: src/tables/build/BuildLineTable.tsx:209 msgid "Show assembled items" msgstr "Afficher les articles assemblés" @@ -9335,7 +9345,7 @@ msgstr "Afficher les éléments qui permettent la substitution de variantes" #: src/tables/bom/BomTable.tsx:464 #: src/tables/bom/UsedInTable.tsx:85 -#: src/tables/build/BuildLineTable.tsx:202 +#: src/tables/build/BuildLineTable.tsx:203 msgid "Optional" msgstr "Optionnel" @@ -9345,7 +9355,7 @@ msgid "Show optional items" msgstr "Afficher les articles optionnels" #: src/tables/bom/BomTable.tsx:469 -#: src/tables/build/BuildLineTable.tsx:197 +#: src/tables/build/BuildLineTable.tsx:198 msgid "Consumable" msgstr "Consommable" @@ -9433,7 +9443,7 @@ msgid "Bill of materials cannot be edited, as the part is locked" msgstr "La liste des matériaux ne peut être modifiée, car la pièce est bloquée" #: src/tables/bom/UsedInTable.tsx:34 -#: src/tables/build/BuildLineTable.tsx:207 +#: src/tables/build/BuildLineTable.tsx:208 #: src/tables/part/ParametricPartTable.tsx:364 #: src/tables/part/PartBuildAllocationsTable.tsx:60 #: src/tables/part/PartTable.tsx:209 @@ -9455,11 +9465,11 @@ msgstr "Suivi de l'évolution" msgid "Show trackable assemblies" msgstr "Afficher les suivi de l'évolution des assemblages" -#: src/tables/build/BuildAllocatedStockTable.tsx:67 +#: src/tables/build/BuildAllocatedStockTable.tsx:64 msgid "Allocated to Output" msgstr "Affecté à la production" -#: src/tables/build/BuildAllocatedStockTable.tsx:68 +#: src/tables/build/BuildAllocatedStockTable.tsx:65 msgid "Show items allocated to a build output" msgstr "Afficher les éléments alloués à une sortie de construction" @@ -9472,7 +9482,7 @@ msgstr "Afficher les éléments alloués à une sortie de construction" #~ msgid "Include orders for part variants" #~ msgstr "Include orders for part variants" -#: src/tables/build/BuildAllocatedStockTable.tsx:97 +#: src/tables/build/BuildAllocatedStockTable.tsx:94 #: src/tables/part/PartBuildAllocationsTable.tsx:84 #: src/tables/part/PartPurchaseOrdersTable.tsx:132 #: src/tables/part/PartSalesAllocationsTable.tsx:69 @@ -9482,40 +9492,58 @@ msgid "Order Status" msgstr "Statut de la commande" #: src/tables/build/BuildAllocatedStockTable.tsx:164 -#~ msgid "Edit Build Item" -#~ msgstr "Edit Build Item" - -#: src/tables/build/BuildAllocatedStockTable.tsx:167 -#: src/tables/build/BuildLineTable.tsx:650 +#: src/tables/build/BuildLineTable.tsx:651 msgid "Edit Stock Allocation" msgstr "Modifier la répartition des stocks" +#: src/tables/build/BuildAllocatedStockTable.tsx:164 +#~ msgid "Edit Build Item" +#~ msgstr "Edit Build Item" + #: src/tables/build/BuildAllocatedStockTable.tsx:174 #~ msgid "Delete Build Item" #~ msgstr "Delete Build Item" +#: src/tables/build/BuildAllocatedStockTable.tsx:177 +#: src/tables/build/BuildLineTable.tsx:664 +#: src/tables/sales/SalesOrderAllocationTable.tsx:218 +msgid "Remove Allocated Stock" +msgstr "" + #: src/tables/build/BuildAllocatedStockTable.tsx:180 #: src/tables/build/BuildLineTable.tsx:663 -msgid "Delete Stock Allocation" -msgstr "Supprimer la répartition du stock" +#~ msgid "Delete Stock Allocation" +#~ msgstr "Delete Stock Allocation" -#: src/tables/build/BuildAllocatedStockTable.tsx:239 +#: src/tables/build/BuildAllocatedStockTable.tsx:182 +#: src/tables/build/BuildLineTable.tsx:669 +#: src/tables/sales/SalesOrderAllocationTable.tsx:221 +msgid "Are you sure you want to remove this allocated stock from the order?" +msgstr "" + +#: src/tables/build/BuildAllocatedStockTable.tsx:242 msgid "Consume" msgstr "Consommer" +#: src/tables/build/BuildAllocatedStockTable.tsx:259 +#: src/tables/build/BuildLineTable.tsx:112 +#: src/tables/sales/SalesOrderAllocationTable.tsx:248 +msgid "Remove allocated stock" +msgstr "" + #: src/tables/build/BuildLineTable.tsx:59 #~ msgid "Show lines with available stock" #~ msgstr "Show lines with available stock" -#: src/tables/build/BuildLineTable.tsx:120 +#: src/tables/build/BuildLineTable.tsx:121 msgid "View Stock Item" msgstr "Voir l'article du stock" -#: src/tables/build/BuildLineTable.tsx:183 +#: src/tables/build/BuildLineTable.tsx:184 msgid "Show fully allocated lines" msgstr "Voir les lignes totalement allouées" -#: src/tables/build/BuildLineTable.tsx:188 +#: src/tables/build/BuildLineTable.tsx:189 msgid "Show fully consumed lines" msgstr "Voir les lignes totalement consommées" @@ -9523,124 +9551,124 @@ msgstr "Voir les lignes totalement consommées" #~ msgid "Show allocated lines" #~ msgstr "Show allocated lines" -#: src/tables/build/BuildLineTable.tsx:193 +#: src/tables/build/BuildLineTable.tsx:194 msgid "Show items with sufficient available stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:198 +#: src/tables/build/BuildLineTable.tsx:199 msgid "Show consumable lines" msgstr "Afficher les lignes consommables" -#: src/tables/build/BuildLineTable.tsx:203 +#: src/tables/build/BuildLineTable.tsx:204 msgid "Show optional lines" msgstr "Afficher les lignes optionnelles" -#: src/tables/build/BuildLineTable.tsx:212 +#: src/tables/build/BuildLineTable.tsx:213 #: src/tables/part/PartTable.tsx:233 msgid "Testable" msgstr "Testable" -#: src/tables/build/BuildLineTable.tsx:217 +#: src/tables/build/BuildLineTable.tsx:218 #: src/tables/stock/StockItemTable.tsx:388 msgid "Tracked" msgstr "Suivi" -#: src/tables/build/BuildLineTable.tsx:218 +#: src/tables/build/BuildLineTable.tsx:219 msgid "Show tracked lines" msgstr "Afficher les lignes suivies" -#: src/tables/build/BuildLineTable.tsx:223 +#: src/tables/build/BuildLineTable.tsx:224 msgid "Show items with stock on order" msgstr "" -#: src/tables/build/BuildLineTable.tsx:258 +#: src/tables/build/BuildLineTable.tsx:259 #: src/tables/sales/SalesOrderLineItemTable.tsx:172 msgid "In production" msgstr "En production" -#: src/tables/build/BuildLineTable.tsx:286 +#: src/tables/build/BuildLineTable.tsx:287 msgid "Insufficient stock" msgstr "Rupture de stock" -#: src/tables/build/BuildLineTable.tsx:302 +#: src/tables/build/BuildLineTable.tsx:303 #: src/tables/sales/SalesOrderLineItemTable.tsx:160 #: src/tables/stock/StockItemTable.tsx:191 msgid "No stock available" msgstr "Aucun stocke disponible" -#: src/tables/build/BuildLineTable.tsx:375 +#: src/tables/build/BuildLineTable.tsx:376 msgid "Gets Inherited" msgstr "Obtenir les hérités" -#: src/tables/build/BuildLineTable.tsx:388 +#: src/tables/build/BuildLineTable.tsx:389 msgid "Unit Quantity" msgstr "Quantité unitaire" -#: src/tables/build/BuildLineTable.tsx:415 +#: src/tables/build/BuildLineTable.tsx:416 msgid "Setup Quantity" msgstr "Spécifier la quantité" -#: src/tables/build/BuildLineTable.tsx:424 +#: src/tables/build/BuildLineTable.tsx:425 msgid "Attrition" msgstr "Attrition" -#: src/tables/build/BuildLineTable.tsx:432 +#: src/tables/build/BuildLineTable.tsx:433 msgid "Rounding Multiple" msgstr "Arrondi au multiple" -#: src/tables/build/BuildLineTable.tsx:441 +#: src/tables/build/BuildLineTable.tsx:442 msgid "BOM Information" msgstr "Informations de nomenclature" -#: src/tables/build/BuildLineTable.tsx:515 +#: src/tables/build/BuildLineTable.tsx:516 #: src/tables/part/PartBuildAllocationsTable.tsx:102 msgid "Fully allocated" msgstr "Complètement alloué" -#: src/tables/build/BuildLineTable.tsx:563 +#: src/tables/build/BuildLineTable.tsx:564 #: src/tables/sales/SalesOrderLineItemTable.tsx:311 msgid "Create Build Order" msgstr "Créer un ordre de fabrication" -#: src/tables/build/BuildLineTable.tsx:592 +#: src/tables/build/BuildLineTable.tsx:593 msgid "Auto allocation in progress" msgstr "Attribution automatique en cours" -#: src/tables/build/BuildLineTable.tsx:595 -#: src/tables/build/BuildLineTable.tsx:802 +#: src/tables/build/BuildLineTable.tsx:596 +#: src/tables/build/BuildLineTable.tsx:809 msgid "Auto Allocate Stock" msgstr "Allocation automatique du stock" -#: src/tables/build/BuildLineTable.tsx:596 +#: src/tables/build/BuildLineTable.tsx:597 msgid "Automatically allocate stock to this build according to the selected options" msgstr "Attribuer automatiquement du stock à ce bâtiment en fonction des options sélectionnées" -#: src/tables/build/BuildLineTable.tsx:616 -#: src/tables/build/BuildLineTable.tsx:630 -#: src/tables/build/BuildLineTable.tsx:751 -#: src/tables/build/BuildLineTable.tsx:852 +#: src/tables/build/BuildLineTable.tsx:617 +#: src/tables/build/BuildLineTable.tsx:631 +#: src/tables/build/BuildLineTable.tsx:758 +#: src/tables/build/BuildLineTable.tsx:859 #: src/tables/build/BuildOutputTable.tsx:355 #: src/tables/build/BuildOutputTable.tsx:360 msgid "Deallocate Stock" msgstr "Désallouer le stock" -#: src/tables/build/BuildLineTable.tsx:632 +#: src/tables/build/BuildLineTable.tsx:633 msgid "Deallocate all untracked stock for this build order" msgstr "Désallouer tout le stock non suivi pour cet ordre de fabrication" -#: src/tables/build/BuildLineTable.tsx:634 +#: src/tables/build/BuildLineTable.tsx:635 msgid "Deallocate stock from the selected line item" msgstr "Désallouer le stock de la ligne sélectionné" -#: src/tables/build/BuildLineTable.tsx:638 +#: src/tables/build/BuildLineTable.tsx:639 msgid "Stock has been deallocated" msgstr "Le stock à état désallouer" -#: src/tables/build/BuildLineTable.tsx:771 +#: src/tables/build/BuildLineTable.tsx:778 msgid "Build Stock" msgstr "Stock de fabrication" -#: src/tables/build/BuildLineTable.tsx:784 +#: src/tables/build/BuildLineTable.tsx:791 #: src/tables/sales/SalesOrderLineItemTable.tsx:487 msgid "View Part" msgstr "Voir la pièce" @@ -9739,7 +9767,7 @@ msgid "Serialize Build Output" msgstr "Sérialiser la sortie de fabrication" #: src/tables/build/BuildOutputTable.tsx:405 -#: src/tables/part/PartTestResultTable.tsx:310 +#: src/tables/part/PartTestResultTable.tsx:318 #: src/tables/stock/StockItemTable.tsx:328 msgid "Filter by stock status" msgstr "Filtrer par état du stock" @@ -9964,8 +9992,8 @@ msgid "View Item" msgstr "Voir l'article" #: src/tables/general/ExtraLineItemTable.tsx:95 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:299 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:403 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:300 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:405 #: src/tables/sales/ReturnOrderLineItemTable.tsx:83 #: src/tables/sales/ReturnOrderLineItemTable.tsx:187 #: src/tables/sales/SalesOrderLineItemTable.tsx:252 @@ -9974,14 +10002,14 @@ msgid "Add Line Item" msgstr "Ajouter la ligne de l'article" #: src/tables/general/ExtraLineItemTable.tsx:108 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:320 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:322 #: src/tables/sales/ReturnOrderLineItemTable.tsx:96 #: src/tables/sales/SalesOrderLineItemTable.tsx:271 msgid "Edit Line Item" msgstr "Modifier la ligne de l'article" #: src/tables/general/ExtraLineItemTable.tsx:117 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:329 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:331 #: src/tables/sales/ReturnOrderLineItemTable.tsx:105 #: src/tables/sales/SalesOrderLineItemTable.tsx:280 msgid "Delete Line Item" @@ -10273,7 +10301,7 @@ msgid "Required Stock" msgstr "Stock requis" #: src/tables/part/PartBuildAllocationsTable.tsx:124 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:381 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:383 msgid "View Build Order" msgstr "Voir l'ordre de construction" @@ -10617,8 +10645,8 @@ msgstr "" #: src/tables/part/PartTestResultTable.tsx:103 #: src/tables/part/PartTestResultTable.tsx:181 -#: src/tables/part/PartTestResultTable.tsx:320 -#: src/tables/part/PartTestResultTable.tsx:334 +#: src/tables/part/PartTestResultTable.tsx:328 +#: src/tables/part/PartTestResultTable.tsx:342 #: src/tables/stock/StockItemTestResultTable.tsx:296 #: src/tables/stock/StockItemTestResultTable.tsx:368 #: src/tables/stock/StockItemTestResultTable.tsx:429 @@ -10643,7 +10671,7 @@ msgstr "Résultats de test ajoutés" msgid "No Result" msgstr "Aucun résultat" -#: src/tables/part/PartTestResultTable.tsx:298 +#: src/tables/part/PartTestResultTable.tsx:306 msgid "Show build outputs currently in production" msgstr "Afficher les sorties" @@ -11073,7 +11101,7 @@ msgid "Show manufacturer parts for active manufacturers." msgstr "" #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:115 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:397 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:399 msgid "Import Line Items" msgstr "Importer des articles" @@ -11099,11 +11127,11 @@ msgstr "Afficher les articles qui ont été reçus" #~ msgid "Add line item" #~ msgstr "Add line item" -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:350 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:352 msgid "Receive line item" msgstr "Recevoir l'article" -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:414 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:416 msgid "Receive items" msgstr "Recevoir les articles" @@ -11201,25 +11229,25 @@ msgid "Not shipped" msgstr "Non expédié" #: src/tables/sales/SalesOrderAllocationTable.tsx:211 -#: src/tables/sales/SalesOrderAllocationTable.tsx:229 +#: src/tables/sales/SalesOrderAllocationTable.tsx:235 msgid "Edit Allocation" msgstr "Modifier l'allocation" #: src/tables/sales/SalesOrderAllocationTable.tsx:218 #: src/tables/sales/SalesOrderAllocationTable.tsx:241 -msgid "Delete Allocation" -msgstr "Supprimer l'allocation" +#~ msgid "Delete Allocation" +#~ msgstr "Delete Allocation" -#: src/tables/sales/SalesOrderAllocationTable.tsx:252 -#: src/tables/sales/SalesOrderAllocationTable.tsx:253 +#: src/tables/sales/SalesOrderAllocationTable.tsx:261 +#: src/tables/sales/SalesOrderAllocationTable.tsx:262 msgid "View Shipment" msgstr "Voir l'expédition" -#: src/tables/sales/SalesOrderAllocationTable.tsx:308 +#: src/tables/sales/SalesOrderAllocationTable.tsx:317 msgid "Assign to Shipment" msgstr "Assigner à l'expédition" -#: src/tables/sales/SalesOrderAllocationTable.tsx:324 +#: src/tables/sales/SalesOrderAllocationTable.tsx:333 msgid "Assign to shipment" msgstr "Assigner à l'expédition" diff --git a/src/frontend/src/locales/he/messages.po b/src/frontend/src/locales/he/messages.po index 1655fa4bd3..36955b4e12 100644 --- a/src/frontend/src/locales/he/messages.po +++ b/src/frontend/src/locales/he/messages.po @@ -8,7 +8,7 @@ msgstr "" "Language: he\n" "Project-Id-Version: inventree\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2025-11-19 19:39\n" +"PO-Revision-Date: 2025-11-22 06:25\n" "Last-Translator: \n" "Language-Team: Hebrew\n" "Plural-Forms: nplurals=4; plural=n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3;\n" @@ -56,7 +56,7 @@ msgstr "בטל" #: lib/components/RowActions.tsx:136 #: src/components/nav/NavigationDrawer.tsx:190 -#: src/forms/PurchaseOrderForms.tsx:802 +#: src/forms/PurchaseOrderForms.tsx:854 #: src/forms/StockForms.tsx:796 #: src/forms/StockForms.tsx:843 #: src/forms/StockForms.tsx:889 @@ -103,9 +103,9 @@ msgstr "לא" #: src/forms/BuildForms.tsx:630 #: src/forms/BuildForms.tsx:793 #: src/forms/BuildForms.tsx:896 -#: src/forms/PurchaseOrderForms.tsx:798 +#: src/forms/PurchaseOrderForms.tsx:850 #: src/forms/ReturnOrderForms.tsx:242 -#: src/forms/SalesOrderForms.tsx:305 +#: src/forms/SalesOrderForms.tsx:323 #: src/forms/StockForms.tsx:360 #: src/forms/StockForms.tsx:791 #: src/forms/StockForms.tsx:838 @@ -119,6 +119,7 @@ msgstr "לא" #: src/pages/build/BuildDetail.tsx:200 #: src/pages/part/PartDetail.tsx:1207 #: src/tables/ColumnRenderers.tsx:91 +#: src/tables/part/PartTestResultTable.tsx:247 #: src/tables/part/RelatedPartTable.tsx:53 #: src/tables/stock/StockTrackingTable.tsx:87 msgid "Part" @@ -158,7 +159,7 @@ msgstr "" #: src/components/wizards/OrderPartsWizard.tsx:290 #: src/pages/company/SupplierPartDetail.tsx:413 #: src/pages/stock/StockDetail.tsx:289 -#: src/tables/build/BuildAllocatedStockTable.tsx:155 +#: src/tables/build/BuildAllocatedStockTable.tsx:152 #: src/tables/part/PartPurchaseOrdersTable.tsx:50 #: src/tables/purchasing/SupplierPartTable.tsx:83 #: src/tables/stock/StockItemTable.tsx:247 @@ -201,9 +202,9 @@ msgstr "קטגוריית פריטים" #: src/forms/BuildForms.tsx:473 #: src/forms/BuildForms.tsx:633 #: src/forms/BuildForms.tsx:794 -#: src/forms/SalesOrderForms.tsx:307 +#: src/forms/SalesOrderForms.tsx:325 #: src/pages/stock/StockDetail.tsx:1005 -#: src/tables/part/PartTestResultTable.tsx:248 +#: src/tables/part/PartTestResultTable.tsx:256 #: src/tables/stock/StockTrackingTable.tsx:48 #: src/tables/stock/StockTrackingTable.tsx:55 msgid "Stock Item" @@ -517,7 +518,7 @@ msgstr "" #: src/components/dashboard/DashboardLayout.tsx:281 #: src/components/editors/NotesEditor.tsx:74 #: src/components/editors/TemplateEditor/TemplateEditor.tsx:158 -#: src/components/forms/fields/ApiFormField.tsx:273 +#: src/components/forms/fields/ApiFormField.tsx:237 #: src/components/forms/fields/TableField.tsx:45 #: src/components/importer/ImportDataSelector.tsx:192 #: src/components/importer/ImporterColumnSelector.tsx:234 @@ -642,8 +643,8 @@ msgstr "" #: src/components/barcodes/BarcodeScanDialog.tsx:49 #: src/components/buttons/ScanButton.tsx:15 #: src/components/nav/NavigationDrawer.tsx:122 -#: src/forms/PurchaseOrderForms.tsx:457 -#: src/forms/PurchaseOrderForms.tsx:563 +#: src/forms/PurchaseOrderForms.tsx:509 +#: src/forms/PurchaseOrderForms.tsx:615 msgid "Scan Barcode" msgstr "" @@ -728,7 +729,7 @@ msgstr "פעולה זו תסיר את הקישור לברקוד המשויך" #: src/components/barcodes/QRCode.tsx:205 #: src/components/items/ActionDropdown.tsx:192 -#: src/forms/PurchaseOrderForms.tsx:554 +#: src/forms/PurchaseOrderForms.tsx:606 msgid "Unlink Barcode" msgstr "בטל קישור של ברקוד" @@ -1216,6 +1217,12 @@ msgstr "האם להסיר את התמונה המשויכת מפריט זה?" #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:884 #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:903 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:254 +#: src/tables/build/BuildAllocatedStockTable.tsx:178 +#: src/tables/build/BuildAllocatedStockTable.tsx:258 +#: src/tables/build/BuildLineTable.tsx:111 +#: src/tables/build/BuildLineTable.tsx:665 +#: src/tables/sales/SalesOrderAllocationTable.tsx:224 +#: src/tables/sales/SalesOrderAllocationTable.tsx:247 msgid "Remove" msgstr "הסר" @@ -1241,7 +1248,7 @@ msgid "Upload Error" msgstr "" #: src/components/details/DetailsImage.tsx:250 -#: src/components/forms/fields/TextField.tsx:65 +#: src/components/forms/fields/AutoFillRightSection.tsx:34 msgid "Clear" msgstr "נקה" @@ -1817,10 +1824,14 @@ msgstr "" msgid "Running" msgstr "" -#: src/components/forms/fields/ApiFormField.tsx:233 +#: src/components/forms/fields/ApiFormField.tsx:197 msgid "Select file to upload" msgstr "" +#: src/components/forms/fields/AutoFillRightSection.tsx:47 +msgid "Accept suggested value" +msgstr "" + #: src/components/forms/fields/DateField.tsx:76 msgid "Select date" msgstr "" @@ -1875,10 +1886,6 @@ msgstr "אין ערכים זמינים" msgid "Add new row" msgstr "" -#: src/components/forms/fields/TextField.tsx:82 -msgid "Accept suggested value" -msgstr "" - #: src/components/images/DetailsImage.tsx:252 #~ msgid "Select image" #~ msgstr "Select image" @@ -2225,8 +2232,8 @@ msgstr "" #: src/pages/part/PartDetail.tsx:994 #: src/pages/stock/StockDetail.tsx:265 #: src/pages/stock/StockDetail.tsx:942 -#: src/tables/build/BuildAllocatedStockTable.tsx:135 -#: src/tables/build/BuildLineTable.tsx:192 +#: src/tables/build/BuildAllocatedStockTable.tsx:132 +#: src/tables/build/BuildLineTable.tsx:193 #: src/tables/part/PartTable.tsx:137 #: src/tables/stock/StockItemTable.tsx:182 #: src/tables/stock/StockItemTable.tsx:343 @@ -2784,7 +2791,7 @@ msgstr "" #: src/pages/sales/SalesOrderDetail.tsx:119 #: src/pages/stock/LocationDetail.tsx:102 #: src/tables/ColumnRenderers.tsx:278 -#: src/tables/build/BuildAllocatedStockTable.tsx:91 +#: src/tables/build/BuildAllocatedStockTable.tsx:88 #: src/tables/machine/MachineTypeTable.tsx:161 #: src/tables/machine/MachineTypeTable.tsx:257 #: src/tables/plugin/PluginListTable.tsx:110 @@ -2966,7 +2973,7 @@ msgstr "אין מלאי" #: src/pages/company/SupplierPartDetail.tsx:394 #: src/pages/part/PartDetail.tsx:1015 #: src/tables/bom/BomTable.tsx:444 -#: src/tables/build/BuildLineTable.tsx:222 +#: src/tables/build/BuildLineTable.tsx:223 #: src/tables/part/PartTable.tsx:108 msgid "On Order" msgstr "" @@ -2976,7 +2983,7 @@ msgstr "" #: src/pages/part/PartDetail.tsx:587 #: src/pages/part/PartDetail.tsx:1021 #: src/pages/stock/StockDetail.tsx:925 -#: src/tables/part/PartTestResultTable.tsx:297 +#: src/tables/part/PartTestResultTable.tsx:305 #: src/tables/stock/StockItemTable.tsx:359 msgid "In Production" msgstr "" @@ -3000,7 +3007,7 @@ msgstr "" #: src/components/render/Stock.tsx:114 #: src/components/render/Stock.tsx:132 #: src/forms/BuildForms.tsx:795 -#: src/forms/PurchaseOrderForms.tsx:595 +#: src/forms/PurchaseOrderForms.tsx:647 #: src/forms/StockForms.tsx:792 #: src/forms/StockForms.tsx:839 #: src/forms/StockForms.tsx:885 @@ -3023,7 +3030,7 @@ msgstr "" #: src/components/render/Stock.tsx:99 #: src/pages/stock/StockDetail.tsx:198 #: src/pages/stock/StockDetail.tsx:930 -#: src/tables/build/BuildAllocatedStockTable.tsx:121 +#: src/tables/build/BuildAllocatedStockTable.tsx:118 #: src/tables/build/BuildOutputTable.tsx:107 #: src/tables/sales/SalesOrderAllocationTable.tsx:142 msgid "Serial Number" @@ -3034,9 +3041,9 @@ msgstr "מספר סידורי" #: src/forms/BuildForms.tsx:240 #: src/forms/BuildForms.tsx:634 #: src/forms/BuildForms.tsx:797 -#: src/forms/PurchaseOrderForms.tsx:801 +#: src/forms/PurchaseOrderForms.tsx:853 #: src/forms/ReturnOrderForms.tsx:243 -#: src/forms/SalesOrderForms.tsx:308 +#: src/forms/SalesOrderForms.tsx:326 #: src/forms/StockForms.tsx:841 #: src/pages/part/PartStockHistoryDetail.tsx:56 #: src/pages/part/PartStockHistoryDetail.tsx:210 @@ -3046,9 +3053,9 @@ msgstr "מספר סידורי" #: src/pages/part/pricing/PriceBreakPanel.tsx:172 #: src/pages/stock/StockDetail.tsx:258 #: src/pages/stock/StockDetail.tsx:936 -#: src/tables/build/BuildLineTable.tsx:86 +#: src/tables/build/BuildLineTable.tsx:83 #: src/tables/part/PartPurchaseOrdersTable.tsx:94 -#: src/tables/part/PartTestResultTable.tsx:269 +#: src/tables/part/PartTestResultTable.tsx:277 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:175 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:206 #: src/tables/purchasing/SupplierPriceBreakTable.tsx:69 @@ -3070,7 +3077,7 @@ msgstr "כמות" #: src/forms/StockForms.tsx:1048 #: src/forms/StockForms.tsx:1096 #: src/forms/StockForms.tsx:1140 -#: src/tables/build/BuildLineTable.tsx:96 +#: src/tables/build/BuildLineTable.tsx:93 msgid "Batch" msgstr "" @@ -3755,7 +3762,7 @@ msgid "In Stock" msgstr "" #: src/components/wizards/OrderPartsWizard.tsx:146 -#: src/tables/build/BuildLineTable.tsx:404 +#: src/tables/build/BuildLineTable.tsx:405 msgid "Required Quantity" msgstr "" @@ -3847,7 +3854,7 @@ msgid "Please correct the errors in the selected parts" msgstr "" #: src/components/wizards/OrderPartsWizard.tsx:587 -#: src/tables/build/BuildLineTable.tsx:815 +#: src/tables/build/BuildLineTable.tsx:822 #: src/tables/part/PartTable.tsx:522 #: src/tables/sales/SalesOrderLineItemTable.tsx:370 msgid "Order Parts" @@ -4349,9 +4356,9 @@ msgstr "" #: src/forms/BuildForms.tsx:333 #: src/forms/BuildForms.tsx:408 #: src/forms/BuildForms.tsx:685 -#: src/tables/build/BuildAllocatedStockTable.tsx:150 +#: src/tables/build/BuildAllocatedStockTable.tsx:147 #: src/tables/build/BuildOutputTable.tsx:582 -#: src/tables/part/PartTestResultTable.tsx:272 +#: src/tables/part/PartTestResultTable.tsx:280 msgid "Build Output" msgstr "" @@ -4362,7 +4369,7 @@ msgstr "" #: src/forms/BuildForms.tsx:336 #: src/forms/BuildForms.tsx:411 #: src/forms/BuildForms.tsx:475 -#: src/forms/PurchaseOrderForms.tsx:717 +#: src/forms/PurchaseOrderForms.tsx:769 #: src/forms/ReturnOrderForms.tsx:197 #: src/forms/ReturnOrderForms.tsx:244 #: src/forms/StockForms.tsx:712 @@ -4377,7 +4384,7 @@ msgstr "" #: src/tables/build/BuildOutputTable.tsx:404 #: src/tables/machine/MachineListTable.tsx:387 #: src/tables/part/PartPurchaseOrdersTable.tsx:38 -#: src/tables/part/PartTestResultTable.tsx:309 +#: src/tables/part/PartTestResultTable.tsx:317 #: src/tables/sales/ReturnOrderLineItemTable.tsx:138 #: src/tables/sales/ReturnOrderLineItemTable.tsx:176 #: src/tables/settings/CustomStateTable.tsx:79 @@ -4450,8 +4457,8 @@ msgstr "" #: src/pages/stock/StockDetail.tsx:153 #: src/tables/bom/BomTable.tsx:134 #: src/tables/bom/UsedInTable.tsx:40 -#: src/tables/build/BuildAllocatedStockTable.tsx:108 -#: src/tables/build/BuildLineTable.tsx:336 +#: src/tables/build/BuildAllocatedStockTable.tsx:105 +#: src/tables/build/BuildLineTable.tsx:337 #: src/tables/build/BuildOrderTable.tsx:79 #: src/tables/part/PartSalesAllocationsTable.tsx:61 #: src/tables/part/RelatedPartTable.tsx:73 @@ -4466,47 +4473,47 @@ msgstr "" #: src/forms/BuildForms.tsx:632 #: src/forms/BuildForms.tsx:796 #: src/forms/BuildForms.tsx:897 -#: src/forms/SalesOrderForms.tsx:306 -#: src/tables/build/BuildAllocatedStockTable.tsx:139 -#: src/tables/build/BuildLineTable.tsx:182 +#: src/forms/SalesOrderForms.tsx:324 +#: src/tables/build/BuildAllocatedStockTable.tsx:136 +#: src/tables/build/BuildLineTable.tsx:183 #: src/tables/sales/SalesOrderLineItemTable.tsx:342 #: src/tables/stock/StockItemTable.tsx:338 msgid "Allocated" msgstr "" #: src/forms/BuildForms.tsx:667 -#: src/forms/SalesOrderForms.tsx:295 +#: src/forms/SalesOrderForms.tsx:313 #: src/pages/build/BuildDetail.tsx:108 #: src/pages/build/BuildDetail.tsx:326 msgid "Source Location" msgstr "" #: src/forms/BuildForms.tsx:668 -#: src/forms/SalesOrderForms.tsx:296 +#: src/forms/SalesOrderForms.tsx:314 msgid "Select the source location for the stock allocation" msgstr "" #: src/forms/BuildForms.tsx:700 -#: src/forms/SalesOrderForms.tsx:336 -#: src/tables/build/BuildLineTable.tsx:574 -#: src/tables/build/BuildLineTable.tsx:731 -#: src/tables/build/BuildLineTable.tsx:830 +#: src/forms/SalesOrderForms.tsx:354 +#: src/tables/build/BuildLineTable.tsx:575 +#: src/tables/build/BuildLineTable.tsx:738 +#: src/tables/build/BuildLineTable.tsx:837 #: src/tables/sales/SalesOrderLineItemTable.tsx:380 #: src/tables/sales/SalesOrderLineItemTable.tsx:406 msgid "Allocate Stock" msgstr "" #: src/forms/BuildForms.tsx:703 -#: src/forms/SalesOrderForms.tsx:341 +#: src/forms/SalesOrderForms.tsx:359 msgid "Stock items allocated" msgstr "" #: src/forms/BuildForms.tsx:816 #: src/forms/BuildForms.tsx:917 -#: src/tables/build/BuildAllocatedStockTable.tsx:240 -#: src/tables/build/BuildAllocatedStockTable.tsx:272 -#: src/tables/build/BuildLineTable.tsx:741 -#: src/tables/build/BuildLineTable.tsx:864 +#: src/tables/build/BuildAllocatedStockTable.tsx:243 +#: src/tables/build/BuildAllocatedStockTable.tsx:279 +#: src/tables/build/BuildLineTable.tsx:748 +#: src/tables/build/BuildLineTable.tsx:871 msgid "Consume Stock" msgstr "" @@ -4521,21 +4528,21 @@ msgstr "" #~ msgstr "Stock items consumed" #: src/forms/BuildForms.tsx:853 -#: src/tables/build/BuildLineTable.tsx:514 +#: src/tables/build/BuildLineTable.tsx:515 #: src/tables/part/PartBuildAllocationsTable.tsx:101 msgid "Fully consumed" msgstr "" #: src/forms/BuildForms.tsx:898 -#: src/tables/build/BuildLineTable.tsx:187 +#: src/tables/build/BuildLineTable.tsx:188 #: src/tables/stock/StockItemTable.tsx:367 msgid "Consumed" msgstr "" #: src/forms/CommonForms.tsx:88 -#: src/forms/PurchaseOrderForms.tsx:125 +#: src/forms/PurchaseOrderForms.tsx:176 #: src/forms/ReturnOrderForms.tsx:138 -#: src/forms/SalesOrderForms.tsx:164 +#: src/forms/SalesOrderForms.tsx:182 msgid "Select project code for this line item" msgstr "" @@ -4572,32 +4579,16 @@ msgstr "" msgid "Subscribe to notifications for this category" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:388 -msgid "Assign Batch Code and Serial Numbers" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:390 -msgid "Assign Batch Code" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:410 -msgid "Choose Location" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:418 -msgid "Item Destination selected" -msgstr "" - #: src/forms/PurchaseOrderForms.tsx:421 #~ msgid "Assign Batch Code{0}" #~ msgstr "Assign Batch Code{0}" -#: src/forms/PurchaseOrderForms.tsx:428 -msgid "Part category default location selected" +#: src/forms/PurchaseOrderForms.tsx:440 +msgid "Assign Batch Code and Serial Numbers" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:438 -msgid "Received stock location selected" +#: src/forms/PurchaseOrderForms.tsx:442 +msgid "Assign Batch Code" msgstr "" #: src/forms/PurchaseOrderForms.tsx:444 @@ -4605,94 +4596,110 @@ msgstr "" #~ msgid "Remove item from list" #~ msgstr "Remove item from list" -#: src/forms/PurchaseOrderForms.tsx:446 +#: src/forms/PurchaseOrderForms.tsx:462 +msgid "Choose Location" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:470 +msgid "Item Destination selected" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:480 +msgid "Part category default location selected" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:490 +msgid "Received stock location selected" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:498 msgid "Default location selected" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:507 +#: src/forms/PurchaseOrderForms.tsx:559 msgid "Set Location" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:524 -msgid "Set Expiry Date" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:532 -#: src/forms/StockForms.tsx:693 -msgid "Adjust Packaging" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:540 -#: src/forms/StockForms.tsx:684 -#: src/hooks/UseStockAdjustActions.tsx:148 -msgid "Change Status" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:546 -msgid "Add Note" -msgstr "" - #: src/forms/PurchaseOrderForms.tsx:566 #~ msgid "Serial numbers" #~ msgstr "Serial numbers" +#: src/forms/PurchaseOrderForms.tsx:576 +msgid "Set Expiry Date" +msgstr "" + #: src/forms/PurchaseOrderForms.tsx:582 #~ msgid "Store at line item destination" #~ msgstr "Store at line item destination" -#: src/forms/PurchaseOrderForms.tsx:610 -msgid "Store at default location" +#: src/forms/PurchaseOrderForms.tsx:584 +#: src/forms/StockForms.tsx:693 +msgid "Adjust Packaging" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:625 -msgid "Store at line item destination " +#: src/forms/PurchaseOrderForms.tsx:592 +#: src/forms/StockForms.tsx:684 +#: src/hooks/UseStockAdjustActions.tsx:148 +msgid "Change Status" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:637 -msgid "Store with already received stock" +#: src/forms/PurchaseOrderForms.tsx:598 +msgid "Add Note" msgstr "" #: src/forms/PurchaseOrderForms.tsx:658 #~ msgid "Receive line items" #~ msgstr "Receive line items" -#: src/forms/PurchaseOrderForms.tsx:661 +#: src/forms/PurchaseOrderForms.tsx:662 +msgid "Store at default location" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:677 +msgid "Store at line item destination " +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:689 +msgid "Store with already received stock" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:713 #: src/pages/build/BuildDetail.tsx:340 #: src/pages/stock/StockDetail.tsx:280 #: src/pages/stock/StockDetail.tsx:952 #: src/tables/Filter.tsx:83 -#: src/tables/build/BuildAllocatedStockTable.tsx:128 +#: src/tables/build/BuildAllocatedStockTable.tsx:125 #: src/tables/build/BuildOutputTable.tsx:112 -#: src/tables/part/PartTestResultTable.tsx:260 -#: src/tables/part/PartTestResultTable.tsx:281 +#: src/tables/part/PartTestResultTable.tsx:268 +#: src/tables/part/PartTestResultTable.tsx:289 #: src/tables/sales/SalesOrderAllocationTable.tsx:149 msgid "Batch Code" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:662 +#: src/forms/PurchaseOrderForms.tsx:714 msgid "Enter batch code for received items" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:675 +#: src/forms/PurchaseOrderForms.tsx:727 #: src/forms/StockForms.tsx:218 msgid "Serial Numbers" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:676 +#: src/forms/PurchaseOrderForms.tsx:728 msgid "Enter serial numbers for received items" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:690 +#: src/forms/PurchaseOrderForms.tsx:742 #: src/pages/stock/StockDetail.tsx:382 #: src/tables/stock/StockItemTable.tsx:294 msgid "Expiry Date" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:691 +#: src/forms/PurchaseOrderForms.tsx:743 msgid "Enter an expiry date for received items" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:703 +#: src/forms/PurchaseOrderForms.tsx:755 #: src/forms/StockForms.tsx:728 #: src/pages/company/SupplierPartDetail.tsx:172 #: src/pages/company/SupplierPartDetail.tsx:236 @@ -4701,19 +4708,19 @@ msgstr "" msgid "Packaging" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:727 +#: src/forms/PurchaseOrderForms.tsx:779 #: src/pages/company/SupplierPartDetail.tsx:120 #: src/tables/ColumnRenderers.tsx:332 msgid "Note" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:799 +#: src/forms/PurchaseOrderForms.tsx:851 #: src/pages/company/SupplierPartDetail.tsx:138 #: src/tables/purchasing/SupplierPriceBreakTable.tsx:49 msgid "SKU" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:800 +#: src/forms/PurchaseOrderForms.tsx:852 #: src/tables/part/PartPurchaseOrdersTable.tsx:127 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:213 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:283 @@ -4721,11 +4728,11 @@ msgstr "" msgid "Received" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:817 +#: src/forms/PurchaseOrderForms.tsx:869 msgid "Receive Line Items" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:823 +#: src/forms/PurchaseOrderForms.tsx:875 msgid "Items received" msgstr "" @@ -4737,7 +4744,7 @@ msgstr "" msgid "Item received into stock" msgstr "" -#: src/forms/SalesOrderForms.tsx:401 +#: src/forms/SalesOrderForms.tsx:419 msgid "Leave blank to use the order address" msgstr "" @@ -5932,6 +5939,9 @@ msgstr "" #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:310 #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:401 +#: src/tables/build/BuildAllocatedStockTable.tsx:181 +#: src/tables/build/BuildLineTable.tsx:668 +#: src/tables/sales/SalesOrderAllocationTable.tsx:220 msgid "Confirm Removal" msgstr "" @@ -6870,8 +6880,8 @@ msgstr "" #: src/pages/sales/ReturnOrderDetail.tsx:108 #: src/pages/sales/SalesOrderDetail.tsx:98 #: src/tables/ColumnRenderers.tsx:321 -#: src/tables/build/BuildAllocatedStockTable.tsx:115 -#: src/tables/build/BuildLineTable.tsx:352 +#: src/tables/build/BuildAllocatedStockTable.tsx:112 +#: src/tables/build/BuildLineTable.tsx:353 msgid "Reference" msgstr "" @@ -7132,7 +7142,7 @@ msgstr "" #: src/pages/build/BuildDetail.tsx:742 #: src/pages/stock/StockDetail.tsx:344 -#: src/tables/build/BuildAllocatedStockTable.tsx:85 +#: src/tables/build/BuildAllocatedStockTable.tsx:82 #: src/tables/part/PartBuildAllocationsTable.tsx:45 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:157 #: src/tables/stock/StockTrackingTable.tsx:109 @@ -7600,7 +7610,7 @@ msgstr "" #: src/pages/part/PartDetail.tsx:542 #: src/tables/bom/BomTable.tsx:439 -#: src/tables/build/BuildLineTable.tsx:305 +#: src/tables/build/BuildLineTable.tsx:306 #: src/tables/part/PartTable.tsx:319 #: src/tables/sales/SalesOrderLineItemTable.tsx:138 msgid "Available Stock" @@ -7608,7 +7618,7 @@ msgstr "" #: src/pages/part/PartDetail.tsx:548 #: src/tables/bom/BomTable.tsx:341 -#: src/tables/build/BuildLineTable.tsx:267 +#: src/tables/build/BuildLineTable.tsx:268 #: src/tables/sales/SalesOrderLineItemTable.tsx:180 msgid "On order" msgstr "" @@ -7782,7 +7792,7 @@ msgstr "" #: src/pages/part/PartDetail.tsx:1144 #: src/pages/stock/StockDetail.tsx:884 -#: src/tables/build/BuildLineTable.tsx:761 +#: src/tables/build/BuildLineTable.tsx:768 msgid "Order Stock" msgstr "" @@ -9219,13 +9229,13 @@ msgstr "" #~ msgstr "Show asssmbled items" #: src/tables/bom/BomTable.tsx:315 -#: src/tables/build/BuildLineTable.tsx:276 +#: src/tables/build/BuildLineTable.tsx:277 #: src/tables/part/PartTable.tsx:145 msgid "External stock" msgstr "" #: src/tables/bom/BomTable.tsx:323 -#: src/tables/build/BuildLineTable.tsx:239 +#: src/tables/build/BuildLineTable.tsx:240 msgid "Includes substitute stock" msgstr "" @@ -9234,7 +9244,7 @@ msgstr "" #~ msgstr "Edit Bom Item" #: src/tables/bom/BomTable.tsx:332 -#: src/tables/build/BuildLineTable.tsx:249 +#: src/tables/build/BuildLineTable.tsx:250 #: src/tables/sales/SalesOrderLineItemTable.tsx:166 msgid "Includes variant stock" msgstr "" @@ -9272,8 +9282,8 @@ msgid "Stock Information" msgstr "" #: src/tables/bom/BomTable.tsx:399 -#: src/tables/build/BuildLineTable.tsx:496 -#: src/tables/build/BuildLineTable.tsx:537 +#: src/tables/build/BuildLineTable.tsx:497 +#: src/tables/build/BuildLineTable.tsx:538 msgid "Consumable item" msgstr "" @@ -9282,7 +9292,7 @@ msgid "No available stock" msgstr "" #: src/tables/bom/BomTable.tsx:420 -#: src/tables/build/BuildLineTable.tsx:213 +#: src/tables/build/BuildLineTable.tsx:214 msgid "Show testable items" msgstr "" @@ -9291,7 +9301,7 @@ msgid "Show trackable items" msgstr "" #: src/tables/bom/BomTable.tsx:430 -#: src/tables/build/BuildLineTable.tsx:208 +#: src/tables/build/BuildLineTable.tsx:209 msgid "Show assembled items" msgstr "" @@ -9335,7 +9345,7 @@ msgstr "" #: src/tables/bom/BomTable.tsx:464 #: src/tables/bom/UsedInTable.tsx:85 -#: src/tables/build/BuildLineTable.tsx:202 +#: src/tables/build/BuildLineTable.tsx:203 msgid "Optional" msgstr "" @@ -9345,7 +9355,7 @@ msgid "Show optional items" msgstr "" #: src/tables/bom/BomTable.tsx:469 -#: src/tables/build/BuildLineTable.tsx:197 +#: src/tables/build/BuildLineTable.tsx:198 msgid "Consumable" msgstr "" @@ -9433,7 +9443,7 @@ msgid "Bill of materials cannot be edited, as the part is locked" msgstr "לא ניתן לערוך את כתב החומרים, מכיוון שהפריט נעול" #: src/tables/bom/UsedInTable.tsx:34 -#: src/tables/build/BuildLineTable.tsx:207 +#: src/tables/build/BuildLineTable.tsx:208 #: src/tables/part/ParametricPartTable.tsx:364 #: src/tables/part/PartBuildAllocationsTable.tsx:60 #: src/tables/part/PartTable.tsx:209 @@ -9455,11 +9465,11 @@ msgstr "ניתן למעקב" msgid "Show trackable assemblies" msgstr "" -#: src/tables/build/BuildAllocatedStockTable.tsx:67 +#: src/tables/build/BuildAllocatedStockTable.tsx:64 msgid "Allocated to Output" msgstr "" -#: src/tables/build/BuildAllocatedStockTable.tsx:68 +#: src/tables/build/BuildAllocatedStockTable.tsx:65 msgid "Show items allocated to a build output" msgstr "הצג מכלולים שניתנים למעקב" @@ -9472,7 +9482,7 @@ msgstr "הצג מכלולים שניתנים למעקב" #~ msgid "Include orders for part variants" #~ msgstr "Include orders for part variants" -#: src/tables/build/BuildAllocatedStockTable.tsx:97 +#: src/tables/build/BuildAllocatedStockTable.tsx:94 #: src/tables/part/PartBuildAllocationsTable.tsx:84 #: src/tables/part/PartPurchaseOrdersTable.tsx:132 #: src/tables/part/PartSalesAllocationsTable.tsx:69 @@ -9482,40 +9492,58 @@ msgid "Order Status" msgstr "" #: src/tables/build/BuildAllocatedStockTable.tsx:164 -#~ msgid "Edit Build Item" -#~ msgstr "Edit Build Item" - -#: src/tables/build/BuildAllocatedStockTable.tsx:167 -#: src/tables/build/BuildLineTable.tsx:650 +#: src/tables/build/BuildLineTable.tsx:651 msgid "Edit Stock Allocation" msgstr "" +#: src/tables/build/BuildAllocatedStockTable.tsx:164 +#~ msgid "Edit Build Item" +#~ msgstr "Edit Build Item" + #: src/tables/build/BuildAllocatedStockTable.tsx:174 #~ msgid "Delete Build Item" #~ msgstr "Delete Build Item" -#: src/tables/build/BuildAllocatedStockTable.tsx:180 -#: src/tables/build/BuildLineTable.tsx:663 -msgid "Delete Stock Allocation" +#: src/tables/build/BuildAllocatedStockTable.tsx:177 +#: src/tables/build/BuildLineTable.tsx:664 +#: src/tables/sales/SalesOrderAllocationTable.tsx:218 +msgid "Remove Allocated Stock" msgstr "" -#: src/tables/build/BuildAllocatedStockTable.tsx:239 +#: src/tables/build/BuildAllocatedStockTable.tsx:180 +#: src/tables/build/BuildLineTable.tsx:663 +#~ msgid "Delete Stock Allocation" +#~ msgstr "Delete Stock Allocation" + +#: src/tables/build/BuildAllocatedStockTable.tsx:182 +#: src/tables/build/BuildLineTable.tsx:669 +#: src/tables/sales/SalesOrderAllocationTable.tsx:221 +msgid "Are you sure you want to remove this allocated stock from the order?" +msgstr "" + +#: src/tables/build/BuildAllocatedStockTable.tsx:242 msgid "Consume" msgstr "" +#: src/tables/build/BuildAllocatedStockTable.tsx:259 +#: src/tables/build/BuildLineTable.tsx:112 +#: src/tables/sales/SalesOrderAllocationTable.tsx:248 +msgid "Remove allocated stock" +msgstr "" + #: src/tables/build/BuildLineTable.tsx:59 #~ msgid "Show lines with available stock" #~ msgstr "Show lines with available stock" -#: src/tables/build/BuildLineTable.tsx:120 +#: src/tables/build/BuildLineTable.tsx:121 msgid "View Stock Item" msgstr "" -#: src/tables/build/BuildLineTable.tsx:183 +#: src/tables/build/BuildLineTable.tsx:184 msgid "Show fully allocated lines" msgstr "" -#: src/tables/build/BuildLineTable.tsx:188 +#: src/tables/build/BuildLineTable.tsx:189 msgid "Show fully consumed lines" msgstr "" @@ -9523,124 +9551,124 @@ msgstr "" #~ msgid "Show allocated lines" #~ msgstr "Show allocated lines" -#: src/tables/build/BuildLineTable.tsx:193 +#: src/tables/build/BuildLineTable.tsx:194 msgid "Show items with sufficient available stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:198 +#: src/tables/build/BuildLineTable.tsx:199 msgid "Show consumable lines" msgstr "" -#: src/tables/build/BuildLineTable.tsx:203 +#: src/tables/build/BuildLineTable.tsx:204 msgid "Show optional lines" msgstr "" -#: src/tables/build/BuildLineTable.tsx:212 +#: src/tables/build/BuildLineTable.tsx:213 #: src/tables/part/PartTable.tsx:233 msgid "Testable" msgstr "" -#: src/tables/build/BuildLineTable.tsx:217 +#: src/tables/build/BuildLineTable.tsx:218 #: src/tables/stock/StockItemTable.tsx:388 msgid "Tracked" msgstr "" -#: src/tables/build/BuildLineTable.tsx:218 +#: src/tables/build/BuildLineTable.tsx:219 msgid "Show tracked lines" msgstr "" -#: src/tables/build/BuildLineTable.tsx:223 +#: src/tables/build/BuildLineTable.tsx:224 msgid "Show items with stock on order" msgstr "" -#: src/tables/build/BuildLineTable.tsx:258 +#: src/tables/build/BuildLineTable.tsx:259 #: src/tables/sales/SalesOrderLineItemTable.tsx:172 msgid "In production" msgstr "" -#: src/tables/build/BuildLineTable.tsx:286 +#: src/tables/build/BuildLineTable.tsx:287 msgid "Insufficient stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:302 +#: src/tables/build/BuildLineTable.tsx:303 #: src/tables/sales/SalesOrderLineItemTable.tsx:160 #: src/tables/stock/StockItemTable.tsx:191 msgid "No stock available" msgstr "" -#: src/tables/build/BuildLineTable.tsx:375 +#: src/tables/build/BuildLineTable.tsx:376 msgid "Gets Inherited" msgstr "" -#: src/tables/build/BuildLineTable.tsx:388 +#: src/tables/build/BuildLineTable.tsx:389 msgid "Unit Quantity" msgstr "" -#: src/tables/build/BuildLineTable.tsx:415 +#: src/tables/build/BuildLineTable.tsx:416 msgid "Setup Quantity" msgstr "" -#: src/tables/build/BuildLineTable.tsx:424 +#: src/tables/build/BuildLineTable.tsx:425 msgid "Attrition" msgstr "" -#: src/tables/build/BuildLineTable.tsx:432 +#: src/tables/build/BuildLineTable.tsx:433 msgid "Rounding Multiple" msgstr "" -#: src/tables/build/BuildLineTable.tsx:441 +#: src/tables/build/BuildLineTable.tsx:442 msgid "BOM Information" msgstr "" -#: src/tables/build/BuildLineTable.tsx:515 +#: src/tables/build/BuildLineTable.tsx:516 #: src/tables/part/PartBuildAllocationsTable.tsx:102 msgid "Fully allocated" msgstr "" -#: src/tables/build/BuildLineTable.tsx:563 +#: src/tables/build/BuildLineTable.tsx:564 #: src/tables/sales/SalesOrderLineItemTable.tsx:311 msgid "Create Build Order" msgstr "" -#: src/tables/build/BuildLineTable.tsx:592 +#: src/tables/build/BuildLineTable.tsx:593 msgid "Auto allocation in progress" msgstr "" -#: src/tables/build/BuildLineTable.tsx:595 -#: src/tables/build/BuildLineTable.tsx:802 +#: src/tables/build/BuildLineTable.tsx:596 +#: src/tables/build/BuildLineTable.tsx:809 msgid "Auto Allocate Stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:596 +#: src/tables/build/BuildLineTable.tsx:597 msgid "Automatically allocate stock to this build according to the selected options" msgstr "" -#: src/tables/build/BuildLineTable.tsx:616 -#: src/tables/build/BuildLineTable.tsx:630 -#: src/tables/build/BuildLineTable.tsx:751 -#: src/tables/build/BuildLineTable.tsx:852 +#: src/tables/build/BuildLineTable.tsx:617 +#: src/tables/build/BuildLineTable.tsx:631 +#: src/tables/build/BuildLineTable.tsx:758 +#: src/tables/build/BuildLineTable.tsx:859 #: src/tables/build/BuildOutputTable.tsx:355 #: src/tables/build/BuildOutputTable.tsx:360 msgid "Deallocate Stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:632 +#: src/tables/build/BuildLineTable.tsx:633 msgid "Deallocate all untracked stock for this build order" msgstr "" -#: src/tables/build/BuildLineTable.tsx:634 +#: src/tables/build/BuildLineTable.tsx:635 msgid "Deallocate stock from the selected line item" msgstr "" -#: src/tables/build/BuildLineTable.tsx:638 +#: src/tables/build/BuildLineTable.tsx:639 msgid "Stock has been deallocated" msgstr "" -#: src/tables/build/BuildLineTable.tsx:771 +#: src/tables/build/BuildLineTable.tsx:778 msgid "Build Stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:784 +#: src/tables/build/BuildLineTable.tsx:791 #: src/tables/sales/SalesOrderLineItemTable.tsx:487 msgid "View Part" msgstr "" @@ -9739,7 +9767,7 @@ msgid "Serialize Build Output" msgstr "" #: src/tables/build/BuildOutputTable.tsx:405 -#: src/tables/part/PartTestResultTable.tsx:310 +#: src/tables/part/PartTestResultTable.tsx:318 #: src/tables/stock/StockItemTable.tsx:328 msgid "Filter by stock status" msgstr "" @@ -9964,8 +9992,8 @@ msgid "View Item" msgstr "" #: src/tables/general/ExtraLineItemTable.tsx:95 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:299 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:403 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:300 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:405 #: src/tables/sales/ReturnOrderLineItemTable.tsx:83 #: src/tables/sales/ReturnOrderLineItemTable.tsx:187 #: src/tables/sales/SalesOrderLineItemTable.tsx:252 @@ -9974,14 +10002,14 @@ msgid "Add Line Item" msgstr "" #: src/tables/general/ExtraLineItemTable.tsx:108 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:320 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:322 #: src/tables/sales/ReturnOrderLineItemTable.tsx:96 #: src/tables/sales/SalesOrderLineItemTable.tsx:271 msgid "Edit Line Item" msgstr "" #: src/tables/general/ExtraLineItemTable.tsx:117 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:329 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:331 #: src/tables/sales/ReturnOrderLineItemTable.tsx:105 #: src/tables/sales/SalesOrderLineItemTable.tsx:280 msgid "Delete Line Item" @@ -10273,7 +10301,7 @@ msgid "Required Stock" msgstr "" #: src/tables/part/PartBuildAllocationsTable.tsx:124 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:381 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:383 msgid "View Build Order" msgstr "" @@ -10617,8 +10645,8 @@ msgstr "" #: src/tables/part/PartTestResultTable.tsx:103 #: src/tables/part/PartTestResultTable.tsx:181 -#: src/tables/part/PartTestResultTable.tsx:320 -#: src/tables/part/PartTestResultTable.tsx:334 +#: src/tables/part/PartTestResultTable.tsx:328 +#: src/tables/part/PartTestResultTable.tsx:342 #: src/tables/stock/StockItemTestResultTable.tsx:296 #: src/tables/stock/StockItemTestResultTable.tsx:368 #: src/tables/stock/StockItemTestResultTable.tsx:429 @@ -10643,7 +10671,7 @@ msgstr "" msgid "No Result" msgstr "" -#: src/tables/part/PartTestResultTable.tsx:298 +#: src/tables/part/PartTestResultTable.tsx:306 msgid "Show build outputs currently in production" msgstr "" @@ -11073,7 +11101,7 @@ msgid "Show manufacturer parts for active manufacturers." msgstr "" #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:115 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:397 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:399 msgid "Import Line Items" msgstr "" @@ -11099,11 +11127,11 @@ msgstr "" #~ msgid "Add line item" #~ msgstr "Add line item" -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:350 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:352 msgid "Receive line item" msgstr "" -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:414 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:416 msgid "Receive items" msgstr "" @@ -11201,25 +11229,25 @@ msgid "Not shipped" msgstr "" #: src/tables/sales/SalesOrderAllocationTable.tsx:211 -#: src/tables/sales/SalesOrderAllocationTable.tsx:229 +#: src/tables/sales/SalesOrderAllocationTable.tsx:235 msgid "Edit Allocation" msgstr "" #: src/tables/sales/SalesOrderAllocationTable.tsx:218 #: src/tables/sales/SalesOrderAllocationTable.tsx:241 -msgid "Delete Allocation" -msgstr "" +#~ msgid "Delete Allocation" +#~ msgstr "Delete Allocation" -#: src/tables/sales/SalesOrderAllocationTable.tsx:252 -#: src/tables/sales/SalesOrderAllocationTable.tsx:253 +#: src/tables/sales/SalesOrderAllocationTable.tsx:261 +#: src/tables/sales/SalesOrderAllocationTable.tsx:262 msgid "View Shipment" msgstr "" -#: src/tables/sales/SalesOrderAllocationTable.tsx:308 +#: src/tables/sales/SalesOrderAllocationTable.tsx:317 msgid "Assign to Shipment" msgstr "" -#: src/tables/sales/SalesOrderAllocationTable.tsx:324 +#: src/tables/sales/SalesOrderAllocationTable.tsx:333 msgid "Assign to shipment" msgstr "" diff --git a/src/frontend/src/locales/hi/messages.po b/src/frontend/src/locales/hi/messages.po index 4d6a352e73..a1fbc0db48 100644 --- a/src/frontend/src/locales/hi/messages.po +++ b/src/frontend/src/locales/hi/messages.po @@ -8,7 +8,7 @@ msgstr "" "Language: hi\n" "Project-Id-Version: inventree\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2025-11-19 19:39\n" +"PO-Revision-Date: 2025-11-22 06:25\n" "Last-Translator: \n" "Language-Team: Hindi\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" @@ -56,7 +56,7 @@ msgstr "" #: lib/components/RowActions.tsx:136 #: src/components/nav/NavigationDrawer.tsx:190 -#: src/forms/PurchaseOrderForms.tsx:802 +#: src/forms/PurchaseOrderForms.tsx:854 #: src/forms/StockForms.tsx:796 #: src/forms/StockForms.tsx:843 #: src/forms/StockForms.tsx:889 @@ -103,9 +103,9 @@ msgstr "" #: src/forms/BuildForms.tsx:630 #: src/forms/BuildForms.tsx:793 #: src/forms/BuildForms.tsx:896 -#: src/forms/PurchaseOrderForms.tsx:798 +#: src/forms/PurchaseOrderForms.tsx:850 #: src/forms/ReturnOrderForms.tsx:242 -#: src/forms/SalesOrderForms.tsx:305 +#: src/forms/SalesOrderForms.tsx:323 #: src/forms/StockForms.tsx:360 #: src/forms/StockForms.tsx:791 #: src/forms/StockForms.tsx:838 @@ -119,6 +119,7 @@ msgstr "" #: src/pages/build/BuildDetail.tsx:200 #: src/pages/part/PartDetail.tsx:1207 #: src/tables/ColumnRenderers.tsx:91 +#: src/tables/part/PartTestResultTable.tsx:247 #: src/tables/part/RelatedPartTable.tsx:53 #: src/tables/stock/StockTrackingTable.tsx:87 msgid "Part" @@ -158,7 +159,7 @@ msgstr "" #: src/components/wizards/OrderPartsWizard.tsx:290 #: src/pages/company/SupplierPartDetail.tsx:413 #: src/pages/stock/StockDetail.tsx:289 -#: src/tables/build/BuildAllocatedStockTable.tsx:155 +#: src/tables/build/BuildAllocatedStockTable.tsx:152 #: src/tables/part/PartPurchaseOrdersTable.tsx:50 #: src/tables/purchasing/SupplierPartTable.tsx:83 #: src/tables/stock/StockItemTable.tsx:247 @@ -201,9 +202,9 @@ msgstr "" #: src/forms/BuildForms.tsx:473 #: src/forms/BuildForms.tsx:633 #: src/forms/BuildForms.tsx:794 -#: src/forms/SalesOrderForms.tsx:307 +#: src/forms/SalesOrderForms.tsx:325 #: src/pages/stock/StockDetail.tsx:1005 -#: src/tables/part/PartTestResultTable.tsx:248 +#: src/tables/part/PartTestResultTable.tsx:256 #: src/tables/stock/StockTrackingTable.tsx:48 #: src/tables/stock/StockTrackingTable.tsx:55 msgid "Stock Item" @@ -517,7 +518,7 @@ msgstr "" #: src/components/dashboard/DashboardLayout.tsx:281 #: src/components/editors/NotesEditor.tsx:74 #: src/components/editors/TemplateEditor/TemplateEditor.tsx:158 -#: src/components/forms/fields/ApiFormField.tsx:273 +#: src/components/forms/fields/ApiFormField.tsx:237 #: src/components/forms/fields/TableField.tsx:45 #: src/components/importer/ImportDataSelector.tsx:192 #: src/components/importer/ImporterColumnSelector.tsx:234 @@ -642,8 +643,8 @@ msgstr "" #: src/components/barcodes/BarcodeScanDialog.tsx:49 #: src/components/buttons/ScanButton.tsx:15 #: src/components/nav/NavigationDrawer.tsx:122 -#: src/forms/PurchaseOrderForms.tsx:457 -#: src/forms/PurchaseOrderForms.tsx:563 +#: src/forms/PurchaseOrderForms.tsx:509 +#: src/forms/PurchaseOrderForms.tsx:615 msgid "Scan Barcode" msgstr "" @@ -728,7 +729,7 @@ msgstr "" #: src/components/barcodes/QRCode.tsx:205 #: src/components/items/ActionDropdown.tsx:192 -#: src/forms/PurchaseOrderForms.tsx:554 +#: src/forms/PurchaseOrderForms.tsx:606 msgid "Unlink Barcode" msgstr "" @@ -1216,6 +1217,12 @@ msgstr "" #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:884 #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:903 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:254 +#: src/tables/build/BuildAllocatedStockTable.tsx:178 +#: src/tables/build/BuildAllocatedStockTable.tsx:258 +#: src/tables/build/BuildLineTable.tsx:111 +#: src/tables/build/BuildLineTable.tsx:665 +#: src/tables/sales/SalesOrderAllocationTable.tsx:224 +#: src/tables/sales/SalesOrderAllocationTable.tsx:247 msgid "Remove" msgstr "" @@ -1241,7 +1248,7 @@ msgid "Upload Error" msgstr "" #: src/components/details/DetailsImage.tsx:250 -#: src/components/forms/fields/TextField.tsx:65 +#: src/components/forms/fields/AutoFillRightSection.tsx:34 msgid "Clear" msgstr "" @@ -1817,10 +1824,14 @@ msgstr "" msgid "Running" msgstr "" -#: src/components/forms/fields/ApiFormField.tsx:233 +#: src/components/forms/fields/ApiFormField.tsx:197 msgid "Select file to upload" msgstr "" +#: src/components/forms/fields/AutoFillRightSection.tsx:47 +msgid "Accept suggested value" +msgstr "" + #: src/components/forms/fields/DateField.tsx:76 msgid "Select date" msgstr "" @@ -1875,10 +1886,6 @@ msgstr "" msgid "Add new row" msgstr "" -#: src/components/forms/fields/TextField.tsx:82 -msgid "Accept suggested value" -msgstr "" - #: src/components/images/DetailsImage.tsx:252 #~ msgid "Select image" #~ msgstr "Select image" @@ -2225,8 +2232,8 @@ msgstr "" #: src/pages/part/PartDetail.tsx:994 #: src/pages/stock/StockDetail.tsx:265 #: src/pages/stock/StockDetail.tsx:942 -#: src/tables/build/BuildAllocatedStockTable.tsx:135 -#: src/tables/build/BuildLineTable.tsx:192 +#: src/tables/build/BuildAllocatedStockTable.tsx:132 +#: src/tables/build/BuildLineTable.tsx:193 #: src/tables/part/PartTable.tsx:137 #: src/tables/stock/StockItemTable.tsx:182 #: src/tables/stock/StockItemTable.tsx:343 @@ -2784,7 +2791,7 @@ msgstr "" #: src/pages/sales/SalesOrderDetail.tsx:119 #: src/pages/stock/LocationDetail.tsx:102 #: src/tables/ColumnRenderers.tsx:278 -#: src/tables/build/BuildAllocatedStockTable.tsx:91 +#: src/tables/build/BuildAllocatedStockTable.tsx:88 #: src/tables/machine/MachineTypeTable.tsx:161 #: src/tables/machine/MachineTypeTable.tsx:257 #: src/tables/plugin/PluginListTable.tsx:110 @@ -2966,7 +2973,7 @@ msgstr "" #: src/pages/company/SupplierPartDetail.tsx:394 #: src/pages/part/PartDetail.tsx:1015 #: src/tables/bom/BomTable.tsx:444 -#: src/tables/build/BuildLineTable.tsx:222 +#: src/tables/build/BuildLineTable.tsx:223 #: src/tables/part/PartTable.tsx:108 msgid "On Order" msgstr "" @@ -2976,7 +2983,7 @@ msgstr "" #: src/pages/part/PartDetail.tsx:587 #: src/pages/part/PartDetail.tsx:1021 #: src/pages/stock/StockDetail.tsx:925 -#: src/tables/part/PartTestResultTable.tsx:297 +#: src/tables/part/PartTestResultTable.tsx:305 #: src/tables/stock/StockItemTable.tsx:359 msgid "In Production" msgstr "" @@ -3000,7 +3007,7 @@ msgstr "" #: src/components/render/Stock.tsx:114 #: src/components/render/Stock.tsx:132 #: src/forms/BuildForms.tsx:795 -#: src/forms/PurchaseOrderForms.tsx:595 +#: src/forms/PurchaseOrderForms.tsx:647 #: src/forms/StockForms.tsx:792 #: src/forms/StockForms.tsx:839 #: src/forms/StockForms.tsx:885 @@ -3023,7 +3030,7 @@ msgstr "" #: src/components/render/Stock.tsx:99 #: src/pages/stock/StockDetail.tsx:198 #: src/pages/stock/StockDetail.tsx:930 -#: src/tables/build/BuildAllocatedStockTable.tsx:121 +#: src/tables/build/BuildAllocatedStockTable.tsx:118 #: src/tables/build/BuildOutputTable.tsx:107 #: src/tables/sales/SalesOrderAllocationTable.tsx:142 msgid "Serial Number" @@ -3034,9 +3041,9 @@ msgstr "" #: src/forms/BuildForms.tsx:240 #: src/forms/BuildForms.tsx:634 #: src/forms/BuildForms.tsx:797 -#: src/forms/PurchaseOrderForms.tsx:801 +#: src/forms/PurchaseOrderForms.tsx:853 #: src/forms/ReturnOrderForms.tsx:243 -#: src/forms/SalesOrderForms.tsx:308 +#: src/forms/SalesOrderForms.tsx:326 #: src/forms/StockForms.tsx:841 #: src/pages/part/PartStockHistoryDetail.tsx:56 #: src/pages/part/PartStockHistoryDetail.tsx:210 @@ -3046,9 +3053,9 @@ msgstr "" #: src/pages/part/pricing/PriceBreakPanel.tsx:172 #: src/pages/stock/StockDetail.tsx:258 #: src/pages/stock/StockDetail.tsx:936 -#: src/tables/build/BuildLineTable.tsx:86 +#: src/tables/build/BuildLineTable.tsx:83 #: src/tables/part/PartPurchaseOrdersTable.tsx:94 -#: src/tables/part/PartTestResultTable.tsx:269 +#: src/tables/part/PartTestResultTable.tsx:277 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:175 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:206 #: src/tables/purchasing/SupplierPriceBreakTable.tsx:69 @@ -3070,7 +3077,7 @@ msgstr "" #: src/forms/StockForms.tsx:1048 #: src/forms/StockForms.tsx:1096 #: src/forms/StockForms.tsx:1140 -#: src/tables/build/BuildLineTable.tsx:96 +#: src/tables/build/BuildLineTable.tsx:93 msgid "Batch" msgstr "" @@ -3755,7 +3762,7 @@ msgid "In Stock" msgstr "" #: src/components/wizards/OrderPartsWizard.tsx:146 -#: src/tables/build/BuildLineTable.tsx:404 +#: src/tables/build/BuildLineTable.tsx:405 msgid "Required Quantity" msgstr "" @@ -3847,7 +3854,7 @@ msgid "Please correct the errors in the selected parts" msgstr "" #: src/components/wizards/OrderPartsWizard.tsx:587 -#: src/tables/build/BuildLineTable.tsx:815 +#: src/tables/build/BuildLineTable.tsx:822 #: src/tables/part/PartTable.tsx:522 #: src/tables/sales/SalesOrderLineItemTable.tsx:370 msgid "Order Parts" @@ -4349,9 +4356,9 @@ msgstr "" #: src/forms/BuildForms.tsx:333 #: src/forms/BuildForms.tsx:408 #: src/forms/BuildForms.tsx:685 -#: src/tables/build/BuildAllocatedStockTable.tsx:150 +#: src/tables/build/BuildAllocatedStockTable.tsx:147 #: src/tables/build/BuildOutputTable.tsx:582 -#: src/tables/part/PartTestResultTable.tsx:272 +#: src/tables/part/PartTestResultTable.tsx:280 msgid "Build Output" msgstr "" @@ -4362,7 +4369,7 @@ msgstr "" #: src/forms/BuildForms.tsx:336 #: src/forms/BuildForms.tsx:411 #: src/forms/BuildForms.tsx:475 -#: src/forms/PurchaseOrderForms.tsx:717 +#: src/forms/PurchaseOrderForms.tsx:769 #: src/forms/ReturnOrderForms.tsx:197 #: src/forms/ReturnOrderForms.tsx:244 #: src/forms/StockForms.tsx:712 @@ -4377,7 +4384,7 @@ msgstr "" #: src/tables/build/BuildOutputTable.tsx:404 #: src/tables/machine/MachineListTable.tsx:387 #: src/tables/part/PartPurchaseOrdersTable.tsx:38 -#: src/tables/part/PartTestResultTable.tsx:309 +#: src/tables/part/PartTestResultTable.tsx:317 #: src/tables/sales/ReturnOrderLineItemTable.tsx:138 #: src/tables/sales/ReturnOrderLineItemTable.tsx:176 #: src/tables/settings/CustomStateTable.tsx:79 @@ -4450,8 +4457,8 @@ msgstr "" #: src/pages/stock/StockDetail.tsx:153 #: src/tables/bom/BomTable.tsx:134 #: src/tables/bom/UsedInTable.tsx:40 -#: src/tables/build/BuildAllocatedStockTable.tsx:108 -#: src/tables/build/BuildLineTable.tsx:336 +#: src/tables/build/BuildAllocatedStockTable.tsx:105 +#: src/tables/build/BuildLineTable.tsx:337 #: src/tables/build/BuildOrderTable.tsx:79 #: src/tables/part/PartSalesAllocationsTable.tsx:61 #: src/tables/part/RelatedPartTable.tsx:73 @@ -4466,47 +4473,47 @@ msgstr "" #: src/forms/BuildForms.tsx:632 #: src/forms/BuildForms.tsx:796 #: src/forms/BuildForms.tsx:897 -#: src/forms/SalesOrderForms.tsx:306 -#: src/tables/build/BuildAllocatedStockTable.tsx:139 -#: src/tables/build/BuildLineTable.tsx:182 +#: src/forms/SalesOrderForms.tsx:324 +#: src/tables/build/BuildAllocatedStockTable.tsx:136 +#: src/tables/build/BuildLineTable.tsx:183 #: src/tables/sales/SalesOrderLineItemTable.tsx:342 #: src/tables/stock/StockItemTable.tsx:338 msgid "Allocated" msgstr "" #: src/forms/BuildForms.tsx:667 -#: src/forms/SalesOrderForms.tsx:295 +#: src/forms/SalesOrderForms.tsx:313 #: src/pages/build/BuildDetail.tsx:108 #: src/pages/build/BuildDetail.tsx:326 msgid "Source Location" msgstr "" #: src/forms/BuildForms.tsx:668 -#: src/forms/SalesOrderForms.tsx:296 +#: src/forms/SalesOrderForms.tsx:314 msgid "Select the source location for the stock allocation" msgstr "" #: src/forms/BuildForms.tsx:700 -#: src/forms/SalesOrderForms.tsx:336 -#: src/tables/build/BuildLineTable.tsx:574 -#: src/tables/build/BuildLineTable.tsx:731 -#: src/tables/build/BuildLineTable.tsx:830 +#: src/forms/SalesOrderForms.tsx:354 +#: src/tables/build/BuildLineTable.tsx:575 +#: src/tables/build/BuildLineTable.tsx:738 +#: src/tables/build/BuildLineTable.tsx:837 #: src/tables/sales/SalesOrderLineItemTable.tsx:380 #: src/tables/sales/SalesOrderLineItemTable.tsx:406 msgid "Allocate Stock" msgstr "" #: src/forms/BuildForms.tsx:703 -#: src/forms/SalesOrderForms.tsx:341 +#: src/forms/SalesOrderForms.tsx:359 msgid "Stock items allocated" msgstr "" #: src/forms/BuildForms.tsx:816 #: src/forms/BuildForms.tsx:917 -#: src/tables/build/BuildAllocatedStockTable.tsx:240 -#: src/tables/build/BuildAllocatedStockTable.tsx:272 -#: src/tables/build/BuildLineTable.tsx:741 -#: src/tables/build/BuildLineTable.tsx:864 +#: src/tables/build/BuildAllocatedStockTable.tsx:243 +#: src/tables/build/BuildAllocatedStockTable.tsx:279 +#: src/tables/build/BuildLineTable.tsx:748 +#: src/tables/build/BuildLineTable.tsx:871 msgid "Consume Stock" msgstr "" @@ -4521,21 +4528,21 @@ msgstr "" #~ msgstr "Stock items consumed" #: src/forms/BuildForms.tsx:853 -#: src/tables/build/BuildLineTable.tsx:514 +#: src/tables/build/BuildLineTable.tsx:515 #: src/tables/part/PartBuildAllocationsTable.tsx:101 msgid "Fully consumed" msgstr "" #: src/forms/BuildForms.tsx:898 -#: src/tables/build/BuildLineTable.tsx:187 +#: src/tables/build/BuildLineTable.tsx:188 #: src/tables/stock/StockItemTable.tsx:367 msgid "Consumed" msgstr "" #: src/forms/CommonForms.tsx:88 -#: src/forms/PurchaseOrderForms.tsx:125 +#: src/forms/PurchaseOrderForms.tsx:176 #: src/forms/ReturnOrderForms.tsx:138 -#: src/forms/SalesOrderForms.tsx:164 +#: src/forms/SalesOrderForms.tsx:182 msgid "Select project code for this line item" msgstr "" @@ -4572,32 +4579,16 @@ msgstr "" msgid "Subscribe to notifications for this category" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:388 -msgid "Assign Batch Code and Serial Numbers" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:390 -msgid "Assign Batch Code" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:410 -msgid "Choose Location" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:418 -msgid "Item Destination selected" -msgstr "" - #: src/forms/PurchaseOrderForms.tsx:421 #~ msgid "Assign Batch Code{0}" #~ msgstr "Assign Batch Code{0}" -#: src/forms/PurchaseOrderForms.tsx:428 -msgid "Part category default location selected" +#: src/forms/PurchaseOrderForms.tsx:440 +msgid "Assign Batch Code and Serial Numbers" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:438 -msgid "Received stock location selected" +#: src/forms/PurchaseOrderForms.tsx:442 +msgid "Assign Batch Code" msgstr "" #: src/forms/PurchaseOrderForms.tsx:444 @@ -4605,94 +4596,110 @@ msgstr "" #~ msgid "Remove item from list" #~ msgstr "Remove item from list" -#: src/forms/PurchaseOrderForms.tsx:446 +#: src/forms/PurchaseOrderForms.tsx:462 +msgid "Choose Location" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:470 +msgid "Item Destination selected" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:480 +msgid "Part category default location selected" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:490 +msgid "Received stock location selected" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:498 msgid "Default location selected" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:507 +#: src/forms/PurchaseOrderForms.tsx:559 msgid "Set Location" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:524 -msgid "Set Expiry Date" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:532 -#: src/forms/StockForms.tsx:693 -msgid "Adjust Packaging" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:540 -#: src/forms/StockForms.tsx:684 -#: src/hooks/UseStockAdjustActions.tsx:148 -msgid "Change Status" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:546 -msgid "Add Note" -msgstr "" - #: src/forms/PurchaseOrderForms.tsx:566 #~ msgid "Serial numbers" #~ msgstr "Serial numbers" +#: src/forms/PurchaseOrderForms.tsx:576 +msgid "Set Expiry Date" +msgstr "" + #: src/forms/PurchaseOrderForms.tsx:582 #~ msgid "Store at line item destination" #~ msgstr "Store at line item destination" -#: src/forms/PurchaseOrderForms.tsx:610 -msgid "Store at default location" +#: src/forms/PurchaseOrderForms.tsx:584 +#: src/forms/StockForms.tsx:693 +msgid "Adjust Packaging" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:625 -msgid "Store at line item destination " +#: src/forms/PurchaseOrderForms.tsx:592 +#: src/forms/StockForms.tsx:684 +#: src/hooks/UseStockAdjustActions.tsx:148 +msgid "Change Status" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:637 -msgid "Store with already received stock" +#: src/forms/PurchaseOrderForms.tsx:598 +msgid "Add Note" msgstr "" #: src/forms/PurchaseOrderForms.tsx:658 #~ msgid "Receive line items" #~ msgstr "Receive line items" -#: src/forms/PurchaseOrderForms.tsx:661 +#: src/forms/PurchaseOrderForms.tsx:662 +msgid "Store at default location" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:677 +msgid "Store at line item destination " +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:689 +msgid "Store with already received stock" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:713 #: src/pages/build/BuildDetail.tsx:340 #: src/pages/stock/StockDetail.tsx:280 #: src/pages/stock/StockDetail.tsx:952 #: src/tables/Filter.tsx:83 -#: src/tables/build/BuildAllocatedStockTable.tsx:128 +#: src/tables/build/BuildAllocatedStockTable.tsx:125 #: src/tables/build/BuildOutputTable.tsx:112 -#: src/tables/part/PartTestResultTable.tsx:260 -#: src/tables/part/PartTestResultTable.tsx:281 +#: src/tables/part/PartTestResultTable.tsx:268 +#: src/tables/part/PartTestResultTable.tsx:289 #: src/tables/sales/SalesOrderAllocationTable.tsx:149 msgid "Batch Code" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:662 +#: src/forms/PurchaseOrderForms.tsx:714 msgid "Enter batch code for received items" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:675 +#: src/forms/PurchaseOrderForms.tsx:727 #: src/forms/StockForms.tsx:218 msgid "Serial Numbers" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:676 +#: src/forms/PurchaseOrderForms.tsx:728 msgid "Enter serial numbers for received items" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:690 +#: src/forms/PurchaseOrderForms.tsx:742 #: src/pages/stock/StockDetail.tsx:382 #: src/tables/stock/StockItemTable.tsx:294 msgid "Expiry Date" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:691 +#: src/forms/PurchaseOrderForms.tsx:743 msgid "Enter an expiry date for received items" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:703 +#: src/forms/PurchaseOrderForms.tsx:755 #: src/forms/StockForms.tsx:728 #: src/pages/company/SupplierPartDetail.tsx:172 #: src/pages/company/SupplierPartDetail.tsx:236 @@ -4701,19 +4708,19 @@ msgstr "" msgid "Packaging" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:727 +#: src/forms/PurchaseOrderForms.tsx:779 #: src/pages/company/SupplierPartDetail.tsx:120 #: src/tables/ColumnRenderers.tsx:332 msgid "Note" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:799 +#: src/forms/PurchaseOrderForms.tsx:851 #: src/pages/company/SupplierPartDetail.tsx:138 #: src/tables/purchasing/SupplierPriceBreakTable.tsx:49 msgid "SKU" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:800 +#: src/forms/PurchaseOrderForms.tsx:852 #: src/tables/part/PartPurchaseOrdersTable.tsx:127 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:213 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:283 @@ -4721,11 +4728,11 @@ msgstr "" msgid "Received" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:817 +#: src/forms/PurchaseOrderForms.tsx:869 msgid "Receive Line Items" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:823 +#: src/forms/PurchaseOrderForms.tsx:875 msgid "Items received" msgstr "" @@ -4737,7 +4744,7 @@ msgstr "" msgid "Item received into stock" msgstr "" -#: src/forms/SalesOrderForms.tsx:401 +#: src/forms/SalesOrderForms.tsx:419 msgid "Leave blank to use the order address" msgstr "" @@ -5932,6 +5939,9 @@ msgstr "" #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:310 #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:401 +#: src/tables/build/BuildAllocatedStockTable.tsx:181 +#: src/tables/build/BuildLineTable.tsx:668 +#: src/tables/sales/SalesOrderAllocationTable.tsx:220 msgid "Confirm Removal" msgstr "" @@ -6870,8 +6880,8 @@ msgstr "" #: src/pages/sales/ReturnOrderDetail.tsx:108 #: src/pages/sales/SalesOrderDetail.tsx:98 #: src/tables/ColumnRenderers.tsx:321 -#: src/tables/build/BuildAllocatedStockTable.tsx:115 -#: src/tables/build/BuildLineTable.tsx:352 +#: src/tables/build/BuildAllocatedStockTable.tsx:112 +#: src/tables/build/BuildLineTable.tsx:353 msgid "Reference" msgstr "" @@ -7132,7 +7142,7 @@ msgstr "" #: src/pages/build/BuildDetail.tsx:742 #: src/pages/stock/StockDetail.tsx:344 -#: src/tables/build/BuildAllocatedStockTable.tsx:85 +#: src/tables/build/BuildAllocatedStockTable.tsx:82 #: src/tables/part/PartBuildAllocationsTable.tsx:45 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:157 #: src/tables/stock/StockTrackingTable.tsx:109 @@ -7600,7 +7610,7 @@ msgstr "" #: src/pages/part/PartDetail.tsx:542 #: src/tables/bom/BomTable.tsx:439 -#: src/tables/build/BuildLineTable.tsx:305 +#: src/tables/build/BuildLineTable.tsx:306 #: src/tables/part/PartTable.tsx:319 #: src/tables/sales/SalesOrderLineItemTable.tsx:138 msgid "Available Stock" @@ -7608,7 +7618,7 @@ msgstr "" #: src/pages/part/PartDetail.tsx:548 #: src/tables/bom/BomTable.tsx:341 -#: src/tables/build/BuildLineTable.tsx:267 +#: src/tables/build/BuildLineTable.tsx:268 #: src/tables/sales/SalesOrderLineItemTable.tsx:180 msgid "On order" msgstr "" @@ -7782,7 +7792,7 @@ msgstr "" #: src/pages/part/PartDetail.tsx:1144 #: src/pages/stock/StockDetail.tsx:884 -#: src/tables/build/BuildLineTable.tsx:761 +#: src/tables/build/BuildLineTable.tsx:768 msgid "Order Stock" msgstr "" @@ -9219,13 +9229,13 @@ msgstr "" #~ msgstr "Show asssmbled items" #: src/tables/bom/BomTable.tsx:315 -#: src/tables/build/BuildLineTable.tsx:276 +#: src/tables/build/BuildLineTable.tsx:277 #: src/tables/part/PartTable.tsx:145 msgid "External stock" msgstr "" #: src/tables/bom/BomTable.tsx:323 -#: src/tables/build/BuildLineTable.tsx:239 +#: src/tables/build/BuildLineTable.tsx:240 msgid "Includes substitute stock" msgstr "" @@ -9234,7 +9244,7 @@ msgstr "" #~ msgstr "Edit Bom Item" #: src/tables/bom/BomTable.tsx:332 -#: src/tables/build/BuildLineTable.tsx:249 +#: src/tables/build/BuildLineTable.tsx:250 #: src/tables/sales/SalesOrderLineItemTable.tsx:166 msgid "Includes variant stock" msgstr "" @@ -9272,8 +9282,8 @@ msgid "Stock Information" msgstr "" #: src/tables/bom/BomTable.tsx:399 -#: src/tables/build/BuildLineTable.tsx:496 -#: src/tables/build/BuildLineTable.tsx:537 +#: src/tables/build/BuildLineTable.tsx:497 +#: src/tables/build/BuildLineTable.tsx:538 msgid "Consumable item" msgstr "" @@ -9282,7 +9292,7 @@ msgid "No available stock" msgstr "" #: src/tables/bom/BomTable.tsx:420 -#: src/tables/build/BuildLineTable.tsx:213 +#: src/tables/build/BuildLineTable.tsx:214 msgid "Show testable items" msgstr "" @@ -9291,7 +9301,7 @@ msgid "Show trackable items" msgstr "" #: src/tables/bom/BomTable.tsx:430 -#: src/tables/build/BuildLineTable.tsx:208 +#: src/tables/build/BuildLineTable.tsx:209 msgid "Show assembled items" msgstr "" @@ -9335,7 +9345,7 @@ msgstr "" #: src/tables/bom/BomTable.tsx:464 #: src/tables/bom/UsedInTable.tsx:85 -#: src/tables/build/BuildLineTable.tsx:202 +#: src/tables/build/BuildLineTable.tsx:203 msgid "Optional" msgstr "" @@ -9345,7 +9355,7 @@ msgid "Show optional items" msgstr "" #: src/tables/bom/BomTable.tsx:469 -#: src/tables/build/BuildLineTable.tsx:197 +#: src/tables/build/BuildLineTable.tsx:198 msgid "Consumable" msgstr "" @@ -9433,7 +9443,7 @@ msgid "Bill of materials cannot be edited, as the part is locked" msgstr "" #: src/tables/bom/UsedInTable.tsx:34 -#: src/tables/build/BuildLineTable.tsx:207 +#: src/tables/build/BuildLineTable.tsx:208 #: src/tables/part/ParametricPartTable.tsx:364 #: src/tables/part/PartBuildAllocationsTable.tsx:60 #: src/tables/part/PartTable.tsx:209 @@ -9455,11 +9465,11 @@ msgstr "" msgid "Show trackable assemblies" msgstr "" -#: src/tables/build/BuildAllocatedStockTable.tsx:67 +#: src/tables/build/BuildAllocatedStockTable.tsx:64 msgid "Allocated to Output" msgstr "" -#: src/tables/build/BuildAllocatedStockTable.tsx:68 +#: src/tables/build/BuildAllocatedStockTable.tsx:65 msgid "Show items allocated to a build output" msgstr "" @@ -9472,7 +9482,7 @@ msgstr "" #~ msgid "Include orders for part variants" #~ msgstr "Include orders for part variants" -#: src/tables/build/BuildAllocatedStockTable.tsx:97 +#: src/tables/build/BuildAllocatedStockTable.tsx:94 #: src/tables/part/PartBuildAllocationsTable.tsx:84 #: src/tables/part/PartPurchaseOrdersTable.tsx:132 #: src/tables/part/PartSalesAllocationsTable.tsx:69 @@ -9482,40 +9492,58 @@ msgid "Order Status" msgstr "" #: src/tables/build/BuildAllocatedStockTable.tsx:164 -#~ msgid "Edit Build Item" -#~ msgstr "Edit Build Item" - -#: src/tables/build/BuildAllocatedStockTable.tsx:167 -#: src/tables/build/BuildLineTable.tsx:650 +#: src/tables/build/BuildLineTable.tsx:651 msgid "Edit Stock Allocation" msgstr "" +#: src/tables/build/BuildAllocatedStockTable.tsx:164 +#~ msgid "Edit Build Item" +#~ msgstr "Edit Build Item" + #: src/tables/build/BuildAllocatedStockTable.tsx:174 #~ msgid "Delete Build Item" #~ msgstr "Delete Build Item" -#: src/tables/build/BuildAllocatedStockTable.tsx:180 -#: src/tables/build/BuildLineTable.tsx:663 -msgid "Delete Stock Allocation" +#: src/tables/build/BuildAllocatedStockTable.tsx:177 +#: src/tables/build/BuildLineTable.tsx:664 +#: src/tables/sales/SalesOrderAllocationTable.tsx:218 +msgid "Remove Allocated Stock" msgstr "" -#: src/tables/build/BuildAllocatedStockTable.tsx:239 +#: src/tables/build/BuildAllocatedStockTable.tsx:180 +#: src/tables/build/BuildLineTable.tsx:663 +#~ msgid "Delete Stock Allocation" +#~ msgstr "Delete Stock Allocation" + +#: src/tables/build/BuildAllocatedStockTable.tsx:182 +#: src/tables/build/BuildLineTable.tsx:669 +#: src/tables/sales/SalesOrderAllocationTable.tsx:221 +msgid "Are you sure you want to remove this allocated stock from the order?" +msgstr "" + +#: src/tables/build/BuildAllocatedStockTable.tsx:242 msgid "Consume" msgstr "" +#: src/tables/build/BuildAllocatedStockTable.tsx:259 +#: src/tables/build/BuildLineTable.tsx:112 +#: src/tables/sales/SalesOrderAllocationTable.tsx:248 +msgid "Remove allocated stock" +msgstr "" + #: src/tables/build/BuildLineTable.tsx:59 #~ msgid "Show lines with available stock" #~ msgstr "Show lines with available stock" -#: src/tables/build/BuildLineTable.tsx:120 +#: src/tables/build/BuildLineTable.tsx:121 msgid "View Stock Item" msgstr "" -#: src/tables/build/BuildLineTable.tsx:183 +#: src/tables/build/BuildLineTable.tsx:184 msgid "Show fully allocated lines" msgstr "" -#: src/tables/build/BuildLineTable.tsx:188 +#: src/tables/build/BuildLineTable.tsx:189 msgid "Show fully consumed lines" msgstr "" @@ -9523,124 +9551,124 @@ msgstr "" #~ msgid "Show allocated lines" #~ msgstr "Show allocated lines" -#: src/tables/build/BuildLineTable.tsx:193 +#: src/tables/build/BuildLineTable.tsx:194 msgid "Show items with sufficient available stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:198 +#: src/tables/build/BuildLineTable.tsx:199 msgid "Show consumable lines" msgstr "" -#: src/tables/build/BuildLineTable.tsx:203 +#: src/tables/build/BuildLineTable.tsx:204 msgid "Show optional lines" msgstr "" -#: src/tables/build/BuildLineTable.tsx:212 +#: src/tables/build/BuildLineTable.tsx:213 #: src/tables/part/PartTable.tsx:233 msgid "Testable" msgstr "" -#: src/tables/build/BuildLineTable.tsx:217 +#: src/tables/build/BuildLineTable.tsx:218 #: src/tables/stock/StockItemTable.tsx:388 msgid "Tracked" msgstr "" -#: src/tables/build/BuildLineTable.tsx:218 +#: src/tables/build/BuildLineTable.tsx:219 msgid "Show tracked lines" msgstr "" -#: src/tables/build/BuildLineTable.tsx:223 +#: src/tables/build/BuildLineTable.tsx:224 msgid "Show items with stock on order" msgstr "" -#: src/tables/build/BuildLineTable.tsx:258 +#: src/tables/build/BuildLineTable.tsx:259 #: src/tables/sales/SalesOrderLineItemTable.tsx:172 msgid "In production" msgstr "" -#: src/tables/build/BuildLineTable.tsx:286 +#: src/tables/build/BuildLineTable.tsx:287 msgid "Insufficient stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:302 +#: src/tables/build/BuildLineTable.tsx:303 #: src/tables/sales/SalesOrderLineItemTable.tsx:160 #: src/tables/stock/StockItemTable.tsx:191 msgid "No stock available" msgstr "" -#: src/tables/build/BuildLineTable.tsx:375 +#: src/tables/build/BuildLineTable.tsx:376 msgid "Gets Inherited" msgstr "" -#: src/tables/build/BuildLineTable.tsx:388 +#: src/tables/build/BuildLineTable.tsx:389 msgid "Unit Quantity" msgstr "" -#: src/tables/build/BuildLineTable.tsx:415 +#: src/tables/build/BuildLineTable.tsx:416 msgid "Setup Quantity" msgstr "" -#: src/tables/build/BuildLineTable.tsx:424 +#: src/tables/build/BuildLineTable.tsx:425 msgid "Attrition" msgstr "" -#: src/tables/build/BuildLineTable.tsx:432 +#: src/tables/build/BuildLineTable.tsx:433 msgid "Rounding Multiple" msgstr "" -#: src/tables/build/BuildLineTable.tsx:441 +#: src/tables/build/BuildLineTable.tsx:442 msgid "BOM Information" msgstr "" -#: src/tables/build/BuildLineTable.tsx:515 +#: src/tables/build/BuildLineTable.tsx:516 #: src/tables/part/PartBuildAllocationsTable.tsx:102 msgid "Fully allocated" msgstr "" -#: src/tables/build/BuildLineTable.tsx:563 +#: src/tables/build/BuildLineTable.tsx:564 #: src/tables/sales/SalesOrderLineItemTable.tsx:311 msgid "Create Build Order" msgstr "" -#: src/tables/build/BuildLineTable.tsx:592 +#: src/tables/build/BuildLineTable.tsx:593 msgid "Auto allocation in progress" msgstr "" -#: src/tables/build/BuildLineTable.tsx:595 -#: src/tables/build/BuildLineTable.tsx:802 +#: src/tables/build/BuildLineTable.tsx:596 +#: src/tables/build/BuildLineTable.tsx:809 msgid "Auto Allocate Stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:596 +#: src/tables/build/BuildLineTable.tsx:597 msgid "Automatically allocate stock to this build according to the selected options" msgstr "" -#: src/tables/build/BuildLineTable.tsx:616 -#: src/tables/build/BuildLineTable.tsx:630 -#: src/tables/build/BuildLineTable.tsx:751 -#: src/tables/build/BuildLineTable.tsx:852 +#: src/tables/build/BuildLineTable.tsx:617 +#: src/tables/build/BuildLineTable.tsx:631 +#: src/tables/build/BuildLineTable.tsx:758 +#: src/tables/build/BuildLineTable.tsx:859 #: src/tables/build/BuildOutputTable.tsx:355 #: src/tables/build/BuildOutputTable.tsx:360 msgid "Deallocate Stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:632 +#: src/tables/build/BuildLineTable.tsx:633 msgid "Deallocate all untracked stock for this build order" msgstr "" -#: src/tables/build/BuildLineTable.tsx:634 +#: src/tables/build/BuildLineTable.tsx:635 msgid "Deallocate stock from the selected line item" msgstr "" -#: src/tables/build/BuildLineTable.tsx:638 +#: src/tables/build/BuildLineTable.tsx:639 msgid "Stock has been deallocated" msgstr "" -#: src/tables/build/BuildLineTable.tsx:771 +#: src/tables/build/BuildLineTable.tsx:778 msgid "Build Stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:784 +#: src/tables/build/BuildLineTable.tsx:791 #: src/tables/sales/SalesOrderLineItemTable.tsx:487 msgid "View Part" msgstr "" @@ -9739,7 +9767,7 @@ msgid "Serialize Build Output" msgstr "" #: src/tables/build/BuildOutputTable.tsx:405 -#: src/tables/part/PartTestResultTable.tsx:310 +#: src/tables/part/PartTestResultTable.tsx:318 #: src/tables/stock/StockItemTable.tsx:328 msgid "Filter by stock status" msgstr "" @@ -9964,8 +9992,8 @@ msgid "View Item" msgstr "" #: src/tables/general/ExtraLineItemTable.tsx:95 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:299 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:403 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:300 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:405 #: src/tables/sales/ReturnOrderLineItemTable.tsx:83 #: src/tables/sales/ReturnOrderLineItemTable.tsx:187 #: src/tables/sales/SalesOrderLineItemTable.tsx:252 @@ -9974,14 +10002,14 @@ msgid "Add Line Item" msgstr "" #: src/tables/general/ExtraLineItemTable.tsx:108 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:320 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:322 #: src/tables/sales/ReturnOrderLineItemTable.tsx:96 #: src/tables/sales/SalesOrderLineItemTable.tsx:271 msgid "Edit Line Item" msgstr "" #: src/tables/general/ExtraLineItemTable.tsx:117 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:329 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:331 #: src/tables/sales/ReturnOrderLineItemTable.tsx:105 #: src/tables/sales/SalesOrderLineItemTable.tsx:280 msgid "Delete Line Item" @@ -10273,7 +10301,7 @@ msgid "Required Stock" msgstr "" #: src/tables/part/PartBuildAllocationsTable.tsx:124 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:381 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:383 msgid "View Build Order" msgstr "" @@ -10617,8 +10645,8 @@ msgstr "" #: src/tables/part/PartTestResultTable.tsx:103 #: src/tables/part/PartTestResultTable.tsx:181 -#: src/tables/part/PartTestResultTable.tsx:320 -#: src/tables/part/PartTestResultTable.tsx:334 +#: src/tables/part/PartTestResultTable.tsx:328 +#: src/tables/part/PartTestResultTable.tsx:342 #: src/tables/stock/StockItemTestResultTable.tsx:296 #: src/tables/stock/StockItemTestResultTable.tsx:368 #: src/tables/stock/StockItemTestResultTable.tsx:429 @@ -10643,7 +10671,7 @@ msgstr "" msgid "No Result" msgstr "" -#: src/tables/part/PartTestResultTable.tsx:298 +#: src/tables/part/PartTestResultTable.tsx:306 msgid "Show build outputs currently in production" msgstr "" @@ -11073,7 +11101,7 @@ msgid "Show manufacturer parts for active manufacturers." msgstr "" #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:115 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:397 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:399 msgid "Import Line Items" msgstr "" @@ -11099,11 +11127,11 @@ msgstr "" #~ msgid "Add line item" #~ msgstr "Add line item" -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:350 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:352 msgid "Receive line item" msgstr "" -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:414 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:416 msgid "Receive items" msgstr "" @@ -11201,25 +11229,25 @@ msgid "Not shipped" msgstr "" #: src/tables/sales/SalesOrderAllocationTable.tsx:211 -#: src/tables/sales/SalesOrderAllocationTable.tsx:229 +#: src/tables/sales/SalesOrderAllocationTable.tsx:235 msgid "Edit Allocation" msgstr "" #: src/tables/sales/SalesOrderAllocationTable.tsx:218 #: src/tables/sales/SalesOrderAllocationTable.tsx:241 -msgid "Delete Allocation" -msgstr "" +#~ msgid "Delete Allocation" +#~ msgstr "Delete Allocation" -#: src/tables/sales/SalesOrderAllocationTable.tsx:252 -#: src/tables/sales/SalesOrderAllocationTable.tsx:253 +#: src/tables/sales/SalesOrderAllocationTable.tsx:261 +#: src/tables/sales/SalesOrderAllocationTable.tsx:262 msgid "View Shipment" msgstr "" -#: src/tables/sales/SalesOrderAllocationTable.tsx:308 +#: src/tables/sales/SalesOrderAllocationTable.tsx:317 msgid "Assign to Shipment" msgstr "" -#: src/tables/sales/SalesOrderAllocationTable.tsx:324 +#: src/tables/sales/SalesOrderAllocationTable.tsx:333 msgid "Assign to shipment" msgstr "" diff --git a/src/frontend/src/locales/hu/messages.po b/src/frontend/src/locales/hu/messages.po index 2a2d2f08aa..2f3b988e6f 100644 --- a/src/frontend/src/locales/hu/messages.po +++ b/src/frontend/src/locales/hu/messages.po @@ -8,7 +8,7 @@ msgstr "" "Language: hu\n" "Project-Id-Version: inventree\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2025-11-19 19:39\n" +"PO-Revision-Date: 2025-11-22 06:25\n" "Last-Translator: \n" "Language-Team: Hungarian\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" @@ -56,7 +56,7 @@ msgstr "Mégsem" #: lib/components/RowActions.tsx:136 #: src/components/nav/NavigationDrawer.tsx:190 -#: src/forms/PurchaseOrderForms.tsx:802 +#: src/forms/PurchaseOrderForms.tsx:854 #: src/forms/StockForms.tsx:796 #: src/forms/StockForms.tsx:843 #: src/forms/StockForms.tsx:889 @@ -103,9 +103,9 @@ msgstr "Nem" #: src/forms/BuildForms.tsx:630 #: src/forms/BuildForms.tsx:793 #: src/forms/BuildForms.tsx:896 -#: src/forms/PurchaseOrderForms.tsx:798 +#: src/forms/PurchaseOrderForms.tsx:850 #: src/forms/ReturnOrderForms.tsx:242 -#: src/forms/SalesOrderForms.tsx:305 +#: src/forms/SalesOrderForms.tsx:323 #: src/forms/StockForms.tsx:360 #: src/forms/StockForms.tsx:791 #: src/forms/StockForms.tsx:838 @@ -119,6 +119,7 @@ msgstr "Nem" #: src/pages/build/BuildDetail.tsx:200 #: src/pages/part/PartDetail.tsx:1207 #: src/tables/ColumnRenderers.tsx:91 +#: src/tables/part/PartTestResultTable.tsx:247 #: src/tables/part/RelatedPartTable.tsx:53 #: src/tables/stock/StockTrackingTable.tsx:87 msgid "Part" @@ -158,7 +159,7 @@ msgstr "Alkatrész Teszt Sablonok" #: src/components/wizards/OrderPartsWizard.tsx:290 #: src/pages/company/SupplierPartDetail.tsx:413 #: src/pages/stock/StockDetail.tsx:289 -#: src/tables/build/BuildAllocatedStockTable.tsx:155 +#: src/tables/build/BuildAllocatedStockTable.tsx:152 #: src/tables/part/PartPurchaseOrdersTable.tsx:50 #: src/tables/purchasing/SupplierPartTable.tsx:83 #: src/tables/stock/StockItemTable.tsx:247 @@ -201,9 +202,9 @@ msgstr "Alkatrész kategóriák" #: src/forms/BuildForms.tsx:473 #: src/forms/BuildForms.tsx:633 #: src/forms/BuildForms.tsx:794 -#: src/forms/SalesOrderForms.tsx:307 +#: src/forms/SalesOrderForms.tsx:325 #: src/pages/stock/StockDetail.tsx:1005 -#: src/tables/part/PartTestResultTable.tsx:248 +#: src/tables/part/PartTestResultTable.tsx:256 #: src/tables/stock/StockTrackingTable.tsx:48 #: src/tables/stock/StockTrackingTable.tsx:55 msgid "Stock Item" @@ -517,7 +518,7 @@ msgstr "Választéklisták" #: src/components/dashboard/DashboardLayout.tsx:281 #: src/components/editors/NotesEditor.tsx:74 #: src/components/editors/TemplateEditor/TemplateEditor.tsx:158 -#: src/components/forms/fields/ApiFormField.tsx:273 +#: src/components/forms/fields/ApiFormField.tsx:237 #: src/components/forms/fields/TableField.tsx:45 #: src/components/importer/ImportDataSelector.tsx:192 #: src/components/importer/ImporterColumnSelector.tsx:234 @@ -642,8 +643,8 @@ msgstr "Add meg a vonalkódot" #: src/components/barcodes/BarcodeScanDialog.tsx:49 #: src/components/buttons/ScanButton.tsx:15 #: src/components/nav/NavigationDrawer.tsx:122 -#: src/forms/PurchaseOrderForms.tsx:457 -#: src/forms/PurchaseOrderForms.tsx:563 +#: src/forms/PurchaseOrderForms.tsx:509 +#: src/forms/PurchaseOrderForms.tsx:615 msgid "Scan Barcode" msgstr "Vonalkód beolvasás" @@ -728,7 +729,7 @@ msgstr "A hozzárendelt vonalkód kapcsolat megszüntetése" #: src/components/barcodes/QRCode.tsx:205 #: src/components/items/ActionDropdown.tsx:192 -#: src/forms/PurchaseOrderForms.tsx:554 +#: src/forms/PurchaseOrderForms.tsx:606 msgid "Unlink Barcode" msgstr "Vonalkód leválasztása" @@ -1216,6 +1217,12 @@ msgstr "Tételhez rendelt kép eltávolítása?" #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:884 #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:903 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:254 +#: src/tables/build/BuildAllocatedStockTable.tsx:178 +#: src/tables/build/BuildAllocatedStockTable.tsx:258 +#: src/tables/build/BuildLineTable.tsx:111 +#: src/tables/build/BuildLineTable.tsx:665 +#: src/tables/sales/SalesOrderAllocationTable.tsx:224 +#: src/tables/sales/SalesOrderAllocationTable.tsx:247 msgid "Remove" msgstr "Eltávolítás" @@ -1241,7 +1248,7 @@ msgid "Upload Error" msgstr "Feltöltési Hiba" #: src/components/details/DetailsImage.tsx:250 -#: src/components/forms/fields/TextField.tsx:65 +#: src/components/forms/fields/AutoFillRightSection.tsx:34 msgid "Clear" msgstr "Törlés" @@ -1817,10 +1824,14 @@ msgstr "Leállítva" msgid "Running" msgstr "Fut" -#: src/components/forms/fields/ApiFormField.tsx:233 +#: src/components/forms/fields/ApiFormField.tsx:197 msgid "Select file to upload" msgstr "" +#: src/components/forms/fields/AutoFillRightSection.tsx:47 +msgid "Accept suggested value" +msgstr "" + #: src/components/forms/fields/DateField.tsx:76 msgid "Select date" msgstr "" @@ -1875,10 +1886,6 @@ msgstr "Nincs elérhető bejegyzés" msgid "Add new row" msgstr "Új sor hozzáadása" -#: src/components/forms/fields/TextField.tsx:82 -msgid "Accept suggested value" -msgstr "" - #: src/components/images/DetailsImage.tsx:252 #~ msgid "Select image" #~ msgstr "Select image" @@ -2225,8 +2232,8 @@ msgstr "Nincsenek tételek" #: src/pages/part/PartDetail.tsx:994 #: src/pages/stock/StockDetail.tsx:265 #: src/pages/stock/StockDetail.tsx:942 -#: src/tables/build/BuildAllocatedStockTable.tsx:135 -#: src/tables/build/BuildLineTable.tsx:192 +#: src/tables/build/BuildAllocatedStockTable.tsx:132 +#: src/tables/build/BuildLineTable.tsx:193 #: src/tables/part/PartTable.tsx:137 #: src/tables/stock/StockItemTable.tsx:182 #: src/tables/stock/StockItemTable.tsx:343 @@ -2784,7 +2791,7 @@ msgstr "Plugin információ" #: src/pages/sales/SalesOrderDetail.tsx:119 #: src/pages/stock/LocationDetail.tsx:102 #: src/tables/ColumnRenderers.tsx:278 -#: src/tables/build/BuildAllocatedStockTable.tsx:91 +#: src/tables/build/BuildAllocatedStockTable.tsx:88 #: src/tables/machine/MachineTypeTable.tsx:161 #: src/tables/machine/MachineTypeTable.tsx:257 #: src/tables/plugin/PluginListTable.tsx:110 @@ -2966,7 +2973,7 @@ msgstr "Nincs készlet" #: src/pages/company/SupplierPartDetail.tsx:394 #: src/pages/part/PartDetail.tsx:1015 #: src/tables/bom/BomTable.tsx:444 -#: src/tables/build/BuildLineTable.tsx:222 +#: src/tables/build/BuildLineTable.tsx:223 #: src/tables/part/PartTable.tsx:108 msgid "On Order" msgstr "Rendelve" @@ -2976,7 +2983,7 @@ msgstr "Rendelve" #: src/pages/part/PartDetail.tsx:587 #: src/pages/part/PartDetail.tsx:1021 #: src/pages/stock/StockDetail.tsx:925 -#: src/tables/part/PartTestResultTable.tsx:297 +#: src/tables/part/PartTestResultTable.tsx:305 #: src/tables/stock/StockItemTable.tsx:359 msgid "In Production" msgstr "Gyártásban" @@ -3000,7 +3007,7 @@ msgstr "Kategória" #: src/components/render/Stock.tsx:114 #: src/components/render/Stock.tsx:132 #: src/forms/BuildForms.tsx:795 -#: src/forms/PurchaseOrderForms.tsx:595 +#: src/forms/PurchaseOrderForms.tsx:647 #: src/forms/StockForms.tsx:792 #: src/forms/StockForms.tsx:839 #: src/forms/StockForms.tsx:885 @@ -3023,7 +3030,7 @@ msgstr "Hely" #: src/components/render/Stock.tsx:99 #: src/pages/stock/StockDetail.tsx:198 #: src/pages/stock/StockDetail.tsx:930 -#: src/tables/build/BuildAllocatedStockTable.tsx:121 +#: src/tables/build/BuildAllocatedStockTable.tsx:118 #: src/tables/build/BuildOutputTable.tsx:107 #: src/tables/sales/SalesOrderAllocationTable.tsx:142 msgid "Serial Number" @@ -3034,9 +3041,9 @@ msgstr "Sorozatszám" #: src/forms/BuildForms.tsx:240 #: src/forms/BuildForms.tsx:634 #: src/forms/BuildForms.tsx:797 -#: src/forms/PurchaseOrderForms.tsx:801 +#: src/forms/PurchaseOrderForms.tsx:853 #: src/forms/ReturnOrderForms.tsx:243 -#: src/forms/SalesOrderForms.tsx:308 +#: src/forms/SalesOrderForms.tsx:326 #: src/forms/StockForms.tsx:841 #: src/pages/part/PartStockHistoryDetail.tsx:56 #: src/pages/part/PartStockHistoryDetail.tsx:210 @@ -3046,9 +3053,9 @@ msgstr "Sorozatszám" #: src/pages/part/pricing/PriceBreakPanel.tsx:172 #: src/pages/stock/StockDetail.tsx:258 #: src/pages/stock/StockDetail.tsx:936 -#: src/tables/build/BuildLineTable.tsx:86 +#: src/tables/build/BuildLineTable.tsx:83 #: src/tables/part/PartPurchaseOrdersTable.tsx:94 -#: src/tables/part/PartTestResultTable.tsx:269 +#: src/tables/part/PartTestResultTable.tsx:277 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:175 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:206 #: src/tables/purchasing/SupplierPriceBreakTable.tsx:69 @@ -3070,7 +3077,7 @@ msgstr "Mennyiség" #: src/forms/StockForms.tsx:1048 #: src/forms/StockForms.tsx:1096 #: src/forms/StockForms.tsx:1140 -#: src/tables/build/BuildLineTable.tsx:96 +#: src/tables/build/BuildLineTable.tsx:93 msgid "Batch" msgstr "Köteg" @@ -3755,7 +3762,7 @@ msgid "In Stock" msgstr "Készleten" #: src/components/wizards/OrderPartsWizard.tsx:146 -#: src/tables/build/BuildLineTable.tsx:404 +#: src/tables/build/BuildLineTable.tsx:405 msgid "Required Quantity" msgstr "Szükséges mennyiség" @@ -3847,7 +3854,7 @@ msgid "Please correct the errors in the selected parts" msgstr "" #: src/components/wizards/OrderPartsWizard.tsx:587 -#: src/tables/build/BuildLineTable.tsx:815 +#: src/tables/build/BuildLineTable.tsx:822 #: src/tables/part/PartTable.tsx:522 #: src/tables/sales/SalesOrderLineItemTable.tsx:370 msgid "Order Parts" @@ -4349,9 +4356,9 @@ msgstr "" #: src/forms/BuildForms.tsx:333 #: src/forms/BuildForms.tsx:408 #: src/forms/BuildForms.tsx:685 -#: src/tables/build/BuildAllocatedStockTable.tsx:150 +#: src/tables/build/BuildAllocatedStockTable.tsx:147 #: src/tables/build/BuildOutputTable.tsx:582 -#: src/tables/part/PartTestResultTable.tsx:272 +#: src/tables/part/PartTestResultTable.tsx:280 msgid "Build Output" msgstr "Gyártás kimenet" @@ -4362,7 +4369,7 @@ msgstr "" #: src/forms/BuildForms.tsx:336 #: src/forms/BuildForms.tsx:411 #: src/forms/BuildForms.tsx:475 -#: src/forms/PurchaseOrderForms.tsx:717 +#: src/forms/PurchaseOrderForms.tsx:769 #: src/forms/ReturnOrderForms.tsx:197 #: src/forms/ReturnOrderForms.tsx:244 #: src/forms/StockForms.tsx:712 @@ -4377,7 +4384,7 @@ msgstr "" #: src/tables/build/BuildOutputTable.tsx:404 #: src/tables/machine/MachineListTable.tsx:387 #: src/tables/part/PartPurchaseOrdersTable.tsx:38 -#: src/tables/part/PartTestResultTable.tsx:309 +#: src/tables/part/PartTestResultTable.tsx:317 #: src/tables/sales/ReturnOrderLineItemTable.tsx:138 #: src/tables/sales/ReturnOrderLineItemTable.tsx:176 #: src/tables/settings/CustomStateTable.tsx:79 @@ -4450,8 +4457,8 @@ msgstr "" #: src/pages/stock/StockDetail.tsx:153 #: src/tables/bom/BomTable.tsx:134 #: src/tables/bom/UsedInTable.tsx:40 -#: src/tables/build/BuildAllocatedStockTable.tsx:108 -#: src/tables/build/BuildLineTable.tsx:336 +#: src/tables/build/BuildAllocatedStockTable.tsx:105 +#: src/tables/build/BuildLineTable.tsx:337 #: src/tables/build/BuildOrderTable.tsx:79 #: src/tables/part/PartSalesAllocationsTable.tsx:61 #: src/tables/part/RelatedPartTable.tsx:73 @@ -4466,47 +4473,47 @@ msgstr "IPN" #: src/forms/BuildForms.tsx:632 #: src/forms/BuildForms.tsx:796 #: src/forms/BuildForms.tsx:897 -#: src/forms/SalesOrderForms.tsx:306 -#: src/tables/build/BuildAllocatedStockTable.tsx:139 -#: src/tables/build/BuildLineTable.tsx:182 +#: src/forms/SalesOrderForms.tsx:324 +#: src/tables/build/BuildAllocatedStockTable.tsx:136 +#: src/tables/build/BuildLineTable.tsx:183 #: src/tables/sales/SalesOrderLineItemTable.tsx:342 #: src/tables/stock/StockItemTable.tsx:338 msgid "Allocated" msgstr "Lefoglalva" #: src/forms/BuildForms.tsx:667 -#: src/forms/SalesOrderForms.tsx:295 +#: src/forms/SalesOrderForms.tsx:313 #: src/pages/build/BuildDetail.tsx:108 #: src/pages/build/BuildDetail.tsx:326 msgid "Source Location" msgstr "Készlet helye" #: src/forms/BuildForms.tsx:668 -#: src/forms/SalesOrderForms.tsx:296 +#: src/forms/SalesOrderForms.tsx:314 msgid "Select the source location for the stock allocation" msgstr "A készlet hozzárendelés forrás készlethelyének kiválasztása" #: src/forms/BuildForms.tsx:700 -#: src/forms/SalesOrderForms.tsx:336 -#: src/tables/build/BuildLineTable.tsx:574 -#: src/tables/build/BuildLineTable.tsx:731 -#: src/tables/build/BuildLineTable.tsx:830 +#: src/forms/SalesOrderForms.tsx:354 +#: src/tables/build/BuildLineTable.tsx:575 +#: src/tables/build/BuildLineTable.tsx:738 +#: src/tables/build/BuildLineTable.tsx:837 #: src/tables/sales/SalesOrderLineItemTable.tsx:380 #: src/tables/sales/SalesOrderLineItemTable.tsx:406 msgid "Allocate Stock" msgstr "Készlet foglalása" #: src/forms/BuildForms.tsx:703 -#: src/forms/SalesOrderForms.tsx:341 +#: src/forms/SalesOrderForms.tsx:359 msgid "Stock items allocated" msgstr "Készlet lefoglalva" #: src/forms/BuildForms.tsx:816 #: src/forms/BuildForms.tsx:917 -#: src/tables/build/BuildAllocatedStockTable.tsx:240 -#: src/tables/build/BuildAllocatedStockTable.tsx:272 -#: src/tables/build/BuildLineTable.tsx:741 -#: src/tables/build/BuildLineTable.tsx:864 +#: src/tables/build/BuildAllocatedStockTable.tsx:243 +#: src/tables/build/BuildAllocatedStockTable.tsx:279 +#: src/tables/build/BuildLineTable.tsx:748 +#: src/tables/build/BuildLineTable.tsx:871 msgid "Consume Stock" msgstr "" @@ -4521,21 +4528,21 @@ msgstr "" #~ msgstr "Stock items consumed" #: src/forms/BuildForms.tsx:853 -#: src/tables/build/BuildLineTable.tsx:514 +#: src/tables/build/BuildLineTable.tsx:515 #: src/tables/part/PartBuildAllocationsTable.tsx:101 msgid "Fully consumed" msgstr "Teljesen elfogyasztva" #: src/forms/BuildForms.tsx:898 -#: src/tables/build/BuildLineTable.tsx:187 +#: src/tables/build/BuildLineTable.tsx:188 #: src/tables/stock/StockItemTable.tsx:367 msgid "Consumed" msgstr "Elhasználva" #: src/forms/CommonForms.tsx:88 -#: src/forms/PurchaseOrderForms.tsx:125 +#: src/forms/PurchaseOrderForms.tsx:176 #: src/forms/ReturnOrderForms.tsx:138 -#: src/forms/SalesOrderForms.tsx:164 +#: src/forms/SalesOrderForms.tsx:182 msgid "Select project code for this line item" msgstr "" @@ -4572,32 +4579,16 @@ msgstr "Felsőbb szintű alkatrész kategória" msgid "Subscribe to notifications for this category" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:388 -msgid "Assign Batch Code and Serial Numbers" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:390 -msgid "Assign Batch Code" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:410 -msgid "Choose Location" -msgstr "Hely kiválasztása" - -#: src/forms/PurchaseOrderForms.tsx:418 -msgid "Item Destination selected" -msgstr "" - #: src/forms/PurchaseOrderForms.tsx:421 #~ msgid "Assign Batch Code{0}" #~ msgstr "Assign Batch Code{0}" -#: src/forms/PurchaseOrderForms.tsx:428 -msgid "Part category default location selected" +#: src/forms/PurchaseOrderForms.tsx:440 +msgid "Assign Batch Code and Serial Numbers" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:438 -msgid "Received stock location selected" +#: src/forms/PurchaseOrderForms.tsx:442 +msgid "Assign Batch Code" msgstr "" #: src/forms/PurchaseOrderForms.tsx:444 @@ -4605,94 +4596,110 @@ msgstr "" #~ msgid "Remove item from list" #~ msgstr "Remove item from list" -#: src/forms/PurchaseOrderForms.tsx:446 +#: src/forms/PurchaseOrderForms.tsx:462 +msgid "Choose Location" +msgstr "Hely kiválasztása" + +#: src/forms/PurchaseOrderForms.tsx:470 +msgid "Item Destination selected" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:480 +msgid "Part category default location selected" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:490 +msgid "Received stock location selected" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:498 msgid "Default location selected" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:507 +#: src/forms/PurchaseOrderForms.tsx:559 msgid "Set Location" msgstr "Helyszín beállítása" -#: src/forms/PurchaseOrderForms.tsx:524 -msgid "Set Expiry Date" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:532 -#: src/forms/StockForms.tsx:693 -msgid "Adjust Packaging" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:540 -#: src/forms/StockForms.tsx:684 -#: src/hooks/UseStockAdjustActions.tsx:148 -msgid "Change Status" -msgstr "Állapot megváltoztatása" - -#: src/forms/PurchaseOrderForms.tsx:546 -msgid "Add Note" -msgstr "Megjegyzés hozzáadása" - #: src/forms/PurchaseOrderForms.tsx:566 #~ msgid "Serial numbers" #~ msgstr "Serial numbers" +#: src/forms/PurchaseOrderForms.tsx:576 +msgid "Set Expiry Date" +msgstr "" + #: src/forms/PurchaseOrderForms.tsx:582 #~ msgid "Store at line item destination" #~ msgstr "Store at line item destination" -#: src/forms/PurchaseOrderForms.tsx:610 -msgid "Store at default location" -msgstr "Alapértelmezett helyre tárolás" - -#: src/forms/PurchaseOrderForms.tsx:625 -msgid "Store at line item destination " +#: src/forms/PurchaseOrderForms.tsx:584 +#: src/forms/StockForms.tsx:693 +msgid "Adjust Packaging" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:637 -msgid "Store with already received stock" -msgstr "Tárolás a már megérkezett készlettel" +#: src/forms/PurchaseOrderForms.tsx:592 +#: src/forms/StockForms.tsx:684 +#: src/hooks/UseStockAdjustActions.tsx:148 +msgid "Change Status" +msgstr "Állapot megváltoztatása" + +#: src/forms/PurchaseOrderForms.tsx:598 +msgid "Add Note" +msgstr "Megjegyzés hozzáadása" #: src/forms/PurchaseOrderForms.tsx:658 #~ msgid "Receive line items" #~ msgstr "Receive line items" -#: src/forms/PurchaseOrderForms.tsx:661 +#: src/forms/PurchaseOrderForms.tsx:662 +msgid "Store at default location" +msgstr "Alapértelmezett helyre tárolás" + +#: src/forms/PurchaseOrderForms.tsx:677 +msgid "Store at line item destination " +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:689 +msgid "Store with already received stock" +msgstr "Tárolás a már megérkezett készlettel" + +#: src/forms/PurchaseOrderForms.tsx:713 #: src/pages/build/BuildDetail.tsx:340 #: src/pages/stock/StockDetail.tsx:280 #: src/pages/stock/StockDetail.tsx:952 #: src/tables/Filter.tsx:83 -#: src/tables/build/BuildAllocatedStockTable.tsx:128 +#: src/tables/build/BuildAllocatedStockTable.tsx:125 #: src/tables/build/BuildOutputTable.tsx:112 -#: src/tables/part/PartTestResultTable.tsx:260 -#: src/tables/part/PartTestResultTable.tsx:281 +#: src/tables/part/PartTestResultTable.tsx:268 +#: src/tables/part/PartTestResultTable.tsx:289 #: src/tables/sales/SalesOrderAllocationTable.tsx:149 msgid "Batch Code" msgstr "Batch kód" -#: src/forms/PurchaseOrderForms.tsx:662 +#: src/forms/PurchaseOrderForms.tsx:714 msgid "Enter batch code for received items" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:675 +#: src/forms/PurchaseOrderForms.tsx:727 #: src/forms/StockForms.tsx:218 msgid "Serial Numbers" msgstr "Sorozatszámok" -#: src/forms/PurchaseOrderForms.tsx:676 +#: src/forms/PurchaseOrderForms.tsx:728 msgid "Enter serial numbers for received items" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:690 +#: src/forms/PurchaseOrderForms.tsx:742 #: src/pages/stock/StockDetail.tsx:382 #: src/tables/stock/StockItemTable.tsx:294 msgid "Expiry Date" msgstr "Lejárati dátum" -#: src/forms/PurchaseOrderForms.tsx:691 +#: src/forms/PurchaseOrderForms.tsx:743 msgid "Enter an expiry date for received items" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:703 +#: src/forms/PurchaseOrderForms.tsx:755 #: src/forms/StockForms.tsx:728 #: src/pages/company/SupplierPartDetail.tsx:172 #: src/pages/company/SupplierPartDetail.tsx:236 @@ -4701,19 +4708,19 @@ msgstr "" msgid "Packaging" msgstr "Csomagolás" -#: src/forms/PurchaseOrderForms.tsx:727 +#: src/forms/PurchaseOrderForms.tsx:779 #: src/pages/company/SupplierPartDetail.tsx:120 #: src/tables/ColumnRenderers.tsx:332 msgid "Note" msgstr "Megjegyzés" -#: src/forms/PurchaseOrderForms.tsx:799 +#: src/forms/PurchaseOrderForms.tsx:851 #: src/pages/company/SupplierPartDetail.tsx:138 #: src/tables/purchasing/SupplierPriceBreakTable.tsx:49 msgid "SKU" msgstr "SKU (leltári azonosító)" -#: src/forms/PurchaseOrderForms.tsx:800 +#: src/forms/PurchaseOrderForms.tsx:852 #: src/tables/part/PartPurchaseOrdersTable.tsx:127 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:213 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:283 @@ -4721,11 +4728,11 @@ msgstr "SKU (leltári azonosító)" msgid "Received" msgstr "Fogadott" -#: src/forms/PurchaseOrderForms.tsx:817 +#: src/forms/PurchaseOrderForms.tsx:869 msgid "Receive Line Items" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:823 +#: src/forms/PurchaseOrderForms.tsx:875 msgid "Items received" msgstr "Tételek beérkeztek" @@ -4737,7 +4744,7 @@ msgstr "" msgid "Item received into stock" msgstr "" -#: src/forms/SalesOrderForms.tsx:401 +#: src/forms/SalesOrderForms.tsx:419 msgid "Leave blank to use the order address" msgstr "" @@ -5932,6 +5939,9 @@ msgstr "" #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:310 #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:401 +#: src/tables/build/BuildAllocatedStockTable.tsx:181 +#: src/tables/build/BuildLineTable.tsx:668 +#: src/tables/sales/SalesOrderAllocationTable.tsx:220 msgid "Confirm Removal" msgstr "" @@ -6870,8 +6880,8 @@ msgstr "Külső" #: src/pages/sales/ReturnOrderDetail.tsx:108 #: src/pages/sales/SalesOrderDetail.tsx:98 #: src/tables/ColumnRenderers.tsx:321 -#: src/tables/build/BuildAllocatedStockTable.tsx:115 -#: src/tables/build/BuildLineTable.tsx:352 +#: src/tables/build/BuildAllocatedStockTable.tsx:112 +#: src/tables/build/BuildLineTable.tsx:353 msgid "Reference" msgstr "Hivatkozás" @@ -7132,7 +7142,7 @@ msgstr "Rendelés törlése" #: src/pages/build/BuildDetail.tsx:742 #: src/pages/stock/StockDetail.tsx:344 -#: src/tables/build/BuildAllocatedStockTable.tsx:85 +#: src/tables/build/BuildAllocatedStockTable.tsx:82 #: src/tables/part/PartBuildAllocationsTable.tsx:45 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:157 #: src/tables/stock/StockTrackingTable.tsx:109 @@ -7600,7 +7610,7 @@ msgstr "Kulcsszavak" #: src/pages/part/PartDetail.tsx:542 #: src/tables/bom/BomTable.tsx:439 -#: src/tables/build/BuildLineTable.tsx:305 +#: src/tables/build/BuildLineTable.tsx:306 #: src/tables/part/PartTable.tsx:319 #: src/tables/sales/SalesOrderLineItemTable.tsx:138 msgid "Available Stock" @@ -7608,7 +7618,7 @@ msgstr "Elérhető készlet" #: src/pages/part/PartDetail.tsx:548 #: src/tables/bom/BomTable.tsx:341 -#: src/tables/build/BuildLineTable.tsx:267 +#: src/tables/build/BuildLineTable.tsx:268 #: src/tables/sales/SalesOrderLineItemTable.tsx:180 msgid "On order" msgstr "Rendelve" @@ -7782,7 +7792,7 @@ msgstr "Rendelés" #: src/pages/part/PartDetail.tsx:1144 #: src/pages/stock/StockDetail.tsx:884 -#: src/tables/build/BuildLineTable.tsx:761 +#: src/tables/build/BuildLineTable.tsx:768 msgid "Order Stock" msgstr "Készlet rendelés" @@ -9219,13 +9229,13 @@ msgstr "Virtuális alkatrész" #~ msgstr "Show asssmbled items" #: src/tables/bom/BomTable.tsx:315 -#: src/tables/build/BuildLineTable.tsx:276 +#: src/tables/build/BuildLineTable.tsx:277 #: src/tables/part/PartTable.tsx:145 msgid "External stock" msgstr "" #: src/tables/bom/BomTable.tsx:323 -#: src/tables/build/BuildLineTable.tsx:239 +#: src/tables/build/BuildLineTable.tsx:240 msgid "Includes substitute stock" msgstr "Helyettesítőkkel együtt" @@ -9234,7 +9244,7 @@ msgstr "Helyettesítőkkel együtt" #~ msgstr "Edit Bom Item" #: src/tables/bom/BomTable.tsx:332 -#: src/tables/build/BuildLineTable.tsx:249 +#: src/tables/build/BuildLineTable.tsx:250 #: src/tables/sales/SalesOrderLineItemTable.tsx:166 msgid "Includes variant stock" msgstr "Változatokkal együtt" @@ -9272,8 +9282,8 @@ msgid "Stock Information" msgstr "Készlet adatok" #: src/tables/bom/BomTable.tsx:399 -#: src/tables/build/BuildLineTable.tsx:496 -#: src/tables/build/BuildLineTable.tsx:537 +#: src/tables/build/BuildLineTable.tsx:497 +#: src/tables/build/BuildLineTable.tsx:538 msgid "Consumable item" msgstr "Fogyóeszköz tétel" @@ -9282,7 +9292,7 @@ msgid "No available stock" msgstr "" #: src/tables/bom/BomTable.tsx:420 -#: src/tables/build/BuildLineTable.tsx:213 +#: src/tables/build/BuildLineTable.tsx:214 msgid "Show testable items" msgstr "Tesztelhető elemek mutatása" @@ -9291,7 +9301,7 @@ msgid "Show trackable items" msgstr "" #: src/tables/bom/BomTable.tsx:430 -#: src/tables/build/BuildLineTable.tsx:208 +#: src/tables/build/BuildLineTable.tsx:209 msgid "Show assembled items" msgstr "" @@ -9335,7 +9345,7 @@ msgstr "" #: src/tables/bom/BomTable.tsx:464 #: src/tables/bom/UsedInTable.tsx:85 -#: src/tables/build/BuildLineTable.tsx:202 +#: src/tables/build/BuildLineTable.tsx:203 msgid "Optional" msgstr "Opcionális" @@ -9345,7 +9355,7 @@ msgid "Show optional items" msgstr "Opcionális elemek mutatása" #: src/tables/bom/BomTable.tsx:469 -#: src/tables/build/BuildLineTable.tsx:197 +#: src/tables/build/BuildLineTable.tsx:198 msgid "Consumable" msgstr "Fogyóeszköz" @@ -9433,7 +9443,7 @@ msgid "Bill of materials cannot be edited, as the part is locked" msgstr "" #: src/tables/bom/UsedInTable.tsx:34 -#: src/tables/build/BuildLineTable.tsx:207 +#: src/tables/build/BuildLineTable.tsx:208 #: src/tables/part/ParametricPartTable.tsx:364 #: src/tables/part/PartBuildAllocationsTable.tsx:60 #: src/tables/part/PartTable.tsx:209 @@ -9455,11 +9465,11 @@ msgstr "Követésre kötelezett" msgid "Show trackable assemblies" msgstr "Nyomonkövethető gyártmányok mutatása" -#: src/tables/build/BuildAllocatedStockTable.tsx:67 +#: src/tables/build/BuildAllocatedStockTable.tsx:64 msgid "Allocated to Output" msgstr "" -#: src/tables/build/BuildAllocatedStockTable.tsx:68 +#: src/tables/build/BuildAllocatedStockTable.tsx:65 msgid "Show items allocated to a build output" msgstr "" @@ -9472,7 +9482,7 @@ msgstr "" #~ msgid "Include orders for part variants" #~ msgstr "Include orders for part variants" -#: src/tables/build/BuildAllocatedStockTable.tsx:97 +#: src/tables/build/BuildAllocatedStockTable.tsx:94 #: src/tables/part/PartBuildAllocationsTable.tsx:84 #: src/tables/part/PartPurchaseOrdersTable.tsx:132 #: src/tables/part/PartSalesAllocationsTable.tsx:69 @@ -9482,40 +9492,58 @@ msgid "Order Status" msgstr "Rendelés állapota" #: src/tables/build/BuildAllocatedStockTable.tsx:164 -#~ msgid "Edit Build Item" -#~ msgstr "Edit Build Item" - -#: src/tables/build/BuildAllocatedStockTable.tsx:167 -#: src/tables/build/BuildLineTable.tsx:650 +#: src/tables/build/BuildLineTable.tsx:651 msgid "Edit Stock Allocation" msgstr "Készlet foglalás szerkesztése" +#: src/tables/build/BuildAllocatedStockTable.tsx:164 +#~ msgid "Edit Build Item" +#~ msgstr "Edit Build Item" + #: src/tables/build/BuildAllocatedStockTable.tsx:174 #~ msgid "Delete Build Item" #~ msgstr "Delete Build Item" -#: src/tables/build/BuildAllocatedStockTable.tsx:180 -#: src/tables/build/BuildLineTable.tsx:663 -msgid "Delete Stock Allocation" +#: src/tables/build/BuildAllocatedStockTable.tsx:177 +#: src/tables/build/BuildLineTable.tsx:664 +#: src/tables/sales/SalesOrderAllocationTable.tsx:218 +msgid "Remove Allocated Stock" msgstr "" -#: src/tables/build/BuildAllocatedStockTable.tsx:239 +#: src/tables/build/BuildAllocatedStockTable.tsx:180 +#: src/tables/build/BuildLineTable.tsx:663 +#~ msgid "Delete Stock Allocation" +#~ msgstr "Delete Stock Allocation" + +#: src/tables/build/BuildAllocatedStockTable.tsx:182 +#: src/tables/build/BuildLineTable.tsx:669 +#: src/tables/sales/SalesOrderAllocationTable.tsx:221 +msgid "Are you sure you want to remove this allocated stock from the order?" +msgstr "" + +#: src/tables/build/BuildAllocatedStockTable.tsx:242 msgid "Consume" msgstr "Felhasznál" +#: src/tables/build/BuildAllocatedStockTable.tsx:259 +#: src/tables/build/BuildLineTable.tsx:112 +#: src/tables/sales/SalesOrderAllocationTable.tsx:248 +msgid "Remove allocated stock" +msgstr "" + #: src/tables/build/BuildLineTable.tsx:59 #~ msgid "Show lines with available stock" #~ msgstr "Show lines with available stock" -#: src/tables/build/BuildLineTable.tsx:120 +#: src/tables/build/BuildLineTable.tsx:121 msgid "View Stock Item" msgstr "Készlet tétel megtekintése" -#: src/tables/build/BuildLineTable.tsx:183 +#: src/tables/build/BuildLineTable.tsx:184 msgid "Show fully allocated lines" msgstr "" -#: src/tables/build/BuildLineTable.tsx:188 +#: src/tables/build/BuildLineTable.tsx:189 msgid "Show fully consumed lines" msgstr "" @@ -9523,124 +9551,124 @@ msgstr "" #~ msgid "Show allocated lines" #~ msgstr "Show allocated lines" -#: src/tables/build/BuildLineTable.tsx:193 +#: src/tables/build/BuildLineTable.tsx:194 msgid "Show items with sufficient available stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:198 +#: src/tables/build/BuildLineTable.tsx:199 msgid "Show consumable lines" msgstr "Felhasználható sorok mutatása" -#: src/tables/build/BuildLineTable.tsx:203 +#: src/tables/build/BuildLineTable.tsx:204 msgid "Show optional lines" msgstr "Opcionális sorok mutatása" -#: src/tables/build/BuildLineTable.tsx:212 +#: src/tables/build/BuildLineTable.tsx:213 #: src/tables/part/PartTable.tsx:233 msgid "Testable" msgstr "Tesztelhető" -#: src/tables/build/BuildLineTable.tsx:217 +#: src/tables/build/BuildLineTable.tsx:218 #: src/tables/stock/StockItemTable.tsx:388 msgid "Tracked" msgstr "Követett" -#: src/tables/build/BuildLineTable.tsx:218 +#: src/tables/build/BuildLineTable.tsx:219 msgid "Show tracked lines" msgstr "Követett tételek mutatása" -#: src/tables/build/BuildLineTable.tsx:223 +#: src/tables/build/BuildLineTable.tsx:224 msgid "Show items with stock on order" msgstr "" -#: src/tables/build/BuildLineTable.tsx:258 +#: src/tables/build/BuildLineTable.tsx:259 #: src/tables/sales/SalesOrderLineItemTable.tsx:172 msgid "In production" msgstr "Gyártásban" -#: src/tables/build/BuildLineTable.tsx:286 +#: src/tables/build/BuildLineTable.tsx:287 msgid "Insufficient stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:302 +#: src/tables/build/BuildLineTable.tsx:303 #: src/tables/sales/SalesOrderLineItemTable.tsx:160 #: src/tables/stock/StockItemTable.tsx:191 msgid "No stock available" msgstr "Nincs elérhető készlet" -#: src/tables/build/BuildLineTable.tsx:375 +#: src/tables/build/BuildLineTable.tsx:376 msgid "Gets Inherited" msgstr "" -#: src/tables/build/BuildLineTable.tsx:388 +#: src/tables/build/BuildLineTable.tsx:389 msgid "Unit Quantity" msgstr "Mennyiségi egység" -#: src/tables/build/BuildLineTable.tsx:415 +#: src/tables/build/BuildLineTable.tsx:416 msgid "Setup Quantity" msgstr "Beállítási mennyiség" -#: src/tables/build/BuildLineTable.tsx:424 +#: src/tables/build/BuildLineTable.tsx:425 msgid "Attrition" msgstr "" -#: src/tables/build/BuildLineTable.tsx:432 +#: src/tables/build/BuildLineTable.tsx:433 msgid "Rounding Multiple" msgstr "" -#: src/tables/build/BuildLineTable.tsx:441 +#: src/tables/build/BuildLineTable.tsx:442 msgid "BOM Information" msgstr "" -#: src/tables/build/BuildLineTable.tsx:515 +#: src/tables/build/BuildLineTable.tsx:516 #: src/tables/part/PartBuildAllocationsTable.tsx:102 msgid "Fully allocated" msgstr "" -#: src/tables/build/BuildLineTable.tsx:563 +#: src/tables/build/BuildLineTable.tsx:564 #: src/tables/sales/SalesOrderLineItemTable.tsx:311 msgid "Create Build Order" msgstr "" -#: src/tables/build/BuildLineTable.tsx:592 +#: src/tables/build/BuildLineTable.tsx:593 msgid "Auto allocation in progress" msgstr "Automatikus foglalás folyamatban" -#: src/tables/build/BuildLineTable.tsx:595 -#: src/tables/build/BuildLineTable.tsx:802 +#: src/tables/build/BuildLineTable.tsx:596 +#: src/tables/build/BuildLineTable.tsx:809 msgid "Auto Allocate Stock" msgstr "Készlet Automatikus Foglalása" -#: src/tables/build/BuildLineTable.tsx:596 +#: src/tables/build/BuildLineTable.tsx:597 msgid "Automatically allocate stock to this build according to the selected options" msgstr "Gyártáshoz szükséges készlet automatikus lefoglalása a beállítások szerint" -#: src/tables/build/BuildLineTable.tsx:616 -#: src/tables/build/BuildLineTable.tsx:630 -#: src/tables/build/BuildLineTable.tsx:751 -#: src/tables/build/BuildLineTable.tsx:852 +#: src/tables/build/BuildLineTable.tsx:617 +#: src/tables/build/BuildLineTable.tsx:631 +#: src/tables/build/BuildLineTable.tsx:758 +#: src/tables/build/BuildLineTable.tsx:859 #: src/tables/build/BuildOutputTable.tsx:355 #: src/tables/build/BuildOutputTable.tsx:360 msgid "Deallocate Stock" msgstr "Foglalás feloldása" -#: src/tables/build/BuildLineTable.tsx:632 +#: src/tables/build/BuildLineTable.tsx:633 msgid "Deallocate all untracked stock for this build order" msgstr "Összes nem egyedi sorszámos készlet felszabadítása ebből a gyártási rendelésből" -#: src/tables/build/BuildLineTable.tsx:634 +#: src/tables/build/BuildLineTable.tsx:635 msgid "Deallocate stock from the selected line item" msgstr "Készlet felszabadítsa a kiválasztott tételekhez" -#: src/tables/build/BuildLineTable.tsx:638 +#: src/tables/build/BuildLineTable.tsx:639 msgid "Stock has been deallocated" msgstr "Készlet felszabadítva" -#: src/tables/build/BuildLineTable.tsx:771 +#: src/tables/build/BuildLineTable.tsx:778 msgid "Build Stock" msgstr "Gyártási készlet" -#: src/tables/build/BuildLineTable.tsx:784 +#: src/tables/build/BuildLineTable.tsx:791 #: src/tables/sales/SalesOrderLineItemTable.tsx:487 msgid "View Part" msgstr "Alkatrész megtekintése" @@ -9739,7 +9767,7 @@ msgid "Serialize Build Output" msgstr "Gyártási kimenet sorozatszámozása" #: src/tables/build/BuildOutputTable.tsx:405 -#: src/tables/part/PartTestResultTable.tsx:310 +#: src/tables/part/PartTestResultTable.tsx:318 #: src/tables/stock/StockItemTable.tsx:328 msgid "Filter by stock status" msgstr "" @@ -9964,8 +9992,8 @@ msgid "View Item" msgstr "Tétel megtekintése" #: src/tables/general/ExtraLineItemTable.tsx:95 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:299 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:403 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:300 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:405 #: src/tables/sales/ReturnOrderLineItemTable.tsx:83 #: src/tables/sales/ReturnOrderLineItemTable.tsx:187 #: src/tables/sales/SalesOrderLineItemTable.tsx:252 @@ -9974,14 +10002,14 @@ msgid "Add Line Item" msgstr "Sortétel hozzáadása" #: src/tables/general/ExtraLineItemTable.tsx:108 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:320 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:322 #: src/tables/sales/ReturnOrderLineItemTable.tsx:96 #: src/tables/sales/SalesOrderLineItemTable.tsx:271 msgid "Edit Line Item" msgstr "Sortétel szerkesztése" #: src/tables/general/ExtraLineItemTable.tsx:117 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:329 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:331 #: src/tables/sales/ReturnOrderLineItemTable.tsx:105 #: src/tables/sales/SalesOrderLineItemTable.tsx:280 msgid "Delete Line Item" @@ -10273,7 +10301,7 @@ msgid "Required Stock" msgstr "Szükséges készlet" #: src/tables/part/PartBuildAllocationsTable.tsx:124 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:381 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:383 msgid "View Build Order" msgstr "" @@ -10617,8 +10645,8 @@ msgstr "" #: src/tables/part/PartTestResultTable.tsx:103 #: src/tables/part/PartTestResultTable.tsx:181 -#: src/tables/part/PartTestResultTable.tsx:320 -#: src/tables/part/PartTestResultTable.tsx:334 +#: src/tables/part/PartTestResultTable.tsx:328 +#: src/tables/part/PartTestResultTable.tsx:342 #: src/tables/stock/StockItemTestResultTable.tsx:296 #: src/tables/stock/StockItemTestResultTable.tsx:368 #: src/tables/stock/StockItemTestResultTable.tsx:429 @@ -10643,7 +10671,7 @@ msgstr "" msgid "No Result" msgstr "Nincs eredmény" -#: src/tables/part/PartTestResultTable.tsx:298 +#: src/tables/part/PartTestResultTable.tsx:306 msgid "Show build outputs currently in production" msgstr "" @@ -11073,7 +11101,7 @@ msgid "Show manufacturer parts for active manufacturers." msgstr "" #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:115 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:397 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:399 msgid "Import Line Items" msgstr "" @@ -11099,11 +11127,11 @@ msgstr "" #~ msgid "Add line item" #~ msgstr "Add line item" -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:350 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:352 msgid "Receive line item" msgstr "Sortétel bevételezése" -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:414 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:416 msgid "Receive items" msgstr "Bevételezés" @@ -11201,25 +11229,25 @@ msgid "Not shipped" msgstr "Nincs kiszállítva" #: src/tables/sales/SalesOrderAllocationTable.tsx:211 -#: src/tables/sales/SalesOrderAllocationTable.tsx:229 +#: src/tables/sales/SalesOrderAllocationTable.tsx:235 msgid "Edit Allocation" msgstr "" #: src/tables/sales/SalesOrderAllocationTable.tsx:218 #: src/tables/sales/SalesOrderAllocationTable.tsx:241 -msgid "Delete Allocation" -msgstr "" +#~ msgid "Delete Allocation" +#~ msgstr "Delete Allocation" -#: src/tables/sales/SalesOrderAllocationTable.tsx:252 -#: src/tables/sales/SalesOrderAllocationTable.tsx:253 +#: src/tables/sales/SalesOrderAllocationTable.tsx:261 +#: src/tables/sales/SalesOrderAllocationTable.tsx:262 msgid "View Shipment" msgstr "Szállítmány megtekintése" -#: src/tables/sales/SalesOrderAllocationTable.tsx:308 +#: src/tables/sales/SalesOrderAllocationTable.tsx:317 msgid "Assign to Shipment" msgstr "" -#: src/tables/sales/SalesOrderAllocationTable.tsx:324 +#: src/tables/sales/SalesOrderAllocationTable.tsx:333 msgid "Assign to shipment" msgstr "" diff --git a/src/frontend/src/locales/id/messages.po b/src/frontend/src/locales/id/messages.po index 2ef38c727d..ba8f4b9687 100644 --- a/src/frontend/src/locales/id/messages.po +++ b/src/frontend/src/locales/id/messages.po @@ -8,7 +8,7 @@ msgstr "" "Language: id\n" "Project-Id-Version: inventree\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2025-11-19 19:39\n" +"PO-Revision-Date: 2025-11-22 06:25\n" "Last-Translator: \n" "Language-Team: Indonesian\n" "Plural-Forms: nplurals=1; plural=0;\n" @@ -56,7 +56,7 @@ msgstr "Batal" #: lib/components/RowActions.tsx:136 #: src/components/nav/NavigationDrawer.tsx:190 -#: src/forms/PurchaseOrderForms.tsx:802 +#: src/forms/PurchaseOrderForms.tsx:854 #: src/forms/StockForms.tsx:796 #: src/forms/StockForms.tsx:843 #: src/forms/StockForms.tsx:889 @@ -103,9 +103,9 @@ msgstr "Tidak" #: src/forms/BuildForms.tsx:630 #: src/forms/BuildForms.tsx:793 #: src/forms/BuildForms.tsx:896 -#: src/forms/PurchaseOrderForms.tsx:798 +#: src/forms/PurchaseOrderForms.tsx:850 #: src/forms/ReturnOrderForms.tsx:242 -#: src/forms/SalesOrderForms.tsx:305 +#: src/forms/SalesOrderForms.tsx:323 #: src/forms/StockForms.tsx:360 #: src/forms/StockForms.tsx:791 #: src/forms/StockForms.tsx:838 @@ -119,6 +119,7 @@ msgstr "Tidak" #: src/pages/build/BuildDetail.tsx:200 #: src/pages/part/PartDetail.tsx:1207 #: src/tables/ColumnRenderers.tsx:91 +#: src/tables/part/PartTestResultTable.tsx:247 #: src/tables/part/RelatedPartTable.tsx:53 #: src/tables/stock/StockTrackingTable.tsx:87 msgid "Part" @@ -158,7 +159,7 @@ msgstr "" #: src/components/wizards/OrderPartsWizard.tsx:290 #: src/pages/company/SupplierPartDetail.tsx:413 #: src/pages/stock/StockDetail.tsx:289 -#: src/tables/build/BuildAllocatedStockTable.tsx:155 +#: src/tables/build/BuildAllocatedStockTable.tsx:152 #: src/tables/part/PartPurchaseOrdersTable.tsx:50 #: src/tables/purchasing/SupplierPartTable.tsx:83 #: src/tables/stock/StockItemTable.tsx:247 @@ -201,9 +202,9 @@ msgstr "" #: src/forms/BuildForms.tsx:473 #: src/forms/BuildForms.tsx:633 #: src/forms/BuildForms.tsx:794 -#: src/forms/SalesOrderForms.tsx:307 +#: src/forms/SalesOrderForms.tsx:325 #: src/pages/stock/StockDetail.tsx:1005 -#: src/tables/part/PartTestResultTable.tsx:248 +#: src/tables/part/PartTestResultTable.tsx:256 #: src/tables/stock/StockTrackingTable.tsx:48 #: src/tables/stock/StockTrackingTable.tsx:55 msgid "Stock Item" @@ -517,7 +518,7 @@ msgstr "" #: src/components/dashboard/DashboardLayout.tsx:281 #: src/components/editors/NotesEditor.tsx:74 #: src/components/editors/TemplateEditor/TemplateEditor.tsx:158 -#: src/components/forms/fields/ApiFormField.tsx:273 +#: src/components/forms/fields/ApiFormField.tsx:237 #: src/components/forms/fields/TableField.tsx:45 #: src/components/importer/ImportDataSelector.tsx:192 #: src/components/importer/ImporterColumnSelector.tsx:234 @@ -642,8 +643,8 @@ msgstr "" #: src/components/barcodes/BarcodeScanDialog.tsx:49 #: src/components/buttons/ScanButton.tsx:15 #: src/components/nav/NavigationDrawer.tsx:122 -#: src/forms/PurchaseOrderForms.tsx:457 -#: src/forms/PurchaseOrderForms.tsx:563 +#: src/forms/PurchaseOrderForms.tsx:509 +#: src/forms/PurchaseOrderForms.tsx:615 msgid "Scan Barcode" msgstr "" @@ -728,7 +729,7 @@ msgstr "" #: src/components/barcodes/QRCode.tsx:205 #: src/components/items/ActionDropdown.tsx:192 -#: src/forms/PurchaseOrderForms.tsx:554 +#: src/forms/PurchaseOrderForms.tsx:606 msgid "Unlink Barcode" msgstr "" @@ -1216,6 +1217,12 @@ msgstr "" #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:884 #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:903 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:254 +#: src/tables/build/BuildAllocatedStockTable.tsx:178 +#: src/tables/build/BuildAllocatedStockTable.tsx:258 +#: src/tables/build/BuildLineTable.tsx:111 +#: src/tables/build/BuildLineTable.tsx:665 +#: src/tables/sales/SalesOrderAllocationTable.tsx:224 +#: src/tables/sales/SalesOrderAllocationTable.tsx:247 msgid "Remove" msgstr "Hapus" @@ -1241,7 +1248,7 @@ msgid "Upload Error" msgstr "" #: src/components/details/DetailsImage.tsx:250 -#: src/components/forms/fields/TextField.tsx:65 +#: src/components/forms/fields/AutoFillRightSection.tsx:34 msgid "Clear" msgstr "" @@ -1817,10 +1824,14 @@ msgstr "" msgid "Running" msgstr "" -#: src/components/forms/fields/ApiFormField.tsx:233 +#: src/components/forms/fields/ApiFormField.tsx:197 msgid "Select file to upload" msgstr "" +#: src/components/forms/fields/AutoFillRightSection.tsx:47 +msgid "Accept suggested value" +msgstr "" + #: src/components/forms/fields/DateField.tsx:76 msgid "Select date" msgstr "" @@ -1875,10 +1886,6 @@ msgstr "" msgid "Add new row" msgstr "" -#: src/components/forms/fields/TextField.tsx:82 -msgid "Accept suggested value" -msgstr "" - #: src/components/images/DetailsImage.tsx:252 #~ msgid "Select image" #~ msgstr "Select image" @@ -2225,8 +2232,8 @@ msgstr "" #: src/pages/part/PartDetail.tsx:994 #: src/pages/stock/StockDetail.tsx:265 #: src/pages/stock/StockDetail.tsx:942 -#: src/tables/build/BuildAllocatedStockTable.tsx:135 -#: src/tables/build/BuildLineTable.tsx:192 +#: src/tables/build/BuildAllocatedStockTable.tsx:132 +#: src/tables/build/BuildLineTable.tsx:193 #: src/tables/part/PartTable.tsx:137 #: src/tables/stock/StockItemTable.tsx:182 #: src/tables/stock/StockItemTable.tsx:343 @@ -2784,7 +2791,7 @@ msgstr "" #: src/pages/sales/SalesOrderDetail.tsx:119 #: src/pages/stock/LocationDetail.tsx:102 #: src/tables/ColumnRenderers.tsx:278 -#: src/tables/build/BuildAllocatedStockTable.tsx:91 +#: src/tables/build/BuildAllocatedStockTable.tsx:88 #: src/tables/machine/MachineTypeTable.tsx:161 #: src/tables/machine/MachineTypeTable.tsx:257 #: src/tables/plugin/PluginListTable.tsx:110 @@ -2966,7 +2973,7 @@ msgstr "Tidak ada persediaan" #: src/pages/company/SupplierPartDetail.tsx:394 #: src/pages/part/PartDetail.tsx:1015 #: src/tables/bom/BomTable.tsx:444 -#: src/tables/build/BuildLineTable.tsx:222 +#: src/tables/build/BuildLineTable.tsx:223 #: src/tables/part/PartTable.tsx:108 msgid "On Order" msgstr "" @@ -2976,7 +2983,7 @@ msgstr "" #: src/pages/part/PartDetail.tsx:587 #: src/pages/part/PartDetail.tsx:1021 #: src/pages/stock/StockDetail.tsx:925 -#: src/tables/part/PartTestResultTable.tsx:297 +#: src/tables/part/PartTestResultTable.tsx:305 #: src/tables/stock/StockItemTable.tsx:359 msgid "In Production" msgstr "" @@ -3000,7 +3007,7 @@ msgstr "" #: src/components/render/Stock.tsx:114 #: src/components/render/Stock.tsx:132 #: src/forms/BuildForms.tsx:795 -#: src/forms/PurchaseOrderForms.tsx:595 +#: src/forms/PurchaseOrderForms.tsx:647 #: src/forms/StockForms.tsx:792 #: src/forms/StockForms.tsx:839 #: src/forms/StockForms.tsx:885 @@ -3023,7 +3030,7 @@ msgstr "Lokasi" #: src/components/render/Stock.tsx:99 #: src/pages/stock/StockDetail.tsx:198 #: src/pages/stock/StockDetail.tsx:930 -#: src/tables/build/BuildAllocatedStockTable.tsx:121 +#: src/tables/build/BuildAllocatedStockTable.tsx:118 #: src/tables/build/BuildOutputTable.tsx:107 #: src/tables/sales/SalesOrderAllocationTable.tsx:142 msgid "Serial Number" @@ -3034,9 +3041,9 @@ msgstr "Nomor Seri" #: src/forms/BuildForms.tsx:240 #: src/forms/BuildForms.tsx:634 #: src/forms/BuildForms.tsx:797 -#: src/forms/PurchaseOrderForms.tsx:801 +#: src/forms/PurchaseOrderForms.tsx:853 #: src/forms/ReturnOrderForms.tsx:243 -#: src/forms/SalesOrderForms.tsx:308 +#: src/forms/SalesOrderForms.tsx:326 #: src/forms/StockForms.tsx:841 #: src/pages/part/PartStockHistoryDetail.tsx:56 #: src/pages/part/PartStockHistoryDetail.tsx:210 @@ -3046,9 +3053,9 @@ msgstr "Nomor Seri" #: src/pages/part/pricing/PriceBreakPanel.tsx:172 #: src/pages/stock/StockDetail.tsx:258 #: src/pages/stock/StockDetail.tsx:936 -#: src/tables/build/BuildLineTable.tsx:86 +#: src/tables/build/BuildLineTable.tsx:83 #: src/tables/part/PartPurchaseOrdersTable.tsx:94 -#: src/tables/part/PartTestResultTable.tsx:269 +#: src/tables/part/PartTestResultTable.tsx:277 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:175 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:206 #: src/tables/purchasing/SupplierPriceBreakTable.tsx:69 @@ -3070,7 +3077,7 @@ msgstr "Jumlah" #: src/forms/StockForms.tsx:1048 #: src/forms/StockForms.tsx:1096 #: src/forms/StockForms.tsx:1140 -#: src/tables/build/BuildLineTable.tsx:96 +#: src/tables/build/BuildLineTable.tsx:93 msgid "Batch" msgstr "" @@ -3755,7 +3762,7 @@ msgid "In Stock" msgstr "" #: src/components/wizards/OrderPartsWizard.tsx:146 -#: src/tables/build/BuildLineTable.tsx:404 +#: src/tables/build/BuildLineTable.tsx:405 msgid "Required Quantity" msgstr "" @@ -3847,7 +3854,7 @@ msgid "Please correct the errors in the selected parts" msgstr "" #: src/components/wizards/OrderPartsWizard.tsx:587 -#: src/tables/build/BuildLineTable.tsx:815 +#: src/tables/build/BuildLineTable.tsx:822 #: src/tables/part/PartTable.tsx:522 #: src/tables/sales/SalesOrderLineItemTable.tsx:370 msgid "Order Parts" @@ -4349,9 +4356,9 @@ msgstr "" #: src/forms/BuildForms.tsx:333 #: src/forms/BuildForms.tsx:408 #: src/forms/BuildForms.tsx:685 -#: src/tables/build/BuildAllocatedStockTable.tsx:150 +#: src/tables/build/BuildAllocatedStockTable.tsx:147 #: src/tables/build/BuildOutputTable.tsx:582 -#: src/tables/part/PartTestResultTable.tsx:272 +#: src/tables/part/PartTestResultTable.tsx:280 msgid "Build Output" msgstr "" @@ -4362,7 +4369,7 @@ msgstr "" #: src/forms/BuildForms.tsx:336 #: src/forms/BuildForms.tsx:411 #: src/forms/BuildForms.tsx:475 -#: src/forms/PurchaseOrderForms.tsx:717 +#: src/forms/PurchaseOrderForms.tsx:769 #: src/forms/ReturnOrderForms.tsx:197 #: src/forms/ReturnOrderForms.tsx:244 #: src/forms/StockForms.tsx:712 @@ -4377,7 +4384,7 @@ msgstr "" #: src/tables/build/BuildOutputTable.tsx:404 #: src/tables/machine/MachineListTable.tsx:387 #: src/tables/part/PartPurchaseOrdersTable.tsx:38 -#: src/tables/part/PartTestResultTable.tsx:309 +#: src/tables/part/PartTestResultTable.tsx:317 #: src/tables/sales/ReturnOrderLineItemTable.tsx:138 #: src/tables/sales/ReturnOrderLineItemTable.tsx:176 #: src/tables/settings/CustomStateTable.tsx:79 @@ -4450,8 +4457,8 @@ msgstr "" #: src/pages/stock/StockDetail.tsx:153 #: src/tables/bom/BomTable.tsx:134 #: src/tables/bom/UsedInTable.tsx:40 -#: src/tables/build/BuildAllocatedStockTable.tsx:108 -#: src/tables/build/BuildLineTable.tsx:336 +#: src/tables/build/BuildAllocatedStockTable.tsx:105 +#: src/tables/build/BuildLineTable.tsx:337 #: src/tables/build/BuildOrderTable.tsx:79 #: src/tables/part/PartSalesAllocationsTable.tsx:61 #: src/tables/part/RelatedPartTable.tsx:73 @@ -4466,47 +4473,47 @@ msgstr "" #: src/forms/BuildForms.tsx:632 #: src/forms/BuildForms.tsx:796 #: src/forms/BuildForms.tsx:897 -#: src/forms/SalesOrderForms.tsx:306 -#: src/tables/build/BuildAllocatedStockTable.tsx:139 -#: src/tables/build/BuildLineTable.tsx:182 +#: src/forms/SalesOrderForms.tsx:324 +#: src/tables/build/BuildAllocatedStockTable.tsx:136 +#: src/tables/build/BuildLineTable.tsx:183 #: src/tables/sales/SalesOrderLineItemTable.tsx:342 #: src/tables/stock/StockItemTable.tsx:338 msgid "Allocated" msgstr "" #: src/forms/BuildForms.tsx:667 -#: src/forms/SalesOrderForms.tsx:295 +#: src/forms/SalesOrderForms.tsx:313 #: src/pages/build/BuildDetail.tsx:108 #: src/pages/build/BuildDetail.tsx:326 msgid "Source Location" msgstr "" #: src/forms/BuildForms.tsx:668 -#: src/forms/SalesOrderForms.tsx:296 +#: src/forms/SalesOrderForms.tsx:314 msgid "Select the source location for the stock allocation" msgstr "" #: src/forms/BuildForms.tsx:700 -#: src/forms/SalesOrderForms.tsx:336 -#: src/tables/build/BuildLineTable.tsx:574 -#: src/tables/build/BuildLineTable.tsx:731 -#: src/tables/build/BuildLineTable.tsx:830 +#: src/forms/SalesOrderForms.tsx:354 +#: src/tables/build/BuildLineTable.tsx:575 +#: src/tables/build/BuildLineTable.tsx:738 +#: src/tables/build/BuildLineTable.tsx:837 #: src/tables/sales/SalesOrderLineItemTable.tsx:380 #: src/tables/sales/SalesOrderLineItemTable.tsx:406 msgid "Allocate Stock" msgstr "" #: src/forms/BuildForms.tsx:703 -#: src/forms/SalesOrderForms.tsx:341 +#: src/forms/SalesOrderForms.tsx:359 msgid "Stock items allocated" msgstr "" #: src/forms/BuildForms.tsx:816 #: src/forms/BuildForms.tsx:917 -#: src/tables/build/BuildAllocatedStockTable.tsx:240 -#: src/tables/build/BuildAllocatedStockTable.tsx:272 -#: src/tables/build/BuildLineTable.tsx:741 -#: src/tables/build/BuildLineTable.tsx:864 +#: src/tables/build/BuildAllocatedStockTable.tsx:243 +#: src/tables/build/BuildAllocatedStockTable.tsx:279 +#: src/tables/build/BuildLineTable.tsx:748 +#: src/tables/build/BuildLineTable.tsx:871 msgid "Consume Stock" msgstr "" @@ -4521,21 +4528,21 @@ msgstr "" #~ msgstr "Stock items consumed" #: src/forms/BuildForms.tsx:853 -#: src/tables/build/BuildLineTable.tsx:514 +#: src/tables/build/BuildLineTable.tsx:515 #: src/tables/part/PartBuildAllocationsTable.tsx:101 msgid "Fully consumed" msgstr "" #: src/forms/BuildForms.tsx:898 -#: src/tables/build/BuildLineTable.tsx:187 +#: src/tables/build/BuildLineTable.tsx:188 #: src/tables/stock/StockItemTable.tsx:367 msgid "Consumed" msgstr "" #: src/forms/CommonForms.tsx:88 -#: src/forms/PurchaseOrderForms.tsx:125 +#: src/forms/PurchaseOrderForms.tsx:176 #: src/forms/ReturnOrderForms.tsx:138 -#: src/forms/SalesOrderForms.tsx:164 +#: src/forms/SalesOrderForms.tsx:182 msgid "Select project code for this line item" msgstr "" @@ -4572,32 +4579,16 @@ msgstr "" msgid "Subscribe to notifications for this category" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:388 -msgid "Assign Batch Code and Serial Numbers" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:390 -msgid "Assign Batch Code" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:410 -msgid "Choose Location" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:418 -msgid "Item Destination selected" -msgstr "" - #: src/forms/PurchaseOrderForms.tsx:421 #~ msgid "Assign Batch Code{0}" #~ msgstr "Assign Batch Code{0}" -#: src/forms/PurchaseOrderForms.tsx:428 -msgid "Part category default location selected" +#: src/forms/PurchaseOrderForms.tsx:440 +msgid "Assign Batch Code and Serial Numbers" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:438 -msgid "Received stock location selected" +#: src/forms/PurchaseOrderForms.tsx:442 +msgid "Assign Batch Code" msgstr "" #: src/forms/PurchaseOrderForms.tsx:444 @@ -4605,94 +4596,110 @@ msgstr "" #~ msgid "Remove item from list" #~ msgstr "Remove item from list" -#: src/forms/PurchaseOrderForms.tsx:446 +#: src/forms/PurchaseOrderForms.tsx:462 +msgid "Choose Location" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:470 +msgid "Item Destination selected" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:480 +msgid "Part category default location selected" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:490 +msgid "Received stock location selected" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:498 msgid "Default location selected" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:507 +#: src/forms/PurchaseOrderForms.tsx:559 msgid "Set Location" msgstr "Atur Lokasi" -#: src/forms/PurchaseOrderForms.tsx:524 -msgid "Set Expiry Date" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:532 -#: src/forms/StockForms.tsx:693 -msgid "Adjust Packaging" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:540 -#: src/forms/StockForms.tsx:684 -#: src/hooks/UseStockAdjustActions.tsx:148 -msgid "Change Status" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:546 -msgid "Add Note" -msgstr "Tambah Catatan" - #: src/forms/PurchaseOrderForms.tsx:566 #~ msgid "Serial numbers" #~ msgstr "Serial numbers" +#: src/forms/PurchaseOrderForms.tsx:576 +msgid "Set Expiry Date" +msgstr "" + #: src/forms/PurchaseOrderForms.tsx:582 #~ msgid "Store at line item destination" #~ msgstr "Store at line item destination" -#: src/forms/PurchaseOrderForms.tsx:610 -msgid "Store at default location" +#: src/forms/PurchaseOrderForms.tsx:584 +#: src/forms/StockForms.tsx:693 +msgid "Adjust Packaging" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:625 -msgid "Store at line item destination " +#: src/forms/PurchaseOrderForms.tsx:592 +#: src/forms/StockForms.tsx:684 +#: src/hooks/UseStockAdjustActions.tsx:148 +msgid "Change Status" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:637 -msgid "Store with already received stock" -msgstr "" +#: src/forms/PurchaseOrderForms.tsx:598 +msgid "Add Note" +msgstr "Tambah Catatan" #: src/forms/PurchaseOrderForms.tsx:658 #~ msgid "Receive line items" #~ msgstr "Receive line items" -#: src/forms/PurchaseOrderForms.tsx:661 +#: src/forms/PurchaseOrderForms.tsx:662 +msgid "Store at default location" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:677 +msgid "Store at line item destination " +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:689 +msgid "Store with already received stock" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:713 #: src/pages/build/BuildDetail.tsx:340 #: src/pages/stock/StockDetail.tsx:280 #: src/pages/stock/StockDetail.tsx:952 #: src/tables/Filter.tsx:83 -#: src/tables/build/BuildAllocatedStockTable.tsx:128 +#: src/tables/build/BuildAllocatedStockTable.tsx:125 #: src/tables/build/BuildOutputTable.tsx:112 -#: src/tables/part/PartTestResultTable.tsx:260 -#: src/tables/part/PartTestResultTable.tsx:281 +#: src/tables/part/PartTestResultTable.tsx:268 +#: src/tables/part/PartTestResultTable.tsx:289 #: src/tables/sales/SalesOrderAllocationTable.tsx:149 msgid "Batch Code" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:662 +#: src/forms/PurchaseOrderForms.tsx:714 msgid "Enter batch code for received items" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:675 +#: src/forms/PurchaseOrderForms.tsx:727 #: src/forms/StockForms.tsx:218 msgid "Serial Numbers" msgstr "Nomor Seri" -#: src/forms/PurchaseOrderForms.tsx:676 +#: src/forms/PurchaseOrderForms.tsx:728 msgid "Enter serial numbers for received items" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:690 +#: src/forms/PurchaseOrderForms.tsx:742 #: src/pages/stock/StockDetail.tsx:382 #: src/tables/stock/StockItemTable.tsx:294 msgid "Expiry Date" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:691 +#: src/forms/PurchaseOrderForms.tsx:743 msgid "Enter an expiry date for received items" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:703 +#: src/forms/PurchaseOrderForms.tsx:755 #: src/forms/StockForms.tsx:728 #: src/pages/company/SupplierPartDetail.tsx:172 #: src/pages/company/SupplierPartDetail.tsx:236 @@ -4701,19 +4708,19 @@ msgstr "" msgid "Packaging" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:727 +#: src/forms/PurchaseOrderForms.tsx:779 #: src/pages/company/SupplierPartDetail.tsx:120 #: src/tables/ColumnRenderers.tsx:332 msgid "Note" msgstr "Catatan" -#: src/forms/PurchaseOrderForms.tsx:799 +#: src/forms/PurchaseOrderForms.tsx:851 #: src/pages/company/SupplierPartDetail.tsx:138 #: src/tables/purchasing/SupplierPriceBreakTable.tsx:49 msgid "SKU" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:800 +#: src/forms/PurchaseOrderForms.tsx:852 #: src/tables/part/PartPurchaseOrdersTable.tsx:127 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:213 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:283 @@ -4721,11 +4728,11 @@ msgstr "" msgid "Received" msgstr "Telah diterima" -#: src/forms/PurchaseOrderForms.tsx:817 +#: src/forms/PurchaseOrderForms.tsx:869 msgid "Receive Line Items" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:823 +#: src/forms/PurchaseOrderForms.tsx:875 msgid "Items received" msgstr "" @@ -4737,7 +4744,7 @@ msgstr "" msgid "Item received into stock" msgstr "" -#: src/forms/SalesOrderForms.tsx:401 +#: src/forms/SalesOrderForms.tsx:419 msgid "Leave blank to use the order address" msgstr "" @@ -5932,6 +5939,9 @@ msgstr "" #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:310 #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:401 +#: src/tables/build/BuildAllocatedStockTable.tsx:181 +#: src/tables/build/BuildLineTable.tsx:668 +#: src/tables/sales/SalesOrderAllocationTable.tsx:220 msgid "Confirm Removal" msgstr "" @@ -6870,8 +6880,8 @@ msgstr "" #: src/pages/sales/ReturnOrderDetail.tsx:108 #: src/pages/sales/SalesOrderDetail.tsx:98 #: src/tables/ColumnRenderers.tsx:321 -#: src/tables/build/BuildAllocatedStockTable.tsx:115 -#: src/tables/build/BuildLineTable.tsx:352 +#: src/tables/build/BuildAllocatedStockTable.tsx:112 +#: src/tables/build/BuildLineTable.tsx:353 msgid "Reference" msgstr "" @@ -7132,7 +7142,7 @@ msgstr "" #: src/pages/build/BuildDetail.tsx:742 #: src/pages/stock/StockDetail.tsx:344 -#: src/tables/build/BuildAllocatedStockTable.tsx:85 +#: src/tables/build/BuildAllocatedStockTable.tsx:82 #: src/tables/part/PartBuildAllocationsTable.tsx:45 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:157 #: src/tables/stock/StockTrackingTable.tsx:109 @@ -7600,7 +7610,7 @@ msgstr "" #: src/pages/part/PartDetail.tsx:542 #: src/tables/bom/BomTable.tsx:439 -#: src/tables/build/BuildLineTable.tsx:305 +#: src/tables/build/BuildLineTable.tsx:306 #: src/tables/part/PartTable.tsx:319 #: src/tables/sales/SalesOrderLineItemTable.tsx:138 msgid "Available Stock" @@ -7608,7 +7618,7 @@ msgstr "" #: src/pages/part/PartDetail.tsx:548 #: src/tables/bom/BomTable.tsx:341 -#: src/tables/build/BuildLineTable.tsx:267 +#: src/tables/build/BuildLineTable.tsx:268 #: src/tables/sales/SalesOrderLineItemTable.tsx:180 msgid "On order" msgstr "" @@ -7782,7 +7792,7 @@ msgstr "" #: src/pages/part/PartDetail.tsx:1144 #: src/pages/stock/StockDetail.tsx:884 -#: src/tables/build/BuildLineTable.tsx:761 +#: src/tables/build/BuildLineTable.tsx:768 msgid "Order Stock" msgstr "" @@ -9219,13 +9229,13 @@ msgstr "" #~ msgstr "Show asssmbled items" #: src/tables/bom/BomTable.tsx:315 -#: src/tables/build/BuildLineTable.tsx:276 +#: src/tables/build/BuildLineTable.tsx:277 #: src/tables/part/PartTable.tsx:145 msgid "External stock" msgstr "" #: src/tables/bom/BomTable.tsx:323 -#: src/tables/build/BuildLineTable.tsx:239 +#: src/tables/build/BuildLineTable.tsx:240 msgid "Includes substitute stock" msgstr "" @@ -9234,7 +9244,7 @@ msgstr "" #~ msgstr "Edit Bom Item" #: src/tables/bom/BomTable.tsx:332 -#: src/tables/build/BuildLineTable.tsx:249 +#: src/tables/build/BuildLineTable.tsx:250 #: src/tables/sales/SalesOrderLineItemTable.tsx:166 msgid "Includes variant stock" msgstr "" @@ -9272,8 +9282,8 @@ msgid "Stock Information" msgstr "" #: src/tables/bom/BomTable.tsx:399 -#: src/tables/build/BuildLineTable.tsx:496 -#: src/tables/build/BuildLineTable.tsx:537 +#: src/tables/build/BuildLineTable.tsx:497 +#: src/tables/build/BuildLineTable.tsx:538 msgid "Consumable item" msgstr "" @@ -9282,7 +9292,7 @@ msgid "No available stock" msgstr "" #: src/tables/bom/BomTable.tsx:420 -#: src/tables/build/BuildLineTable.tsx:213 +#: src/tables/build/BuildLineTable.tsx:214 msgid "Show testable items" msgstr "" @@ -9291,7 +9301,7 @@ msgid "Show trackable items" msgstr "" #: src/tables/bom/BomTable.tsx:430 -#: src/tables/build/BuildLineTable.tsx:208 +#: src/tables/build/BuildLineTable.tsx:209 msgid "Show assembled items" msgstr "" @@ -9335,7 +9345,7 @@ msgstr "" #: src/tables/bom/BomTable.tsx:464 #: src/tables/bom/UsedInTable.tsx:85 -#: src/tables/build/BuildLineTable.tsx:202 +#: src/tables/build/BuildLineTable.tsx:203 msgid "Optional" msgstr "" @@ -9345,7 +9355,7 @@ msgid "Show optional items" msgstr "" #: src/tables/bom/BomTable.tsx:469 -#: src/tables/build/BuildLineTable.tsx:197 +#: src/tables/build/BuildLineTable.tsx:198 msgid "Consumable" msgstr "" @@ -9433,7 +9443,7 @@ msgid "Bill of materials cannot be edited, as the part is locked" msgstr "" #: src/tables/bom/UsedInTable.tsx:34 -#: src/tables/build/BuildLineTable.tsx:207 +#: src/tables/build/BuildLineTable.tsx:208 #: src/tables/part/ParametricPartTable.tsx:364 #: src/tables/part/PartBuildAllocationsTable.tsx:60 #: src/tables/part/PartTable.tsx:209 @@ -9455,11 +9465,11 @@ msgstr "" msgid "Show trackable assemblies" msgstr "" -#: src/tables/build/BuildAllocatedStockTable.tsx:67 +#: src/tables/build/BuildAllocatedStockTable.tsx:64 msgid "Allocated to Output" msgstr "" -#: src/tables/build/BuildAllocatedStockTable.tsx:68 +#: src/tables/build/BuildAllocatedStockTable.tsx:65 msgid "Show items allocated to a build output" msgstr "" @@ -9472,7 +9482,7 @@ msgstr "" #~ msgid "Include orders for part variants" #~ msgstr "Include orders for part variants" -#: src/tables/build/BuildAllocatedStockTable.tsx:97 +#: src/tables/build/BuildAllocatedStockTable.tsx:94 #: src/tables/part/PartBuildAllocationsTable.tsx:84 #: src/tables/part/PartPurchaseOrdersTable.tsx:132 #: src/tables/part/PartSalesAllocationsTable.tsx:69 @@ -9482,40 +9492,58 @@ msgid "Order Status" msgstr "" #: src/tables/build/BuildAllocatedStockTable.tsx:164 -#~ msgid "Edit Build Item" -#~ msgstr "Edit Build Item" - -#: src/tables/build/BuildAllocatedStockTable.tsx:167 -#: src/tables/build/BuildLineTable.tsx:650 +#: src/tables/build/BuildLineTable.tsx:651 msgid "Edit Stock Allocation" msgstr "" +#: src/tables/build/BuildAllocatedStockTable.tsx:164 +#~ msgid "Edit Build Item" +#~ msgstr "Edit Build Item" + #: src/tables/build/BuildAllocatedStockTable.tsx:174 #~ msgid "Delete Build Item" #~ msgstr "Delete Build Item" -#: src/tables/build/BuildAllocatedStockTable.tsx:180 -#: src/tables/build/BuildLineTable.tsx:663 -msgid "Delete Stock Allocation" +#: src/tables/build/BuildAllocatedStockTable.tsx:177 +#: src/tables/build/BuildLineTable.tsx:664 +#: src/tables/sales/SalesOrderAllocationTable.tsx:218 +msgid "Remove Allocated Stock" msgstr "" -#: src/tables/build/BuildAllocatedStockTable.tsx:239 +#: src/tables/build/BuildAllocatedStockTable.tsx:180 +#: src/tables/build/BuildLineTable.tsx:663 +#~ msgid "Delete Stock Allocation" +#~ msgstr "Delete Stock Allocation" + +#: src/tables/build/BuildAllocatedStockTable.tsx:182 +#: src/tables/build/BuildLineTable.tsx:669 +#: src/tables/sales/SalesOrderAllocationTable.tsx:221 +msgid "Are you sure you want to remove this allocated stock from the order?" +msgstr "" + +#: src/tables/build/BuildAllocatedStockTable.tsx:242 msgid "Consume" msgstr "" +#: src/tables/build/BuildAllocatedStockTable.tsx:259 +#: src/tables/build/BuildLineTable.tsx:112 +#: src/tables/sales/SalesOrderAllocationTable.tsx:248 +msgid "Remove allocated stock" +msgstr "" + #: src/tables/build/BuildLineTable.tsx:59 #~ msgid "Show lines with available stock" #~ msgstr "Show lines with available stock" -#: src/tables/build/BuildLineTable.tsx:120 +#: src/tables/build/BuildLineTable.tsx:121 msgid "View Stock Item" msgstr "" -#: src/tables/build/BuildLineTable.tsx:183 +#: src/tables/build/BuildLineTable.tsx:184 msgid "Show fully allocated lines" msgstr "" -#: src/tables/build/BuildLineTable.tsx:188 +#: src/tables/build/BuildLineTable.tsx:189 msgid "Show fully consumed lines" msgstr "" @@ -9523,124 +9551,124 @@ msgstr "" #~ msgid "Show allocated lines" #~ msgstr "Show allocated lines" -#: src/tables/build/BuildLineTable.tsx:193 +#: src/tables/build/BuildLineTable.tsx:194 msgid "Show items with sufficient available stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:198 +#: src/tables/build/BuildLineTable.tsx:199 msgid "Show consumable lines" msgstr "" -#: src/tables/build/BuildLineTable.tsx:203 +#: src/tables/build/BuildLineTable.tsx:204 msgid "Show optional lines" msgstr "" -#: src/tables/build/BuildLineTable.tsx:212 +#: src/tables/build/BuildLineTable.tsx:213 #: src/tables/part/PartTable.tsx:233 msgid "Testable" msgstr "" -#: src/tables/build/BuildLineTable.tsx:217 +#: src/tables/build/BuildLineTable.tsx:218 #: src/tables/stock/StockItemTable.tsx:388 msgid "Tracked" msgstr "" -#: src/tables/build/BuildLineTable.tsx:218 +#: src/tables/build/BuildLineTable.tsx:219 msgid "Show tracked lines" msgstr "" -#: src/tables/build/BuildLineTable.tsx:223 +#: src/tables/build/BuildLineTable.tsx:224 msgid "Show items with stock on order" msgstr "" -#: src/tables/build/BuildLineTable.tsx:258 +#: src/tables/build/BuildLineTable.tsx:259 #: src/tables/sales/SalesOrderLineItemTable.tsx:172 msgid "In production" msgstr "" -#: src/tables/build/BuildLineTable.tsx:286 +#: src/tables/build/BuildLineTable.tsx:287 msgid "Insufficient stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:302 +#: src/tables/build/BuildLineTable.tsx:303 #: src/tables/sales/SalesOrderLineItemTable.tsx:160 #: src/tables/stock/StockItemTable.tsx:191 msgid "No stock available" msgstr "" -#: src/tables/build/BuildLineTable.tsx:375 +#: src/tables/build/BuildLineTable.tsx:376 msgid "Gets Inherited" msgstr "" -#: src/tables/build/BuildLineTable.tsx:388 +#: src/tables/build/BuildLineTable.tsx:389 msgid "Unit Quantity" msgstr "" -#: src/tables/build/BuildLineTable.tsx:415 +#: src/tables/build/BuildLineTable.tsx:416 msgid "Setup Quantity" msgstr "" -#: src/tables/build/BuildLineTable.tsx:424 +#: src/tables/build/BuildLineTable.tsx:425 msgid "Attrition" msgstr "" -#: src/tables/build/BuildLineTable.tsx:432 +#: src/tables/build/BuildLineTable.tsx:433 msgid "Rounding Multiple" msgstr "" -#: src/tables/build/BuildLineTable.tsx:441 +#: src/tables/build/BuildLineTable.tsx:442 msgid "BOM Information" msgstr "" -#: src/tables/build/BuildLineTable.tsx:515 +#: src/tables/build/BuildLineTable.tsx:516 #: src/tables/part/PartBuildAllocationsTable.tsx:102 msgid "Fully allocated" msgstr "" -#: src/tables/build/BuildLineTable.tsx:563 +#: src/tables/build/BuildLineTable.tsx:564 #: src/tables/sales/SalesOrderLineItemTable.tsx:311 msgid "Create Build Order" msgstr "" -#: src/tables/build/BuildLineTable.tsx:592 +#: src/tables/build/BuildLineTable.tsx:593 msgid "Auto allocation in progress" msgstr "" -#: src/tables/build/BuildLineTable.tsx:595 -#: src/tables/build/BuildLineTable.tsx:802 +#: src/tables/build/BuildLineTable.tsx:596 +#: src/tables/build/BuildLineTable.tsx:809 msgid "Auto Allocate Stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:596 +#: src/tables/build/BuildLineTable.tsx:597 msgid "Automatically allocate stock to this build according to the selected options" msgstr "" -#: src/tables/build/BuildLineTable.tsx:616 -#: src/tables/build/BuildLineTable.tsx:630 -#: src/tables/build/BuildLineTable.tsx:751 -#: src/tables/build/BuildLineTable.tsx:852 +#: src/tables/build/BuildLineTable.tsx:617 +#: src/tables/build/BuildLineTable.tsx:631 +#: src/tables/build/BuildLineTable.tsx:758 +#: src/tables/build/BuildLineTable.tsx:859 #: src/tables/build/BuildOutputTable.tsx:355 #: src/tables/build/BuildOutputTable.tsx:360 msgid "Deallocate Stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:632 +#: src/tables/build/BuildLineTable.tsx:633 msgid "Deallocate all untracked stock for this build order" msgstr "" -#: src/tables/build/BuildLineTable.tsx:634 +#: src/tables/build/BuildLineTable.tsx:635 msgid "Deallocate stock from the selected line item" msgstr "" -#: src/tables/build/BuildLineTable.tsx:638 +#: src/tables/build/BuildLineTable.tsx:639 msgid "Stock has been deallocated" msgstr "" -#: src/tables/build/BuildLineTable.tsx:771 +#: src/tables/build/BuildLineTable.tsx:778 msgid "Build Stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:784 +#: src/tables/build/BuildLineTable.tsx:791 #: src/tables/sales/SalesOrderLineItemTable.tsx:487 msgid "View Part" msgstr "" @@ -9739,7 +9767,7 @@ msgid "Serialize Build Output" msgstr "" #: src/tables/build/BuildOutputTable.tsx:405 -#: src/tables/part/PartTestResultTable.tsx:310 +#: src/tables/part/PartTestResultTable.tsx:318 #: src/tables/stock/StockItemTable.tsx:328 msgid "Filter by stock status" msgstr "" @@ -9964,8 +9992,8 @@ msgid "View Item" msgstr "" #: src/tables/general/ExtraLineItemTable.tsx:95 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:299 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:403 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:300 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:405 #: src/tables/sales/ReturnOrderLineItemTable.tsx:83 #: src/tables/sales/ReturnOrderLineItemTable.tsx:187 #: src/tables/sales/SalesOrderLineItemTable.tsx:252 @@ -9974,14 +10002,14 @@ msgid "Add Line Item" msgstr "" #: src/tables/general/ExtraLineItemTable.tsx:108 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:320 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:322 #: src/tables/sales/ReturnOrderLineItemTable.tsx:96 #: src/tables/sales/SalesOrderLineItemTable.tsx:271 msgid "Edit Line Item" msgstr "" #: src/tables/general/ExtraLineItemTable.tsx:117 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:329 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:331 #: src/tables/sales/ReturnOrderLineItemTable.tsx:105 #: src/tables/sales/SalesOrderLineItemTable.tsx:280 msgid "Delete Line Item" @@ -10273,7 +10301,7 @@ msgid "Required Stock" msgstr "" #: src/tables/part/PartBuildAllocationsTable.tsx:124 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:381 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:383 msgid "View Build Order" msgstr "" @@ -10617,8 +10645,8 @@ msgstr "" #: src/tables/part/PartTestResultTable.tsx:103 #: src/tables/part/PartTestResultTable.tsx:181 -#: src/tables/part/PartTestResultTable.tsx:320 -#: src/tables/part/PartTestResultTable.tsx:334 +#: src/tables/part/PartTestResultTable.tsx:328 +#: src/tables/part/PartTestResultTable.tsx:342 #: src/tables/stock/StockItemTestResultTable.tsx:296 #: src/tables/stock/StockItemTestResultTable.tsx:368 #: src/tables/stock/StockItemTestResultTable.tsx:429 @@ -10643,7 +10671,7 @@ msgstr "" msgid "No Result" msgstr "" -#: src/tables/part/PartTestResultTable.tsx:298 +#: src/tables/part/PartTestResultTable.tsx:306 msgid "Show build outputs currently in production" msgstr "" @@ -11073,7 +11101,7 @@ msgid "Show manufacturer parts for active manufacturers." msgstr "" #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:115 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:397 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:399 msgid "Import Line Items" msgstr "" @@ -11099,11 +11127,11 @@ msgstr "" #~ msgid "Add line item" #~ msgstr "Add line item" -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:350 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:352 msgid "Receive line item" msgstr "" -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:414 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:416 msgid "Receive items" msgstr "" @@ -11201,25 +11229,25 @@ msgid "Not shipped" msgstr "" #: src/tables/sales/SalesOrderAllocationTable.tsx:211 -#: src/tables/sales/SalesOrderAllocationTable.tsx:229 +#: src/tables/sales/SalesOrderAllocationTable.tsx:235 msgid "Edit Allocation" msgstr "" #: src/tables/sales/SalesOrderAllocationTable.tsx:218 #: src/tables/sales/SalesOrderAllocationTable.tsx:241 -msgid "Delete Allocation" -msgstr "" +#~ msgid "Delete Allocation" +#~ msgstr "Delete Allocation" -#: src/tables/sales/SalesOrderAllocationTable.tsx:252 -#: src/tables/sales/SalesOrderAllocationTable.tsx:253 +#: src/tables/sales/SalesOrderAllocationTable.tsx:261 +#: src/tables/sales/SalesOrderAllocationTable.tsx:262 msgid "View Shipment" msgstr "" -#: src/tables/sales/SalesOrderAllocationTable.tsx:308 +#: src/tables/sales/SalesOrderAllocationTable.tsx:317 msgid "Assign to Shipment" msgstr "" -#: src/tables/sales/SalesOrderAllocationTable.tsx:324 +#: src/tables/sales/SalesOrderAllocationTable.tsx:333 msgid "Assign to shipment" msgstr "" diff --git a/src/frontend/src/locales/it/messages.po b/src/frontend/src/locales/it/messages.po index ee28ede359..73366f217d 100644 --- a/src/frontend/src/locales/it/messages.po +++ b/src/frontend/src/locales/it/messages.po @@ -8,7 +8,7 @@ msgstr "" "Language: it\n" "Project-Id-Version: inventree\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2025-11-19 19:39\n" +"PO-Revision-Date: 2025-11-22 06:25\n" "Last-Translator: \n" "Language-Team: Italian\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" @@ -56,7 +56,7 @@ msgstr "Annulla" #: lib/components/RowActions.tsx:136 #: src/components/nav/NavigationDrawer.tsx:190 -#: src/forms/PurchaseOrderForms.tsx:802 +#: src/forms/PurchaseOrderForms.tsx:854 #: src/forms/StockForms.tsx:796 #: src/forms/StockForms.tsx:843 #: src/forms/StockForms.tsx:889 @@ -103,9 +103,9 @@ msgstr "No" #: src/forms/BuildForms.tsx:630 #: src/forms/BuildForms.tsx:793 #: src/forms/BuildForms.tsx:896 -#: src/forms/PurchaseOrderForms.tsx:798 +#: src/forms/PurchaseOrderForms.tsx:850 #: src/forms/ReturnOrderForms.tsx:242 -#: src/forms/SalesOrderForms.tsx:305 +#: src/forms/SalesOrderForms.tsx:323 #: src/forms/StockForms.tsx:360 #: src/forms/StockForms.tsx:791 #: src/forms/StockForms.tsx:838 @@ -119,6 +119,7 @@ msgstr "No" #: src/pages/build/BuildDetail.tsx:200 #: src/pages/part/PartDetail.tsx:1207 #: src/tables/ColumnRenderers.tsx:91 +#: src/tables/part/PartTestResultTable.tsx:247 #: src/tables/part/RelatedPartTable.tsx:53 #: src/tables/stock/StockTrackingTable.tsx:87 msgid "Part" @@ -158,7 +159,7 @@ msgstr "Modelli Test Articolo" #: src/components/wizards/OrderPartsWizard.tsx:290 #: src/pages/company/SupplierPartDetail.tsx:413 #: src/pages/stock/StockDetail.tsx:289 -#: src/tables/build/BuildAllocatedStockTable.tsx:155 +#: src/tables/build/BuildAllocatedStockTable.tsx:152 #: src/tables/part/PartPurchaseOrdersTable.tsx:50 #: src/tables/purchasing/SupplierPartTable.tsx:83 #: src/tables/stock/StockItemTable.tsx:247 @@ -201,9 +202,9 @@ msgstr "Categorie Articolo" #: src/forms/BuildForms.tsx:473 #: src/forms/BuildForms.tsx:633 #: src/forms/BuildForms.tsx:794 -#: src/forms/SalesOrderForms.tsx:307 +#: src/forms/SalesOrderForms.tsx:325 #: src/pages/stock/StockDetail.tsx:1005 -#: src/tables/part/PartTestResultTable.tsx:248 +#: src/tables/part/PartTestResultTable.tsx:256 #: src/tables/stock/StockTrackingTable.tsx:48 #: src/tables/stock/StockTrackingTable.tsx:55 msgid "Stock Item" @@ -517,7 +518,7 @@ msgstr "Elenchi di selezione" #: src/components/dashboard/DashboardLayout.tsx:281 #: src/components/editors/NotesEditor.tsx:74 #: src/components/editors/TemplateEditor/TemplateEditor.tsx:158 -#: src/components/forms/fields/ApiFormField.tsx:273 +#: src/components/forms/fields/ApiFormField.tsx:237 #: src/components/forms/fields/TableField.tsx:45 #: src/components/importer/ImportDataSelector.tsx:192 #: src/components/importer/ImporterColumnSelector.tsx:234 @@ -642,8 +643,8 @@ msgstr "Inserire il codice a barre" #: src/components/barcodes/BarcodeScanDialog.tsx:49 #: src/components/buttons/ScanButton.tsx:15 #: src/components/nav/NavigationDrawer.tsx:122 -#: src/forms/PurchaseOrderForms.tsx:457 -#: src/forms/PurchaseOrderForms.tsx:563 +#: src/forms/PurchaseOrderForms.tsx:509 +#: src/forms/PurchaseOrderForms.tsx:615 msgid "Scan Barcode" msgstr "Scansiona codice a barre" @@ -728,7 +729,7 @@ msgstr "Questo rimuoverà il collegamento al codice a barre associato" #: src/components/barcodes/QRCode.tsx:205 #: src/components/items/ActionDropdown.tsx:192 -#: src/forms/PurchaseOrderForms.tsx:554 +#: src/forms/PurchaseOrderForms.tsx:606 msgid "Unlink Barcode" msgstr "Scollega Codice a Barre" @@ -1216,6 +1217,12 @@ msgstr "Rimuovi l'immagine associata all'articolo?" #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:884 #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:903 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:254 +#: src/tables/build/BuildAllocatedStockTable.tsx:178 +#: src/tables/build/BuildAllocatedStockTable.tsx:258 +#: src/tables/build/BuildLineTable.tsx:111 +#: src/tables/build/BuildLineTable.tsx:665 +#: src/tables/sales/SalesOrderAllocationTable.tsx:224 +#: src/tables/sales/SalesOrderAllocationTable.tsx:247 msgid "Remove" msgstr "Rimuovi" @@ -1241,7 +1248,7 @@ msgid "Upload Error" msgstr "Errore Di Caricamento" #: src/components/details/DetailsImage.tsx:250 -#: src/components/forms/fields/TextField.tsx:65 +#: src/components/forms/fields/AutoFillRightSection.tsx:34 msgid "Clear" msgstr "Elimina" @@ -1817,10 +1824,14 @@ msgstr "Fermato" msgid "Running" msgstr "In Esecuzione" -#: src/components/forms/fields/ApiFormField.tsx:233 +#: src/components/forms/fields/ApiFormField.tsx:197 msgid "Select file to upload" msgstr "Seleziona file da caricare" +#: src/components/forms/fields/AutoFillRightSection.tsx:47 +msgid "Accept suggested value" +msgstr "Accetta il valore suggerito" + #: src/components/forms/fields/DateField.tsx:76 msgid "Select date" msgstr "Seleziona data" @@ -1875,10 +1886,6 @@ msgstr "Nessuna voce disponibile" msgid "Add new row" msgstr "Aggiungi nuova riga" -#: src/components/forms/fields/TextField.tsx:82 -msgid "Accept suggested value" -msgstr "Accetta il valore suggerito" - #: src/components/images/DetailsImage.tsx:252 #~ msgid "Select image" #~ msgstr "Select image" @@ -2225,8 +2232,8 @@ msgstr "Nessun articolo" #: src/pages/part/PartDetail.tsx:994 #: src/pages/stock/StockDetail.tsx:265 #: src/pages/stock/StockDetail.tsx:942 -#: src/tables/build/BuildAllocatedStockTable.tsx:135 -#: src/tables/build/BuildLineTable.tsx:192 +#: src/tables/build/BuildAllocatedStockTable.tsx:132 +#: src/tables/build/BuildLineTable.tsx:193 #: src/tables/part/PartTable.tsx:137 #: src/tables/stock/StockItemTable.tsx:182 #: src/tables/stock/StockItemTable.tsx:343 @@ -2784,7 +2791,7 @@ msgstr "Informazioni Plugin" #: src/pages/sales/SalesOrderDetail.tsx:119 #: src/pages/stock/LocationDetail.tsx:102 #: src/tables/ColumnRenderers.tsx:278 -#: src/tables/build/BuildAllocatedStockTable.tsx:91 +#: src/tables/build/BuildAllocatedStockTable.tsx:88 #: src/tables/machine/MachineTypeTable.tsx:161 #: src/tables/machine/MachineTypeTable.tsx:257 #: src/tables/plugin/PluginListTable.tsx:110 @@ -2966,7 +2973,7 @@ msgstr "Nessuno stock" #: src/pages/company/SupplierPartDetail.tsx:394 #: src/pages/part/PartDetail.tsx:1015 #: src/tables/bom/BomTable.tsx:444 -#: src/tables/build/BuildLineTable.tsx:222 +#: src/tables/build/BuildLineTable.tsx:223 #: src/tables/part/PartTable.tsx:108 msgid "On Order" msgstr "In ordine" @@ -2976,7 +2983,7 @@ msgstr "In ordine" #: src/pages/part/PartDetail.tsx:587 #: src/pages/part/PartDetail.tsx:1021 #: src/pages/stock/StockDetail.tsx:925 -#: src/tables/part/PartTestResultTable.tsx:297 +#: src/tables/part/PartTestResultTable.tsx:305 #: src/tables/stock/StockItemTable.tsx:359 msgid "In Production" msgstr "In Produzione" @@ -3000,7 +3007,7 @@ msgstr "Categoria" #: src/components/render/Stock.tsx:114 #: src/components/render/Stock.tsx:132 #: src/forms/BuildForms.tsx:795 -#: src/forms/PurchaseOrderForms.tsx:595 +#: src/forms/PurchaseOrderForms.tsx:647 #: src/forms/StockForms.tsx:792 #: src/forms/StockForms.tsx:839 #: src/forms/StockForms.tsx:885 @@ -3023,7 +3030,7 @@ msgstr "Posizione" #: src/components/render/Stock.tsx:99 #: src/pages/stock/StockDetail.tsx:198 #: src/pages/stock/StockDetail.tsx:930 -#: src/tables/build/BuildAllocatedStockTable.tsx:121 +#: src/tables/build/BuildAllocatedStockTable.tsx:118 #: src/tables/build/BuildOutputTable.tsx:107 #: src/tables/sales/SalesOrderAllocationTable.tsx:142 msgid "Serial Number" @@ -3034,9 +3041,9 @@ msgstr "Numero Seriale" #: src/forms/BuildForms.tsx:240 #: src/forms/BuildForms.tsx:634 #: src/forms/BuildForms.tsx:797 -#: src/forms/PurchaseOrderForms.tsx:801 +#: src/forms/PurchaseOrderForms.tsx:853 #: src/forms/ReturnOrderForms.tsx:243 -#: src/forms/SalesOrderForms.tsx:308 +#: src/forms/SalesOrderForms.tsx:326 #: src/forms/StockForms.tsx:841 #: src/pages/part/PartStockHistoryDetail.tsx:56 #: src/pages/part/PartStockHistoryDetail.tsx:210 @@ -3046,9 +3053,9 @@ msgstr "Numero Seriale" #: src/pages/part/pricing/PriceBreakPanel.tsx:172 #: src/pages/stock/StockDetail.tsx:258 #: src/pages/stock/StockDetail.tsx:936 -#: src/tables/build/BuildLineTable.tsx:86 +#: src/tables/build/BuildLineTable.tsx:83 #: src/tables/part/PartPurchaseOrdersTable.tsx:94 -#: src/tables/part/PartTestResultTable.tsx:269 +#: src/tables/part/PartTestResultTable.tsx:277 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:175 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:206 #: src/tables/purchasing/SupplierPriceBreakTable.tsx:69 @@ -3070,7 +3077,7 @@ msgstr "Quantità" #: src/forms/StockForms.tsx:1048 #: src/forms/StockForms.tsx:1096 #: src/forms/StockForms.tsx:1140 -#: src/tables/build/BuildLineTable.tsx:96 +#: src/tables/build/BuildLineTable.tsx:93 msgid "Batch" msgstr "Lotto" @@ -3755,7 +3762,7 @@ msgid "In Stock" msgstr "In giacenza" #: src/components/wizards/OrderPartsWizard.tsx:146 -#: src/tables/build/BuildLineTable.tsx:404 +#: src/tables/build/BuildLineTable.tsx:405 msgid "Required Quantity" msgstr "Quantità richiesta" @@ -3847,7 +3854,7 @@ msgid "Please correct the errors in the selected parts" msgstr "Si prega di correggere gli errori negli articoli selezionati" #: src/components/wizards/OrderPartsWizard.tsx:587 -#: src/tables/build/BuildLineTable.tsx:815 +#: src/tables/build/BuildLineTable.tsx:822 #: src/tables/part/PartTable.tsx:522 #: src/tables/sales/SalesOrderLineItemTable.tsx:370 msgid "Order Parts" @@ -4349,9 +4356,9 @@ msgstr "Sostitutivo aggiunto" #: src/forms/BuildForms.tsx:333 #: src/forms/BuildForms.tsx:408 #: src/forms/BuildForms.tsx:685 -#: src/tables/build/BuildAllocatedStockTable.tsx:150 +#: src/tables/build/BuildAllocatedStockTable.tsx:147 #: src/tables/build/BuildOutputTable.tsx:582 -#: src/tables/part/PartTestResultTable.tsx:272 +#: src/tables/part/PartTestResultTable.tsx:280 msgid "Build Output" msgstr "Output produzione" @@ -4362,7 +4369,7 @@ msgstr "Quantità da completare" #: src/forms/BuildForms.tsx:336 #: src/forms/BuildForms.tsx:411 #: src/forms/BuildForms.tsx:475 -#: src/forms/PurchaseOrderForms.tsx:717 +#: src/forms/PurchaseOrderForms.tsx:769 #: src/forms/ReturnOrderForms.tsx:197 #: src/forms/ReturnOrderForms.tsx:244 #: src/forms/StockForms.tsx:712 @@ -4377,7 +4384,7 @@ msgstr "Quantità da completare" #: src/tables/build/BuildOutputTable.tsx:404 #: src/tables/machine/MachineListTable.tsx:387 #: src/tables/part/PartPurchaseOrdersTable.tsx:38 -#: src/tables/part/PartTestResultTable.tsx:309 +#: src/tables/part/PartTestResultTable.tsx:317 #: src/tables/sales/ReturnOrderLineItemTable.tsx:138 #: src/tables/sales/ReturnOrderLineItemTable.tsx:176 #: src/tables/settings/CustomStateTable.tsx:79 @@ -4450,8 +4457,8 @@ msgstr "Gli output di produzione sono stati cancellati" #: src/pages/stock/StockDetail.tsx:153 #: src/tables/bom/BomTable.tsx:134 #: src/tables/bom/UsedInTable.tsx:40 -#: src/tables/build/BuildAllocatedStockTable.tsx:108 -#: src/tables/build/BuildLineTable.tsx:336 +#: src/tables/build/BuildAllocatedStockTable.tsx:105 +#: src/tables/build/BuildLineTable.tsx:337 #: src/tables/build/BuildOrderTable.tsx:79 #: src/tables/part/PartSalesAllocationsTable.tsx:61 #: src/tables/part/RelatedPartTable.tsx:73 @@ -4466,54 +4473,54 @@ msgstr "IPN" #: src/forms/BuildForms.tsx:632 #: src/forms/BuildForms.tsx:796 #: src/forms/BuildForms.tsx:897 -#: src/forms/SalesOrderForms.tsx:306 -#: src/tables/build/BuildAllocatedStockTable.tsx:139 -#: src/tables/build/BuildLineTable.tsx:182 +#: src/forms/SalesOrderForms.tsx:324 +#: src/tables/build/BuildAllocatedStockTable.tsx:136 +#: src/tables/build/BuildLineTable.tsx:183 #: src/tables/sales/SalesOrderLineItemTable.tsx:342 #: src/tables/stock/StockItemTable.tsx:338 msgid "Allocated" msgstr "Allocato" #: src/forms/BuildForms.tsx:667 -#: src/forms/SalesOrderForms.tsx:295 +#: src/forms/SalesOrderForms.tsx:313 #: src/pages/build/BuildDetail.tsx:108 #: src/pages/build/BuildDetail.tsx:326 msgid "Source Location" msgstr "Posizione sorgente" #: src/forms/BuildForms.tsx:668 -#: src/forms/SalesOrderForms.tsx:296 +#: src/forms/SalesOrderForms.tsx:314 msgid "Select the source location for the stock allocation" msgstr "Selezionare la posizione di origine per l'assegnazione dello stock" #: src/forms/BuildForms.tsx:700 -#: src/forms/SalesOrderForms.tsx:336 -#: src/tables/build/BuildLineTable.tsx:574 -#: src/tables/build/BuildLineTable.tsx:731 -#: src/tables/build/BuildLineTable.tsx:830 +#: src/forms/SalesOrderForms.tsx:354 +#: src/tables/build/BuildLineTable.tsx:575 +#: src/tables/build/BuildLineTable.tsx:738 +#: src/tables/build/BuildLineTable.tsx:837 #: src/tables/sales/SalesOrderLineItemTable.tsx:380 #: src/tables/sales/SalesOrderLineItemTable.tsx:406 msgid "Allocate Stock" msgstr "Assegna Scorte" #: src/forms/BuildForms.tsx:703 -#: src/forms/SalesOrderForms.tsx:341 +#: src/forms/SalesOrderForms.tsx:359 msgid "Stock items allocated" msgstr "Articoli di stock assegnati" #: src/forms/BuildForms.tsx:816 #: src/forms/BuildForms.tsx:917 -#: src/tables/build/BuildAllocatedStockTable.tsx:240 -#: src/tables/build/BuildAllocatedStockTable.tsx:272 -#: src/tables/build/BuildLineTable.tsx:741 -#: src/tables/build/BuildLineTable.tsx:864 +#: src/tables/build/BuildAllocatedStockTable.tsx:243 +#: src/tables/build/BuildAllocatedStockTable.tsx:279 +#: src/tables/build/BuildLineTable.tsx:748 +#: src/tables/build/BuildLineTable.tsx:871 msgid "Consume Stock" msgstr "Consuma Scorte" #: src/forms/BuildForms.tsx:817 #: src/forms/BuildForms.tsx:918 msgid "Stock items scheduled to be consumed" -msgstr "" +msgstr "Articoli di magazzino programmati per il consumo" #: src/forms/BuildForms.tsx:817 #: src/forms/BuildForms.tsx:918 @@ -4521,21 +4528,21 @@ msgstr "" #~ msgstr "Stock items consumed" #: src/forms/BuildForms.tsx:853 -#: src/tables/build/BuildLineTable.tsx:514 +#: src/tables/build/BuildLineTable.tsx:515 #: src/tables/part/PartBuildAllocationsTable.tsx:101 msgid "Fully consumed" msgstr "Completamente consumato" #: src/forms/BuildForms.tsx:898 -#: src/tables/build/BuildLineTable.tsx:187 +#: src/tables/build/BuildLineTable.tsx:188 #: src/tables/stock/StockItemTable.tsx:367 msgid "Consumed" msgstr "Utilizzato" #: src/forms/CommonForms.tsx:88 -#: src/forms/PurchaseOrderForms.tsx:125 +#: src/forms/PurchaseOrderForms.tsx:176 #: src/forms/ReturnOrderForms.tsx:138 -#: src/forms/SalesOrderForms.tsx:164 +#: src/forms/SalesOrderForms.tsx:182 msgid "Select project code for this line item" msgstr "Seleziona il codice progetto per questa voce di riga" @@ -4572,127 +4579,127 @@ msgstr "Categoria articolo principale" msgid "Subscribe to notifications for this category" msgstr "Sottoscrivi notifiche per questa categoria" -#: src/forms/PurchaseOrderForms.tsx:388 -msgid "Assign Batch Code and Serial Numbers" -msgstr "Assegna codice lotto e numeri di serie" - -#: src/forms/PurchaseOrderForms.tsx:390 -msgid "Assign Batch Code" -msgstr "Assegna Codice Lotto" - -#: src/forms/PurchaseOrderForms.tsx:410 -msgid "Choose Location" -msgstr "Scegliere la posizione" - -#: src/forms/PurchaseOrderForms.tsx:418 -msgid "Item Destination selected" -msgstr "Destinazione oggetto selezionata" - #: src/forms/PurchaseOrderForms.tsx:421 #~ msgid "Assign Batch Code{0}" #~ msgstr "Assign Batch Code{0}" -#: src/forms/PurchaseOrderForms.tsx:428 -msgid "Part category default location selected" -msgstr "Posizione predefinita della categoria parte selezionata" +#: src/forms/PurchaseOrderForms.tsx:440 +msgid "Assign Batch Code and Serial Numbers" +msgstr "Assegna codice lotto e numeri di serie" -#: src/forms/PurchaseOrderForms.tsx:438 -msgid "Received stock location selected" -msgstr "Posizione stock ricevuto selezionata" +#: src/forms/PurchaseOrderForms.tsx:442 +msgid "Assign Batch Code" +msgstr "Assegna Codice Lotto" #: src/forms/PurchaseOrderForms.tsx:444 #: src/forms/StockForms.tsx:428 #~ msgid "Remove item from list" #~ msgstr "Remove item from list" -#: src/forms/PurchaseOrderForms.tsx:446 +#: src/forms/PurchaseOrderForms.tsx:462 +msgid "Choose Location" +msgstr "Scegliere la posizione" + +#: src/forms/PurchaseOrderForms.tsx:470 +msgid "Item Destination selected" +msgstr "Destinazione oggetto selezionata" + +#: src/forms/PurchaseOrderForms.tsx:480 +msgid "Part category default location selected" +msgstr "Posizione predefinita della categoria parte selezionata" + +#: src/forms/PurchaseOrderForms.tsx:490 +msgid "Received stock location selected" +msgstr "Posizione stock ricevuto selezionata" + +#: src/forms/PurchaseOrderForms.tsx:498 msgid "Default location selected" msgstr "Posizione predefinita selezionata" -#: src/forms/PurchaseOrderForms.tsx:507 +#: src/forms/PurchaseOrderForms.tsx:559 msgid "Set Location" msgstr "Imposta Posizione" -#: src/forms/PurchaseOrderForms.tsx:524 -msgid "Set Expiry Date" -msgstr "Impostare una Data di Scadenza" - -#: src/forms/PurchaseOrderForms.tsx:532 -#: src/forms/StockForms.tsx:693 -msgid "Adjust Packaging" -msgstr "Regola Imballaggio" - -#: src/forms/PurchaseOrderForms.tsx:540 -#: src/forms/StockForms.tsx:684 -#: src/hooks/UseStockAdjustActions.tsx:148 -msgid "Change Status" -msgstr "Modifica Stato" - -#: src/forms/PurchaseOrderForms.tsx:546 -msgid "Add Note" -msgstr "Aggiungi Nota" - #: src/forms/PurchaseOrderForms.tsx:566 #~ msgid "Serial numbers" #~ msgstr "Serial numbers" +#: src/forms/PurchaseOrderForms.tsx:576 +msgid "Set Expiry Date" +msgstr "Impostare una Data di Scadenza" + #: src/forms/PurchaseOrderForms.tsx:582 #~ msgid "Store at line item destination" #~ msgstr "Store at line item destination" -#: src/forms/PurchaseOrderForms.tsx:610 -msgid "Store at default location" -msgstr "Memorizza nella posizione predefinita" +#: src/forms/PurchaseOrderForms.tsx:584 +#: src/forms/StockForms.tsx:693 +msgid "Adjust Packaging" +msgstr "Regola Imballaggio" -#: src/forms/PurchaseOrderForms.tsx:625 -msgid "Store at line item destination " -msgstr "Salva alla destinazione dell'articolo" +#: src/forms/PurchaseOrderForms.tsx:592 +#: src/forms/StockForms.tsx:684 +#: src/hooks/UseStockAdjustActions.tsx:148 +msgid "Change Status" +msgstr "Modifica Stato" -#: src/forms/PurchaseOrderForms.tsx:637 -msgid "Store with already received stock" -msgstr "Memorizza con stock già ricevuto" +#: src/forms/PurchaseOrderForms.tsx:598 +msgid "Add Note" +msgstr "Aggiungi Nota" #: src/forms/PurchaseOrderForms.tsx:658 #~ msgid "Receive line items" #~ msgstr "Receive line items" -#: src/forms/PurchaseOrderForms.tsx:661 +#: src/forms/PurchaseOrderForms.tsx:662 +msgid "Store at default location" +msgstr "Memorizza nella posizione predefinita" + +#: src/forms/PurchaseOrderForms.tsx:677 +msgid "Store at line item destination " +msgstr "Salva alla destinazione dell'articolo" + +#: src/forms/PurchaseOrderForms.tsx:689 +msgid "Store with already received stock" +msgstr "Memorizza con stock già ricevuto" + +#: src/forms/PurchaseOrderForms.tsx:713 #: src/pages/build/BuildDetail.tsx:340 #: src/pages/stock/StockDetail.tsx:280 #: src/pages/stock/StockDetail.tsx:952 #: src/tables/Filter.tsx:83 -#: src/tables/build/BuildAllocatedStockTable.tsx:128 +#: src/tables/build/BuildAllocatedStockTable.tsx:125 #: src/tables/build/BuildOutputTable.tsx:112 -#: src/tables/part/PartTestResultTable.tsx:260 -#: src/tables/part/PartTestResultTable.tsx:281 +#: src/tables/part/PartTestResultTable.tsx:268 +#: src/tables/part/PartTestResultTable.tsx:289 #: src/tables/sales/SalesOrderAllocationTable.tsx:149 msgid "Batch Code" msgstr "Codice Lotto" -#: src/forms/PurchaseOrderForms.tsx:662 +#: src/forms/PurchaseOrderForms.tsx:714 msgid "Enter batch code for received items" msgstr "Inserisci il codice lotto per gli articoli ricevuti" -#: src/forms/PurchaseOrderForms.tsx:675 +#: src/forms/PurchaseOrderForms.tsx:727 #: src/forms/StockForms.tsx:218 msgid "Serial Numbers" msgstr "Numeri di serie" -#: src/forms/PurchaseOrderForms.tsx:676 +#: src/forms/PurchaseOrderForms.tsx:728 msgid "Enter serial numbers for received items" msgstr "Inserisci i numeri di serie per gli elementi ricevuti" -#: src/forms/PurchaseOrderForms.tsx:690 +#: src/forms/PurchaseOrderForms.tsx:742 #: src/pages/stock/StockDetail.tsx:382 #: src/tables/stock/StockItemTable.tsx:294 msgid "Expiry Date" msgstr "Data di scadenza" -#: src/forms/PurchaseOrderForms.tsx:691 +#: src/forms/PurchaseOrderForms.tsx:743 msgid "Enter an expiry date for received items" msgstr "Inserisci una data di scadenza per gli articoli ricevuti" -#: src/forms/PurchaseOrderForms.tsx:703 +#: src/forms/PurchaseOrderForms.tsx:755 #: src/forms/StockForms.tsx:728 #: src/pages/company/SupplierPartDetail.tsx:172 #: src/pages/company/SupplierPartDetail.tsx:236 @@ -4701,19 +4708,19 @@ msgstr "Inserisci una data di scadenza per gli articoli ricevuti" msgid "Packaging" msgstr "Imballaggio" -#: src/forms/PurchaseOrderForms.tsx:727 +#: src/forms/PurchaseOrderForms.tsx:779 #: src/pages/company/SupplierPartDetail.tsx:120 #: src/tables/ColumnRenderers.tsx:332 msgid "Note" msgstr "Nota" -#: src/forms/PurchaseOrderForms.tsx:799 +#: src/forms/PurchaseOrderForms.tsx:851 #: src/pages/company/SupplierPartDetail.tsx:138 #: src/tables/purchasing/SupplierPriceBreakTable.tsx:49 msgid "SKU" msgstr "SKU" -#: src/forms/PurchaseOrderForms.tsx:800 +#: src/forms/PurchaseOrderForms.tsx:852 #: src/tables/part/PartPurchaseOrdersTable.tsx:127 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:213 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:283 @@ -4721,11 +4728,11 @@ msgstr "SKU" msgid "Received" msgstr "Ricevuto" -#: src/forms/PurchaseOrderForms.tsx:817 +#: src/forms/PurchaseOrderForms.tsx:869 msgid "Receive Line Items" msgstr "Ricevi Elementi Riga" -#: src/forms/PurchaseOrderForms.tsx:823 +#: src/forms/PurchaseOrderForms.tsx:875 msgid "Items received" msgstr "Articoli ricevuti" @@ -4737,7 +4744,7 @@ msgstr "Ricevi elementi" msgid "Item received into stock" msgstr "Oggetto ricevuto in magazzino" -#: src/forms/SalesOrderForms.tsx:401 +#: src/forms/SalesOrderForms.tsx:419 msgid "Leave blank to use the order address" msgstr "Lascia vuoto per utilizzare l'indirizzo dell'ordine" @@ -5932,6 +5939,9 @@ msgstr "Rimuovi Credenziale WebAuthn" #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:310 #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:401 +#: src/tables/build/BuildAllocatedStockTable.tsx:181 +#: src/tables/build/BuildLineTable.tsx:668 +#: src/tables/sales/SalesOrderAllocationTable.tsx:220 msgid "Confirm Removal" msgstr "Conferma Rimozione" @@ -6870,8 +6880,8 @@ msgstr "Esterna" #: src/pages/sales/ReturnOrderDetail.tsx:108 #: src/pages/sales/SalesOrderDetail.tsx:98 #: src/tables/ColumnRenderers.tsx:321 -#: src/tables/build/BuildAllocatedStockTable.tsx:115 -#: src/tables/build/BuildLineTable.tsx:352 +#: src/tables/build/BuildAllocatedStockTable.tsx:112 +#: src/tables/build/BuildLineTable.tsx:353 msgid "Reference" msgstr "Riferimento" @@ -7132,7 +7142,7 @@ msgstr "Annulla ordine" #: src/pages/build/BuildDetail.tsx:742 #: src/pages/stock/StockDetail.tsx:344 -#: src/tables/build/BuildAllocatedStockTable.tsx:85 +#: src/tables/build/BuildAllocatedStockTable.tsx:82 #: src/tables/part/PartBuildAllocationsTable.tsx:45 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:157 #: src/tables/stock/StockTrackingTable.tsx:109 @@ -7600,7 +7610,7 @@ msgstr "Parole Chiave" #: src/pages/part/PartDetail.tsx:542 #: src/tables/bom/BomTable.tsx:439 -#: src/tables/build/BuildLineTable.tsx:305 +#: src/tables/build/BuildLineTable.tsx:306 #: src/tables/part/PartTable.tsx:319 #: src/tables/sales/SalesOrderLineItemTable.tsx:138 msgid "Available Stock" @@ -7608,7 +7618,7 @@ msgstr "Giacenza Disponibile" #: src/pages/part/PartDetail.tsx:548 #: src/tables/bom/BomTable.tsx:341 -#: src/tables/build/BuildLineTable.tsx:267 +#: src/tables/build/BuildLineTable.tsx:268 #: src/tables/sales/SalesOrderLineItemTable.tsx:180 msgid "On order" msgstr "In ordine" @@ -7782,7 +7792,7 @@ msgstr "Ordine" #: src/pages/part/PartDetail.tsx:1144 #: src/pages/stock/StockDetail.tsx:884 -#: src/tables/build/BuildLineTable.tsx:761 +#: src/tables/build/BuildLineTable.tsx:768 msgid "Order Stock" msgstr "Ordine Stock" @@ -9219,13 +9229,13 @@ msgstr "Articolo Virtuale" #~ msgstr "Show asssmbled items" #: src/tables/bom/BomTable.tsx:315 -#: src/tables/build/BuildLineTable.tsx:276 +#: src/tables/build/BuildLineTable.tsx:277 #: src/tables/part/PartTable.tsx:145 msgid "External stock" msgstr "Scorte esterne" #: src/tables/bom/BomTable.tsx:323 -#: src/tables/build/BuildLineTable.tsx:239 +#: src/tables/build/BuildLineTable.tsx:240 msgid "Includes substitute stock" msgstr "Comprende le scorte sostitutive" @@ -9234,7 +9244,7 @@ msgstr "Comprende le scorte sostitutive" #~ msgstr "Edit Bom Item" #: src/tables/bom/BomTable.tsx:332 -#: src/tables/build/BuildLineTable.tsx:249 +#: src/tables/build/BuildLineTable.tsx:250 #: src/tables/sales/SalesOrderLineItemTable.tsx:166 msgid "Includes variant stock" msgstr "Comprende varianti scorte" @@ -9272,8 +9282,8 @@ msgid "Stock Information" msgstr "Informazioni sulle scorte" #: src/tables/bom/BomTable.tsx:399 -#: src/tables/build/BuildLineTable.tsx:496 -#: src/tables/build/BuildLineTable.tsx:537 +#: src/tables/build/BuildLineTable.tsx:497 +#: src/tables/build/BuildLineTable.tsx:538 msgid "Consumable item" msgstr "Articolo consumabile" @@ -9282,7 +9292,7 @@ msgid "No available stock" msgstr "Scorte non disponibili" #: src/tables/bom/BomTable.tsx:420 -#: src/tables/build/BuildLineTable.tsx:213 +#: src/tables/build/BuildLineTable.tsx:214 msgid "Show testable items" msgstr "Mostra elementi testabili" @@ -9291,7 +9301,7 @@ msgid "Show trackable items" msgstr "Mostra articoli tracciabili" #: src/tables/bom/BomTable.tsx:430 -#: src/tables/build/BuildLineTable.tsx:208 +#: src/tables/build/BuildLineTable.tsx:209 msgid "Show assembled items" msgstr "Mostra articoli assemblati" @@ -9335,7 +9345,7 @@ msgstr "Mostra articoli che consentono la sostituzione della variante" #: src/tables/bom/BomTable.tsx:464 #: src/tables/bom/UsedInTable.tsx:85 -#: src/tables/build/BuildLineTable.tsx:202 +#: src/tables/build/BuildLineTable.tsx:203 msgid "Optional" msgstr "Opzionale" @@ -9345,7 +9355,7 @@ msgid "Show optional items" msgstr "Mostra articoli opzionali" #: src/tables/bom/BomTable.tsx:469 -#: src/tables/build/BuildLineTable.tsx:197 +#: src/tables/build/BuildLineTable.tsx:198 msgid "Consumable" msgstr "Consumabile" @@ -9433,7 +9443,7 @@ msgid "Bill of materials cannot be edited, as the part is locked" msgstr "La distinta base non può essere modificata, in quanto la parte è bloccata" #: src/tables/bom/UsedInTable.tsx:34 -#: src/tables/build/BuildLineTable.tsx:207 +#: src/tables/build/BuildLineTable.tsx:208 #: src/tables/part/ParametricPartTable.tsx:364 #: src/tables/part/PartBuildAllocationsTable.tsx:60 #: src/tables/part/PartTable.tsx:209 @@ -9455,11 +9465,11 @@ msgstr "Tracciabile" msgid "Show trackable assemblies" msgstr "Mostra assemblaggi tracciabili" -#: src/tables/build/BuildAllocatedStockTable.tsx:67 +#: src/tables/build/BuildAllocatedStockTable.tsx:64 msgid "Allocated to Output" msgstr "Assegnato all'output" -#: src/tables/build/BuildAllocatedStockTable.tsx:68 +#: src/tables/build/BuildAllocatedStockTable.tsx:65 msgid "Show items allocated to a build output" msgstr "Mostra gli articoli assegnati a un ordine di produzione" @@ -9472,7 +9482,7 @@ msgstr "Mostra gli articoli assegnati a un ordine di produzione" #~ msgid "Include orders for part variants" #~ msgstr "Include orders for part variants" -#: src/tables/build/BuildAllocatedStockTable.tsx:97 +#: src/tables/build/BuildAllocatedStockTable.tsx:94 #: src/tables/part/PartBuildAllocationsTable.tsx:84 #: src/tables/part/PartPurchaseOrdersTable.tsx:132 #: src/tables/part/PartSalesAllocationsTable.tsx:69 @@ -9482,40 +9492,58 @@ msgid "Order Status" msgstr "Stato dell'ordine" #: src/tables/build/BuildAllocatedStockTable.tsx:164 -#~ msgid "Edit Build Item" -#~ msgstr "Edit Build Item" - -#: src/tables/build/BuildAllocatedStockTable.tsx:167 -#: src/tables/build/BuildLineTable.tsx:650 +#: src/tables/build/BuildLineTable.tsx:651 msgid "Edit Stock Allocation" msgstr "Modifica Assegnazione Magazzino" +#: src/tables/build/BuildAllocatedStockTable.tsx:164 +#~ msgid "Edit Build Item" +#~ msgstr "Edit Build Item" + #: src/tables/build/BuildAllocatedStockTable.tsx:174 #~ msgid "Delete Build Item" #~ msgstr "Delete Build Item" +#: src/tables/build/BuildAllocatedStockTable.tsx:177 +#: src/tables/build/BuildLineTable.tsx:664 +#: src/tables/sales/SalesOrderAllocationTable.tsx:218 +msgid "Remove Allocated Stock" +msgstr "Rimuovi Scorte Assegnate" + #: src/tables/build/BuildAllocatedStockTable.tsx:180 #: src/tables/build/BuildLineTable.tsx:663 -msgid "Delete Stock Allocation" -msgstr "Elimina Assegnazione Magazzino" +#~ msgid "Delete Stock Allocation" +#~ msgstr "Delete Stock Allocation" -#: src/tables/build/BuildAllocatedStockTable.tsx:239 +#: src/tables/build/BuildAllocatedStockTable.tsx:182 +#: src/tables/build/BuildLineTable.tsx:669 +#: src/tables/sales/SalesOrderAllocationTable.tsx:221 +msgid "Are you sure you want to remove this allocated stock from the order?" +msgstr "Sei sicuro di voler rimuovere questo stock assegnato dall'ordine?" + +#: src/tables/build/BuildAllocatedStockTable.tsx:242 msgid "Consume" msgstr "Consuma" +#: src/tables/build/BuildAllocatedStockTable.tsx:259 +#: src/tables/build/BuildLineTable.tsx:112 +#: src/tables/sales/SalesOrderAllocationTable.tsx:248 +msgid "Remove allocated stock" +msgstr "Rimuovi Scorte Assegnate" + #: src/tables/build/BuildLineTable.tsx:59 #~ msgid "Show lines with available stock" #~ msgstr "Show lines with available stock" -#: src/tables/build/BuildLineTable.tsx:120 +#: src/tables/build/BuildLineTable.tsx:121 msgid "View Stock Item" msgstr "Vedi Elemento di Magazzino" -#: src/tables/build/BuildLineTable.tsx:183 +#: src/tables/build/BuildLineTable.tsx:184 msgid "Show fully allocated lines" msgstr "Mostra le linee completamente assegnate" -#: src/tables/build/BuildLineTable.tsx:188 +#: src/tables/build/BuildLineTable.tsx:189 msgid "Show fully consumed lines" msgstr "Mostra le linee completamente consumate" @@ -9523,124 +9551,124 @@ msgstr "Mostra le linee completamente consumate" #~ msgid "Show allocated lines" #~ msgstr "Show allocated lines" -#: src/tables/build/BuildLineTable.tsx:193 +#: src/tables/build/BuildLineTable.tsx:194 msgid "Show items with sufficient available stock" msgstr "Mostra elementi con sufficiente stock disponibile" -#: src/tables/build/BuildLineTable.tsx:198 +#: src/tables/build/BuildLineTable.tsx:199 msgid "Show consumable lines" msgstr "Mostra linee consumabili" -#: src/tables/build/BuildLineTable.tsx:203 +#: src/tables/build/BuildLineTable.tsx:204 msgid "Show optional lines" msgstr "Mostra linee opzionali" -#: src/tables/build/BuildLineTable.tsx:212 +#: src/tables/build/BuildLineTable.tsx:213 #: src/tables/part/PartTable.tsx:233 msgid "Testable" msgstr "Testabile" -#: src/tables/build/BuildLineTable.tsx:217 +#: src/tables/build/BuildLineTable.tsx:218 #: src/tables/stock/StockItemTable.tsx:388 msgid "Tracked" msgstr "Tracciato" -#: src/tables/build/BuildLineTable.tsx:218 +#: src/tables/build/BuildLineTable.tsx:219 msgid "Show tracked lines" msgstr "Mostra linee tracciate" -#: src/tables/build/BuildLineTable.tsx:223 +#: src/tables/build/BuildLineTable.tsx:224 msgid "Show items with stock on order" msgstr "Mostra gli articoli con stock in ordine" -#: src/tables/build/BuildLineTable.tsx:258 +#: src/tables/build/BuildLineTable.tsx:259 #: src/tables/sales/SalesOrderLineItemTable.tsx:172 msgid "In production" msgstr "In produzione" -#: src/tables/build/BuildLineTable.tsx:286 +#: src/tables/build/BuildLineTable.tsx:287 msgid "Insufficient stock" msgstr "Scorte insufficienti" -#: src/tables/build/BuildLineTable.tsx:302 +#: src/tables/build/BuildLineTable.tsx:303 #: src/tables/sales/SalesOrderLineItemTable.tsx:160 #: src/tables/stock/StockItemTable.tsx:191 msgid "No stock available" msgstr "Nessuna Scorta Disponibile" -#: src/tables/build/BuildLineTable.tsx:375 +#: src/tables/build/BuildLineTable.tsx:376 msgid "Gets Inherited" msgstr "Viene Ereditato" -#: src/tables/build/BuildLineTable.tsx:388 +#: src/tables/build/BuildLineTable.tsx:389 msgid "Unit Quantity" msgstr "Quantità Unità" -#: src/tables/build/BuildLineTable.tsx:415 +#: src/tables/build/BuildLineTable.tsx:416 msgid "Setup Quantity" msgstr "Imposta quantità" -#: src/tables/build/BuildLineTable.tsx:424 +#: src/tables/build/BuildLineTable.tsx:425 msgid "Attrition" msgstr "Logoramento" -#: src/tables/build/BuildLineTable.tsx:432 +#: src/tables/build/BuildLineTable.tsx:433 msgid "Rounding Multiple" msgstr "Arrotondamento Multiplo" -#: src/tables/build/BuildLineTable.tsx:441 +#: src/tables/build/BuildLineTable.tsx:442 msgid "BOM Information" msgstr "Informazioni distinta base (BOM)" -#: src/tables/build/BuildLineTable.tsx:515 +#: src/tables/build/BuildLineTable.tsx:516 #: src/tables/part/PartBuildAllocationsTable.tsx:102 msgid "Fully allocated" msgstr "Completamente assegnato" -#: src/tables/build/BuildLineTable.tsx:563 +#: src/tables/build/BuildLineTable.tsx:564 #: src/tables/sales/SalesOrderLineItemTable.tsx:311 msgid "Create Build Order" msgstr "Crea Ordine di Produzione" -#: src/tables/build/BuildLineTable.tsx:592 +#: src/tables/build/BuildLineTable.tsx:593 msgid "Auto allocation in progress" msgstr "Assegnazione automatica in corso" -#: src/tables/build/BuildLineTable.tsx:595 -#: src/tables/build/BuildLineTable.tsx:802 +#: src/tables/build/BuildLineTable.tsx:596 +#: src/tables/build/BuildLineTable.tsx:809 msgid "Auto Allocate Stock" msgstr "Assegna Stock Automaticamente" -#: src/tables/build/BuildLineTable.tsx:596 +#: src/tables/build/BuildLineTable.tsx:597 msgid "Automatically allocate stock to this build according to the selected options" msgstr "Assegna automaticamente lo stock a questa produzione in base alle opzioni selezionate" -#: src/tables/build/BuildLineTable.tsx:616 -#: src/tables/build/BuildLineTable.tsx:630 -#: src/tables/build/BuildLineTable.tsx:751 -#: src/tables/build/BuildLineTable.tsx:852 +#: src/tables/build/BuildLineTable.tsx:617 +#: src/tables/build/BuildLineTable.tsx:631 +#: src/tables/build/BuildLineTable.tsx:758 +#: src/tables/build/BuildLineTable.tsx:859 #: src/tables/build/BuildOutputTable.tsx:355 #: src/tables/build/BuildOutputTable.tsx:360 msgid "Deallocate Stock" msgstr "Disassegna Stock" -#: src/tables/build/BuildLineTable.tsx:632 +#: src/tables/build/BuildLineTable.tsx:633 msgid "Deallocate all untracked stock for this build order" msgstr "Disassegna tutto lo stock non tracciato per questo ordine di produzione" -#: src/tables/build/BuildLineTable.tsx:634 +#: src/tables/build/BuildLineTable.tsx:635 msgid "Deallocate stock from the selected line item" msgstr "Disassegna stock dalla riga selezionata" -#: src/tables/build/BuildLineTable.tsx:638 +#: src/tables/build/BuildLineTable.tsx:639 msgid "Stock has been deallocated" msgstr "Lo stock è stato disassegnato" -#: src/tables/build/BuildLineTable.tsx:771 +#: src/tables/build/BuildLineTable.tsx:778 msgid "Build Stock" msgstr "Crea scorta" -#: src/tables/build/BuildLineTable.tsx:784 +#: src/tables/build/BuildLineTable.tsx:791 #: src/tables/sales/SalesOrderLineItemTable.tsx:487 msgid "View Part" msgstr "Mostra Articolo" @@ -9739,7 +9767,7 @@ msgid "Serialize Build Output" msgstr "Serializza ordine di produzione" #: src/tables/build/BuildOutputTable.tsx:405 -#: src/tables/part/PartTestResultTable.tsx:310 +#: src/tables/part/PartTestResultTable.tsx:318 #: src/tables/stock/StockItemTable.tsx:328 msgid "Filter by stock status" msgstr "Filtra per stato delle scorte" @@ -9964,8 +9992,8 @@ msgid "View Item" msgstr "Visualizza Articolo" #: src/tables/general/ExtraLineItemTable.tsx:95 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:299 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:403 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:300 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:405 #: src/tables/sales/ReturnOrderLineItemTable.tsx:83 #: src/tables/sales/ReturnOrderLineItemTable.tsx:187 #: src/tables/sales/SalesOrderLineItemTable.tsx:252 @@ -9974,14 +10002,14 @@ msgid "Add Line Item" msgstr "Aggiungi linea articolo" #: src/tables/general/ExtraLineItemTable.tsx:108 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:320 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:322 #: src/tables/sales/ReturnOrderLineItemTable.tsx:96 #: src/tables/sales/SalesOrderLineItemTable.tsx:271 msgid "Edit Line Item" msgstr "Modifica linea Articolo" #: src/tables/general/ExtraLineItemTable.tsx:117 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:329 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:331 #: src/tables/sales/ReturnOrderLineItemTable.tsx:105 #: src/tables/sales/SalesOrderLineItemTable.tsx:280 msgid "Delete Line Item" @@ -10273,7 +10301,7 @@ msgid "Required Stock" msgstr "Giacenza Richiesta" #: src/tables/part/PartBuildAllocationsTable.tsx:124 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:381 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:383 msgid "View Build Order" msgstr "Vedi Ordine di Produzione" @@ -10617,8 +10645,8 @@ msgstr "Importa articoli da un plugin del fornitore" #: src/tables/part/PartTestResultTable.tsx:103 #: src/tables/part/PartTestResultTable.tsx:181 -#: src/tables/part/PartTestResultTable.tsx:320 -#: src/tables/part/PartTestResultTable.tsx:334 +#: src/tables/part/PartTestResultTable.tsx:328 +#: src/tables/part/PartTestResultTable.tsx:342 #: src/tables/stock/StockItemTestResultTable.tsx:296 #: src/tables/stock/StockItemTestResultTable.tsx:368 #: src/tables/stock/StockItemTestResultTable.tsx:429 @@ -10643,7 +10671,7 @@ msgstr "Risultato dei test aggiunti" msgid "No Result" msgstr "Nessun risultato" -#: src/tables/part/PartTestResultTable.tsx:298 +#: src/tables/part/PartTestResultTable.tsx:306 msgid "Show build outputs currently in production" msgstr "Mostra gli ordini di produzione attualmente in produzione" @@ -11073,7 +11101,7 @@ msgid "Show manufacturer parts for active manufacturers." msgstr "Mostra gli articoli del produttore per i produttori attivi" #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:115 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:397 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:399 msgid "Import Line Items" msgstr "Importa Elementi Riga" @@ -11099,11 +11127,11 @@ msgstr "Mostra gli elementi di riga che sono stati ricevuti" #~ msgid "Add line item" #~ msgstr "Add line item" -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:350 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:352 msgid "Receive line item" msgstr "Ricevi voce di riga" -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:414 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:416 msgid "Receive items" msgstr "Ricevi articoli" @@ -11201,25 +11229,25 @@ msgid "Not shipped" msgstr "Non spedito" #: src/tables/sales/SalesOrderAllocationTable.tsx:211 -#: src/tables/sales/SalesOrderAllocationTable.tsx:229 +#: src/tables/sales/SalesOrderAllocationTable.tsx:235 msgid "Edit Allocation" msgstr "Modifica Assegnazione" #: src/tables/sales/SalesOrderAllocationTable.tsx:218 #: src/tables/sales/SalesOrderAllocationTable.tsx:241 -msgid "Delete Allocation" -msgstr "Rimuovi Assegnazione" +#~ msgid "Delete Allocation" +#~ msgstr "Delete Allocation" -#: src/tables/sales/SalesOrderAllocationTable.tsx:252 -#: src/tables/sales/SalesOrderAllocationTable.tsx:253 +#: src/tables/sales/SalesOrderAllocationTable.tsx:261 +#: src/tables/sales/SalesOrderAllocationTable.tsx:262 msgid "View Shipment" msgstr "Vedi spedizione" -#: src/tables/sales/SalesOrderAllocationTable.tsx:308 +#: src/tables/sales/SalesOrderAllocationTable.tsx:317 msgid "Assign to Shipment" msgstr "Assegna alla spedizione" -#: src/tables/sales/SalesOrderAllocationTable.tsx:324 +#: src/tables/sales/SalesOrderAllocationTable.tsx:333 msgid "Assign to shipment" msgstr "Assegna alla spedizione" diff --git a/src/frontend/src/locales/ja/messages.po b/src/frontend/src/locales/ja/messages.po index 73eef14b58..f11f1c8425 100644 --- a/src/frontend/src/locales/ja/messages.po +++ b/src/frontend/src/locales/ja/messages.po @@ -8,7 +8,7 @@ msgstr "" "Language: ja\n" "Project-Id-Version: inventree\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2025-11-19 19:39\n" +"PO-Revision-Date: 2025-11-22 06:25\n" "Last-Translator: \n" "Language-Team: Japanese\n" "Plural-Forms: nplurals=1; plural=0;\n" @@ -56,7 +56,7 @@ msgstr "キャンセル" #: lib/components/RowActions.tsx:136 #: src/components/nav/NavigationDrawer.tsx:190 -#: src/forms/PurchaseOrderForms.tsx:802 +#: src/forms/PurchaseOrderForms.tsx:854 #: src/forms/StockForms.tsx:796 #: src/forms/StockForms.tsx:843 #: src/forms/StockForms.tsx:889 @@ -103,9 +103,9 @@ msgstr "いいえ" #: src/forms/BuildForms.tsx:630 #: src/forms/BuildForms.tsx:793 #: src/forms/BuildForms.tsx:896 -#: src/forms/PurchaseOrderForms.tsx:798 +#: src/forms/PurchaseOrderForms.tsx:850 #: src/forms/ReturnOrderForms.tsx:242 -#: src/forms/SalesOrderForms.tsx:305 +#: src/forms/SalesOrderForms.tsx:323 #: src/forms/StockForms.tsx:360 #: src/forms/StockForms.tsx:791 #: src/forms/StockForms.tsx:838 @@ -119,6 +119,7 @@ msgstr "いいえ" #: src/pages/build/BuildDetail.tsx:200 #: src/pages/part/PartDetail.tsx:1207 #: src/tables/ColumnRenderers.tsx:91 +#: src/tables/part/PartTestResultTable.tsx:247 #: src/tables/part/RelatedPartTable.tsx:53 #: src/tables/stock/StockTrackingTable.tsx:87 msgid "Part" @@ -158,7 +159,7 @@ msgstr "部品試験テンプレート" #: src/components/wizards/OrderPartsWizard.tsx:290 #: src/pages/company/SupplierPartDetail.tsx:413 #: src/pages/stock/StockDetail.tsx:289 -#: src/tables/build/BuildAllocatedStockTable.tsx:155 +#: src/tables/build/BuildAllocatedStockTable.tsx:152 #: src/tables/part/PartPurchaseOrdersTable.tsx:50 #: src/tables/purchasing/SupplierPartTable.tsx:83 #: src/tables/stock/StockItemTable.tsx:247 @@ -201,9 +202,9 @@ msgstr "パーツカテゴリ" #: src/forms/BuildForms.tsx:473 #: src/forms/BuildForms.tsx:633 #: src/forms/BuildForms.tsx:794 -#: src/forms/SalesOrderForms.tsx:307 +#: src/forms/SalesOrderForms.tsx:325 #: src/pages/stock/StockDetail.tsx:1005 -#: src/tables/part/PartTestResultTable.tsx:248 +#: src/tables/part/PartTestResultTable.tsx:256 #: src/tables/stock/StockTrackingTable.tsx:48 #: src/tables/stock/StockTrackingTable.tsx:55 msgid "Stock Item" @@ -517,7 +518,7 @@ msgstr "セレクション・リスト" #: src/components/dashboard/DashboardLayout.tsx:281 #: src/components/editors/NotesEditor.tsx:74 #: src/components/editors/TemplateEditor/TemplateEditor.tsx:158 -#: src/components/forms/fields/ApiFormField.tsx:273 +#: src/components/forms/fields/ApiFormField.tsx:237 #: src/components/forms/fields/TableField.tsx:45 #: src/components/importer/ImportDataSelector.tsx:192 #: src/components/importer/ImporterColumnSelector.tsx:234 @@ -642,8 +643,8 @@ msgstr "バーコードデータの入力" #: src/components/barcodes/BarcodeScanDialog.tsx:49 #: src/components/buttons/ScanButton.tsx:15 #: src/components/nav/NavigationDrawer.tsx:122 -#: src/forms/PurchaseOrderForms.tsx:457 -#: src/forms/PurchaseOrderForms.tsx:563 +#: src/forms/PurchaseOrderForms.tsx:509 +#: src/forms/PurchaseOrderForms.tsx:615 msgid "Scan Barcode" msgstr "バーコードをスキャン" @@ -728,7 +729,7 @@ msgstr "これにより、関連するバーコードへのリンクが削除さ #: src/components/barcodes/QRCode.tsx:205 #: src/components/items/ActionDropdown.tsx:192 -#: src/forms/PurchaseOrderForms.tsx:554 +#: src/forms/PurchaseOrderForms.tsx:606 msgid "Unlink Barcode" msgstr "リンク解除バーコード" @@ -1216,6 +1217,12 @@ msgstr "このアイテムから関連画像を削除しますか?" #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:884 #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:903 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:254 +#: src/tables/build/BuildAllocatedStockTable.tsx:178 +#: src/tables/build/BuildAllocatedStockTable.tsx:258 +#: src/tables/build/BuildLineTable.tsx:111 +#: src/tables/build/BuildLineTable.tsx:665 +#: src/tables/sales/SalesOrderAllocationTable.tsx:224 +#: src/tables/sales/SalesOrderAllocationTable.tsx:247 msgid "Remove" msgstr "削除" @@ -1241,7 +1248,7 @@ msgid "Upload Error" msgstr "アップロードエラー" #: src/components/details/DetailsImage.tsx:250 -#: src/components/forms/fields/TextField.tsx:65 +#: src/components/forms/fields/AutoFillRightSection.tsx:34 msgid "Clear" msgstr "クリア" @@ -1817,10 +1824,14 @@ msgstr "中断" msgid "Running" msgstr "実行中" -#: src/components/forms/fields/ApiFormField.tsx:233 +#: src/components/forms/fields/ApiFormField.tsx:197 msgid "Select file to upload" msgstr "" +#: src/components/forms/fields/AutoFillRightSection.tsx:47 +msgid "Accept suggested value" +msgstr "" + #: src/components/forms/fields/DateField.tsx:76 msgid "Select date" msgstr "" @@ -1875,10 +1886,6 @@ msgstr "選択した機能に使用できるエントリはありません" msgid "Add new row" msgstr "新しい行を追加" -#: src/components/forms/fields/TextField.tsx:82 -msgid "Accept suggested value" -msgstr "" - #: src/components/images/DetailsImage.tsx:252 #~ msgid "Select image" #~ msgstr "Select image" @@ -2225,8 +2232,8 @@ msgstr "項目なし" #: src/pages/part/PartDetail.tsx:994 #: src/pages/stock/StockDetail.tsx:265 #: src/pages/stock/StockDetail.tsx:942 -#: src/tables/build/BuildAllocatedStockTable.tsx:135 -#: src/tables/build/BuildLineTable.tsx:192 +#: src/tables/build/BuildAllocatedStockTable.tsx:132 +#: src/tables/build/BuildLineTable.tsx:193 #: src/tables/part/PartTable.tsx:137 #: src/tables/stock/StockItemTable.tsx:182 #: src/tables/stock/StockItemTable.tsx:343 @@ -2784,7 +2791,7 @@ msgstr "プラグイン情報" #: src/pages/sales/SalesOrderDetail.tsx:119 #: src/pages/stock/LocationDetail.tsx:102 #: src/tables/ColumnRenderers.tsx:278 -#: src/tables/build/BuildAllocatedStockTable.tsx:91 +#: src/tables/build/BuildAllocatedStockTable.tsx:88 #: src/tables/machine/MachineTypeTable.tsx:161 #: src/tables/machine/MachineTypeTable.tsx:257 #: src/tables/plugin/PluginListTable.tsx:110 @@ -2966,7 +2973,7 @@ msgstr "在庫なし" #: src/pages/company/SupplierPartDetail.tsx:394 #: src/pages/part/PartDetail.tsx:1015 #: src/tables/bom/BomTable.tsx:444 -#: src/tables/build/BuildLineTable.tsx:222 +#: src/tables/build/BuildLineTable.tsx:223 #: src/tables/part/PartTable.tsx:108 msgid "On Order" msgstr "注文中" @@ -2976,7 +2983,7 @@ msgstr "注文中" #: src/pages/part/PartDetail.tsx:587 #: src/pages/part/PartDetail.tsx:1021 #: src/pages/stock/StockDetail.tsx:925 -#: src/tables/part/PartTestResultTable.tsx:297 +#: src/tables/part/PartTestResultTable.tsx:305 #: src/tables/stock/StockItemTable.tsx:359 msgid "In Production" msgstr "生産中" @@ -3000,7 +3007,7 @@ msgstr "カテゴリ" #: src/components/render/Stock.tsx:114 #: src/components/render/Stock.tsx:132 #: src/forms/BuildForms.tsx:795 -#: src/forms/PurchaseOrderForms.tsx:595 +#: src/forms/PurchaseOrderForms.tsx:647 #: src/forms/StockForms.tsx:792 #: src/forms/StockForms.tsx:839 #: src/forms/StockForms.tsx:885 @@ -3023,7 +3030,7 @@ msgstr "場所" #: src/components/render/Stock.tsx:99 #: src/pages/stock/StockDetail.tsx:198 #: src/pages/stock/StockDetail.tsx:930 -#: src/tables/build/BuildAllocatedStockTable.tsx:121 +#: src/tables/build/BuildAllocatedStockTable.tsx:118 #: src/tables/build/BuildOutputTable.tsx:107 #: src/tables/sales/SalesOrderAllocationTable.tsx:142 msgid "Serial Number" @@ -3034,9 +3041,9 @@ msgstr "シリアル番号" #: src/forms/BuildForms.tsx:240 #: src/forms/BuildForms.tsx:634 #: src/forms/BuildForms.tsx:797 -#: src/forms/PurchaseOrderForms.tsx:801 +#: src/forms/PurchaseOrderForms.tsx:853 #: src/forms/ReturnOrderForms.tsx:243 -#: src/forms/SalesOrderForms.tsx:308 +#: src/forms/SalesOrderForms.tsx:326 #: src/forms/StockForms.tsx:841 #: src/pages/part/PartStockHistoryDetail.tsx:56 #: src/pages/part/PartStockHistoryDetail.tsx:210 @@ -3046,9 +3053,9 @@ msgstr "シリアル番号" #: src/pages/part/pricing/PriceBreakPanel.tsx:172 #: src/pages/stock/StockDetail.tsx:258 #: src/pages/stock/StockDetail.tsx:936 -#: src/tables/build/BuildLineTable.tsx:86 +#: src/tables/build/BuildLineTable.tsx:83 #: src/tables/part/PartPurchaseOrdersTable.tsx:94 -#: src/tables/part/PartTestResultTable.tsx:269 +#: src/tables/part/PartTestResultTable.tsx:277 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:175 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:206 #: src/tables/purchasing/SupplierPriceBreakTable.tsx:69 @@ -3070,7 +3077,7 @@ msgstr "数量" #: src/forms/StockForms.tsx:1048 #: src/forms/StockForms.tsx:1096 #: src/forms/StockForms.tsx:1140 -#: src/tables/build/BuildLineTable.tsx:96 +#: src/tables/build/BuildLineTable.tsx:93 msgid "Batch" msgstr "スクール機能" @@ -3755,7 +3762,7 @@ msgid "In Stock" msgstr "在庫あり" #: src/components/wizards/OrderPartsWizard.tsx:146 -#: src/tables/build/BuildLineTable.tsx:404 +#: src/tables/build/BuildLineTable.tsx:405 msgid "Required Quantity" msgstr "必要数量" @@ -3847,7 +3854,7 @@ msgid "Please correct the errors in the selected parts" msgstr "選択した部品の誤りを訂正してください。" #: src/components/wizards/OrderPartsWizard.tsx:587 -#: src/tables/build/BuildLineTable.tsx:815 +#: src/tables/build/BuildLineTable.tsx:822 #: src/tables/part/PartTable.tsx:522 #: src/tables/sales/SalesOrderLineItemTable.tsx:370 msgid "Order Parts" @@ -4349,9 +4356,9 @@ msgstr "" #: src/forms/BuildForms.tsx:333 #: src/forms/BuildForms.tsx:408 #: src/forms/BuildForms.tsx:685 -#: src/tables/build/BuildAllocatedStockTable.tsx:150 +#: src/tables/build/BuildAllocatedStockTable.tsx:147 #: src/tables/build/BuildOutputTable.tsx:582 -#: src/tables/part/PartTestResultTable.tsx:272 +#: src/tables/part/PartTestResultTable.tsx:280 msgid "Build Output" msgstr "ビルド出力" @@ -4362,7 +4369,7 @@ msgstr "" #: src/forms/BuildForms.tsx:336 #: src/forms/BuildForms.tsx:411 #: src/forms/BuildForms.tsx:475 -#: src/forms/PurchaseOrderForms.tsx:717 +#: src/forms/PurchaseOrderForms.tsx:769 #: src/forms/ReturnOrderForms.tsx:197 #: src/forms/ReturnOrderForms.tsx:244 #: src/forms/StockForms.tsx:712 @@ -4377,7 +4384,7 @@ msgstr "" #: src/tables/build/BuildOutputTable.tsx:404 #: src/tables/machine/MachineListTable.tsx:387 #: src/tables/part/PartPurchaseOrdersTable.tsx:38 -#: src/tables/part/PartTestResultTable.tsx:309 +#: src/tables/part/PartTestResultTable.tsx:317 #: src/tables/sales/ReturnOrderLineItemTable.tsx:138 #: src/tables/sales/ReturnOrderLineItemTable.tsx:176 #: src/tables/settings/CustomStateTable.tsx:79 @@ -4450,8 +4457,8 @@ msgstr "ビルドアウトプットはキャンセルされました" #: src/pages/stock/StockDetail.tsx:153 #: src/tables/bom/BomTable.tsx:134 #: src/tables/bom/UsedInTable.tsx:40 -#: src/tables/build/BuildAllocatedStockTable.tsx:108 -#: src/tables/build/BuildLineTable.tsx:336 +#: src/tables/build/BuildAllocatedStockTable.tsx:105 +#: src/tables/build/BuildLineTable.tsx:337 #: src/tables/build/BuildOrderTable.tsx:79 #: src/tables/part/PartSalesAllocationsTable.tsx:61 #: src/tables/part/RelatedPartTable.tsx:73 @@ -4466,47 +4473,47 @@ msgstr "即時支払通知" #: src/forms/BuildForms.tsx:632 #: src/forms/BuildForms.tsx:796 #: src/forms/BuildForms.tsx:897 -#: src/forms/SalesOrderForms.tsx:306 -#: src/tables/build/BuildAllocatedStockTable.tsx:139 -#: src/tables/build/BuildLineTable.tsx:182 +#: src/forms/SalesOrderForms.tsx:324 +#: src/tables/build/BuildAllocatedStockTable.tsx:136 +#: src/tables/build/BuildLineTable.tsx:183 #: src/tables/sales/SalesOrderLineItemTable.tsx:342 #: src/tables/stock/StockItemTable.tsx:338 msgid "Allocated" msgstr "割り当てられた" #: src/forms/BuildForms.tsx:667 -#: src/forms/SalesOrderForms.tsx:295 +#: src/forms/SalesOrderForms.tsx:313 #: src/pages/build/BuildDetail.tsx:108 #: src/pages/build/BuildDetail.tsx:326 msgid "Source Location" msgstr "ソース・ロケーション" #: src/forms/BuildForms.tsx:668 -#: src/forms/SalesOrderForms.tsx:296 +#: src/forms/SalesOrderForms.tsx:314 msgid "Select the source location for the stock allocation" msgstr "在庫配分のソースの場所を選択します。" #: src/forms/BuildForms.tsx:700 -#: src/forms/SalesOrderForms.tsx:336 -#: src/tables/build/BuildLineTable.tsx:574 -#: src/tables/build/BuildLineTable.tsx:731 -#: src/tables/build/BuildLineTable.tsx:830 +#: src/forms/SalesOrderForms.tsx:354 +#: src/tables/build/BuildLineTable.tsx:575 +#: src/tables/build/BuildLineTable.tsx:738 +#: src/tables/build/BuildLineTable.tsx:837 #: src/tables/sales/SalesOrderLineItemTable.tsx:380 #: src/tables/sales/SalesOrderLineItemTable.tsx:406 msgid "Allocate Stock" msgstr "株式の割当" #: src/forms/BuildForms.tsx:703 -#: src/forms/SalesOrderForms.tsx:341 +#: src/forms/SalesOrderForms.tsx:359 msgid "Stock items allocated" msgstr "割り当てられた在庫品目" #: src/forms/BuildForms.tsx:816 #: src/forms/BuildForms.tsx:917 -#: src/tables/build/BuildAllocatedStockTable.tsx:240 -#: src/tables/build/BuildAllocatedStockTable.tsx:272 -#: src/tables/build/BuildLineTable.tsx:741 -#: src/tables/build/BuildLineTable.tsx:864 +#: src/tables/build/BuildAllocatedStockTable.tsx:243 +#: src/tables/build/BuildAllocatedStockTable.tsx:279 +#: src/tables/build/BuildLineTable.tsx:748 +#: src/tables/build/BuildLineTable.tsx:871 msgid "Consume Stock" msgstr "" @@ -4521,21 +4528,21 @@ msgstr "" #~ msgstr "Stock items consumed" #: src/forms/BuildForms.tsx:853 -#: src/tables/build/BuildLineTable.tsx:514 +#: src/tables/build/BuildLineTable.tsx:515 #: src/tables/part/PartBuildAllocationsTable.tsx:101 msgid "Fully consumed" msgstr "" #: src/forms/BuildForms.tsx:898 -#: src/tables/build/BuildLineTable.tsx:187 +#: src/tables/build/BuildLineTable.tsx:188 #: src/tables/stock/StockItemTable.tsx:367 msgid "Consumed" msgstr "消費済み" #: src/forms/CommonForms.tsx:88 -#: src/forms/PurchaseOrderForms.tsx:125 +#: src/forms/PurchaseOrderForms.tsx:176 #: src/forms/ReturnOrderForms.tsx:138 -#: src/forms/SalesOrderForms.tsx:164 +#: src/forms/SalesOrderForms.tsx:182 msgid "Select project code for this line item" msgstr "" @@ -4572,127 +4579,127 @@ msgstr "親部品カテゴリー" msgid "Subscribe to notifications for this category" msgstr "このカテゴリの通知を受け取る" -#: src/forms/PurchaseOrderForms.tsx:388 -msgid "Assign Batch Code and Serial Numbers" -msgstr "バッチコードとシリアル番号の割り当て" - -#: src/forms/PurchaseOrderForms.tsx:390 -msgid "Assign Batch Code" -msgstr "バッチコードの割り当て" - -#: src/forms/PurchaseOrderForms.tsx:410 -msgid "Choose Location" -msgstr "地域を選択" - -#: src/forms/PurchaseOrderForms.tsx:418 -msgid "Item Destination selected" -msgstr "選択された項目" - #: src/forms/PurchaseOrderForms.tsx:421 #~ msgid "Assign Batch Code{0}" #~ msgstr "Assign Batch Code{0}" -#: src/forms/PurchaseOrderForms.tsx:428 -msgid "Part category default location selected" -msgstr "選択されたパートカテゴリーのデフォルトの場所" +#: src/forms/PurchaseOrderForms.tsx:440 +msgid "Assign Batch Code and Serial Numbers" +msgstr "バッチコードとシリアル番号の割り当て" -#: src/forms/PurchaseOrderForms.tsx:438 -msgid "Received stock location selected" -msgstr "選択された受入在庫場所" +#: src/forms/PurchaseOrderForms.tsx:442 +msgid "Assign Batch Code" +msgstr "バッチコードの割り当て" #: src/forms/PurchaseOrderForms.tsx:444 #: src/forms/StockForms.tsx:428 #~ msgid "Remove item from list" #~ msgstr "Remove item from list" -#: src/forms/PurchaseOrderForms.tsx:446 +#: src/forms/PurchaseOrderForms.tsx:462 +msgid "Choose Location" +msgstr "地域を選択" + +#: src/forms/PurchaseOrderForms.tsx:470 +msgid "Item Destination selected" +msgstr "選択された項目" + +#: src/forms/PurchaseOrderForms.tsx:480 +msgid "Part category default location selected" +msgstr "選択されたパートカテゴリーのデフォルトの場所" + +#: src/forms/PurchaseOrderForms.tsx:490 +msgid "Received stock location selected" +msgstr "選択された受入在庫場所" + +#: src/forms/PurchaseOrderForms.tsx:498 msgid "Default location selected" msgstr "デフォルトの場所を選択" -#: src/forms/PurchaseOrderForms.tsx:507 +#: src/forms/PurchaseOrderForms.tsx:559 msgid "Set Location" msgstr "セット場所" -#: src/forms/PurchaseOrderForms.tsx:524 -msgid "Set Expiry Date" -msgstr "有効期限の設定" - -#: src/forms/PurchaseOrderForms.tsx:532 -#: src/forms/StockForms.tsx:693 -msgid "Adjust Packaging" -msgstr "パッケージの調整" - -#: src/forms/PurchaseOrderForms.tsx:540 -#: src/forms/StockForms.tsx:684 -#: src/hooks/UseStockAdjustActions.tsx:148 -msgid "Change Status" -msgstr "ステータスを変更" - -#: src/forms/PurchaseOrderForms.tsx:546 -msgid "Add Note" -msgstr "コメントを挿入" - #: src/forms/PurchaseOrderForms.tsx:566 #~ msgid "Serial numbers" #~ msgstr "Serial numbers" +#: src/forms/PurchaseOrderForms.tsx:576 +msgid "Set Expiry Date" +msgstr "有効期限の設定" + #: src/forms/PurchaseOrderForms.tsx:582 #~ msgid "Store at line item destination" #~ msgstr "Store at line item destination" -#: src/forms/PurchaseOrderForms.tsx:610 -msgid "Store at default location" -msgstr "デフォルトの場所に保存" +#: src/forms/PurchaseOrderForms.tsx:584 +#: src/forms/StockForms.tsx:693 +msgid "Adjust Packaging" +msgstr "パッケージの調整" -#: src/forms/PurchaseOrderForms.tsx:625 -msgid "Store at line item destination " -msgstr "行先での保存" +#: src/forms/PurchaseOrderForms.tsx:592 +#: src/forms/StockForms.tsx:684 +#: src/hooks/UseStockAdjustActions.tsx:148 +msgid "Change Status" +msgstr "ステータスを変更" -#: src/forms/PurchaseOrderForms.tsx:637 -msgid "Store with already received stock" -msgstr "入荷済みの在庫がある店舗" +#: src/forms/PurchaseOrderForms.tsx:598 +msgid "Add Note" +msgstr "コメントを挿入" #: src/forms/PurchaseOrderForms.tsx:658 #~ msgid "Receive line items" #~ msgstr "Receive line items" -#: src/forms/PurchaseOrderForms.tsx:661 +#: src/forms/PurchaseOrderForms.tsx:662 +msgid "Store at default location" +msgstr "デフォルトの場所に保存" + +#: src/forms/PurchaseOrderForms.tsx:677 +msgid "Store at line item destination " +msgstr "行先での保存" + +#: src/forms/PurchaseOrderForms.tsx:689 +msgid "Store with already received stock" +msgstr "入荷済みの在庫がある店舗" + +#: src/forms/PurchaseOrderForms.tsx:713 #: src/pages/build/BuildDetail.tsx:340 #: src/pages/stock/StockDetail.tsx:280 #: src/pages/stock/StockDetail.tsx:952 #: src/tables/Filter.tsx:83 -#: src/tables/build/BuildAllocatedStockTable.tsx:128 +#: src/tables/build/BuildAllocatedStockTable.tsx:125 #: src/tables/build/BuildOutputTable.tsx:112 -#: src/tables/part/PartTestResultTable.tsx:260 -#: src/tables/part/PartTestResultTable.tsx:281 +#: src/tables/part/PartTestResultTable.tsx:268 +#: src/tables/part/PartTestResultTable.tsx:289 #: src/tables/sales/SalesOrderAllocationTable.tsx:149 msgid "Batch Code" msgstr "バッチコード" -#: src/forms/PurchaseOrderForms.tsx:662 +#: src/forms/PurchaseOrderForms.tsx:714 msgid "Enter batch code for received items" msgstr "受領品のバッチコードを入力" -#: src/forms/PurchaseOrderForms.tsx:675 +#: src/forms/PurchaseOrderForms.tsx:727 #: src/forms/StockForms.tsx:218 msgid "Serial Numbers" msgstr "シリアル番号" -#: src/forms/PurchaseOrderForms.tsx:676 +#: src/forms/PurchaseOrderForms.tsx:728 msgid "Enter serial numbers for received items" msgstr "受け取った商品のシリアル番号を入力" -#: src/forms/PurchaseOrderForms.tsx:690 +#: src/forms/PurchaseOrderForms.tsx:742 #: src/pages/stock/StockDetail.tsx:382 #: src/tables/stock/StockItemTable.tsx:294 msgid "Expiry Date" msgstr "有効期限" -#: src/forms/PurchaseOrderForms.tsx:691 +#: src/forms/PurchaseOrderForms.tsx:743 msgid "Enter an expiry date for received items" msgstr "受け取った商品の有効期限を入力してください。" -#: src/forms/PurchaseOrderForms.tsx:703 +#: src/forms/PurchaseOrderForms.tsx:755 #: src/forms/StockForms.tsx:728 #: src/pages/company/SupplierPartDetail.tsx:172 #: src/pages/company/SupplierPartDetail.tsx:236 @@ -4701,19 +4708,19 @@ msgstr "受け取った商品の有効期限を入力してください。" msgid "Packaging" msgstr "パッケージング" -#: src/forms/PurchaseOrderForms.tsx:727 +#: src/forms/PurchaseOrderForms.tsx:779 #: src/pages/company/SupplierPartDetail.tsx:120 #: src/tables/ColumnRenderers.tsx:332 msgid "Note" msgstr "備考" -#: src/forms/PurchaseOrderForms.tsx:799 +#: src/forms/PurchaseOrderForms.tsx:851 #: src/pages/company/SupplierPartDetail.tsx:138 #: src/tables/purchasing/SupplierPriceBreakTable.tsx:49 msgid "SKU" msgstr "SKU" -#: src/forms/PurchaseOrderForms.tsx:800 +#: src/forms/PurchaseOrderForms.tsx:852 #: src/tables/part/PartPurchaseOrdersTable.tsx:127 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:213 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:283 @@ -4721,11 +4728,11 @@ msgstr "SKU" msgid "Received" msgstr "受信" -#: src/forms/PurchaseOrderForms.tsx:817 +#: src/forms/PurchaseOrderForms.tsx:869 msgid "Receive Line Items" msgstr "ラインアイテムの受信" -#: src/forms/PurchaseOrderForms.tsx:823 +#: src/forms/PurchaseOrderForms.tsx:875 msgid "Items received" msgstr "受領品目" @@ -4737,7 +4744,7 @@ msgstr "商品を受け取る" msgid "Item received into stock" msgstr "入荷した商品" -#: src/forms/SalesOrderForms.tsx:401 +#: src/forms/SalesOrderForms.tsx:419 msgid "Leave blank to use the order address" msgstr "" @@ -5932,6 +5939,9 @@ msgstr "" #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:310 #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:401 +#: src/tables/build/BuildAllocatedStockTable.tsx:181 +#: src/tables/build/BuildLineTable.tsx:668 +#: src/tables/sales/SalesOrderAllocationTable.tsx:220 msgid "Confirm Removal" msgstr "" @@ -6870,8 +6880,8 @@ msgstr "外部" #: src/pages/sales/ReturnOrderDetail.tsx:108 #: src/pages/sales/SalesOrderDetail.tsx:98 #: src/tables/ColumnRenderers.tsx:321 -#: src/tables/build/BuildAllocatedStockTable.tsx:115 -#: src/tables/build/BuildLineTable.tsx:352 +#: src/tables/build/BuildAllocatedStockTable.tsx:112 +#: src/tables/build/BuildLineTable.tsx:353 msgid "Reference" msgstr "参照" @@ -7132,7 +7142,7 @@ msgstr "お見積をキャンセル" #: src/pages/build/BuildDetail.tsx:742 #: src/pages/stock/StockDetail.tsx:344 -#: src/tables/build/BuildAllocatedStockTable.tsx:85 +#: src/tables/build/BuildAllocatedStockTable.tsx:82 #: src/tables/part/PartBuildAllocationsTable.tsx:45 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:157 #: src/tables/stock/StockTrackingTable.tsx:109 @@ -7600,7 +7610,7 @@ msgstr "キーワード" #: src/pages/part/PartDetail.tsx:542 #: src/tables/bom/BomTable.tsx:439 -#: src/tables/build/BuildLineTable.tsx:305 +#: src/tables/build/BuildLineTable.tsx:306 #: src/tables/part/PartTable.tsx:319 #: src/tables/sales/SalesOrderLineItemTable.tsx:138 msgid "Available Stock" @@ -7608,7 +7618,7 @@ msgstr "在庫状況" #: src/pages/part/PartDetail.tsx:548 #: src/tables/bom/BomTable.tsx:341 -#: src/tables/build/BuildLineTable.tsx:267 +#: src/tables/build/BuildLineTable.tsx:268 #: src/tables/sales/SalesOrderLineItemTable.tsx:180 msgid "On order" msgstr "注文中" @@ -7782,7 +7792,7 @@ msgstr "注文" #: src/pages/part/PartDetail.tsx:1144 #: src/pages/stock/StockDetail.tsx:884 -#: src/tables/build/BuildLineTable.tsx:761 +#: src/tables/build/BuildLineTable.tsx:768 msgid "Order Stock" msgstr "注文在庫" @@ -9219,13 +9229,13 @@ msgstr "" #~ msgstr "Show asssmbled items" #: src/tables/bom/BomTable.tsx:315 -#: src/tables/build/BuildLineTable.tsx:276 +#: src/tables/build/BuildLineTable.tsx:277 #: src/tables/part/PartTable.tsx:145 msgid "External stock" msgstr "外部在庫" #: src/tables/bom/BomTable.tsx:323 -#: src/tables/build/BuildLineTable.tsx:239 +#: src/tables/build/BuildLineTable.tsx:240 msgid "Includes substitute stock" msgstr "代用株を含む" @@ -9234,7 +9244,7 @@ msgstr "代用株を含む" #~ msgstr "Edit Bom Item" #: src/tables/bom/BomTable.tsx:332 -#: src/tables/build/BuildLineTable.tsx:249 +#: src/tables/build/BuildLineTable.tsx:250 #: src/tables/sales/SalesOrderLineItemTable.tsx:166 msgid "Includes variant stock" msgstr "バリアントストック付き" @@ -9272,8 +9282,8 @@ msgid "Stock Information" msgstr "株式情報" #: src/tables/bom/BomTable.tsx:399 -#: src/tables/build/BuildLineTable.tsx:496 -#: src/tables/build/BuildLineTable.tsx:537 +#: src/tables/build/BuildLineTable.tsx:497 +#: src/tables/build/BuildLineTable.tsx:538 msgid "Consumable item" msgstr "消耗品" @@ -9282,7 +9292,7 @@ msgid "No available stock" msgstr "在庫なし" #: src/tables/bom/BomTable.tsx:420 -#: src/tables/build/BuildLineTable.tsx:213 +#: src/tables/build/BuildLineTable.tsx:214 msgid "Show testable items" msgstr "テスト可能な項目を表示" @@ -9291,7 +9301,7 @@ msgid "Show trackable items" msgstr "追跡可能なアイテムの表示" #: src/tables/bom/BomTable.tsx:430 -#: src/tables/build/BuildLineTable.tsx:208 +#: src/tables/build/BuildLineTable.tsx:209 msgid "Show assembled items" msgstr "組み立てられた商品を表示" @@ -9335,7 +9345,7 @@ msgstr "バリアント置換が可能な項目を表示" #: src/tables/bom/BomTable.tsx:464 #: src/tables/bom/UsedInTable.tsx:85 -#: src/tables/build/BuildLineTable.tsx:202 +#: src/tables/build/BuildLineTable.tsx:203 msgid "Optional" msgstr "オプション" @@ -9345,7 +9355,7 @@ msgid "Show optional items" msgstr "オプション項目の表示" #: src/tables/bom/BomTable.tsx:469 -#: src/tables/build/BuildLineTable.tsx:197 +#: src/tables/build/BuildLineTable.tsx:198 msgid "Consumable" msgstr "消耗品" @@ -9433,7 +9443,7 @@ msgid "Bill of materials cannot be edited, as the part is locked" msgstr "部品がロックされているため、部品表を編集できません。" #: src/tables/bom/UsedInTable.tsx:34 -#: src/tables/build/BuildLineTable.tsx:207 +#: src/tables/build/BuildLineTable.tsx:208 #: src/tables/part/ParametricPartTable.tsx:364 #: src/tables/part/PartBuildAllocationsTable.tsx:60 #: src/tables/part/PartTable.tsx:209 @@ -9455,11 +9465,11 @@ msgstr "追跡可能" msgid "Show trackable assemblies" msgstr "追跡可能なアセンブリの表示" -#: src/tables/build/BuildAllocatedStockTable.tsx:67 +#: src/tables/build/BuildAllocatedStockTable.tsx:64 msgid "Allocated to Output" msgstr "出力への割り当て" -#: src/tables/build/BuildAllocatedStockTable.tsx:68 +#: src/tables/build/BuildAllocatedStockTable.tsx:65 msgid "Show items allocated to a build output" msgstr "ビルド出力に割り当てられた項目を表示" @@ -9472,7 +9482,7 @@ msgstr "ビルド出力に割り当てられた項目を表示" #~ msgid "Include orders for part variants" #~ msgstr "Include orders for part variants" -#: src/tables/build/BuildAllocatedStockTable.tsx:97 +#: src/tables/build/BuildAllocatedStockTable.tsx:94 #: src/tables/part/PartBuildAllocationsTable.tsx:84 #: src/tables/part/PartPurchaseOrdersTable.tsx:132 #: src/tables/part/PartSalesAllocationsTable.tsx:69 @@ -9482,40 +9492,58 @@ msgid "Order Status" msgstr "注文ステータス" #: src/tables/build/BuildAllocatedStockTable.tsx:164 -#~ msgid "Edit Build Item" -#~ msgstr "Edit Build Item" - -#: src/tables/build/BuildAllocatedStockTable.tsx:167 -#: src/tables/build/BuildLineTable.tsx:650 +#: src/tables/build/BuildLineTable.tsx:651 msgid "Edit Stock Allocation" msgstr "株式配分の編集" +#: src/tables/build/BuildAllocatedStockTable.tsx:164 +#~ msgid "Edit Build Item" +#~ msgstr "Edit Build Item" + #: src/tables/build/BuildAllocatedStockTable.tsx:174 #~ msgid "Delete Build Item" #~ msgstr "Delete Build Item" +#: src/tables/build/BuildAllocatedStockTable.tsx:177 +#: src/tables/build/BuildLineTable.tsx:664 +#: src/tables/sales/SalesOrderAllocationTable.tsx:218 +msgid "Remove Allocated Stock" +msgstr "" + #: src/tables/build/BuildAllocatedStockTable.tsx:180 #: src/tables/build/BuildLineTable.tsx:663 -msgid "Delete Stock Allocation" -msgstr "株式割当の削除" +#~ msgid "Delete Stock Allocation" +#~ msgstr "Delete Stock Allocation" -#: src/tables/build/BuildAllocatedStockTable.tsx:239 +#: src/tables/build/BuildAllocatedStockTable.tsx:182 +#: src/tables/build/BuildLineTable.tsx:669 +#: src/tables/sales/SalesOrderAllocationTable.tsx:221 +msgid "Are you sure you want to remove this allocated stock from the order?" +msgstr "" + +#: src/tables/build/BuildAllocatedStockTable.tsx:242 msgid "Consume" msgstr "" +#: src/tables/build/BuildAllocatedStockTable.tsx:259 +#: src/tables/build/BuildLineTable.tsx:112 +#: src/tables/sales/SalesOrderAllocationTable.tsx:248 +msgid "Remove allocated stock" +msgstr "" + #: src/tables/build/BuildLineTable.tsx:59 #~ msgid "Show lines with available stock" #~ msgstr "Show lines with available stock" -#: src/tables/build/BuildLineTable.tsx:120 +#: src/tables/build/BuildLineTable.tsx:121 msgid "View Stock Item" msgstr "在庫を見る" -#: src/tables/build/BuildLineTable.tsx:183 +#: src/tables/build/BuildLineTable.tsx:184 msgid "Show fully allocated lines" msgstr "" -#: src/tables/build/BuildLineTable.tsx:188 +#: src/tables/build/BuildLineTable.tsx:189 msgid "Show fully consumed lines" msgstr "" @@ -9523,124 +9551,124 @@ msgstr "" #~ msgid "Show allocated lines" #~ msgstr "Show allocated lines" -#: src/tables/build/BuildLineTable.tsx:193 +#: src/tables/build/BuildLineTable.tsx:194 msgid "Show items with sufficient available stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:198 +#: src/tables/build/BuildLineTable.tsx:199 msgid "Show consumable lines" msgstr "消耗品ラインの表示" -#: src/tables/build/BuildLineTable.tsx:203 +#: src/tables/build/BuildLineTable.tsx:204 msgid "Show optional lines" msgstr "オプションラインの表示" -#: src/tables/build/BuildLineTable.tsx:212 +#: src/tables/build/BuildLineTable.tsx:213 #: src/tables/part/PartTable.tsx:233 msgid "Testable" msgstr "テスト可能" -#: src/tables/build/BuildLineTable.tsx:217 +#: src/tables/build/BuildLineTable.tsx:218 #: src/tables/stock/StockItemTable.tsx:388 msgid "Tracked" msgstr "追跡" -#: src/tables/build/BuildLineTable.tsx:218 +#: src/tables/build/BuildLineTable.tsx:219 msgid "Show tracked lines" msgstr "トラッキングラインの表示" -#: src/tables/build/BuildLineTable.tsx:223 +#: src/tables/build/BuildLineTable.tsx:224 msgid "Show items with stock on order" msgstr "" -#: src/tables/build/BuildLineTable.tsx:258 +#: src/tables/build/BuildLineTable.tsx:259 #: src/tables/sales/SalesOrderLineItemTable.tsx:172 msgid "In production" msgstr "生産中" -#: src/tables/build/BuildLineTable.tsx:286 +#: src/tables/build/BuildLineTable.tsx:287 msgid "Insufficient stock" msgstr "在庫不足" -#: src/tables/build/BuildLineTable.tsx:302 +#: src/tables/build/BuildLineTable.tsx:303 #: src/tables/sales/SalesOrderLineItemTable.tsx:160 #: src/tables/stock/StockItemTable.tsx:191 msgid "No stock available" msgstr "在庫なし" -#: src/tables/build/BuildLineTable.tsx:375 +#: src/tables/build/BuildLineTable.tsx:376 msgid "Gets Inherited" msgstr "継承" -#: src/tables/build/BuildLineTable.tsx:388 +#: src/tables/build/BuildLineTable.tsx:389 msgid "Unit Quantity" msgstr "単位 数量" -#: src/tables/build/BuildLineTable.tsx:415 +#: src/tables/build/BuildLineTable.tsx:416 msgid "Setup Quantity" msgstr "" -#: src/tables/build/BuildLineTable.tsx:424 +#: src/tables/build/BuildLineTable.tsx:425 msgid "Attrition" msgstr "" -#: src/tables/build/BuildLineTable.tsx:432 +#: src/tables/build/BuildLineTable.tsx:433 msgid "Rounding Multiple" msgstr "" -#: src/tables/build/BuildLineTable.tsx:441 +#: src/tables/build/BuildLineTable.tsx:442 msgid "BOM Information" msgstr "" -#: src/tables/build/BuildLineTable.tsx:515 +#: src/tables/build/BuildLineTable.tsx:516 #: src/tables/part/PartBuildAllocationsTable.tsx:102 msgid "Fully allocated" msgstr "" -#: src/tables/build/BuildLineTable.tsx:563 +#: src/tables/build/BuildLineTable.tsx:564 #: src/tables/sales/SalesOrderLineItemTable.tsx:311 msgid "Create Build Order" msgstr "ビルドオーダーの作成" -#: src/tables/build/BuildLineTable.tsx:592 +#: src/tables/build/BuildLineTable.tsx:593 msgid "Auto allocation in progress" msgstr "自動割り当て中" -#: src/tables/build/BuildLineTable.tsx:595 -#: src/tables/build/BuildLineTable.tsx:802 +#: src/tables/build/BuildLineTable.tsx:596 +#: src/tables/build/BuildLineTable.tsx:809 msgid "Auto Allocate Stock" msgstr "在庫の自動割り当て" -#: src/tables/build/BuildLineTable.tsx:596 +#: src/tables/build/BuildLineTable.tsx:597 msgid "Automatically allocate stock to this build according to the selected options" msgstr "選択されたオプションに従って、このビルドに在庫を自動的に割り当てます。" -#: src/tables/build/BuildLineTable.tsx:616 -#: src/tables/build/BuildLineTable.tsx:630 -#: src/tables/build/BuildLineTable.tsx:751 -#: src/tables/build/BuildLineTable.tsx:852 +#: src/tables/build/BuildLineTable.tsx:617 +#: src/tables/build/BuildLineTable.tsx:631 +#: src/tables/build/BuildLineTable.tsx:758 +#: src/tables/build/BuildLineTable.tsx:859 #: src/tables/build/BuildOutputTable.tsx:355 #: src/tables/build/BuildOutputTable.tsx:360 msgid "Deallocate Stock" msgstr "在庫処分" -#: src/tables/build/BuildLineTable.tsx:632 +#: src/tables/build/BuildLineTable.tsx:633 msgid "Deallocate all untracked stock for this build order" msgstr "このビルドオーダーのすべての未引当在庫を割り当て解除します。" -#: src/tables/build/BuildLineTable.tsx:634 +#: src/tables/build/BuildLineTable.tsx:635 msgid "Deallocate stock from the selected line item" msgstr "選択された品目から在庫を配分解除" -#: src/tables/build/BuildLineTable.tsx:638 +#: src/tables/build/BuildLineTable.tsx:639 msgid "Stock has been deallocated" msgstr "在庫の配分が終了しました" -#: src/tables/build/BuildLineTable.tsx:771 +#: src/tables/build/BuildLineTable.tsx:778 msgid "Build Stock" msgstr "ビルドストック" -#: src/tables/build/BuildLineTable.tsx:784 +#: src/tables/build/BuildLineTable.tsx:791 #: src/tables/sales/SalesOrderLineItemTable.tsx:487 msgid "View Part" msgstr "部品を見る" @@ -9739,7 +9767,7 @@ msgid "Serialize Build Output" msgstr "" #: src/tables/build/BuildOutputTable.tsx:405 -#: src/tables/part/PartTestResultTable.tsx:310 +#: src/tables/part/PartTestResultTable.tsx:318 #: src/tables/stock/StockItemTable.tsx:328 msgid "Filter by stock status" msgstr "在庫状況で絞り込む" @@ -9964,8 +9992,8 @@ msgid "View Item" msgstr "アイテムを見る" #: src/tables/general/ExtraLineItemTable.tsx:95 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:299 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:403 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:300 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:405 #: src/tables/sales/ReturnOrderLineItemTable.tsx:83 #: src/tables/sales/ReturnOrderLineItemTable.tsx:187 #: src/tables/sales/SalesOrderLineItemTable.tsx:252 @@ -9974,14 +10002,14 @@ msgid "Add Line Item" msgstr "項目追加" #: src/tables/general/ExtraLineItemTable.tsx:108 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:320 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:322 #: src/tables/sales/ReturnOrderLineItemTable.tsx:96 #: src/tables/sales/SalesOrderLineItemTable.tsx:271 msgid "Edit Line Item" msgstr "ラインアイテムの編集" #: src/tables/general/ExtraLineItemTable.tsx:117 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:329 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:331 #: src/tables/sales/ReturnOrderLineItemTable.tsx:105 #: src/tables/sales/SalesOrderLineItemTable.tsx:280 msgid "Delete Line Item" @@ -10273,7 +10301,7 @@ msgid "Required Stock" msgstr "必要在庫" #: src/tables/part/PartBuildAllocationsTable.tsx:124 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:381 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:383 msgid "View Build Order" msgstr "ビルドオーダーを見る" @@ -10617,8 +10645,8 @@ msgstr "" #: src/tables/part/PartTestResultTable.tsx:103 #: src/tables/part/PartTestResultTable.tsx:181 -#: src/tables/part/PartTestResultTable.tsx:320 -#: src/tables/part/PartTestResultTable.tsx:334 +#: src/tables/part/PartTestResultTable.tsx:328 +#: src/tables/part/PartTestResultTable.tsx:342 #: src/tables/stock/StockItemTestResultTable.tsx:296 #: src/tables/stock/StockItemTestResultTable.tsx:368 #: src/tables/stock/StockItemTestResultTable.tsx:429 @@ -10643,7 +10671,7 @@ msgstr "" msgid "No Result" msgstr "結果なし" -#: src/tables/part/PartTestResultTable.tsx:298 +#: src/tables/part/PartTestResultTable.tsx:306 msgid "Show build outputs currently in production" msgstr "現在生産中のビルド出力を表示" @@ -11073,7 +11101,7 @@ msgid "Show manufacturer parts for active manufacturers." msgstr "" #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:115 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:397 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:399 msgid "Import Line Items" msgstr "ラインアイテムのインポート" @@ -11099,11 +11127,11 @@ msgstr "受領済みの品目を表示" #~ msgid "Add line item" #~ msgstr "Add line item" -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:350 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:352 msgid "Receive line item" msgstr "品目を受け取る" -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:414 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:416 msgid "Receive items" msgstr "商品を受け取る" @@ -11201,25 +11229,25 @@ msgid "Not shipped" msgstr "未出荷" #: src/tables/sales/SalesOrderAllocationTable.tsx:211 -#: src/tables/sales/SalesOrderAllocationTable.tsx:229 +#: src/tables/sales/SalesOrderAllocationTable.tsx:235 msgid "Edit Allocation" msgstr "編集配分" #: src/tables/sales/SalesOrderAllocationTable.tsx:218 #: src/tables/sales/SalesOrderAllocationTable.tsx:241 -msgid "Delete Allocation" -msgstr "割り当ての削除" +#~ msgid "Delete Allocation" +#~ msgstr "Delete Allocation" -#: src/tables/sales/SalesOrderAllocationTable.tsx:252 -#: src/tables/sales/SalesOrderAllocationTable.tsx:253 +#: src/tables/sales/SalesOrderAllocationTable.tsx:261 +#: src/tables/sales/SalesOrderAllocationTable.tsx:262 msgid "View Shipment" msgstr "出荷を見る" -#: src/tables/sales/SalesOrderAllocationTable.tsx:308 +#: src/tables/sales/SalesOrderAllocationTable.tsx:317 msgid "Assign to Shipment" msgstr "出荷への割り当て" -#: src/tables/sales/SalesOrderAllocationTable.tsx:324 +#: src/tables/sales/SalesOrderAllocationTable.tsx:333 msgid "Assign to shipment" msgstr "出荷への割り当て" diff --git a/src/frontend/src/locales/ko/messages.po b/src/frontend/src/locales/ko/messages.po index 99695ddaf8..5c8123c604 100644 --- a/src/frontend/src/locales/ko/messages.po +++ b/src/frontend/src/locales/ko/messages.po @@ -8,7 +8,7 @@ msgstr "" "Language: ko\n" "Project-Id-Version: inventree\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2025-11-19 19:39\n" +"PO-Revision-Date: 2025-11-22 06:25\n" "Last-Translator: \n" "Language-Team: Korean\n" "Plural-Forms: nplurals=1; plural=0;\n" @@ -56,7 +56,7 @@ msgstr "" #: lib/components/RowActions.tsx:136 #: src/components/nav/NavigationDrawer.tsx:190 -#: src/forms/PurchaseOrderForms.tsx:802 +#: src/forms/PurchaseOrderForms.tsx:854 #: src/forms/StockForms.tsx:796 #: src/forms/StockForms.tsx:843 #: src/forms/StockForms.tsx:889 @@ -103,9 +103,9 @@ msgstr "" #: src/forms/BuildForms.tsx:630 #: src/forms/BuildForms.tsx:793 #: src/forms/BuildForms.tsx:896 -#: src/forms/PurchaseOrderForms.tsx:798 +#: src/forms/PurchaseOrderForms.tsx:850 #: src/forms/ReturnOrderForms.tsx:242 -#: src/forms/SalesOrderForms.tsx:305 +#: src/forms/SalesOrderForms.tsx:323 #: src/forms/StockForms.tsx:360 #: src/forms/StockForms.tsx:791 #: src/forms/StockForms.tsx:838 @@ -119,6 +119,7 @@ msgstr "" #: src/pages/build/BuildDetail.tsx:200 #: src/pages/part/PartDetail.tsx:1207 #: src/tables/ColumnRenderers.tsx:91 +#: src/tables/part/PartTestResultTable.tsx:247 #: src/tables/part/RelatedPartTable.tsx:53 #: src/tables/stock/StockTrackingTable.tsx:87 msgid "Part" @@ -158,7 +159,7 @@ msgstr "" #: src/components/wizards/OrderPartsWizard.tsx:290 #: src/pages/company/SupplierPartDetail.tsx:413 #: src/pages/stock/StockDetail.tsx:289 -#: src/tables/build/BuildAllocatedStockTable.tsx:155 +#: src/tables/build/BuildAllocatedStockTable.tsx:152 #: src/tables/part/PartPurchaseOrdersTable.tsx:50 #: src/tables/purchasing/SupplierPartTable.tsx:83 #: src/tables/stock/StockItemTable.tsx:247 @@ -201,9 +202,9 @@ msgstr "" #: src/forms/BuildForms.tsx:473 #: src/forms/BuildForms.tsx:633 #: src/forms/BuildForms.tsx:794 -#: src/forms/SalesOrderForms.tsx:307 +#: src/forms/SalesOrderForms.tsx:325 #: src/pages/stock/StockDetail.tsx:1005 -#: src/tables/part/PartTestResultTable.tsx:248 +#: src/tables/part/PartTestResultTable.tsx:256 #: src/tables/stock/StockTrackingTable.tsx:48 #: src/tables/stock/StockTrackingTable.tsx:55 msgid "Stock Item" @@ -517,7 +518,7 @@ msgstr "" #: src/components/dashboard/DashboardLayout.tsx:281 #: src/components/editors/NotesEditor.tsx:74 #: src/components/editors/TemplateEditor/TemplateEditor.tsx:158 -#: src/components/forms/fields/ApiFormField.tsx:273 +#: src/components/forms/fields/ApiFormField.tsx:237 #: src/components/forms/fields/TableField.tsx:45 #: src/components/importer/ImportDataSelector.tsx:192 #: src/components/importer/ImporterColumnSelector.tsx:234 @@ -642,8 +643,8 @@ msgstr "" #: src/components/barcodes/BarcodeScanDialog.tsx:49 #: src/components/buttons/ScanButton.tsx:15 #: src/components/nav/NavigationDrawer.tsx:122 -#: src/forms/PurchaseOrderForms.tsx:457 -#: src/forms/PurchaseOrderForms.tsx:563 +#: src/forms/PurchaseOrderForms.tsx:509 +#: src/forms/PurchaseOrderForms.tsx:615 msgid "Scan Barcode" msgstr "" @@ -728,7 +729,7 @@ msgstr "" #: src/components/barcodes/QRCode.tsx:205 #: src/components/items/ActionDropdown.tsx:192 -#: src/forms/PurchaseOrderForms.tsx:554 +#: src/forms/PurchaseOrderForms.tsx:606 msgid "Unlink Barcode" msgstr "" @@ -1216,6 +1217,12 @@ msgstr "" #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:884 #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:903 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:254 +#: src/tables/build/BuildAllocatedStockTable.tsx:178 +#: src/tables/build/BuildAllocatedStockTable.tsx:258 +#: src/tables/build/BuildLineTable.tsx:111 +#: src/tables/build/BuildLineTable.tsx:665 +#: src/tables/sales/SalesOrderAllocationTable.tsx:224 +#: src/tables/sales/SalesOrderAllocationTable.tsx:247 msgid "Remove" msgstr "" @@ -1241,7 +1248,7 @@ msgid "Upload Error" msgstr "" #: src/components/details/DetailsImage.tsx:250 -#: src/components/forms/fields/TextField.tsx:65 +#: src/components/forms/fields/AutoFillRightSection.tsx:34 msgid "Clear" msgstr "" @@ -1817,10 +1824,14 @@ msgstr "" msgid "Running" msgstr "" -#: src/components/forms/fields/ApiFormField.tsx:233 +#: src/components/forms/fields/ApiFormField.tsx:197 msgid "Select file to upload" msgstr "" +#: src/components/forms/fields/AutoFillRightSection.tsx:47 +msgid "Accept suggested value" +msgstr "" + #: src/components/forms/fields/DateField.tsx:76 msgid "Select date" msgstr "" @@ -1875,10 +1886,6 @@ msgstr "" msgid "Add new row" msgstr "" -#: src/components/forms/fields/TextField.tsx:82 -msgid "Accept suggested value" -msgstr "" - #: src/components/images/DetailsImage.tsx:252 #~ msgid "Select image" #~ msgstr "Select image" @@ -2225,8 +2232,8 @@ msgstr "" #: src/pages/part/PartDetail.tsx:994 #: src/pages/stock/StockDetail.tsx:265 #: src/pages/stock/StockDetail.tsx:942 -#: src/tables/build/BuildAllocatedStockTable.tsx:135 -#: src/tables/build/BuildLineTable.tsx:192 +#: src/tables/build/BuildAllocatedStockTable.tsx:132 +#: src/tables/build/BuildLineTable.tsx:193 #: src/tables/part/PartTable.tsx:137 #: src/tables/stock/StockItemTable.tsx:182 #: src/tables/stock/StockItemTable.tsx:343 @@ -2784,7 +2791,7 @@ msgstr "" #: src/pages/sales/SalesOrderDetail.tsx:119 #: src/pages/stock/LocationDetail.tsx:102 #: src/tables/ColumnRenderers.tsx:278 -#: src/tables/build/BuildAllocatedStockTable.tsx:91 +#: src/tables/build/BuildAllocatedStockTable.tsx:88 #: src/tables/machine/MachineTypeTable.tsx:161 #: src/tables/machine/MachineTypeTable.tsx:257 #: src/tables/plugin/PluginListTable.tsx:110 @@ -2966,7 +2973,7 @@ msgstr "" #: src/pages/company/SupplierPartDetail.tsx:394 #: src/pages/part/PartDetail.tsx:1015 #: src/tables/bom/BomTable.tsx:444 -#: src/tables/build/BuildLineTable.tsx:222 +#: src/tables/build/BuildLineTable.tsx:223 #: src/tables/part/PartTable.tsx:108 msgid "On Order" msgstr "" @@ -2976,7 +2983,7 @@ msgstr "" #: src/pages/part/PartDetail.tsx:587 #: src/pages/part/PartDetail.tsx:1021 #: src/pages/stock/StockDetail.tsx:925 -#: src/tables/part/PartTestResultTable.tsx:297 +#: src/tables/part/PartTestResultTable.tsx:305 #: src/tables/stock/StockItemTable.tsx:359 msgid "In Production" msgstr "" @@ -3000,7 +3007,7 @@ msgstr "" #: src/components/render/Stock.tsx:114 #: src/components/render/Stock.tsx:132 #: src/forms/BuildForms.tsx:795 -#: src/forms/PurchaseOrderForms.tsx:595 +#: src/forms/PurchaseOrderForms.tsx:647 #: src/forms/StockForms.tsx:792 #: src/forms/StockForms.tsx:839 #: src/forms/StockForms.tsx:885 @@ -3023,7 +3030,7 @@ msgstr "" #: src/components/render/Stock.tsx:99 #: src/pages/stock/StockDetail.tsx:198 #: src/pages/stock/StockDetail.tsx:930 -#: src/tables/build/BuildAllocatedStockTable.tsx:121 +#: src/tables/build/BuildAllocatedStockTable.tsx:118 #: src/tables/build/BuildOutputTable.tsx:107 #: src/tables/sales/SalesOrderAllocationTable.tsx:142 msgid "Serial Number" @@ -3034,9 +3041,9 @@ msgstr "" #: src/forms/BuildForms.tsx:240 #: src/forms/BuildForms.tsx:634 #: src/forms/BuildForms.tsx:797 -#: src/forms/PurchaseOrderForms.tsx:801 +#: src/forms/PurchaseOrderForms.tsx:853 #: src/forms/ReturnOrderForms.tsx:243 -#: src/forms/SalesOrderForms.tsx:308 +#: src/forms/SalesOrderForms.tsx:326 #: src/forms/StockForms.tsx:841 #: src/pages/part/PartStockHistoryDetail.tsx:56 #: src/pages/part/PartStockHistoryDetail.tsx:210 @@ -3046,9 +3053,9 @@ msgstr "" #: src/pages/part/pricing/PriceBreakPanel.tsx:172 #: src/pages/stock/StockDetail.tsx:258 #: src/pages/stock/StockDetail.tsx:936 -#: src/tables/build/BuildLineTable.tsx:86 +#: src/tables/build/BuildLineTable.tsx:83 #: src/tables/part/PartPurchaseOrdersTable.tsx:94 -#: src/tables/part/PartTestResultTable.tsx:269 +#: src/tables/part/PartTestResultTable.tsx:277 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:175 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:206 #: src/tables/purchasing/SupplierPriceBreakTable.tsx:69 @@ -3070,7 +3077,7 @@ msgstr "" #: src/forms/StockForms.tsx:1048 #: src/forms/StockForms.tsx:1096 #: src/forms/StockForms.tsx:1140 -#: src/tables/build/BuildLineTable.tsx:96 +#: src/tables/build/BuildLineTable.tsx:93 msgid "Batch" msgstr "" @@ -3755,7 +3762,7 @@ msgid "In Stock" msgstr "" #: src/components/wizards/OrderPartsWizard.tsx:146 -#: src/tables/build/BuildLineTable.tsx:404 +#: src/tables/build/BuildLineTable.tsx:405 msgid "Required Quantity" msgstr "" @@ -3847,7 +3854,7 @@ msgid "Please correct the errors in the selected parts" msgstr "" #: src/components/wizards/OrderPartsWizard.tsx:587 -#: src/tables/build/BuildLineTable.tsx:815 +#: src/tables/build/BuildLineTable.tsx:822 #: src/tables/part/PartTable.tsx:522 #: src/tables/sales/SalesOrderLineItemTable.tsx:370 msgid "Order Parts" @@ -4349,9 +4356,9 @@ msgstr "" #: src/forms/BuildForms.tsx:333 #: src/forms/BuildForms.tsx:408 #: src/forms/BuildForms.tsx:685 -#: src/tables/build/BuildAllocatedStockTable.tsx:150 +#: src/tables/build/BuildAllocatedStockTable.tsx:147 #: src/tables/build/BuildOutputTable.tsx:582 -#: src/tables/part/PartTestResultTable.tsx:272 +#: src/tables/part/PartTestResultTable.tsx:280 msgid "Build Output" msgstr "" @@ -4362,7 +4369,7 @@ msgstr "" #: src/forms/BuildForms.tsx:336 #: src/forms/BuildForms.tsx:411 #: src/forms/BuildForms.tsx:475 -#: src/forms/PurchaseOrderForms.tsx:717 +#: src/forms/PurchaseOrderForms.tsx:769 #: src/forms/ReturnOrderForms.tsx:197 #: src/forms/ReturnOrderForms.tsx:244 #: src/forms/StockForms.tsx:712 @@ -4377,7 +4384,7 @@ msgstr "" #: src/tables/build/BuildOutputTable.tsx:404 #: src/tables/machine/MachineListTable.tsx:387 #: src/tables/part/PartPurchaseOrdersTable.tsx:38 -#: src/tables/part/PartTestResultTable.tsx:309 +#: src/tables/part/PartTestResultTable.tsx:317 #: src/tables/sales/ReturnOrderLineItemTable.tsx:138 #: src/tables/sales/ReturnOrderLineItemTable.tsx:176 #: src/tables/settings/CustomStateTable.tsx:79 @@ -4450,8 +4457,8 @@ msgstr "" #: src/pages/stock/StockDetail.tsx:153 #: src/tables/bom/BomTable.tsx:134 #: src/tables/bom/UsedInTable.tsx:40 -#: src/tables/build/BuildAllocatedStockTable.tsx:108 -#: src/tables/build/BuildLineTable.tsx:336 +#: src/tables/build/BuildAllocatedStockTable.tsx:105 +#: src/tables/build/BuildLineTable.tsx:337 #: src/tables/build/BuildOrderTable.tsx:79 #: src/tables/part/PartSalesAllocationsTable.tsx:61 #: src/tables/part/RelatedPartTable.tsx:73 @@ -4466,47 +4473,47 @@ msgstr "" #: src/forms/BuildForms.tsx:632 #: src/forms/BuildForms.tsx:796 #: src/forms/BuildForms.tsx:897 -#: src/forms/SalesOrderForms.tsx:306 -#: src/tables/build/BuildAllocatedStockTable.tsx:139 -#: src/tables/build/BuildLineTable.tsx:182 +#: src/forms/SalesOrderForms.tsx:324 +#: src/tables/build/BuildAllocatedStockTable.tsx:136 +#: src/tables/build/BuildLineTable.tsx:183 #: src/tables/sales/SalesOrderLineItemTable.tsx:342 #: src/tables/stock/StockItemTable.tsx:338 msgid "Allocated" msgstr "" #: src/forms/BuildForms.tsx:667 -#: src/forms/SalesOrderForms.tsx:295 +#: src/forms/SalesOrderForms.tsx:313 #: src/pages/build/BuildDetail.tsx:108 #: src/pages/build/BuildDetail.tsx:326 msgid "Source Location" msgstr "" #: src/forms/BuildForms.tsx:668 -#: src/forms/SalesOrderForms.tsx:296 +#: src/forms/SalesOrderForms.tsx:314 msgid "Select the source location for the stock allocation" msgstr "" #: src/forms/BuildForms.tsx:700 -#: src/forms/SalesOrderForms.tsx:336 -#: src/tables/build/BuildLineTable.tsx:574 -#: src/tables/build/BuildLineTable.tsx:731 -#: src/tables/build/BuildLineTable.tsx:830 +#: src/forms/SalesOrderForms.tsx:354 +#: src/tables/build/BuildLineTable.tsx:575 +#: src/tables/build/BuildLineTable.tsx:738 +#: src/tables/build/BuildLineTable.tsx:837 #: src/tables/sales/SalesOrderLineItemTable.tsx:380 #: src/tables/sales/SalesOrderLineItemTable.tsx:406 msgid "Allocate Stock" msgstr "" #: src/forms/BuildForms.tsx:703 -#: src/forms/SalesOrderForms.tsx:341 +#: src/forms/SalesOrderForms.tsx:359 msgid "Stock items allocated" msgstr "" #: src/forms/BuildForms.tsx:816 #: src/forms/BuildForms.tsx:917 -#: src/tables/build/BuildAllocatedStockTable.tsx:240 -#: src/tables/build/BuildAllocatedStockTable.tsx:272 -#: src/tables/build/BuildLineTable.tsx:741 -#: src/tables/build/BuildLineTable.tsx:864 +#: src/tables/build/BuildAllocatedStockTable.tsx:243 +#: src/tables/build/BuildAllocatedStockTable.tsx:279 +#: src/tables/build/BuildLineTable.tsx:748 +#: src/tables/build/BuildLineTable.tsx:871 msgid "Consume Stock" msgstr "" @@ -4521,21 +4528,21 @@ msgstr "" #~ msgstr "Stock items consumed" #: src/forms/BuildForms.tsx:853 -#: src/tables/build/BuildLineTable.tsx:514 +#: src/tables/build/BuildLineTable.tsx:515 #: src/tables/part/PartBuildAllocationsTable.tsx:101 msgid "Fully consumed" msgstr "" #: src/forms/BuildForms.tsx:898 -#: src/tables/build/BuildLineTable.tsx:187 +#: src/tables/build/BuildLineTable.tsx:188 #: src/tables/stock/StockItemTable.tsx:367 msgid "Consumed" msgstr "" #: src/forms/CommonForms.tsx:88 -#: src/forms/PurchaseOrderForms.tsx:125 +#: src/forms/PurchaseOrderForms.tsx:176 #: src/forms/ReturnOrderForms.tsx:138 -#: src/forms/SalesOrderForms.tsx:164 +#: src/forms/SalesOrderForms.tsx:182 msgid "Select project code for this line item" msgstr "" @@ -4572,32 +4579,16 @@ msgstr "" msgid "Subscribe to notifications for this category" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:388 -msgid "Assign Batch Code and Serial Numbers" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:390 -msgid "Assign Batch Code" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:410 -msgid "Choose Location" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:418 -msgid "Item Destination selected" -msgstr "" - #: src/forms/PurchaseOrderForms.tsx:421 #~ msgid "Assign Batch Code{0}" #~ msgstr "Assign Batch Code{0}" -#: src/forms/PurchaseOrderForms.tsx:428 -msgid "Part category default location selected" +#: src/forms/PurchaseOrderForms.tsx:440 +msgid "Assign Batch Code and Serial Numbers" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:438 -msgid "Received stock location selected" +#: src/forms/PurchaseOrderForms.tsx:442 +msgid "Assign Batch Code" msgstr "" #: src/forms/PurchaseOrderForms.tsx:444 @@ -4605,94 +4596,110 @@ msgstr "" #~ msgid "Remove item from list" #~ msgstr "Remove item from list" -#: src/forms/PurchaseOrderForms.tsx:446 +#: src/forms/PurchaseOrderForms.tsx:462 +msgid "Choose Location" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:470 +msgid "Item Destination selected" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:480 +msgid "Part category default location selected" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:490 +msgid "Received stock location selected" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:498 msgid "Default location selected" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:507 +#: src/forms/PurchaseOrderForms.tsx:559 msgid "Set Location" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:524 -msgid "Set Expiry Date" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:532 -#: src/forms/StockForms.tsx:693 -msgid "Adjust Packaging" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:540 -#: src/forms/StockForms.tsx:684 -#: src/hooks/UseStockAdjustActions.tsx:148 -msgid "Change Status" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:546 -msgid "Add Note" -msgstr "" - #: src/forms/PurchaseOrderForms.tsx:566 #~ msgid "Serial numbers" #~ msgstr "Serial numbers" +#: src/forms/PurchaseOrderForms.tsx:576 +msgid "Set Expiry Date" +msgstr "" + #: src/forms/PurchaseOrderForms.tsx:582 #~ msgid "Store at line item destination" #~ msgstr "Store at line item destination" -#: src/forms/PurchaseOrderForms.tsx:610 -msgid "Store at default location" +#: src/forms/PurchaseOrderForms.tsx:584 +#: src/forms/StockForms.tsx:693 +msgid "Adjust Packaging" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:625 -msgid "Store at line item destination " +#: src/forms/PurchaseOrderForms.tsx:592 +#: src/forms/StockForms.tsx:684 +#: src/hooks/UseStockAdjustActions.tsx:148 +msgid "Change Status" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:637 -msgid "Store with already received stock" +#: src/forms/PurchaseOrderForms.tsx:598 +msgid "Add Note" msgstr "" #: src/forms/PurchaseOrderForms.tsx:658 #~ msgid "Receive line items" #~ msgstr "Receive line items" -#: src/forms/PurchaseOrderForms.tsx:661 +#: src/forms/PurchaseOrderForms.tsx:662 +msgid "Store at default location" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:677 +msgid "Store at line item destination " +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:689 +msgid "Store with already received stock" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:713 #: src/pages/build/BuildDetail.tsx:340 #: src/pages/stock/StockDetail.tsx:280 #: src/pages/stock/StockDetail.tsx:952 #: src/tables/Filter.tsx:83 -#: src/tables/build/BuildAllocatedStockTable.tsx:128 +#: src/tables/build/BuildAllocatedStockTable.tsx:125 #: src/tables/build/BuildOutputTable.tsx:112 -#: src/tables/part/PartTestResultTable.tsx:260 -#: src/tables/part/PartTestResultTable.tsx:281 +#: src/tables/part/PartTestResultTable.tsx:268 +#: src/tables/part/PartTestResultTable.tsx:289 #: src/tables/sales/SalesOrderAllocationTable.tsx:149 msgid "Batch Code" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:662 +#: src/forms/PurchaseOrderForms.tsx:714 msgid "Enter batch code for received items" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:675 +#: src/forms/PurchaseOrderForms.tsx:727 #: src/forms/StockForms.tsx:218 msgid "Serial Numbers" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:676 +#: src/forms/PurchaseOrderForms.tsx:728 msgid "Enter serial numbers for received items" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:690 +#: src/forms/PurchaseOrderForms.tsx:742 #: src/pages/stock/StockDetail.tsx:382 #: src/tables/stock/StockItemTable.tsx:294 msgid "Expiry Date" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:691 +#: src/forms/PurchaseOrderForms.tsx:743 msgid "Enter an expiry date for received items" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:703 +#: src/forms/PurchaseOrderForms.tsx:755 #: src/forms/StockForms.tsx:728 #: src/pages/company/SupplierPartDetail.tsx:172 #: src/pages/company/SupplierPartDetail.tsx:236 @@ -4701,19 +4708,19 @@ msgstr "" msgid "Packaging" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:727 +#: src/forms/PurchaseOrderForms.tsx:779 #: src/pages/company/SupplierPartDetail.tsx:120 #: src/tables/ColumnRenderers.tsx:332 msgid "Note" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:799 +#: src/forms/PurchaseOrderForms.tsx:851 #: src/pages/company/SupplierPartDetail.tsx:138 #: src/tables/purchasing/SupplierPriceBreakTable.tsx:49 msgid "SKU" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:800 +#: src/forms/PurchaseOrderForms.tsx:852 #: src/tables/part/PartPurchaseOrdersTable.tsx:127 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:213 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:283 @@ -4721,11 +4728,11 @@ msgstr "" msgid "Received" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:817 +#: src/forms/PurchaseOrderForms.tsx:869 msgid "Receive Line Items" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:823 +#: src/forms/PurchaseOrderForms.tsx:875 msgid "Items received" msgstr "" @@ -4737,7 +4744,7 @@ msgstr "" msgid "Item received into stock" msgstr "" -#: src/forms/SalesOrderForms.tsx:401 +#: src/forms/SalesOrderForms.tsx:419 msgid "Leave blank to use the order address" msgstr "" @@ -5932,6 +5939,9 @@ msgstr "" #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:310 #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:401 +#: src/tables/build/BuildAllocatedStockTable.tsx:181 +#: src/tables/build/BuildLineTable.tsx:668 +#: src/tables/sales/SalesOrderAllocationTable.tsx:220 msgid "Confirm Removal" msgstr "" @@ -6870,8 +6880,8 @@ msgstr "" #: src/pages/sales/ReturnOrderDetail.tsx:108 #: src/pages/sales/SalesOrderDetail.tsx:98 #: src/tables/ColumnRenderers.tsx:321 -#: src/tables/build/BuildAllocatedStockTable.tsx:115 -#: src/tables/build/BuildLineTable.tsx:352 +#: src/tables/build/BuildAllocatedStockTable.tsx:112 +#: src/tables/build/BuildLineTable.tsx:353 msgid "Reference" msgstr "" @@ -7132,7 +7142,7 @@ msgstr "" #: src/pages/build/BuildDetail.tsx:742 #: src/pages/stock/StockDetail.tsx:344 -#: src/tables/build/BuildAllocatedStockTable.tsx:85 +#: src/tables/build/BuildAllocatedStockTable.tsx:82 #: src/tables/part/PartBuildAllocationsTable.tsx:45 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:157 #: src/tables/stock/StockTrackingTable.tsx:109 @@ -7600,7 +7610,7 @@ msgstr "" #: src/pages/part/PartDetail.tsx:542 #: src/tables/bom/BomTable.tsx:439 -#: src/tables/build/BuildLineTable.tsx:305 +#: src/tables/build/BuildLineTable.tsx:306 #: src/tables/part/PartTable.tsx:319 #: src/tables/sales/SalesOrderLineItemTable.tsx:138 msgid "Available Stock" @@ -7608,7 +7618,7 @@ msgstr "" #: src/pages/part/PartDetail.tsx:548 #: src/tables/bom/BomTable.tsx:341 -#: src/tables/build/BuildLineTable.tsx:267 +#: src/tables/build/BuildLineTable.tsx:268 #: src/tables/sales/SalesOrderLineItemTable.tsx:180 msgid "On order" msgstr "" @@ -7782,7 +7792,7 @@ msgstr "" #: src/pages/part/PartDetail.tsx:1144 #: src/pages/stock/StockDetail.tsx:884 -#: src/tables/build/BuildLineTable.tsx:761 +#: src/tables/build/BuildLineTable.tsx:768 msgid "Order Stock" msgstr "" @@ -9219,13 +9229,13 @@ msgstr "" #~ msgstr "Show asssmbled items" #: src/tables/bom/BomTable.tsx:315 -#: src/tables/build/BuildLineTable.tsx:276 +#: src/tables/build/BuildLineTable.tsx:277 #: src/tables/part/PartTable.tsx:145 msgid "External stock" msgstr "" #: src/tables/bom/BomTable.tsx:323 -#: src/tables/build/BuildLineTable.tsx:239 +#: src/tables/build/BuildLineTable.tsx:240 msgid "Includes substitute stock" msgstr "" @@ -9234,7 +9244,7 @@ msgstr "" #~ msgstr "Edit Bom Item" #: src/tables/bom/BomTable.tsx:332 -#: src/tables/build/BuildLineTable.tsx:249 +#: src/tables/build/BuildLineTable.tsx:250 #: src/tables/sales/SalesOrderLineItemTable.tsx:166 msgid "Includes variant stock" msgstr "" @@ -9272,8 +9282,8 @@ msgid "Stock Information" msgstr "" #: src/tables/bom/BomTable.tsx:399 -#: src/tables/build/BuildLineTable.tsx:496 -#: src/tables/build/BuildLineTable.tsx:537 +#: src/tables/build/BuildLineTable.tsx:497 +#: src/tables/build/BuildLineTable.tsx:538 msgid "Consumable item" msgstr "" @@ -9282,7 +9292,7 @@ msgid "No available stock" msgstr "" #: src/tables/bom/BomTable.tsx:420 -#: src/tables/build/BuildLineTable.tsx:213 +#: src/tables/build/BuildLineTable.tsx:214 msgid "Show testable items" msgstr "" @@ -9291,7 +9301,7 @@ msgid "Show trackable items" msgstr "" #: src/tables/bom/BomTable.tsx:430 -#: src/tables/build/BuildLineTable.tsx:208 +#: src/tables/build/BuildLineTable.tsx:209 msgid "Show assembled items" msgstr "" @@ -9335,7 +9345,7 @@ msgstr "" #: src/tables/bom/BomTable.tsx:464 #: src/tables/bom/UsedInTable.tsx:85 -#: src/tables/build/BuildLineTable.tsx:202 +#: src/tables/build/BuildLineTable.tsx:203 msgid "Optional" msgstr "" @@ -9345,7 +9355,7 @@ msgid "Show optional items" msgstr "" #: src/tables/bom/BomTable.tsx:469 -#: src/tables/build/BuildLineTable.tsx:197 +#: src/tables/build/BuildLineTable.tsx:198 msgid "Consumable" msgstr "" @@ -9433,7 +9443,7 @@ msgid "Bill of materials cannot be edited, as the part is locked" msgstr "" #: src/tables/bom/UsedInTable.tsx:34 -#: src/tables/build/BuildLineTable.tsx:207 +#: src/tables/build/BuildLineTable.tsx:208 #: src/tables/part/ParametricPartTable.tsx:364 #: src/tables/part/PartBuildAllocationsTable.tsx:60 #: src/tables/part/PartTable.tsx:209 @@ -9455,11 +9465,11 @@ msgstr "" msgid "Show trackable assemblies" msgstr "" -#: src/tables/build/BuildAllocatedStockTable.tsx:67 +#: src/tables/build/BuildAllocatedStockTable.tsx:64 msgid "Allocated to Output" msgstr "" -#: src/tables/build/BuildAllocatedStockTable.tsx:68 +#: src/tables/build/BuildAllocatedStockTable.tsx:65 msgid "Show items allocated to a build output" msgstr "" @@ -9472,7 +9482,7 @@ msgstr "" #~ msgid "Include orders for part variants" #~ msgstr "Include orders for part variants" -#: src/tables/build/BuildAllocatedStockTable.tsx:97 +#: src/tables/build/BuildAllocatedStockTable.tsx:94 #: src/tables/part/PartBuildAllocationsTable.tsx:84 #: src/tables/part/PartPurchaseOrdersTable.tsx:132 #: src/tables/part/PartSalesAllocationsTable.tsx:69 @@ -9482,40 +9492,58 @@ msgid "Order Status" msgstr "" #: src/tables/build/BuildAllocatedStockTable.tsx:164 -#~ msgid "Edit Build Item" -#~ msgstr "Edit Build Item" - -#: src/tables/build/BuildAllocatedStockTable.tsx:167 -#: src/tables/build/BuildLineTable.tsx:650 +#: src/tables/build/BuildLineTable.tsx:651 msgid "Edit Stock Allocation" msgstr "" +#: src/tables/build/BuildAllocatedStockTable.tsx:164 +#~ msgid "Edit Build Item" +#~ msgstr "Edit Build Item" + #: src/tables/build/BuildAllocatedStockTable.tsx:174 #~ msgid "Delete Build Item" #~ msgstr "Delete Build Item" -#: src/tables/build/BuildAllocatedStockTable.tsx:180 -#: src/tables/build/BuildLineTable.tsx:663 -msgid "Delete Stock Allocation" +#: src/tables/build/BuildAllocatedStockTable.tsx:177 +#: src/tables/build/BuildLineTable.tsx:664 +#: src/tables/sales/SalesOrderAllocationTable.tsx:218 +msgid "Remove Allocated Stock" msgstr "" -#: src/tables/build/BuildAllocatedStockTable.tsx:239 +#: src/tables/build/BuildAllocatedStockTable.tsx:180 +#: src/tables/build/BuildLineTable.tsx:663 +#~ msgid "Delete Stock Allocation" +#~ msgstr "Delete Stock Allocation" + +#: src/tables/build/BuildAllocatedStockTable.tsx:182 +#: src/tables/build/BuildLineTable.tsx:669 +#: src/tables/sales/SalesOrderAllocationTable.tsx:221 +msgid "Are you sure you want to remove this allocated stock from the order?" +msgstr "" + +#: src/tables/build/BuildAllocatedStockTable.tsx:242 msgid "Consume" msgstr "" +#: src/tables/build/BuildAllocatedStockTable.tsx:259 +#: src/tables/build/BuildLineTable.tsx:112 +#: src/tables/sales/SalesOrderAllocationTable.tsx:248 +msgid "Remove allocated stock" +msgstr "" + #: src/tables/build/BuildLineTable.tsx:59 #~ msgid "Show lines with available stock" #~ msgstr "Show lines with available stock" -#: src/tables/build/BuildLineTable.tsx:120 +#: src/tables/build/BuildLineTable.tsx:121 msgid "View Stock Item" msgstr "" -#: src/tables/build/BuildLineTable.tsx:183 +#: src/tables/build/BuildLineTable.tsx:184 msgid "Show fully allocated lines" msgstr "" -#: src/tables/build/BuildLineTable.tsx:188 +#: src/tables/build/BuildLineTable.tsx:189 msgid "Show fully consumed lines" msgstr "" @@ -9523,124 +9551,124 @@ msgstr "" #~ msgid "Show allocated lines" #~ msgstr "Show allocated lines" -#: src/tables/build/BuildLineTable.tsx:193 +#: src/tables/build/BuildLineTable.tsx:194 msgid "Show items with sufficient available stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:198 +#: src/tables/build/BuildLineTable.tsx:199 msgid "Show consumable lines" msgstr "" -#: src/tables/build/BuildLineTable.tsx:203 +#: src/tables/build/BuildLineTable.tsx:204 msgid "Show optional lines" msgstr "" -#: src/tables/build/BuildLineTable.tsx:212 +#: src/tables/build/BuildLineTable.tsx:213 #: src/tables/part/PartTable.tsx:233 msgid "Testable" msgstr "" -#: src/tables/build/BuildLineTable.tsx:217 +#: src/tables/build/BuildLineTable.tsx:218 #: src/tables/stock/StockItemTable.tsx:388 msgid "Tracked" msgstr "" -#: src/tables/build/BuildLineTable.tsx:218 +#: src/tables/build/BuildLineTable.tsx:219 msgid "Show tracked lines" msgstr "" -#: src/tables/build/BuildLineTable.tsx:223 +#: src/tables/build/BuildLineTable.tsx:224 msgid "Show items with stock on order" msgstr "" -#: src/tables/build/BuildLineTable.tsx:258 +#: src/tables/build/BuildLineTable.tsx:259 #: src/tables/sales/SalesOrderLineItemTable.tsx:172 msgid "In production" msgstr "" -#: src/tables/build/BuildLineTable.tsx:286 +#: src/tables/build/BuildLineTable.tsx:287 msgid "Insufficient stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:302 +#: src/tables/build/BuildLineTable.tsx:303 #: src/tables/sales/SalesOrderLineItemTable.tsx:160 #: src/tables/stock/StockItemTable.tsx:191 msgid "No stock available" msgstr "" -#: src/tables/build/BuildLineTable.tsx:375 +#: src/tables/build/BuildLineTable.tsx:376 msgid "Gets Inherited" msgstr "" -#: src/tables/build/BuildLineTable.tsx:388 +#: src/tables/build/BuildLineTable.tsx:389 msgid "Unit Quantity" msgstr "" -#: src/tables/build/BuildLineTable.tsx:415 +#: src/tables/build/BuildLineTable.tsx:416 msgid "Setup Quantity" msgstr "" -#: src/tables/build/BuildLineTable.tsx:424 +#: src/tables/build/BuildLineTable.tsx:425 msgid "Attrition" msgstr "" -#: src/tables/build/BuildLineTable.tsx:432 +#: src/tables/build/BuildLineTable.tsx:433 msgid "Rounding Multiple" msgstr "" -#: src/tables/build/BuildLineTable.tsx:441 +#: src/tables/build/BuildLineTable.tsx:442 msgid "BOM Information" msgstr "" -#: src/tables/build/BuildLineTable.tsx:515 +#: src/tables/build/BuildLineTable.tsx:516 #: src/tables/part/PartBuildAllocationsTable.tsx:102 msgid "Fully allocated" msgstr "" -#: src/tables/build/BuildLineTable.tsx:563 +#: src/tables/build/BuildLineTable.tsx:564 #: src/tables/sales/SalesOrderLineItemTable.tsx:311 msgid "Create Build Order" msgstr "" -#: src/tables/build/BuildLineTable.tsx:592 +#: src/tables/build/BuildLineTable.tsx:593 msgid "Auto allocation in progress" msgstr "" -#: src/tables/build/BuildLineTable.tsx:595 -#: src/tables/build/BuildLineTable.tsx:802 +#: src/tables/build/BuildLineTable.tsx:596 +#: src/tables/build/BuildLineTable.tsx:809 msgid "Auto Allocate Stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:596 +#: src/tables/build/BuildLineTable.tsx:597 msgid "Automatically allocate stock to this build according to the selected options" msgstr "" -#: src/tables/build/BuildLineTable.tsx:616 -#: src/tables/build/BuildLineTable.tsx:630 -#: src/tables/build/BuildLineTable.tsx:751 -#: src/tables/build/BuildLineTable.tsx:852 +#: src/tables/build/BuildLineTable.tsx:617 +#: src/tables/build/BuildLineTable.tsx:631 +#: src/tables/build/BuildLineTable.tsx:758 +#: src/tables/build/BuildLineTable.tsx:859 #: src/tables/build/BuildOutputTable.tsx:355 #: src/tables/build/BuildOutputTable.tsx:360 msgid "Deallocate Stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:632 +#: src/tables/build/BuildLineTable.tsx:633 msgid "Deallocate all untracked stock for this build order" msgstr "" -#: src/tables/build/BuildLineTable.tsx:634 +#: src/tables/build/BuildLineTable.tsx:635 msgid "Deallocate stock from the selected line item" msgstr "" -#: src/tables/build/BuildLineTable.tsx:638 +#: src/tables/build/BuildLineTable.tsx:639 msgid "Stock has been deallocated" msgstr "" -#: src/tables/build/BuildLineTable.tsx:771 +#: src/tables/build/BuildLineTable.tsx:778 msgid "Build Stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:784 +#: src/tables/build/BuildLineTable.tsx:791 #: src/tables/sales/SalesOrderLineItemTable.tsx:487 msgid "View Part" msgstr "" @@ -9739,7 +9767,7 @@ msgid "Serialize Build Output" msgstr "" #: src/tables/build/BuildOutputTable.tsx:405 -#: src/tables/part/PartTestResultTable.tsx:310 +#: src/tables/part/PartTestResultTable.tsx:318 #: src/tables/stock/StockItemTable.tsx:328 msgid "Filter by stock status" msgstr "" @@ -9964,8 +9992,8 @@ msgid "View Item" msgstr "" #: src/tables/general/ExtraLineItemTable.tsx:95 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:299 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:403 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:300 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:405 #: src/tables/sales/ReturnOrderLineItemTable.tsx:83 #: src/tables/sales/ReturnOrderLineItemTable.tsx:187 #: src/tables/sales/SalesOrderLineItemTable.tsx:252 @@ -9974,14 +10002,14 @@ msgid "Add Line Item" msgstr "" #: src/tables/general/ExtraLineItemTable.tsx:108 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:320 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:322 #: src/tables/sales/ReturnOrderLineItemTable.tsx:96 #: src/tables/sales/SalesOrderLineItemTable.tsx:271 msgid "Edit Line Item" msgstr "" #: src/tables/general/ExtraLineItemTable.tsx:117 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:329 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:331 #: src/tables/sales/ReturnOrderLineItemTable.tsx:105 #: src/tables/sales/SalesOrderLineItemTable.tsx:280 msgid "Delete Line Item" @@ -10273,7 +10301,7 @@ msgid "Required Stock" msgstr "" #: src/tables/part/PartBuildAllocationsTable.tsx:124 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:381 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:383 msgid "View Build Order" msgstr "" @@ -10617,8 +10645,8 @@ msgstr "" #: src/tables/part/PartTestResultTable.tsx:103 #: src/tables/part/PartTestResultTable.tsx:181 -#: src/tables/part/PartTestResultTable.tsx:320 -#: src/tables/part/PartTestResultTable.tsx:334 +#: src/tables/part/PartTestResultTable.tsx:328 +#: src/tables/part/PartTestResultTable.tsx:342 #: src/tables/stock/StockItemTestResultTable.tsx:296 #: src/tables/stock/StockItemTestResultTable.tsx:368 #: src/tables/stock/StockItemTestResultTable.tsx:429 @@ -10643,7 +10671,7 @@ msgstr "" msgid "No Result" msgstr "" -#: src/tables/part/PartTestResultTable.tsx:298 +#: src/tables/part/PartTestResultTable.tsx:306 msgid "Show build outputs currently in production" msgstr "" @@ -11073,7 +11101,7 @@ msgid "Show manufacturer parts for active manufacturers." msgstr "" #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:115 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:397 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:399 msgid "Import Line Items" msgstr "" @@ -11099,11 +11127,11 @@ msgstr "" #~ msgid "Add line item" #~ msgstr "Add line item" -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:350 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:352 msgid "Receive line item" msgstr "" -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:414 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:416 msgid "Receive items" msgstr "" @@ -11201,25 +11229,25 @@ msgid "Not shipped" msgstr "" #: src/tables/sales/SalesOrderAllocationTable.tsx:211 -#: src/tables/sales/SalesOrderAllocationTable.tsx:229 +#: src/tables/sales/SalesOrderAllocationTable.tsx:235 msgid "Edit Allocation" msgstr "" #: src/tables/sales/SalesOrderAllocationTable.tsx:218 #: src/tables/sales/SalesOrderAllocationTable.tsx:241 -msgid "Delete Allocation" -msgstr "" +#~ msgid "Delete Allocation" +#~ msgstr "Delete Allocation" -#: src/tables/sales/SalesOrderAllocationTable.tsx:252 -#: src/tables/sales/SalesOrderAllocationTable.tsx:253 +#: src/tables/sales/SalesOrderAllocationTable.tsx:261 +#: src/tables/sales/SalesOrderAllocationTable.tsx:262 msgid "View Shipment" msgstr "" -#: src/tables/sales/SalesOrderAllocationTable.tsx:308 +#: src/tables/sales/SalesOrderAllocationTable.tsx:317 msgid "Assign to Shipment" msgstr "" -#: src/tables/sales/SalesOrderAllocationTable.tsx:324 +#: src/tables/sales/SalesOrderAllocationTable.tsx:333 msgid "Assign to shipment" msgstr "" diff --git a/src/frontend/src/locales/lt/messages.po b/src/frontend/src/locales/lt/messages.po index 3aecf4dad7..4422ced184 100644 --- a/src/frontend/src/locales/lt/messages.po +++ b/src/frontend/src/locales/lt/messages.po @@ -8,7 +8,7 @@ msgstr "" "Language: lt\n" "Project-Id-Version: inventree\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2025-11-19 19:39\n" +"PO-Revision-Date: 2025-11-22 06:25\n" "Last-Translator: \n" "Language-Team: Lithuanian\n" "Plural-Forms: nplurals=4; plural=(n%10==1 && (n%100>19 || n%100<11) ? 0 : (n%10>=2 && n%10<=9) && (n%100>19 || n%100<11) ? 1 : n%1!=0 ? 2: 3);\n" @@ -56,7 +56,7 @@ msgstr "" #: lib/components/RowActions.tsx:136 #: src/components/nav/NavigationDrawer.tsx:190 -#: src/forms/PurchaseOrderForms.tsx:802 +#: src/forms/PurchaseOrderForms.tsx:854 #: src/forms/StockForms.tsx:796 #: src/forms/StockForms.tsx:843 #: src/forms/StockForms.tsx:889 @@ -103,9 +103,9 @@ msgstr "Ne" #: src/forms/BuildForms.tsx:630 #: src/forms/BuildForms.tsx:793 #: src/forms/BuildForms.tsx:896 -#: src/forms/PurchaseOrderForms.tsx:798 +#: src/forms/PurchaseOrderForms.tsx:850 #: src/forms/ReturnOrderForms.tsx:242 -#: src/forms/SalesOrderForms.tsx:305 +#: src/forms/SalesOrderForms.tsx:323 #: src/forms/StockForms.tsx:360 #: src/forms/StockForms.tsx:791 #: src/forms/StockForms.tsx:838 @@ -119,6 +119,7 @@ msgstr "Ne" #: src/pages/build/BuildDetail.tsx:200 #: src/pages/part/PartDetail.tsx:1207 #: src/tables/ColumnRenderers.tsx:91 +#: src/tables/part/PartTestResultTable.tsx:247 #: src/tables/part/RelatedPartTable.tsx:53 #: src/tables/stock/StockTrackingTable.tsx:87 msgid "Part" @@ -158,7 +159,7 @@ msgstr "" #: src/components/wizards/OrderPartsWizard.tsx:290 #: src/pages/company/SupplierPartDetail.tsx:413 #: src/pages/stock/StockDetail.tsx:289 -#: src/tables/build/BuildAllocatedStockTable.tsx:155 +#: src/tables/build/BuildAllocatedStockTable.tsx:152 #: src/tables/part/PartPurchaseOrdersTable.tsx:50 #: src/tables/purchasing/SupplierPartTable.tsx:83 #: src/tables/stock/StockItemTable.tsx:247 @@ -201,9 +202,9 @@ msgstr "" #: src/forms/BuildForms.tsx:473 #: src/forms/BuildForms.tsx:633 #: src/forms/BuildForms.tsx:794 -#: src/forms/SalesOrderForms.tsx:307 +#: src/forms/SalesOrderForms.tsx:325 #: src/pages/stock/StockDetail.tsx:1005 -#: src/tables/part/PartTestResultTable.tsx:248 +#: src/tables/part/PartTestResultTable.tsx:256 #: src/tables/stock/StockTrackingTable.tsx:48 #: src/tables/stock/StockTrackingTable.tsx:55 msgid "Stock Item" @@ -517,7 +518,7 @@ msgstr "" #: src/components/dashboard/DashboardLayout.tsx:281 #: src/components/editors/NotesEditor.tsx:74 #: src/components/editors/TemplateEditor/TemplateEditor.tsx:158 -#: src/components/forms/fields/ApiFormField.tsx:273 +#: src/components/forms/fields/ApiFormField.tsx:237 #: src/components/forms/fields/TableField.tsx:45 #: src/components/importer/ImportDataSelector.tsx:192 #: src/components/importer/ImporterColumnSelector.tsx:234 @@ -642,8 +643,8 @@ msgstr "Įveskite brūkšninio kodo duomenis" #: src/components/barcodes/BarcodeScanDialog.tsx:49 #: src/components/buttons/ScanButton.tsx:15 #: src/components/nav/NavigationDrawer.tsx:122 -#: src/forms/PurchaseOrderForms.tsx:457 -#: src/forms/PurchaseOrderForms.tsx:563 +#: src/forms/PurchaseOrderForms.tsx:509 +#: src/forms/PurchaseOrderForms.tsx:615 msgid "Scan Barcode" msgstr "Nuskaityti brūkšninį kodą" @@ -728,7 +729,7 @@ msgstr "Tai pašalins nuorodą į susietą brūkšninį kodą" #: src/components/barcodes/QRCode.tsx:205 #: src/components/items/ActionDropdown.tsx:192 -#: src/forms/PurchaseOrderForms.tsx:554 +#: src/forms/PurchaseOrderForms.tsx:606 msgid "Unlink Barcode" msgstr "Atsieti brūkšninį kodą" @@ -1216,6 +1217,12 @@ msgstr "" #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:884 #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:903 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:254 +#: src/tables/build/BuildAllocatedStockTable.tsx:178 +#: src/tables/build/BuildAllocatedStockTable.tsx:258 +#: src/tables/build/BuildLineTable.tsx:111 +#: src/tables/build/BuildLineTable.tsx:665 +#: src/tables/sales/SalesOrderAllocationTable.tsx:224 +#: src/tables/sales/SalesOrderAllocationTable.tsx:247 msgid "Remove" msgstr "" @@ -1241,7 +1248,7 @@ msgid "Upload Error" msgstr "" #: src/components/details/DetailsImage.tsx:250 -#: src/components/forms/fields/TextField.tsx:65 +#: src/components/forms/fields/AutoFillRightSection.tsx:34 msgid "Clear" msgstr "" @@ -1817,10 +1824,14 @@ msgstr "" msgid "Running" msgstr "" -#: src/components/forms/fields/ApiFormField.tsx:233 +#: src/components/forms/fields/ApiFormField.tsx:197 msgid "Select file to upload" msgstr "" +#: src/components/forms/fields/AutoFillRightSection.tsx:47 +msgid "Accept suggested value" +msgstr "" + #: src/components/forms/fields/DateField.tsx:76 msgid "Select date" msgstr "" @@ -1875,10 +1886,6 @@ msgstr "" msgid "Add new row" msgstr "" -#: src/components/forms/fields/TextField.tsx:82 -msgid "Accept suggested value" -msgstr "" - #: src/components/images/DetailsImage.tsx:252 #~ msgid "Select image" #~ msgstr "Select image" @@ -2225,8 +2232,8 @@ msgstr "" #: src/pages/part/PartDetail.tsx:994 #: src/pages/stock/StockDetail.tsx:265 #: src/pages/stock/StockDetail.tsx:942 -#: src/tables/build/BuildAllocatedStockTable.tsx:135 -#: src/tables/build/BuildLineTable.tsx:192 +#: src/tables/build/BuildAllocatedStockTable.tsx:132 +#: src/tables/build/BuildLineTable.tsx:193 #: src/tables/part/PartTable.tsx:137 #: src/tables/stock/StockItemTable.tsx:182 #: src/tables/stock/StockItemTable.tsx:343 @@ -2784,7 +2791,7 @@ msgstr "" #: src/pages/sales/SalesOrderDetail.tsx:119 #: src/pages/stock/LocationDetail.tsx:102 #: src/tables/ColumnRenderers.tsx:278 -#: src/tables/build/BuildAllocatedStockTable.tsx:91 +#: src/tables/build/BuildAllocatedStockTable.tsx:88 #: src/tables/machine/MachineTypeTable.tsx:161 #: src/tables/machine/MachineTypeTable.tsx:257 #: src/tables/plugin/PluginListTable.tsx:110 @@ -2966,7 +2973,7 @@ msgstr "" #: src/pages/company/SupplierPartDetail.tsx:394 #: src/pages/part/PartDetail.tsx:1015 #: src/tables/bom/BomTable.tsx:444 -#: src/tables/build/BuildLineTable.tsx:222 +#: src/tables/build/BuildLineTable.tsx:223 #: src/tables/part/PartTable.tsx:108 msgid "On Order" msgstr "" @@ -2976,7 +2983,7 @@ msgstr "" #: src/pages/part/PartDetail.tsx:587 #: src/pages/part/PartDetail.tsx:1021 #: src/pages/stock/StockDetail.tsx:925 -#: src/tables/part/PartTestResultTable.tsx:297 +#: src/tables/part/PartTestResultTable.tsx:305 #: src/tables/stock/StockItemTable.tsx:359 msgid "In Production" msgstr "" @@ -3000,7 +3007,7 @@ msgstr "" #: src/components/render/Stock.tsx:114 #: src/components/render/Stock.tsx:132 #: src/forms/BuildForms.tsx:795 -#: src/forms/PurchaseOrderForms.tsx:595 +#: src/forms/PurchaseOrderForms.tsx:647 #: src/forms/StockForms.tsx:792 #: src/forms/StockForms.tsx:839 #: src/forms/StockForms.tsx:885 @@ -3023,7 +3030,7 @@ msgstr "" #: src/components/render/Stock.tsx:99 #: src/pages/stock/StockDetail.tsx:198 #: src/pages/stock/StockDetail.tsx:930 -#: src/tables/build/BuildAllocatedStockTable.tsx:121 +#: src/tables/build/BuildAllocatedStockTable.tsx:118 #: src/tables/build/BuildOutputTable.tsx:107 #: src/tables/sales/SalesOrderAllocationTable.tsx:142 msgid "Serial Number" @@ -3034,9 +3041,9 @@ msgstr "" #: src/forms/BuildForms.tsx:240 #: src/forms/BuildForms.tsx:634 #: src/forms/BuildForms.tsx:797 -#: src/forms/PurchaseOrderForms.tsx:801 +#: src/forms/PurchaseOrderForms.tsx:853 #: src/forms/ReturnOrderForms.tsx:243 -#: src/forms/SalesOrderForms.tsx:308 +#: src/forms/SalesOrderForms.tsx:326 #: src/forms/StockForms.tsx:841 #: src/pages/part/PartStockHistoryDetail.tsx:56 #: src/pages/part/PartStockHistoryDetail.tsx:210 @@ -3046,9 +3053,9 @@ msgstr "" #: src/pages/part/pricing/PriceBreakPanel.tsx:172 #: src/pages/stock/StockDetail.tsx:258 #: src/pages/stock/StockDetail.tsx:936 -#: src/tables/build/BuildLineTable.tsx:86 +#: src/tables/build/BuildLineTable.tsx:83 #: src/tables/part/PartPurchaseOrdersTable.tsx:94 -#: src/tables/part/PartTestResultTable.tsx:269 +#: src/tables/part/PartTestResultTable.tsx:277 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:175 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:206 #: src/tables/purchasing/SupplierPriceBreakTable.tsx:69 @@ -3070,7 +3077,7 @@ msgstr "" #: src/forms/StockForms.tsx:1048 #: src/forms/StockForms.tsx:1096 #: src/forms/StockForms.tsx:1140 -#: src/tables/build/BuildLineTable.tsx:96 +#: src/tables/build/BuildLineTable.tsx:93 msgid "Batch" msgstr "" @@ -3755,7 +3762,7 @@ msgid "In Stock" msgstr "" #: src/components/wizards/OrderPartsWizard.tsx:146 -#: src/tables/build/BuildLineTable.tsx:404 +#: src/tables/build/BuildLineTable.tsx:405 msgid "Required Quantity" msgstr "" @@ -3847,7 +3854,7 @@ msgid "Please correct the errors in the selected parts" msgstr "" #: src/components/wizards/OrderPartsWizard.tsx:587 -#: src/tables/build/BuildLineTable.tsx:815 +#: src/tables/build/BuildLineTable.tsx:822 #: src/tables/part/PartTable.tsx:522 #: src/tables/sales/SalesOrderLineItemTable.tsx:370 msgid "Order Parts" @@ -4349,9 +4356,9 @@ msgstr "" #: src/forms/BuildForms.tsx:333 #: src/forms/BuildForms.tsx:408 #: src/forms/BuildForms.tsx:685 -#: src/tables/build/BuildAllocatedStockTable.tsx:150 +#: src/tables/build/BuildAllocatedStockTable.tsx:147 #: src/tables/build/BuildOutputTable.tsx:582 -#: src/tables/part/PartTestResultTable.tsx:272 +#: src/tables/part/PartTestResultTable.tsx:280 msgid "Build Output" msgstr "" @@ -4362,7 +4369,7 @@ msgstr "" #: src/forms/BuildForms.tsx:336 #: src/forms/BuildForms.tsx:411 #: src/forms/BuildForms.tsx:475 -#: src/forms/PurchaseOrderForms.tsx:717 +#: src/forms/PurchaseOrderForms.tsx:769 #: src/forms/ReturnOrderForms.tsx:197 #: src/forms/ReturnOrderForms.tsx:244 #: src/forms/StockForms.tsx:712 @@ -4377,7 +4384,7 @@ msgstr "" #: src/tables/build/BuildOutputTable.tsx:404 #: src/tables/machine/MachineListTable.tsx:387 #: src/tables/part/PartPurchaseOrdersTable.tsx:38 -#: src/tables/part/PartTestResultTable.tsx:309 +#: src/tables/part/PartTestResultTable.tsx:317 #: src/tables/sales/ReturnOrderLineItemTable.tsx:138 #: src/tables/sales/ReturnOrderLineItemTable.tsx:176 #: src/tables/settings/CustomStateTable.tsx:79 @@ -4450,8 +4457,8 @@ msgstr "" #: src/pages/stock/StockDetail.tsx:153 #: src/tables/bom/BomTable.tsx:134 #: src/tables/bom/UsedInTable.tsx:40 -#: src/tables/build/BuildAllocatedStockTable.tsx:108 -#: src/tables/build/BuildLineTable.tsx:336 +#: src/tables/build/BuildAllocatedStockTable.tsx:105 +#: src/tables/build/BuildLineTable.tsx:337 #: src/tables/build/BuildOrderTable.tsx:79 #: src/tables/part/PartSalesAllocationsTable.tsx:61 #: src/tables/part/RelatedPartTable.tsx:73 @@ -4466,47 +4473,47 @@ msgstr "" #: src/forms/BuildForms.tsx:632 #: src/forms/BuildForms.tsx:796 #: src/forms/BuildForms.tsx:897 -#: src/forms/SalesOrderForms.tsx:306 -#: src/tables/build/BuildAllocatedStockTable.tsx:139 -#: src/tables/build/BuildLineTable.tsx:182 +#: src/forms/SalesOrderForms.tsx:324 +#: src/tables/build/BuildAllocatedStockTable.tsx:136 +#: src/tables/build/BuildLineTable.tsx:183 #: src/tables/sales/SalesOrderLineItemTable.tsx:342 #: src/tables/stock/StockItemTable.tsx:338 msgid "Allocated" msgstr "" #: src/forms/BuildForms.tsx:667 -#: src/forms/SalesOrderForms.tsx:295 +#: src/forms/SalesOrderForms.tsx:313 #: src/pages/build/BuildDetail.tsx:108 #: src/pages/build/BuildDetail.tsx:326 msgid "Source Location" msgstr "" #: src/forms/BuildForms.tsx:668 -#: src/forms/SalesOrderForms.tsx:296 +#: src/forms/SalesOrderForms.tsx:314 msgid "Select the source location for the stock allocation" msgstr "" #: src/forms/BuildForms.tsx:700 -#: src/forms/SalesOrderForms.tsx:336 -#: src/tables/build/BuildLineTable.tsx:574 -#: src/tables/build/BuildLineTable.tsx:731 -#: src/tables/build/BuildLineTable.tsx:830 +#: src/forms/SalesOrderForms.tsx:354 +#: src/tables/build/BuildLineTable.tsx:575 +#: src/tables/build/BuildLineTable.tsx:738 +#: src/tables/build/BuildLineTable.tsx:837 #: src/tables/sales/SalesOrderLineItemTable.tsx:380 #: src/tables/sales/SalesOrderLineItemTable.tsx:406 msgid "Allocate Stock" msgstr "" #: src/forms/BuildForms.tsx:703 -#: src/forms/SalesOrderForms.tsx:341 +#: src/forms/SalesOrderForms.tsx:359 msgid "Stock items allocated" msgstr "" #: src/forms/BuildForms.tsx:816 #: src/forms/BuildForms.tsx:917 -#: src/tables/build/BuildAllocatedStockTable.tsx:240 -#: src/tables/build/BuildAllocatedStockTable.tsx:272 -#: src/tables/build/BuildLineTable.tsx:741 -#: src/tables/build/BuildLineTable.tsx:864 +#: src/tables/build/BuildAllocatedStockTable.tsx:243 +#: src/tables/build/BuildAllocatedStockTable.tsx:279 +#: src/tables/build/BuildLineTable.tsx:748 +#: src/tables/build/BuildLineTable.tsx:871 msgid "Consume Stock" msgstr "" @@ -4521,21 +4528,21 @@ msgstr "" #~ msgstr "Stock items consumed" #: src/forms/BuildForms.tsx:853 -#: src/tables/build/BuildLineTable.tsx:514 +#: src/tables/build/BuildLineTable.tsx:515 #: src/tables/part/PartBuildAllocationsTable.tsx:101 msgid "Fully consumed" msgstr "" #: src/forms/BuildForms.tsx:898 -#: src/tables/build/BuildLineTable.tsx:187 +#: src/tables/build/BuildLineTable.tsx:188 #: src/tables/stock/StockItemTable.tsx:367 msgid "Consumed" msgstr "" #: src/forms/CommonForms.tsx:88 -#: src/forms/PurchaseOrderForms.tsx:125 +#: src/forms/PurchaseOrderForms.tsx:176 #: src/forms/ReturnOrderForms.tsx:138 -#: src/forms/SalesOrderForms.tsx:164 +#: src/forms/SalesOrderForms.tsx:182 msgid "Select project code for this line item" msgstr "" @@ -4572,32 +4579,16 @@ msgstr "" msgid "Subscribe to notifications for this category" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:388 -msgid "Assign Batch Code and Serial Numbers" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:390 -msgid "Assign Batch Code" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:410 -msgid "Choose Location" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:418 -msgid "Item Destination selected" -msgstr "" - #: src/forms/PurchaseOrderForms.tsx:421 #~ msgid "Assign Batch Code{0}" #~ msgstr "Assign Batch Code{0}" -#: src/forms/PurchaseOrderForms.tsx:428 -msgid "Part category default location selected" +#: src/forms/PurchaseOrderForms.tsx:440 +msgid "Assign Batch Code and Serial Numbers" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:438 -msgid "Received stock location selected" +#: src/forms/PurchaseOrderForms.tsx:442 +msgid "Assign Batch Code" msgstr "" #: src/forms/PurchaseOrderForms.tsx:444 @@ -4605,94 +4596,110 @@ msgstr "" #~ msgid "Remove item from list" #~ msgstr "Remove item from list" -#: src/forms/PurchaseOrderForms.tsx:446 +#: src/forms/PurchaseOrderForms.tsx:462 +msgid "Choose Location" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:470 +msgid "Item Destination selected" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:480 +msgid "Part category default location selected" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:490 +msgid "Received stock location selected" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:498 msgid "Default location selected" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:507 +#: src/forms/PurchaseOrderForms.tsx:559 msgid "Set Location" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:524 -msgid "Set Expiry Date" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:532 -#: src/forms/StockForms.tsx:693 -msgid "Adjust Packaging" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:540 -#: src/forms/StockForms.tsx:684 -#: src/hooks/UseStockAdjustActions.tsx:148 -msgid "Change Status" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:546 -msgid "Add Note" -msgstr "" - #: src/forms/PurchaseOrderForms.tsx:566 #~ msgid "Serial numbers" #~ msgstr "Serial numbers" +#: src/forms/PurchaseOrderForms.tsx:576 +msgid "Set Expiry Date" +msgstr "" + #: src/forms/PurchaseOrderForms.tsx:582 #~ msgid "Store at line item destination" #~ msgstr "Store at line item destination" -#: src/forms/PurchaseOrderForms.tsx:610 -msgid "Store at default location" +#: src/forms/PurchaseOrderForms.tsx:584 +#: src/forms/StockForms.tsx:693 +msgid "Adjust Packaging" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:625 -msgid "Store at line item destination " +#: src/forms/PurchaseOrderForms.tsx:592 +#: src/forms/StockForms.tsx:684 +#: src/hooks/UseStockAdjustActions.tsx:148 +msgid "Change Status" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:637 -msgid "Store with already received stock" +#: src/forms/PurchaseOrderForms.tsx:598 +msgid "Add Note" msgstr "" #: src/forms/PurchaseOrderForms.tsx:658 #~ msgid "Receive line items" #~ msgstr "Receive line items" -#: src/forms/PurchaseOrderForms.tsx:661 +#: src/forms/PurchaseOrderForms.tsx:662 +msgid "Store at default location" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:677 +msgid "Store at line item destination " +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:689 +msgid "Store with already received stock" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:713 #: src/pages/build/BuildDetail.tsx:340 #: src/pages/stock/StockDetail.tsx:280 #: src/pages/stock/StockDetail.tsx:952 #: src/tables/Filter.tsx:83 -#: src/tables/build/BuildAllocatedStockTable.tsx:128 +#: src/tables/build/BuildAllocatedStockTable.tsx:125 #: src/tables/build/BuildOutputTable.tsx:112 -#: src/tables/part/PartTestResultTable.tsx:260 -#: src/tables/part/PartTestResultTable.tsx:281 +#: src/tables/part/PartTestResultTable.tsx:268 +#: src/tables/part/PartTestResultTable.tsx:289 #: src/tables/sales/SalesOrderAllocationTable.tsx:149 msgid "Batch Code" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:662 +#: src/forms/PurchaseOrderForms.tsx:714 msgid "Enter batch code for received items" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:675 +#: src/forms/PurchaseOrderForms.tsx:727 #: src/forms/StockForms.tsx:218 msgid "Serial Numbers" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:676 +#: src/forms/PurchaseOrderForms.tsx:728 msgid "Enter serial numbers for received items" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:690 +#: src/forms/PurchaseOrderForms.tsx:742 #: src/pages/stock/StockDetail.tsx:382 #: src/tables/stock/StockItemTable.tsx:294 msgid "Expiry Date" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:691 +#: src/forms/PurchaseOrderForms.tsx:743 msgid "Enter an expiry date for received items" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:703 +#: src/forms/PurchaseOrderForms.tsx:755 #: src/forms/StockForms.tsx:728 #: src/pages/company/SupplierPartDetail.tsx:172 #: src/pages/company/SupplierPartDetail.tsx:236 @@ -4701,19 +4708,19 @@ msgstr "" msgid "Packaging" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:727 +#: src/forms/PurchaseOrderForms.tsx:779 #: src/pages/company/SupplierPartDetail.tsx:120 #: src/tables/ColumnRenderers.tsx:332 msgid "Note" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:799 +#: src/forms/PurchaseOrderForms.tsx:851 #: src/pages/company/SupplierPartDetail.tsx:138 #: src/tables/purchasing/SupplierPriceBreakTable.tsx:49 msgid "SKU" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:800 +#: src/forms/PurchaseOrderForms.tsx:852 #: src/tables/part/PartPurchaseOrdersTable.tsx:127 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:213 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:283 @@ -4721,11 +4728,11 @@ msgstr "" msgid "Received" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:817 +#: src/forms/PurchaseOrderForms.tsx:869 msgid "Receive Line Items" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:823 +#: src/forms/PurchaseOrderForms.tsx:875 msgid "Items received" msgstr "" @@ -4737,7 +4744,7 @@ msgstr "" msgid "Item received into stock" msgstr "" -#: src/forms/SalesOrderForms.tsx:401 +#: src/forms/SalesOrderForms.tsx:419 msgid "Leave blank to use the order address" msgstr "" @@ -5932,6 +5939,9 @@ msgstr "" #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:310 #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:401 +#: src/tables/build/BuildAllocatedStockTable.tsx:181 +#: src/tables/build/BuildLineTable.tsx:668 +#: src/tables/sales/SalesOrderAllocationTable.tsx:220 msgid "Confirm Removal" msgstr "" @@ -6870,8 +6880,8 @@ msgstr "" #: src/pages/sales/ReturnOrderDetail.tsx:108 #: src/pages/sales/SalesOrderDetail.tsx:98 #: src/tables/ColumnRenderers.tsx:321 -#: src/tables/build/BuildAllocatedStockTable.tsx:115 -#: src/tables/build/BuildLineTable.tsx:352 +#: src/tables/build/BuildAllocatedStockTable.tsx:112 +#: src/tables/build/BuildLineTable.tsx:353 msgid "Reference" msgstr "" @@ -7132,7 +7142,7 @@ msgstr "" #: src/pages/build/BuildDetail.tsx:742 #: src/pages/stock/StockDetail.tsx:344 -#: src/tables/build/BuildAllocatedStockTable.tsx:85 +#: src/tables/build/BuildAllocatedStockTable.tsx:82 #: src/tables/part/PartBuildAllocationsTable.tsx:45 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:157 #: src/tables/stock/StockTrackingTable.tsx:109 @@ -7600,7 +7610,7 @@ msgstr "" #: src/pages/part/PartDetail.tsx:542 #: src/tables/bom/BomTable.tsx:439 -#: src/tables/build/BuildLineTable.tsx:305 +#: src/tables/build/BuildLineTable.tsx:306 #: src/tables/part/PartTable.tsx:319 #: src/tables/sales/SalesOrderLineItemTable.tsx:138 msgid "Available Stock" @@ -7608,7 +7618,7 @@ msgstr "" #: src/pages/part/PartDetail.tsx:548 #: src/tables/bom/BomTable.tsx:341 -#: src/tables/build/BuildLineTable.tsx:267 +#: src/tables/build/BuildLineTable.tsx:268 #: src/tables/sales/SalesOrderLineItemTable.tsx:180 msgid "On order" msgstr "" @@ -7782,7 +7792,7 @@ msgstr "" #: src/pages/part/PartDetail.tsx:1144 #: src/pages/stock/StockDetail.tsx:884 -#: src/tables/build/BuildLineTable.tsx:761 +#: src/tables/build/BuildLineTable.tsx:768 msgid "Order Stock" msgstr "" @@ -9219,13 +9229,13 @@ msgstr "" #~ msgstr "Show asssmbled items" #: src/tables/bom/BomTable.tsx:315 -#: src/tables/build/BuildLineTable.tsx:276 +#: src/tables/build/BuildLineTable.tsx:277 #: src/tables/part/PartTable.tsx:145 msgid "External stock" msgstr "" #: src/tables/bom/BomTable.tsx:323 -#: src/tables/build/BuildLineTable.tsx:239 +#: src/tables/build/BuildLineTable.tsx:240 msgid "Includes substitute stock" msgstr "" @@ -9234,7 +9244,7 @@ msgstr "" #~ msgstr "Edit Bom Item" #: src/tables/bom/BomTable.tsx:332 -#: src/tables/build/BuildLineTable.tsx:249 +#: src/tables/build/BuildLineTable.tsx:250 #: src/tables/sales/SalesOrderLineItemTable.tsx:166 msgid "Includes variant stock" msgstr "" @@ -9272,8 +9282,8 @@ msgid "Stock Information" msgstr "" #: src/tables/bom/BomTable.tsx:399 -#: src/tables/build/BuildLineTable.tsx:496 -#: src/tables/build/BuildLineTable.tsx:537 +#: src/tables/build/BuildLineTable.tsx:497 +#: src/tables/build/BuildLineTable.tsx:538 msgid "Consumable item" msgstr "" @@ -9282,7 +9292,7 @@ msgid "No available stock" msgstr "" #: src/tables/bom/BomTable.tsx:420 -#: src/tables/build/BuildLineTable.tsx:213 +#: src/tables/build/BuildLineTable.tsx:214 msgid "Show testable items" msgstr "" @@ -9291,7 +9301,7 @@ msgid "Show trackable items" msgstr "" #: src/tables/bom/BomTable.tsx:430 -#: src/tables/build/BuildLineTable.tsx:208 +#: src/tables/build/BuildLineTable.tsx:209 msgid "Show assembled items" msgstr "" @@ -9335,7 +9345,7 @@ msgstr "" #: src/tables/bom/BomTable.tsx:464 #: src/tables/bom/UsedInTable.tsx:85 -#: src/tables/build/BuildLineTable.tsx:202 +#: src/tables/build/BuildLineTable.tsx:203 msgid "Optional" msgstr "" @@ -9345,7 +9355,7 @@ msgid "Show optional items" msgstr "" #: src/tables/bom/BomTable.tsx:469 -#: src/tables/build/BuildLineTable.tsx:197 +#: src/tables/build/BuildLineTable.tsx:198 msgid "Consumable" msgstr "" @@ -9433,7 +9443,7 @@ msgid "Bill of materials cannot be edited, as the part is locked" msgstr "" #: src/tables/bom/UsedInTable.tsx:34 -#: src/tables/build/BuildLineTable.tsx:207 +#: src/tables/build/BuildLineTable.tsx:208 #: src/tables/part/ParametricPartTable.tsx:364 #: src/tables/part/PartBuildAllocationsTable.tsx:60 #: src/tables/part/PartTable.tsx:209 @@ -9455,11 +9465,11 @@ msgstr "" msgid "Show trackable assemblies" msgstr "" -#: src/tables/build/BuildAllocatedStockTable.tsx:67 +#: src/tables/build/BuildAllocatedStockTable.tsx:64 msgid "Allocated to Output" msgstr "" -#: src/tables/build/BuildAllocatedStockTable.tsx:68 +#: src/tables/build/BuildAllocatedStockTable.tsx:65 msgid "Show items allocated to a build output" msgstr "" @@ -9472,7 +9482,7 @@ msgstr "" #~ msgid "Include orders for part variants" #~ msgstr "Include orders for part variants" -#: src/tables/build/BuildAllocatedStockTable.tsx:97 +#: src/tables/build/BuildAllocatedStockTable.tsx:94 #: src/tables/part/PartBuildAllocationsTable.tsx:84 #: src/tables/part/PartPurchaseOrdersTable.tsx:132 #: src/tables/part/PartSalesAllocationsTable.tsx:69 @@ -9482,40 +9492,58 @@ msgid "Order Status" msgstr "" #: src/tables/build/BuildAllocatedStockTable.tsx:164 -#~ msgid "Edit Build Item" -#~ msgstr "Edit Build Item" - -#: src/tables/build/BuildAllocatedStockTable.tsx:167 -#: src/tables/build/BuildLineTable.tsx:650 +#: src/tables/build/BuildLineTable.tsx:651 msgid "Edit Stock Allocation" msgstr "" +#: src/tables/build/BuildAllocatedStockTable.tsx:164 +#~ msgid "Edit Build Item" +#~ msgstr "Edit Build Item" + #: src/tables/build/BuildAllocatedStockTable.tsx:174 #~ msgid "Delete Build Item" #~ msgstr "Delete Build Item" -#: src/tables/build/BuildAllocatedStockTable.tsx:180 -#: src/tables/build/BuildLineTable.tsx:663 -msgid "Delete Stock Allocation" +#: src/tables/build/BuildAllocatedStockTable.tsx:177 +#: src/tables/build/BuildLineTable.tsx:664 +#: src/tables/sales/SalesOrderAllocationTable.tsx:218 +msgid "Remove Allocated Stock" msgstr "" -#: src/tables/build/BuildAllocatedStockTable.tsx:239 +#: src/tables/build/BuildAllocatedStockTable.tsx:180 +#: src/tables/build/BuildLineTable.tsx:663 +#~ msgid "Delete Stock Allocation" +#~ msgstr "Delete Stock Allocation" + +#: src/tables/build/BuildAllocatedStockTable.tsx:182 +#: src/tables/build/BuildLineTable.tsx:669 +#: src/tables/sales/SalesOrderAllocationTable.tsx:221 +msgid "Are you sure you want to remove this allocated stock from the order?" +msgstr "" + +#: src/tables/build/BuildAllocatedStockTable.tsx:242 msgid "Consume" msgstr "" +#: src/tables/build/BuildAllocatedStockTable.tsx:259 +#: src/tables/build/BuildLineTable.tsx:112 +#: src/tables/sales/SalesOrderAllocationTable.tsx:248 +msgid "Remove allocated stock" +msgstr "" + #: src/tables/build/BuildLineTable.tsx:59 #~ msgid "Show lines with available stock" #~ msgstr "Show lines with available stock" -#: src/tables/build/BuildLineTable.tsx:120 +#: src/tables/build/BuildLineTable.tsx:121 msgid "View Stock Item" msgstr "" -#: src/tables/build/BuildLineTable.tsx:183 +#: src/tables/build/BuildLineTable.tsx:184 msgid "Show fully allocated lines" msgstr "" -#: src/tables/build/BuildLineTable.tsx:188 +#: src/tables/build/BuildLineTable.tsx:189 msgid "Show fully consumed lines" msgstr "" @@ -9523,124 +9551,124 @@ msgstr "" #~ msgid "Show allocated lines" #~ msgstr "Show allocated lines" -#: src/tables/build/BuildLineTable.tsx:193 +#: src/tables/build/BuildLineTable.tsx:194 msgid "Show items with sufficient available stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:198 +#: src/tables/build/BuildLineTable.tsx:199 msgid "Show consumable lines" msgstr "" -#: src/tables/build/BuildLineTable.tsx:203 +#: src/tables/build/BuildLineTable.tsx:204 msgid "Show optional lines" msgstr "" -#: src/tables/build/BuildLineTable.tsx:212 +#: src/tables/build/BuildLineTable.tsx:213 #: src/tables/part/PartTable.tsx:233 msgid "Testable" msgstr "" -#: src/tables/build/BuildLineTable.tsx:217 +#: src/tables/build/BuildLineTable.tsx:218 #: src/tables/stock/StockItemTable.tsx:388 msgid "Tracked" msgstr "" -#: src/tables/build/BuildLineTable.tsx:218 +#: src/tables/build/BuildLineTable.tsx:219 msgid "Show tracked lines" msgstr "" -#: src/tables/build/BuildLineTable.tsx:223 +#: src/tables/build/BuildLineTable.tsx:224 msgid "Show items with stock on order" msgstr "" -#: src/tables/build/BuildLineTable.tsx:258 +#: src/tables/build/BuildLineTable.tsx:259 #: src/tables/sales/SalesOrderLineItemTable.tsx:172 msgid "In production" msgstr "" -#: src/tables/build/BuildLineTable.tsx:286 +#: src/tables/build/BuildLineTable.tsx:287 msgid "Insufficient stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:302 +#: src/tables/build/BuildLineTable.tsx:303 #: src/tables/sales/SalesOrderLineItemTable.tsx:160 #: src/tables/stock/StockItemTable.tsx:191 msgid "No stock available" msgstr "" -#: src/tables/build/BuildLineTable.tsx:375 +#: src/tables/build/BuildLineTable.tsx:376 msgid "Gets Inherited" msgstr "" -#: src/tables/build/BuildLineTable.tsx:388 +#: src/tables/build/BuildLineTable.tsx:389 msgid "Unit Quantity" msgstr "" -#: src/tables/build/BuildLineTable.tsx:415 +#: src/tables/build/BuildLineTable.tsx:416 msgid "Setup Quantity" msgstr "" -#: src/tables/build/BuildLineTable.tsx:424 +#: src/tables/build/BuildLineTable.tsx:425 msgid "Attrition" msgstr "" -#: src/tables/build/BuildLineTable.tsx:432 +#: src/tables/build/BuildLineTable.tsx:433 msgid "Rounding Multiple" msgstr "" -#: src/tables/build/BuildLineTable.tsx:441 +#: src/tables/build/BuildLineTable.tsx:442 msgid "BOM Information" msgstr "" -#: src/tables/build/BuildLineTable.tsx:515 +#: src/tables/build/BuildLineTable.tsx:516 #: src/tables/part/PartBuildAllocationsTable.tsx:102 msgid "Fully allocated" msgstr "" -#: src/tables/build/BuildLineTable.tsx:563 +#: src/tables/build/BuildLineTable.tsx:564 #: src/tables/sales/SalesOrderLineItemTable.tsx:311 msgid "Create Build Order" msgstr "" -#: src/tables/build/BuildLineTable.tsx:592 +#: src/tables/build/BuildLineTable.tsx:593 msgid "Auto allocation in progress" msgstr "" -#: src/tables/build/BuildLineTable.tsx:595 -#: src/tables/build/BuildLineTable.tsx:802 +#: src/tables/build/BuildLineTable.tsx:596 +#: src/tables/build/BuildLineTable.tsx:809 msgid "Auto Allocate Stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:596 +#: src/tables/build/BuildLineTable.tsx:597 msgid "Automatically allocate stock to this build according to the selected options" msgstr "" -#: src/tables/build/BuildLineTable.tsx:616 -#: src/tables/build/BuildLineTable.tsx:630 -#: src/tables/build/BuildLineTable.tsx:751 -#: src/tables/build/BuildLineTable.tsx:852 +#: src/tables/build/BuildLineTable.tsx:617 +#: src/tables/build/BuildLineTable.tsx:631 +#: src/tables/build/BuildLineTable.tsx:758 +#: src/tables/build/BuildLineTable.tsx:859 #: src/tables/build/BuildOutputTable.tsx:355 #: src/tables/build/BuildOutputTable.tsx:360 msgid "Deallocate Stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:632 +#: src/tables/build/BuildLineTable.tsx:633 msgid "Deallocate all untracked stock for this build order" msgstr "" -#: src/tables/build/BuildLineTable.tsx:634 +#: src/tables/build/BuildLineTable.tsx:635 msgid "Deallocate stock from the selected line item" msgstr "" -#: src/tables/build/BuildLineTable.tsx:638 +#: src/tables/build/BuildLineTable.tsx:639 msgid "Stock has been deallocated" msgstr "" -#: src/tables/build/BuildLineTable.tsx:771 +#: src/tables/build/BuildLineTable.tsx:778 msgid "Build Stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:784 +#: src/tables/build/BuildLineTable.tsx:791 #: src/tables/sales/SalesOrderLineItemTable.tsx:487 msgid "View Part" msgstr "" @@ -9739,7 +9767,7 @@ msgid "Serialize Build Output" msgstr "" #: src/tables/build/BuildOutputTable.tsx:405 -#: src/tables/part/PartTestResultTable.tsx:310 +#: src/tables/part/PartTestResultTable.tsx:318 #: src/tables/stock/StockItemTable.tsx:328 msgid "Filter by stock status" msgstr "" @@ -9964,8 +9992,8 @@ msgid "View Item" msgstr "" #: src/tables/general/ExtraLineItemTable.tsx:95 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:299 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:403 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:300 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:405 #: src/tables/sales/ReturnOrderLineItemTable.tsx:83 #: src/tables/sales/ReturnOrderLineItemTable.tsx:187 #: src/tables/sales/SalesOrderLineItemTable.tsx:252 @@ -9974,14 +10002,14 @@ msgid "Add Line Item" msgstr "" #: src/tables/general/ExtraLineItemTable.tsx:108 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:320 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:322 #: src/tables/sales/ReturnOrderLineItemTable.tsx:96 #: src/tables/sales/SalesOrderLineItemTable.tsx:271 msgid "Edit Line Item" msgstr "" #: src/tables/general/ExtraLineItemTable.tsx:117 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:329 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:331 #: src/tables/sales/ReturnOrderLineItemTable.tsx:105 #: src/tables/sales/SalesOrderLineItemTable.tsx:280 msgid "Delete Line Item" @@ -10273,7 +10301,7 @@ msgid "Required Stock" msgstr "" #: src/tables/part/PartBuildAllocationsTable.tsx:124 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:381 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:383 msgid "View Build Order" msgstr "" @@ -10617,8 +10645,8 @@ msgstr "" #: src/tables/part/PartTestResultTable.tsx:103 #: src/tables/part/PartTestResultTable.tsx:181 -#: src/tables/part/PartTestResultTable.tsx:320 -#: src/tables/part/PartTestResultTable.tsx:334 +#: src/tables/part/PartTestResultTable.tsx:328 +#: src/tables/part/PartTestResultTable.tsx:342 #: src/tables/stock/StockItemTestResultTable.tsx:296 #: src/tables/stock/StockItemTestResultTable.tsx:368 #: src/tables/stock/StockItemTestResultTable.tsx:429 @@ -10643,7 +10671,7 @@ msgstr "" msgid "No Result" msgstr "" -#: src/tables/part/PartTestResultTable.tsx:298 +#: src/tables/part/PartTestResultTable.tsx:306 msgid "Show build outputs currently in production" msgstr "" @@ -11073,7 +11101,7 @@ msgid "Show manufacturer parts for active manufacturers." msgstr "" #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:115 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:397 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:399 msgid "Import Line Items" msgstr "" @@ -11099,11 +11127,11 @@ msgstr "" #~ msgid "Add line item" #~ msgstr "Add line item" -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:350 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:352 msgid "Receive line item" msgstr "" -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:414 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:416 msgid "Receive items" msgstr "" @@ -11201,25 +11229,25 @@ msgid "Not shipped" msgstr "" #: src/tables/sales/SalesOrderAllocationTable.tsx:211 -#: src/tables/sales/SalesOrderAllocationTable.tsx:229 +#: src/tables/sales/SalesOrderAllocationTable.tsx:235 msgid "Edit Allocation" msgstr "" #: src/tables/sales/SalesOrderAllocationTable.tsx:218 #: src/tables/sales/SalesOrderAllocationTable.tsx:241 -msgid "Delete Allocation" -msgstr "" +#~ msgid "Delete Allocation" +#~ msgstr "Delete Allocation" -#: src/tables/sales/SalesOrderAllocationTable.tsx:252 -#: src/tables/sales/SalesOrderAllocationTable.tsx:253 +#: src/tables/sales/SalesOrderAllocationTable.tsx:261 +#: src/tables/sales/SalesOrderAllocationTable.tsx:262 msgid "View Shipment" msgstr "" -#: src/tables/sales/SalesOrderAllocationTable.tsx:308 +#: src/tables/sales/SalesOrderAllocationTable.tsx:317 msgid "Assign to Shipment" msgstr "" -#: src/tables/sales/SalesOrderAllocationTable.tsx:324 +#: src/tables/sales/SalesOrderAllocationTable.tsx:333 msgid "Assign to shipment" msgstr "" diff --git a/src/frontend/src/locales/lv/messages.po b/src/frontend/src/locales/lv/messages.po index 9366b1bbba..5af6c82a2e 100644 --- a/src/frontend/src/locales/lv/messages.po +++ b/src/frontend/src/locales/lv/messages.po @@ -8,7 +8,7 @@ msgstr "" "Language: lv\n" "Project-Id-Version: inventree\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2025-11-19 19:39\n" +"PO-Revision-Date: 2025-11-22 06:25\n" "Last-Translator: \n" "Language-Team: Latvian\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2;\n" @@ -56,7 +56,7 @@ msgstr "" #: lib/components/RowActions.tsx:136 #: src/components/nav/NavigationDrawer.tsx:190 -#: src/forms/PurchaseOrderForms.tsx:802 +#: src/forms/PurchaseOrderForms.tsx:854 #: src/forms/StockForms.tsx:796 #: src/forms/StockForms.tsx:843 #: src/forms/StockForms.tsx:889 @@ -103,9 +103,9 @@ msgstr "" #: src/forms/BuildForms.tsx:630 #: src/forms/BuildForms.tsx:793 #: src/forms/BuildForms.tsx:896 -#: src/forms/PurchaseOrderForms.tsx:798 +#: src/forms/PurchaseOrderForms.tsx:850 #: src/forms/ReturnOrderForms.tsx:242 -#: src/forms/SalesOrderForms.tsx:305 +#: src/forms/SalesOrderForms.tsx:323 #: src/forms/StockForms.tsx:360 #: src/forms/StockForms.tsx:791 #: src/forms/StockForms.tsx:838 @@ -119,6 +119,7 @@ msgstr "" #: src/pages/build/BuildDetail.tsx:200 #: src/pages/part/PartDetail.tsx:1207 #: src/tables/ColumnRenderers.tsx:91 +#: src/tables/part/PartTestResultTable.tsx:247 #: src/tables/part/RelatedPartTable.tsx:53 #: src/tables/stock/StockTrackingTable.tsx:87 msgid "Part" @@ -158,7 +159,7 @@ msgstr "" #: src/components/wizards/OrderPartsWizard.tsx:290 #: src/pages/company/SupplierPartDetail.tsx:413 #: src/pages/stock/StockDetail.tsx:289 -#: src/tables/build/BuildAllocatedStockTable.tsx:155 +#: src/tables/build/BuildAllocatedStockTable.tsx:152 #: src/tables/part/PartPurchaseOrdersTable.tsx:50 #: src/tables/purchasing/SupplierPartTable.tsx:83 #: src/tables/stock/StockItemTable.tsx:247 @@ -201,9 +202,9 @@ msgstr "" #: src/forms/BuildForms.tsx:473 #: src/forms/BuildForms.tsx:633 #: src/forms/BuildForms.tsx:794 -#: src/forms/SalesOrderForms.tsx:307 +#: src/forms/SalesOrderForms.tsx:325 #: src/pages/stock/StockDetail.tsx:1005 -#: src/tables/part/PartTestResultTable.tsx:248 +#: src/tables/part/PartTestResultTable.tsx:256 #: src/tables/stock/StockTrackingTable.tsx:48 #: src/tables/stock/StockTrackingTable.tsx:55 msgid "Stock Item" @@ -517,7 +518,7 @@ msgstr "" #: src/components/dashboard/DashboardLayout.tsx:281 #: src/components/editors/NotesEditor.tsx:74 #: src/components/editors/TemplateEditor/TemplateEditor.tsx:158 -#: src/components/forms/fields/ApiFormField.tsx:273 +#: src/components/forms/fields/ApiFormField.tsx:237 #: src/components/forms/fields/TableField.tsx:45 #: src/components/importer/ImportDataSelector.tsx:192 #: src/components/importer/ImporterColumnSelector.tsx:234 @@ -642,8 +643,8 @@ msgstr "" #: src/components/barcodes/BarcodeScanDialog.tsx:49 #: src/components/buttons/ScanButton.tsx:15 #: src/components/nav/NavigationDrawer.tsx:122 -#: src/forms/PurchaseOrderForms.tsx:457 -#: src/forms/PurchaseOrderForms.tsx:563 +#: src/forms/PurchaseOrderForms.tsx:509 +#: src/forms/PurchaseOrderForms.tsx:615 msgid "Scan Barcode" msgstr "" @@ -728,7 +729,7 @@ msgstr "" #: src/components/barcodes/QRCode.tsx:205 #: src/components/items/ActionDropdown.tsx:192 -#: src/forms/PurchaseOrderForms.tsx:554 +#: src/forms/PurchaseOrderForms.tsx:606 msgid "Unlink Barcode" msgstr "" @@ -1216,6 +1217,12 @@ msgstr "" #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:884 #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:903 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:254 +#: src/tables/build/BuildAllocatedStockTable.tsx:178 +#: src/tables/build/BuildAllocatedStockTable.tsx:258 +#: src/tables/build/BuildLineTable.tsx:111 +#: src/tables/build/BuildLineTable.tsx:665 +#: src/tables/sales/SalesOrderAllocationTable.tsx:224 +#: src/tables/sales/SalesOrderAllocationTable.tsx:247 msgid "Remove" msgstr "" @@ -1241,7 +1248,7 @@ msgid "Upload Error" msgstr "" #: src/components/details/DetailsImage.tsx:250 -#: src/components/forms/fields/TextField.tsx:65 +#: src/components/forms/fields/AutoFillRightSection.tsx:34 msgid "Clear" msgstr "" @@ -1817,10 +1824,14 @@ msgstr "" msgid "Running" msgstr "" -#: src/components/forms/fields/ApiFormField.tsx:233 +#: src/components/forms/fields/ApiFormField.tsx:197 msgid "Select file to upload" msgstr "" +#: src/components/forms/fields/AutoFillRightSection.tsx:47 +msgid "Accept suggested value" +msgstr "" + #: src/components/forms/fields/DateField.tsx:76 msgid "Select date" msgstr "" @@ -1875,10 +1886,6 @@ msgstr "" msgid "Add new row" msgstr "" -#: src/components/forms/fields/TextField.tsx:82 -msgid "Accept suggested value" -msgstr "" - #: src/components/images/DetailsImage.tsx:252 #~ msgid "Select image" #~ msgstr "Select image" @@ -2225,8 +2232,8 @@ msgstr "" #: src/pages/part/PartDetail.tsx:994 #: src/pages/stock/StockDetail.tsx:265 #: src/pages/stock/StockDetail.tsx:942 -#: src/tables/build/BuildAllocatedStockTable.tsx:135 -#: src/tables/build/BuildLineTable.tsx:192 +#: src/tables/build/BuildAllocatedStockTable.tsx:132 +#: src/tables/build/BuildLineTable.tsx:193 #: src/tables/part/PartTable.tsx:137 #: src/tables/stock/StockItemTable.tsx:182 #: src/tables/stock/StockItemTable.tsx:343 @@ -2784,7 +2791,7 @@ msgstr "" #: src/pages/sales/SalesOrderDetail.tsx:119 #: src/pages/stock/LocationDetail.tsx:102 #: src/tables/ColumnRenderers.tsx:278 -#: src/tables/build/BuildAllocatedStockTable.tsx:91 +#: src/tables/build/BuildAllocatedStockTable.tsx:88 #: src/tables/machine/MachineTypeTable.tsx:161 #: src/tables/machine/MachineTypeTable.tsx:257 #: src/tables/plugin/PluginListTable.tsx:110 @@ -2966,7 +2973,7 @@ msgstr "" #: src/pages/company/SupplierPartDetail.tsx:394 #: src/pages/part/PartDetail.tsx:1015 #: src/tables/bom/BomTable.tsx:444 -#: src/tables/build/BuildLineTable.tsx:222 +#: src/tables/build/BuildLineTable.tsx:223 #: src/tables/part/PartTable.tsx:108 msgid "On Order" msgstr "" @@ -2976,7 +2983,7 @@ msgstr "" #: src/pages/part/PartDetail.tsx:587 #: src/pages/part/PartDetail.tsx:1021 #: src/pages/stock/StockDetail.tsx:925 -#: src/tables/part/PartTestResultTable.tsx:297 +#: src/tables/part/PartTestResultTable.tsx:305 #: src/tables/stock/StockItemTable.tsx:359 msgid "In Production" msgstr "" @@ -3000,7 +3007,7 @@ msgstr "" #: src/components/render/Stock.tsx:114 #: src/components/render/Stock.tsx:132 #: src/forms/BuildForms.tsx:795 -#: src/forms/PurchaseOrderForms.tsx:595 +#: src/forms/PurchaseOrderForms.tsx:647 #: src/forms/StockForms.tsx:792 #: src/forms/StockForms.tsx:839 #: src/forms/StockForms.tsx:885 @@ -3023,7 +3030,7 @@ msgstr "" #: src/components/render/Stock.tsx:99 #: src/pages/stock/StockDetail.tsx:198 #: src/pages/stock/StockDetail.tsx:930 -#: src/tables/build/BuildAllocatedStockTable.tsx:121 +#: src/tables/build/BuildAllocatedStockTable.tsx:118 #: src/tables/build/BuildOutputTable.tsx:107 #: src/tables/sales/SalesOrderAllocationTable.tsx:142 msgid "Serial Number" @@ -3034,9 +3041,9 @@ msgstr "" #: src/forms/BuildForms.tsx:240 #: src/forms/BuildForms.tsx:634 #: src/forms/BuildForms.tsx:797 -#: src/forms/PurchaseOrderForms.tsx:801 +#: src/forms/PurchaseOrderForms.tsx:853 #: src/forms/ReturnOrderForms.tsx:243 -#: src/forms/SalesOrderForms.tsx:308 +#: src/forms/SalesOrderForms.tsx:326 #: src/forms/StockForms.tsx:841 #: src/pages/part/PartStockHistoryDetail.tsx:56 #: src/pages/part/PartStockHistoryDetail.tsx:210 @@ -3046,9 +3053,9 @@ msgstr "" #: src/pages/part/pricing/PriceBreakPanel.tsx:172 #: src/pages/stock/StockDetail.tsx:258 #: src/pages/stock/StockDetail.tsx:936 -#: src/tables/build/BuildLineTable.tsx:86 +#: src/tables/build/BuildLineTable.tsx:83 #: src/tables/part/PartPurchaseOrdersTable.tsx:94 -#: src/tables/part/PartTestResultTable.tsx:269 +#: src/tables/part/PartTestResultTable.tsx:277 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:175 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:206 #: src/tables/purchasing/SupplierPriceBreakTable.tsx:69 @@ -3070,7 +3077,7 @@ msgstr "" #: src/forms/StockForms.tsx:1048 #: src/forms/StockForms.tsx:1096 #: src/forms/StockForms.tsx:1140 -#: src/tables/build/BuildLineTable.tsx:96 +#: src/tables/build/BuildLineTable.tsx:93 msgid "Batch" msgstr "" @@ -3755,7 +3762,7 @@ msgid "In Stock" msgstr "" #: src/components/wizards/OrderPartsWizard.tsx:146 -#: src/tables/build/BuildLineTable.tsx:404 +#: src/tables/build/BuildLineTable.tsx:405 msgid "Required Quantity" msgstr "" @@ -3847,7 +3854,7 @@ msgid "Please correct the errors in the selected parts" msgstr "" #: src/components/wizards/OrderPartsWizard.tsx:587 -#: src/tables/build/BuildLineTable.tsx:815 +#: src/tables/build/BuildLineTable.tsx:822 #: src/tables/part/PartTable.tsx:522 #: src/tables/sales/SalesOrderLineItemTable.tsx:370 msgid "Order Parts" @@ -4349,9 +4356,9 @@ msgstr "" #: src/forms/BuildForms.tsx:333 #: src/forms/BuildForms.tsx:408 #: src/forms/BuildForms.tsx:685 -#: src/tables/build/BuildAllocatedStockTable.tsx:150 +#: src/tables/build/BuildAllocatedStockTable.tsx:147 #: src/tables/build/BuildOutputTable.tsx:582 -#: src/tables/part/PartTestResultTable.tsx:272 +#: src/tables/part/PartTestResultTable.tsx:280 msgid "Build Output" msgstr "" @@ -4362,7 +4369,7 @@ msgstr "" #: src/forms/BuildForms.tsx:336 #: src/forms/BuildForms.tsx:411 #: src/forms/BuildForms.tsx:475 -#: src/forms/PurchaseOrderForms.tsx:717 +#: src/forms/PurchaseOrderForms.tsx:769 #: src/forms/ReturnOrderForms.tsx:197 #: src/forms/ReturnOrderForms.tsx:244 #: src/forms/StockForms.tsx:712 @@ -4377,7 +4384,7 @@ msgstr "" #: src/tables/build/BuildOutputTable.tsx:404 #: src/tables/machine/MachineListTable.tsx:387 #: src/tables/part/PartPurchaseOrdersTable.tsx:38 -#: src/tables/part/PartTestResultTable.tsx:309 +#: src/tables/part/PartTestResultTable.tsx:317 #: src/tables/sales/ReturnOrderLineItemTable.tsx:138 #: src/tables/sales/ReturnOrderLineItemTable.tsx:176 #: src/tables/settings/CustomStateTable.tsx:79 @@ -4450,8 +4457,8 @@ msgstr "" #: src/pages/stock/StockDetail.tsx:153 #: src/tables/bom/BomTable.tsx:134 #: src/tables/bom/UsedInTable.tsx:40 -#: src/tables/build/BuildAllocatedStockTable.tsx:108 -#: src/tables/build/BuildLineTable.tsx:336 +#: src/tables/build/BuildAllocatedStockTable.tsx:105 +#: src/tables/build/BuildLineTable.tsx:337 #: src/tables/build/BuildOrderTable.tsx:79 #: src/tables/part/PartSalesAllocationsTable.tsx:61 #: src/tables/part/RelatedPartTable.tsx:73 @@ -4466,47 +4473,47 @@ msgstr "" #: src/forms/BuildForms.tsx:632 #: src/forms/BuildForms.tsx:796 #: src/forms/BuildForms.tsx:897 -#: src/forms/SalesOrderForms.tsx:306 -#: src/tables/build/BuildAllocatedStockTable.tsx:139 -#: src/tables/build/BuildLineTable.tsx:182 +#: src/forms/SalesOrderForms.tsx:324 +#: src/tables/build/BuildAllocatedStockTable.tsx:136 +#: src/tables/build/BuildLineTable.tsx:183 #: src/tables/sales/SalesOrderLineItemTable.tsx:342 #: src/tables/stock/StockItemTable.tsx:338 msgid "Allocated" msgstr "" #: src/forms/BuildForms.tsx:667 -#: src/forms/SalesOrderForms.tsx:295 +#: src/forms/SalesOrderForms.tsx:313 #: src/pages/build/BuildDetail.tsx:108 #: src/pages/build/BuildDetail.tsx:326 msgid "Source Location" msgstr "" #: src/forms/BuildForms.tsx:668 -#: src/forms/SalesOrderForms.tsx:296 +#: src/forms/SalesOrderForms.tsx:314 msgid "Select the source location for the stock allocation" msgstr "" #: src/forms/BuildForms.tsx:700 -#: src/forms/SalesOrderForms.tsx:336 -#: src/tables/build/BuildLineTable.tsx:574 -#: src/tables/build/BuildLineTable.tsx:731 -#: src/tables/build/BuildLineTable.tsx:830 +#: src/forms/SalesOrderForms.tsx:354 +#: src/tables/build/BuildLineTable.tsx:575 +#: src/tables/build/BuildLineTable.tsx:738 +#: src/tables/build/BuildLineTable.tsx:837 #: src/tables/sales/SalesOrderLineItemTable.tsx:380 #: src/tables/sales/SalesOrderLineItemTable.tsx:406 msgid "Allocate Stock" msgstr "" #: src/forms/BuildForms.tsx:703 -#: src/forms/SalesOrderForms.tsx:341 +#: src/forms/SalesOrderForms.tsx:359 msgid "Stock items allocated" msgstr "" #: src/forms/BuildForms.tsx:816 #: src/forms/BuildForms.tsx:917 -#: src/tables/build/BuildAllocatedStockTable.tsx:240 -#: src/tables/build/BuildAllocatedStockTable.tsx:272 -#: src/tables/build/BuildLineTable.tsx:741 -#: src/tables/build/BuildLineTable.tsx:864 +#: src/tables/build/BuildAllocatedStockTable.tsx:243 +#: src/tables/build/BuildAllocatedStockTable.tsx:279 +#: src/tables/build/BuildLineTable.tsx:748 +#: src/tables/build/BuildLineTable.tsx:871 msgid "Consume Stock" msgstr "" @@ -4521,21 +4528,21 @@ msgstr "" #~ msgstr "Stock items consumed" #: src/forms/BuildForms.tsx:853 -#: src/tables/build/BuildLineTable.tsx:514 +#: src/tables/build/BuildLineTable.tsx:515 #: src/tables/part/PartBuildAllocationsTable.tsx:101 msgid "Fully consumed" msgstr "" #: src/forms/BuildForms.tsx:898 -#: src/tables/build/BuildLineTable.tsx:187 +#: src/tables/build/BuildLineTable.tsx:188 #: src/tables/stock/StockItemTable.tsx:367 msgid "Consumed" msgstr "" #: src/forms/CommonForms.tsx:88 -#: src/forms/PurchaseOrderForms.tsx:125 +#: src/forms/PurchaseOrderForms.tsx:176 #: src/forms/ReturnOrderForms.tsx:138 -#: src/forms/SalesOrderForms.tsx:164 +#: src/forms/SalesOrderForms.tsx:182 msgid "Select project code for this line item" msgstr "" @@ -4572,32 +4579,16 @@ msgstr "" msgid "Subscribe to notifications for this category" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:388 -msgid "Assign Batch Code and Serial Numbers" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:390 -msgid "Assign Batch Code" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:410 -msgid "Choose Location" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:418 -msgid "Item Destination selected" -msgstr "" - #: src/forms/PurchaseOrderForms.tsx:421 #~ msgid "Assign Batch Code{0}" #~ msgstr "Assign Batch Code{0}" -#: src/forms/PurchaseOrderForms.tsx:428 -msgid "Part category default location selected" +#: src/forms/PurchaseOrderForms.tsx:440 +msgid "Assign Batch Code and Serial Numbers" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:438 -msgid "Received stock location selected" +#: src/forms/PurchaseOrderForms.tsx:442 +msgid "Assign Batch Code" msgstr "" #: src/forms/PurchaseOrderForms.tsx:444 @@ -4605,94 +4596,110 @@ msgstr "" #~ msgid "Remove item from list" #~ msgstr "Remove item from list" -#: src/forms/PurchaseOrderForms.tsx:446 +#: src/forms/PurchaseOrderForms.tsx:462 +msgid "Choose Location" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:470 +msgid "Item Destination selected" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:480 +msgid "Part category default location selected" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:490 +msgid "Received stock location selected" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:498 msgid "Default location selected" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:507 +#: src/forms/PurchaseOrderForms.tsx:559 msgid "Set Location" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:524 -msgid "Set Expiry Date" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:532 -#: src/forms/StockForms.tsx:693 -msgid "Adjust Packaging" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:540 -#: src/forms/StockForms.tsx:684 -#: src/hooks/UseStockAdjustActions.tsx:148 -msgid "Change Status" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:546 -msgid "Add Note" -msgstr "" - #: src/forms/PurchaseOrderForms.tsx:566 #~ msgid "Serial numbers" #~ msgstr "Serial numbers" +#: src/forms/PurchaseOrderForms.tsx:576 +msgid "Set Expiry Date" +msgstr "" + #: src/forms/PurchaseOrderForms.tsx:582 #~ msgid "Store at line item destination" #~ msgstr "Store at line item destination" -#: src/forms/PurchaseOrderForms.tsx:610 -msgid "Store at default location" +#: src/forms/PurchaseOrderForms.tsx:584 +#: src/forms/StockForms.tsx:693 +msgid "Adjust Packaging" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:625 -msgid "Store at line item destination " +#: src/forms/PurchaseOrderForms.tsx:592 +#: src/forms/StockForms.tsx:684 +#: src/hooks/UseStockAdjustActions.tsx:148 +msgid "Change Status" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:637 -msgid "Store with already received stock" +#: src/forms/PurchaseOrderForms.tsx:598 +msgid "Add Note" msgstr "" #: src/forms/PurchaseOrderForms.tsx:658 #~ msgid "Receive line items" #~ msgstr "Receive line items" -#: src/forms/PurchaseOrderForms.tsx:661 +#: src/forms/PurchaseOrderForms.tsx:662 +msgid "Store at default location" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:677 +msgid "Store at line item destination " +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:689 +msgid "Store with already received stock" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:713 #: src/pages/build/BuildDetail.tsx:340 #: src/pages/stock/StockDetail.tsx:280 #: src/pages/stock/StockDetail.tsx:952 #: src/tables/Filter.tsx:83 -#: src/tables/build/BuildAllocatedStockTable.tsx:128 +#: src/tables/build/BuildAllocatedStockTable.tsx:125 #: src/tables/build/BuildOutputTable.tsx:112 -#: src/tables/part/PartTestResultTable.tsx:260 -#: src/tables/part/PartTestResultTable.tsx:281 +#: src/tables/part/PartTestResultTable.tsx:268 +#: src/tables/part/PartTestResultTable.tsx:289 #: src/tables/sales/SalesOrderAllocationTable.tsx:149 msgid "Batch Code" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:662 +#: src/forms/PurchaseOrderForms.tsx:714 msgid "Enter batch code for received items" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:675 +#: src/forms/PurchaseOrderForms.tsx:727 #: src/forms/StockForms.tsx:218 msgid "Serial Numbers" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:676 +#: src/forms/PurchaseOrderForms.tsx:728 msgid "Enter serial numbers for received items" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:690 +#: src/forms/PurchaseOrderForms.tsx:742 #: src/pages/stock/StockDetail.tsx:382 #: src/tables/stock/StockItemTable.tsx:294 msgid "Expiry Date" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:691 +#: src/forms/PurchaseOrderForms.tsx:743 msgid "Enter an expiry date for received items" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:703 +#: src/forms/PurchaseOrderForms.tsx:755 #: src/forms/StockForms.tsx:728 #: src/pages/company/SupplierPartDetail.tsx:172 #: src/pages/company/SupplierPartDetail.tsx:236 @@ -4701,19 +4708,19 @@ msgstr "" msgid "Packaging" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:727 +#: src/forms/PurchaseOrderForms.tsx:779 #: src/pages/company/SupplierPartDetail.tsx:120 #: src/tables/ColumnRenderers.tsx:332 msgid "Note" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:799 +#: src/forms/PurchaseOrderForms.tsx:851 #: src/pages/company/SupplierPartDetail.tsx:138 #: src/tables/purchasing/SupplierPriceBreakTable.tsx:49 msgid "SKU" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:800 +#: src/forms/PurchaseOrderForms.tsx:852 #: src/tables/part/PartPurchaseOrdersTable.tsx:127 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:213 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:283 @@ -4721,11 +4728,11 @@ msgstr "" msgid "Received" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:817 +#: src/forms/PurchaseOrderForms.tsx:869 msgid "Receive Line Items" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:823 +#: src/forms/PurchaseOrderForms.tsx:875 msgid "Items received" msgstr "" @@ -4737,7 +4744,7 @@ msgstr "" msgid "Item received into stock" msgstr "" -#: src/forms/SalesOrderForms.tsx:401 +#: src/forms/SalesOrderForms.tsx:419 msgid "Leave blank to use the order address" msgstr "" @@ -5932,6 +5939,9 @@ msgstr "" #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:310 #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:401 +#: src/tables/build/BuildAllocatedStockTable.tsx:181 +#: src/tables/build/BuildLineTable.tsx:668 +#: src/tables/sales/SalesOrderAllocationTable.tsx:220 msgid "Confirm Removal" msgstr "" @@ -6870,8 +6880,8 @@ msgstr "" #: src/pages/sales/ReturnOrderDetail.tsx:108 #: src/pages/sales/SalesOrderDetail.tsx:98 #: src/tables/ColumnRenderers.tsx:321 -#: src/tables/build/BuildAllocatedStockTable.tsx:115 -#: src/tables/build/BuildLineTable.tsx:352 +#: src/tables/build/BuildAllocatedStockTable.tsx:112 +#: src/tables/build/BuildLineTable.tsx:353 msgid "Reference" msgstr "" @@ -7132,7 +7142,7 @@ msgstr "" #: src/pages/build/BuildDetail.tsx:742 #: src/pages/stock/StockDetail.tsx:344 -#: src/tables/build/BuildAllocatedStockTable.tsx:85 +#: src/tables/build/BuildAllocatedStockTable.tsx:82 #: src/tables/part/PartBuildAllocationsTable.tsx:45 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:157 #: src/tables/stock/StockTrackingTable.tsx:109 @@ -7600,7 +7610,7 @@ msgstr "" #: src/pages/part/PartDetail.tsx:542 #: src/tables/bom/BomTable.tsx:439 -#: src/tables/build/BuildLineTable.tsx:305 +#: src/tables/build/BuildLineTable.tsx:306 #: src/tables/part/PartTable.tsx:319 #: src/tables/sales/SalesOrderLineItemTable.tsx:138 msgid "Available Stock" @@ -7608,7 +7618,7 @@ msgstr "" #: src/pages/part/PartDetail.tsx:548 #: src/tables/bom/BomTable.tsx:341 -#: src/tables/build/BuildLineTable.tsx:267 +#: src/tables/build/BuildLineTable.tsx:268 #: src/tables/sales/SalesOrderLineItemTable.tsx:180 msgid "On order" msgstr "" @@ -7782,7 +7792,7 @@ msgstr "" #: src/pages/part/PartDetail.tsx:1144 #: src/pages/stock/StockDetail.tsx:884 -#: src/tables/build/BuildLineTable.tsx:761 +#: src/tables/build/BuildLineTable.tsx:768 msgid "Order Stock" msgstr "" @@ -9219,13 +9229,13 @@ msgstr "" #~ msgstr "Show asssmbled items" #: src/tables/bom/BomTable.tsx:315 -#: src/tables/build/BuildLineTable.tsx:276 +#: src/tables/build/BuildLineTable.tsx:277 #: src/tables/part/PartTable.tsx:145 msgid "External stock" msgstr "" #: src/tables/bom/BomTable.tsx:323 -#: src/tables/build/BuildLineTable.tsx:239 +#: src/tables/build/BuildLineTable.tsx:240 msgid "Includes substitute stock" msgstr "" @@ -9234,7 +9244,7 @@ msgstr "" #~ msgstr "Edit Bom Item" #: src/tables/bom/BomTable.tsx:332 -#: src/tables/build/BuildLineTable.tsx:249 +#: src/tables/build/BuildLineTable.tsx:250 #: src/tables/sales/SalesOrderLineItemTable.tsx:166 msgid "Includes variant stock" msgstr "" @@ -9272,8 +9282,8 @@ msgid "Stock Information" msgstr "" #: src/tables/bom/BomTable.tsx:399 -#: src/tables/build/BuildLineTable.tsx:496 -#: src/tables/build/BuildLineTable.tsx:537 +#: src/tables/build/BuildLineTable.tsx:497 +#: src/tables/build/BuildLineTable.tsx:538 msgid "Consumable item" msgstr "" @@ -9282,7 +9292,7 @@ msgid "No available stock" msgstr "" #: src/tables/bom/BomTable.tsx:420 -#: src/tables/build/BuildLineTable.tsx:213 +#: src/tables/build/BuildLineTable.tsx:214 msgid "Show testable items" msgstr "" @@ -9291,7 +9301,7 @@ msgid "Show trackable items" msgstr "" #: src/tables/bom/BomTable.tsx:430 -#: src/tables/build/BuildLineTable.tsx:208 +#: src/tables/build/BuildLineTable.tsx:209 msgid "Show assembled items" msgstr "" @@ -9335,7 +9345,7 @@ msgstr "" #: src/tables/bom/BomTable.tsx:464 #: src/tables/bom/UsedInTable.tsx:85 -#: src/tables/build/BuildLineTable.tsx:202 +#: src/tables/build/BuildLineTable.tsx:203 msgid "Optional" msgstr "" @@ -9345,7 +9355,7 @@ msgid "Show optional items" msgstr "" #: src/tables/bom/BomTable.tsx:469 -#: src/tables/build/BuildLineTable.tsx:197 +#: src/tables/build/BuildLineTable.tsx:198 msgid "Consumable" msgstr "" @@ -9433,7 +9443,7 @@ msgid "Bill of materials cannot be edited, as the part is locked" msgstr "" #: src/tables/bom/UsedInTable.tsx:34 -#: src/tables/build/BuildLineTable.tsx:207 +#: src/tables/build/BuildLineTable.tsx:208 #: src/tables/part/ParametricPartTable.tsx:364 #: src/tables/part/PartBuildAllocationsTable.tsx:60 #: src/tables/part/PartTable.tsx:209 @@ -9455,11 +9465,11 @@ msgstr "" msgid "Show trackable assemblies" msgstr "" -#: src/tables/build/BuildAllocatedStockTable.tsx:67 +#: src/tables/build/BuildAllocatedStockTable.tsx:64 msgid "Allocated to Output" msgstr "" -#: src/tables/build/BuildAllocatedStockTable.tsx:68 +#: src/tables/build/BuildAllocatedStockTable.tsx:65 msgid "Show items allocated to a build output" msgstr "" @@ -9472,7 +9482,7 @@ msgstr "" #~ msgid "Include orders for part variants" #~ msgstr "Include orders for part variants" -#: src/tables/build/BuildAllocatedStockTable.tsx:97 +#: src/tables/build/BuildAllocatedStockTable.tsx:94 #: src/tables/part/PartBuildAllocationsTable.tsx:84 #: src/tables/part/PartPurchaseOrdersTable.tsx:132 #: src/tables/part/PartSalesAllocationsTable.tsx:69 @@ -9482,40 +9492,58 @@ msgid "Order Status" msgstr "" #: src/tables/build/BuildAllocatedStockTable.tsx:164 -#~ msgid "Edit Build Item" -#~ msgstr "Edit Build Item" - -#: src/tables/build/BuildAllocatedStockTable.tsx:167 -#: src/tables/build/BuildLineTable.tsx:650 +#: src/tables/build/BuildLineTable.tsx:651 msgid "Edit Stock Allocation" msgstr "" +#: src/tables/build/BuildAllocatedStockTable.tsx:164 +#~ msgid "Edit Build Item" +#~ msgstr "Edit Build Item" + #: src/tables/build/BuildAllocatedStockTable.tsx:174 #~ msgid "Delete Build Item" #~ msgstr "Delete Build Item" -#: src/tables/build/BuildAllocatedStockTable.tsx:180 -#: src/tables/build/BuildLineTable.tsx:663 -msgid "Delete Stock Allocation" +#: src/tables/build/BuildAllocatedStockTable.tsx:177 +#: src/tables/build/BuildLineTable.tsx:664 +#: src/tables/sales/SalesOrderAllocationTable.tsx:218 +msgid "Remove Allocated Stock" msgstr "" -#: src/tables/build/BuildAllocatedStockTable.tsx:239 +#: src/tables/build/BuildAllocatedStockTable.tsx:180 +#: src/tables/build/BuildLineTable.tsx:663 +#~ msgid "Delete Stock Allocation" +#~ msgstr "Delete Stock Allocation" + +#: src/tables/build/BuildAllocatedStockTable.tsx:182 +#: src/tables/build/BuildLineTable.tsx:669 +#: src/tables/sales/SalesOrderAllocationTable.tsx:221 +msgid "Are you sure you want to remove this allocated stock from the order?" +msgstr "" + +#: src/tables/build/BuildAllocatedStockTable.tsx:242 msgid "Consume" msgstr "" +#: src/tables/build/BuildAllocatedStockTable.tsx:259 +#: src/tables/build/BuildLineTable.tsx:112 +#: src/tables/sales/SalesOrderAllocationTable.tsx:248 +msgid "Remove allocated stock" +msgstr "" + #: src/tables/build/BuildLineTable.tsx:59 #~ msgid "Show lines with available stock" #~ msgstr "Show lines with available stock" -#: src/tables/build/BuildLineTable.tsx:120 +#: src/tables/build/BuildLineTable.tsx:121 msgid "View Stock Item" msgstr "" -#: src/tables/build/BuildLineTable.tsx:183 +#: src/tables/build/BuildLineTable.tsx:184 msgid "Show fully allocated lines" msgstr "" -#: src/tables/build/BuildLineTable.tsx:188 +#: src/tables/build/BuildLineTable.tsx:189 msgid "Show fully consumed lines" msgstr "" @@ -9523,124 +9551,124 @@ msgstr "" #~ msgid "Show allocated lines" #~ msgstr "Show allocated lines" -#: src/tables/build/BuildLineTable.tsx:193 +#: src/tables/build/BuildLineTable.tsx:194 msgid "Show items with sufficient available stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:198 +#: src/tables/build/BuildLineTable.tsx:199 msgid "Show consumable lines" msgstr "" -#: src/tables/build/BuildLineTable.tsx:203 +#: src/tables/build/BuildLineTable.tsx:204 msgid "Show optional lines" msgstr "" -#: src/tables/build/BuildLineTable.tsx:212 +#: src/tables/build/BuildLineTable.tsx:213 #: src/tables/part/PartTable.tsx:233 msgid "Testable" msgstr "" -#: src/tables/build/BuildLineTable.tsx:217 +#: src/tables/build/BuildLineTable.tsx:218 #: src/tables/stock/StockItemTable.tsx:388 msgid "Tracked" msgstr "" -#: src/tables/build/BuildLineTable.tsx:218 +#: src/tables/build/BuildLineTable.tsx:219 msgid "Show tracked lines" msgstr "" -#: src/tables/build/BuildLineTable.tsx:223 +#: src/tables/build/BuildLineTable.tsx:224 msgid "Show items with stock on order" msgstr "" -#: src/tables/build/BuildLineTable.tsx:258 +#: src/tables/build/BuildLineTable.tsx:259 #: src/tables/sales/SalesOrderLineItemTable.tsx:172 msgid "In production" msgstr "" -#: src/tables/build/BuildLineTable.tsx:286 +#: src/tables/build/BuildLineTable.tsx:287 msgid "Insufficient stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:302 +#: src/tables/build/BuildLineTable.tsx:303 #: src/tables/sales/SalesOrderLineItemTable.tsx:160 #: src/tables/stock/StockItemTable.tsx:191 msgid "No stock available" msgstr "" -#: src/tables/build/BuildLineTable.tsx:375 +#: src/tables/build/BuildLineTable.tsx:376 msgid "Gets Inherited" msgstr "" -#: src/tables/build/BuildLineTable.tsx:388 +#: src/tables/build/BuildLineTable.tsx:389 msgid "Unit Quantity" msgstr "" -#: src/tables/build/BuildLineTable.tsx:415 +#: src/tables/build/BuildLineTable.tsx:416 msgid "Setup Quantity" msgstr "" -#: src/tables/build/BuildLineTable.tsx:424 +#: src/tables/build/BuildLineTable.tsx:425 msgid "Attrition" msgstr "" -#: src/tables/build/BuildLineTable.tsx:432 +#: src/tables/build/BuildLineTable.tsx:433 msgid "Rounding Multiple" msgstr "" -#: src/tables/build/BuildLineTable.tsx:441 +#: src/tables/build/BuildLineTable.tsx:442 msgid "BOM Information" msgstr "" -#: src/tables/build/BuildLineTable.tsx:515 +#: src/tables/build/BuildLineTable.tsx:516 #: src/tables/part/PartBuildAllocationsTable.tsx:102 msgid "Fully allocated" msgstr "" -#: src/tables/build/BuildLineTable.tsx:563 +#: src/tables/build/BuildLineTable.tsx:564 #: src/tables/sales/SalesOrderLineItemTable.tsx:311 msgid "Create Build Order" msgstr "" -#: src/tables/build/BuildLineTable.tsx:592 +#: src/tables/build/BuildLineTable.tsx:593 msgid "Auto allocation in progress" msgstr "" -#: src/tables/build/BuildLineTable.tsx:595 -#: src/tables/build/BuildLineTable.tsx:802 +#: src/tables/build/BuildLineTable.tsx:596 +#: src/tables/build/BuildLineTable.tsx:809 msgid "Auto Allocate Stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:596 +#: src/tables/build/BuildLineTable.tsx:597 msgid "Automatically allocate stock to this build according to the selected options" msgstr "" -#: src/tables/build/BuildLineTable.tsx:616 -#: src/tables/build/BuildLineTable.tsx:630 -#: src/tables/build/BuildLineTable.tsx:751 -#: src/tables/build/BuildLineTable.tsx:852 +#: src/tables/build/BuildLineTable.tsx:617 +#: src/tables/build/BuildLineTable.tsx:631 +#: src/tables/build/BuildLineTable.tsx:758 +#: src/tables/build/BuildLineTable.tsx:859 #: src/tables/build/BuildOutputTable.tsx:355 #: src/tables/build/BuildOutputTable.tsx:360 msgid "Deallocate Stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:632 +#: src/tables/build/BuildLineTable.tsx:633 msgid "Deallocate all untracked stock for this build order" msgstr "" -#: src/tables/build/BuildLineTable.tsx:634 +#: src/tables/build/BuildLineTable.tsx:635 msgid "Deallocate stock from the selected line item" msgstr "" -#: src/tables/build/BuildLineTable.tsx:638 +#: src/tables/build/BuildLineTable.tsx:639 msgid "Stock has been deallocated" msgstr "" -#: src/tables/build/BuildLineTable.tsx:771 +#: src/tables/build/BuildLineTable.tsx:778 msgid "Build Stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:784 +#: src/tables/build/BuildLineTable.tsx:791 #: src/tables/sales/SalesOrderLineItemTable.tsx:487 msgid "View Part" msgstr "" @@ -9739,7 +9767,7 @@ msgid "Serialize Build Output" msgstr "" #: src/tables/build/BuildOutputTable.tsx:405 -#: src/tables/part/PartTestResultTable.tsx:310 +#: src/tables/part/PartTestResultTable.tsx:318 #: src/tables/stock/StockItemTable.tsx:328 msgid "Filter by stock status" msgstr "" @@ -9964,8 +9992,8 @@ msgid "View Item" msgstr "" #: src/tables/general/ExtraLineItemTable.tsx:95 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:299 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:403 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:300 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:405 #: src/tables/sales/ReturnOrderLineItemTable.tsx:83 #: src/tables/sales/ReturnOrderLineItemTable.tsx:187 #: src/tables/sales/SalesOrderLineItemTable.tsx:252 @@ -9974,14 +10002,14 @@ msgid "Add Line Item" msgstr "" #: src/tables/general/ExtraLineItemTable.tsx:108 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:320 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:322 #: src/tables/sales/ReturnOrderLineItemTable.tsx:96 #: src/tables/sales/SalesOrderLineItemTable.tsx:271 msgid "Edit Line Item" msgstr "" #: src/tables/general/ExtraLineItemTable.tsx:117 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:329 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:331 #: src/tables/sales/ReturnOrderLineItemTable.tsx:105 #: src/tables/sales/SalesOrderLineItemTable.tsx:280 msgid "Delete Line Item" @@ -10273,7 +10301,7 @@ msgid "Required Stock" msgstr "" #: src/tables/part/PartBuildAllocationsTable.tsx:124 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:381 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:383 msgid "View Build Order" msgstr "" @@ -10617,8 +10645,8 @@ msgstr "" #: src/tables/part/PartTestResultTable.tsx:103 #: src/tables/part/PartTestResultTable.tsx:181 -#: src/tables/part/PartTestResultTable.tsx:320 -#: src/tables/part/PartTestResultTable.tsx:334 +#: src/tables/part/PartTestResultTable.tsx:328 +#: src/tables/part/PartTestResultTable.tsx:342 #: src/tables/stock/StockItemTestResultTable.tsx:296 #: src/tables/stock/StockItemTestResultTable.tsx:368 #: src/tables/stock/StockItemTestResultTable.tsx:429 @@ -10643,7 +10671,7 @@ msgstr "" msgid "No Result" msgstr "" -#: src/tables/part/PartTestResultTable.tsx:298 +#: src/tables/part/PartTestResultTable.tsx:306 msgid "Show build outputs currently in production" msgstr "" @@ -11073,7 +11101,7 @@ msgid "Show manufacturer parts for active manufacturers." msgstr "" #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:115 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:397 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:399 msgid "Import Line Items" msgstr "" @@ -11099,11 +11127,11 @@ msgstr "" #~ msgid "Add line item" #~ msgstr "Add line item" -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:350 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:352 msgid "Receive line item" msgstr "" -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:414 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:416 msgid "Receive items" msgstr "" @@ -11201,25 +11229,25 @@ msgid "Not shipped" msgstr "" #: src/tables/sales/SalesOrderAllocationTable.tsx:211 -#: src/tables/sales/SalesOrderAllocationTable.tsx:229 +#: src/tables/sales/SalesOrderAllocationTable.tsx:235 msgid "Edit Allocation" msgstr "" #: src/tables/sales/SalesOrderAllocationTable.tsx:218 #: src/tables/sales/SalesOrderAllocationTable.tsx:241 -msgid "Delete Allocation" -msgstr "" +#~ msgid "Delete Allocation" +#~ msgstr "Delete Allocation" -#: src/tables/sales/SalesOrderAllocationTable.tsx:252 -#: src/tables/sales/SalesOrderAllocationTable.tsx:253 +#: src/tables/sales/SalesOrderAllocationTable.tsx:261 +#: src/tables/sales/SalesOrderAllocationTable.tsx:262 msgid "View Shipment" msgstr "" -#: src/tables/sales/SalesOrderAllocationTable.tsx:308 +#: src/tables/sales/SalesOrderAllocationTable.tsx:317 msgid "Assign to Shipment" msgstr "" -#: src/tables/sales/SalesOrderAllocationTable.tsx:324 +#: src/tables/sales/SalesOrderAllocationTable.tsx:333 msgid "Assign to shipment" msgstr "" diff --git a/src/frontend/src/locales/nl/messages.po b/src/frontend/src/locales/nl/messages.po index 9242cc7bde..03994b9e56 100644 --- a/src/frontend/src/locales/nl/messages.po +++ b/src/frontend/src/locales/nl/messages.po @@ -8,7 +8,7 @@ msgstr "" "Language: nl\n" "Project-Id-Version: inventree\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2025-11-19 19:39\n" +"PO-Revision-Date: 2025-11-22 06:25\n" "Last-Translator: \n" "Language-Team: Dutch\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" @@ -56,7 +56,7 @@ msgstr "Annuleer" #: lib/components/RowActions.tsx:136 #: src/components/nav/NavigationDrawer.tsx:190 -#: src/forms/PurchaseOrderForms.tsx:802 +#: src/forms/PurchaseOrderForms.tsx:854 #: src/forms/StockForms.tsx:796 #: src/forms/StockForms.tsx:843 #: src/forms/StockForms.tsx:889 @@ -103,9 +103,9 @@ msgstr "Nee" #: src/forms/BuildForms.tsx:630 #: src/forms/BuildForms.tsx:793 #: src/forms/BuildForms.tsx:896 -#: src/forms/PurchaseOrderForms.tsx:798 +#: src/forms/PurchaseOrderForms.tsx:850 #: src/forms/ReturnOrderForms.tsx:242 -#: src/forms/SalesOrderForms.tsx:305 +#: src/forms/SalesOrderForms.tsx:323 #: src/forms/StockForms.tsx:360 #: src/forms/StockForms.tsx:791 #: src/forms/StockForms.tsx:838 @@ -119,6 +119,7 @@ msgstr "Nee" #: src/pages/build/BuildDetail.tsx:200 #: src/pages/part/PartDetail.tsx:1207 #: src/tables/ColumnRenderers.tsx:91 +#: src/tables/part/PartTestResultTable.tsx:247 #: src/tables/part/RelatedPartTable.tsx:53 #: src/tables/stock/StockTrackingTable.tsx:87 msgid "Part" @@ -158,7 +159,7 @@ msgstr "Templatesjablonen voor onderdeel" #: src/components/wizards/OrderPartsWizard.tsx:290 #: src/pages/company/SupplierPartDetail.tsx:413 #: src/pages/stock/StockDetail.tsx:289 -#: src/tables/build/BuildAllocatedStockTable.tsx:155 +#: src/tables/build/BuildAllocatedStockTable.tsx:152 #: src/tables/part/PartPurchaseOrdersTable.tsx:50 #: src/tables/purchasing/SupplierPartTable.tsx:83 #: src/tables/stock/StockItemTable.tsx:247 @@ -201,9 +202,9 @@ msgstr "Onderdeel categorieën" #: src/forms/BuildForms.tsx:473 #: src/forms/BuildForms.tsx:633 #: src/forms/BuildForms.tsx:794 -#: src/forms/SalesOrderForms.tsx:307 +#: src/forms/SalesOrderForms.tsx:325 #: src/pages/stock/StockDetail.tsx:1005 -#: src/tables/part/PartTestResultTable.tsx:248 +#: src/tables/part/PartTestResultTable.tsx:256 #: src/tables/stock/StockTrackingTable.tsx:48 #: src/tables/stock/StockTrackingTable.tsx:55 msgid "Stock Item" @@ -517,7 +518,7 @@ msgstr "Selectie lijsten" #: src/components/dashboard/DashboardLayout.tsx:281 #: src/components/editors/NotesEditor.tsx:74 #: src/components/editors/TemplateEditor/TemplateEditor.tsx:158 -#: src/components/forms/fields/ApiFormField.tsx:273 +#: src/components/forms/fields/ApiFormField.tsx:237 #: src/components/forms/fields/TableField.tsx:45 #: src/components/importer/ImportDataSelector.tsx:192 #: src/components/importer/ImporterColumnSelector.tsx:234 @@ -642,8 +643,8 @@ msgstr "Voer barcode gegevens in" #: src/components/barcodes/BarcodeScanDialog.tsx:49 #: src/components/buttons/ScanButton.tsx:15 #: src/components/nav/NavigationDrawer.tsx:122 -#: src/forms/PurchaseOrderForms.tsx:457 -#: src/forms/PurchaseOrderForms.tsx:563 +#: src/forms/PurchaseOrderForms.tsx:509 +#: src/forms/PurchaseOrderForms.tsx:615 msgid "Scan Barcode" msgstr "Scan barcode" @@ -728,7 +729,7 @@ msgstr "Dit verwijdert de link naar de bijbehorende barcode" #: src/components/barcodes/QRCode.tsx:205 #: src/components/items/ActionDropdown.tsx:192 -#: src/forms/PurchaseOrderForms.tsx:554 +#: src/forms/PurchaseOrderForms.tsx:606 msgid "Unlink Barcode" msgstr "Barcode loskoppelen" @@ -1216,6 +1217,12 @@ msgstr "De bijbehorende afbeelding van dit item verwijderen?" #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:884 #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:903 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:254 +#: src/tables/build/BuildAllocatedStockTable.tsx:178 +#: src/tables/build/BuildAllocatedStockTable.tsx:258 +#: src/tables/build/BuildLineTable.tsx:111 +#: src/tables/build/BuildLineTable.tsx:665 +#: src/tables/sales/SalesOrderAllocationTable.tsx:224 +#: src/tables/sales/SalesOrderAllocationTable.tsx:247 msgid "Remove" msgstr "Verwijderen" @@ -1241,7 +1248,7 @@ msgid "Upload Error" msgstr "Fout bij uploaden" #: src/components/details/DetailsImage.tsx:250 -#: src/components/forms/fields/TextField.tsx:65 +#: src/components/forms/fields/AutoFillRightSection.tsx:34 msgid "Clear" msgstr "Wis" @@ -1817,10 +1824,14 @@ msgstr "Gestopt" msgid "Running" msgstr "Bezig" -#: src/components/forms/fields/ApiFormField.tsx:233 +#: src/components/forms/fields/ApiFormField.tsx:197 msgid "Select file to upload" msgstr "" +#: src/components/forms/fields/AutoFillRightSection.tsx:47 +msgid "Accept suggested value" +msgstr "" + #: src/components/forms/fields/DateField.tsx:76 msgid "Select date" msgstr "" @@ -1875,10 +1886,6 @@ msgstr "Geen items beschikbaar" msgid "Add new row" msgstr "Nieuwe rij toevoegen" -#: src/components/forms/fields/TextField.tsx:82 -msgid "Accept suggested value" -msgstr "" - #: src/components/images/DetailsImage.tsx:252 #~ msgid "Select image" #~ msgstr "Select image" @@ -2225,8 +2232,8 @@ msgstr "Geen artikelen" #: src/pages/part/PartDetail.tsx:994 #: src/pages/stock/StockDetail.tsx:265 #: src/pages/stock/StockDetail.tsx:942 -#: src/tables/build/BuildAllocatedStockTable.tsx:135 -#: src/tables/build/BuildLineTable.tsx:192 +#: src/tables/build/BuildAllocatedStockTable.tsx:132 +#: src/tables/build/BuildLineTable.tsx:193 #: src/tables/part/PartTable.tsx:137 #: src/tables/stock/StockItemTable.tsx:182 #: src/tables/stock/StockItemTable.tsx:343 @@ -2784,7 +2791,7 @@ msgstr "Plug-in informatie" #: src/pages/sales/SalesOrderDetail.tsx:119 #: src/pages/stock/LocationDetail.tsx:102 #: src/tables/ColumnRenderers.tsx:278 -#: src/tables/build/BuildAllocatedStockTable.tsx:91 +#: src/tables/build/BuildAllocatedStockTable.tsx:88 #: src/tables/machine/MachineTypeTable.tsx:161 #: src/tables/machine/MachineTypeTable.tsx:257 #: src/tables/plugin/PluginListTable.tsx:110 @@ -2966,7 +2973,7 @@ msgstr "Geen voorraad" #: src/pages/company/SupplierPartDetail.tsx:394 #: src/pages/part/PartDetail.tsx:1015 #: src/tables/bom/BomTable.tsx:444 -#: src/tables/build/BuildLineTable.tsx:222 +#: src/tables/build/BuildLineTable.tsx:223 #: src/tables/part/PartTable.tsx:108 msgid "On Order" msgstr "In bestelling" @@ -2976,7 +2983,7 @@ msgstr "In bestelling" #: src/pages/part/PartDetail.tsx:587 #: src/pages/part/PartDetail.tsx:1021 #: src/pages/stock/StockDetail.tsx:925 -#: src/tables/part/PartTestResultTable.tsx:297 +#: src/tables/part/PartTestResultTable.tsx:305 #: src/tables/stock/StockItemTable.tsx:359 msgid "In Production" msgstr "In productie" @@ -3000,7 +3007,7 @@ msgstr "Categorie" #: src/components/render/Stock.tsx:114 #: src/components/render/Stock.tsx:132 #: src/forms/BuildForms.tsx:795 -#: src/forms/PurchaseOrderForms.tsx:595 +#: src/forms/PurchaseOrderForms.tsx:647 #: src/forms/StockForms.tsx:792 #: src/forms/StockForms.tsx:839 #: src/forms/StockForms.tsx:885 @@ -3023,7 +3030,7 @@ msgstr "Locatie" #: src/components/render/Stock.tsx:99 #: src/pages/stock/StockDetail.tsx:198 #: src/pages/stock/StockDetail.tsx:930 -#: src/tables/build/BuildAllocatedStockTable.tsx:121 +#: src/tables/build/BuildAllocatedStockTable.tsx:118 #: src/tables/build/BuildOutputTable.tsx:107 #: src/tables/sales/SalesOrderAllocationTable.tsx:142 msgid "Serial Number" @@ -3034,9 +3041,9 @@ msgstr "Serienummer" #: src/forms/BuildForms.tsx:240 #: src/forms/BuildForms.tsx:634 #: src/forms/BuildForms.tsx:797 -#: src/forms/PurchaseOrderForms.tsx:801 +#: src/forms/PurchaseOrderForms.tsx:853 #: src/forms/ReturnOrderForms.tsx:243 -#: src/forms/SalesOrderForms.tsx:308 +#: src/forms/SalesOrderForms.tsx:326 #: src/forms/StockForms.tsx:841 #: src/pages/part/PartStockHistoryDetail.tsx:56 #: src/pages/part/PartStockHistoryDetail.tsx:210 @@ -3046,9 +3053,9 @@ msgstr "Serienummer" #: src/pages/part/pricing/PriceBreakPanel.tsx:172 #: src/pages/stock/StockDetail.tsx:258 #: src/pages/stock/StockDetail.tsx:936 -#: src/tables/build/BuildLineTable.tsx:86 +#: src/tables/build/BuildLineTable.tsx:83 #: src/tables/part/PartPurchaseOrdersTable.tsx:94 -#: src/tables/part/PartTestResultTable.tsx:269 +#: src/tables/part/PartTestResultTable.tsx:277 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:175 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:206 #: src/tables/purchasing/SupplierPriceBreakTable.tsx:69 @@ -3070,7 +3077,7 @@ msgstr "Aantal" #: src/forms/StockForms.tsx:1048 #: src/forms/StockForms.tsx:1096 #: src/forms/StockForms.tsx:1140 -#: src/tables/build/BuildLineTable.tsx:96 +#: src/tables/build/BuildLineTable.tsx:93 msgid "Batch" msgstr "Batch" @@ -3755,7 +3762,7 @@ msgid "In Stock" msgstr "Op voorraad" #: src/components/wizards/OrderPartsWizard.tsx:146 -#: src/tables/build/BuildLineTable.tsx:404 +#: src/tables/build/BuildLineTable.tsx:405 msgid "Required Quantity" msgstr "Vereiste hoeveelheid" @@ -3847,7 +3854,7 @@ msgid "Please correct the errors in the selected parts" msgstr "Corrigeer de fouten in de geselecteerde onderdelen" #: src/components/wizards/OrderPartsWizard.tsx:587 -#: src/tables/build/BuildLineTable.tsx:815 +#: src/tables/build/BuildLineTable.tsx:822 #: src/tables/part/PartTable.tsx:522 #: src/tables/sales/SalesOrderLineItemTable.tsx:370 msgid "Order Parts" @@ -4349,9 +4356,9 @@ msgstr "Vervanging toegevoegd" #: src/forms/BuildForms.tsx:333 #: src/forms/BuildForms.tsx:408 #: src/forms/BuildForms.tsx:685 -#: src/tables/build/BuildAllocatedStockTable.tsx:150 +#: src/tables/build/BuildAllocatedStockTable.tsx:147 #: src/tables/build/BuildOutputTable.tsx:582 -#: src/tables/part/PartTestResultTable.tsx:272 +#: src/tables/part/PartTestResultTable.tsx:280 msgid "Build Output" msgstr "Bouw Uitvoer" @@ -4362,7 +4369,7 @@ msgstr "" #: src/forms/BuildForms.tsx:336 #: src/forms/BuildForms.tsx:411 #: src/forms/BuildForms.tsx:475 -#: src/forms/PurchaseOrderForms.tsx:717 +#: src/forms/PurchaseOrderForms.tsx:769 #: src/forms/ReturnOrderForms.tsx:197 #: src/forms/ReturnOrderForms.tsx:244 #: src/forms/StockForms.tsx:712 @@ -4377,7 +4384,7 @@ msgstr "" #: src/tables/build/BuildOutputTable.tsx:404 #: src/tables/machine/MachineListTable.tsx:387 #: src/tables/part/PartPurchaseOrdersTable.tsx:38 -#: src/tables/part/PartTestResultTable.tsx:309 +#: src/tables/part/PartTestResultTable.tsx:317 #: src/tables/sales/ReturnOrderLineItemTable.tsx:138 #: src/tables/sales/ReturnOrderLineItemTable.tsx:176 #: src/tables/settings/CustomStateTable.tsx:79 @@ -4450,8 +4457,8 @@ msgstr "Productieorders zijn geannuleerd" #: src/pages/stock/StockDetail.tsx:153 #: src/tables/bom/BomTable.tsx:134 #: src/tables/bom/UsedInTable.tsx:40 -#: src/tables/build/BuildAllocatedStockTable.tsx:108 -#: src/tables/build/BuildLineTable.tsx:336 +#: src/tables/build/BuildAllocatedStockTable.tsx:105 +#: src/tables/build/BuildLineTable.tsx:337 #: src/tables/build/BuildOrderTable.tsx:79 #: src/tables/part/PartSalesAllocationsTable.tsx:61 #: src/tables/part/RelatedPartTable.tsx:73 @@ -4466,47 +4473,47 @@ msgstr "IPN" #: src/forms/BuildForms.tsx:632 #: src/forms/BuildForms.tsx:796 #: src/forms/BuildForms.tsx:897 -#: src/forms/SalesOrderForms.tsx:306 -#: src/tables/build/BuildAllocatedStockTable.tsx:139 -#: src/tables/build/BuildLineTable.tsx:182 +#: src/forms/SalesOrderForms.tsx:324 +#: src/tables/build/BuildAllocatedStockTable.tsx:136 +#: src/tables/build/BuildLineTable.tsx:183 #: src/tables/sales/SalesOrderLineItemTable.tsx:342 #: src/tables/stock/StockItemTable.tsx:338 msgid "Allocated" msgstr "Toegewezen" #: src/forms/BuildForms.tsx:667 -#: src/forms/SalesOrderForms.tsx:295 +#: src/forms/SalesOrderForms.tsx:313 #: src/pages/build/BuildDetail.tsx:108 #: src/pages/build/BuildDetail.tsx:326 msgid "Source Location" msgstr "Bron locatie" #: src/forms/BuildForms.tsx:668 -#: src/forms/SalesOrderForms.tsx:296 +#: src/forms/SalesOrderForms.tsx:314 msgid "Select the source location for the stock allocation" msgstr "Selecteer de bron locatie voor de voorraadtoewijzing" #: src/forms/BuildForms.tsx:700 -#: src/forms/SalesOrderForms.tsx:336 -#: src/tables/build/BuildLineTable.tsx:574 -#: src/tables/build/BuildLineTable.tsx:731 -#: src/tables/build/BuildLineTable.tsx:830 +#: src/forms/SalesOrderForms.tsx:354 +#: src/tables/build/BuildLineTable.tsx:575 +#: src/tables/build/BuildLineTable.tsx:738 +#: src/tables/build/BuildLineTable.tsx:837 #: src/tables/sales/SalesOrderLineItemTable.tsx:380 #: src/tables/sales/SalesOrderLineItemTable.tsx:406 msgid "Allocate Stock" msgstr "Voorraad toewijzen" #: src/forms/BuildForms.tsx:703 -#: src/forms/SalesOrderForms.tsx:341 +#: src/forms/SalesOrderForms.tsx:359 msgid "Stock items allocated" msgstr "Voorraad items toegewezen" #: src/forms/BuildForms.tsx:816 #: src/forms/BuildForms.tsx:917 -#: src/tables/build/BuildAllocatedStockTable.tsx:240 -#: src/tables/build/BuildAllocatedStockTable.tsx:272 -#: src/tables/build/BuildLineTable.tsx:741 -#: src/tables/build/BuildLineTable.tsx:864 +#: src/tables/build/BuildAllocatedStockTable.tsx:243 +#: src/tables/build/BuildAllocatedStockTable.tsx:279 +#: src/tables/build/BuildLineTable.tsx:748 +#: src/tables/build/BuildLineTable.tsx:871 msgid "Consume Stock" msgstr "Verbruikte voorraad" @@ -4521,21 +4528,21 @@ msgstr "" #~ msgstr "Stock items consumed" #: src/forms/BuildForms.tsx:853 -#: src/tables/build/BuildLineTable.tsx:514 +#: src/tables/build/BuildLineTable.tsx:515 #: src/tables/part/PartBuildAllocationsTable.tsx:101 msgid "Fully consumed" msgstr "Volledig verbruikt" #: src/forms/BuildForms.tsx:898 -#: src/tables/build/BuildLineTable.tsx:187 +#: src/tables/build/BuildLineTable.tsx:188 #: src/tables/stock/StockItemTable.tsx:367 msgid "Consumed" msgstr "Verbruikt" #: src/forms/CommonForms.tsx:88 -#: src/forms/PurchaseOrderForms.tsx:125 +#: src/forms/PurchaseOrderForms.tsx:176 #: src/forms/ReturnOrderForms.tsx:138 -#: src/forms/SalesOrderForms.tsx:164 +#: src/forms/SalesOrderForms.tsx:182 msgid "Select project code for this line item" msgstr "" @@ -4572,127 +4579,127 @@ msgstr "Bovenliggende onderdeel categorie" msgid "Subscribe to notifications for this category" msgstr "Abonneer je op meldingen voor deze categorie" -#: src/forms/PurchaseOrderForms.tsx:388 -msgid "Assign Batch Code and Serial Numbers" -msgstr "Batchcode en serienummers toewijzen" - -#: src/forms/PurchaseOrderForms.tsx:390 -msgid "Assign Batch Code" -msgstr "Batch code toewijzen" - -#: src/forms/PurchaseOrderForms.tsx:410 -msgid "Choose Location" -msgstr "Kies locatie" - -#: src/forms/PurchaseOrderForms.tsx:418 -msgid "Item Destination selected" -msgstr "Item bestemming geselecteerd" - #: src/forms/PurchaseOrderForms.tsx:421 #~ msgid "Assign Batch Code{0}" #~ msgstr "Assign Batch Code{0}" -#: src/forms/PurchaseOrderForms.tsx:428 -msgid "Part category default location selected" -msgstr "Standaardlocatie voor de subcategorie" +#: src/forms/PurchaseOrderForms.tsx:440 +msgid "Assign Batch Code and Serial Numbers" +msgstr "Batchcode en serienummers toewijzen" -#: src/forms/PurchaseOrderForms.tsx:438 -msgid "Received stock location selected" -msgstr "Ontvangen voorraadlocatie geselecteerd" +#: src/forms/PurchaseOrderForms.tsx:442 +msgid "Assign Batch Code" +msgstr "Batch code toewijzen" #: src/forms/PurchaseOrderForms.tsx:444 #: src/forms/StockForms.tsx:428 #~ msgid "Remove item from list" #~ msgstr "Remove item from list" -#: src/forms/PurchaseOrderForms.tsx:446 +#: src/forms/PurchaseOrderForms.tsx:462 +msgid "Choose Location" +msgstr "Kies locatie" + +#: src/forms/PurchaseOrderForms.tsx:470 +msgid "Item Destination selected" +msgstr "Item bestemming geselecteerd" + +#: src/forms/PurchaseOrderForms.tsx:480 +msgid "Part category default location selected" +msgstr "Standaardlocatie voor de subcategorie" + +#: src/forms/PurchaseOrderForms.tsx:490 +msgid "Received stock location selected" +msgstr "Ontvangen voorraadlocatie geselecteerd" + +#: src/forms/PurchaseOrderForms.tsx:498 msgid "Default location selected" msgstr "Standaard locatie geselecteerd" -#: src/forms/PurchaseOrderForms.tsx:507 +#: src/forms/PurchaseOrderForms.tsx:559 msgid "Set Location" msgstr "Locatie invoeren" -#: src/forms/PurchaseOrderForms.tsx:524 -msgid "Set Expiry Date" -msgstr "Stel vervaldatum in" - -#: src/forms/PurchaseOrderForms.tsx:532 -#: src/forms/StockForms.tsx:693 -msgid "Adjust Packaging" -msgstr "Verpakking aanpassen" - -#: src/forms/PurchaseOrderForms.tsx:540 -#: src/forms/StockForms.tsx:684 -#: src/hooks/UseStockAdjustActions.tsx:148 -msgid "Change Status" -msgstr "Status wijzigen" - -#: src/forms/PurchaseOrderForms.tsx:546 -msgid "Add Note" -msgstr "Opmerking toevoegen" - #: src/forms/PurchaseOrderForms.tsx:566 #~ msgid "Serial numbers" #~ msgstr "Serial numbers" +#: src/forms/PurchaseOrderForms.tsx:576 +msgid "Set Expiry Date" +msgstr "Stel vervaldatum in" + #: src/forms/PurchaseOrderForms.tsx:582 #~ msgid "Store at line item destination" #~ msgstr "Store at line item destination" -#: src/forms/PurchaseOrderForms.tsx:610 -msgid "Store at default location" -msgstr "Op standaardlocatie opslaan" +#: src/forms/PurchaseOrderForms.tsx:584 +#: src/forms/StockForms.tsx:693 +msgid "Adjust Packaging" +msgstr "Verpakking aanpassen" -#: src/forms/PurchaseOrderForms.tsx:625 -msgid "Store at line item destination " -msgstr "Bewaar op de bestemming van het item " +#: src/forms/PurchaseOrderForms.tsx:592 +#: src/forms/StockForms.tsx:684 +#: src/hooks/UseStockAdjustActions.tsx:148 +msgid "Change Status" +msgstr "Status wijzigen" -#: src/forms/PurchaseOrderForms.tsx:637 -msgid "Store with already received stock" -msgstr "Winkel met reeds ontvangen voorraad" +#: src/forms/PurchaseOrderForms.tsx:598 +msgid "Add Note" +msgstr "Opmerking toevoegen" #: src/forms/PurchaseOrderForms.tsx:658 #~ msgid "Receive line items" #~ msgstr "Receive line items" -#: src/forms/PurchaseOrderForms.tsx:661 +#: src/forms/PurchaseOrderForms.tsx:662 +msgid "Store at default location" +msgstr "Op standaardlocatie opslaan" + +#: src/forms/PurchaseOrderForms.tsx:677 +msgid "Store at line item destination " +msgstr "Bewaar op de bestemming van het item " + +#: src/forms/PurchaseOrderForms.tsx:689 +msgid "Store with already received stock" +msgstr "Winkel met reeds ontvangen voorraad" + +#: src/forms/PurchaseOrderForms.tsx:713 #: src/pages/build/BuildDetail.tsx:340 #: src/pages/stock/StockDetail.tsx:280 #: src/pages/stock/StockDetail.tsx:952 #: src/tables/Filter.tsx:83 -#: src/tables/build/BuildAllocatedStockTable.tsx:128 +#: src/tables/build/BuildAllocatedStockTable.tsx:125 #: src/tables/build/BuildOutputTable.tsx:112 -#: src/tables/part/PartTestResultTable.tsx:260 -#: src/tables/part/PartTestResultTable.tsx:281 +#: src/tables/part/PartTestResultTable.tsx:268 +#: src/tables/part/PartTestResultTable.tsx:289 #: src/tables/sales/SalesOrderAllocationTable.tsx:149 msgid "Batch Code" msgstr "Batch code" -#: src/forms/PurchaseOrderForms.tsx:662 +#: src/forms/PurchaseOrderForms.tsx:714 msgid "Enter batch code for received items" msgstr "Voer batch code in voor ontvangen items" -#: src/forms/PurchaseOrderForms.tsx:675 +#: src/forms/PurchaseOrderForms.tsx:727 #: src/forms/StockForms.tsx:218 msgid "Serial Numbers" msgstr "Serienummers" -#: src/forms/PurchaseOrderForms.tsx:676 +#: src/forms/PurchaseOrderForms.tsx:728 msgid "Enter serial numbers for received items" msgstr "Voer serienummers in voor ontvangen items" -#: src/forms/PurchaseOrderForms.tsx:690 +#: src/forms/PurchaseOrderForms.tsx:742 #: src/pages/stock/StockDetail.tsx:382 #: src/tables/stock/StockItemTable.tsx:294 msgid "Expiry Date" msgstr "Vervaldatum" -#: src/forms/PurchaseOrderForms.tsx:691 +#: src/forms/PurchaseOrderForms.tsx:743 msgid "Enter an expiry date for received items" msgstr "Voer een vervaldatum in voor ontvangen items" -#: src/forms/PurchaseOrderForms.tsx:703 +#: src/forms/PurchaseOrderForms.tsx:755 #: src/forms/StockForms.tsx:728 #: src/pages/company/SupplierPartDetail.tsx:172 #: src/pages/company/SupplierPartDetail.tsx:236 @@ -4701,19 +4708,19 @@ msgstr "Voer een vervaldatum in voor ontvangen items" msgid "Packaging" msgstr "Verpakking" -#: src/forms/PurchaseOrderForms.tsx:727 +#: src/forms/PurchaseOrderForms.tsx:779 #: src/pages/company/SupplierPartDetail.tsx:120 #: src/tables/ColumnRenderers.tsx:332 msgid "Note" msgstr "Opmerking" -#: src/forms/PurchaseOrderForms.tsx:799 +#: src/forms/PurchaseOrderForms.tsx:851 #: src/pages/company/SupplierPartDetail.tsx:138 #: src/tables/purchasing/SupplierPriceBreakTable.tsx:49 msgid "SKU" msgstr "SKU" -#: src/forms/PurchaseOrderForms.tsx:800 +#: src/forms/PurchaseOrderForms.tsx:852 #: src/tables/part/PartPurchaseOrdersTable.tsx:127 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:213 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:283 @@ -4721,11 +4728,11 @@ msgstr "SKU" msgid "Received" msgstr "Ontvangen" -#: src/forms/PurchaseOrderForms.tsx:817 +#: src/forms/PurchaseOrderForms.tsx:869 msgid "Receive Line Items" msgstr "Ontvang regelitems" -#: src/forms/PurchaseOrderForms.tsx:823 +#: src/forms/PurchaseOrderForms.tsx:875 msgid "Items received" msgstr "Ontvangen items" @@ -4737,7 +4744,7 @@ msgstr "Ontvang regelitems" msgid "Item received into stock" msgstr "Item ontvangen in voorraad" -#: src/forms/SalesOrderForms.tsx:401 +#: src/forms/SalesOrderForms.tsx:419 msgid "Leave blank to use the order address" msgstr "" @@ -5932,6 +5939,9 @@ msgstr "" #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:310 #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:401 +#: src/tables/build/BuildAllocatedStockTable.tsx:181 +#: src/tables/build/BuildLineTable.tsx:668 +#: src/tables/sales/SalesOrderAllocationTable.tsx:220 msgid "Confirm Removal" msgstr "" @@ -6870,8 +6880,8 @@ msgstr "Extern" #: src/pages/sales/ReturnOrderDetail.tsx:108 #: src/pages/sales/SalesOrderDetail.tsx:98 #: src/tables/ColumnRenderers.tsx:321 -#: src/tables/build/BuildAllocatedStockTable.tsx:115 -#: src/tables/build/BuildLineTable.tsx:352 +#: src/tables/build/BuildAllocatedStockTable.tsx:112 +#: src/tables/build/BuildLineTable.tsx:353 msgid "Reference" msgstr "Verwijzing" @@ -7132,7 +7142,7 @@ msgstr "Bestelling annuleren" #: src/pages/build/BuildDetail.tsx:742 #: src/pages/stock/StockDetail.tsx:344 -#: src/tables/build/BuildAllocatedStockTable.tsx:85 +#: src/tables/build/BuildAllocatedStockTable.tsx:82 #: src/tables/part/PartBuildAllocationsTable.tsx:45 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:157 #: src/tables/stock/StockTrackingTable.tsx:109 @@ -7600,7 +7610,7 @@ msgstr "Trefwoorden" #: src/pages/part/PartDetail.tsx:542 #: src/tables/bom/BomTable.tsx:439 -#: src/tables/build/BuildLineTable.tsx:305 +#: src/tables/build/BuildLineTable.tsx:306 #: src/tables/part/PartTable.tsx:319 #: src/tables/sales/SalesOrderLineItemTable.tsx:138 msgid "Available Stock" @@ -7608,7 +7618,7 @@ msgstr "Beschikbare voorraad" #: src/pages/part/PartDetail.tsx:548 #: src/tables/bom/BomTable.tsx:341 -#: src/tables/build/BuildLineTable.tsx:267 +#: src/tables/build/BuildLineTable.tsx:268 #: src/tables/sales/SalesOrderLineItemTable.tsx:180 msgid "On order" msgstr "In bestelling" @@ -7782,7 +7792,7 @@ msgstr "Order" #: src/pages/part/PartDetail.tsx:1144 #: src/pages/stock/StockDetail.tsx:884 -#: src/tables/build/BuildLineTable.tsx:761 +#: src/tables/build/BuildLineTable.tsx:768 msgid "Order Stock" msgstr "Voorraad bestelling" @@ -9219,13 +9229,13 @@ msgstr "Virtueel deel" #~ msgstr "Show asssmbled items" #: src/tables/bom/BomTable.tsx:315 -#: src/tables/build/BuildLineTable.tsx:276 +#: src/tables/build/BuildLineTable.tsx:277 #: src/tables/part/PartTable.tsx:145 msgid "External stock" msgstr "Externe voorraad" #: src/tables/bom/BomTable.tsx:323 -#: src/tables/build/BuildLineTable.tsx:239 +#: src/tables/build/BuildLineTable.tsx:240 msgid "Includes substitute stock" msgstr "Inclusief vervangend voorraad" @@ -9234,7 +9244,7 @@ msgstr "Inclusief vervangend voorraad" #~ msgstr "Edit Bom Item" #: src/tables/bom/BomTable.tsx:332 -#: src/tables/build/BuildLineTable.tsx:249 +#: src/tables/build/BuildLineTable.tsx:250 #: src/tables/sales/SalesOrderLineItemTable.tsx:166 msgid "Includes variant stock" msgstr "Bevat variant voorraad" @@ -9272,8 +9282,8 @@ msgid "Stock Information" msgstr "Voorraad informatie" #: src/tables/bom/BomTable.tsx:399 -#: src/tables/build/BuildLineTable.tsx:496 -#: src/tables/build/BuildLineTable.tsx:537 +#: src/tables/build/BuildLineTable.tsx:497 +#: src/tables/build/BuildLineTable.tsx:538 msgid "Consumable item" msgstr "Verbruiksartikel" @@ -9282,7 +9292,7 @@ msgid "No available stock" msgstr "Geen beschikbare voorraad" #: src/tables/bom/BomTable.tsx:420 -#: src/tables/build/BuildLineTable.tsx:213 +#: src/tables/build/BuildLineTable.tsx:214 msgid "Show testable items" msgstr "Getest items weergeven" @@ -9291,7 +9301,7 @@ msgid "Show trackable items" msgstr "Traceerbare items tonen" #: src/tables/bom/BomTable.tsx:430 -#: src/tables/build/BuildLineTable.tsx:208 +#: src/tables/build/BuildLineTable.tsx:209 msgid "Show assembled items" msgstr "Gecreëerde items weergeven" @@ -9335,7 +9345,7 @@ msgstr "Toon items die variant vervanging toestaan" #: src/tables/bom/BomTable.tsx:464 #: src/tables/bom/UsedInTable.tsx:85 -#: src/tables/build/BuildLineTable.tsx:202 +#: src/tables/build/BuildLineTable.tsx:203 msgid "Optional" msgstr "Optioneel" @@ -9345,7 +9355,7 @@ msgid "Show optional items" msgstr "Optionele items weergeven" #: src/tables/bom/BomTable.tsx:469 -#: src/tables/build/BuildLineTable.tsx:197 +#: src/tables/build/BuildLineTable.tsx:198 msgid "Consumable" msgstr "Verbruiksartikelen" @@ -9433,7 +9443,7 @@ msgid "Bill of materials cannot be edited, as the part is locked" msgstr "Factuur van materialen kan niet worden bewerkt, omdat het onderdeel is vergrendeld" #: src/tables/bom/UsedInTable.tsx:34 -#: src/tables/build/BuildLineTable.tsx:207 +#: src/tables/build/BuildLineTable.tsx:208 #: src/tables/part/ParametricPartTable.tsx:364 #: src/tables/part/PartBuildAllocationsTable.tsx:60 #: src/tables/part/PartTable.tsx:209 @@ -9455,11 +9465,11 @@ msgstr "Volgbaar" msgid "Show trackable assemblies" msgstr "Traceerbare items tonen" -#: src/tables/build/BuildAllocatedStockTable.tsx:67 +#: src/tables/build/BuildAllocatedStockTable.tsx:64 msgid "Allocated to Output" msgstr "Toegewezen aan uitvoer" -#: src/tables/build/BuildAllocatedStockTable.tsx:68 +#: src/tables/build/BuildAllocatedStockTable.tsx:65 msgid "Show items allocated to a build output" msgstr "Toon items toegewezen aan bouwuitvoer" @@ -9472,7 +9482,7 @@ msgstr "Toon items toegewezen aan bouwuitvoer" #~ msgid "Include orders for part variants" #~ msgstr "Include orders for part variants" -#: src/tables/build/BuildAllocatedStockTable.tsx:97 +#: src/tables/build/BuildAllocatedStockTable.tsx:94 #: src/tables/part/PartBuildAllocationsTable.tsx:84 #: src/tables/part/PartPurchaseOrdersTable.tsx:132 #: src/tables/part/PartSalesAllocationsTable.tsx:69 @@ -9482,40 +9492,58 @@ msgid "Order Status" msgstr "Status van bestelling" #: src/tables/build/BuildAllocatedStockTable.tsx:164 -#~ msgid "Edit Build Item" -#~ msgstr "Edit Build Item" - -#: src/tables/build/BuildAllocatedStockTable.tsx:167 -#: src/tables/build/BuildLineTable.tsx:650 +#: src/tables/build/BuildLineTable.tsx:651 msgid "Edit Stock Allocation" msgstr "Wijzig voorraadtoewijzing" +#: src/tables/build/BuildAllocatedStockTable.tsx:164 +#~ msgid "Edit Build Item" +#~ msgstr "Edit Build Item" + #: src/tables/build/BuildAllocatedStockTable.tsx:174 #~ msgid "Delete Build Item" #~ msgstr "Delete Build Item" +#: src/tables/build/BuildAllocatedStockTable.tsx:177 +#: src/tables/build/BuildLineTable.tsx:664 +#: src/tables/sales/SalesOrderAllocationTable.tsx:218 +msgid "Remove Allocated Stock" +msgstr "" + #: src/tables/build/BuildAllocatedStockTable.tsx:180 #: src/tables/build/BuildLineTable.tsx:663 -msgid "Delete Stock Allocation" -msgstr "Verwijder voorraadtoewijzing" +#~ msgid "Delete Stock Allocation" +#~ msgstr "Delete Stock Allocation" -#: src/tables/build/BuildAllocatedStockTable.tsx:239 +#: src/tables/build/BuildAllocatedStockTable.tsx:182 +#: src/tables/build/BuildLineTable.tsx:669 +#: src/tables/sales/SalesOrderAllocationTable.tsx:221 +msgid "Are you sure you want to remove this allocated stock from the order?" +msgstr "" + +#: src/tables/build/BuildAllocatedStockTable.tsx:242 msgid "Consume" msgstr "Verbruik" +#: src/tables/build/BuildAllocatedStockTable.tsx:259 +#: src/tables/build/BuildLineTable.tsx:112 +#: src/tables/sales/SalesOrderAllocationTable.tsx:248 +msgid "Remove allocated stock" +msgstr "" + #: src/tables/build/BuildLineTable.tsx:59 #~ msgid "Show lines with available stock" #~ msgstr "Show lines with available stock" -#: src/tables/build/BuildLineTable.tsx:120 +#: src/tables/build/BuildLineTable.tsx:121 msgid "View Stock Item" msgstr "Voorraad item weergeven" -#: src/tables/build/BuildLineTable.tsx:183 +#: src/tables/build/BuildLineTable.tsx:184 msgid "Show fully allocated lines" msgstr "Toon volledig toegewezen lijnen" -#: src/tables/build/BuildLineTable.tsx:188 +#: src/tables/build/BuildLineTable.tsx:189 msgid "Show fully consumed lines" msgstr "Toon volledig verbruikte lijnen" @@ -9523,124 +9551,124 @@ msgstr "Toon volledig verbruikte lijnen" #~ msgid "Show allocated lines" #~ msgstr "Show allocated lines" -#: src/tables/build/BuildLineTable.tsx:193 +#: src/tables/build/BuildLineTable.tsx:194 msgid "Show items with sufficient available stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:198 +#: src/tables/build/BuildLineTable.tsx:199 msgid "Show consumable lines" msgstr "Toon verbruikte items" -#: src/tables/build/BuildLineTable.tsx:203 +#: src/tables/build/BuildLineTable.tsx:204 msgid "Show optional lines" msgstr "Toon optionele regels" -#: src/tables/build/BuildLineTable.tsx:212 +#: src/tables/build/BuildLineTable.tsx:213 #: src/tables/part/PartTable.tsx:233 msgid "Testable" msgstr "Testbaar" -#: src/tables/build/BuildLineTable.tsx:217 +#: src/tables/build/BuildLineTable.tsx:218 #: src/tables/stock/StockItemTable.tsx:388 msgid "Tracked" msgstr "Gevolgd" -#: src/tables/build/BuildLineTable.tsx:218 +#: src/tables/build/BuildLineTable.tsx:219 msgid "Show tracked lines" msgstr "Toon gevolgde lijnen" -#: src/tables/build/BuildLineTable.tsx:223 +#: src/tables/build/BuildLineTable.tsx:224 msgid "Show items with stock on order" msgstr "" -#: src/tables/build/BuildLineTable.tsx:258 +#: src/tables/build/BuildLineTable.tsx:259 #: src/tables/sales/SalesOrderLineItemTable.tsx:172 msgid "In production" msgstr "In productie" -#: src/tables/build/BuildLineTable.tsx:286 +#: src/tables/build/BuildLineTable.tsx:287 msgid "Insufficient stock" msgstr "Onvoldoende voorraad" -#: src/tables/build/BuildLineTable.tsx:302 +#: src/tables/build/BuildLineTable.tsx:303 #: src/tables/sales/SalesOrderLineItemTable.tsx:160 #: src/tables/stock/StockItemTable.tsx:191 msgid "No stock available" msgstr "Geen voorraad beschikbaar" -#: src/tables/build/BuildLineTable.tsx:375 +#: src/tables/build/BuildLineTable.tsx:376 msgid "Gets Inherited" msgstr "Wordt overgenomen" -#: src/tables/build/BuildLineTable.tsx:388 +#: src/tables/build/BuildLineTable.tsx:389 msgid "Unit Quantity" msgstr "Eenheid hoeveelheid" -#: src/tables/build/BuildLineTable.tsx:415 +#: src/tables/build/BuildLineTable.tsx:416 msgid "Setup Quantity" msgstr "Totale hoeveelheid" -#: src/tables/build/BuildLineTable.tsx:424 +#: src/tables/build/BuildLineTable.tsx:425 msgid "Attrition" msgstr "Attriatie" -#: src/tables/build/BuildLineTable.tsx:432 +#: src/tables/build/BuildLineTable.tsx:433 msgid "Rounding Multiple" msgstr "Afronding meerdere" -#: src/tables/build/BuildLineTable.tsx:441 +#: src/tables/build/BuildLineTable.tsx:442 msgid "BOM Information" msgstr "BOM Information" -#: src/tables/build/BuildLineTable.tsx:515 +#: src/tables/build/BuildLineTable.tsx:516 #: src/tables/part/PartBuildAllocationsTable.tsx:102 msgid "Fully allocated" msgstr "Volledig toegewezen" -#: src/tables/build/BuildLineTable.tsx:563 +#: src/tables/build/BuildLineTable.tsx:564 #: src/tables/sales/SalesOrderLineItemTable.tsx:311 msgid "Create Build Order" msgstr "Maak bouw Order" -#: src/tables/build/BuildLineTable.tsx:592 +#: src/tables/build/BuildLineTable.tsx:593 msgid "Auto allocation in progress" msgstr "Automatische toewijzing in uitvoering" -#: src/tables/build/BuildLineTable.tsx:595 -#: src/tables/build/BuildLineTable.tsx:802 +#: src/tables/build/BuildLineTable.tsx:596 +#: src/tables/build/BuildLineTable.tsx:809 msgid "Auto Allocate Stock" msgstr "Automatisch voorraad toewijzen" -#: src/tables/build/BuildLineTable.tsx:596 +#: src/tables/build/BuildLineTable.tsx:597 msgid "Automatically allocate stock to this build according to the selected options" msgstr "Voorraad automatisch toewijzen aan deze build volgens de geselecteerde opties" -#: src/tables/build/BuildLineTable.tsx:616 -#: src/tables/build/BuildLineTable.tsx:630 -#: src/tables/build/BuildLineTable.tsx:751 -#: src/tables/build/BuildLineTable.tsx:852 +#: src/tables/build/BuildLineTable.tsx:617 +#: src/tables/build/BuildLineTable.tsx:631 +#: src/tables/build/BuildLineTable.tsx:758 +#: src/tables/build/BuildLineTable.tsx:859 #: src/tables/build/BuildOutputTable.tsx:355 #: src/tables/build/BuildOutputTable.tsx:360 msgid "Deallocate Stock" msgstr "Voorraad ongedaan maken" -#: src/tables/build/BuildLineTable.tsx:632 +#: src/tables/build/BuildLineTable.tsx:633 msgid "Deallocate all untracked stock for this build order" msgstr "Maak de toewijzing van alle niet bijgehouden voorraad voor deze bouworder ongedaan" -#: src/tables/build/BuildLineTable.tsx:634 +#: src/tables/build/BuildLineTable.tsx:635 msgid "Deallocate stock from the selected line item" msgstr "Maak de toewijzing van voorraad van het geselecteerde regelitem ongedaan" -#: src/tables/build/BuildLineTable.tsx:638 +#: src/tables/build/BuildLineTable.tsx:639 msgid "Stock has been deallocated" msgstr "De voorraad is ongedaan gemaakt" -#: src/tables/build/BuildLineTable.tsx:771 +#: src/tables/build/BuildLineTable.tsx:778 msgid "Build Stock" msgstr "Bouw voorraad" -#: src/tables/build/BuildLineTable.tsx:784 +#: src/tables/build/BuildLineTable.tsx:791 #: src/tables/sales/SalesOrderLineItemTable.tsx:487 msgid "View Part" msgstr "Onderdeel weergeven" @@ -9739,7 +9767,7 @@ msgid "Serialize Build Output" msgstr "Serialiseren Build uitvoer" #: src/tables/build/BuildOutputTable.tsx:405 -#: src/tables/part/PartTestResultTable.tsx:310 +#: src/tables/part/PartTestResultTable.tsx:318 #: src/tables/stock/StockItemTable.tsx:328 msgid "Filter by stock status" msgstr "Filter op voorraad status" @@ -9964,8 +9992,8 @@ msgid "View Item" msgstr "Item bekijken" #: src/tables/general/ExtraLineItemTable.tsx:95 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:299 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:403 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:300 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:405 #: src/tables/sales/ReturnOrderLineItemTable.tsx:83 #: src/tables/sales/ReturnOrderLineItemTable.tsx:187 #: src/tables/sales/SalesOrderLineItemTable.tsx:252 @@ -9974,14 +10002,14 @@ msgid "Add Line Item" msgstr "Regel item toevoegen" #: src/tables/general/ExtraLineItemTable.tsx:108 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:320 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:322 #: src/tables/sales/ReturnOrderLineItemTable.tsx:96 #: src/tables/sales/SalesOrderLineItemTable.tsx:271 msgid "Edit Line Item" msgstr "Regel item bewerken" #: src/tables/general/ExtraLineItemTable.tsx:117 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:329 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:331 #: src/tables/sales/ReturnOrderLineItemTable.tsx:105 #: src/tables/sales/SalesOrderLineItemTable.tsx:280 msgid "Delete Line Item" @@ -10273,7 +10301,7 @@ msgid "Required Stock" msgstr "Vereiste voorraad" #: src/tables/part/PartBuildAllocationsTable.tsx:124 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:381 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:383 msgid "View Build Order" msgstr "Bekijk bouwopdracht" @@ -10617,8 +10645,8 @@ msgstr "" #: src/tables/part/PartTestResultTable.tsx:103 #: src/tables/part/PartTestResultTable.tsx:181 -#: src/tables/part/PartTestResultTable.tsx:320 -#: src/tables/part/PartTestResultTable.tsx:334 +#: src/tables/part/PartTestResultTable.tsx:328 +#: src/tables/part/PartTestResultTable.tsx:342 #: src/tables/stock/StockItemTestResultTable.tsx:296 #: src/tables/stock/StockItemTestResultTable.tsx:368 #: src/tables/stock/StockItemTestResultTable.tsx:429 @@ -10643,7 +10671,7 @@ msgstr "Test resultaten toegevoegd" msgid "No Result" msgstr "Geen resultaat" -#: src/tables/part/PartTestResultTable.tsx:298 +#: src/tables/part/PartTestResultTable.tsx:306 msgid "Show build outputs currently in production" msgstr "Toon bouw outputs die momenteel in productie zijn" @@ -11073,7 +11101,7 @@ msgid "Show manufacturer parts for active manufacturers." msgstr "" #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:115 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:397 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:399 msgid "Import Line Items" msgstr "Importeer regelitems" @@ -11099,11 +11127,11 @@ msgstr "Toon regelitems die zijn ontvangen" #~ msgid "Add line item" #~ msgstr "Add line item" -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:350 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:352 msgid "Receive line item" msgstr "Ontvang artikel items" -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:414 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:416 msgid "Receive items" msgstr "Items ontvangen" @@ -11201,25 +11229,25 @@ msgid "Not shipped" msgstr "Niet verzonden" #: src/tables/sales/SalesOrderAllocationTable.tsx:211 -#: src/tables/sales/SalesOrderAllocationTable.tsx:229 +#: src/tables/sales/SalesOrderAllocationTable.tsx:235 msgid "Edit Allocation" msgstr "Bewerk voorraadtoewijzing" #: src/tables/sales/SalesOrderAllocationTable.tsx:218 #: src/tables/sales/SalesOrderAllocationTable.tsx:241 -msgid "Delete Allocation" -msgstr "Verwijder toewijzing" +#~ msgid "Delete Allocation" +#~ msgstr "Delete Allocation" -#: src/tables/sales/SalesOrderAllocationTable.tsx:252 -#: src/tables/sales/SalesOrderAllocationTable.tsx:253 +#: src/tables/sales/SalesOrderAllocationTable.tsx:261 +#: src/tables/sales/SalesOrderAllocationTable.tsx:262 msgid "View Shipment" msgstr "Verzending weergeven" -#: src/tables/sales/SalesOrderAllocationTable.tsx:308 +#: src/tables/sales/SalesOrderAllocationTable.tsx:317 msgid "Assign to Shipment" msgstr "Toewijzen aan zending" -#: src/tables/sales/SalesOrderAllocationTable.tsx:324 +#: src/tables/sales/SalesOrderAllocationTable.tsx:333 msgid "Assign to shipment" msgstr "Toewijzen aan zending" diff --git a/src/frontend/src/locales/no/messages.po b/src/frontend/src/locales/no/messages.po index a7383ab471..4f2f123022 100644 --- a/src/frontend/src/locales/no/messages.po +++ b/src/frontend/src/locales/no/messages.po @@ -8,7 +8,7 @@ msgstr "" "Language: no\n" "Project-Id-Version: inventree\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2025-11-19 19:39\n" +"PO-Revision-Date: 2025-11-22 06:25\n" "Last-Translator: \n" "Language-Team: Norwegian\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" @@ -56,7 +56,7 @@ msgstr "Avbryt" #: lib/components/RowActions.tsx:136 #: src/components/nav/NavigationDrawer.tsx:190 -#: src/forms/PurchaseOrderForms.tsx:802 +#: src/forms/PurchaseOrderForms.tsx:854 #: src/forms/StockForms.tsx:796 #: src/forms/StockForms.tsx:843 #: src/forms/StockForms.tsx:889 @@ -103,9 +103,9 @@ msgstr "Nei" #: src/forms/BuildForms.tsx:630 #: src/forms/BuildForms.tsx:793 #: src/forms/BuildForms.tsx:896 -#: src/forms/PurchaseOrderForms.tsx:798 +#: src/forms/PurchaseOrderForms.tsx:850 #: src/forms/ReturnOrderForms.tsx:242 -#: src/forms/SalesOrderForms.tsx:305 +#: src/forms/SalesOrderForms.tsx:323 #: src/forms/StockForms.tsx:360 #: src/forms/StockForms.tsx:791 #: src/forms/StockForms.tsx:838 @@ -119,6 +119,7 @@ msgstr "Nei" #: src/pages/build/BuildDetail.tsx:200 #: src/pages/part/PartDetail.tsx:1207 #: src/tables/ColumnRenderers.tsx:91 +#: src/tables/part/PartTestResultTable.tsx:247 #: src/tables/part/RelatedPartTable.tsx:53 #: src/tables/stock/StockTrackingTable.tsx:87 msgid "Part" @@ -158,7 +159,7 @@ msgstr "" #: src/components/wizards/OrderPartsWizard.tsx:290 #: src/pages/company/SupplierPartDetail.tsx:413 #: src/pages/stock/StockDetail.tsx:289 -#: src/tables/build/BuildAllocatedStockTable.tsx:155 +#: src/tables/build/BuildAllocatedStockTable.tsx:152 #: src/tables/part/PartPurchaseOrdersTable.tsx:50 #: src/tables/purchasing/SupplierPartTable.tsx:83 #: src/tables/stock/StockItemTable.tsx:247 @@ -201,9 +202,9 @@ msgstr "Delkategorier" #: src/forms/BuildForms.tsx:473 #: src/forms/BuildForms.tsx:633 #: src/forms/BuildForms.tsx:794 -#: src/forms/SalesOrderForms.tsx:307 +#: src/forms/SalesOrderForms.tsx:325 #: src/pages/stock/StockDetail.tsx:1005 -#: src/tables/part/PartTestResultTable.tsx:248 +#: src/tables/part/PartTestResultTable.tsx:256 #: src/tables/stock/StockTrackingTable.tsx:48 #: src/tables/stock/StockTrackingTable.tsx:55 msgid "Stock Item" @@ -517,7 +518,7 @@ msgstr "" #: src/components/dashboard/DashboardLayout.tsx:281 #: src/components/editors/NotesEditor.tsx:74 #: src/components/editors/TemplateEditor/TemplateEditor.tsx:158 -#: src/components/forms/fields/ApiFormField.tsx:273 +#: src/components/forms/fields/ApiFormField.tsx:237 #: src/components/forms/fields/TableField.tsx:45 #: src/components/importer/ImportDataSelector.tsx:192 #: src/components/importer/ImporterColumnSelector.tsx:234 @@ -642,8 +643,8 @@ msgstr "" #: src/components/barcodes/BarcodeScanDialog.tsx:49 #: src/components/buttons/ScanButton.tsx:15 #: src/components/nav/NavigationDrawer.tsx:122 -#: src/forms/PurchaseOrderForms.tsx:457 -#: src/forms/PurchaseOrderForms.tsx:563 +#: src/forms/PurchaseOrderForms.tsx:509 +#: src/forms/PurchaseOrderForms.tsx:615 msgid "Scan Barcode" msgstr "Skann strekkode" @@ -728,7 +729,7 @@ msgstr "" #: src/components/barcodes/QRCode.tsx:205 #: src/components/items/ActionDropdown.tsx:192 -#: src/forms/PurchaseOrderForms.tsx:554 +#: src/forms/PurchaseOrderForms.tsx:606 msgid "Unlink Barcode" msgstr "Fjern strekkodekobling" @@ -1216,6 +1217,12 @@ msgstr "" #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:884 #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:903 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:254 +#: src/tables/build/BuildAllocatedStockTable.tsx:178 +#: src/tables/build/BuildAllocatedStockTable.tsx:258 +#: src/tables/build/BuildLineTable.tsx:111 +#: src/tables/build/BuildLineTable.tsx:665 +#: src/tables/sales/SalesOrderAllocationTable.tsx:224 +#: src/tables/sales/SalesOrderAllocationTable.tsx:247 msgid "Remove" msgstr "Fjern" @@ -1241,7 +1248,7 @@ msgid "Upload Error" msgstr "Opplastningsfeil" #: src/components/details/DetailsImage.tsx:250 -#: src/components/forms/fields/TextField.tsx:65 +#: src/components/forms/fields/AutoFillRightSection.tsx:34 msgid "Clear" msgstr "" @@ -1817,10 +1824,14 @@ msgstr "Stoppet" msgid "Running" msgstr "" -#: src/components/forms/fields/ApiFormField.tsx:233 +#: src/components/forms/fields/ApiFormField.tsx:197 msgid "Select file to upload" msgstr "" +#: src/components/forms/fields/AutoFillRightSection.tsx:47 +msgid "Accept suggested value" +msgstr "" + #: src/components/forms/fields/DateField.tsx:76 msgid "Select date" msgstr "" @@ -1875,10 +1886,6 @@ msgstr "" msgid "Add new row" msgstr "" -#: src/components/forms/fields/TextField.tsx:82 -msgid "Accept suggested value" -msgstr "" - #: src/components/images/DetailsImage.tsx:252 #~ msgid "Select image" #~ msgstr "Select image" @@ -2225,8 +2232,8 @@ msgstr "" #: src/pages/part/PartDetail.tsx:994 #: src/pages/stock/StockDetail.tsx:265 #: src/pages/stock/StockDetail.tsx:942 -#: src/tables/build/BuildAllocatedStockTable.tsx:135 -#: src/tables/build/BuildLineTable.tsx:192 +#: src/tables/build/BuildAllocatedStockTable.tsx:132 +#: src/tables/build/BuildLineTable.tsx:193 #: src/tables/part/PartTable.tsx:137 #: src/tables/stock/StockItemTable.tsx:182 #: src/tables/stock/StockItemTable.tsx:343 @@ -2784,7 +2791,7 @@ msgstr "" #: src/pages/sales/SalesOrderDetail.tsx:119 #: src/pages/stock/LocationDetail.tsx:102 #: src/tables/ColumnRenderers.tsx:278 -#: src/tables/build/BuildAllocatedStockTable.tsx:91 +#: src/tables/build/BuildAllocatedStockTable.tsx:88 #: src/tables/machine/MachineTypeTable.tsx:161 #: src/tables/machine/MachineTypeTable.tsx:257 #: src/tables/plugin/PluginListTable.tsx:110 @@ -2966,7 +2973,7 @@ msgstr "Ingen lagerbeholdning" #: src/pages/company/SupplierPartDetail.tsx:394 #: src/pages/part/PartDetail.tsx:1015 #: src/tables/bom/BomTable.tsx:444 -#: src/tables/build/BuildLineTable.tsx:222 +#: src/tables/build/BuildLineTable.tsx:223 #: src/tables/part/PartTable.tsx:108 msgid "On Order" msgstr "I bestilling" @@ -2976,7 +2983,7 @@ msgstr "I bestilling" #: src/pages/part/PartDetail.tsx:587 #: src/pages/part/PartDetail.tsx:1021 #: src/pages/stock/StockDetail.tsx:925 -#: src/tables/part/PartTestResultTable.tsx:297 +#: src/tables/part/PartTestResultTable.tsx:305 #: src/tables/stock/StockItemTable.tsx:359 msgid "In Production" msgstr "Under produksjon" @@ -3000,7 +3007,7 @@ msgstr "Kategori" #: src/components/render/Stock.tsx:114 #: src/components/render/Stock.tsx:132 #: src/forms/BuildForms.tsx:795 -#: src/forms/PurchaseOrderForms.tsx:595 +#: src/forms/PurchaseOrderForms.tsx:647 #: src/forms/StockForms.tsx:792 #: src/forms/StockForms.tsx:839 #: src/forms/StockForms.tsx:885 @@ -3023,7 +3030,7 @@ msgstr "" #: src/components/render/Stock.tsx:99 #: src/pages/stock/StockDetail.tsx:198 #: src/pages/stock/StockDetail.tsx:930 -#: src/tables/build/BuildAllocatedStockTable.tsx:121 +#: src/tables/build/BuildAllocatedStockTable.tsx:118 #: src/tables/build/BuildOutputTable.tsx:107 #: src/tables/sales/SalesOrderAllocationTable.tsx:142 msgid "Serial Number" @@ -3034,9 +3041,9 @@ msgstr "Serienummer" #: src/forms/BuildForms.tsx:240 #: src/forms/BuildForms.tsx:634 #: src/forms/BuildForms.tsx:797 -#: src/forms/PurchaseOrderForms.tsx:801 +#: src/forms/PurchaseOrderForms.tsx:853 #: src/forms/ReturnOrderForms.tsx:243 -#: src/forms/SalesOrderForms.tsx:308 +#: src/forms/SalesOrderForms.tsx:326 #: src/forms/StockForms.tsx:841 #: src/pages/part/PartStockHistoryDetail.tsx:56 #: src/pages/part/PartStockHistoryDetail.tsx:210 @@ -3046,9 +3053,9 @@ msgstr "Serienummer" #: src/pages/part/pricing/PriceBreakPanel.tsx:172 #: src/pages/stock/StockDetail.tsx:258 #: src/pages/stock/StockDetail.tsx:936 -#: src/tables/build/BuildLineTable.tsx:86 +#: src/tables/build/BuildLineTable.tsx:83 #: src/tables/part/PartPurchaseOrdersTable.tsx:94 -#: src/tables/part/PartTestResultTable.tsx:269 +#: src/tables/part/PartTestResultTable.tsx:277 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:175 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:206 #: src/tables/purchasing/SupplierPriceBreakTable.tsx:69 @@ -3070,7 +3077,7 @@ msgstr "Antall" #: src/forms/StockForms.tsx:1048 #: src/forms/StockForms.tsx:1096 #: src/forms/StockForms.tsx:1140 -#: src/tables/build/BuildLineTable.tsx:96 +#: src/tables/build/BuildLineTable.tsx:93 msgid "Batch" msgstr "" @@ -3755,7 +3762,7 @@ msgid "In Stock" msgstr "På lager" #: src/components/wizards/OrderPartsWizard.tsx:146 -#: src/tables/build/BuildLineTable.tsx:404 +#: src/tables/build/BuildLineTable.tsx:405 msgid "Required Quantity" msgstr "" @@ -3847,7 +3854,7 @@ msgid "Please correct the errors in the selected parts" msgstr "" #: src/components/wizards/OrderPartsWizard.tsx:587 -#: src/tables/build/BuildLineTable.tsx:815 +#: src/tables/build/BuildLineTable.tsx:822 #: src/tables/part/PartTable.tsx:522 #: src/tables/sales/SalesOrderLineItemTable.tsx:370 msgid "Order Parts" @@ -4349,9 +4356,9 @@ msgstr "" #: src/forms/BuildForms.tsx:333 #: src/forms/BuildForms.tsx:408 #: src/forms/BuildForms.tsx:685 -#: src/tables/build/BuildAllocatedStockTable.tsx:150 +#: src/tables/build/BuildAllocatedStockTable.tsx:147 #: src/tables/build/BuildOutputTable.tsx:582 -#: src/tables/part/PartTestResultTable.tsx:272 +#: src/tables/part/PartTestResultTable.tsx:280 msgid "Build Output" msgstr "" @@ -4362,7 +4369,7 @@ msgstr "" #: src/forms/BuildForms.tsx:336 #: src/forms/BuildForms.tsx:411 #: src/forms/BuildForms.tsx:475 -#: src/forms/PurchaseOrderForms.tsx:717 +#: src/forms/PurchaseOrderForms.tsx:769 #: src/forms/ReturnOrderForms.tsx:197 #: src/forms/ReturnOrderForms.tsx:244 #: src/forms/StockForms.tsx:712 @@ -4377,7 +4384,7 @@ msgstr "" #: src/tables/build/BuildOutputTable.tsx:404 #: src/tables/machine/MachineListTable.tsx:387 #: src/tables/part/PartPurchaseOrdersTable.tsx:38 -#: src/tables/part/PartTestResultTable.tsx:309 +#: src/tables/part/PartTestResultTable.tsx:317 #: src/tables/sales/ReturnOrderLineItemTable.tsx:138 #: src/tables/sales/ReturnOrderLineItemTable.tsx:176 #: src/tables/settings/CustomStateTable.tsx:79 @@ -4450,8 +4457,8 @@ msgstr "" #: src/pages/stock/StockDetail.tsx:153 #: src/tables/bom/BomTable.tsx:134 #: src/tables/bom/UsedInTable.tsx:40 -#: src/tables/build/BuildAllocatedStockTable.tsx:108 -#: src/tables/build/BuildLineTable.tsx:336 +#: src/tables/build/BuildAllocatedStockTable.tsx:105 +#: src/tables/build/BuildLineTable.tsx:337 #: src/tables/build/BuildOrderTable.tsx:79 #: src/tables/part/PartSalesAllocationsTable.tsx:61 #: src/tables/part/RelatedPartTable.tsx:73 @@ -4466,47 +4473,47 @@ msgstr "IPN" #: src/forms/BuildForms.tsx:632 #: src/forms/BuildForms.tsx:796 #: src/forms/BuildForms.tsx:897 -#: src/forms/SalesOrderForms.tsx:306 -#: src/tables/build/BuildAllocatedStockTable.tsx:139 -#: src/tables/build/BuildLineTable.tsx:182 +#: src/forms/SalesOrderForms.tsx:324 +#: src/tables/build/BuildAllocatedStockTable.tsx:136 +#: src/tables/build/BuildLineTable.tsx:183 #: src/tables/sales/SalesOrderLineItemTable.tsx:342 #: src/tables/stock/StockItemTable.tsx:338 msgid "Allocated" msgstr "Tildelt" #: src/forms/BuildForms.tsx:667 -#: src/forms/SalesOrderForms.tsx:295 +#: src/forms/SalesOrderForms.tsx:313 #: src/pages/build/BuildDetail.tsx:108 #: src/pages/build/BuildDetail.tsx:326 msgid "Source Location" msgstr "" #: src/forms/BuildForms.tsx:668 -#: src/forms/SalesOrderForms.tsx:296 +#: src/forms/SalesOrderForms.tsx:314 msgid "Select the source location for the stock allocation" msgstr "" #: src/forms/BuildForms.tsx:700 -#: src/forms/SalesOrderForms.tsx:336 -#: src/tables/build/BuildLineTable.tsx:574 -#: src/tables/build/BuildLineTable.tsx:731 -#: src/tables/build/BuildLineTable.tsx:830 +#: src/forms/SalesOrderForms.tsx:354 +#: src/tables/build/BuildLineTable.tsx:575 +#: src/tables/build/BuildLineTable.tsx:738 +#: src/tables/build/BuildLineTable.tsx:837 #: src/tables/sales/SalesOrderLineItemTable.tsx:380 #: src/tables/sales/SalesOrderLineItemTable.tsx:406 msgid "Allocate Stock" msgstr "Tildel lagerbeholdning" #: src/forms/BuildForms.tsx:703 -#: src/forms/SalesOrderForms.tsx:341 +#: src/forms/SalesOrderForms.tsx:359 msgid "Stock items allocated" msgstr "" #: src/forms/BuildForms.tsx:816 #: src/forms/BuildForms.tsx:917 -#: src/tables/build/BuildAllocatedStockTable.tsx:240 -#: src/tables/build/BuildAllocatedStockTable.tsx:272 -#: src/tables/build/BuildLineTable.tsx:741 -#: src/tables/build/BuildLineTable.tsx:864 +#: src/tables/build/BuildAllocatedStockTable.tsx:243 +#: src/tables/build/BuildAllocatedStockTable.tsx:279 +#: src/tables/build/BuildLineTable.tsx:748 +#: src/tables/build/BuildLineTable.tsx:871 msgid "Consume Stock" msgstr "" @@ -4521,21 +4528,21 @@ msgstr "" #~ msgstr "Stock items consumed" #: src/forms/BuildForms.tsx:853 -#: src/tables/build/BuildLineTable.tsx:514 +#: src/tables/build/BuildLineTable.tsx:515 #: src/tables/part/PartBuildAllocationsTable.tsx:101 msgid "Fully consumed" msgstr "" #: src/forms/BuildForms.tsx:898 -#: src/tables/build/BuildLineTable.tsx:187 +#: src/tables/build/BuildLineTable.tsx:188 #: src/tables/stock/StockItemTable.tsx:367 msgid "Consumed" msgstr "" #: src/forms/CommonForms.tsx:88 -#: src/forms/PurchaseOrderForms.tsx:125 +#: src/forms/PurchaseOrderForms.tsx:176 #: src/forms/ReturnOrderForms.tsx:138 -#: src/forms/SalesOrderForms.tsx:164 +#: src/forms/SalesOrderForms.tsx:182 msgid "Select project code for this line item" msgstr "" @@ -4572,32 +4579,16 @@ msgstr "Overordnet del-kategori" msgid "Subscribe to notifications for this category" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:388 -msgid "Assign Batch Code and Serial Numbers" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:390 -msgid "Assign Batch Code" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:410 -msgid "Choose Location" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:418 -msgid "Item Destination selected" -msgstr "" - #: src/forms/PurchaseOrderForms.tsx:421 #~ msgid "Assign Batch Code{0}" #~ msgstr "Assign Batch Code{0}" -#: src/forms/PurchaseOrderForms.tsx:428 -msgid "Part category default location selected" +#: src/forms/PurchaseOrderForms.tsx:440 +msgid "Assign Batch Code and Serial Numbers" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:438 -msgid "Received stock location selected" +#: src/forms/PurchaseOrderForms.tsx:442 +msgid "Assign Batch Code" msgstr "" #: src/forms/PurchaseOrderForms.tsx:444 @@ -4605,94 +4596,110 @@ msgstr "" #~ msgid "Remove item from list" #~ msgstr "Remove item from list" -#: src/forms/PurchaseOrderForms.tsx:446 +#: src/forms/PurchaseOrderForms.tsx:462 +msgid "Choose Location" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:470 +msgid "Item Destination selected" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:480 +msgid "Part category default location selected" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:490 +msgid "Received stock location selected" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:498 msgid "Default location selected" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:507 +#: src/forms/PurchaseOrderForms.tsx:559 msgid "Set Location" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:524 -msgid "Set Expiry Date" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:532 -#: src/forms/StockForms.tsx:693 -msgid "Adjust Packaging" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:540 -#: src/forms/StockForms.tsx:684 -#: src/hooks/UseStockAdjustActions.tsx:148 -msgid "Change Status" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:546 -msgid "Add Note" -msgstr "" - #: src/forms/PurchaseOrderForms.tsx:566 #~ msgid "Serial numbers" #~ msgstr "Serial numbers" +#: src/forms/PurchaseOrderForms.tsx:576 +msgid "Set Expiry Date" +msgstr "" + #: src/forms/PurchaseOrderForms.tsx:582 #~ msgid "Store at line item destination" #~ msgstr "Store at line item destination" -#: src/forms/PurchaseOrderForms.tsx:610 -msgid "Store at default location" +#: src/forms/PurchaseOrderForms.tsx:584 +#: src/forms/StockForms.tsx:693 +msgid "Adjust Packaging" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:625 -msgid "Store at line item destination " +#: src/forms/PurchaseOrderForms.tsx:592 +#: src/forms/StockForms.tsx:684 +#: src/hooks/UseStockAdjustActions.tsx:148 +msgid "Change Status" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:637 -msgid "Store with already received stock" +#: src/forms/PurchaseOrderForms.tsx:598 +msgid "Add Note" msgstr "" #: src/forms/PurchaseOrderForms.tsx:658 #~ msgid "Receive line items" #~ msgstr "Receive line items" -#: src/forms/PurchaseOrderForms.tsx:661 +#: src/forms/PurchaseOrderForms.tsx:662 +msgid "Store at default location" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:677 +msgid "Store at line item destination " +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:689 +msgid "Store with already received stock" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:713 #: src/pages/build/BuildDetail.tsx:340 #: src/pages/stock/StockDetail.tsx:280 #: src/pages/stock/StockDetail.tsx:952 #: src/tables/Filter.tsx:83 -#: src/tables/build/BuildAllocatedStockTable.tsx:128 +#: src/tables/build/BuildAllocatedStockTable.tsx:125 #: src/tables/build/BuildOutputTable.tsx:112 -#: src/tables/part/PartTestResultTable.tsx:260 -#: src/tables/part/PartTestResultTable.tsx:281 +#: src/tables/part/PartTestResultTable.tsx:268 +#: src/tables/part/PartTestResultTable.tsx:289 #: src/tables/sales/SalesOrderAllocationTable.tsx:149 msgid "Batch Code" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:662 +#: src/forms/PurchaseOrderForms.tsx:714 msgid "Enter batch code for received items" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:675 +#: src/forms/PurchaseOrderForms.tsx:727 #: src/forms/StockForms.tsx:218 msgid "Serial Numbers" msgstr "Serienumre" -#: src/forms/PurchaseOrderForms.tsx:676 +#: src/forms/PurchaseOrderForms.tsx:728 msgid "Enter serial numbers for received items" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:690 +#: src/forms/PurchaseOrderForms.tsx:742 #: src/pages/stock/StockDetail.tsx:382 #: src/tables/stock/StockItemTable.tsx:294 msgid "Expiry Date" msgstr "Utløpsdato" -#: src/forms/PurchaseOrderForms.tsx:691 +#: src/forms/PurchaseOrderForms.tsx:743 msgid "Enter an expiry date for received items" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:703 +#: src/forms/PurchaseOrderForms.tsx:755 #: src/forms/StockForms.tsx:728 #: src/pages/company/SupplierPartDetail.tsx:172 #: src/pages/company/SupplierPartDetail.tsx:236 @@ -4701,19 +4708,19 @@ msgstr "" msgid "Packaging" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:727 +#: src/forms/PurchaseOrderForms.tsx:779 #: src/pages/company/SupplierPartDetail.tsx:120 #: src/tables/ColumnRenderers.tsx:332 msgid "Note" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:799 +#: src/forms/PurchaseOrderForms.tsx:851 #: src/pages/company/SupplierPartDetail.tsx:138 #: src/tables/purchasing/SupplierPriceBreakTable.tsx:49 msgid "SKU" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:800 +#: src/forms/PurchaseOrderForms.tsx:852 #: src/tables/part/PartPurchaseOrdersTable.tsx:127 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:213 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:283 @@ -4721,11 +4728,11 @@ msgstr "" msgid "Received" msgstr "Mottatt" -#: src/forms/PurchaseOrderForms.tsx:817 +#: src/forms/PurchaseOrderForms.tsx:869 msgid "Receive Line Items" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:823 +#: src/forms/PurchaseOrderForms.tsx:875 msgid "Items received" msgstr "" @@ -4737,7 +4744,7 @@ msgstr "" msgid "Item received into stock" msgstr "" -#: src/forms/SalesOrderForms.tsx:401 +#: src/forms/SalesOrderForms.tsx:419 msgid "Leave blank to use the order address" msgstr "" @@ -5932,6 +5939,9 @@ msgstr "" #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:310 #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:401 +#: src/tables/build/BuildAllocatedStockTable.tsx:181 +#: src/tables/build/BuildLineTable.tsx:668 +#: src/tables/sales/SalesOrderAllocationTable.tsx:220 msgid "Confirm Removal" msgstr "" @@ -6870,8 +6880,8 @@ msgstr "" #: src/pages/sales/ReturnOrderDetail.tsx:108 #: src/pages/sales/SalesOrderDetail.tsx:98 #: src/tables/ColumnRenderers.tsx:321 -#: src/tables/build/BuildAllocatedStockTable.tsx:115 -#: src/tables/build/BuildLineTable.tsx:352 +#: src/tables/build/BuildAllocatedStockTable.tsx:112 +#: src/tables/build/BuildLineTable.tsx:353 msgid "Reference" msgstr "" @@ -7132,7 +7142,7 @@ msgstr "" #: src/pages/build/BuildDetail.tsx:742 #: src/pages/stock/StockDetail.tsx:344 -#: src/tables/build/BuildAllocatedStockTable.tsx:85 +#: src/tables/build/BuildAllocatedStockTable.tsx:82 #: src/tables/part/PartBuildAllocationsTable.tsx:45 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:157 #: src/tables/stock/StockTrackingTable.tsx:109 @@ -7600,7 +7610,7 @@ msgstr "Nøkkelord" #: src/pages/part/PartDetail.tsx:542 #: src/tables/bom/BomTable.tsx:439 -#: src/tables/build/BuildLineTable.tsx:305 +#: src/tables/build/BuildLineTable.tsx:306 #: src/tables/part/PartTable.tsx:319 #: src/tables/sales/SalesOrderLineItemTable.tsx:138 msgid "Available Stock" @@ -7608,7 +7618,7 @@ msgstr "" #: src/pages/part/PartDetail.tsx:548 #: src/tables/bom/BomTable.tsx:341 -#: src/tables/build/BuildLineTable.tsx:267 +#: src/tables/build/BuildLineTable.tsx:268 #: src/tables/sales/SalesOrderLineItemTable.tsx:180 msgid "On order" msgstr "I bestilling" @@ -7782,7 +7792,7 @@ msgstr "" #: src/pages/part/PartDetail.tsx:1144 #: src/pages/stock/StockDetail.tsx:884 -#: src/tables/build/BuildLineTable.tsx:761 +#: src/tables/build/BuildLineTable.tsx:768 msgid "Order Stock" msgstr "" @@ -9219,13 +9229,13 @@ msgstr "" #~ msgstr "Show asssmbled items" #: src/tables/bom/BomTable.tsx:315 -#: src/tables/build/BuildLineTable.tsx:276 +#: src/tables/build/BuildLineTable.tsx:277 #: src/tables/part/PartTable.tsx:145 msgid "External stock" msgstr "" #: src/tables/bom/BomTable.tsx:323 -#: src/tables/build/BuildLineTable.tsx:239 +#: src/tables/build/BuildLineTable.tsx:240 msgid "Includes substitute stock" msgstr "Inkluderer erstatningsbeholdning" @@ -9234,7 +9244,7 @@ msgstr "Inkluderer erstatningsbeholdning" #~ msgstr "Edit Bom Item" #: src/tables/bom/BomTable.tsx:332 -#: src/tables/build/BuildLineTable.tsx:249 +#: src/tables/build/BuildLineTable.tsx:250 #: src/tables/sales/SalesOrderLineItemTable.tsx:166 msgid "Includes variant stock" msgstr "Inkluderer variantbeholdning" @@ -9272,8 +9282,8 @@ msgid "Stock Information" msgstr "Lagerinformasjon" #: src/tables/bom/BomTable.tsx:399 -#: src/tables/build/BuildLineTable.tsx:496 -#: src/tables/build/BuildLineTable.tsx:537 +#: src/tables/build/BuildLineTable.tsx:497 +#: src/tables/build/BuildLineTable.tsx:538 msgid "Consumable item" msgstr "Forbruksvare" @@ -9282,7 +9292,7 @@ msgid "No available stock" msgstr "" #: src/tables/bom/BomTable.tsx:420 -#: src/tables/build/BuildLineTable.tsx:213 +#: src/tables/build/BuildLineTable.tsx:214 msgid "Show testable items" msgstr "" @@ -9291,7 +9301,7 @@ msgid "Show trackable items" msgstr "Vis sporbare deler" #: src/tables/bom/BomTable.tsx:430 -#: src/tables/build/BuildLineTable.tsx:208 +#: src/tables/build/BuildLineTable.tsx:209 msgid "Show assembled items" msgstr "" @@ -9335,7 +9345,7 @@ msgstr "" #: src/tables/bom/BomTable.tsx:464 #: src/tables/bom/UsedInTable.tsx:85 -#: src/tables/build/BuildLineTable.tsx:202 +#: src/tables/build/BuildLineTable.tsx:203 msgid "Optional" msgstr "Valgfritt" @@ -9345,7 +9355,7 @@ msgid "Show optional items" msgstr "Vis valgfrie elementer" #: src/tables/bom/BomTable.tsx:469 -#: src/tables/build/BuildLineTable.tsx:197 +#: src/tables/build/BuildLineTable.tsx:198 msgid "Consumable" msgstr "Forbruksvare" @@ -9433,7 +9443,7 @@ msgid "Bill of materials cannot be edited, as the part is locked" msgstr "" #: src/tables/bom/UsedInTable.tsx:34 -#: src/tables/build/BuildLineTable.tsx:207 +#: src/tables/build/BuildLineTable.tsx:208 #: src/tables/part/ParametricPartTable.tsx:364 #: src/tables/part/PartBuildAllocationsTable.tsx:60 #: src/tables/part/PartTable.tsx:209 @@ -9455,11 +9465,11 @@ msgstr "Sporbar" msgid "Show trackable assemblies" msgstr "Vis sporbare sammenstillinger" -#: src/tables/build/BuildAllocatedStockTable.tsx:67 +#: src/tables/build/BuildAllocatedStockTable.tsx:64 msgid "Allocated to Output" msgstr "" -#: src/tables/build/BuildAllocatedStockTable.tsx:68 +#: src/tables/build/BuildAllocatedStockTable.tsx:65 msgid "Show items allocated to a build output" msgstr "" @@ -9472,7 +9482,7 @@ msgstr "" #~ msgid "Include orders for part variants" #~ msgstr "Include orders for part variants" -#: src/tables/build/BuildAllocatedStockTable.tsx:97 +#: src/tables/build/BuildAllocatedStockTable.tsx:94 #: src/tables/part/PartBuildAllocationsTable.tsx:84 #: src/tables/part/PartPurchaseOrdersTable.tsx:132 #: src/tables/part/PartSalesAllocationsTable.tsx:69 @@ -9482,40 +9492,58 @@ msgid "Order Status" msgstr "" #: src/tables/build/BuildAllocatedStockTable.tsx:164 -#~ msgid "Edit Build Item" -#~ msgstr "Edit Build Item" - -#: src/tables/build/BuildAllocatedStockTable.tsx:167 -#: src/tables/build/BuildLineTable.tsx:650 +#: src/tables/build/BuildLineTable.tsx:651 msgid "Edit Stock Allocation" msgstr "" +#: src/tables/build/BuildAllocatedStockTable.tsx:164 +#~ msgid "Edit Build Item" +#~ msgstr "Edit Build Item" + #: src/tables/build/BuildAllocatedStockTable.tsx:174 #~ msgid "Delete Build Item" #~ msgstr "Delete Build Item" -#: src/tables/build/BuildAllocatedStockTable.tsx:180 -#: src/tables/build/BuildLineTable.tsx:663 -msgid "Delete Stock Allocation" +#: src/tables/build/BuildAllocatedStockTable.tsx:177 +#: src/tables/build/BuildLineTable.tsx:664 +#: src/tables/sales/SalesOrderAllocationTable.tsx:218 +msgid "Remove Allocated Stock" msgstr "" -#: src/tables/build/BuildAllocatedStockTable.tsx:239 +#: src/tables/build/BuildAllocatedStockTable.tsx:180 +#: src/tables/build/BuildLineTable.tsx:663 +#~ msgid "Delete Stock Allocation" +#~ msgstr "Delete Stock Allocation" + +#: src/tables/build/BuildAllocatedStockTable.tsx:182 +#: src/tables/build/BuildLineTable.tsx:669 +#: src/tables/sales/SalesOrderAllocationTable.tsx:221 +msgid "Are you sure you want to remove this allocated stock from the order?" +msgstr "" + +#: src/tables/build/BuildAllocatedStockTable.tsx:242 msgid "Consume" msgstr "" +#: src/tables/build/BuildAllocatedStockTable.tsx:259 +#: src/tables/build/BuildLineTable.tsx:112 +#: src/tables/sales/SalesOrderAllocationTable.tsx:248 +msgid "Remove allocated stock" +msgstr "" + #: src/tables/build/BuildLineTable.tsx:59 #~ msgid "Show lines with available stock" #~ msgstr "Show lines with available stock" -#: src/tables/build/BuildLineTable.tsx:120 +#: src/tables/build/BuildLineTable.tsx:121 msgid "View Stock Item" msgstr "" -#: src/tables/build/BuildLineTable.tsx:183 +#: src/tables/build/BuildLineTable.tsx:184 msgid "Show fully allocated lines" msgstr "" -#: src/tables/build/BuildLineTable.tsx:188 +#: src/tables/build/BuildLineTable.tsx:189 msgid "Show fully consumed lines" msgstr "" @@ -9523,124 +9551,124 @@ msgstr "" #~ msgid "Show allocated lines" #~ msgstr "Show allocated lines" -#: src/tables/build/BuildLineTable.tsx:193 +#: src/tables/build/BuildLineTable.tsx:194 msgid "Show items with sufficient available stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:198 +#: src/tables/build/BuildLineTable.tsx:199 msgid "Show consumable lines" msgstr "" -#: src/tables/build/BuildLineTable.tsx:203 +#: src/tables/build/BuildLineTable.tsx:204 msgid "Show optional lines" msgstr "" -#: src/tables/build/BuildLineTable.tsx:212 +#: src/tables/build/BuildLineTable.tsx:213 #: src/tables/part/PartTable.tsx:233 msgid "Testable" msgstr "" -#: src/tables/build/BuildLineTable.tsx:217 +#: src/tables/build/BuildLineTable.tsx:218 #: src/tables/stock/StockItemTable.tsx:388 msgid "Tracked" msgstr "Spores" -#: src/tables/build/BuildLineTable.tsx:218 +#: src/tables/build/BuildLineTable.tsx:219 msgid "Show tracked lines" msgstr "" -#: src/tables/build/BuildLineTable.tsx:223 +#: src/tables/build/BuildLineTable.tsx:224 msgid "Show items with stock on order" msgstr "" -#: src/tables/build/BuildLineTable.tsx:258 +#: src/tables/build/BuildLineTable.tsx:259 #: src/tables/sales/SalesOrderLineItemTable.tsx:172 msgid "In production" msgstr "" -#: src/tables/build/BuildLineTable.tsx:286 +#: src/tables/build/BuildLineTable.tsx:287 msgid "Insufficient stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:302 +#: src/tables/build/BuildLineTable.tsx:303 #: src/tables/sales/SalesOrderLineItemTable.tsx:160 #: src/tables/stock/StockItemTable.tsx:191 msgid "No stock available" msgstr "Ingen lagerbeholdning tilgjengelig" -#: src/tables/build/BuildLineTable.tsx:375 +#: src/tables/build/BuildLineTable.tsx:376 msgid "Gets Inherited" msgstr "" -#: src/tables/build/BuildLineTable.tsx:388 +#: src/tables/build/BuildLineTable.tsx:389 msgid "Unit Quantity" msgstr "" -#: src/tables/build/BuildLineTable.tsx:415 +#: src/tables/build/BuildLineTable.tsx:416 msgid "Setup Quantity" msgstr "" -#: src/tables/build/BuildLineTable.tsx:424 +#: src/tables/build/BuildLineTable.tsx:425 msgid "Attrition" msgstr "" -#: src/tables/build/BuildLineTable.tsx:432 +#: src/tables/build/BuildLineTable.tsx:433 msgid "Rounding Multiple" msgstr "" -#: src/tables/build/BuildLineTable.tsx:441 +#: src/tables/build/BuildLineTable.tsx:442 msgid "BOM Information" msgstr "" -#: src/tables/build/BuildLineTable.tsx:515 +#: src/tables/build/BuildLineTable.tsx:516 #: src/tables/part/PartBuildAllocationsTable.tsx:102 msgid "Fully allocated" msgstr "" -#: src/tables/build/BuildLineTable.tsx:563 +#: src/tables/build/BuildLineTable.tsx:564 #: src/tables/sales/SalesOrderLineItemTable.tsx:311 msgid "Create Build Order" msgstr "" -#: src/tables/build/BuildLineTable.tsx:592 +#: src/tables/build/BuildLineTable.tsx:593 msgid "Auto allocation in progress" msgstr "" -#: src/tables/build/BuildLineTable.tsx:595 -#: src/tables/build/BuildLineTable.tsx:802 +#: src/tables/build/BuildLineTable.tsx:596 +#: src/tables/build/BuildLineTable.tsx:809 msgid "Auto Allocate Stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:596 +#: src/tables/build/BuildLineTable.tsx:597 msgid "Automatically allocate stock to this build according to the selected options" msgstr "" -#: src/tables/build/BuildLineTable.tsx:616 -#: src/tables/build/BuildLineTable.tsx:630 -#: src/tables/build/BuildLineTable.tsx:751 -#: src/tables/build/BuildLineTable.tsx:852 +#: src/tables/build/BuildLineTable.tsx:617 +#: src/tables/build/BuildLineTable.tsx:631 +#: src/tables/build/BuildLineTable.tsx:758 +#: src/tables/build/BuildLineTable.tsx:859 #: src/tables/build/BuildOutputTable.tsx:355 #: src/tables/build/BuildOutputTable.tsx:360 msgid "Deallocate Stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:632 +#: src/tables/build/BuildLineTable.tsx:633 msgid "Deallocate all untracked stock for this build order" msgstr "" -#: src/tables/build/BuildLineTable.tsx:634 +#: src/tables/build/BuildLineTable.tsx:635 msgid "Deallocate stock from the selected line item" msgstr "" -#: src/tables/build/BuildLineTable.tsx:638 +#: src/tables/build/BuildLineTable.tsx:639 msgid "Stock has been deallocated" msgstr "" -#: src/tables/build/BuildLineTable.tsx:771 +#: src/tables/build/BuildLineTable.tsx:778 msgid "Build Stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:784 +#: src/tables/build/BuildLineTable.tsx:791 #: src/tables/sales/SalesOrderLineItemTable.tsx:487 msgid "View Part" msgstr "" @@ -9739,7 +9767,7 @@ msgid "Serialize Build Output" msgstr "" #: src/tables/build/BuildOutputTable.tsx:405 -#: src/tables/part/PartTestResultTable.tsx:310 +#: src/tables/part/PartTestResultTable.tsx:318 #: src/tables/stock/StockItemTable.tsx:328 msgid "Filter by stock status" msgstr "Filtrer etter lagerstatus" @@ -9964,8 +9992,8 @@ msgid "View Item" msgstr "" #: src/tables/general/ExtraLineItemTable.tsx:95 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:299 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:403 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:300 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:405 #: src/tables/sales/ReturnOrderLineItemTable.tsx:83 #: src/tables/sales/ReturnOrderLineItemTable.tsx:187 #: src/tables/sales/SalesOrderLineItemTable.tsx:252 @@ -9974,14 +10002,14 @@ msgid "Add Line Item" msgstr "Legg til ordrelinje" #: src/tables/general/ExtraLineItemTable.tsx:108 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:320 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:322 #: src/tables/sales/ReturnOrderLineItemTable.tsx:96 #: src/tables/sales/SalesOrderLineItemTable.tsx:271 msgid "Edit Line Item" msgstr "Rediger ordrelinje" #: src/tables/general/ExtraLineItemTable.tsx:117 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:329 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:331 #: src/tables/sales/ReturnOrderLineItemTable.tsx:105 #: src/tables/sales/SalesOrderLineItemTable.tsx:280 msgid "Delete Line Item" @@ -10273,7 +10301,7 @@ msgid "Required Stock" msgstr "" #: src/tables/part/PartBuildAllocationsTable.tsx:124 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:381 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:383 msgid "View Build Order" msgstr "" @@ -10617,8 +10645,8 @@ msgstr "" #: src/tables/part/PartTestResultTable.tsx:103 #: src/tables/part/PartTestResultTable.tsx:181 -#: src/tables/part/PartTestResultTable.tsx:320 -#: src/tables/part/PartTestResultTable.tsx:334 +#: src/tables/part/PartTestResultTable.tsx:328 +#: src/tables/part/PartTestResultTable.tsx:342 #: src/tables/stock/StockItemTestResultTable.tsx:296 #: src/tables/stock/StockItemTestResultTable.tsx:368 #: src/tables/stock/StockItemTestResultTable.tsx:429 @@ -10643,7 +10671,7 @@ msgstr "" msgid "No Result" msgstr "" -#: src/tables/part/PartTestResultTable.tsx:298 +#: src/tables/part/PartTestResultTable.tsx:306 msgid "Show build outputs currently in production" msgstr "" @@ -11073,7 +11101,7 @@ msgid "Show manufacturer parts for active manufacturers." msgstr "" #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:115 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:397 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:399 msgid "Import Line Items" msgstr "" @@ -11099,11 +11127,11 @@ msgstr "" #~ msgid "Add line item" #~ msgstr "Add line item" -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:350 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:352 msgid "Receive line item" msgstr "Motta ordrelinje" -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:414 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:416 msgid "Receive items" msgstr "Motta artikler" @@ -11201,25 +11229,25 @@ msgid "Not shipped" msgstr "Ikke sendt" #: src/tables/sales/SalesOrderAllocationTable.tsx:211 -#: src/tables/sales/SalesOrderAllocationTable.tsx:229 +#: src/tables/sales/SalesOrderAllocationTable.tsx:235 msgid "Edit Allocation" msgstr "" #: src/tables/sales/SalesOrderAllocationTable.tsx:218 #: src/tables/sales/SalesOrderAllocationTable.tsx:241 -msgid "Delete Allocation" -msgstr "" +#~ msgid "Delete Allocation" +#~ msgstr "Delete Allocation" -#: src/tables/sales/SalesOrderAllocationTable.tsx:252 -#: src/tables/sales/SalesOrderAllocationTable.tsx:253 +#: src/tables/sales/SalesOrderAllocationTable.tsx:261 +#: src/tables/sales/SalesOrderAllocationTable.tsx:262 msgid "View Shipment" msgstr "" -#: src/tables/sales/SalesOrderAllocationTable.tsx:308 +#: src/tables/sales/SalesOrderAllocationTable.tsx:317 msgid "Assign to Shipment" msgstr "" -#: src/tables/sales/SalesOrderAllocationTable.tsx:324 +#: src/tables/sales/SalesOrderAllocationTable.tsx:333 msgid "Assign to shipment" msgstr "" diff --git a/src/frontend/src/locales/pl/messages.po b/src/frontend/src/locales/pl/messages.po index 38015a234d..fcf6397147 100644 --- a/src/frontend/src/locales/pl/messages.po +++ b/src/frontend/src/locales/pl/messages.po @@ -8,7 +8,7 @@ msgstr "" "Language: pl\n" "Project-Id-Version: inventree\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2025-11-19 19:39\n" +"PO-Revision-Date: 2025-11-22 06:25\n" "Last-Translator: \n" "Language-Team: Polish\n" "Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n" @@ -56,7 +56,7 @@ msgstr "Anuluj" #: lib/components/RowActions.tsx:136 #: src/components/nav/NavigationDrawer.tsx:190 -#: src/forms/PurchaseOrderForms.tsx:802 +#: src/forms/PurchaseOrderForms.tsx:854 #: src/forms/StockForms.tsx:796 #: src/forms/StockForms.tsx:843 #: src/forms/StockForms.tsx:889 @@ -103,9 +103,9 @@ msgstr "Nie" #: src/forms/BuildForms.tsx:630 #: src/forms/BuildForms.tsx:793 #: src/forms/BuildForms.tsx:896 -#: src/forms/PurchaseOrderForms.tsx:798 +#: src/forms/PurchaseOrderForms.tsx:850 #: src/forms/ReturnOrderForms.tsx:242 -#: src/forms/SalesOrderForms.tsx:305 +#: src/forms/SalesOrderForms.tsx:323 #: src/forms/StockForms.tsx:360 #: src/forms/StockForms.tsx:791 #: src/forms/StockForms.tsx:838 @@ -119,6 +119,7 @@ msgstr "Nie" #: src/pages/build/BuildDetail.tsx:200 #: src/pages/part/PartDetail.tsx:1207 #: src/tables/ColumnRenderers.tsx:91 +#: src/tables/part/PartTestResultTable.tsx:247 #: src/tables/part/RelatedPartTable.tsx:53 #: src/tables/stock/StockTrackingTable.tsx:87 msgid "Part" @@ -158,7 +159,7 @@ msgstr "" #: src/components/wizards/OrderPartsWizard.tsx:290 #: src/pages/company/SupplierPartDetail.tsx:413 #: src/pages/stock/StockDetail.tsx:289 -#: src/tables/build/BuildAllocatedStockTable.tsx:155 +#: src/tables/build/BuildAllocatedStockTable.tsx:152 #: src/tables/part/PartPurchaseOrdersTable.tsx:50 #: src/tables/purchasing/SupplierPartTable.tsx:83 #: src/tables/stock/StockItemTable.tsx:247 @@ -201,9 +202,9 @@ msgstr "Kategorie części" #: src/forms/BuildForms.tsx:473 #: src/forms/BuildForms.tsx:633 #: src/forms/BuildForms.tsx:794 -#: src/forms/SalesOrderForms.tsx:307 +#: src/forms/SalesOrderForms.tsx:325 #: src/pages/stock/StockDetail.tsx:1005 -#: src/tables/part/PartTestResultTable.tsx:248 +#: src/tables/part/PartTestResultTable.tsx:256 #: src/tables/stock/StockTrackingTable.tsx:48 #: src/tables/stock/StockTrackingTable.tsx:55 msgid "Stock Item" @@ -517,7 +518,7 @@ msgstr "" #: src/components/dashboard/DashboardLayout.tsx:281 #: src/components/editors/NotesEditor.tsx:74 #: src/components/editors/TemplateEditor/TemplateEditor.tsx:158 -#: src/components/forms/fields/ApiFormField.tsx:273 +#: src/components/forms/fields/ApiFormField.tsx:237 #: src/components/forms/fields/TableField.tsx:45 #: src/components/importer/ImportDataSelector.tsx:192 #: src/components/importer/ImporterColumnSelector.tsx:234 @@ -642,8 +643,8 @@ msgstr "" #: src/components/barcodes/BarcodeScanDialog.tsx:49 #: src/components/buttons/ScanButton.tsx:15 #: src/components/nav/NavigationDrawer.tsx:122 -#: src/forms/PurchaseOrderForms.tsx:457 -#: src/forms/PurchaseOrderForms.tsx:563 +#: src/forms/PurchaseOrderForms.tsx:509 +#: src/forms/PurchaseOrderForms.tsx:615 msgid "Scan Barcode" msgstr "Zeskanuj kod kreskowy" @@ -728,7 +729,7 @@ msgstr "" #: src/components/barcodes/QRCode.tsx:205 #: src/components/items/ActionDropdown.tsx:192 -#: src/forms/PurchaseOrderForms.tsx:554 +#: src/forms/PurchaseOrderForms.tsx:606 msgid "Unlink Barcode" msgstr "Odłącz Kod Kreskowy" @@ -1216,6 +1217,12 @@ msgstr "Usunąć powiązany obrazek z tego elementu?" #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:884 #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:903 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:254 +#: src/tables/build/BuildAllocatedStockTable.tsx:178 +#: src/tables/build/BuildAllocatedStockTable.tsx:258 +#: src/tables/build/BuildLineTable.tsx:111 +#: src/tables/build/BuildLineTable.tsx:665 +#: src/tables/sales/SalesOrderAllocationTable.tsx:224 +#: src/tables/sales/SalesOrderAllocationTable.tsx:247 msgid "Remove" msgstr "Usuń" @@ -1241,7 +1248,7 @@ msgid "Upload Error" msgstr "" #: src/components/details/DetailsImage.tsx:250 -#: src/components/forms/fields/TextField.tsx:65 +#: src/components/forms/fields/AutoFillRightSection.tsx:34 msgid "Clear" msgstr "Wyczyść" @@ -1817,10 +1824,14 @@ msgstr "" msgid "Running" msgstr "" -#: src/components/forms/fields/ApiFormField.tsx:233 +#: src/components/forms/fields/ApiFormField.tsx:197 msgid "Select file to upload" msgstr "" +#: src/components/forms/fields/AutoFillRightSection.tsx:47 +msgid "Accept suggested value" +msgstr "" + #: src/components/forms/fields/DateField.tsx:76 msgid "Select date" msgstr "" @@ -1875,10 +1886,6 @@ msgstr "Brak wpisów" msgid "Add new row" msgstr "" -#: src/components/forms/fields/TextField.tsx:82 -msgid "Accept suggested value" -msgstr "" - #: src/components/images/DetailsImage.tsx:252 #~ msgid "Select image" #~ msgstr "Select image" @@ -2225,8 +2232,8 @@ msgstr "" #: src/pages/part/PartDetail.tsx:994 #: src/pages/stock/StockDetail.tsx:265 #: src/pages/stock/StockDetail.tsx:942 -#: src/tables/build/BuildAllocatedStockTable.tsx:135 -#: src/tables/build/BuildLineTable.tsx:192 +#: src/tables/build/BuildAllocatedStockTable.tsx:132 +#: src/tables/build/BuildLineTable.tsx:193 #: src/tables/part/PartTable.tsx:137 #: src/tables/stock/StockItemTable.tsx:182 #: src/tables/stock/StockItemTable.tsx:343 @@ -2784,7 +2791,7 @@ msgstr "" #: src/pages/sales/SalesOrderDetail.tsx:119 #: src/pages/stock/LocationDetail.tsx:102 #: src/tables/ColumnRenderers.tsx:278 -#: src/tables/build/BuildAllocatedStockTable.tsx:91 +#: src/tables/build/BuildAllocatedStockTable.tsx:88 #: src/tables/machine/MachineTypeTable.tsx:161 #: src/tables/machine/MachineTypeTable.tsx:257 #: src/tables/plugin/PluginListTable.tsx:110 @@ -2966,7 +2973,7 @@ msgstr "Brak w magazynie" #: src/pages/company/SupplierPartDetail.tsx:394 #: src/pages/part/PartDetail.tsx:1015 #: src/tables/bom/BomTable.tsx:444 -#: src/tables/build/BuildLineTable.tsx:222 +#: src/tables/build/BuildLineTable.tsx:223 #: src/tables/part/PartTable.tsx:108 msgid "On Order" msgstr "" @@ -2976,7 +2983,7 @@ msgstr "" #: src/pages/part/PartDetail.tsx:587 #: src/pages/part/PartDetail.tsx:1021 #: src/pages/stock/StockDetail.tsx:925 -#: src/tables/part/PartTestResultTable.tsx:297 +#: src/tables/part/PartTestResultTable.tsx:305 #: src/tables/stock/StockItemTable.tsx:359 msgid "In Production" msgstr "" @@ -3000,7 +3007,7 @@ msgstr "" #: src/components/render/Stock.tsx:114 #: src/components/render/Stock.tsx:132 #: src/forms/BuildForms.tsx:795 -#: src/forms/PurchaseOrderForms.tsx:595 +#: src/forms/PurchaseOrderForms.tsx:647 #: src/forms/StockForms.tsx:792 #: src/forms/StockForms.tsx:839 #: src/forms/StockForms.tsx:885 @@ -3023,7 +3030,7 @@ msgstr "Lokalizacja" #: src/components/render/Stock.tsx:99 #: src/pages/stock/StockDetail.tsx:198 #: src/pages/stock/StockDetail.tsx:930 -#: src/tables/build/BuildAllocatedStockTable.tsx:121 +#: src/tables/build/BuildAllocatedStockTable.tsx:118 #: src/tables/build/BuildOutputTable.tsx:107 #: src/tables/sales/SalesOrderAllocationTable.tsx:142 msgid "Serial Number" @@ -3034,9 +3041,9 @@ msgstr "Numer seryjny" #: src/forms/BuildForms.tsx:240 #: src/forms/BuildForms.tsx:634 #: src/forms/BuildForms.tsx:797 -#: src/forms/PurchaseOrderForms.tsx:801 +#: src/forms/PurchaseOrderForms.tsx:853 #: src/forms/ReturnOrderForms.tsx:243 -#: src/forms/SalesOrderForms.tsx:308 +#: src/forms/SalesOrderForms.tsx:326 #: src/forms/StockForms.tsx:841 #: src/pages/part/PartStockHistoryDetail.tsx:56 #: src/pages/part/PartStockHistoryDetail.tsx:210 @@ -3046,9 +3053,9 @@ msgstr "Numer seryjny" #: src/pages/part/pricing/PriceBreakPanel.tsx:172 #: src/pages/stock/StockDetail.tsx:258 #: src/pages/stock/StockDetail.tsx:936 -#: src/tables/build/BuildLineTable.tsx:86 +#: src/tables/build/BuildLineTable.tsx:83 #: src/tables/part/PartPurchaseOrdersTable.tsx:94 -#: src/tables/part/PartTestResultTable.tsx:269 +#: src/tables/part/PartTestResultTable.tsx:277 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:175 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:206 #: src/tables/purchasing/SupplierPriceBreakTable.tsx:69 @@ -3070,7 +3077,7 @@ msgstr "Ilość" #: src/forms/StockForms.tsx:1048 #: src/forms/StockForms.tsx:1096 #: src/forms/StockForms.tsx:1140 -#: src/tables/build/BuildLineTable.tsx:96 +#: src/tables/build/BuildLineTable.tsx:93 msgid "Batch" msgstr "" @@ -3755,7 +3762,7 @@ msgid "In Stock" msgstr "Na stanie" #: src/components/wizards/OrderPartsWizard.tsx:146 -#: src/tables/build/BuildLineTable.tsx:404 +#: src/tables/build/BuildLineTable.tsx:405 msgid "Required Quantity" msgstr "" @@ -3847,7 +3854,7 @@ msgid "Please correct the errors in the selected parts" msgstr "" #: src/components/wizards/OrderPartsWizard.tsx:587 -#: src/tables/build/BuildLineTable.tsx:815 +#: src/tables/build/BuildLineTable.tsx:822 #: src/tables/part/PartTable.tsx:522 #: src/tables/sales/SalesOrderLineItemTable.tsx:370 msgid "Order Parts" @@ -4349,9 +4356,9 @@ msgstr "" #: src/forms/BuildForms.tsx:333 #: src/forms/BuildForms.tsx:408 #: src/forms/BuildForms.tsx:685 -#: src/tables/build/BuildAllocatedStockTable.tsx:150 +#: src/tables/build/BuildAllocatedStockTable.tsx:147 #: src/tables/build/BuildOutputTable.tsx:582 -#: src/tables/part/PartTestResultTable.tsx:272 +#: src/tables/part/PartTestResultTable.tsx:280 msgid "Build Output" msgstr "" @@ -4362,7 +4369,7 @@ msgstr "" #: src/forms/BuildForms.tsx:336 #: src/forms/BuildForms.tsx:411 #: src/forms/BuildForms.tsx:475 -#: src/forms/PurchaseOrderForms.tsx:717 +#: src/forms/PurchaseOrderForms.tsx:769 #: src/forms/ReturnOrderForms.tsx:197 #: src/forms/ReturnOrderForms.tsx:244 #: src/forms/StockForms.tsx:712 @@ -4377,7 +4384,7 @@ msgstr "" #: src/tables/build/BuildOutputTable.tsx:404 #: src/tables/machine/MachineListTable.tsx:387 #: src/tables/part/PartPurchaseOrdersTable.tsx:38 -#: src/tables/part/PartTestResultTable.tsx:309 +#: src/tables/part/PartTestResultTable.tsx:317 #: src/tables/sales/ReturnOrderLineItemTable.tsx:138 #: src/tables/sales/ReturnOrderLineItemTable.tsx:176 #: src/tables/settings/CustomStateTable.tsx:79 @@ -4450,8 +4457,8 @@ msgstr "" #: src/pages/stock/StockDetail.tsx:153 #: src/tables/bom/BomTable.tsx:134 #: src/tables/bom/UsedInTable.tsx:40 -#: src/tables/build/BuildAllocatedStockTable.tsx:108 -#: src/tables/build/BuildLineTable.tsx:336 +#: src/tables/build/BuildAllocatedStockTable.tsx:105 +#: src/tables/build/BuildLineTable.tsx:337 #: src/tables/build/BuildOrderTable.tsx:79 #: src/tables/part/PartSalesAllocationsTable.tsx:61 #: src/tables/part/RelatedPartTable.tsx:73 @@ -4466,47 +4473,47 @@ msgstr "" #: src/forms/BuildForms.tsx:632 #: src/forms/BuildForms.tsx:796 #: src/forms/BuildForms.tsx:897 -#: src/forms/SalesOrderForms.tsx:306 -#: src/tables/build/BuildAllocatedStockTable.tsx:139 -#: src/tables/build/BuildLineTable.tsx:182 +#: src/forms/SalesOrderForms.tsx:324 +#: src/tables/build/BuildAllocatedStockTable.tsx:136 +#: src/tables/build/BuildLineTable.tsx:183 #: src/tables/sales/SalesOrderLineItemTable.tsx:342 #: src/tables/stock/StockItemTable.tsx:338 msgid "Allocated" msgstr "" #: src/forms/BuildForms.tsx:667 -#: src/forms/SalesOrderForms.tsx:295 +#: src/forms/SalesOrderForms.tsx:313 #: src/pages/build/BuildDetail.tsx:108 #: src/pages/build/BuildDetail.tsx:326 msgid "Source Location" msgstr "" #: src/forms/BuildForms.tsx:668 -#: src/forms/SalesOrderForms.tsx:296 +#: src/forms/SalesOrderForms.tsx:314 msgid "Select the source location for the stock allocation" msgstr "" #: src/forms/BuildForms.tsx:700 -#: src/forms/SalesOrderForms.tsx:336 -#: src/tables/build/BuildLineTable.tsx:574 -#: src/tables/build/BuildLineTable.tsx:731 -#: src/tables/build/BuildLineTable.tsx:830 +#: src/forms/SalesOrderForms.tsx:354 +#: src/tables/build/BuildLineTable.tsx:575 +#: src/tables/build/BuildLineTable.tsx:738 +#: src/tables/build/BuildLineTable.tsx:837 #: src/tables/sales/SalesOrderLineItemTable.tsx:380 #: src/tables/sales/SalesOrderLineItemTable.tsx:406 msgid "Allocate Stock" msgstr "" #: src/forms/BuildForms.tsx:703 -#: src/forms/SalesOrderForms.tsx:341 +#: src/forms/SalesOrderForms.tsx:359 msgid "Stock items allocated" msgstr "" #: src/forms/BuildForms.tsx:816 #: src/forms/BuildForms.tsx:917 -#: src/tables/build/BuildAllocatedStockTable.tsx:240 -#: src/tables/build/BuildAllocatedStockTable.tsx:272 -#: src/tables/build/BuildLineTable.tsx:741 -#: src/tables/build/BuildLineTable.tsx:864 +#: src/tables/build/BuildAllocatedStockTable.tsx:243 +#: src/tables/build/BuildAllocatedStockTable.tsx:279 +#: src/tables/build/BuildLineTable.tsx:748 +#: src/tables/build/BuildLineTable.tsx:871 msgid "Consume Stock" msgstr "" @@ -4521,21 +4528,21 @@ msgstr "" #~ msgstr "Stock items consumed" #: src/forms/BuildForms.tsx:853 -#: src/tables/build/BuildLineTable.tsx:514 +#: src/tables/build/BuildLineTable.tsx:515 #: src/tables/part/PartBuildAllocationsTable.tsx:101 msgid "Fully consumed" msgstr "" #: src/forms/BuildForms.tsx:898 -#: src/tables/build/BuildLineTable.tsx:187 +#: src/tables/build/BuildLineTable.tsx:188 #: src/tables/stock/StockItemTable.tsx:367 msgid "Consumed" msgstr "" #: src/forms/CommonForms.tsx:88 -#: src/forms/PurchaseOrderForms.tsx:125 +#: src/forms/PurchaseOrderForms.tsx:176 #: src/forms/ReturnOrderForms.tsx:138 -#: src/forms/SalesOrderForms.tsx:164 +#: src/forms/SalesOrderForms.tsx:182 msgid "Select project code for this line item" msgstr "" @@ -4572,32 +4579,16 @@ msgstr "Kategoria części nadrzędnej" msgid "Subscribe to notifications for this category" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:388 -msgid "Assign Batch Code and Serial Numbers" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:390 -msgid "Assign Batch Code" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:410 -msgid "Choose Location" -msgstr "Wybierz lokalizację" - -#: src/forms/PurchaseOrderForms.tsx:418 -msgid "Item Destination selected" -msgstr "" - #: src/forms/PurchaseOrderForms.tsx:421 #~ msgid "Assign Batch Code{0}" #~ msgstr "Assign Batch Code{0}" -#: src/forms/PurchaseOrderForms.tsx:428 -msgid "Part category default location selected" +#: src/forms/PurchaseOrderForms.tsx:440 +msgid "Assign Batch Code and Serial Numbers" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:438 -msgid "Received stock location selected" +#: src/forms/PurchaseOrderForms.tsx:442 +msgid "Assign Batch Code" msgstr "" #: src/forms/PurchaseOrderForms.tsx:444 @@ -4605,94 +4596,110 @@ msgstr "" #~ msgid "Remove item from list" #~ msgstr "Remove item from list" -#: src/forms/PurchaseOrderForms.tsx:446 +#: src/forms/PurchaseOrderForms.tsx:462 +msgid "Choose Location" +msgstr "Wybierz lokalizację" + +#: src/forms/PurchaseOrderForms.tsx:470 +msgid "Item Destination selected" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:480 +msgid "Part category default location selected" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:490 +msgid "Received stock location selected" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:498 msgid "Default location selected" msgstr "Wybrano domyślną lokalizację" -#: src/forms/PurchaseOrderForms.tsx:507 +#: src/forms/PurchaseOrderForms.tsx:559 msgid "Set Location" msgstr "Ustaw lokalizację" -#: src/forms/PurchaseOrderForms.tsx:524 -msgid "Set Expiry Date" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:532 -#: src/forms/StockForms.tsx:693 -msgid "Adjust Packaging" -msgstr "Dostosuj opakowanie" - -#: src/forms/PurchaseOrderForms.tsx:540 -#: src/forms/StockForms.tsx:684 -#: src/hooks/UseStockAdjustActions.tsx:148 -msgid "Change Status" -msgstr "Zmień status" - -#: src/forms/PurchaseOrderForms.tsx:546 -msgid "Add Note" -msgstr "Dodaj notatkę" - #: src/forms/PurchaseOrderForms.tsx:566 #~ msgid "Serial numbers" #~ msgstr "Serial numbers" +#: src/forms/PurchaseOrderForms.tsx:576 +msgid "Set Expiry Date" +msgstr "" + #: src/forms/PurchaseOrderForms.tsx:582 #~ msgid "Store at line item destination" #~ msgstr "Store at line item destination" -#: src/forms/PurchaseOrderForms.tsx:610 -msgid "Store at default location" -msgstr "Zapisz w domyślnej lokalizacji" +#: src/forms/PurchaseOrderForms.tsx:584 +#: src/forms/StockForms.tsx:693 +msgid "Adjust Packaging" +msgstr "Dostosuj opakowanie" -#: src/forms/PurchaseOrderForms.tsx:625 -msgid "Store at line item destination " -msgstr "" +#: src/forms/PurchaseOrderForms.tsx:592 +#: src/forms/StockForms.tsx:684 +#: src/hooks/UseStockAdjustActions.tsx:148 +msgid "Change Status" +msgstr "Zmień status" -#: src/forms/PurchaseOrderForms.tsx:637 -msgid "Store with already received stock" -msgstr "" +#: src/forms/PurchaseOrderForms.tsx:598 +msgid "Add Note" +msgstr "Dodaj notatkę" #: src/forms/PurchaseOrderForms.tsx:658 #~ msgid "Receive line items" #~ msgstr "Receive line items" -#: src/forms/PurchaseOrderForms.tsx:661 +#: src/forms/PurchaseOrderForms.tsx:662 +msgid "Store at default location" +msgstr "Zapisz w domyślnej lokalizacji" + +#: src/forms/PurchaseOrderForms.tsx:677 +msgid "Store at line item destination " +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:689 +msgid "Store with already received stock" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:713 #: src/pages/build/BuildDetail.tsx:340 #: src/pages/stock/StockDetail.tsx:280 #: src/pages/stock/StockDetail.tsx:952 #: src/tables/Filter.tsx:83 -#: src/tables/build/BuildAllocatedStockTable.tsx:128 +#: src/tables/build/BuildAllocatedStockTable.tsx:125 #: src/tables/build/BuildOutputTable.tsx:112 -#: src/tables/part/PartTestResultTable.tsx:260 -#: src/tables/part/PartTestResultTable.tsx:281 +#: src/tables/part/PartTestResultTable.tsx:268 +#: src/tables/part/PartTestResultTable.tsx:289 #: src/tables/sales/SalesOrderAllocationTable.tsx:149 msgid "Batch Code" msgstr "Kod partii" -#: src/forms/PurchaseOrderForms.tsx:662 +#: src/forms/PurchaseOrderForms.tsx:714 msgid "Enter batch code for received items" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:675 +#: src/forms/PurchaseOrderForms.tsx:727 #: src/forms/StockForms.tsx:218 msgid "Serial Numbers" msgstr "Numery seryjne" -#: src/forms/PurchaseOrderForms.tsx:676 +#: src/forms/PurchaseOrderForms.tsx:728 msgid "Enter serial numbers for received items" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:690 +#: src/forms/PurchaseOrderForms.tsx:742 #: src/pages/stock/StockDetail.tsx:382 #: src/tables/stock/StockItemTable.tsx:294 msgid "Expiry Date" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:691 +#: src/forms/PurchaseOrderForms.tsx:743 msgid "Enter an expiry date for received items" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:703 +#: src/forms/PurchaseOrderForms.tsx:755 #: src/forms/StockForms.tsx:728 #: src/pages/company/SupplierPartDetail.tsx:172 #: src/pages/company/SupplierPartDetail.tsx:236 @@ -4701,19 +4708,19 @@ msgstr "" msgid "Packaging" msgstr "Opakowanie" -#: src/forms/PurchaseOrderForms.tsx:727 +#: src/forms/PurchaseOrderForms.tsx:779 #: src/pages/company/SupplierPartDetail.tsx:120 #: src/tables/ColumnRenderers.tsx:332 msgid "Note" msgstr "Notatka" -#: src/forms/PurchaseOrderForms.tsx:799 +#: src/forms/PurchaseOrderForms.tsx:851 #: src/pages/company/SupplierPartDetail.tsx:138 #: src/tables/purchasing/SupplierPriceBreakTable.tsx:49 msgid "SKU" msgstr "SKU" -#: src/forms/PurchaseOrderForms.tsx:800 +#: src/forms/PurchaseOrderForms.tsx:852 #: src/tables/part/PartPurchaseOrdersTable.tsx:127 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:213 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:283 @@ -4721,11 +4728,11 @@ msgstr "SKU" msgid "Received" msgstr "Otrzymano" -#: src/forms/PurchaseOrderForms.tsx:817 +#: src/forms/PurchaseOrderForms.tsx:869 msgid "Receive Line Items" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:823 +#: src/forms/PurchaseOrderForms.tsx:875 msgid "Items received" msgstr "" @@ -4737,7 +4744,7 @@ msgstr "" msgid "Item received into stock" msgstr "" -#: src/forms/SalesOrderForms.tsx:401 +#: src/forms/SalesOrderForms.tsx:419 msgid "Leave blank to use the order address" msgstr "" @@ -5932,6 +5939,9 @@ msgstr "" #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:310 #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:401 +#: src/tables/build/BuildAllocatedStockTable.tsx:181 +#: src/tables/build/BuildLineTable.tsx:668 +#: src/tables/sales/SalesOrderAllocationTable.tsx:220 msgid "Confirm Removal" msgstr "" @@ -6870,8 +6880,8 @@ msgstr "" #: src/pages/sales/ReturnOrderDetail.tsx:108 #: src/pages/sales/SalesOrderDetail.tsx:98 #: src/tables/ColumnRenderers.tsx:321 -#: src/tables/build/BuildAllocatedStockTable.tsx:115 -#: src/tables/build/BuildLineTable.tsx:352 +#: src/tables/build/BuildAllocatedStockTable.tsx:112 +#: src/tables/build/BuildLineTable.tsx:353 msgid "Reference" msgstr "" @@ -7132,7 +7142,7 @@ msgstr "" #: src/pages/build/BuildDetail.tsx:742 #: src/pages/stock/StockDetail.tsx:344 -#: src/tables/build/BuildAllocatedStockTable.tsx:85 +#: src/tables/build/BuildAllocatedStockTable.tsx:82 #: src/tables/part/PartBuildAllocationsTable.tsx:45 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:157 #: src/tables/stock/StockTrackingTable.tsx:109 @@ -7600,7 +7610,7 @@ msgstr "" #: src/pages/part/PartDetail.tsx:542 #: src/tables/bom/BomTable.tsx:439 -#: src/tables/build/BuildLineTable.tsx:305 +#: src/tables/build/BuildLineTable.tsx:306 #: src/tables/part/PartTable.tsx:319 #: src/tables/sales/SalesOrderLineItemTable.tsx:138 msgid "Available Stock" @@ -7608,7 +7618,7 @@ msgstr "" #: src/pages/part/PartDetail.tsx:548 #: src/tables/bom/BomTable.tsx:341 -#: src/tables/build/BuildLineTable.tsx:267 +#: src/tables/build/BuildLineTable.tsx:268 #: src/tables/sales/SalesOrderLineItemTable.tsx:180 msgid "On order" msgstr "" @@ -7782,7 +7792,7 @@ msgstr "" #: src/pages/part/PartDetail.tsx:1144 #: src/pages/stock/StockDetail.tsx:884 -#: src/tables/build/BuildLineTable.tsx:761 +#: src/tables/build/BuildLineTable.tsx:768 msgid "Order Stock" msgstr "" @@ -9219,13 +9229,13 @@ msgstr "" #~ msgstr "Show asssmbled items" #: src/tables/bom/BomTable.tsx:315 -#: src/tables/build/BuildLineTable.tsx:276 +#: src/tables/build/BuildLineTable.tsx:277 #: src/tables/part/PartTable.tsx:145 msgid "External stock" msgstr "" #: src/tables/bom/BomTable.tsx:323 -#: src/tables/build/BuildLineTable.tsx:239 +#: src/tables/build/BuildLineTable.tsx:240 msgid "Includes substitute stock" msgstr "" @@ -9234,7 +9244,7 @@ msgstr "" #~ msgstr "Edit Bom Item" #: src/tables/bom/BomTable.tsx:332 -#: src/tables/build/BuildLineTable.tsx:249 +#: src/tables/build/BuildLineTable.tsx:250 #: src/tables/sales/SalesOrderLineItemTable.tsx:166 msgid "Includes variant stock" msgstr "" @@ -9272,8 +9282,8 @@ msgid "Stock Information" msgstr "" #: src/tables/bom/BomTable.tsx:399 -#: src/tables/build/BuildLineTable.tsx:496 -#: src/tables/build/BuildLineTable.tsx:537 +#: src/tables/build/BuildLineTable.tsx:497 +#: src/tables/build/BuildLineTable.tsx:538 msgid "Consumable item" msgstr "" @@ -9282,7 +9292,7 @@ msgid "No available stock" msgstr "" #: src/tables/bom/BomTable.tsx:420 -#: src/tables/build/BuildLineTable.tsx:213 +#: src/tables/build/BuildLineTable.tsx:214 msgid "Show testable items" msgstr "" @@ -9291,7 +9301,7 @@ msgid "Show trackable items" msgstr "" #: src/tables/bom/BomTable.tsx:430 -#: src/tables/build/BuildLineTable.tsx:208 +#: src/tables/build/BuildLineTable.tsx:209 msgid "Show assembled items" msgstr "" @@ -9335,7 +9345,7 @@ msgstr "" #: src/tables/bom/BomTable.tsx:464 #: src/tables/bom/UsedInTable.tsx:85 -#: src/tables/build/BuildLineTable.tsx:202 +#: src/tables/build/BuildLineTable.tsx:203 msgid "Optional" msgstr "" @@ -9345,7 +9355,7 @@ msgid "Show optional items" msgstr "" #: src/tables/bom/BomTable.tsx:469 -#: src/tables/build/BuildLineTable.tsx:197 +#: src/tables/build/BuildLineTable.tsx:198 msgid "Consumable" msgstr "" @@ -9433,7 +9443,7 @@ msgid "Bill of materials cannot be edited, as the part is locked" msgstr "" #: src/tables/bom/UsedInTable.tsx:34 -#: src/tables/build/BuildLineTable.tsx:207 +#: src/tables/build/BuildLineTable.tsx:208 #: src/tables/part/ParametricPartTable.tsx:364 #: src/tables/part/PartBuildAllocationsTable.tsx:60 #: src/tables/part/PartTable.tsx:209 @@ -9455,11 +9465,11 @@ msgstr "" msgid "Show trackable assemblies" msgstr "" -#: src/tables/build/BuildAllocatedStockTable.tsx:67 +#: src/tables/build/BuildAllocatedStockTable.tsx:64 msgid "Allocated to Output" msgstr "" -#: src/tables/build/BuildAllocatedStockTable.tsx:68 +#: src/tables/build/BuildAllocatedStockTable.tsx:65 msgid "Show items allocated to a build output" msgstr "" @@ -9472,7 +9482,7 @@ msgstr "" #~ msgid "Include orders for part variants" #~ msgstr "Include orders for part variants" -#: src/tables/build/BuildAllocatedStockTable.tsx:97 +#: src/tables/build/BuildAllocatedStockTable.tsx:94 #: src/tables/part/PartBuildAllocationsTable.tsx:84 #: src/tables/part/PartPurchaseOrdersTable.tsx:132 #: src/tables/part/PartSalesAllocationsTable.tsx:69 @@ -9482,40 +9492,58 @@ msgid "Order Status" msgstr "" #: src/tables/build/BuildAllocatedStockTable.tsx:164 -#~ msgid "Edit Build Item" -#~ msgstr "Edit Build Item" - -#: src/tables/build/BuildAllocatedStockTable.tsx:167 -#: src/tables/build/BuildLineTable.tsx:650 +#: src/tables/build/BuildLineTable.tsx:651 msgid "Edit Stock Allocation" msgstr "" +#: src/tables/build/BuildAllocatedStockTable.tsx:164 +#~ msgid "Edit Build Item" +#~ msgstr "Edit Build Item" + #: src/tables/build/BuildAllocatedStockTable.tsx:174 #~ msgid "Delete Build Item" #~ msgstr "Delete Build Item" -#: src/tables/build/BuildAllocatedStockTable.tsx:180 -#: src/tables/build/BuildLineTable.tsx:663 -msgid "Delete Stock Allocation" +#: src/tables/build/BuildAllocatedStockTable.tsx:177 +#: src/tables/build/BuildLineTable.tsx:664 +#: src/tables/sales/SalesOrderAllocationTable.tsx:218 +msgid "Remove Allocated Stock" msgstr "" -#: src/tables/build/BuildAllocatedStockTable.tsx:239 +#: src/tables/build/BuildAllocatedStockTable.tsx:180 +#: src/tables/build/BuildLineTable.tsx:663 +#~ msgid "Delete Stock Allocation" +#~ msgstr "Delete Stock Allocation" + +#: src/tables/build/BuildAllocatedStockTable.tsx:182 +#: src/tables/build/BuildLineTable.tsx:669 +#: src/tables/sales/SalesOrderAllocationTable.tsx:221 +msgid "Are you sure you want to remove this allocated stock from the order?" +msgstr "" + +#: src/tables/build/BuildAllocatedStockTable.tsx:242 msgid "Consume" msgstr "" +#: src/tables/build/BuildAllocatedStockTable.tsx:259 +#: src/tables/build/BuildLineTable.tsx:112 +#: src/tables/sales/SalesOrderAllocationTable.tsx:248 +msgid "Remove allocated stock" +msgstr "" + #: src/tables/build/BuildLineTable.tsx:59 #~ msgid "Show lines with available stock" #~ msgstr "Show lines with available stock" -#: src/tables/build/BuildLineTable.tsx:120 +#: src/tables/build/BuildLineTable.tsx:121 msgid "View Stock Item" msgstr "" -#: src/tables/build/BuildLineTable.tsx:183 +#: src/tables/build/BuildLineTable.tsx:184 msgid "Show fully allocated lines" msgstr "" -#: src/tables/build/BuildLineTable.tsx:188 +#: src/tables/build/BuildLineTable.tsx:189 msgid "Show fully consumed lines" msgstr "" @@ -9523,124 +9551,124 @@ msgstr "" #~ msgid "Show allocated lines" #~ msgstr "Show allocated lines" -#: src/tables/build/BuildLineTable.tsx:193 +#: src/tables/build/BuildLineTable.tsx:194 msgid "Show items with sufficient available stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:198 +#: src/tables/build/BuildLineTable.tsx:199 msgid "Show consumable lines" msgstr "" -#: src/tables/build/BuildLineTable.tsx:203 +#: src/tables/build/BuildLineTable.tsx:204 msgid "Show optional lines" msgstr "" -#: src/tables/build/BuildLineTable.tsx:212 +#: src/tables/build/BuildLineTable.tsx:213 #: src/tables/part/PartTable.tsx:233 msgid "Testable" msgstr "" -#: src/tables/build/BuildLineTable.tsx:217 +#: src/tables/build/BuildLineTable.tsx:218 #: src/tables/stock/StockItemTable.tsx:388 msgid "Tracked" msgstr "" -#: src/tables/build/BuildLineTable.tsx:218 +#: src/tables/build/BuildLineTable.tsx:219 msgid "Show tracked lines" msgstr "" -#: src/tables/build/BuildLineTable.tsx:223 +#: src/tables/build/BuildLineTable.tsx:224 msgid "Show items with stock on order" msgstr "" -#: src/tables/build/BuildLineTable.tsx:258 +#: src/tables/build/BuildLineTable.tsx:259 #: src/tables/sales/SalesOrderLineItemTable.tsx:172 msgid "In production" msgstr "" -#: src/tables/build/BuildLineTable.tsx:286 +#: src/tables/build/BuildLineTable.tsx:287 msgid "Insufficient stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:302 +#: src/tables/build/BuildLineTable.tsx:303 #: src/tables/sales/SalesOrderLineItemTable.tsx:160 #: src/tables/stock/StockItemTable.tsx:191 msgid "No stock available" msgstr "" -#: src/tables/build/BuildLineTable.tsx:375 +#: src/tables/build/BuildLineTable.tsx:376 msgid "Gets Inherited" msgstr "" -#: src/tables/build/BuildLineTable.tsx:388 +#: src/tables/build/BuildLineTable.tsx:389 msgid "Unit Quantity" msgstr "" -#: src/tables/build/BuildLineTable.tsx:415 +#: src/tables/build/BuildLineTable.tsx:416 msgid "Setup Quantity" msgstr "" -#: src/tables/build/BuildLineTable.tsx:424 +#: src/tables/build/BuildLineTable.tsx:425 msgid "Attrition" msgstr "" -#: src/tables/build/BuildLineTable.tsx:432 +#: src/tables/build/BuildLineTable.tsx:433 msgid "Rounding Multiple" msgstr "" -#: src/tables/build/BuildLineTable.tsx:441 +#: src/tables/build/BuildLineTable.tsx:442 msgid "BOM Information" msgstr "" -#: src/tables/build/BuildLineTable.tsx:515 +#: src/tables/build/BuildLineTable.tsx:516 #: src/tables/part/PartBuildAllocationsTable.tsx:102 msgid "Fully allocated" msgstr "" -#: src/tables/build/BuildLineTable.tsx:563 +#: src/tables/build/BuildLineTable.tsx:564 #: src/tables/sales/SalesOrderLineItemTable.tsx:311 msgid "Create Build Order" msgstr "" -#: src/tables/build/BuildLineTable.tsx:592 +#: src/tables/build/BuildLineTable.tsx:593 msgid "Auto allocation in progress" msgstr "" -#: src/tables/build/BuildLineTable.tsx:595 -#: src/tables/build/BuildLineTable.tsx:802 +#: src/tables/build/BuildLineTable.tsx:596 +#: src/tables/build/BuildLineTable.tsx:809 msgid "Auto Allocate Stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:596 +#: src/tables/build/BuildLineTable.tsx:597 msgid "Automatically allocate stock to this build according to the selected options" msgstr "" -#: src/tables/build/BuildLineTable.tsx:616 -#: src/tables/build/BuildLineTable.tsx:630 -#: src/tables/build/BuildLineTable.tsx:751 -#: src/tables/build/BuildLineTable.tsx:852 +#: src/tables/build/BuildLineTable.tsx:617 +#: src/tables/build/BuildLineTable.tsx:631 +#: src/tables/build/BuildLineTable.tsx:758 +#: src/tables/build/BuildLineTable.tsx:859 #: src/tables/build/BuildOutputTable.tsx:355 #: src/tables/build/BuildOutputTable.tsx:360 msgid "Deallocate Stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:632 +#: src/tables/build/BuildLineTable.tsx:633 msgid "Deallocate all untracked stock for this build order" msgstr "" -#: src/tables/build/BuildLineTable.tsx:634 +#: src/tables/build/BuildLineTable.tsx:635 msgid "Deallocate stock from the selected line item" msgstr "" -#: src/tables/build/BuildLineTable.tsx:638 +#: src/tables/build/BuildLineTable.tsx:639 msgid "Stock has been deallocated" msgstr "" -#: src/tables/build/BuildLineTable.tsx:771 +#: src/tables/build/BuildLineTable.tsx:778 msgid "Build Stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:784 +#: src/tables/build/BuildLineTable.tsx:791 #: src/tables/sales/SalesOrderLineItemTable.tsx:487 msgid "View Part" msgstr "" @@ -9739,7 +9767,7 @@ msgid "Serialize Build Output" msgstr "" #: src/tables/build/BuildOutputTable.tsx:405 -#: src/tables/part/PartTestResultTable.tsx:310 +#: src/tables/part/PartTestResultTable.tsx:318 #: src/tables/stock/StockItemTable.tsx:328 msgid "Filter by stock status" msgstr "" @@ -9964,8 +9992,8 @@ msgid "View Item" msgstr "" #: src/tables/general/ExtraLineItemTable.tsx:95 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:299 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:403 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:300 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:405 #: src/tables/sales/ReturnOrderLineItemTable.tsx:83 #: src/tables/sales/ReturnOrderLineItemTable.tsx:187 #: src/tables/sales/SalesOrderLineItemTable.tsx:252 @@ -9974,14 +10002,14 @@ msgid "Add Line Item" msgstr "" #: src/tables/general/ExtraLineItemTable.tsx:108 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:320 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:322 #: src/tables/sales/ReturnOrderLineItemTable.tsx:96 #: src/tables/sales/SalesOrderLineItemTable.tsx:271 msgid "Edit Line Item" msgstr "" #: src/tables/general/ExtraLineItemTable.tsx:117 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:329 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:331 #: src/tables/sales/ReturnOrderLineItemTable.tsx:105 #: src/tables/sales/SalesOrderLineItemTable.tsx:280 msgid "Delete Line Item" @@ -10273,7 +10301,7 @@ msgid "Required Stock" msgstr "" #: src/tables/part/PartBuildAllocationsTable.tsx:124 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:381 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:383 msgid "View Build Order" msgstr "" @@ -10617,8 +10645,8 @@ msgstr "" #: src/tables/part/PartTestResultTable.tsx:103 #: src/tables/part/PartTestResultTable.tsx:181 -#: src/tables/part/PartTestResultTable.tsx:320 -#: src/tables/part/PartTestResultTable.tsx:334 +#: src/tables/part/PartTestResultTable.tsx:328 +#: src/tables/part/PartTestResultTable.tsx:342 #: src/tables/stock/StockItemTestResultTable.tsx:296 #: src/tables/stock/StockItemTestResultTable.tsx:368 #: src/tables/stock/StockItemTestResultTable.tsx:429 @@ -10643,7 +10671,7 @@ msgstr "" msgid "No Result" msgstr "" -#: src/tables/part/PartTestResultTable.tsx:298 +#: src/tables/part/PartTestResultTable.tsx:306 msgid "Show build outputs currently in production" msgstr "" @@ -11073,7 +11101,7 @@ msgid "Show manufacturer parts for active manufacturers." msgstr "" #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:115 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:397 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:399 msgid "Import Line Items" msgstr "" @@ -11099,11 +11127,11 @@ msgstr "" #~ msgid "Add line item" #~ msgstr "Add line item" -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:350 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:352 msgid "Receive line item" msgstr "" -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:414 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:416 msgid "Receive items" msgstr "" @@ -11201,25 +11229,25 @@ msgid "Not shipped" msgstr "" #: src/tables/sales/SalesOrderAllocationTable.tsx:211 -#: src/tables/sales/SalesOrderAllocationTable.tsx:229 +#: src/tables/sales/SalesOrderAllocationTable.tsx:235 msgid "Edit Allocation" msgstr "" #: src/tables/sales/SalesOrderAllocationTable.tsx:218 #: src/tables/sales/SalesOrderAllocationTable.tsx:241 -msgid "Delete Allocation" -msgstr "" +#~ msgid "Delete Allocation" +#~ msgstr "Delete Allocation" -#: src/tables/sales/SalesOrderAllocationTable.tsx:252 -#: src/tables/sales/SalesOrderAllocationTable.tsx:253 +#: src/tables/sales/SalesOrderAllocationTable.tsx:261 +#: src/tables/sales/SalesOrderAllocationTable.tsx:262 msgid "View Shipment" msgstr "" -#: src/tables/sales/SalesOrderAllocationTable.tsx:308 +#: src/tables/sales/SalesOrderAllocationTable.tsx:317 msgid "Assign to Shipment" msgstr "" -#: src/tables/sales/SalesOrderAllocationTable.tsx:324 +#: src/tables/sales/SalesOrderAllocationTable.tsx:333 msgid "Assign to shipment" msgstr "" diff --git a/src/frontend/src/locales/pt/messages.po b/src/frontend/src/locales/pt/messages.po index 28b0206b86..11d74b6f34 100644 --- a/src/frontend/src/locales/pt/messages.po +++ b/src/frontend/src/locales/pt/messages.po @@ -8,7 +8,7 @@ msgstr "" "Language: pt\n" "Project-Id-Version: inventree\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2025-11-19 19:39\n" +"PO-Revision-Date: 2025-11-22 06:25\n" "Last-Translator: \n" "Language-Team: Portuguese\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" @@ -56,7 +56,7 @@ msgstr "Cancelar" #: lib/components/RowActions.tsx:136 #: src/components/nav/NavigationDrawer.tsx:190 -#: src/forms/PurchaseOrderForms.tsx:802 +#: src/forms/PurchaseOrderForms.tsx:854 #: src/forms/StockForms.tsx:796 #: src/forms/StockForms.tsx:843 #: src/forms/StockForms.tsx:889 @@ -103,9 +103,9 @@ msgstr "Não" #: src/forms/BuildForms.tsx:630 #: src/forms/BuildForms.tsx:793 #: src/forms/BuildForms.tsx:896 -#: src/forms/PurchaseOrderForms.tsx:798 +#: src/forms/PurchaseOrderForms.tsx:850 #: src/forms/ReturnOrderForms.tsx:242 -#: src/forms/SalesOrderForms.tsx:305 +#: src/forms/SalesOrderForms.tsx:323 #: src/forms/StockForms.tsx:360 #: src/forms/StockForms.tsx:791 #: src/forms/StockForms.tsx:838 @@ -119,6 +119,7 @@ msgstr "Não" #: src/pages/build/BuildDetail.tsx:200 #: src/pages/part/PartDetail.tsx:1207 #: src/tables/ColumnRenderers.tsx:91 +#: src/tables/part/PartTestResultTable.tsx:247 #: src/tables/part/RelatedPartTable.tsx:53 #: src/tables/stock/StockTrackingTable.tsx:87 msgid "Part" @@ -158,7 +159,7 @@ msgstr "Modelos de Teste da Peça" #: src/components/wizards/OrderPartsWizard.tsx:290 #: src/pages/company/SupplierPartDetail.tsx:413 #: src/pages/stock/StockDetail.tsx:289 -#: src/tables/build/BuildAllocatedStockTable.tsx:155 +#: src/tables/build/BuildAllocatedStockTable.tsx:152 #: src/tables/part/PartPurchaseOrdersTable.tsx:50 #: src/tables/purchasing/SupplierPartTable.tsx:83 #: src/tables/stock/StockItemTable.tsx:247 @@ -201,9 +202,9 @@ msgstr "Categorias da Peça" #: src/forms/BuildForms.tsx:473 #: src/forms/BuildForms.tsx:633 #: src/forms/BuildForms.tsx:794 -#: src/forms/SalesOrderForms.tsx:307 +#: src/forms/SalesOrderForms.tsx:325 #: src/pages/stock/StockDetail.tsx:1005 -#: src/tables/part/PartTestResultTable.tsx:248 +#: src/tables/part/PartTestResultTable.tsx:256 #: src/tables/stock/StockTrackingTable.tsx:48 #: src/tables/stock/StockTrackingTable.tsx:55 msgid "Stock Item" @@ -517,7 +518,7 @@ msgstr "" #: src/components/dashboard/DashboardLayout.tsx:281 #: src/components/editors/NotesEditor.tsx:74 #: src/components/editors/TemplateEditor/TemplateEditor.tsx:158 -#: src/components/forms/fields/ApiFormField.tsx:273 +#: src/components/forms/fields/ApiFormField.tsx:237 #: src/components/forms/fields/TableField.tsx:45 #: src/components/importer/ImportDataSelector.tsx:192 #: src/components/importer/ImporterColumnSelector.tsx:234 @@ -642,8 +643,8 @@ msgstr "" #: src/components/barcodes/BarcodeScanDialog.tsx:49 #: src/components/buttons/ScanButton.tsx:15 #: src/components/nav/NavigationDrawer.tsx:122 -#: src/forms/PurchaseOrderForms.tsx:457 -#: src/forms/PurchaseOrderForms.tsx:563 +#: src/forms/PurchaseOrderForms.tsx:509 +#: src/forms/PurchaseOrderForms.tsx:615 msgid "Scan Barcode" msgstr "Ler Código de Barras" @@ -728,7 +729,7 @@ msgstr "" #: src/components/barcodes/QRCode.tsx:205 #: src/components/items/ActionDropdown.tsx:192 -#: src/forms/PurchaseOrderForms.tsx:554 +#: src/forms/PurchaseOrderForms.tsx:606 msgid "Unlink Barcode" msgstr "Desatribuir Código de Barras" @@ -1216,6 +1217,12 @@ msgstr "Remover a imagem associada a este item?" #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:884 #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:903 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:254 +#: src/tables/build/BuildAllocatedStockTable.tsx:178 +#: src/tables/build/BuildAllocatedStockTable.tsx:258 +#: src/tables/build/BuildLineTable.tsx:111 +#: src/tables/build/BuildLineTable.tsx:665 +#: src/tables/sales/SalesOrderAllocationTable.tsx:224 +#: src/tables/sales/SalesOrderAllocationTable.tsx:247 msgid "Remove" msgstr "Eliminar" @@ -1241,7 +1248,7 @@ msgid "Upload Error" msgstr "Erro ao enviar" #: src/components/details/DetailsImage.tsx:250 -#: src/components/forms/fields/TextField.tsx:65 +#: src/components/forms/fields/AutoFillRightSection.tsx:34 msgid "Clear" msgstr "Apagar" @@ -1818,10 +1825,14 @@ msgstr "Parado" msgid "Running" msgstr "" -#: src/components/forms/fields/ApiFormField.tsx:233 +#: src/components/forms/fields/ApiFormField.tsx:197 msgid "Select file to upload" msgstr "" +#: src/components/forms/fields/AutoFillRightSection.tsx:47 +msgid "Accept suggested value" +msgstr "" + #: src/components/forms/fields/DateField.tsx:76 msgid "Select date" msgstr "" @@ -1876,10 +1887,6 @@ msgstr "Nenhuma entrada disponível" msgid "Add new row" msgstr "" -#: src/components/forms/fields/TextField.tsx:82 -msgid "Accept suggested value" -msgstr "" - #: src/components/images/DetailsImage.tsx:252 #~ msgid "Select image" #~ msgstr "Select image" @@ -2226,8 +2233,8 @@ msgstr "" #: src/pages/part/PartDetail.tsx:994 #: src/pages/stock/StockDetail.tsx:265 #: src/pages/stock/StockDetail.tsx:942 -#: src/tables/build/BuildAllocatedStockTable.tsx:135 -#: src/tables/build/BuildLineTable.tsx:192 +#: src/tables/build/BuildAllocatedStockTable.tsx:132 +#: src/tables/build/BuildLineTable.tsx:193 #: src/tables/part/PartTable.tsx:137 #: src/tables/stock/StockItemTable.tsx:182 #: src/tables/stock/StockItemTable.tsx:343 @@ -2785,7 +2792,7 @@ msgstr "" #: src/pages/sales/SalesOrderDetail.tsx:119 #: src/pages/stock/LocationDetail.tsx:102 #: src/tables/ColumnRenderers.tsx:278 -#: src/tables/build/BuildAllocatedStockTable.tsx:91 +#: src/tables/build/BuildAllocatedStockTable.tsx:88 #: src/tables/machine/MachineTypeTable.tsx:161 #: src/tables/machine/MachineTypeTable.tsx:257 #: src/tables/plugin/PluginListTable.tsx:110 @@ -2967,7 +2974,7 @@ msgstr "Sem Estoque" #: src/pages/company/SupplierPartDetail.tsx:394 #: src/pages/part/PartDetail.tsx:1015 #: src/tables/bom/BomTable.tsx:444 -#: src/tables/build/BuildLineTable.tsx:222 +#: src/tables/build/BuildLineTable.tsx:223 #: src/tables/part/PartTable.tsx:108 msgid "On Order" msgstr "No Pedido" @@ -2977,7 +2984,7 @@ msgstr "No Pedido" #: src/pages/part/PartDetail.tsx:587 #: src/pages/part/PartDetail.tsx:1021 #: src/pages/stock/StockDetail.tsx:925 -#: src/tables/part/PartTestResultTable.tsx:297 +#: src/tables/part/PartTestResultTable.tsx:305 #: src/tables/stock/StockItemTable.tsx:359 msgid "In Production" msgstr "Em Produção" @@ -3001,7 +3008,7 @@ msgstr "Categoria" #: src/components/render/Stock.tsx:114 #: src/components/render/Stock.tsx:132 #: src/forms/BuildForms.tsx:795 -#: src/forms/PurchaseOrderForms.tsx:595 +#: src/forms/PurchaseOrderForms.tsx:647 #: src/forms/StockForms.tsx:792 #: src/forms/StockForms.tsx:839 #: src/forms/StockForms.tsx:885 @@ -3024,7 +3031,7 @@ msgstr "Localização" #: src/components/render/Stock.tsx:99 #: src/pages/stock/StockDetail.tsx:198 #: src/pages/stock/StockDetail.tsx:930 -#: src/tables/build/BuildAllocatedStockTable.tsx:121 +#: src/tables/build/BuildAllocatedStockTable.tsx:118 #: src/tables/build/BuildOutputTable.tsx:107 #: src/tables/sales/SalesOrderAllocationTable.tsx:142 msgid "Serial Number" @@ -3035,9 +3042,9 @@ msgstr "Número de Série" #: src/forms/BuildForms.tsx:240 #: src/forms/BuildForms.tsx:634 #: src/forms/BuildForms.tsx:797 -#: src/forms/PurchaseOrderForms.tsx:801 +#: src/forms/PurchaseOrderForms.tsx:853 #: src/forms/ReturnOrderForms.tsx:243 -#: src/forms/SalesOrderForms.tsx:308 +#: src/forms/SalesOrderForms.tsx:326 #: src/forms/StockForms.tsx:841 #: src/pages/part/PartStockHistoryDetail.tsx:56 #: src/pages/part/PartStockHistoryDetail.tsx:210 @@ -3047,9 +3054,9 @@ msgstr "Número de Série" #: src/pages/part/pricing/PriceBreakPanel.tsx:172 #: src/pages/stock/StockDetail.tsx:258 #: src/pages/stock/StockDetail.tsx:936 -#: src/tables/build/BuildLineTable.tsx:86 +#: src/tables/build/BuildLineTable.tsx:83 #: src/tables/part/PartPurchaseOrdersTable.tsx:94 -#: src/tables/part/PartTestResultTable.tsx:269 +#: src/tables/part/PartTestResultTable.tsx:277 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:175 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:206 #: src/tables/purchasing/SupplierPriceBreakTable.tsx:69 @@ -3071,7 +3078,7 @@ msgstr "Quantidade" #: src/forms/StockForms.tsx:1048 #: src/forms/StockForms.tsx:1096 #: src/forms/StockForms.tsx:1140 -#: src/tables/build/BuildLineTable.tsx:96 +#: src/tables/build/BuildLineTable.tsx:93 msgid "Batch" msgstr "Lote" @@ -3756,7 +3763,7 @@ msgid "In Stock" msgstr "Em Estoque" #: src/components/wizards/OrderPartsWizard.tsx:146 -#: src/tables/build/BuildLineTable.tsx:404 +#: src/tables/build/BuildLineTable.tsx:405 msgid "Required Quantity" msgstr "" @@ -3848,7 +3855,7 @@ msgid "Please correct the errors in the selected parts" msgstr "" #: src/components/wizards/OrderPartsWizard.tsx:587 -#: src/tables/build/BuildLineTable.tsx:815 +#: src/tables/build/BuildLineTable.tsx:822 #: src/tables/part/PartTable.tsx:522 #: src/tables/sales/SalesOrderLineItemTable.tsx:370 msgid "Order Parts" @@ -4350,9 +4357,9 @@ msgstr "" #: src/forms/BuildForms.tsx:333 #: src/forms/BuildForms.tsx:408 #: src/forms/BuildForms.tsx:685 -#: src/tables/build/BuildAllocatedStockTable.tsx:150 +#: src/tables/build/BuildAllocatedStockTable.tsx:147 #: src/tables/build/BuildOutputTable.tsx:582 -#: src/tables/part/PartTestResultTable.tsx:272 +#: src/tables/part/PartTestResultTable.tsx:280 msgid "Build Output" msgstr "Saída da Produção" @@ -4363,7 +4370,7 @@ msgstr "" #: src/forms/BuildForms.tsx:336 #: src/forms/BuildForms.tsx:411 #: src/forms/BuildForms.tsx:475 -#: src/forms/PurchaseOrderForms.tsx:717 +#: src/forms/PurchaseOrderForms.tsx:769 #: src/forms/ReturnOrderForms.tsx:197 #: src/forms/ReturnOrderForms.tsx:244 #: src/forms/StockForms.tsx:712 @@ -4378,7 +4385,7 @@ msgstr "" #: src/tables/build/BuildOutputTable.tsx:404 #: src/tables/machine/MachineListTable.tsx:387 #: src/tables/part/PartPurchaseOrdersTable.tsx:38 -#: src/tables/part/PartTestResultTable.tsx:309 +#: src/tables/part/PartTestResultTable.tsx:317 #: src/tables/sales/ReturnOrderLineItemTable.tsx:138 #: src/tables/sales/ReturnOrderLineItemTable.tsx:176 #: src/tables/settings/CustomStateTable.tsx:79 @@ -4451,8 +4458,8 @@ msgstr "Os Pedidos de produção foram cancelados" #: src/pages/stock/StockDetail.tsx:153 #: src/tables/bom/BomTable.tsx:134 #: src/tables/bom/UsedInTable.tsx:40 -#: src/tables/build/BuildAllocatedStockTable.tsx:108 -#: src/tables/build/BuildLineTable.tsx:336 +#: src/tables/build/BuildAllocatedStockTable.tsx:105 +#: src/tables/build/BuildLineTable.tsx:337 #: src/tables/build/BuildOrderTable.tsx:79 #: src/tables/part/PartSalesAllocationsTable.tsx:61 #: src/tables/part/RelatedPartTable.tsx:73 @@ -4467,47 +4474,47 @@ msgstr "IPN" #: src/forms/BuildForms.tsx:632 #: src/forms/BuildForms.tsx:796 #: src/forms/BuildForms.tsx:897 -#: src/forms/SalesOrderForms.tsx:306 -#: src/tables/build/BuildAllocatedStockTable.tsx:139 -#: src/tables/build/BuildLineTable.tsx:182 +#: src/forms/SalesOrderForms.tsx:324 +#: src/tables/build/BuildAllocatedStockTable.tsx:136 +#: src/tables/build/BuildLineTable.tsx:183 #: src/tables/sales/SalesOrderLineItemTable.tsx:342 #: src/tables/stock/StockItemTable.tsx:338 msgid "Allocated" msgstr "Alocado" #: src/forms/BuildForms.tsx:667 -#: src/forms/SalesOrderForms.tsx:295 +#: src/forms/SalesOrderForms.tsx:313 #: src/pages/build/BuildDetail.tsx:108 #: src/pages/build/BuildDetail.tsx:326 msgid "Source Location" msgstr "Localização de Origem" #: src/forms/BuildForms.tsx:668 -#: src/forms/SalesOrderForms.tsx:296 +#: src/forms/SalesOrderForms.tsx:314 msgid "Select the source location for the stock allocation" msgstr "" #: src/forms/BuildForms.tsx:700 -#: src/forms/SalesOrderForms.tsx:336 -#: src/tables/build/BuildLineTable.tsx:574 -#: src/tables/build/BuildLineTable.tsx:731 -#: src/tables/build/BuildLineTable.tsx:830 +#: src/forms/SalesOrderForms.tsx:354 +#: src/tables/build/BuildLineTable.tsx:575 +#: src/tables/build/BuildLineTable.tsx:738 +#: src/tables/build/BuildLineTable.tsx:837 #: src/tables/sales/SalesOrderLineItemTable.tsx:380 #: src/tables/sales/SalesOrderLineItemTable.tsx:406 msgid "Allocate Stock" msgstr "Alocar estoque" #: src/forms/BuildForms.tsx:703 -#: src/forms/SalesOrderForms.tsx:341 +#: src/forms/SalesOrderForms.tsx:359 msgid "Stock items allocated" msgstr "" #: src/forms/BuildForms.tsx:816 #: src/forms/BuildForms.tsx:917 -#: src/tables/build/BuildAllocatedStockTable.tsx:240 -#: src/tables/build/BuildAllocatedStockTable.tsx:272 -#: src/tables/build/BuildLineTable.tsx:741 -#: src/tables/build/BuildLineTable.tsx:864 +#: src/tables/build/BuildAllocatedStockTable.tsx:243 +#: src/tables/build/BuildAllocatedStockTable.tsx:279 +#: src/tables/build/BuildLineTable.tsx:748 +#: src/tables/build/BuildLineTable.tsx:871 msgid "Consume Stock" msgstr "" @@ -4522,21 +4529,21 @@ msgstr "" #~ msgstr "Stock items consumed" #: src/forms/BuildForms.tsx:853 -#: src/tables/build/BuildLineTable.tsx:514 +#: src/tables/build/BuildLineTable.tsx:515 #: src/tables/part/PartBuildAllocationsTable.tsx:101 msgid "Fully consumed" msgstr "" #: src/forms/BuildForms.tsx:898 -#: src/tables/build/BuildLineTable.tsx:187 +#: src/tables/build/BuildLineTable.tsx:188 #: src/tables/stock/StockItemTable.tsx:367 msgid "Consumed" msgstr "" #: src/forms/CommonForms.tsx:88 -#: src/forms/PurchaseOrderForms.tsx:125 +#: src/forms/PurchaseOrderForms.tsx:176 #: src/forms/ReturnOrderForms.tsx:138 -#: src/forms/SalesOrderForms.tsx:164 +#: src/forms/SalesOrderForms.tsx:182 msgid "Select project code for this line item" msgstr "" @@ -4573,127 +4580,127 @@ msgstr "Categoria parente da peça" msgid "Subscribe to notifications for this category" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:388 -msgid "Assign Batch Code and Serial Numbers" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:390 -msgid "Assign Batch Code" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:410 -msgid "Choose Location" -msgstr "Escolher Localização" - -#: src/forms/PurchaseOrderForms.tsx:418 -msgid "Item Destination selected" -msgstr "Destino do item selecionado" - #: src/forms/PurchaseOrderForms.tsx:421 #~ msgid "Assign Batch Code{0}" #~ msgstr "Assign Batch Code{0}" -#: src/forms/PurchaseOrderForms.tsx:428 -msgid "Part category default location selected" -msgstr "Localização padrão da categoria de peça selecionada" +#: src/forms/PurchaseOrderForms.tsx:440 +msgid "Assign Batch Code and Serial Numbers" +msgstr "" -#: src/forms/PurchaseOrderForms.tsx:438 -msgid "Received stock location selected" -msgstr "Localização do estoque recebido selecionada" +#: src/forms/PurchaseOrderForms.tsx:442 +msgid "Assign Batch Code" +msgstr "" #: src/forms/PurchaseOrderForms.tsx:444 #: src/forms/StockForms.tsx:428 #~ msgid "Remove item from list" #~ msgstr "Remove item from list" -#: src/forms/PurchaseOrderForms.tsx:446 +#: src/forms/PurchaseOrderForms.tsx:462 +msgid "Choose Location" +msgstr "Escolher Localização" + +#: src/forms/PurchaseOrderForms.tsx:470 +msgid "Item Destination selected" +msgstr "Destino do item selecionado" + +#: src/forms/PurchaseOrderForms.tsx:480 +msgid "Part category default location selected" +msgstr "Localização padrão da categoria de peça selecionada" + +#: src/forms/PurchaseOrderForms.tsx:490 +msgid "Received stock location selected" +msgstr "Localização do estoque recebido selecionada" + +#: src/forms/PurchaseOrderForms.tsx:498 msgid "Default location selected" msgstr "Localização padrão selecionada" -#: src/forms/PurchaseOrderForms.tsx:507 +#: src/forms/PurchaseOrderForms.tsx:559 msgid "Set Location" msgstr "Definir localização" -#: src/forms/PurchaseOrderForms.tsx:524 -msgid "Set Expiry Date" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:532 -#: src/forms/StockForms.tsx:693 -msgid "Adjust Packaging" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:540 -#: src/forms/StockForms.tsx:684 -#: src/hooks/UseStockAdjustActions.tsx:148 -msgid "Change Status" -msgstr "Alterar Estado" - -#: src/forms/PurchaseOrderForms.tsx:546 -msgid "Add Note" -msgstr "" - #: src/forms/PurchaseOrderForms.tsx:566 #~ msgid "Serial numbers" #~ msgstr "Serial numbers" +#: src/forms/PurchaseOrderForms.tsx:576 +msgid "Set Expiry Date" +msgstr "" + #: src/forms/PurchaseOrderForms.tsx:582 #~ msgid "Store at line item destination" #~ msgstr "Store at line item destination" -#: src/forms/PurchaseOrderForms.tsx:610 -msgid "Store at default location" -msgstr "Armazenar no local padrão" - -#: src/forms/PurchaseOrderForms.tsx:625 -msgid "Store at line item destination " +#: src/forms/PurchaseOrderForms.tsx:584 +#: src/forms/StockForms.tsx:693 +msgid "Adjust Packaging" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:637 -msgid "Store with already received stock" -msgstr "Armazenar com estoque já recebido" +#: src/forms/PurchaseOrderForms.tsx:592 +#: src/forms/StockForms.tsx:684 +#: src/hooks/UseStockAdjustActions.tsx:148 +msgid "Change Status" +msgstr "Alterar Estado" + +#: src/forms/PurchaseOrderForms.tsx:598 +msgid "Add Note" +msgstr "" #: src/forms/PurchaseOrderForms.tsx:658 #~ msgid "Receive line items" #~ msgstr "Receive line items" -#: src/forms/PurchaseOrderForms.tsx:661 +#: src/forms/PurchaseOrderForms.tsx:662 +msgid "Store at default location" +msgstr "Armazenar no local padrão" + +#: src/forms/PurchaseOrderForms.tsx:677 +msgid "Store at line item destination " +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:689 +msgid "Store with already received stock" +msgstr "Armazenar com estoque já recebido" + +#: src/forms/PurchaseOrderForms.tsx:713 #: src/pages/build/BuildDetail.tsx:340 #: src/pages/stock/StockDetail.tsx:280 #: src/pages/stock/StockDetail.tsx:952 #: src/tables/Filter.tsx:83 -#: src/tables/build/BuildAllocatedStockTable.tsx:128 +#: src/tables/build/BuildAllocatedStockTable.tsx:125 #: src/tables/build/BuildOutputTable.tsx:112 -#: src/tables/part/PartTestResultTable.tsx:260 -#: src/tables/part/PartTestResultTable.tsx:281 +#: src/tables/part/PartTestResultTable.tsx:268 +#: src/tables/part/PartTestResultTable.tsx:289 #: src/tables/sales/SalesOrderAllocationTable.tsx:149 msgid "Batch Code" msgstr "Código de Lote" -#: src/forms/PurchaseOrderForms.tsx:662 +#: src/forms/PurchaseOrderForms.tsx:714 msgid "Enter batch code for received items" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:675 +#: src/forms/PurchaseOrderForms.tsx:727 #: src/forms/StockForms.tsx:218 msgid "Serial Numbers" msgstr "Números de Série" -#: src/forms/PurchaseOrderForms.tsx:676 +#: src/forms/PurchaseOrderForms.tsx:728 msgid "Enter serial numbers for received items" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:690 +#: src/forms/PurchaseOrderForms.tsx:742 #: src/pages/stock/StockDetail.tsx:382 #: src/tables/stock/StockItemTable.tsx:294 msgid "Expiry Date" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:691 +#: src/forms/PurchaseOrderForms.tsx:743 msgid "Enter an expiry date for received items" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:703 +#: src/forms/PurchaseOrderForms.tsx:755 #: src/forms/StockForms.tsx:728 #: src/pages/company/SupplierPartDetail.tsx:172 #: src/pages/company/SupplierPartDetail.tsx:236 @@ -4702,19 +4709,19 @@ msgstr "" msgid "Packaging" msgstr "Embalagem" -#: src/forms/PurchaseOrderForms.tsx:727 +#: src/forms/PurchaseOrderForms.tsx:779 #: src/pages/company/SupplierPartDetail.tsx:120 #: src/tables/ColumnRenderers.tsx:332 msgid "Note" msgstr "Nota" -#: src/forms/PurchaseOrderForms.tsx:799 +#: src/forms/PurchaseOrderForms.tsx:851 #: src/pages/company/SupplierPartDetail.tsx:138 #: src/tables/purchasing/SupplierPriceBreakTable.tsx:49 msgid "SKU" msgstr "SKU" -#: src/forms/PurchaseOrderForms.tsx:800 +#: src/forms/PurchaseOrderForms.tsx:852 #: src/tables/part/PartPurchaseOrdersTable.tsx:127 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:213 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:283 @@ -4722,11 +4729,11 @@ msgstr "SKU" msgid "Received" msgstr "Recebido" -#: src/forms/PurchaseOrderForms.tsx:817 +#: src/forms/PurchaseOrderForms.tsx:869 msgid "Receive Line Items" msgstr "Receber item de linha" -#: src/forms/PurchaseOrderForms.tsx:823 +#: src/forms/PurchaseOrderForms.tsx:875 msgid "Items received" msgstr "" @@ -4738,7 +4745,7 @@ msgstr "" msgid "Item received into stock" msgstr "" -#: src/forms/SalesOrderForms.tsx:401 +#: src/forms/SalesOrderForms.tsx:419 msgid "Leave blank to use the order address" msgstr "" @@ -5933,6 +5940,9 @@ msgstr "" #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:310 #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:401 +#: src/tables/build/BuildAllocatedStockTable.tsx:181 +#: src/tables/build/BuildLineTable.tsx:668 +#: src/tables/sales/SalesOrderAllocationTable.tsx:220 msgid "Confirm Removal" msgstr "" @@ -6871,8 +6881,8 @@ msgstr "Externos" #: src/pages/sales/ReturnOrderDetail.tsx:108 #: src/pages/sales/SalesOrderDetail.tsx:98 #: src/tables/ColumnRenderers.tsx:321 -#: src/tables/build/BuildAllocatedStockTable.tsx:115 -#: src/tables/build/BuildLineTable.tsx:352 +#: src/tables/build/BuildAllocatedStockTable.tsx:112 +#: src/tables/build/BuildLineTable.tsx:353 msgid "Reference" msgstr "Referência" @@ -7133,7 +7143,7 @@ msgstr "Cancelar pedido" #: src/pages/build/BuildDetail.tsx:742 #: src/pages/stock/StockDetail.tsx:344 -#: src/tables/build/BuildAllocatedStockTable.tsx:85 +#: src/tables/build/BuildAllocatedStockTable.tsx:82 #: src/tables/part/PartBuildAllocationsTable.tsx:45 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:157 #: src/tables/stock/StockTrackingTable.tsx:109 @@ -7601,7 +7611,7 @@ msgstr "Palavras-chave" #: src/pages/part/PartDetail.tsx:542 #: src/tables/bom/BomTable.tsx:439 -#: src/tables/build/BuildLineTable.tsx:305 +#: src/tables/build/BuildLineTable.tsx:306 #: src/tables/part/PartTable.tsx:319 #: src/tables/sales/SalesOrderLineItemTable.tsx:138 msgid "Available Stock" @@ -7609,7 +7619,7 @@ msgstr "Estoque Disponível" #: src/pages/part/PartDetail.tsx:548 #: src/tables/bom/BomTable.tsx:341 -#: src/tables/build/BuildLineTable.tsx:267 +#: src/tables/build/BuildLineTable.tsx:268 #: src/tables/sales/SalesOrderLineItemTable.tsx:180 msgid "On order" msgstr "Na ordem" @@ -7783,7 +7793,7 @@ msgstr "" #: src/pages/part/PartDetail.tsx:1144 #: src/pages/stock/StockDetail.tsx:884 -#: src/tables/build/BuildLineTable.tsx:761 +#: src/tables/build/BuildLineTable.tsx:768 msgid "Order Stock" msgstr "Encomendar Estoque" @@ -9220,13 +9230,13 @@ msgstr "" #~ msgstr "Show asssmbled items" #: src/tables/bom/BomTable.tsx:315 -#: src/tables/build/BuildLineTable.tsx:276 +#: src/tables/build/BuildLineTable.tsx:277 #: src/tables/part/PartTable.tsx:145 msgid "External stock" msgstr "Estoque externo" #: src/tables/bom/BomTable.tsx:323 -#: src/tables/build/BuildLineTable.tsx:239 +#: src/tables/build/BuildLineTable.tsx:240 msgid "Includes substitute stock" msgstr "Inclui substitutos de estoque" @@ -9235,7 +9245,7 @@ msgstr "Inclui substitutos de estoque" #~ msgstr "Edit Bom Item" #: src/tables/bom/BomTable.tsx:332 -#: src/tables/build/BuildLineTable.tsx:249 +#: src/tables/build/BuildLineTable.tsx:250 #: src/tables/sales/SalesOrderLineItemTable.tsx:166 msgid "Includes variant stock" msgstr "Inclui estoque variante" @@ -9273,8 +9283,8 @@ msgid "Stock Information" msgstr "Informação do Estoque" #: src/tables/bom/BomTable.tsx:399 -#: src/tables/build/BuildLineTable.tsx:496 -#: src/tables/build/BuildLineTable.tsx:537 +#: src/tables/build/BuildLineTable.tsx:497 +#: src/tables/build/BuildLineTable.tsx:538 msgid "Consumable item" msgstr "Item Consumível" @@ -9283,7 +9293,7 @@ msgid "No available stock" msgstr "" #: src/tables/bom/BomTable.tsx:420 -#: src/tables/build/BuildLineTable.tsx:213 +#: src/tables/build/BuildLineTable.tsx:214 msgid "Show testable items" msgstr "" @@ -9292,7 +9302,7 @@ msgid "Show trackable items" msgstr "Mostrar partes rastreáveis" #: src/tables/bom/BomTable.tsx:430 -#: src/tables/build/BuildLineTable.tsx:208 +#: src/tables/build/BuildLineTable.tsx:209 msgid "Show assembled items" msgstr "" @@ -9336,7 +9346,7 @@ msgstr "" #: src/tables/bom/BomTable.tsx:464 #: src/tables/bom/UsedInTable.tsx:85 -#: src/tables/build/BuildLineTable.tsx:202 +#: src/tables/build/BuildLineTable.tsx:203 msgid "Optional" msgstr "Opcional" @@ -9346,7 +9356,7 @@ msgid "Show optional items" msgstr "Mostrar itens opcionais" #: src/tables/bom/BomTable.tsx:469 -#: src/tables/build/BuildLineTable.tsx:197 +#: src/tables/build/BuildLineTable.tsx:198 msgid "Consumable" msgstr "Consumível" @@ -9434,7 +9444,7 @@ msgid "Bill of materials cannot be edited, as the part is locked" msgstr "" #: src/tables/bom/UsedInTable.tsx:34 -#: src/tables/build/BuildLineTable.tsx:207 +#: src/tables/build/BuildLineTable.tsx:208 #: src/tables/part/ParametricPartTable.tsx:364 #: src/tables/part/PartBuildAllocationsTable.tsx:60 #: src/tables/part/PartTable.tsx:209 @@ -9456,11 +9466,11 @@ msgstr "Rastreável" msgid "Show trackable assemblies" msgstr "Mostrar montagens rastreáveis" -#: src/tables/build/BuildAllocatedStockTable.tsx:67 +#: src/tables/build/BuildAllocatedStockTable.tsx:64 msgid "Allocated to Output" msgstr "" -#: src/tables/build/BuildAllocatedStockTable.tsx:68 +#: src/tables/build/BuildAllocatedStockTable.tsx:65 msgid "Show items allocated to a build output" msgstr "" @@ -9473,7 +9483,7 @@ msgstr "" #~ msgid "Include orders for part variants" #~ msgstr "Include orders for part variants" -#: src/tables/build/BuildAllocatedStockTable.tsx:97 +#: src/tables/build/BuildAllocatedStockTable.tsx:94 #: src/tables/part/PartBuildAllocationsTable.tsx:84 #: src/tables/part/PartPurchaseOrdersTable.tsx:132 #: src/tables/part/PartSalesAllocationsTable.tsx:69 @@ -9483,40 +9493,58 @@ msgid "Order Status" msgstr "" #: src/tables/build/BuildAllocatedStockTable.tsx:164 -#~ msgid "Edit Build Item" -#~ msgstr "Edit Build Item" - -#: src/tables/build/BuildAllocatedStockTable.tsx:167 -#: src/tables/build/BuildLineTable.tsx:650 +#: src/tables/build/BuildLineTable.tsx:651 msgid "Edit Stock Allocation" msgstr "" +#: src/tables/build/BuildAllocatedStockTable.tsx:164 +#~ msgid "Edit Build Item" +#~ msgstr "Edit Build Item" + #: src/tables/build/BuildAllocatedStockTable.tsx:174 #~ msgid "Delete Build Item" #~ msgstr "Delete Build Item" -#: src/tables/build/BuildAllocatedStockTable.tsx:180 -#: src/tables/build/BuildLineTable.tsx:663 -msgid "Delete Stock Allocation" +#: src/tables/build/BuildAllocatedStockTable.tsx:177 +#: src/tables/build/BuildLineTable.tsx:664 +#: src/tables/sales/SalesOrderAllocationTable.tsx:218 +msgid "Remove Allocated Stock" msgstr "" -#: src/tables/build/BuildAllocatedStockTable.tsx:239 +#: src/tables/build/BuildAllocatedStockTable.tsx:180 +#: src/tables/build/BuildLineTable.tsx:663 +#~ msgid "Delete Stock Allocation" +#~ msgstr "Delete Stock Allocation" + +#: src/tables/build/BuildAllocatedStockTable.tsx:182 +#: src/tables/build/BuildLineTable.tsx:669 +#: src/tables/sales/SalesOrderAllocationTable.tsx:221 +msgid "Are you sure you want to remove this allocated stock from the order?" +msgstr "" + +#: src/tables/build/BuildAllocatedStockTable.tsx:242 msgid "Consume" msgstr "" +#: src/tables/build/BuildAllocatedStockTable.tsx:259 +#: src/tables/build/BuildLineTable.tsx:112 +#: src/tables/sales/SalesOrderAllocationTable.tsx:248 +msgid "Remove allocated stock" +msgstr "" + #: src/tables/build/BuildLineTable.tsx:59 #~ msgid "Show lines with available stock" #~ msgstr "Show lines with available stock" -#: src/tables/build/BuildLineTable.tsx:120 +#: src/tables/build/BuildLineTable.tsx:121 msgid "View Stock Item" msgstr "" -#: src/tables/build/BuildLineTable.tsx:183 +#: src/tables/build/BuildLineTable.tsx:184 msgid "Show fully allocated lines" msgstr "" -#: src/tables/build/BuildLineTable.tsx:188 +#: src/tables/build/BuildLineTable.tsx:189 msgid "Show fully consumed lines" msgstr "" @@ -9524,124 +9552,124 @@ msgstr "" #~ msgid "Show allocated lines" #~ msgstr "Show allocated lines" -#: src/tables/build/BuildLineTable.tsx:193 +#: src/tables/build/BuildLineTable.tsx:194 msgid "Show items with sufficient available stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:198 +#: src/tables/build/BuildLineTable.tsx:199 msgid "Show consumable lines" msgstr "Mostrar linhas de consumíveis" -#: src/tables/build/BuildLineTable.tsx:203 +#: src/tables/build/BuildLineTable.tsx:204 msgid "Show optional lines" msgstr "Mostrar itens opcionais" -#: src/tables/build/BuildLineTable.tsx:212 +#: src/tables/build/BuildLineTable.tsx:213 #: src/tables/part/PartTable.tsx:233 msgid "Testable" msgstr "" -#: src/tables/build/BuildLineTable.tsx:217 +#: src/tables/build/BuildLineTable.tsx:218 #: src/tables/stock/StockItemTable.tsx:388 msgid "Tracked" msgstr "Rastreado" -#: src/tables/build/BuildLineTable.tsx:218 +#: src/tables/build/BuildLineTable.tsx:219 msgid "Show tracked lines" msgstr "Mostrar linhas rastreadas" -#: src/tables/build/BuildLineTable.tsx:223 +#: src/tables/build/BuildLineTable.tsx:224 msgid "Show items with stock on order" msgstr "" -#: src/tables/build/BuildLineTable.tsx:258 +#: src/tables/build/BuildLineTable.tsx:259 #: src/tables/sales/SalesOrderLineItemTable.tsx:172 msgid "In production" msgstr "Em produção" -#: src/tables/build/BuildLineTable.tsx:286 +#: src/tables/build/BuildLineTable.tsx:287 msgid "Insufficient stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:302 +#: src/tables/build/BuildLineTable.tsx:303 #: src/tables/sales/SalesOrderLineItemTable.tsx:160 #: src/tables/stock/StockItemTable.tsx:191 msgid "No stock available" msgstr "Nenhum estoque disponível" -#: src/tables/build/BuildLineTable.tsx:375 +#: src/tables/build/BuildLineTable.tsx:376 msgid "Gets Inherited" msgstr "" -#: src/tables/build/BuildLineTable.tsx:388 +#: src/tables/build/BuildLineTable.tsx:389 msgid "Unit Quantity" msgstr "Quantidade Unitária" -#: src/tables/build/BuildLineTable.tsx:415 +#: src/tables/build/BuildLineTable.tsx:416 msgid "Setup Quantity" msgstr "" -#: src/tables/build/BuildLineTable.tsx:424 +#: src/tables/build/BuildLineTable.tsx:425 msgid "Attrition" msgstr "" -#: src/tables/build/BuildLineTable.tsx:432 +#: src/tables/build/BuildLineTable.tsx:433 msgid "Rounding Multiple" msgstr "" -#: src/tables/build/BuildLineTable.tsx:441 +#: src/tables/build/BuildLineTable.tsx:442 msgid "BOM Information" msgstr "" -#: src/tables/build/BuildLineTable.tsx:515 +#: src/tables/build/BuildLineTable.tsx:516 #: src/tables/part/PartBuildAllocationsTable.tsx:102 msgid "Fully allocated" msgstr "" -#: src/tables/build/BuildLineTable.tsx:563 +#: src/tables/build/BuildLineTable.tsx:564 #: src/tables/sales/SalesOrderLineItemTable.tsx:311 msgid "Create Build Order" msgstr "" -#: src/tables/build/BuildLineTable.tsx:592 +#: src/tables/build/BuildLineTable.tsx:593 msgid "Auto allocation in progress" msgstr "" -#: src/tables/build/BuildLineTable.tsx:595 -#: src/tables/build/BuildLineTable.tsx:802 +#: src/tables/build/BuildLineTable.tsx:596 +#: src/tables/build/BuildLineTable.tsx:809 msgid "Auto Allocate Stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:596 +#: src/tables/build/BuildLineTable.tsx:597 msgid "Automatically allocate stock to this build according to the selected options" msgstr "" -#: src/tables/build/BuildLineTable.tsx:616 -#: src/tables/build/BuildLineTable.tsx:630 -#: src/tables/build/BuildLineTable.tsx:751 -#: src/tables/build/BuildLineTable.tsx:852 +#: src/tables/build/BuildLineTable.tsx:617 +#: src/tables/build/BuildLineTable.tsx:631 +#: src/tables/build/BuildLineTable.tsx:758 +#: src/tables/build/BuildLineTable.tsx:859 #: src/tables/build/BuildOutputTable.tsx:355 #: src/tables/build/BuildOutputTable.tsx:360 msgid "Deallocate Stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:632 +#: src/tables/build/BuildLineTable.tsx:633 msgid "Deallocate all untracked stock for this build order" msgstr "" -#: src/tables/build/BuildLineTable.tsx:634 +#: src/tables/build/BuildLineTable.tsx:635 msgid "Deallocate stock from the selected line item" msgstr "" -#: src/tables/build/BuildLineTable.tsx:638 +#: src/tables/build/BuildLineTable.tsx:639 msgid "Stock has been deallocated" msgstr "" -#: src/tables/build/BuildLineTable.tsx:771 +#: src/tables/build/BuildLineTable.tsx:778 msgid "Build Stock" msgstr "Produzir Estoque" -#: src/tables/build/BuildLineTable.tsx:784 +#: src/tables/build/BuildLineTable.tsx:791 #: src/tables/sales/SalesOrderLineItemTable.tsx:487 msgid "View Part" msgstr "" @@ -9740,7 +9768,7 @@ msgid "Serialize Build Output" msgstr "" #: src/tables/build/BuildOutputTable.tsx:405 -#: src/tables/part/PartTestResultTable.tsx:310 +#: src/tables/part/PartTestResultTable.tsx:318 #: src/tables/stock/StockItemTable.tsx:328 msgid "Filter by stock status" msgstr "Filtrar por estado do estoque" @@ -9965,8 +9993,8 @@ msgid "View Item" msgstr "" #: src/tables/general/ExtraLineItemTable.tsx:95 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:299 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:403 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:300 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:405 #: src/tables/sales/ReturnOrderLineItemTable.tsx:83 #: src/tables/sales/ReturnOrderLineItemTable.tsx:187 #: src/tables/sales/SalesOrderLineItemTable.tsx:252 @@ -9975,14 +10003,14 @@ msgid "Add Line Item" msgstr "Adicionar item de linha" #: src/tables/general/ExtraLineItemTable.tsx:108 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:320 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:322 #: src/tables/sales/ReturnOrderLineItemTable.tsx:96 #: src/tables/sales/SalesOrderLineItemTable.tsx:271 msgid "Edit Line Item" msgstr "Editar item de linha" #: src/tables/general/ExtraLineItemTable.tsx:117 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:329 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:331 #: src/tables/sales/ReturnOrderLineItemTable.tsx:105 #: src/tables/sales/SalesOrderLineItemTable.tsx:280 msgid "Delete Line Item" @@ -10274,7 +10302,7 @@ msgid "Required Stock" msgstr "" #: src/tables/part/PartBuildAllocationsTable.tsx:124 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:381 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:383 msgid "View Build Order" msgstr "" @@ -10618,8 +10646,8 @@ msgstr "" #: src/tables/part/PartTestResultTable.tsx:103 #: src/tables/part/PartTestResultTable.tsx:181 -#: src/tables/part/PartTestResultTable.tsx:320 -#: src/tables/part/PartTestResultTable.tsx:334 +#: src/tables/part/PartTestResultTable.tsx:328 +#: src/tables/part/PartTestResultTable.tsx:342 #: src/tables/stock/StockItemTestResultTable.tsx:296 #: src/tables/stock/StockItemTestResultTable.tsx:368 #: src/tables/stock/StockItemTestResultTable.tsx:429 @@ -10644,7 +10672,7 @@ msgstr "" msgid "No Result" msgstr "Sem Resultado" -#: src/tables/part/PartTestResultTable.tsx:298 +#: src/tables/part/PartTestResultTable.tsx:306 msgid "Show build outputs currently in production" msgstr "" @@ -11074,7 +11102,7 @@ msgid "Show manufacturer parts for active manufacturers." msgstr "" #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:115 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:397 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:399 msgid "Import Line Items" msgstr "" @@ -11100,11 +11128,11 @@ msgstr "" #~ msgid "Add line item" #~ msgstr "Add line item" -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:350 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:352 msgid "Receive line item" msgstr "Receber item de linha" -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:414 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:416 msgid "Receive items" msgstr "Receber itens" @@ -11202,25 +11230,25 @@ msgid "Not shipped" msgstr "" #: src/tables/sales/SalesOrderAllocationTable.tsx:211 -#: src/tables/sales/SalesOrderAllocationTable.tsx:229 +#: src/tables/sales/SalesOrderAllocationTable.tsx:235 msgid "Edit Allocation" msgstr "" #: src/tables/sales/SalesOrderAllocationTable.tsx:218 #: src/tables/sales/SalesOrderAllocationTable.tsx:241 -msgid "Delete Allocation" -msgstr "" +#~ msgid "Delete Allocation" +#~ msgstr "Delete Allocation" -#: src/tables/sales/SalesOrderAllocationTable.tsx:252 -#: src/tables/sales/SalesOrderAllocationTable.tsx:253 +#: src/tables/sales/SalesOrderAllocationTable.tsx:261 +#: src/tables/sales/SalesOrderAllocationTable.tsx:262 msgid "View Shipment" msgstr "" -#: src/tables/sales/SalesOrderAllocationTable.tsx:308 +#: src/tables/sales/SalesOrderAllocationTable.tsx:317 msgid "Assign to Shipment" msgstr "" -#: src/tables/sales/SalesOrderAllocationTable.tsx:324 +#: src/tables/sales/SalesOrderAllocationTable.tsx:333 msgid "Assign to shipment" msgstr "" diff --git a/src/frontend/src/locales/pt_BR/messages.po b/src/frontend/src/locales/pt_BR/messages.po index 9d4dbfca1f..3348ee4370 100644 --- a/src/frontend/src/locales/pt_BR/messages.po +++ b/src/frontend/src/locales/pt_BR/messages.po @@ -8,7 +8,7 @@ msgstr "" "Language: pt\n" "Project-Id-Version: inventree\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2025-11-19 19:39\n" +"PO-Revision-Date: 2025-11-22 06:25\n" "Last-Translator: \n" "Language-Team: Portuguese, Brazilian\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" @@ -56,7 +56,7 @@ msgstr "Cancelar" #: lib/components/RowActions.tsx:136 #: src/components/nav/NavigationDrawer.tsx:190 -#: src/forms/PurchaseOrderForms.tsx:802 +#: src/forms/PurchaseOrderForms.tsx:854 #: src/forms/StockForms.tsx:796 #: src/forms/StockForms.tsx:843 #: src/forms/StockForms.tsx:889 @@ -103,9 +103,9 @@ msgstr "Não" #: src/forms/BuildForms.tsx:630 #: src/forms/BuildForms.tsx:793 #: src/forms/BuildForms.tsx:896 -#: src/forms/PurchaseOrderForms.tsx:798 +#: src/forms/PurchaseOrderForms.tsx:850 #: src/forms/ReturnOrderForms.tsx:242 -#: src/forms/SalesOrderForms.tsx:305 +#: src/forms/SalesOrderForms.tsx:323 #: src/forms/StockForms.tsx:360 #: src/forms/StockForms.tsx:791 #: src/forms/StockForms.tsx:838 @@ -119,6 +119,7 @@ msgstr "Não" #: src/pages/build/BuildDetail.tsx:200 #: src/pages/part/PartDetail.tsx:1207 #: src/tables/ColumnRenderers.tsx:91 +#: src/tables/part/PartTestResultTable.tsx:247 #: src/tables/part/RelatedPartTable.tsx:53 #: src/tables/stock/StockTrackingTable.tsx:87 msgid "Part" @@ -158,7 +159,7 @@ msgstr "Teste de Modelos de Peças" #: src/components/wizards/OrderPartsWizard.tsx:290 #: src/pages/company/SupplierPartDetail.tsx:413 #: src/pages/stock/StockDetail.tsx:289 -#: src/tables/build/BuildAllocatedStockTable.tsx:155 +#: src/tables/build/BuildAllocatedStockTable.tsx:152 #: src/tables/part/PartPurchaseOrdersTable.tsx:50 #: src/tables/purchasing/SupplierPartTable.tsx:83 #: src/tables/stock/StockItemTable.tsx:247 @@ -201,9 +202,9 @@ msgstr "Categorias de Peça" #: src/forms/BuildForms.tsx:473 #: src/forms/BuildForms.tsx:633 #: src/forms/BuildForms.tsx:794 -#: src/forms/SalesOrderForms.tsx:307 +#: src/forms/SalesOrderForms.tsx:325 #: src/pages/stock/StockDetail.tsx:1005 -#: src/tables/part/PartTestResultTable.tsx:248 +#: src/tables/part/PartTestResultTable.tsx:256 #: src/tables/stock/StockTrackingTable.tsx:48 #: src/tables/stock/StockTrackingTable.tsx:55 msgid "Stock Item" @@ -517,7 +518,7 @@ msgstr "Listas de Seleção" #: src/components/dashboard/DashboardLayout.tsx:281 #: src/components/editors/NotesEditor.tsx:74 #: src/components/editors/TemplateEditor/TemplateEditor.tsx:158 -#: src/components/forms/fields/ApiFormField.tsx:273 +#: src/components/forms/fields/ApiFormField.tsx:237 #: src/components/forms/fields/TableField.tsx:45 #: src/components/importer/ImportDataSelector.tsx:192 #: src/components/importer/ImporterColumnSelector.tsx:234 @@ -642,8 +643,8 @@ msgstr "Digitar informações do código de barras" #: src/components/barcodes/BarcodeScanDialog.tsx:49 #: src/components/buttons/ScanButton.tsx:15 #: src/components/nav/NavigationDrawer.tsx:122 -#: src/forms/PurchaseOrderForms.tsx:457 -#: src/forms/PurchaseOrderForms.tsx:563 +#: src/forms/PurchaseOrderForms.tsx:509 +#: src/forms/PurchaseOrderForms.tsx:615 msgid "Scan Barcode" msgstr "Ler Código de Barras" @@ -728,7 +729,7 @@ msgstr "Isto irá remover o link com o código de barras associado" #: src/components/barcodes/QRCode.tsx:205 #: src/components/items/ActionDropdown.tsx:192 -#: src/forms/PurchaseOrderForms.tsx:554 +#: src/forms/PurchaseOrderForms.tsx:606 msgid "Unlink Barcode" msgstr "Desvincular Código de Barras" @@ -1216,6 +1217,12 @@ msgstr "Remover imagem associada a este item?" #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:884 #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:903 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:254 +#: src/tables/build/BuildAllocatedStockTable.tsx:178 +#: src/tables/build/BuildAllocatedStockTable.tsx:258 +#: src/tables/build/BuildLineTable.tsx:111 +#: src/tables/build/BuildLineTable.tsx:665 +#: src/tables/sales/SalesOrderAllocationTable.tsx:224 +#: src/tables/sales/SalesOrderAllocationTable.tsx:247 msgid "Remove" msgstr "Remover" @@ -1241,7 +1248,7 @@ msgid "Upload Error" msgstr "Erro no carregamento" #: src/components/details/DetailsImage.tsx:250 -#: src/components/forms/fields/TextField.tsx:65 +#: src/components/forms/fields/AutoFillRightSection.tsx:34 msgid "Clear" msgstr "Limpar" @@ -1817,10 +1824,14 @@ msgstr "Parado" msgid "Running" msgstr "Em execução" -#: src/components/forms/fields/ApiFormField.tsx:233 +#: src/components/forms/fields/ApiFormField.tsx:197 msgid "Select file to upload" msgstr "" +#: src/components/forms/fields/AutoFillRightSection.tsx:47 +msgid "Accept suggested value" +msgstr "" + #: src/components/forms/fields/DateField.tsx:76 msgid "Select date" msgstr "" @@ -1875,10 +1886,6 @@ msgstr "Não há itens disponíveis" msgid "Add new row" msgstr "Adicionar nova linha" -#: src/components/forms/fields/TextField.tsx:82 -msgid "Accept suggested value" -msgstr "" - #: src/components/images/DetailsImage.tsx:252 #~ msgid "Select image" #~ msgstr "Select image" @@ -2225,8 +2232,8 @@ msgstr "Nenhum item" #: src/pages/part/PartDetail.tsx:994 #: src/pages/stock/StockDetail.tsx:265 #: src/pages/stock/StockDetail.tsx:942 -#: src/tables/build/BuildAllocatedStockTable.tsx:135 -#: src/tables/build/BuildLineTable.tsx:192 +#: src/tables/build/BuildAllocatedStockTable.tsx:132 +#: src/tables/build/BuildLineTable.tsx:193 #: src/tables/part/PartTable.tsx:137 #: src/tables/stock/StockItemTable.tsx:182 #: src/tables/stock/StockItemTable.tsx:343 @@ -2784,7 +2791,7 @@ msgstr "" #: src/pages/sales/SalesOrderDetail.tsx:119 #: src/pages/stock/LocationDetail.tsx:102 #: src/tables/ColumnRenderers.tsx:278 -#: src/tables/build/BuildAllocatedStockTable.tsx:91 +#: src/tables/build/BuildAllocatedStockTable.tsx:88 #: src/tables/machine/MachineTypeTable.tsx:161 #: src/tables/machine/MachineTypeTable.tsx:257 #: src/tables/plugin/PluginListTable.tsx:110 @@ -2966,7 +2973,7 @@ msgstr "Sem Estoque" #: src/pages/company/SupplierPartDetail.tsx:394 #: src/pages/part/PartDetail.tsx:1015 #: src/tables/bom/BomTable.tsx:444 -#: src/tables/build/BuildLineTable.tsx:222 +#: src/tables/build/BuildLineTable.tsx:223 #: src/tables/part/PartTable.tsx:108 msgid "On Order" msgstr "No pedido" @@ -2976,7 +2983,7 @@ msgstr "No pedido" #: src/pages/part/PartDetail.tsx:587 #: src/pages/part/PartDetail.tsx:1021 #: src/pages/stock/StockDetail.tsx:925 -#: src/tables/part/PartTestResultTable.tsx:297 +#: src/tables/part/PartTestResultTable.tsx:305 #: src/tables/stock/StockItemTable.tsx:359 msgid "In Production" msgstr "Em Produção" @@ -3000,7 +3007,7 @@ msgstr "Categoria" #: src/components/render/Stock.tsx:114 #: src/components/render/Stock.tsx:132 #: src/forms/BuildForms.tsx:795 -#: src/forms/PurchaseOrderForms.tsx:595 +#: src/forms/PurchaseOrderForms.tsx:647 #: src/forms/StockForms.tsx:792 #: src/forms/StockForms.tsx:839 #: src/forms/StockForms.tsx:885 @@ -3023,7 +3030,7 @@ msgstr "Localização" #: src/components/render/Stock.tsx:99 #: src/pages/stock/StockDetail.tsx:198 #: src/pages/stock/StockDetail.tsx:930 -#: src/tables/build/BuildAllocatedStockTable.tsx:121 +#: src/tables/build/BuildAllocatedStockTable.tsx:118 #: src/tables/build/BuildOutputTable.tsx:107 #: src/tables/sales/SalesOrderAllocationTable.tsx:142 msgid "Serial Number" @@ -3034,9 +3041,9 @@ msgstr "Número de Série" #: src/forms/BuildForms.tsx:240 #: src/forms/BuildForms.tsx:634 #: src/forms/BuildForms.tsx:797 -#: src/forms/PurchaseOrderForms.tsx:801 +#: src/forms/PurchaseOrderForms.tsx:853 #: src/forms/ReturnOrderForms.tsx:243 -#: src/forms/SalesOrderForms.tsx:308 +#: src/forms/SalesOrderForms.tsx:326 #: src/forms/StockForms.tsx:841 #: src/pages/part/PartStockHistoryDetail.tsx:56 #: src/pages/part/PartStockHistoryDetail.tsx:210 @@ -3046,9 +3053,9 @@ msgstr "Número de Série" #: src/pages/part/pricing/PriceBreakPanel.tsx:172 #: src/pages/stock/StockDetail.tsx:258 #: src/pages/stock/StockDetail.tsx:936 -#: src/tables/build/BuildLineTable.tsx:86 +#: src/tables/build/BuildLineTable.tsx:83 #: src/tables/part/PartPurchaseOrdersTable.tsx:94 -#: src/tables/part/PartTestResultTable.tsx:269 +#: src/tables/part/PartTestResultTable.tsx:277 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:175 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:206 #: src/tables/purchasing/SupplierPriceBreakTable.tsx:69 @@ -3070,7 +3077,7 @@ msgstr "Quantidade" #: src/forms/StockForms.tsx:1048 #: src/forms/StockForms.tsx:1096 #: src/forms/StockForms.tsx:1140 -#: src/tables/build/BuildLineTable.tsx:96 +#: src/tables/build/BuildLineTable.tsx:93 msgid "Batch" msgstr "Lote" @@ -3755,7 +3762,7 @@ msgid "In Stock" msgstr "Em Estoque" #: src/components/wizards/OrderPartsWizard.tsx:146 -#: src/tables/build/BuildLineTable.tsx:404 +#: src/tables/build/BuildLineTable.tsx:405 msgid "Required Quantity" msgstr "" @@ -3847,7 +3854,7 @@ msgid "Please correct the errors in the selected parts" msgstr "" #: src/components/wizards/OrderPartsWizard.tsx:587 -#: src/tables/build/BuildLineTable.tsx:815 +#: src/tables/build/BuildLineTable.tsx:822 #: src/tables/part/PartTable.tsx:522 #: src/tables/sales/SalesOrderLineItemTable.tsx:370 msgid "Order Parts" @@ -4349,9 +4356,9 @@ msgstr "" #: src/forms/BuildForms.tsx:333 #: src/forms/BuildForms.tsx:408 #: src/forms/BuildForms.tsx:685 -#: src/tables/build/BuildAllocatedStockTable.tsx:150 +#: src/tables/build/BuildAllocatedStockTable.tsx:147 #: src/tables/build/BuildOutputTable.tsx:582 -#: src/tables/part/PartTestResultTable.tsx:272 +#: src/tables/part/PartTestResultTable.tsx:280 msgid "Build Output" msgstr "Saída da Produção" @@ -4362,7 +4369,7 @@ msgstr "" #: src/forms/BuildForms.tsx:336 #: src/forms/BuildForms.tsx:411 #: src/forms/BuildForms.tsx:475 -#: src/forms/PurchaseOrderForms.tsx:717 +#: src/forms/PurchaseOrderForms.tsx:769 #: src/forms/ReturnOrderForms.tsx:197 #: src/forms/ReturnOrderForms.tsx:244 #: src/forms/StockForms.tsx:712 @@ -4377,7 +4384,7 @@ msgstr "" #: src/tables/build/BuildOutputTable.tsx:404 #: src/tables/machine/MachineListTable.tsx:387 #: src/tables/part/PartPurchaseOrdersTable.tsx:38 -#: src/tables/part/PartTestResultTable.tsx:309 +#: src/tables/part/PartTestResultTable.tsx:317 #: src/tables/sales/ReturnOrderLineItemTable.tsx:138 #: src/tables/sales/ReturnOrderLineItemTable.tsx:176 #: src/tables/settings/CustomStateTable.tsx:79 @@ -4450,8 +4457,8 @@ msgstr "Saídas de produção foram canceladas" #: src/pages/stock/StockDetail.tsx:153 #: src/tables/bom/BomTable.tsx:134 #: src/tables/bom/UsedInTable.tsx:40 -#: src/tables/build/BuildAllocatedStockTable.tsx:108 -#: src/tables/build/BuildLineTable.tsx:336 +#: src/tables/build/BuildAllocatedStockTable.tsx:105 +#: src/tables/build/BuildLineTable.tsx:337 #: src/tables/build/BuildOrderTable.tsx:79 #: src/tables/part/PartSalesAllocationsTable.tsx:61 #: src/tables/part/RelatedPartTable.tsx:73 @@ -4466,47 +4473,47 @@ msgstr "IPN" #: src/forms/BuildForms.tsx:632 #: src/forms/BuildForms.tsx:796 #: src/forms/BuildForms.tsx:897 -#: src/forms/SalesOrderForms.tsx:306 -#: src/tables/build/BuildAllocatedStockTable.tsx:139 -#: src/tables/build/BuildLineTable.tsx:182 +#: src/forms/SalesOrderForms.tsx:324 +#: src/tables/build/BuildAllocatedStockTable.tsx:136 +#: src/tables/build/BuildLineTable.tsx:183 #: src/tables/sales/SalesOrderLineItemTable.tsx:342 #: src/tables/stock/StockItemTable.tsx:338 msgid "Allocated" msgstr "Alocado" #: src/forms/BuildForms.tsx:667 -#: src/forms/SalesOrderForms.tsx:295 +#: src/forms/SalesOrderForms.tsx:313 #: src/pages/build/BuildDetail.tsx:108 #: src/pages/build/BuildDetail.tsx:326 msgid "Source Location" msgstr "Local de Origem" #: src/forms/BuildForms.tsx:668 -#: src/forms/SalesOrderForms.tsx:296 +#: src/forms/SalesOrderForms.tsx:314 msgid "Select the source location for the stock allocation" msgstr "Selecione o local de origem para alocação de estoque" #: src/forms/BuildForms.tsx:700 -#: src/forms/SalesOrderForms.tsx:336 -#: src/tables/build/BuildLineTable.tsx:574 -#: src/tables/build/BuildLineTable.tsx:731 -#: src/tables/build/BuildLineTable.tsx:830 +#: src/forms/SalesOrderForms.tsx:354 +#: src/tables/build/BuildLineTable.tsx:575 +#: src/tables/build/BuildLineTable.tsx:738 +#: src/tables/build/BuildLineTable.tsx:837 #: src/tables/sales/SalesOrderLineItemTable.tsx:380 #: src/tables/sales/SalesOrderLineItemTable.tsx:406 msgid "Allocate Stock" msgstr "Alocar Estoque" #: src/forms/BuildForms.tsx:703 -#: src/forms/SalesOrderForms.tsx:341 +#: src/forms/SalesOrderForms.tsx:359 msgid "Stock items allocated" msgstr "Itens de estoque alocados" #: src/forms/BuildForms.tsx:816 #: src/forms/BuildForms.tsx:917 -#: src/tables/build/BuildAllocatedStockTable.tsx:240 -#: src/tables/build/BuildAllocatedStockTable.tsx:272 -#: src/tables/build/BuildLineTable.tsx:741 -#: src/tables/build/BuildLineTable.tsx:864 +#: src/tables/build/BuildAllocatedStockTable.tsx:243 +#: src/tables/build/BuildAllocatedStockTable.tsx:279 +#: src/tables/build/BuildLineTable.tsx:748 +#: src/tables/build/BuildLineTable.tsx:871 msgid "Consume Stock" msgstr "" @@ -4521,21 +4528,21 @@ msgstr "" #~ msgstr "Stock items consumed" #: src/forms/BuildForms.tsx:853 -#: src/tables/build/BuildLineTable.tsx:514 +#: src/tables/build/BuildLineTable.tsx:515 #: src/tables/part/PartBuildAllocationsTable.tsx:101 msgid "Fully consumed" msgstr "" #: src/forms/BuildForms.tsx:898 -#: src/tables/build/BuildLineTable.tsx:187 +#: src/tables/build/BuildLineTable.tsx:188 #: src/tables/stock/StockItemTable.tsx:367 msgid "Consumed" msgstr "" #: src/forms/CommonForms.tsx:88 -#: src/forms/PurchaseOrderForms.tsx:125 +#: src/forms/PurchaseOrderForms.tsx:176 #: src/forms/ReturnOrderForms.tsx:138 -#: src/forms/SalesOrderForms.tsx:164 +#: src/forms/SalesOrderForms.tsx:182 msgid "Select project code for this line item" msgstr "" @@ -4572,127 +4579,127 @@ msgstr "Categoria de peça parental" msgid "Subscribe to notifications for this category" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:388 -msgid "Assign Batch Code and Serial Numbers" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:390 -msgid "Assign Batch Code" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:410 -msgid "Choose Location" -msgstr "Escolher local" - -#: src/forms/PurchaseOrderForms.tsx:418 -msgid "Item Destination selected" -msgstr "Destino do item selecionado" - #: src/forms/PurchaseOrderForms.tsx:421 #~ msgid "Assign Batch Code{0}" #~ msgstr "Assign Batch Code{0}" -#: src/forms/PurchaseOrderForms.tsx:428 -msgid "Part category default location selected" -msgstr "Localização padrão da categoria de peça selecionada" +#: src/forms/PurchaseOrderForms.tsx:440 +msgid "Assign Batch Code and Serial Numbers" +msgstr "" -#: src/forms/PurchaseOrderForms.tsx:438 -msgid "Received stock location selected" -msgstr "Localização do estoque recebida selecionada" +#: src/forms/PurchaseOrderForms.tsx:442 +msgid "Assign Batch Code" +msgstr "" #: src/forms/PurchaseOrderForms.tsx:444 #: src/forms/StockForms.tsx:428 #~ msgid "Remove item from list" #~ msgstr "Remove item from list" -#: src/forms/PurchaseOrderForms.tsx:446 +#: src/forms/PurchaseOrderForms.tsx:462 +msgid "Choose Location" +msgstr "Escolher local" + +#: src/forms/PurchaseOrderForms.tsx:470 +msgid "Item Destination selected" +msgstr "Destino do item selecionado" + +#: src/forms/PurchaseOrderForms.tsx:480 +msgid "Part category default location selected" +msgstr "Localização padrão da categoria de peça selecionada" + +#: src/forms/PurchaseOrderForms.tsx:490 +msgid "Received stock location selected" +msgstr "Localização do estoque recebida selecionada" + +#: src/forms/PurchaseOrderForms.tsx:498 msgid "Default location selected" msgstr "Localização padrão selecionada" -#: src/forms/PurchaseOrderForms.tsx:507 +#: src/forms/PurchaseOrderForms.tsx:559 msgid "Set Location" msgstr "Definir Localização" -#: src/forms/PurchaseOrderForms.tsx:524 -msgid "Set Expiry Date" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:532 -#: src/forms/StockForms.tsx:693 -msgid "Adjust Packaging" -msgstr "Ajustar Pacotes" - -#: src/forms/PurchaseOrderForms.tsx:540 -#: src/forms/StockForms.tsx:684 -#: src/hooks/UseStockAdjustActions.tsx:148 -msgid "Change Status" -msgstr "Alterar Status" - -#: src/forms/PurchaseOrderForms.tsx:546 -msgid "Add Note" -msgstr "Adicionar observação" - #: src/forms/PurchaseOrderForms.tsx:566 #~ msgid "Serial numbers" #~ msgstr "Serial numbers" +#: src/forms/PurchaseOrderForms.tsx:576 +msgid "Set Expiry Date" +msgstr "" + #: src/forms/PurchaseOrderForms.tsx:582 #~ msgid "Store at line item destination" #~ msgstr "Store at line item destination" -#: src/forms/PurchaseOrderForms.tsx:610 -msgid "Store at default location" -msgstr "Armazenar no local padrão" +#: src/forms/PurchaseOrderForms.tsx:584 +#: src/forms/StockForms.tsx:693 +msgid "Adjust Packaging" +msgstr "Ajustar Pacotes" -#: src/forms/PurchaseOrderForms.tsx:625 -msgid "Store at line item destination " -msgstr "" +#: src/forms/PurchaseOrderForms.tsx:592 +#: src/forms/StockForms.tsx:684 +#: src/hooks/UseStockAdjustActions.tsx:148 +msgid "Change Status" +msgstr "Alterar Status" -#: src/forms/PurchaseOrderForms.tsx:637 -msgid "Store with already received stock" -msgstr "Armazenar com estoque já recebido" +#: src/forms/PurchaseOrderForms.tsx:598 +msgid "Add Note" +msgstr "Adicionar observação" #: src/forms/PurchaseOrderForms.tsx:658 #~ msgid "Receive line items" #~ msgstr "Receive line items" -#: src/forms/PurchaseOrderForms.tsx:661 +#: src/forms/PurchaseOrderForms.tsx:662 +msgid "Store at default location" +msgstr "Armazenar no local padrão" + +#: src/forms/PurchaseOrderForms.tsx:677 +msgid "Store at line item destination " +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:689 +msgid "Store with already received stock" +msgstr "Armazenar com estoque já recebido" + +#: src/forms/PurchaseOrderForms.tsx:713 #: src/pages/build/BuildDetail.tsx:340 #: src/pages/stock/StockDetail.tsx:280 #: src/pages/stock/StockDetail.tsx:952 #: src/tables/Filter.tsx:83 -#: src/tables/build/BuildAllocatedStockTable.tsx:128 +#: src/tables/build/BuildAllocatedStockTable.tsx:125 #: src/tables/build/BuildOutputTable.tsx:112 -#: src/tables/part/PartTestResultTable.tsx:260 -#: src/tables/part/PartTestResultTable.tsx:281 +#: src/tables/part/PartTestResultTable.tsx:268 +#: src/tables/part/PartTestResultTable.tsx:289 #: src/tables/sales/SalesOrderAllocationTable.tsx:149 msgid "Batch Code" msgstr "Código de Lote" -#: src/forms/PurchaseOrderForms.tsx:662 +#: src/forms/PurchaseOrderForms.tsx:714 msgid "Enter batch code for received items" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:675 +#: src/forms/PurchaseOrderForms.tsx:727 #: src/forms/StockForms.tsx:218 msgid "Serial Numbers" msgstr "Números de Série" -#: src/forms/PurchaseOrderForms.tsx:676 +#: src/forms/PurchaseOrderForms.tsx:728 msgid "Enter serial numbers for received items" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:690 +#: src/forms/PurchaseOrderForms.tsx:742 #: src/pages/stock/StockDetail.tsx:382 #: src/tables/stock/StockItemTable.tsx:294 msgid "Expiry Date" msgstr "Data de Validade" -#: src/forms/PurchaseOrderForms.tsx:691 +#: src/forms/PurchaseOrderForms.tsx:743 msgid "Enter an expiry date for received items" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:703 +#: src/forms/PurchaseOrderForms.tsx:755 #: src/forms/StockForms.tsx:728 #: src/pages/company/SupplierPartDetail.tsx:172 #: src/pages/company/SupplierPartDetail.tsx:236 @@ -4701,19 +4708,19 @@ msgstr "" msgid "Packaging" msgstr "Embalagem" -#: src/forms/PurchaseOrderForms.tsx:727 +#: src/forms/PurchaseOrderForms.tsx:779 #: src/pages/company/SupplierPartDetail.tsx:120 #: src/tables/ColumnRenderers.tsx:332 msgid "Note" msgstr "Anotação" -#: src/forms/PurchaseOrderForms.tsx:799 +#: src/forms/PurchaseOrderForms.tsx:851 #: src/pages/company/SupplierPartDetail.tsx:138 #: src/tables/purchasing/SupplierPriceBreakTable.tsx:49 msgid "SKU" msgstr "Código (SKU)" -#: src/forms/PurchaseOrderForms.tsx:800 +#: src/forms/PurchaseOrderForms.tsx:852 #: src/tables/part/PartPurchaseOrdersTable.tsx:127 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:213 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:283 @@ -4721,11 +4728,11 @@ msgstr "Código (SKU)" msgid "Received" msgstr "Recebido" -#: src/forms/PurchaseOrderForms.tsx:817 +#: src/forms/PurchaseOrderForms.tsx:869 msgid "Receive Line Items" msgstr "Excluir Itens de Linha" -#: src/forms/PurchaseOrderForms.tsx:823 +#: src/forms/PurchaseOrderForms.tsx:875 msgid "Items received" msgstr "Itens Recebidos" @@ -4737,7 +4744,7 @@ msgstr "Receber Itens" msgid "Item received into stock" msgstr "Ítem recebido em estoque" -#: src/forms/SalesOrderForms.tsx:401 +#: src/forms/SalesOrderForms.tsx:419 msgid "Leave blank to use the order address" msgstr "" @@ -5932,6 +5939,9 @@ msgstr "" #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:310 #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:401 +#: src/tables/build/BuildAllocatedStockTable.tsx:181 +#: src/tables/build/BuildLineTable.tsx:668 +#: src/tables/sales/SalesOrderAllocationTable.tsx:220 msgid "Confirm Removal" msgstr "" @@ -6870,8 +6880,8 @@ msgstr "Externo" #: src/pages/sales/ReturnOrderDetail.tsx:108 #: src/pages/sales/SalesOrderDetail.tsx:98 #: src/tables/ColumnRenderers.tsx:321 -#: src/tables/build/BuildAllocatedStockTable.tsx:115 -#: src/tables/build/BuildLineTable.tsx:352 +#: src/tables/build/BuildAllocatedStockTable.tsx:112 +#: src/tables/build/BuildLineTable.tsx:353 msgid "Reference" msgstr "Referência" @@ -7132,7 +7142,7 @@ msgstr "Cancelar pedido" #: src/pages/build/BuildDetail.tsx:742 #: src/pages/stock/StockDetail.tsx:344 -#: src/tables/build/BuildAllocatedStockTable.tsx:85 +#: src/tables/build/BuildAllocatedStockTable.tsx:82 #: src/tables/part/PartBuildAllocationsTable.tsx:45 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:157 #: src/tables/stock/StockTrackingTable.tsx:109 @@ -7600,7 +7610,7 @@ msgstr "Palavras-chave" #: src/pages/part/PartDetail.tsx:542 #: src/tables/bom/BomTable.tsx:439 -#: src/tables/build/BuildLineTable.tsx:305 +#: src/tables/build/BuildLineTable.tsx:306 #: src/tables/part/PartTable.tsx:319 #: src/tables/sales/SalesOrderLineItemTable.tsx:138 msgid "Available Stock" @@ -7608,7 +7618,7 @@ msgstr "Estoque Disponível" #: src/pages/part/PartDetail.tsx:548 #: src/tables/bom/BomTable.tsx:341 -#: src/tables/build/BuildLineTable.tsx:267 +#: src/tables/build/BuildLineTable.tsx:268 #: src/tables/sales/SalesOrderLineItemTable.tsx:180 msgid "On order" msgstr "No pedido" @@ -7782,7 +7792,7 @@ msgstr "Pedido" #: src/pages/part/PartDetail.tsx:1144 #: src/pages/stock/StockDetail.tsx:884 -#: src/tables/build/BuildLineTable.tsx:761 +#: src/tables/build/BuildLineTable.tsx:768 msgid "Order Stock" msgstr "Pedir estoque" @@ -9219,13 +9229,13 @@ msgstr "" #~ msgstr "Show asssmbled items" #: src/tables/bom/BomTable.tsx:315 -#: src/tables/build/BuildLineTable.tsx:276 +#: src/tables/build/BuildLineTable.tsx:277 #: src/tables/part/PartTable.tsx:145 msgid "External stock" msgstr "Estoque externo" #: src/tables/bom/BomTable.tsx:323 -#: src/tables/build/BuildLineTable.tsx:239 +#: src/tables/build/BuildLineTable.tsx:240 msgid "Includes substitute stock" msgstr "Incluir estoque de substitutos" @@ -9234,7 +9244,7 @@ msgstr "Incluir estoque de substitutos" #~ msgstr "Edit Bom Item" #: src/tables/bom/BomTable.tsx:332 -#: src/tables/build/BuildLineTable.tsx:249 +#: src/tables/build/BuildLineTable.tsx:250 #: src/tables/sales/SalesOrderLineItemTable.tsx:166 msgid "Includes variant stock" msgstr "Incluir estoque de variantes" @@ -9272,8 +9282,8 @@ msgid "Stock Information" msgstr "Informação do Estoque" #: src/tables/bom/BomTable.tsx:399 -#: src/tables/build/BuildLineTable.tsx:496 -#: src/tables/build/BuildLineTable.tsx:537 +#: src/tables/build/BuildLineTable.tsx:497 +#: src/tables/build/BuildLineTable.tsx:538 msgid "Consumable item" msgstr "Item Consumível" @@ -9282,7 +9292,7 @@ msgid "No available stock" msgstr "Estoque não disponível" #: src/tables/bom/BomTable.tsx:420 -#: src/tables/build/BuildLineTable.tsx:213 +#: src/tables/build/BuildLineTable.tsx:214 msgid "Show testable items" msgstr "Mostrar itens testáveis" @@ -9291,7 +9301,7 @@ msgid "Show trackable items" msgstr "Mostrar itens rastreáveis" #: src/tables/bom/BomTable.tsx:430 -#: src/tables/build/BuildLineTable.tsx:208 +#: src/tables/build/BuildLineTable.tsx:209 msgid "Show assembled items" msgstr "Mostrar itens montados" @@ -9335,7 +9345,7 @@ msgstr "Mostrar itens que permitem a substituição de variantes" #: src/tables/bom/BomTable.tsx:464 #: src/tables/bom/UsedInTable.tsx:85 -#: src/tables/build/BuildLineTable.tsx:202 +#: src/tables/build/BuildLineTable.tsx:203 msgid "Optional" msgstr "Opcional" @@ -9345,7 +9355,7 @@ msgid "Show optional items" msgstr "Mostrar itens opcionais" #: src/tables/bom/BomTable.tsx:469 -#: src/tables/build/BuildLineTable.tsx:197 +#: src/tables/build/BuildLineTable.tsx:198 msgid "Consumable" msgstr "Consumível" @@ -9433,7 +9443,7 @@ msgid "Bill of materials cannot be edited, as the part is locked" msgstr "A lista de materiais não pode ser editada, pois está bloqueada" #: src/tables/bom/UsedInTable.tsx:34 -#: src/tables/build/BuildLineTable.tsx:207 +#: src/tables/build/BuildLineTable.tsx:208 #: src/tables/part/ParametricPartTable.tsx:364 #: src/tables/part/PartBuildAllocationsTable.tsx:60 #: src/tables/part/PartTable.tsx:209 @@ -9455,11 +9465,11 @@ msgstr "Rastreável" msgid "Show trackable assemblies" msgstr "Mostrar montagens rastreáveis" -#: src/tables/build/BuildAllocatedStockTable.tsx:67 +#: src/tables/build/BuildAllocatedStockTable.tsx:64 msgid "Allocated to Output" msgstr "Alocado para saída" -#: src/tables/build/BuildAllocatedStockTable.tsx:68 +#: src/tables/build/BuildAllocatedStockTable.tsx:65 msgid "Show items allocated to a build output" msgstr "Mostrar itens alocados a uma saída da compilação" @@ -9472,7 +9482,7 @@ msgstr "Mostrar itens alocados a uma saída da compilação" #~ msgid "Include orders for part variants" #~ msgstr "Include orders for part variants" -#: src/tables/build/BuildAllocatedStockTable.tsx:97 +#: src/tables/build/BuildAllocatedStockTable.tsx:94 #: src/tables/part/PartBuildAllocationsTable.tsx:84 #: src/tables/part/PartPurchaseOrdersTable.tsx:132 #: src/tables/part/PartSalesAllocationsTable.tsx:69 @@ -9482,40 +9492,58 @@ msgid "Order Status" msgstr "Situação do pedido" #: src/tables/build/BuildAllocatedStockTable.tsx:164 -#~ msgid "Edit Build Item" -#~ msgstr "Edit Build Item" - -#: src/tables/build/BuildAllocatedStockTable.tsx:167 -#: src/tables/build/BuildLineTable.tsx:650 +#: src/tables/build/BuildLineTable.tsx:651 msgid "Edit Stock Allocation" msgstr "" +#: src/tables/build/BuildAllocatedStockTable.tsx:164 +#~ msgid "Edit Build Item" +#~ msgstr "Edit Build Item" + #: src/tables/build/BuildAllocatedStockTable.tsx:174 #~ msgid "Delete Build Item" #~ msgstr "Delete Build Item" -#: src/tables/build/BuildAllocatedStockTable.tsx:180 -#: src/tables/build/BuildLineTable.tsx:663 -msgid "Delete Stock Allocation" +#: src/tables/build/BuildAllocatedStockTable.tsx:177 +#: src/tables/build/BuildLineTable.tsx:664 +#: src/tables/sales/SalesOrderAllocationTable.tsx:218 +msgid "Remove Allocated Stock" msgstr "" -#: src/tables/build/BuildAllocatedStockTable.tsx:239 +#: src/tables/build/BuildAllocatedStockTable.tsx:180 +#: src/tables/build/BuildLineTable.tsx:663 +#~ msgid "Delete Stock Allocation" +#~ msgstr "Delete Stock Allocation" + +#: src/tables/build/BuildAllocatedStockTable.tsx:182 +#: src/tables/build/BuildLineTable.tsx:669 +#: src/tables/sales/SalesOrderAllocationTable.tsx:221 +msgid "Are you sure you want to remove this allocated stock from the order?" +msgstr "" + +#: src/tables/build/BuildAllocatedStockTable.tsx:242 msgid "Consume" msgstr "" +#: src/tables/build/BuildAllocatedStockTable.tsx:259 +#: src/tables/build/BuildLineTable.tsx:112 +#: src/tables/sales/SalesOrderAllocationTable.tsx:248 +msgid "Remove allocated stock" +msgstr "" + #: src/tables/build/BuildLineTable.tsx:59 #~ msgid "Show lines with available stock" #~ msgstr "Show lines with available stock" -#: src/tables/build/BuildLineTable.tsx:120 +#: src/tables/build/BuildLineTable.tsx:121 msgid "View Stock Item" msgstr "" -#: src/tables/build/BuildLineTable.tsx:183 +#: src/tables/build/BuildLineTable.tsx:184 msgid "Show fully allocated lines" msgstr "" -#: src/tables/build/BuildLineTable.tsx:188 +#: src/tables/build/BuildLineTable.tsx:189 msgid "Show fully consumed lines" msgstr "" @@ -9523,124 +9551,124 @@ msgstr "" #~ msgid "Show allocated lines" #~ msgstr "Show allocated lines" -#: src/tables/build/BuildLineTable.tsx:193 +#: src/tables/build/BuildLineTable.tsx:194 msgid "Show items with sufficient available stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:198 +#: src/tables/build/BuildLineTable.tsx:199 msgid "Show consumable lines" msgstr "Mostrar linhas consumíveis" -#: src/tables/build/BuildLineTable.tsx:203 +#: src/tables/build/BuildLineTable.tsx:204 msgid "Show optional lines" msgstr "Mostrar linhas opcionais" -#: src/tables/build/BuildLineTable.tsx:212 +#: src/tables/build/BuildLineTable.tsx:213 #: src/tables/part/PartTable.tsx:233 msgid "Testable" msgstr "Testável" -#: src/tables/build/BuildLineTable.tsx:217 +#: src/tables/build/BuildLineTable.tsx:218 #: src/tables/stock/StockItemTable.tsx:388 msgid "Tracked" msgstr "Monitorado" -#: src/tables/build/BuildLineTable.tsx:218 +#: src/tables/build/BuildLineTable.tsx:219 msgid "Show tracked lines" msgstr "Mostrar itens monitorados" -#: src/tables/build/BuildLineTable.tsx:223 +#: src/tables/build/BuildLineTable.tsx:224 msgid "Show items with stock on order" msgstr "" -#: src/tables/build/BuildLineTable.tsx:258 +#: src/tables/build/BuildLineTable.tsx:259 #: src/tables/sales/SalesOrderLineItemTable.tsx:172 msgid "In production" msgstr "Em produção" -#: src/tables/build/BuildLineTable.tsx:286 +#: src/tables/build/BuildLineTable.tsx:287 msgid "Insufficient stock" msgstr "Estoque insuficiente" -#: src/tables/build/BuildLineTable.tsx:302 +#: src/tables/build/BuildLineTable.tsx:303 #: src/tables/sales/SalesOrderLineItemTable.tsx:160 #: src/tables/stock/StockItemTable.tsx:191 msgid "No stock available" msgstr "Nenhum estoque disponível" -#: src/tables/build/BuildLineTable.tsx:375 +#: src/tables/build/BuildLineTable.tsx:376 msgid "Gets Inherited" msgstr "Obtém herdados" -#: src/tables/build/BuildLineTable.tsx:388 +#: src/tables/build/BuildLineTable.tsx:389 msgid "Unit Quantity" msgstr "Quantidade Unitária" -#: src/tables/build/BuildLineTable.tsx:415 +#: src/tables/build/BuildLineTable.tsx:416 msgid "Setup Quantity" msgstr "" -#: src/tables/build/BuildLineTable.tsx:424 +#: src/tables/build/BuildLineTable.tsx:425 msgid "Attrition" msgstr "" -#: src/tables/build/BuildLineTable.tsx:432 +#: src/tables/build/BuildLineTable.tsx:433 msgid "Rounding Multiple" msgstr "" -#: src/tables/build/BuildLineTable.tsx:441 +#: src/tables/build/BuildLineTable.tsx:442 msgid "BOM Information" msgstr "" -#: src/tables/build/BuildLineTable.tsx:515 +#: src/tables/build/BuildLineTable.tsx:516 #: src/tables/part/PartBuildAllocationsTable.tsx:102 msgid "Fully allocated" msgstr "" -#: src/tables/build/BuildLineTable.tsx:563 +#: src/tables/build/BuildLineTable.tsx:564 #: src/tables/sales/SalesOrderLineItemTable.tsx:311 msgid "Create Build Order" msgstr "Criar Pedido de Produção" -#: src/tables/build/BuildLineTable.tsx:592 +#: src/tables/build/BuildLineTable.tsx:593 msgid "Auto allocation in progress" msgstr "Alocação automática em progresso" -#: src/tables/build/BuildLineTable.tsx:595 -#: src/tables/build/BuildLineTable.tsx:802 +#: src/tables/build/BuildLineTable.tsx:596 +#: src/tables/build/BuildLineTable.tsx:809 msgid "Auto Allocate Stock" msgstr "Estoque alocado automaticamente" -#: src/tables/build/BuildLineTable.tsx:596 +#: src/tables/build/BuildLineTable.tsx:597 msgid "Automatically allocate stock to this build according to the selected options" msgstr "Alocar automaticamente o estoque desta compilação conforme as opções selecionadas" -#: src/tables/build/BuildLineTable.tsx:616 -#: src/tables/build/BuildLineTable.tsx:630 -#: src/tables/build/BuildLineTable.tsx:751 -#: src/tables/build/BuildLineTable.tsx:852 +#: src/tables/build/BuildLineTable.tsx:617 +#: src/tables/build/BuildLineTable.tsx:631 +#: src/tables/build/BuildLineTable.tsx:758 +#: src/tables/build/BuildLineTable.tsx:859 #: src/tables/build/BuildOutputTable.tsx:355 #: src/tables/build/BuildOutputTable.tsx:360 msgid "Deallocate Stock" msgstr "Desalocar estoque" -#: src/tables/build/BuildLineTable.tsx:632 +#: src/tables/build/BuildLineTable.tsx:633 msgid "Deallocate all untracked stock for this build order" msgstr "Desalocar todo estoque não rastreado para esta ordem de compilação" -#: src/tables/build/BuildLineTable.tsx:634 +#: src/tables/build/BuildLineTable.tsx:635 msgid "Deallocate stock from the selected line item" msgstr "Desalocar estoque do item de linha selecionado" -#: src/tables/build/BuildLineTable.tsx:638 +#: src/tables/build/BuildLineTable.tsx:639 msgid "Stock has been deallocated" msgstr "O estoque foi distribuído" -#: src/tables/build/BuildLineTable.tsx:771 +#: src/tables/build/BuildLineTable.tsx:778 msgid "Build Stock" msgstr "Estoque de Produção" -#: src/tables/build/BuildLineTable.tsx:784 +#: src/tables/build/BuildLineTable.tsx:791 #: src/tables/sales/SalesOrderLineItemTable.tsx:487 msgid "View Part" msgstr "" @@ -9739,7 +9767,7 @@ msgid "Serialize Build Output" msgstr "" #: src/tables/build/BuildOutputTable.tsx:405 -#: src/tables/part/PartTestResultTable.tsx:310 +#: src/tables/part/PartTestResultTable.tsx:318 #: src/tables/stock/StockItemTable.tsx:328 msgid "Filter by stock status" msgstr "Filtrar por estado do estoque" @@ -9964,8 +9992,8 @@ msgid "View Item" msgstr "" #: src/tables/general/ExtraLineItemTable.tsx:95 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:299 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:403 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:300 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:405 #: src/tables/sales/ReturnOrderLineItemTable.tsx:83 #: src/tables/sales/ReturnOrderLineItemTable.tsx:187 #: src/tables/sales/SalesOrderLineItemTable.tsx:252 @@ -9974,14 +10002,14 @@ msgid "Add Line Item" msgstr "Adicionar Item de Linha" #: src/tables/general/ExtraLineItemTable.tsx:108 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:320 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:322 #: src/tables/sales/ReturnOrderLineItemTable.tsx:96 #: src/tables/sales/SalesOrderLineItemTable.tsx:271 msgid "Edit Line Item" msgstr "Editar Item de Linha" #: src/tables/general/ExtraLineItemTable.tsx:117 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:329 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:331 #: src/tables/sales/ReturnOrderLineItemTable.tsx:105 #: src/tables/sales/SalesOrderLineItemTable.tsx:280 msgid "Delete Line Item" @@ -10273,7 +10301,7 @@ msgid "Required Stock" msgstr "" #: src/tables/part/PartBuildAllocationsTable.tsx:124 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:381 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:383 msgid "View Build Order" msgstr "" @@ -10617,8 +10645,8 @@ msgstr "" #: src/tables/part/PartTestResultTable.tsx:103 #: src/tables/part/PartTestResultTable.tsx:181 -#: src/tables/part/PartTestResultTable.tsx:320 -#: src/tables/part/PartTestResultTable.tsx:334 +#: src/tables/part/PartTestResultTable.tsx:328 +#: src/tables/part/PartTestResultTable.tsx:342 #: src/tables/stock/StockItemTestResultTable.tsx:296 #: src/tables/stock/StockItemTestResultTable.tsx:368 #: src/tables/stock/StockItemTestResultTable.tsx:429 @@ -10643,7 +10671,7 @@ msgstr "" msgid "No Result" msgstr "Nenhum resultado" -#: src/tables/part/PartTestResultTable.tsx:298 +#: src/tables/part/PartTestResultTable.tsx:306 msgid "Show build outputs currently in production" msgstr "Mostrar saídas de compilação atualmente em produção" @@ -11073,7 +11101,7 @@ msgid "Show manufacturer parts for active manufacturers." msgstr "" #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:115 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:397 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:399 msgid "Import Line Items" msgstr "Importar Itens da Linha" @@ -11099,11 +11127,11 @@ msgstr "" #~ msgid "Add line item" #~ msgstr "Add line item" -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:350 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:352 msgid "Receive line item" msgstr "Receber item de linha" -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:414 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:416 msgid "Receive items" msgstr "Receber itens" @@ -11201,25 +11229,25 @@ msgid "Not shipped" msgstr "" #: src/tables/sales/SalesOrderAllocationTable.tsx:211 -#: src/tables/sales/SalesOrderAllocationTable.tsx:229 +#: src/tables/sales/SalesOrderAllocationTable.tsx:235 msgid "Edit Allocation" msgstr "" #: src/tables/sales/SalesOrderAllocationTable.tsx:218 #: src/tables/sales/SalesOrderAllocationTable.tsx:241 -msgid "Delete Allocation" -msgstr "" +#~ msgid "Delete Allocation" +#~ msgstr "Delete Allocation" -#: src/tables/sales/SalesOrderAllocationTable.tsx:252 -#: src/tables/sales/SalesOrderAllocationTable.tsx:253 +#: src/tables/sales/SalesOrderAllocationTable.tsx:261 +#: src/tables/sales/SalesOrderAllocationTable.tsx:262 msgid "View Shipment" msgstr "" -#: src/tables/sales/SalesOrderAllocationTable.tsx:308 +#: src/tables/sales/SalesOrderAllocationTable.tsx:317 msgid "Assign to Shipment" msgstr "" -#: src/tables/sales/SalesOrderAllocationTable.tsx:324 +#: src/tables/sales/SalesOrderAllocationTable.tsx:333 msgid "Assign to shipment" msgstr "" diff --git a/src/frontend/src/locales/ro/messages.po b/src/frontend/src/locales/ro/messages.po index 1d7f87d4a7..babe07a816 100644 --- a/src/frontend/src/locales/ro/messages.po +++ b/src/frontend/src/locales/ro/messages.po @@ -8,7 +8,7 @@ msgstr "" "Language: ro\n" "Project-Id-Version: inventree\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2025-11-19 19:39\n" +"PO-Revision-Date: 2025-11-23 22:17\n" "Last-Translator: \n" "Language-Team: Romanian\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100>0 && n%100<20)) ? 1 : 2);\n" @@ -56,7 +56,7 @@ msgstr "" #: lib/components/RowActions.tsx:136 #: src/components/nav/NavigationDrawer.tsx:190 -#: src/forms/PurchaseOrderForms.tsx:802 +#: src/forms/PurchaseOrderForms.tsx:854 #: src/forms/StockForms.tsx:796 #: src/forms/StockForms.tsx:843 #: src/forms/StockForms.tsx:889 @@ -103,9 +103,9 @@ msgstr "" #: src/forms/BuildForms.tsx:630 #: src/forms/BuildForms.tsx:793 #: src/forms/BuildForms.tsx:896 -#: src/forms/PurchaseOrderForms.tsx:798 +#: src/forms/PurchaseOrderForms.tsx:850 #: src/forms/ReturnOrderForms.tsx:242 -#: src/forms/SalesOrderForms.tsx:305 +#: src/forms/SalesOrderForms.tsx:323 #: src/forms/StockForms.tsx:360 #: src/forms/StockForms.tsx:791 #: src/forms/StockForms.tsx:838 @@ -119,6 +119,7 @@ msgstr "" #: src/pages/build/BuildDetail.tsx:200 #: src/pages/part/PartDetail.tsx:1207 #: src/tables/ColumnRenderers.tsx:91 +#: src/tables/part/PartTestResultTable.tsx:247 #: src/tables/part/RelatedPartTable.tsx:53 #: src/tables/stock/StockTrackingTable.tsx:87 msgid "Part" @@ -158,7 +159,7 @@ msgstr "" #: src/components/wizards/OrderPartsWizard.tsx:290 #: src/pages/company/SupplierPartDetail.tsx:413 #: src/pages/stock/StockDetail.tsx:289 -#: src/tables/build/BuildAllocatedStockTable.tsx:155 +#: src/tables/build/BuildAllocatedStockTable.tsx:152 #: src/tables/part/PartPurchaseOrdersTable.tsx:50 #: src/tables/purchasing/SupplierPartTable.tsx:83 #: src/tables/stock/StockItemTable.tsx:247 @@ -201,9 +202,9 @@ msgstr "" #: src/forms/BuildForms.tsx:473 #: src/forms/BuildForms.tsx:633 #: src/forms/BuildForms.tsx:794 -#: src/forms/SalesOrderForms.tsx:307 +#: src/forms/SalesOrderForms.tsx:325 #: src/pages/stock/StockDetail.tsx:1005 -#: src/tables/part/PartTestResultTable.tsx:248 +#: src/tables/part/PartTestResultTable.tsx:256 #: src/tables/stock/StockTrackingTable.tsx:48 #: src/tables/stock/StockTrackingTable.tsx:55 msgid "Stock Item" @@ -517,7 +518,7 @@ msgstr "" #: src/components/dashboard/DashboardLayout.tsx:281 #: src/components/editors/NotesEditor.tsx:74 #: src/components/editors/TemplateEditor/TemplateEditor.tsx:158 -#: src/components/forms/fields/ApiFormField.tsx:273 +#: src/components/forms/fields/ApiFormField.tsx:237 #: src/components/forms/fields/TableField.tsx:45 #: src/components/importer/ImportDataSelector.tsx:192 #: src/components/importer/ImporterColumnSelector.tsx:234 @@ -642,8 +643,8 @@ msgstr "" #: src/components/barcodes/BarcodeScanDialog.tsx:49 #: src/components/buttons/ScanButton.tsx:15 #: src/components/nav/NavigationDrawer.tsx:122 -#: src/forms/PurchaseOrderForms.tsx:457 -#: src/forms/PurchaseOrderForms.tsx:563 +#: src/forms/PurchaseOrderForms.tsx:509 +#: src/forms/PurchaseOrderForms.tsx:615 msgid "Scan Barcode" msgstr "" @@ -728,7 +729,7 @@ msgstr "" #: src/components/barcodes/QRCode.tsx:205 #: src/components/items/ActionDropdown.tsx:192 -#: src/forms/PurchaseOrderForms.tsx:554 +#: src/forms/PurchaseOrderForms.tsx:606 msgid "Unlink Barcode" msgstr "" @@ -1216,6 +1217,12 @@ msgstr "" #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:884 #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:903 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:254 +#: src/tables/build/BuildAllocatedStockTable.tsx:178 +#: src/tables/build/BuildAllocatedStockTable.tsx:258 +#: src/tables/build/BuildLineTable.tsx:111 +#: src/tables/build/BuildLineTable.tsx:665 +#: src/tables/sales/SalesOrderAllocationTable.tsx:224 +#: src/tables/sales/SalesOrderAllocationTable.tsx:247 msgid "Remove" msgstr "" @@ -1241,7 +1248,7 @@ msgid "Upload Error" msgstr "" #: src/components/details/DetailsImage.tsx:250 -#: src/components/forms/fields/TextField.tsx:65 +#: src/components/forms/fields/AutoFillRightSection.tsx:34 msgid "Clear" msgstr "" @@ -1582,7 +1589,7 @@ msgstr "" #: src/pages/Index/Settings/AccountSettings/AccountDetailPanel.tsx:64 #: src/pages/core/UserDetail.tsx:48 msgid "Username" -msgstr "" +msgstr "Nume utilizator" #: src/components/forms/AuthenticationForm.tsx:136 #~ msgid "I will use username and password" @@ -1591,7 +1598,7 @@ msgstr "" #: src/components/forms/AuthenticationForm.tsx:138 #: src/components/forms/AuthenticationForm.tsx:298 msgid "Your username" -msgstr "" +msgstr "Introdu numele de utilizator" #: src/components/forms/AuthenticationForm.tsx:143 #: src/components/forms/AuthenticationForm.tsx:311 @@ -1627,7 +1634,7 @@ msgstr "" #: src/components/forms/AuthenticationForm.tsx:192 msgid "Use username and password" -msgstr "" +msgstr "Utilizați numele de utilizator și parola" #: src/components/forms/AuthenticationForm.tsx:201 msgid "Log In" @@ -1817,10 +1824,14 @@ msgstr "" msgid "Running" msgstr "" -#: src/components/forms/fields/ApiFormField.tsx:233 +#: src/components/forms/fields/ApiFormField.tsx:197 msgid "Select file to upload" msgstr "" +#: src/components/forms/fields/AutoFillRightSection.tsx:47 +msgid "Accept suggested value" +msgstr "" + #: src/components/forms/fields/DateField.tsx:76 msgid "Select date" msgstr "" @@ -1875,10 +1886,6 @@ msgstr "" msgid "Add new row" msgstr "" -#: src/components/forms/fields/TextField.tsx:82 -msgid "Accept suggested value" -msgstr "" - #: src/components/images/DetailsImage.tsx:252 #~ msgid "Select image" #~ msgstr "Select image" @@ -2225,8 +2232,8 @@ msgstr "" #: src/pages/part/PartDetail.tsx:994 #: src/pages/stock/StockDetail.tsx:265 #: src/pages/stock/StockDetail.tsx:942 -#: src/tables/build/BuildAllocatedStockTable.tsx:135 -#: src/tables/build/BuildLineTable.tsx:192 +#: src/tables/build/BuildAllocatedStockTable.tsx:132 +#: src/tables/build/BuildLineTable.tsx:193 #: src/tables/part/PartTable.tsx:137 #: src/tables/stock/StockItemTable.tsx:182 #: src/tables/stock/StockItemTable.tsx:343 @@ -2784,7 +2791,7 @@ msgstr "" #: src/pages/sales/SalesOrderDetail.tsx:119 #: src/pages/stock/LocationDetail.tsx:102 #: src/tables/ColumnRenderers.tsx:278 -#: src/tables/build/BuildAllocatedStockTable.tsx:91 +#: src/tables/build/BuildAllocatedStockTable.tsx:88 #: src/tables/machine/MachineTypeTable.tsx:161 #: src/tables/machine/MachineTypeTable.tsx:257 #: src/tables/plugin/PluginListTable.tsx:110 @@ -2966,7 +2973,7 @@ msgstr "" #: src/pages/company/SupplierPartDetail.tsx:394 #: src/pages/part/PartDetail.tsx:1015 #: src/tables/bom/BomTable.tsx:444 -#: src/tables/build/BuildLineTable.tsx:222 +#: src/tables/build/BuildLineTable.tsx:223 #: src/tables/part/PartTable.tsx:108 msgid "On Order" msgstr "" @@ -2976,7 +2983,7 @@ msgstr "" #: src/pages/part/PartDetail.tsx:587 #: src/pages/part/PartDetail.tsx:1021 #: src/pages/stock/StockDetail.tsx:925 -#: src/tables/part/PartTestResultTable.tsx:297 +#: src/tables/part/PartTestResultTable.tsx:305 #: src/tables/stock/StockItemTable.tsx:359 msgid "In Production" msgstr "" @@ -3000,7 +3007,7 @@ msgstr "" #: src/components/render/Stock.tsx:114 #: src/components/render/Stock.tsx:132 #: src/forms/BuildForms.tsx:795 -#: src/forms/PurchaseOrderForms.tsx:595 +#: src/forms/PurchaseOrderForms.tsx:647 #: src/forms/StockForms.tsx:792 #: src/forms/StockForms.tsx:839 #: src/forms/StockForms.tsx:885 @@ -3023,7 +3030,7 @@ msgstr "" #: src/components/render/Stock.tsx:99 #: src/pages/stock/StockDetail.tsx:198 #: src/pages/stock/StockDetail.tsx:930 -#: src/tables/build/BuildAllocatedStockTable.tsx:121 +#: src/tables/build/BuildAllocatedStockTable.tsx:118 #: src/tables/build/BuildOutputTable.tsx:107 #: src/tables/sales/SalesOrderAllocationTable.tsx:142 msgid "Serial Number" @@ -3034,9 +3041,9 @@ msgstr "" #: src/forms/BuildForms.tsx:240 #: src/forms/BuildForms.tsx:634 #: src/forms/BuildForms.tsx:797 -#: src/forms/PurchaseOrderForms.tsx:801 +#: src/forms/PurchaseOrderForms.tsx:853 #: src/forms/ReturnOrderForms.tsx:243 -#: src/forms/SalesOrderForms.tsx:308 +#: src/forms/SalesOrderForms.tsx:326 #: src/forms/StockForms.tsx:841 #: src/pages/part/PartStockHistoryDetail.tsx:56 #: src/pages/part/PartStockHistoryDetail.tsx:210 @@ -3046,9 +3053,9 @@ msgstr "" #: src/pages/part/pricing/PriceBreakPanel.tsx:172 #: src/pages/stock/StockDetail.tsx:258 #: src/pages/stock/StockDetail.tsx:936 -#: src/tables/build/BuildLineTable.tsx:86 +#: src/tables/build/BuildLineTable.tsx:83 #: src/tables/part/PartPurchaseOrdersTable.tsx:94 -#: src/tables/part/PartTestResultTable.tsx:269 +#: src/tables/part/PartTestResultTable.tsx:277 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:175 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:206 #: src/tables/purchasing/SupplierPriceBreakTable.tsx:69 @@ -3070,7 +3077,7 @@ msgstr "" #: src/forms/StockForms.tsx:1048 #: src/forms/StockForms.tsx:1096 #: src/forms/StockForms.tsx:1140 -#: src/tables/build/BuildLineTable.tsx:96 +#: src/tables/build/BuildLineTable.tsx:93 msgid "Batch" msgstr "" @@ -3755,7 +3762,7 @@ msgid "In Stock" msgstr "" #: src/components/wizards/OrderPartsWizard.tsx:146 -#: src/tables/build/BuildLineTable.tsx:404 +#: src/tables/build/BuildLineTable.tsx:405 msgid "Required Quantity" msgstr "" @@ -3847,7 +3854,7 @@ msgid "Please correct the errors in the selected parts" msgstr "" #: src/components/wizards/OrderPartsWizard.tsx:587 -#: src/tables/build/BuildLineTable.tsx:815 +#: src/tables/build/BuildLineTable.tsx:822 #: src/tables/part/PartTable.tsx:522 #: src/tables/sales/SalesOrderLineItemTable.tsx:370 msgid "Order Parts" @@ -4349,9 +4356,9 @@ msgstr "" #: src/forms/BuildForms.tsx:333 #: src/forms/BuildForms.tsx:408 #: src/forms/BuildForms.tsx:685 -#: src/tables/build/BuildAllocatedStockTable.tsx:150 +#: src/tables/build/BuildAllocatedStockTable.tsx:147 #: src/tables/build/BuildOutputTable.tsx:582 -#: src/tables/part/PartTestResultTable.tsx:272 +#: src/tables/part/PartTestResultTable.tsx:280 msgid "Build Output" msgstr "" @@ -4362,7 +4369,7 @@ msgstr "" #: src/forms/BuildForms.tsx:336 #: src/forms/BuildForms.tsx:411 #: src/forms/BuildForms.tsx:475 -#: src/forms/PurchaseOrderForms.tsx:717 +#: src/forms/PurchaseOrderForms.tsx:769 #: src/forms/ReturnOrderForms.tsx:197 #: src/forms/ReturnOrderForms.tsx:244 #: src/forms/StockForms.tsx:712 @@ -4377,7 +4384,7 @@ msgstr "" #: src/tables/build/BuildOutputTable.tsx:404 #: src/tables/machine/MachineListTable.tsx:387 #: src/tables/part/PartPurchaseOrdersTable.tsx:38 -#: src/tables/part/PartTestResultTable.tsx:309 +#: src/tables/part/PartTestResultTable.tsx:317 #: src/tables/sales/ReturnOrderLineItemTable.tsx:138 #: src/tables/sales/ReturnOrderLineItemTable.tsx:176 #: src/tables/settings/CustomStateTable.tsx:79 @@ -4450,8 +4457,8 @@ msgstr "" #: src/pages/stock/StockDetail.tsx:153 #: src/tables/bom/BomTable.tsx:134 #: src/tables/bom/UsedInTable.tsx:40 -#: src/tables/build/BuildAllocatedStockTable.tsx:108 -#: src/tables/build/BuildLineTable.tsx:336 +#: src/tables/build/BuildAllocatedStockTable.tsx:105 +#: src/tables/build/BuildLineTable.tsx:337 #: src/tables/build/BuildOrderTable.tsx:79 #: src/tables/part/PartSalesAllocationsTable.tsx:61 #: src/tables/part/RelatedPartTable.tsx:73 @@ -4466,47 +4473,47 @@ msgstr "" #: src/forms/BuildForms.tsx:632 #: src/forms/BuildForms.tsx:796 #: src/forms/BuildForms.tsx:897 -#: src/forms/SalesOrderForms.tsx:306 -#: src/tables/build/BuildAllocatedStockTable.tsx:139 -#: src/tables/build/BuildLineTable.tsx:182 +#: src/forms/SalesOrderForms.tsx:324 +#: src/tables/build/BuildAllocatedStockTable.tsx:136 +#: src/tables/build/BuildLineTable.tsx:183 #: src/tables/sales/SalesOrderLineItemTable.tsx:342 #: src/tables/stock/StockItemTable.tsx:338 msgid "Allocated" msgstr "" #: src/forms/BuildForms.tsx:667 -#: src/forms/SalesOrderForms.tsx:295 +#: src/forms/SalesOrderForms.tsx:313 #: src/pages/build/BuildDetail.tsx:108 #: src/pages/build/BuildDetail.tsx:326 msgid "Source Location" msgstr "" #: src/forms/BuildForms.tsx:668 -#: src/forms/SalesOrderForms.tsx:296 +#: src/forms/SalesOrderForms.tsx:314 msgid "Select the source location for the stock allocation" msgstr "" #: src/forms/BuildForms.tsx:700 -#: src/forms/SalesOrderForms.tsx:336 -#: src/tables/build/BuildLineTable.tsx:574 -#: src/tables/build/BuildLineTable.tsx:731 -#: src/tables/build/BuildLineTable.tsx:830 +#: src/forms/SalesOrderForms.tsx:354 +#: src/tables/build/BuildLineTable.tsx:575 +#: src/tables/build/BuildLineTable.tsx:738 +#: src/tables/build/BuildLineTable.tsx:837 #: src/tables/sales/SalesOrderLineItemTable.tsx:380 #: src/tables/sales/SalesOrderLineItemTable.tsx:406 msgid "Allocate Stock" msgstr "" #: src/forms/BuildForms.tsx:703 -#: src/forms/SalesOrderForms.tsx:341 +#: src/forms/SalesOrderForms.tsx:359 msgid "Stock items allocated" msgstr "" #: src/forms/BuildForms.tsx:816 #: src/forms/BuildForms.tsx:917 -#: src/tables/build/BuildAllocatedStockTable.tsx:240 -#: src/tables/build/BuildAllocatedStockTable.tsx:272 -#: src/tables/build/BuildLineTable.tsx:741 -#: src/tables/build/BuildLineTable.tsx:864 +#: src/tables/build/BuildAllocatedStockTable.tsx:243 +#: src/tables/build/BuildAllocatedStockTable.tsx:279 +#: src/tables/build/BuildLineTable.tsx:748 +#: src/tables/build/BuildLineTable.tsx:871 msgid "Consume Stock" msgstr "" @@ -4521,21 +4528,21 @@ msgstr "" #~ msgstr "Stock items consumed" #: src/forms/BuildForms.tsx:853 -#: src/tables/build/BuildLineTable.tsx:514 +#: src/tables/build/BuildLineTable.tsx:515 #: src/tables/part/PartBuildAllocationsTable.tsx:101 msgid "Fully consumed" msgstr "" #: src/forms/BuildForms.tsx:898 -#: src/tables/build/BuildLineTable.tsx:187 +#: src/tables/build/BuildLineTable.tsx:188 #: src/tables/stock/StockItemTable.tsx:367 msgid "Consumed" msgstr "" #: src/forms/CommonForms.tsx:88 -#: src/forms/PurchaseOrderForms.tsx:125 +#: src/forms/PurchaseOrderForms.tsx:176 #: src/forms/ReturnOrderForms.tsx:138 -#: src/forms/SalesOrderForms.tsx:164 +#: src/forms/SalesOrderForms.tsx:182 msgid "Select project code for this line item" msgstr "" @@ -4572,32 +4579,16 @@ msgstr "" msgid "Subscribe to notifications for this category" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:388 -msgid "Assign Batch Code and Serial Numbers" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:390 -msgid "Assign Batch Code" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:410 -msgid "Choose Location" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:418 -msgid "Item Destination selected" -msgstr "" - #: src/forms/PurchaseOrderForms.tsx:421 #~ msgid "Assign Batch Code{0}" #~ msgstr "Assign Batch Code{0}" -#: src/forms/PurchaseOrderForms.tsx:428 -msgid "Part category default location selected" +#: src/forms/PurchaseOrderForms.tsx:440 +msgid "Assign Batch Code and Serial Numbers" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:438 -msgid "Received stock location selected" +#: src/forms/PurchaseOrderForms.tsx:442 +msgid "Assign Batch Code" msgstr "" #: src/forms/PurchaseOrderForms.tsx:444 @@ -4605,94 +4596,110 @@ msgstr "" #~ msgid "Remove item from list" #~ msgstr "Remove item from list" -#: src/forms/PurchaseOrderForms.tsx:446 +#: src/forms/PurchaseOrderForms.tsx:462 +msgid "Choose Location" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:470 +msgid "Item Destination selected" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:480 +msgid "Part category default location selected" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:490 +msgid "Received stock location selected" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:498 msgid "Default location selected" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:507 +#: src/forms/PurchaseOrderForms.tsx:559 msgid "Set Location" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:524 -msgid "Set Expiry Date" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:532 -#: src/forms/StockForms.tsx:693 -msgid "Adjust Packaging" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:540 -#: src/forms/StockForms.tsx:684 -#: src/hooks/UseStockAdjustActions.tsx:148 -msgid "Change Status" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:546 -msgid "Add Note" -msgstr "" - #: src/forms/PurchaseOrderForms.tsx:566 #~ msgid "Serial numbers" #~ msgstr "Serial numbers" +#: src/forms/PurchaseOrderForms.tsx:576 +msgid "Set Expiry Date" +msgstr "" + #: src/forms/PurchaseOrderForms.tsx:582 #~ msgid "Store at line item destination" #~ msgstr "Store at line item destination" -#: src/forms/PurchaseOrderForms.tsx:610 -msgid "Store at default location" +#: src/forms/PurchaseOrderForms.tsx:584 +#: src/forms/StockForms.tsx:693 +msgid "Adjust Packaging" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:625 -msgid "Store at line item destination " +#: src/forms/PurchaseOrderForms.tsx:592 +#: src/forms/StockForms.tsx:684 +#: src/hooks/UseStockAdjustActions.tsx:148 +msgid "Change Status" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:637 -msgid "Store with already received stock" +#: src/forms/PurchaseOrderForms.tsx:598 +msgid "Add Note" msgstr "" #: src/forms/PurchaseOrderForms.tsx:658 #~ msgid "Receive line items" #~ msgstr "Receive line items" -#: src/forms/PurchaseOrderForms.tsx:661 +#: src/forms/PurchaseOrderForms.tsx:662 +msgid "Store at default location" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:677 +msgid "Store at line item destination " +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:689 +msgid "Store with already received stock" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:713 #: src/pages/build/BuildDetail.tsx:340 #: src/pages/stock/StockDetail.tsx:280 #: src/pages/stock/StockDetail.tsx:952 #: src/tables/Filter.tsx:83 -#: src/tables/build/BuildAllocatedStockTable.tsx:128 +#: src/tables/build/BuildAllocatedStockTable.tsx:125 #: src/tables/build/BuildOutputTable.tsx:112 -#: src/tables/part/PartTestResultTable.tsx:260 -#: src/tables/part/PartTestResultTable.tsx:281 +#: src/tables/part/PartTestResultTable.tsx:268 +#: src/tables/part/PartTestResultTable.tsx:289 #: src/tables/sales/SalesOrderAllocationTable.tsx:149 msgid "Batch Code" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:662 +#: src/forms/PurchaseOrderForms.tsx:714 msgid "Enter batch code for received items" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:675 +#: src/forms/PurchaseOrderForms.tsx:727 #: src/forms/StockForms.tsx:218 msgid "Serial Numbers" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:676 +#: src/forms/PurchaseOrderForms.tsx:728 msgid "Enter serial numbers for received items" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:690 +#: src/forms/PurchaseOrderForms.tsx:742 #: src/pages/stock/StockDetail.tsx:382 #: src/tables/stock/StockItemTable.tsx:294 msgid "Expiry Date" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:691 +#: src/forms/PurchaseOrderForms.tsx:743 msgid "Enter an expiry date for received items" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:703 +#: src/forms/PurchaseOrderForms.tsx:755 #: src/forms/StockForms.tsx:728 #: src/pages/company/SupplierPartDetail.tsx:172 #: src/pages/company/SupplierPartDetail.tsx:236 @@ -4701,19 +4708,19 @@ msgstr "" msgid "Packaging" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:727 +#: src/forms/PurchaseOrderForms.tsx:779 #: src/pages/company/SupplierPartDetail.tsx:120 #: src/tables/ColumnRenderers.tsx:332 msgid "Note" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:799 +#: src/forms/PurchaseOrderForms.tsx:851 #: src/pages/company/SupplierPartDetail.tsx:138 #: src/tables/purchasing/SupplierPriceBreakTable.tsx:49 msgid "SKU" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:800 +#: src/forms/PurchaseOrderForms.tsx:852 #: src/tables/part/PartPurchaseOrdersTable.tsx:127 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:213 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:283 @@ -4721,11 +4728,11 @@ msgstr "" msgid "Received" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:817 +#: src/forms/PurchaseOrderForms.tsx:869 msgid "Receive Line Items" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:823 +#: src/forms/PurchaseOrderForms.tsx:875 msgid "Items received" msgstr "" @@ -4737,7 +4744,7 @@ msgstr "" msgid "Item received into stock" msgstr "" -#: src/forms/SalesOrderForms.tsx:401 +#: src/forms/SalesOrderForms.tsx:419 msgid "Leave blank to use the order address" msgstr "" @@ -5799,7 +5806,7 @@ msgstr "" #: src/pages/Index/Settings/AccountSettings/AccountDetailPanel.tsx:65 #: src/pages/core/UserDetail.tsx:55 msgid "First Name" -msgstr "" +msgstr "Prenume" #: src/pages/Index/Settings/AccountSettings/AccountDetailPanel.tsx:66 #: src/pages/core/UserDetail.tsx:63 @@ -5932,6 +5939,9 @@ msgstr "" #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:310 #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:401 +#: src/tables/build/BuildAllocatedStockTable.tsx:181 +#: src/tables/build/BuildLineTable.tsx:668 +#: src/tables/sales/SalesOrderAllocationTable.tsx:220 msgid "Confirm Removal" msgstr "" @@ -6870,8 +6880,8 @@ msgstr "" #: src/pages/sales/ReturnOrderDetail.tsx:108 #: src/pages/sales/SalesOrderDetail.tsx:98 #: src/tables/ColumnRenderers.tsx:321 -#: src/tables/build/BuildAllocatedStockTable.tsx:115 -#: src/tables/build/BuildLineTable.tsx:352 +#: src/tables/build/BuildAllocatedStockTable.tsx:112 +#: src/tables/build/BuildLineTable.tsx:353 msgid "Reference" msgstr "" @@ -7132,7 +7142,7 @@ msgstr "" #: src/pages/build/BuildDetail.tsx:742 #: src/pages/stock/StockDetail.tsx:344 -#: src/tables/build/BuildAllocatedStockTable.tsx:85 +#: src/tables/build/BuildAllocatedStockTable.tsx:82 #: src/tables/part/PartBuildAllocationsTable.tsx:45 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:157 #: src/tables/stock/StockTrackingTable.tsx:109 @@ -7600,7 +7610,7 @@ msgstr "" #: src/pages/part/PartDetail.tsx:542 #: src/tables/bom/BomTable.tsx:439 -#: src/tables/build/BuildLineTable.tsx:305 +#: src/tables/build/BuildLineTable.tsx:306 #: src/tables/part/PartTable.tsx:319 #: src/tables/sales/SalesOrderLineItemTable.tsx:138 msgid "Available Stock" @@ -7608,7 +7618,7 @@ msgstr "" #: src/pages/part/PartDetail.tsx:548 #: src/tables/bom/BomTable.tsx:341 -#: src/tables/build/BuildLineTable.tsx:267 +#: src/tables/build/BuildLineTable.tsx:268 #: src/tables/sales/SalesOrderLineItemTable.tsx:180 msgid "On order" msgstr "" @@ -7782,7 +7792,7 @@ msgstr "" #: src/pages/part/PartDetail.tsx:1144 #: src/pages/stock/StockDetail.tsx:884 -#: src/tables/build/BuildLineTable.tsx:761 +#: src/tables/build/BuildLineTable.tsx:768 msgid "Order Stock" msgstr "" @@ -9219,13 +9229,13 @@ msgstr "" #~ msgstr "Show asssmbled items" #: src/tables/bom/BomTable.tsx:315 -#: src/tables/build/BuildLineTable.tsx:276 +#: src/tables/build/BuildLineTable.tsx:277 #: src/tables/part/PartTable.tsx:145 msgid "External stock" msgstr "" #: src/tables/bom/BomTable.tsx:323 -#: src/tables/build/BuildLineTable.tsx:239 +#: src/tables/build/BuildLineTable.tsx:240 msgid "Includes substitute stock" msgstr "" @@ -9234,7 +9244,7 @@ msgstr "" #~ msgstr "Edit Bom Item" #: src/tables/bom/BomTable.tsx:332 -#: src/tables/build/BuildLineTable.tsx:249 +#: src/tables/build/BuildLineTable.tsx:250 #: src/tables/sales/SalesOrderLineItemTable.tsx:166 msgid "Includes variant stock" msgstr "" @@ -9272,8 +9282,8 @@ msgid "Stock Information" msgstr "" #: src/tables/bom/BomTable.tsx:399 -#: src/tables/build/BuildLineTable.tsx:496 -#: src/tables/build/BuildLineTable.tsx:537 +#: src/tables/build/BuildLineTable.tsx:497 +#: src/tables/build/BuildLineTable.tsx:538 msgid "Consumable item" msgstr "" @@ -9282,7 +9292,7 @@ msgid "No available stock" msgstr "" #: src/tables/bom/BomTable.tsx:420 -#: src/tables/build/BuildLineTable.tsx:213 +#: src/tables/build/BuildLineTable.tsx:214 msgid "Show testable items" msgstr "" @@ -9291,7 +9301,7 @@ msgid "Show trackable items" msgstr "" #: src/tables/bom/BomTable.tsx:430 -#: src/tables/build/BuildLineTable.tsx:208 +#: src/tables/build/BuildLineTable.tsx:209 msgid "Show assembled items" msgstr "" @@ -9335,7 +9345,7 @@ msgstr "" #: src/tables/bom/BomTable.tsx:464 #: src/tables/bom/UsedInTable.tsx:85 -#: src/tables/build/BuildLineTable.tsx:202 +#: src/tables/build/BuildLineTable.tsx:203 msgid "Optional" msgstr "" @@ -9345,7 +9355,7 @@ msgid "Show optional items" msgstr "" #: src/tables/bom/BomTable.tsx:469 -#: src/tables/build/BuildLineTable.tsx:197 +#: src/tables/build/BuildLineTable.tsx:198 msgid "Consumable" msgstr "" @@ -9433,7 +9443,7 @@ msgid "Bill of materials cannot be edited, as the part is locked" msgstr "" #: src/tables/bom/UsedInTable.tsx:34 -#: src/tables/build/BuildLineTable.tsx:207 +#: src/tables/build/BuildLineTable.tsx:208 #: src/tables/part/ParametricPartTable.tsx:364 #: src/tables/part/PartBuildAllocationsTable.tsx:60 #: src/tables/part/PartTable.tsx:209 @@ -9455,11 +9465,11 @@ msgstr "" msgid "Show trackable assemblies" msgstr "" -#: src/tables/build/BuildAllocatedStockTable.tsx:67 +#: src/tables/build/BuildAllocatedStockTable.tsx:64 msgid "Allocated to Output" msgstr "" -#: src/tables/build/BuildAllocatedStockTable.tsx:68 +#: src/tables/build/BuildAllocatedStockTable.tsx:65 msgid "Show items allocated to a build output" msgstr "" @@ -9472,7 +9482,7 @@ msgstr "" #~ msgid "Include orders for part variants" #~ msgstr "Include orders for part variants" -#: src/tables/build/BuildAllocatedStockTable.tsx:97 +#: src/tables/build/BuildAllocatedStockTable.tsx:94 #: src/tables/part/PartBuildAllocationsTable.tsx:84 #: src/tables/part/PartPurchaseOrdersTable.tsx:132 #: src/tables/part/PartSalesAllocationsTable.tsx:69 @@ -9482,40 +9492,58 @@ msgid "Order Status" msgstr "" #: src/tables/build/BuildAllocatedStockTable.tsx:164 -#~ msgid "Edit Build Item" -#~ msgstr "Edit Build Item" - -#: src/tables/build/BuildAllocatedStockTable.tsx:167 -#: src/tables/build/BuildLineTable.tsx:650 +#: src/tables/build/BuildLineTable.tsx:651 msgid "Edit Stock Allocation" msgstr "" +#: src/tables/build/BuildAllocatedStockTable.tsx:164 +#~ msgid "Edit Build Item" +#~ msgstr "Edit Build Item" + #: src/tables/build/BuildAllocatedStockTable.tsx:174 #~ msgid "Delete Build Item" #~ msgstr "Delete Build Item" -#: src/tables/build/BuildAllocatedStockTable.tsx:180 -#: src/tables/build/BuildLineTable.tsx:663 -msgid "Delete Stock Allocation" +#: src/tables/build/BuildAllocatedStockTable.tsx:177 +#: src/tables/build/BuildLineTable.tsx:664 +#: src/tables/sales/SalesOrderAllocationTable.tsx:218 +msgid "Remove Allocated Stock" msgstr "" -#: src/tables/build/BuildAllocatedStockTable.tsx:239 +#: src/tables/build/BuildAllocatedStockTable.tsx:180 +#: src/tables/build/BuildLineTable.tsx:663 +#~ msgid "Delete Stock Allocation" +#~ msgstr "Delete Stock Allocation" + +#: src/tables/build/BuildAllocatedStockTable.tsx:182 +#: src/tables/build/BuildLineTable.tsx:669 +#: src/tables/sales/SalesOrderAllocationTable.tsx:221 +msgid "Are you sure you want to remove this allocated stock from the order?" +msgstr "" + +#: src/tables/build/BuildAllocatedStockTable.tsx:242 msgid "Consume" msgstr "" +#: src/tables/build/BuildAllocatedStockTable.tsx:259 +#: src/tables/build/BuildLineTable.tsx:112 +#: src/tables/sales/SalesOrderAllocationTable.tsx:248 +msgid "Remove allocated stock" +msgstr "" + #: src/tables/build/BuildLineTable.tsx:59 #~ msgid "Show lines with available stock" #~ msgstr "Show lines with available stock" -#: src/tables/build/BuildLineTable.tsx:120 +#: src/tables/build/BuildLineTable.tsx:121 msgid "View Stock Item" msgstr "" -#: src/tables/build/BuildLineTable.tsx:183 +#: src/tables/build/BuildLineTable.tsx:184 msgid "Show fully allocated lines" msgstr "" -#: src/tables/build/BuildLineTable.tsx:188 +#: src/tables/build/BuildLineTable.tsx:189 msgid "Show fully consumed lines" msgstr "" @@ -9523,124 +9551,124 @@ msgstr "" #~ msgid "Show allocated lines" #~ msgstr "Show allocated lines" -#: src/tables/build/BuildLineTable.tsx:193 +#: src/tables/build/BuildLineTable.tsx:194 msgid "Show items with sufficient available stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:198 +#: src/tables/build/BuildLineTable.tsx:199 msgid "Show consumable lines" msgstr "" -#: src/tables/build/BuildLineTable.tsx:203 +#: src/tables/build/BuildLineTable.tsx:204 msgid "Show optional lines" msgstr "" -#: src/tables/build/BuildLineTable.tsx:212 +#: src/tables/build/BuildLineTable.tsx:213 #: src/tables/part/PartTable.tsx:233 msgid "Testable" msgstr "" -#: src/tables/build/BuildLineTable.tsx:217 +#: src/tables/build/BuildLineTable.tsx:218 #: src/tables/stock/StockItemTable.tsx:388 msgid "Tracked" msgstr "" -#: src/tables/build/BuildLineTable.tsx:218 +#: src/tables/build/BuildLineTable.tsx:219 msgid "Show tracked lines" msgstr "" -#: src/tables/build/BuildLineTable.tsx:223 +#: src/tables/build/BuildLineTable.tsx:224 msgid "Show items with stock on order" msgstr "" -#: src/tables/build/BuildLineTable.tsx:258 +#: src/tables/build/BuildLineTable.tsx:259 #: src/tables/sales/SalesOrderLineItemTable.tsx:172 msgid "In production" msgstr "" -#: src/tables/build/BuildLineTable.tsx:286 +#: src/tables/build/BuildLineTable.tsx:287 msgid "Insufficient stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:302 +#: src/tables/build/BuildLineTable.tsx:303 #: src/tables/sales/SalesOrderLineItemTable.tsx:160 #: src/tables/stock/StockItemTable.tsx:191 msgid "No stock available" msgstr "" -#: src/tables/build/BuildLineTable.tsx:375 +#: src/tables/build/BuildLineTable.tsx:376 msgid "Gets Inherited" msgstr "" -#: src/tables/build/BuildLineTable.tsx:388 +#: src/tables/build/BuildLineTable.tsx:389 msgid "Unit Quantity" msgstr "" -#: src/tables/build/BuildLineTable.tsx:415 +#: src/tables/build/BuildLineTable.tsx:416 msgid "Setup Quantity" msgstr "" -#: src/tables/build/BuildLineTable.tsx:424 +#: src/tables/build/BuildLineTable.tsx:425 msgid "Attrition" msgstr "" -#: src/tables/build/BuildLineTable.tsx:432 +#: src/tables/build/BuildLineTable.tsx:433 msgid "Rounding Multiple" msgstr "" -#: src/tables/build/BuildLineTable.tsx:441 +#: src/tables/build/BuildLineTable.tsx:442 msgid "BOM Information" msgstr "" -#: src/tables/build/BuildLineTable.tsx:515 +#: src/tables/build/BuildLineTable.tsx:516 #: src/tables/part/PartBuildAllocationsTable.tsx:102 msgid "Fully allocated" msgstr "" -#: src/tables/build/BuildLineTable.tsx:563 +#: src/tables/build/BuildLineTable.tsx:564 #: src/tables/sales/SalesOrderLineItemTable.tsx:311 msgid "Create Build Order" msgstr "" -#: src/tables/build/BuildLineTable.tsx:592 +#: src/tables/build/BuildLineTable.tsx:593 msgid "Auto allocation in progress" msgstr "" -#: src/tables/build/BuildLineTable.tsx:595 -#: src/tables/build/BuildLineTable.tsx:802 +#: src/tables/build/BuildLineTable.tsx:596 +#: src/tables/build/BuildLineTable.tsx:809 msgid "Auto Allocate Stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:596 +#: src/tables/build/BuildLineTable.tsx:597 msgid "Automatically allocate stock to this build according to the selected options" msgstr "" -#: src/tables/build/BuildLineTable.tsx:616 -#: src/tables/build/BuildLineTable.tsx:630 -#: src/tables/build/BuildLineTable.tsx:751 -#: src/tables/build/BuildLineTable.tsx:852 +#: src/tables/build/BuildLineTable.tsx:617 +#: src/tables/build/BuildLineTable.tsx:631 +#: src/tables/build/BuildLineTable.tsx:758 +#: src/tables/build/BuildLineTable.tsx:859 #: src/tables/build/BuildOutputTable.tsx:355 #: src/tables/build/BuildOutputTable.tsx:360 msgid "Deallocate Stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:632 +#: src/tables/build/BuildLineTable.tsx:633 msgid "Deallocate all untracked stock for this build order" msgstr "" -#: src/tables/build/BuildLineTable.tsx:634 +#: src/tables/build/BuildLineTable.tsx:635 msgid "Deallocate stock from the selected line item" msgstr "" -#: src/tables/build/BuildLineTable.tsx:638 +#: src/tables/build/BuildLineTable.tsx:639 msgid "Stock has been deallocated" msgstr "" -#: src/tables/build/BuildLineTable.tsx:771 +#: src/tables/build/BuildLineTable.tsx:778 msgid "Build Stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:784 +#: src/tables/build/BuildLineTable.tsx:791 #: src/tables/sales/SalesOrderLineItemTable.tsx:487 msgid "View Part" msgstr "" @@ -9739,7 +9767,7 @@ msgid "Serialize Build Output" msgstr "" #: src/tables/build/BuildOutputTable.tsx:405 -#: src/tables/part/PartTestResultTable.tsx:310 +#: src/tables/part/PartTestResultTable.tsx:318 #: src/tables/stock/StockItemTable.tsx:328 msgid "Filter by stock status" msgstr "" @@ -9964,8 +9992,8 @@ msgid "View Item" msgstr "" #: src/tables/general/ExtraLineItemTable.tsx:95 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:299 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:403 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:300 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:405 #: src/tables/sales/ReturnOrderLineItemTable.tsx:83 #: src/tables/sales/ReturnOrderLineItemTable.tsx:187 #: src/tables/sales/SalesOrderLineItemTable.tsx:252 @@ -9974,14 +10002,14 @@ msgid "Add Line Item" msgstr "" #: src/tables/general/ExtraLineItemTable.tsx:108 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:320 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:322 #: src/tables/sales/ReturnOrderLineItemTable.tsx:96 #: src/tables/sales/SalesOrderLineItemTable.tsx:271 msgid "Edit Line Item" msgstr "" #: src/tables/general/ExtraLineItemTable.tsx:117 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:329 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:331 #: src/tables/sales/ReturnOrderLineItemTable.tsx:105 #: src/tables/sales/SalesOrderLineItemTable.tsx:280 msgid "Delete Line Item" @@ -10273,7 +10301,7 @@ msgid "Required Stock" msgstr "" #: src/tables/part/PartBuildAllocationsTable.tsx:124 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:381 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:383 msgid "View Build Order" msgstr "" @@ -10617,8 +10645,8 @@ msgstr "" #: src/tables/part/PartTestResultTable.tsx:103 #: src/tables/part/PartTestResultTable.tsx:181 -#: src/tables/part/PartTestResultTable.tsx:320 -#: src/tables/part/PartTestResultTable.tsx:334 +#: src/tables/part/PartTestResultTable.tsx:328 +#: src/tables/part/PartTestResultTable.tsx:342 #: src/tables/stock/StockItemTestResultTable.tsx:296 #: src/tables/stock/StockItemTestResultTable.tsx:368 #: src/tables/stock/StockItemTestResultTable.tsx:429 @@ -10643,7 +10671,7 @@ msgstr "" msgid "No Result" msgstr "" -#: src/tables/part/PartTestResultTable.tsx:298 +#: src/tables/part/PartTestResultTable.tsx:306 msgid "Show build outputs currently in production" msgstr "" @@ -11073,7 +11101,7 @@ msgid "Show manufacturer parts for active manufacturers." msgstr "" #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:115 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:397 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:399 msgid "Import Line Items" msgstr "" @@ -11099,11 +11127,11 @@ msgstr "" #~ msgid "Add line item" #~ msgstr "Add line item" -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:350 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:352 msgid "Receive line item" msgstr "" -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:414 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:416 msgid "Receive items" msgstr "" @@ -11201,25 +11229,25 @@ msgid "Not shipped" msgstr "" #: src/tables/sales/SalesOrderAllocationTable.tsx:211 -#: src/tables/sales/SalesOrderAllocationTable.tsx:229 +#: src/tables/sales/SalesOrderAllocationTable.tsx:235 msgid "Edit Allocation" msgstr "" #: src/tables/sales/SalesOrderAllocationTable.tsx:218 #: src/tables/sales/SalesOrderAllocationTable.tsx:241 -msgid "Delete Allocation" -msgstr "" +#~ msgid "Delete Allocation" +#~ msgstr "Delete Allocation" -#: src/tables/sales/SalesOrderAllocationTable.tsx:252 -#: src/tables/sales/SalesOrderAllocationTable.tsx:253 +#: src/tables/sales/SalesOrderAllocationTable.tsx:261 +#: src/tables/sales/SalesOrderAllocationTable.tsx:262 msgid "View Shipment" msgstr "" -#: src/tables/sales/SalesOrderAllocationTable.tsx:308 +#: src/tables/sales/SalesOrderAllocationTable.tsx:317 msgid "Assign to Shipment" msgstr "" -#: src/tables/sales/SalesOrderAllocationTable.tsx:324 +#: src/tables/sales/SalesOrderAllocationTable.tsx:333 msgid "Assign to shipment" msgstr "" diff --git a/src/frontend/src/locales/ru/messages.po b/src/frontend/src/locales/ru/messages.po index c7bec7243f..2f4b094fe8 100644 --- a/src/frontend/src/locales/ru/messages.po +++ b/src/frontend/src/locales/ru/messages.po @@ -8,7 +8,7 @@ msgstr "" "Language: ru\n" "Project-Id-Version: inventree\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2025-11-19 19:39\n" +"PO-Revision-Date: 2025-11-22 06:25\n" "Last-Translator: \n" "Language-Team: Russian\n" "Plural-Forms: nplurals=4; plural=((n%10==1 && n%100!=11) ? 0 : ((n%10 >= 2 && n%10 <=4 && (n%100 < 12 || n%100 > 14)) ? 1 : ((n%10 == 0 || (n%10 >= 5 && n%10 <=9)) || (n%100 >= 11 && n%100 <= 14)) ? 2 : 3));\n" @@ -56,7 +56,7 @@ msgstr "Отменить" #: lib/components/RowActions.tsx:136 #: src/components/nav/NavigationDrawer.tsx:190 -#: src/forms/PurchaseOrderForms.tsx:802 +#: src/forms/PurchaseOrderForms.tsx:854 #: src/forms/StockForms.tsx:796 #: src/forms/StockForms.tsx:843 #: src/forms/StockForms.tsx:889 @@ -103,9 +103,9 @@ msgstr "Нет" #: src/forms/BuildForms.tsx:630 #: src/forms/BuildForms.tsx:793 #: src/forms/BuildForms.tsx:896 -#: src/forms/PurchaseOrderForms.tsx:798 +#: src/forms/PurchaseOrderForms.tsx:850 #: src/forms/ReturnOrderForms.tsx:242 -#: src/forms/SalesOrderForms.tsx:305 +#: src/forms/SalesOrderForms.tsx:323 #: src/forms/StockForms.tsx:360 #: src/forms/StockForms.tsx:791 #: src/forms/StockForms.tsx:838 @@ -119,6 +119,7 @@ msgstr "Нет" #: src/pages/build/BuildDetail.tsx:200 #: src/pages/part/PartDetail.tsx:1207 #: src/tables/ColumnRenderers.tsx:91 +#: src/tables/part/PartTestResultTable.tsx:247 #: src/tables/part/RelatedPartTable.tsx:53 #: src/tables/stock/StockTrackingTable.tsx:87 msgid "Part" @@ -158,7 +159,7 @@ msgstr "Шаблоны тестов детали" #: src/components/wizards/OrderPartsWizard.tsx:290 #: src/pages/company/SupplierPartDetail.tsx:413 #: src/pages/stock/StockDetail.tsx:289 -#: src/tables/build/BuildAllocatedStockTable.tsx:155 +#: src/tables/build/BuildAllocatedStockTable.tsx:152 #: src/tables/part/PartPurchaseOrdersTable.tsx:50 #: src/tables/purchasing/SupplierPartTable.tsx:83 #: src/tables/stock/StockItemTable.tsx:247 @@ -201,9 +202,9 @@ msgstr "Категории деталей" #: src/forms/BuildForms.tsx:473 #: src/forms/BuildForms.tsx:633 #: src/forms/BuildForms.tsx:794 -#: src/forms/SalesOrderForms.tsx:307 +#: src/forms/SalesOrderForms.tsx:325 #: src/pages/stock/StockDetail.tsx:1005 -#: src/tables/part/PartTestResultTable.tsx:248 +#: src/tables/part/PartTestResultTable.tsx:256 #: src/tables/stock/StockTrackingTable.tsx:48 #: src/tables/stock/StockTrackingTable.tsx:55 msgid "Stock Item" @@ -517,7 +518,7 @@ msgstr "Списки выбора" #: src/components/dashboard/DashboardLayout.tsx:281 #: src/components/editors/NotesEditor.tsx:74 #: src/components/editors/TemplateEditor/TemplateEditor.tsx:158 -#: src/components/forms/fields/ApiFormField.tsx:273 +#: src/components/forms/fields/ApiFormField.tsx:237 #: src/components/forms/fields/TableField.tsx:45 #: src/components/importer/ImportDataSelector.tsx:192 #: src/components/importer/ImporterColumnSelector.tsx:234 @@ -642,8 +643,8 @@ msgstr "Введите данные штрихкода" #: src/components/barcodes/BarcodeScanDialog.tsx:49 #: src/components/buttons/ScanButton.tsx:15 #: src/components/nav/NavigationDrawer.tsx:122 -#: src/forms/PurchaseOrderForms.tsx:457 -#: src/forms/PurchaseOrderForms.tsx:563 +#: src/forms/PurchaseOrderForms.tsx:509 +#: src/forms/PurchaseOrderForms.tsx:615 msgid "Scan Barcode" msgstr "Сканировать штрихкод" @@ -728,7 +729,7 @@ msgstr "Это удалит ссылку на связанный штрих-ко #: src/components/barcodes/QRCode.tsx:205 #: src/components/items/ActionDropdown.tsx:192 -#: src/forms/PurchaseOrderForms.tsx:554 +#: src/forms/PurchaseOrderForms.tsx:606 msgid "Unlink Barcode" msgstr "Отвязать штрихкод" @@ -1216,6 +1217,12 @@ msgstr "Удалить связанное изображение?" #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:884 #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:903 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:254 +#: src/tables/build/BuildAllocatedStockTable.tsx:178 +#: src/tables/build/BuildAllocatedStockTable.tsx:258 +#: src/tables/build/BuildLineTable.tsx:111 +#: src/tables/build/BuildLineTable.tsx:665 +#: src/tables/sales/SalesOrderAllocationTable.tsx:224 +#: src/tables/sales/SalesOrderAllocationTable.tsx:247 msgid "Remove" msgstr "Удалить" @@ -1241,7 +1248,7 @@ msgid "Upload Error" msgstr "Ошибка загрузки" #: src/components/details/DetailsImage.tsx:250 -#: src/components/forms/fields/TextField.tsx:65 +#: src/components/forms/fields/AutoFillRightSection.tsx:34 msgid "Clear" msgstr "Очистить" @@ -1817,10 +1824,14 @@ msgstr "Остановлен" msgid "Running" msgstr "Работает" -#: src/components/forms/fields/ApiFormField.tsx:233 +#: src/components/forms/fields/ApiFormField.tsx:197 msgid "Select file to upload" msgstr "Выберите файл для загрузки" +#: src/components/forms/fields/AutoFillRightSection.tsx:47 +msgid "Accept suggested value" +msgstr "" + #: src/components/forms/fields/DateField.tsx:76 msgid "Select date" msgstr "Выберите дату" @@ -1875,10 +1886,6 @@ msgstr "Нет доступных записей" msgid "Add new row" msgstr "Добавить строку" -#: src/components/forms/fields/TextField.tsx:82 -msgid "Accept suggested value" -msgstr "" - #: src/components/images/DetailsImage.tsx:252 #~ msgid "Select image" #~ msgstr "Select image" @@ -2225,8 +2232,8 @@ msgstr "Нет элементов" #: src/pages/part/PartDetail.tsx:994 #: src/pages/stock/StockDetail.tsx:265 #: src/pages/stock/StockDetail.tsx:942 -#: src/tables/build/BuildAllocatedStockTable.tsx:135 -#: src/tables/build/BuildLineTable.tsx:192 +#: src/tables/build/BuildAllocatedStockTable.tsx:132 +#: src/tables/build/BuildLineTable.tsx:193 #: src/tables/part/PartTable.tsx:137 #: src/tables/stock/StockItemTable.tsx:182 #: src/tables/stock/StockItemTable.tsx:343 @@ -2784,7 +2791,7 @@ msgstr "Информация о плагине" #: src/pages/sales/SalesOrderDetail.tsx:119 #: src/pages/stock/LocationDetail.tsx:102 #: src/tables/ColumnRenderers.tsx:278 -#: src/tables/build/BuildAllocatedStockTable.tsx:91 +#: src/tables/build/BuildAllocatedStockTable.tsx:88 #: src/tables/machine/MachineTypeTable.tsx:161 #: src/tables/machine/MachineTypeTable.tsx:257 #: src/tables/plugin/PluginListTable.tsx:110 @@ -2966,7 +2973,7 @@ msgstr "Нет склада" #: src/pages/company/SupplierPartDetail.tsx:394 #: src/pages/part/PartDetail.tsx:1015 #: src/tables/bom/BomTable.tsx:444 -#: src/tables/build/BuildLineTable.tsx:222 +#: src/tables/build/BuildLineTable.tsx:223 #: src/tables/part/PartTable.tsx:108 msgid "On Order" msgstr "В заказе" @@ -2976,7 +2983,7 @@ msgstr "В заказе" #: src/pages/part/PartDetail.tsx:587 #: src/pages/part/PartDetail.tsx:1021 #: src/pages/stock/StockDetail.tsx:925 -#: src/tables/part/PartTestResultTable.tsx:297 +#: src/tables/part/PartTestResultTable.tsx:305 #: src/tables/stock/StockItemTable.tsx:359 msgid "In Production" msgstr "В производстве" @@ -3000,7 +3007,7 @@ msgstr "Категория" #: src/components/render/Stock.tsx:114 #: src/components/render/Stock.tsx:132 #: src/forms/BuildForms.tsx:795 -#: src/forms/PurchaseOrderForms.tsx:595 +#: src/forms/PurchaseOrderForms.tsx:647 #: src/forms/StockForms.tsx:792 #: src/forms/StockForms.tsx:839 #: src/forms/StockForms.tsx:885 @@ -3023,7 +3030,7 @@ msgstr "Расположение" #: src/components/render/Stock.tsx:99 #: src/pages/stock/StockDetail.tsx:198 #: src/pages/stock/StockDetail.tsx:930 -#: src/tables/build/BuildAllocatedStockTable.tsx:121 +#: src/tables/build/BuildAllocatedStockTable.tsx:118 #: src/tables/build/BuildOutputTable.tsx:107 #: src/tables/sales/SalesOrderAllocationTable.tsx:142 msgid "Serial Number" @@ -3034,9 +3041,9 @@ msgstr "Серийный номер" #: src/forms/BuildForms.tsx:240 #: src/forms/BuildForms.tsx:634 #: src/forms/BuildForms.tsx:797 -#: src/forms/PurchaseOrderForms.tsx:801 +#: src/forms/PurchaseOrderForms.tsx:853 #: src/forms/ReturnOrderForms.tsx:243 -#: src/forms/SalesOrderForms.tsx:308 +#: src/forms/SalesOrderForms.tsx:326 #: src/forms/StockForms.tsx:841 #: src/pages/part/PartStockHistoryDetail.tsx:56 #: src/pages/part/PartStockHistoryDetail.tsx:210 @@ -3046,9 +3053,9 @@ msgstr "Серийный номер" #: src/pages/part/pricing/PriceBreakPanel.tsx:172 #: src/pages/stock/StockDetail.tsx:258 #: src/pages/stock/StockDetail.tsx:936 -#: src/tables/build/BuildLineTable.tsx:86 +#: src/tables/build/BuildLineTable.tsx:83 #: src/tables/part/PartPurchaseOrdersTable.tsx:94 -#: src/tables/part/PartTestResultTable.tsx:269 +#: src/tables/part/PartTestResultTable.tsx:277 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:175 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:206 #: src/tables/purchasing/SupplierPriceBreakTable.tsx:69 @@ -3070,7 +3077,7 @@ msgstr "Количество" #: src/forms/StockForms.tsx:1048 #: src/forms/StockForms.tsx:1096 #: src/forms/StockForms.tsx:1140 -#: src/tables/build/BuildLineTable.tsx:96 +#: src/tables/build/BuildLineTable.tsx:93 msgid "Batch" msgstr "Партия" @@ -3755,7 +3762,7 @@ msgid "In Stock" msgstr "На складе" #: src/components/wizards/OrderPartsWizard.tsx:146 -#: src/tables/build/BuildLineTable.tsx:404 +#: src/tables/build/BuildLineTable.tsx:405 msgid "Required Quantity" msgstr "" @@ -3847,7 +3854,7 @@ msgid "Please correct the errors in the selected parts" msgstr "Исправьте ошибки в выбранных деталях" #: src/components/wizards/OrderPartsWizard.tsx:587 -#: src/tables/build/BuildLineTable.tsx:815 +#: src/tables/build/BuildLineTable.tsx:822 #: src/tables/part/PartTable.tsx:522 #: src/tables/sales/SalesOrderLineItemTable.tsx:370 msgid "Order Parts" @@ -4349,9 +4356,9 @@ msgstr "Замена создана" #: src/forms/BuildForms.tsx:333 #: src/forms/BuildForms.tsx:408 #: src/forms/BuildForms.tsx:685 -#: src/tables/build/BuildAllocatedStockTable.tsx:150 +#: src/tables/build/BuildAllocatedStockTable.tsx:147 #: src/tables/build/BuildOutputTable.tsx:582 -#: src/tables/part/PartTestResultTable.tsx:272 +#: src/tables/part/PartTestResultTable.tsx:280 msgid "Build Output" msgstr "Продукция" @@ -4362,7 +4369,7 @@ msgstr "" #: src/forms/BuildForms.tsx:336 #: src/forms/BuildForms.tsx:411 #: src/forms/BuildForms.tsx:475 -#: src/forms/PurchaseOrderForms.tsx:717 +#: src/forms/PurchaseOrderForms.tsx:769 #: src/forms/ReturnOrderForms.tsx:197 #: src/forms/ReturnOrderForms.tsx:244 #: src/forms/StockForms.tsx:712 @@ -4377,7 +4384,7 @@ msgstr "" #: src/tables/build/BuildOutputTable.tsx:404 #: src/tables/machine/MachineListTable.tsx:387 #: src/tables/part/PartPurchaseOrdersTable.tsx:38 -#: src/tables/part/PartTestResultTable.tsx:309 +#: src/tables/part/PartTestResultTable.tsx:317 #: src/tables/sales/ReturnOrderLineItemTable.tsx:138 #: src/tables/sales/ReturnOrderLineItemTable.tsx:176 #: src/tables/settings/CustomStateTable.tsx:79 @@ -4450,8 +4457,8 @@ msgstr "Производство отменено" #: src/pages/stock/StockDetail.tsx:153 #: src/tables/bom/BomTable.tsx:134 #: src/tables/bom/UsedInTable.tsx:40 -#: src/tables/build/BuildAllocatedStockTable.tsx:108 -#: src/tables/build/BuildLineTable.tsx:336 +#: src/tables/build/BuildAllocatedStockTable.tsx:105 +#: src/tables/build/BuildLineTable.tsx:337 #: src/tables/build/BuildOrderTable.tsx:79 #: src/tables/part/PartSalesAllocationsTable.tsx:61 #: src/tables/part/RelatedPartTable.tsx:73 @@ -4466,47 +4473,47 @@ msgstr "Внутренний артикул" #: src/forms/BuildForms.tsx:632 #: src/forms/BuildForms.tsx:796 #: src/forms/BuildForms.tsx:897 -#: src/forms/SalesOrderForms.tsx:306 -#: src/tables/build/BuildAllocatedStockTable.tsx:139 -#: src/tables/build/BuildLineTable.tsx:182 +#: src/forms/SalesOrderForms.tsx:324 +#: src/tables/build/BuildAllocatedStockTable.tsx:136 +#: src/tables/build/BuildLineTable.tsx:183 #: src/tables/sales/SalesOrderLineItemTable.tsx:342 #: src/tables/stock/StockItemTable.tsx:338 msgid "Allocated" msgstr "Зарезервировано" #: src/forms/BuildForms.tsx:667 -#: src/forms/SalesOrderForms.tsx:295 +#: src/forms/SalesOrderForms.tsx:313 #: src/pages/build/BuildDetail.tsx:108 #: src/pages/build/BuildDetail.tsx:326 msgid "Source Location" msgstr "Место хранения комплектующих" #: src/forms/BuildForms.tsx:668 -#: src/forms/SalesOrderForms.tsx:296 +#: src/forms/SalesOrderForms.tsx:314 msgid "Select the source location for the stock allocation" msgstr "Выберите исходное расположение для распределения запасов" #: src/forms/BuildForms.tsx:700 -#: src/forms/SalesOrderForms.tsx:336 -#: src/tables/build/BuildLineTable.tsx:574 -#: src/tables/build/BuildLineTable.tsx:731 -#: src/tables/build/BuildLineTable.tsx:830 +#: src/forms/SalesOrderForms.tsx:354 +#: src/tables/build/BuildLineTable.tsx:575 +#: src/tables/build/BuildLineTable.tsx:738 +#: src/tables/build/BuildLineTable.tsx:837 #: src/tables/sales/SalesOrderLineItemTable.tsx:380 #: src/tables/sales/SalesOrderLineItemTable.tsx:406 msgid "Allocate Stock" msgstr "Зарезервировать остатки" #: src/forms/BuildForms.tsx:703 -#: src/forms/SalesOrderForms.tsx:341 +#: src/forms/SalesOrderForms.tsx:359 msgid "Stock items allocated" msgstr "Запасы назначены" #: src/forms/BuildForms.tsx:816 #: src/forms/BuildForms.tsx:917 -#: src/tables/build/BuildAllocatedStockTable.tsx:240 -#: src/tables/build/BuildAllocatedStockTable.tsx:272 -#: src/tables/build/BuildLineTable.tsx:741 -#: src/tables/build/BuildLineTable.tsx:864 +#: src/tables/build/BuildAllocatedStockTable.tsx:243 +#: src/tables/build/BuildAllocatedStockTable.tsx:279 +#: src/tables/build/BuildLineTable.tsx:748 +#: src/tables/build/BuildLineTable.tsx:871 msgid "Consume Stock" msgstr "" @@ -4521,21 +4528,21 @@ msgstr "" #~ msgstr "Stock items consumed" #: src/forms/BuildForms.tsx:853 -#: src/tables/build/BuildLineTable.tsx:514 +#: src/tables/build/BuildLineTable.tsx:515 #: src/tables/part/PartBuildAllocationsTable.tsx:101 msgid "Fully consumed" msgstr "" #: src/forms/BuildForms.tsx:898 -#: src/tables/build/BuildLineTable.tsx:187 +#: src/tables/build/BuildLineTable.tsx:188 #: src/tables/stock/StockItemTable.tsx:367 msgid "Consumed" msgstr "Израсходовано" #: src/forms/CommonForms.tsx:88 -#: src/forms/PurchaseOrderForms.tsx:125 +#: src/forms/PurchaseOrderForms.tsx:176 #: src/forms/ReturnOrderForms.tsx:138 -#: src/forms/SalesOrderForms.tsx:164 +#: src/forms/SalesOrderForms.tsx:182 msgid "Select project code for this line item" msgstr "" @@ -4572,127 +4579,127 @@ msgstr "Родительская категория" msgid "Subscribe to notifications for this category" msgstr "Подписаться на уведомления для этой категории" -#: src/forms/PurchaseOrderForms.tsx:388 -msgid "Assign Batch Code and Serial Numbers" -msgstr "Назначить код партии и серийные номера" - -#: src/forms/PurchaseOrderForms.tsx:390 -msgid "Assign Batch Code" -msgstr "Назначить код партии" - -#: src/forms/PurchaseOrderForms.tsx:410 -msgid "Choose Location" -msgstr "Выберите место хранения" - -#: src/forms/PurchaseOrderForms.tsx:418 -msgid "Item Destination selected" -msgstr "Пункт назначения товара выбран" - #: src/forms/PurchaseOrderForms.tsx:421 #~ msgid "Assign Batch Code{0}" #~ msgstr "Assign Batch Code{0}" -#: src/forms/PurchaseOrderForms.tsx:428 -msgid "Part category default location selected" -msgstr "Выбрано расположение категории по умолчанию" +#: src/forms/PurchaseOrderForms.tsx:440 +msgid "Assign Batch Code and Serial Numbers" +msgstr "Назначить код партии и серийные номера" -#: src/forms/PurchaseOrderForms.tsx:438 -msgid "Received stock location selected" -msgstr "Выбрано место получения запасов" +#: src/forms/PurchaseOrderForms.tsx:442 +msgid "Assign Batch Code" +msgstr "Назначить код партии" #: src/forms/PurchaseOrderForms.tsx:444 #: src/forms/StockForms.tsx:428 #~ msgid "Remove item from list" #~ msgstr "Remove item from list" -#: src/forms/PurchaseOrderForms.tsx:446 +#: src/forms/PurchaseOrderForms.tsx:462 +msgid "Choose Location" +msgstr "Выберите место хранения" + +#: src/forms/PurchaseOrderForms.tsx:470 +msgid "Item Destination selected" +msgstr "Пункт назначения товара выбран" + +#: src/forms/PurchaseOrderForms.tsx:480 +msgid "Part category default location selected" +msgstr "Выбрано расположение категории по умолчанию" + +#: src/forms/PurchaseOrderForms.tsx:490 +msgid "Received stock location selected" +msgstr "Выбрано место получения запасов" + +#: src/forms/PurchaseOrderForms.tsx:498 msgid "Default location selected" msgstr "Выбрано местоположение по умолчанию" -#: src/forms/PurchaseOrderForms.tsx:507 +#: src/forms/PurchaseOrderForms.tsx:559 msgid "Set Location" msgstr "Задать место хранения" -#: src/forms/PurchaseOrderForms.tsx:524 -msgid "Set Expiry Date" -msgstr "Задать срок годности" - -#: src/forms/PurchaseOrderForms.tsx:532 -#: src/forms/StockForms.tsx:693 -msgid "Adjust Packaging" -msgstr "Настройка упаковки" - -#: src/forms/PurchaseOrderForms.tsx:540 -#: src/forms/StockForms.tsx:684 -#: src/hooks/UseStockAdjustActions.tsx:148 -msgid "Change Status" -msgstr "Изменить статус" - -#: src/forms/PurchaseOrderForms.tsx:546 -msgid "Add Note" -msgstr "Добавить заметку" - #: src/forms/PurchaseOrderForms.tsx:566 #~ msgid "Serial numbers" #~ msgstr "Serial numbers" +#: src/forms/PurchaseOrderForms.tsx:576 +msgid "Set Expiry Date" +msgstr "Задать срок годности" + #: src/forms/PurchaseOrderForms.tsx:582 #~ msgid "Store at line item destination" #~ msgstr "Store at line item destination" -#: src/forms/PurchaseOrderForms.tsx:610 -msgid "Store at default location" -msgstr "Использовать место хранения по умолчанию" +#: src/forms/PurchaseOrderForms.tsx:584 +#: src/forms/StockForms.tsx:693 +msgid "Adjust Packaging" +msgstr "Настройка упаковки" -#: src/forms/PurchaseOrderForms.tsx:625 -msgid "Store at line item destination " -msgstr "Использовать место хранения позиции заказа " +#: src/forms/PurchaseOrderForms.tsx:592 +#: src/forms/StockForms.tsx:684 +#: src/hooks/UseStockAdjustActions.tsx:148 +msgid "Change Status" +msgstr "Изменить статус" -#: src/forms/PurchaseOrderForms.tsx:637 -msgid "Store with already received stock" -msgstr "Использовать место хранения уже полученных запасов" +#: src/forms/PurchaseOrderForms.tsx:598 +msgid "Add Note" +msgstr "Добавить заметку" #: src/forms/PurchaseOrderForms.tsx:658 #~ msgid "Receive line items" #~ msgstr "Receive line items" -#: src/forms/PurchaseOrderForms.tsx:661 +#: src/forms/PurchaseOrderForms.tsx:662 +msgid "Store at default location" +msgstr "Использовать место хранения по умолчанию" + +#: src/forms/PurchaseOrderForms.tsx:677 +msgid "Store at line item destination " +msgstr "Использовать место хранения позиции заказа " + +#: src/forms/PurchaseOrderForms.tsx:689 +msgid "Store with already received stock" +msgstr "Использовать место хранения уже полученных запасов" + +#: src/forms/PurchaseOrderForms.tsx:713 #: src/pages/build/BuildDetail.tsx:340 #: src/pages/stock/StockDetail.tsx:280 #: src/pages/stock/StockDetail.tsx:952 #: src/tables/Filter.tsx:83 -#: src/tables/build/BuildAllocatedStockTable.tsx:128 +#: src/tables/build/BuildAllocatedStockTable.tsx:125 #: src/tables/build/BuildOutputTable.tsx:112 -#: src/tables/part/PartTestResultTable.tsx:260 -#: src/tables/part/PartTestResultTable.tsx:281 +#: src/tables/part/PartTestResultTable.tsx:268 +#: src/tables/part/PartTestResultTable.tsx:289 #: src/tables/sales/SalesOrderAllocationTable.tsx:149 msgid "Batch Code" msgstr "Код партии" -#: src/forms/PurchaseOrderForms.tsx:662 +#: src/forms/PurchaseOrderForms.tsx:714 msgid "Enter batch code for received items" msgstr "Введите код партии для полученных запасов" -#: src/forms/PurchaseOrderForms.tsx:675 +#: src/forms/PurchaseOrderForms.tsx:727 #: src/forms/StockForms.tsx:218 msgid "Serial Numbers" msgstr "Серийные номера" -#: src/forms/PurchaseOrderForms.tsx:676 +#: src/forms/PurchaseOrderForms.tsx:728 msgid "Enter serial numbers for received items" msgstr "Введите серийные номера для полученных запасов" -#: src/forms/PurchaseOrderForms.tsx:690 +#: src/forms/PurchaseOrderForms.tsx:742 #: src/pages/stock/StockDetail.tsx:382 #: src/tables/stock/StockItemTable.tsx:294 msgid "Expiry Date" msgstr "Срок годности" -#: src/forms/PurchaseOrderForms.tsx:691 +#: src/forms/PurchaseOrderForms.tsx:743 msgid "Enter an expiry date for received items" msgstr "Введите дату истечения срока годности полученных элементов" -#: src/forms/PurchaseOrderForms.tsx:703 +#: src/forms/PurchaseOrderForms.tsx:755 #: src/forms/StockForms.tsx:728 #: src/pages/company/SupplierPartDetail.tsx:172 #: src/pages/company/SupplierPartDetail.tsx:236 @@ -4701,19 +4708,19 @@ msgstr "Введите дату истечения срока годности msgid "Packaging" msgstr "Упаковка" -#: src/forms/PurchaseOrderForms.tsx:727 +#: src/forms/PurchaseOrderForms.tsx:779 #: src/pages/company/SupplierPartDetail.tsx:120 #: src/tables/ColumnRenderers.tsx:332 msgid "Note" msgstr "Заметка" -#: src/forms/PurchaseOrderForms.tsx:799 +#: src/forms/PurchaseOrderForms.tsx:851 #: src/pages/company/SupplierPartDetail.tsx:138 #: src/tables/purchasing/SupplierPriceBreakTable.tsx:49 msgid "SKU" msgstr "Артикул поставщика" -#: src/forms/PurchaseOrderForms.tsx:800 +#: src/forms/PurchaseOrderForms.tsx:852 #: src/tables/part/PartPurchaseOrdersTable.tsx:127 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:213 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:283 @@ -4721,11 +4728,11 @@ msgstr "Артикул поставщика" msgid "Received" msgstr "Получено" -#: src/forms/PurchaseOrderForms.tsx:817 +#: src/forms/PurchaseOrderForms.tsx:869 msgid "Receive Line Items" msgstr "Получить позиции" -#: src/forms/PurchaseOrderForms.tsx:823 +#: src/forms/PurchaseOrderForms.tsx:875 msgid "Items received" msgstr "Элементы получены" @@ -4737,7 +4744,7 @@ msgstr "Возврат позиций" msgid "Item received into stock" msgstr "Товар получен на складе" -#: src/forms/SalesOrderForms.tsx:401 +#: src/forms/SalesOrderForms.tsx:419 msgid "Leave blank to use the order address" msgstr "" @@ -5932,6 +5939,9 @@ msgstr "" #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:310 #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:401 +#: src/tables/build/BuildAllocatedStockTable.tsx:181 +#: src/tables/build/BuildLineTable.tsx:668 +#: src/tables/sales/SalesOrderAllocationTable.tsx:220 msgid "Confirm Removal" msgstr "" @@ -6870,8 +6880,8 @@ msgstr "Сторонний" #: src/pages/sales/ReturnOrderDetail.tsx:108 #: src/pages/sales/SalesOrderDetail.tsx:98 #: src/tables/ColumnRenderers.tsx:321 -#: src/tables/build/BuildAllocatedStockTable.tsx:115 -#: src/tables/build/BuildLineTable.tsx:352 +#: src/tables/build/BuildAllocatedStockTable.tsx:112 +#: src/tables/build/BuildLineTable.tsx:353 msgid "Reference" msgstr "Ссылка" @@ -7132,7 +7142,7 @@ msgstr "Отменить заказ" #: src/pages/build/BuildDetail.tsx:742 #: src/pages/stock/StockDetail.tsx:344 -#: src/tables/build/BuildAllocatedStockTable.tsx:85 +#: src/tables/build/BuildAllocatedStockTable.tsx:82 #: src/tables/part/PartBuildAllocationsTable.tsx:45 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:157 #: src/tables/stock/StockTrackingTable.tsx:109 @@ -7600,7 +7610,7 @@ msgstr "Ключевые слова" #: src/pages/part/PartDetail.tsx:542 #: src/tables/bom/BomTable.tsx:439 -#: src/tables/build/BuildLineTable.tsx:305 +#: src/tables/build/BuildLineTable.tsx:306 #: src/tables/part/PartTable.tsx:319 #: src/tables/sales/SalesOrderLineItemTable.tsx:138 msgid "Available Stock" @@ -7608,7 +7618,7 @@ msgstr "Доступно" #: src/pages/part/PartDetail.tsx:548 #: src/tables/bom/BomTable.tsx:341 -#: src/tables/build/BuildLineTable.tsx:267 +#: src/tables/build/BuildLineTable.tsx:268 #: src/tables/sales/SalesOrderLineItemTable.tsx:180 msgid "On order" msgstr "В заказе" @@ -7782,7 +7792,7 @@ msgstr "Закупить" #: src/pages/part/PartDetail.tsx:1144 #: src/pages/stock/StockDetail.tsx:884 -#: src/tables/build/BuildLineTable.tsx:761 +#: src/tables/build/BuildLineTable.tsx:768 msgid "Order Stock" msgstr "Закупить на склад" @@ -9219,13 +9229,13 @@ msgstr "" #~ msgstr "Show asssmbled items" #: src/tables/bom/BomTable.tsx:315 -#: src/tables/build/BuildLineTable.tsx:276 +#: src/tables/build/BuildLineTable.tsx:277 #: src/tables/part/PartTable.tsx:145 msgid "External stock" msgstr "Сторонний склад" #: src/tables/bom/BomTable.tsx:323 -#: src/tables/build/BuildLineTable.tsx:239 +#: src/tables/build/BuildLineTable.tsx:240 msgid "Includes substitute stock" msgstr "" @@ -9234,7 +9244,7 @@ msgstr "" #~ msgstr "Edit Bom Item" #: src/tables/bom/BomTable.tsx:332 -#: src/tables/build/BuildLineTable.tsx:249 +#: src/tables/build/BuildLineTable.tsx:250 #: src/tables/sales/SalesOrderLineItemTable.tsx:166 msgid "Includes variant stock" msgstr "" @@ -9272,8 +9282,8 @@ msgid "Stock Information" msgstr "Информация о складе" #: src/tables/bom/BomTable.tsx:399 -#: src/tables/build/BuildLineTable.tsx:496 -#: src/tables/build/BuildLineTable.tsx:537 +#: src/tables/build/BuildLineTable.tsx:497 +#: src/tables/build/BuildLineTable.tsx:538 msgid "Consumable item" msgstr "" @@ -9282,7 +9292,7 @@ msgid "No available stock" msgstr "Нет на складе" #: src/tables/bom/BomTable.tsx:420 -#: src/tables/build/BuildLineTable.tsx:213 +#: src/tables/build/BuildLineTable.tsx:214 msgid "Show testable items" msgstr "Показать тестируемые элементы" @@ -9291,7 +9301,7 @@ msgid "Show trackable items" msgstr "Показать отслеживаемые позиции" #: src/tables/bom/BomTable.tsx:430 -#: src/tables/build/BuildLineTable.tsx:208 +#: src/tables/build/BuildLineTable.tsx:209 msgid "Show assembled items" msgstr "Показать сборные детали" @@ -9335,7 +9345,7 @@ msgstr "Показать элементы, в которых разрешено #: src/tables/bom/BomTable.tsx:464 #: src/tables/bom/UsedInTable.tsx:85 -#: src/tables/build/BuildLineTable.tsx:202 +#: src/tables/build/BuildLineTable.tsx:203 msgid "Optional" msgstr "Необязательно" @@ -9345,7 +9355,7 @@ msgid "Show optional items" msgstr "Показать необязательные элементы" #: src/tables/bom/BomTable.tsx:469 -#: src/tables/build/BuildLineTable.tsx:197 +#: src/tables/build/BuildLineTable.tsx:198 msgid "Consumable" msgstr "Расходник" @@ -9433,7 +9443,7 @@ msgid "Bill of materials cannot be edited, as the part is locked" msgstr "Невозможно отредактировать спецификацию, поскольку деталь заблокирована" #: src/tables/bom/UsedInTable.tsx:34 -#: src/tables/build/BuildLineTable.tsx:207 +#: src/tables/build/BuildLineTable.tsx:208 #: src/tables/part/ParametricPartTable.tsx:364 #: src/tables/part/PartBuildAllocationsTable.tsx:60 #: src/tables/part/PartTable.tsx:209 @@ -9455,11 +9465,11 @@ msgstr "Отслеживаемая" msgid "Show trackable assemblies" msgstr "" -#: src/tables/build/BuildAllocatedStockTable.tsx:67 +#: src/tables/build/BuildAllocatedStockTable.tsx:64 msgid "Allocated to Output" msgstr "Зарезервировано" -#: src/tables/build/BuildAllocatedStockTable.tsx:68 +#: src/tables/build/BuildAllocatedStockTable.tsx:65 msgid "Show items allocated to a build output" msgstr "Показать позиции, зарезервированные для продукции" @@ -9472,7 +9482,7 @@ msgstr "Показать позиции, зарезервированные дл #~ msgid "Include orders for part variants" #~ msgstr "Include orders for part variants" -#: src/tables/build/BuildAllocatedStockTable.tsx:97 +#: src/tables/build/BuildAllocatedStockTable.tsx:94 #: src/tables/part/PartBuildAllocationsTable.tsx:84 #: src/tables/part/PartPurchaseOrdersTable.tsx:132 #: src/tables/part/PartSalesAllocationsTable.tsx:69 @@ -9482,40 +9492,58 @@ msgid "Order Status" msgstr "Статус заказа" #: src/tables/build/BuildAllocatedStockTable.tsx:164 -#~ msgid "Edit Build Item" -#~ msgstr "Edit Build Item" - -#: src/tables/build/BuildAllocatedStockTable.tsx:167 -#: src/tables/build/BuildLineTable.tsx:650 +#: src/tables/build/BuildLineTable.tsx:651 msgid "Edit Stock Allocation" msgstr "" +#: src/tables/build/BuildAllocatedStockTable.tsx:164 +#~ msgid "Edit Build Item" +#~ msgstr "Edit Build Item" + #: src/tables/build/BuildAllocatedStockTable.tsx:174 #~ msgid "Delete Build Item" #~ msgstr "Delete Build Item" -#: src/tables/build/BuildAllocatedStockTable.tsx:180 -#: src/tables/build/BuildLineTable.tsx:663 -msgid "Delete Stock Allocation" +#: src/tables/build/BuildAllocatedStockTable.tsx:177 +#: src/tables/build/BuildLineTable.tsx:664 +#: src/tables/sales/SalesOrderAllocationTable.tsx:218 +msgid "Remove Allocated Stock" msgstr "" -#: src/tables/build/BuildAllocatedStockTable.tsx:239 +#: src/tables/build/BuildAllocatedStockTable.tsx:180 +#: src/tables/build/BuildLineTable.tsx:663 +#~ msgid "Delete Stock Allocation" +#~ msgstr "Delete Stock Allocation" + +#: src/tables/build/BuildAllocatedStockTable.tsx:182 +#: src/tables/build/BuildLineTable.tsx:669 +#: src/tables/sales/SalesOrderAllocationTable.tsx:221 +msgid "Are you sure you want to remove this allocated stock from the order?" +msgstr "" + +#: src/tables/build/BuildAllocatedStockTable.tsx:242 msgid "Consume" msgstr "" +#: src/tables/build/BuildAllocatedStockTable.tsx:259 +#: src/tables/build/BuildLineTable.tsx:112 +#: src/tables/sales/SalesOrderAllocationTable.tsx:248 +msgid "Remove allocated stock" +msgstr "" + #: src/tables/build/BuildLineTable.tsx:59 #~ msgid "Show lines with available stock" #~ msgstr "Show lines with available stock" -#: src/tables/build/BuildLineTable.tsx:120 +#: src/tables/build/BuildLineTable.tsx:121 msgid "View Stock Item" msgstr "Показать складскую позицию" -#: src/tables/build/BuildLineTable.tsx:183 +#: src/tables/build/BuildLineTable.tsx:184 msgid "Show fully allocated lines" msgstr "" -#: src/tables/build/BuildLineTable.tsx:188 +#: src/tables/build/BuildLineTable.tsx:189 msgid "Show fully consumed lines" msgstr "" @@ -9523,124 +9551,124 @@ msgstr "" #~ msgid "Show allocated lines" #~ msgstr "Show allocated lines" -#: src/tables/build/BuildLineTable.tsx:193 +#: src/tables/build/BuildLineTable.tsx:194 msgid "Show items with sufficient available stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:198 +#: src/tables/build/BuildLineTable.tsx:199 msgid "Show consumable lines" msgstr "" -#: src/tables/build/BuildLineTable.tsx:203 +#: src/tables/build/BuildLineTable.tsx:204 msgid "Show optional lines" msgstr "" -#: src/tables/build/BuildLineTable.tsx:212 +#: src/tables/build/BuildLineTable.tsx:213 #: src/tables/part/PartTable.tsx:233 msgid "Testable" msgstr "Тестируемая" -#: src/tables/build/BuildLineTable.tsx:217 +#: src/tables/build/BuildLineTable.tsx:218 #: src/tables/stock/StockItemTable.tsx:388 msgid "Tracked" msgstr "" -#: src/tables/build/BuildLineTable.tsx:218 +#: src/tables/build/BuildLineTable.tsx:219 msgid "Show tracked lines" msgstr "" -#: src/tables/build/BuildLineTable.tsx:223 +#: src/tables/build/BuildLineTable.tsx:224 msgid "Show items with stock on order" msgstr "" -#: src/tables/build/BuildLineTable.tsx:258 +#: src/tables/build/BuildLineTable.tsx:259 #: src/tables/sales/SalesOrderLineItemTable.tsx:172 msgid "In production" msgstr "" -#: src/tables/build/BuildLineTable.tsx:286 +#: src/tables/build/BuildLineTable.tsx:287 msgid "Insufficient stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:302 +#: src/tables/build/BuildLineTable.tsx:303 #: src/tables/sales/SalesOrderLineItemTable.tsx:160 #: src/tables/stock/StockItemTable.tsx:191 msgid "No stock available" msgstr "Нет на складе" -#: src/tables/build/BuildLineTable.tsx:375 +#: src/tables/build/BuildLineTable.tsx:376 msgid "Gets Inherited" msgstr "" -#: src/tables/build/BuildLineTable.tsx:388 +#: src/tables/build/BuildLineTable.tsx:389 msgid "Unit Quantity" msgstr "" -#: src/tables/build/BuildLineTable.tsx:415 +#: src/tables/build/BuildLineTable.tsx:416 msgid "Setup Quantity" msgstr "" -#: src/tables/build/BuildLineTable.tsx:424 +#: src/tables/build/BuildLineTable.tsx:425 msgid "Attrition" msgstr "" -#: src/tables/build/BuildLineTable.tsx:432 +#: src/tables/build/BuildLineTable.tsx:433 msgid "Rounding Multiple" msgstr "" -#: src/tables/build/BuildLineTable.tsx:441 +#: src/tables/build/BuildLineTable.tsx:442 msgid "BOM Information" msgstr "" -#: src/tables/build/BuildLineTable.tsx:515 +#: src/tables/build/BuildLineTable.tsx:516 #: src/tables/part/PartBuildAllocationsTable.tsx:102 msgid "Fully allocated" msgstr "" -#: src/tables/build/BuildLineTable.tsx:563 +#: src/tables/build/BuildLineTable.tsx:564 #: src/tables/sales/SalesOrderLineItemTable.tsx:311 msgid "Create Build Order" msgstr "Создать заказ на сборку" -#: src/tables/build/BuildLineTable.tsx:592 +#: src/tables/build/BuildLineTable.tsx:593 msgid "Auto allocation in progress" msgstr "Выполняется автоматическое распределение" -#: src/tables/build/BuildLineTable.tsx:595 -#: src/tables/build/BuildLineTable.tsx:802 +#: src/tables/build/BuildLineTable.tsx:596 +#: src/tables/build/BuildLineTable.tsx:809 msgid "Auto Allocate Stock" msgstr "Автоматическое резервирование остатков" -#: src/tables/build/BuildLineTable.tsx:596 +#: src/tables/build/BuildLineTable.tsx:597 msgid "Automatically allocate stock to this build according to the selected options" msgstr "Автоматически выделять запасы на эту сборку в соответствии с выбранными параметрами" -#: src/tables/build/BuildLineTable.tsx:616 -#: src/tables/build/BuildLineTable.tsx:630 -#: src/tables/build/BuildLineTable.tsx:751 -#: src/tables/build/BuildLineTable.tsx:852 +#: src/tables/build/BuildLineTable.tsx:617 +#: src/tables/build/BuildLineTable.tsx:631 +#: src/tables/build/BuildLineTable.tsx:758 +#: src/tables/build/BuildLineTable.tsx:859 #: src/tables/build/BuildOutputTable.tsx:355 #: src/tables/build/BuildOutputTable.tsx:360 msgid "Deallocate Stock" msgstr "Отменить резервирование остатков" -#: src/tables/build/BuildLineTable.tsx:632 +#: src/tables/build/BuildLineTable.tsx:633 msgid "Deallocate all untracked stock for this build order" msgstr "Начислить все неотслеживаемые запасы для этого заказа на сборку" -#: src/tables/build/BuildLineTable.tsx:634 +#: src/tables/build/BuildLineTable.tsx:635 msgid "Deallocate stock from the selected line item" msgstr "Отменить резервирование остатков для выбранной позиции" -#: src/tables/build/BuildLineTable.tsx:638 +#: src/tables/build/BuildLineTable.tsx:639 msgid "Stock has been deallocated" msgstr "Склад был распродан" -#: src/tables/build/BuildLineTable.tsx:771 +#: src/tables/build/BuildLineTable.tsx:778 msgid "Build Stock" msgstr "Собрать" -#: src/tables/build/BuildLineTable.tsx:784 +#: src/tables/build/BuildLineTable.tsx:791 #: src/tables/sales/SalesOrderLineItemTable.tsx:487 msgid "View Part" msgstr "Показать деталь" @@ -9739,7 +9767,7 @@ msgid "Serialize Build Output" msgstr "" #: src/tables/build/BuildOutputTable.tsx:405 -#: src/tables/part/PartTestResultTable.tsx:310 +#: src/tables/part/PartTestResultTable.tsx:318 #: src/tables/stock/StockItemTable.tsx:328 msgid "Filter by stock status" msgstr "Фильтр по статусу склада" @@ -9964,8 +9992,8 @@ msgid "View Item" msgstr "Показать элемент" #: src/tables/general/ExtraLineItemTable.tsx:95 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:299 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:403 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:300 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:405 #: src/tables/sales/ReturnOrderLineItemTable.tsx:83 #: src/tables/sales/ReturnOrderLineItemTable.tsx:187 #: src/tables/sales/SalesOrderLineItemTable.tsx:252 @@ -9974,14 +10002,14 @@ msgid "Add Line Item" msgstr "Создать позицию" #: src/tables/general/ExtraLineItemTable.tsx:108 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:320 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:322 #: src/tables/sales/ReturnOrderLineItemTable.tsx:96 #: src/tables/sales/SalesOrderLineItemTable.tsx:271 msgid "Edit Line Item" msgstr "Редактировать позицию" #: src/tables/general/ExtraLineItemTable.tsx:117 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:329 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:331 #: src/tables/sales/ReturnOrderLineItemTable.tsx:105 #: src/tables/sales/SalesOrderLineItemTable.tsx:280 msgid "Delete Line Item" @@ -10273,7 +10301,7 @@ msgid "Required Stock" msgstr "Требуемый запас" #: src/tables/part/PartBuildAllocationsTable.tsx:124 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:381 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:383 msgid "View Build Order" msgstr "Показать заказ на сборку" @@ -10617,8 +10645,8 @@ msgstr "" #: src/tables/part/PartTestResultTable.tsx:103 #: src/tables/part/PartTestResultTable.tsx:181 -#: src/tables/part/PartTestResultTable.tsx:320 -#: src/tables/part/PartTestResultTable.tsx:334 +#: src/tables/part/PartTestResultTable.tsx:328 +#: src/tables/part/PartTestResultTable.tsx:342 #: src/tables/stock/StockItemTestResultTable.tsx:296 #: src/tables/stock/StockItemTestResultTable.tsx:368 #: src/tables/stock/StockItemTestResultTable.tsx:429 @@ -10643,7 +10671,7 @@ msgstr "" msgid "No Result" msgstr "Нет результатов" -#: src/tables/part/PartTestResultTable.tsx:298 +#: src/tables/part/PartTestResultTable.tsx:306 msgid "Show build outputs currently in production" msgstr "" @@ -11073,7 +11101,7 @@ msgid "Show manufacturer parts for active manufacturers." msgstr "" #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:115 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:397 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:399 msgid "Import Line Items" msgstr "Импортировать позиции" @@ -11099,11 +11127,11 @@ msgstr "Показать полученные позиции" #~ msgid "Add line item" #~ msgstr "Add line item" -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:350 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:352 msgid "Receive line item" msgstr "Получить позицию" -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:414 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:416 msgid "Receive items" msgstr "Получить позиции" @@ -11201,25 +11229,25 @@ msgid "Not shipped" msgstr "" #: src/tables/sales/SalesOrderAllocationTable.tsx:211 -#: src/tables/sales/SalesOrderAllocationTable.tsx:229 +#: src/tables/sales/SalesOrderAllocationTable.tsx:235 msgid "Edit Allocation" msgstr "Редактировать резервирование" #: src/tables/sales/SalesOrderAllocationTable.tsx:218 #: src/tables/sales/SalesOrderAllocationTable.tsx:241 -msgid "Delete Allocation" -msgstr "Отменить резервирование" +#~ msgid "Delete Allocation" +#~ msgstr "Delete Allocation" -#: src/tables/sales/SalesOrderAllocationTable.tsx:252 -#: src/tables/sales/SalesOrderAllocationTable.tsx:253 +#: src/tables/sales/SalesOrderAllocationTable.tsx:261 +#: src/tables/sales/SalesOrderAllocationTable.tsx:262 msgid "View Shipment" msgstr "Показать доставку" -#: src/tables/sales/SalesOrderAllocationTable.tsx:308 +#: src/tables/sales/SalesOrderAllocationTable.tsx:317 msgid "Assign to Shipment" msgstr "Назначить на доставку" -#: src/tables/sales/SalesOrderAllocationTable.tsx:324 +#: src/tables/sales/SalesOrderAllocationTable.tsx:333 msgid "Assign to shipment" msgstr "Назначить на доставку" diff --git a/src/frontend/src/locales/sk/messages.po b/src/frontend/src/locales/sk/messages.po index b379efc864..0bf5090e7d 100644 --- a/src/frontend/src/locales/sk/messages.po +++ b/src/frontend/src/locales/sk/messages.po @@ -8,7 +8,7 @@ msgstr "" "Language: sk\n" "Project-Id-Version: inventree\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2025-11-19 19:39\n" +"PO-Revision-Date: 2025-11-22 06:25\n" "Last-Translator: \n" "Language-Team: Slovak\n" "Plural-Forms: nplurals=4; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 3;\n" @@ -56,7 +56,7 @@ msgstr "" #: lib/components/RowActions.tsx:136 #: src/components/nav/NavigationDrawer.tsx:190 -#: src/forms/PurchaseOrderForms.tsx:802 +#: src/forms/PurchaseOrderForms.tsx:854 #: src/forms/StockForms.tsx:796 #: src/forms/StockForms.tsx:843 #: src/forms/StockForms.tsx:889 @@ -103,9 +103,9 @@ msgstr "" #: src/forms/BuildForms.tsx:630 #: src/forms/BuildForms.tsx:793 #: src/forms/BuildForms.tsx:896 -#: src/forms/PurchaseOrderForms.tsx:798 +#: src/forms/PurchaseOrderForms.tsx:850 #: src/forms/ReturnOrderForms.tsx:242 -#: src/forms/SalesOrderForms.tsx:305 +#: src/forms/SalesOrderForms.tsx:323 #: src/forms/StockForms.tsx:360 #: src/forms/StockForms.tsx:791 #: src/forms/StockForms.tsx:838 @@ -119,6 +119,7 @@ msgstr "" #: src/pages/build/BuildDetail.tsx:200 #: src/pages/part/PartDetail.tsx:1207 #: src/tables/ColumnRenderers.tsx:91 +#: src/tables/part/PartTestResultTable.tsx:247 #: src/tables/part/RelatedPartTable.tsx:53 #: src/tables/stock/StockTrackingTable.tsx:87 msgid "Part" @@ -158,7 +159,7 @@ msgstr "" #: src/components/wizards/OrderPartsWizard.tsx:290 #: src/pages/company/SupplierPartDetail.tsx:413 #: src/pages/stock/StockDetail.tsx:289 -#: src/tables/build/BuildAllocatedStockTable.tsx:155 +#: src/tables/build/BuildAllocatedStockTable.tsx:152 #: src/tables/part/PartPurchaseOrdersTable.tsx:50 #: src/tables/purchasing/SupplierPartTable.tsx:83 #: src/tables/stock/StockItemTable.tsx:247 @@ -201,9 +202,9 @@ msgstr "" #: src/forms/BuildForms.tsx:473 #: src/forms/BuildForms.tsx:633 #: src/forms/BuildForms.tsx:794 -#: src/forms/SalesOrderForms.tsx:307 +#: src/forms/SalesOrderForms.tsx:325 #: src/pages/stock/StockDetail.tsx:1005 -#: src/tables/part/PartTestResultTable.tsx:248 +#: src/tables/part/PartTestResultTable.tsx:256 #: src/tables/stock/StockTrackingTable.tsx:48 #: src/tables/stock/StockTrackingTable.tsx:55 msgid "Stock Item" @@ -517,7 +518,7 @@ msgstr "" #: src/components/dashboard/DashboardLayout.tsx:281 #: src/components/editors/NotesEditor.tsx:74 #: src/components/editors/TemplateEditor/TemplateEditor.tsx:158 -#: src/components/forms/fields/ApiFormField.tsx:273 +#: src/components/forms/fields/ApiFormField.tsx:237 #: src/components/forms/fields/TableField.tsx:45 #: src/components/importer/ImportDataSelector.tsx:192 #: src/components/importer/ImporterColumnSelector.tsx:234 @@ -642,8 +643,8 @@ msgstr "" #: src/components/barcodes/BarcodeScanDialog.tsx:49 #: src/components/buttons/ScanButton.tsx:15 #: src/components/nav/NavigationDrawer.tsx:122 -#: src/forms/PurchaseOrderForms.tsx:457 -#: src/forms/PurchaseOrderForms.tsx:563 +#: src/forms/PurchaseOrderForms.tsx:509 +#: src/forms/PurchaseOrderForms.tsx:615 msgid "Scan Barcode" msgstr "" @@ -728,7 +729,7 @@ msgstr "" #: src/components/barcodes/QRCode.tsx:205 #: src/components/items/ActionDropdown.tsx:192 -#: src/forms/PurchaseOrderForms.tsx:554 +#: src/forms/PurchaseOrderForms.tsx:606 msgid "Unlink Barcode" msgstr "" @@ -1216,6 +1217,12 @@ msgstr "" #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:884 #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:903 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:254 +#: src/tables/build/BuildAllocatedStockTable.tsx:178 +#: src/tables/build/BuildAllocatedStockTable.tsx:258 +#: src/tables/build/BuildLineTable.tsx:111 +#: src/tables/build/BuildLineTable.tsx:665 +#: src/tables/sales/SalesOrderAllocationTable.tsx:224 +#: src/tables/sales/SalesOrderAllocationTable.tsx:247 msgid "Remove" msgstr "" @@ -1241,7 +1248,7 @@ msgid "Upload Error" msgstr "" #: src/components/details/DetailsImage.tsx:250 -#: src/components/forms/fields/TextField.tsx:65 +#: src/components/forms/fields/AutoFillRightSection.tsx:34 msgid "Clear" msgstr "" @@ -1817,10 +1824,14 @@ msgstr "" msgid "Running" msgstr "" -#: src/components/forms/fields/ApiFormField.tsx:233 +#: src/components/forms/fields/ApiFormField.tsx:197 msgid "Select file to upload" msgstr "" +#: src/components/forms/fields/AutoFillRightSection.tsx:47 +msgid "Accept suggested value" +msgstr "" + #: src/components/forms/fields/DateField.tsx:76 msgid "Select date" msgstr "" @@ -1875,10 +1886,6 @@ msgstr "" msgid "Add new row" msgstr "" -#: src/components/forms/fields/TextField.tsx:82 -msgid "Accept suggested value" -msgstr "" - #: src/components/images/DetailsImage.tsx:252 #~ msgid "Select image" #~ msgstr "Select image" @@ -2225,8 +2232,8 @@ msgstr "" #: src/pages/part/PartDetail.tsx:994 #: src/pages/stock/StockDetail.tsx:265 #: src/pages/stock/StockDetail.tsx:942 -#: src/tables/build/BuildAllocatedStockTable.tsx:135 -#: src/tables/build/BuildLineTable.tsx:192 +#: src/tables/build/BuildAllocatedStockTable.tsx:132 +#: src/tables/build/BuildLineTable.tsx:193 #: src/tables/part/PartTable.tsx:137 #: src/tables/stock/StockItemTable.tsx:182 #: src/tables/stock/StockItemTable.tsx:343 @@ -2784,7 +2791,7 @@ msgstr "" #: src/pages/sales/SalesOrderDetail.tsx:119 #: src/pages/stock/LocationDetail.tsx:102 #: src/tables/ColumnRenderers.tsx:278 -#: src/tables/build/BuildAllocatedStockTable.tsx:91 +#: src/tables/build/BuildAllocatedStockTable.tsx:88 #: src/tables/machine/MachineTypeTable.tsx:161 #: src/tables/machine/MachineTypeTable.tsx:257 #: src/tables/plugin/PluginListTable.tsx:110 @@ -2966,7 +2973,7 @@ msgstr "" #: src/pages/company/SupplierPartDetail.tsx:394 #: src/pages/part/PartDetail.tsx:1015 #: src/tables/bom/BomTable.tsx:444 -#: src/tables/build/BuildLineTable.tsx:222 +#: src/tables/build/BuildLineTable.tsx:223 #: src/tables/part/PartTable.tsx:108 msgid "On Order" msgstr "" @@ -2976,7 +2983,7 @@ msgstr "" #: src/pages/part/PartDetail.tsx:587 #: src/pages/part/PartDetail.tsx:1021 #: src/pages/stock/StockDetail.tsx:925 -#: src/tables/part/PartTestResultTable.tsx:297 +#: src/tables/part/PartTestResultTable.tsx:305 #: src/tables/stock/StockItemTable.tsx:359 msgid "In Production" msgstr "" @@ -3000,7 +3007,7 @@ msgstr "" #: src/components/render/Stock.tsx:114 #: src/components/render/Stock.tsx:132 #: src/forms/BuildForms.tsx:795 -#: src/forms/PurchaseOrderForms.tsx:595 +#: src/forms/PurchaseOrderForms.tsx:647 #: src/forms/StockForms.tsx:792 #: src/forms/StockForms.tsx:839 #: src/forms/StockForms.tsx:885 @@ -3023,7 +3030,7 @@ msgstr "" #: src/components/render/Stock.tsx:99 #: src/pages/stock/StockDetail.tsx:198 #: src/pages/stock/StockDetail.tsx:930 -#: src/tables/build/BuildAllocatedStockTable.tsx:121 +#: src/tables/build/BuildAllocatedStockTable.tsx:118 #: src/tables/build/BuildOutputTable.tsx:107 #: src/tables/sales/SalesOrderAllocationTable.tsx:142 msgid "Serial Number" @@ -3034,9 +3041,9 @@ msgstr "" #: src/forms/BuildForms.tsx:240 #: src/forms/BuildForms.tsx:634 #: src/forms/BuildForms.tsx:797 -#: src/forms/PurchaseOrderForms.tsx:801 +#: src/forms/PurchaseOrderForms.tsx:853 #: src/forms/ReturnOrderForms.tsx:243 -#: src/forms/SalesOrderForms.tsx:308 +#: src/forms/SalesOrderForms.tsx:326 #: src/forms/StockForms.tsx:841 #: src/pages/part/PartStockHistoryDetail.tsx:56 #: src/pages/part/PartStockHistoryDetail.tsx:210 @@ -3046,9 +3053,9 @@ msgstr "" #: src/pages/part/pricing/PriceBreakPanel.tsx:172 #: src/pages/stock/StockDetail.tsx:258 #: src/pages/stock/StockDetail.tsx:936 -#: src/tables/build/BuildLineTable.tsx:86 +#: src/tables/build/BuildLineTable.tsx:83 #: src/tables/part/PartPurchaseOrdersTable.tsx:94 -#: src/tables/part/PartTestResultTable.tsx:269 +#: src/tables/part/PartTestResultTable.tsx:277 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:175 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:206 #: src/tables/purchasing/SupplierPriceBreakTable.tsx:69 @@ -3070,7 +3077,7 @@ msgstr "" #: src/forms/StockForms.tsx:1048 #: src/forms/StockForms.tsx:1096 #: src/forms/StockForms.tsx:1140 -#: src/tables/build/BuildLineTable.tsx:96 +#: src/tables/build/BuildLineTable.tsx:93 msgid "Batch" msgstr "" @@ -3755,7 +3762,7 @@ msgid "In Stock" msgstr "" #: src/components/wizards/OrderPartsWizard.tsx:146 -#: src/tables/build/BuildLineTable.tsx:404 +#: src/tables/build/BuildLineTable.tsx:405 msgid "Required Quantity" msgstr "" @@ -3847,7 +3854,7 @@ msgid "Please correct the errors in the selected parts" msgstr "" #: src/components/wizards/OrderPartsWizard.tsx:587 -#: src/tables/build/BuildLineTable.tsx:815 +#: src/tables/build/BuildLineTable.tsx:822 #: src/tables/part/PartTable.tsx:522 #: src/tables/sales/SalesOrderLineItemTable.tsx:370 msgid "Order Parts" @@ -4349,9 +4356,9 @@ msgstr "" #: src/forms/BuildForms.tsx:333 #: src/forms/BuildForms.tsx:408 #: src/forms/BuildForms.tsx:685 -#: src/tables/build/BuildAllocatedStockTable.tsx:150 +#: src/tables/build/BuildAllocatedStockTable.tsx:147 #: src/tables/build/BuildOutputTable.tsx:582 -#: src/tables/part/PartTestResultTable.tsx:272 +#: src/tables/part/PartTestResultTable.tsx:280 msgid "Build Output" msgstr "" @@ -4362,7 +4369,7 @@ msgstr "" #: src/forms/BuildForms.tsx:336 #: src/forms/BuildForms.tsx:411 #: src/forms/BuildForms.tsx:475 -#: src/forms/PurchaseOrderForms.tsx:717 +#: src/forms/PurchaseOrderForms.tsx:769 #: src/forms/ReturnOrderForms.tsx:197 #: src/forms/ReturnOrderForms.tsx:244 #: src/forms/StockForms.tsx:712 @@ -4377,7 +4384,7 @@ msgstr "" #: src/tables/build/BuildOutputTable.tsx:404 #: src/tables/machine/MachineListTable.tsx:387 #: src/tables/part/PartPurchaseOrdersTable.tsx:38 -#: src/tables/part/PartTestResultTable.tsx:309 +#: src/tables/part/PartTestResultTable.tsx:317 #: src/tables/sales/ReturnOrderLineItemTable.tsx:138 #: src/tables/sales/ReturnOrderLineItemTable.tsx:176 #: src/tables/settings/CustomStateTable.tsx:79 @@ -4450,8 +4457,8 @@ msgstr "" #: src/pages/stock/StockDetail.tsx:153 #: src/tables/bom/BomTable.tsx:134 #: src/tables/bom/UsedInTable.tsx:40 -#: src/tables/build/BuildAllocatedStockTable.tsx:108 -#: src/tables/build/BuildLineTable.tsx:336 +#: src/tables/build/BuildAllocatedStockTable.tsx:105 +#: src/tables/build/BuildLineTable.tsx:337 #: src/tables/build/BuildOrderTable.tsx:79 #: src/tables/part/PartSalesAllocationsTable.tsx:61 #: src/tables/part/RelatedPartTable.tsx:73 @@ -4466,47 +4473,47 @@ msgstr "" #: src/forms/BuildForms.tsx:632 #: src/forms/BuildForms.tsx:796 #: src/forms/BuildForms.tsx:897 -#: src/forms/SalesOrderForms.tsx:306 -#: src/tables/build/BuildAllocatedStockTable.tsx:139 -#: src/tables/build/BuildLineTable.tsx:182 +#: src/forms/SalesOrderForms.tsx:324 +#: src/tables/build/BuildAllocatedStockTable.tsx:136 +#: src/tables/build/BuildLineTable.tsx:183 #: src/tables/sales/SalesOrderLineItemTable.tsx:342 #: src/tables/stock/StockItemTable.tsx:338 msgid "Allocated" msgstr "" #: src/forms/BuildForms.tsx:667 -#: src/forms/SalesOrderForms.tsx:295 +#: src/forms/SalesOrderForms.tsx:313 #: src/pages/build/BuildDetail.tsx:108 #: src/pages/build/BuildDetail.tsx:326 msgid "Source Location" msgstr "" #: src/forms/BuildForms.tsx:668 -#: src/forms/SalesOrderForms.tsx:296 +#: src/forms/SalesOrderForms.tsx:314 msgid "Select the source location for the stock allocation" msgstr "" #: src/forms/BuildForms.tsx:700 -#: src/forms/SalesOrderForms.tsx:336 -#: src/tables/build/BuildLineTable.tsx:574 -#: src/tables/build/BuildLineTable.tsx:731 -#: src/tables/build/BuildLineTable.tsx:830 +#: src/forms/SalesOrderForms.tsx:354 +#: src/tables/build/BuildLineTable.tsx:575 +#: src/tables/build/BuildLineTable.tsx:738 +#: src/tables/build/BuildLineTable.tsx:837 #: src/tables/sales/SalesOrderLineItemTable.tsx:380 #: src/tables/sales/SalesOrderLineItemTable.tsx:406 msgid "Allocate Stock" msgstr "" #: src/forms/BuildForms.tsx:703 -#: src/forms/SalesOrderForms.tsx:341 +#: src/forms/SalesOrderForms.tsx:359 msgid "Stock items allocated" msgstr "" #: src/forms/BuildForms.tsx:816 #: src/forms/BuildForms.tsx:917 -#: src/tables/build/BuildAllocatedStockTable.tsx:240 -#: src/tables/build/BuildAllocatedStockTable.tsx:272 -#: src/tables/build/BuildLineTable.tsx:741 -#: src/tables/build/BuildLineTable.tsx:864 +#: src/tables/build/BuildAllocatedStockTable.tsx:243 +#: src/tables/build/BuildAllocatedStockTable.tsx:279 +#: src/tables/build/BuildLineTable.tsx:748 +#: src/tables/build/BuildLineTable.tsx:871 msgid "Consume Stock" msgstr "" @@ -4521,21 +4528,21 @@ msgstr "" #~ msgstr "Stock items consumed" #: src/forms/BuildForms.tsx:853 -#: src/tables/build/BuildLineTable.tsx:514 +#: src/tables/build/BuildLineTable.tsx:515 #: src/tables/part/PartBuildAllocationsTable.tsx:101 msgid "Fully consumed" msgstr "" #: src/forms/BuildForms.tsx:898 -#: src/tables/build/BuildLineTable.tsx:187 +#: src/tables/build/BuildLineTable.tsx:188 #: src/tables/stock/StockItemTable.tsx:367 msgid "Consumed" msgstr "" #: src/forms/CommonForms.tsx:88 -#: src/forms/PurchaseOrderForms.tsx:125 +#: src/forms/PurchaseOrderForms.tsx:176 #: src/forms/ReturnOrderForms.tsx:138 -#: src/forms/SalesOrderForms.tsx:164 +#: src/forms/SalesOrderForms.tsx:182 msgid "Select project code for this line item" msgstr "" @@ -4572,32 +4579,16 @@ msgstr "" msgid "Subscribe to notifications for this category" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:388 -msgid "Assign Batch Code and Serial Numbers" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:390 -msgid "Assign Batch Code" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:410 -msgid "Choose Location" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:418 -msgid "Item Destination selected" -msgstr "" - #: src/forms/PurchaseOrderForms.tsx:421 #~ msgid "Assign Batch Code{0}" #~ msgstr "Assign Batch Code{0}" -#: src/forms/PurchaseOrderForms.tsx:428 -msgid "Part category default location selected" +#: src/forms/PurchaseOrderForms.tsx:440 +msgid "Assign Batch Code and Serial Numbers" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:438 -msgid "Received stock location selected" +#: src/forms/PurchaseOrderForms.tsx:442 +msgid "Assign Batch Code" msgstr "" #: src/forms/PurchaseOrderForms.tsx:444 @@ -4605,94 +4596,110 @@ msgstr "" #~ msgid "Remove item from list" #~ msgstr "Remove item from list" -#: src/forms/PurchaseOrderForms.tsx:446 +#: src/forms/PurchaseOrderForms.tsx:462 +msgid "Choose Location" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:470 +msgid "Item Destination selected" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:480 +msgid "Part category default location selected" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:490 +msgid "Received stock location selected" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:498 msgid "Default location selected" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:507 +#: src/forms/PurchaseOrderForms.tsx:559 msgid "Set Location" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:524 -msgid "Set Expiry Date" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:532 -#: src/forms/StockForms.tsx:693 -msgid "Adjust Packaging" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:540 -#: src/forms/StockForms.tsx:684 -#: src/hooks/UseStockAdjustActions.tsx:148 -msgid "Change Status" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:546 -msgid "Add Note" -msgstr "" - #: src/forms/PurchaseOrderForms.tsx:566 #~ msgid "Serial numbers" #~ msgstr "Serial numbers" +#: src/forms/PurchaseOrderForms.tsx:576 +msgid "Set Expiry Date" +msgstr "" + #: src/forms/PurchaseOrderForms.tsx:582 #~ msgid "Store at line item destination" #~ msgstr "Store at line item destination" -#: src/forms/PurchaseOrderForms.tsx:610 -msgid "Store at default location" +#: src/forms/PurchaseOrderForms.tsx:584 +#: src/forms/StockForms.tsx:693 +msgid "Adjust Packaging" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:625 -msgid "Store at line item destination " +#: src/forms/PurchaseOrderForms.tsx:592 +#: src/forms/StockForms.tsx:684 +#: src/hooks/UseStockAdjustActions.tsx:148 +msgid "Change Status" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:637 -msgid "Store with already received stock" +#: src/forms/PurchaseOrderForms.tsx:598 +msgid "Add Note" msgstr "" #: src/forms/PurchaseOrderForms.tsx:658 #~ msgid "Receive line items" #~ msgstr "Receive line items" -#: src/forms/PurchaseOrderForms.tsx:661 +#: src/forms/PurchaseOrderForms.tsx:662 +msgid "Store at default location" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:677 +msgid "Store at line item destination " +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:689 +msgid "Store with already received stock" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:713 #: src/pages/build/BuildDetail.tsx:340 #: src/pages/stock/StockDetail.tsx:280 #: src/pages/stock/StockDetail.tsx:952 #: src/tables/Filter.tsx:83 -#: src/tables/build/BuildAllocatedStockTable.tsx:128 +#: src/tables/build/BuildAllocatedStockTable.tsx:125 #: src/tables/build/BuildOutputTable.tsx:112 -#: src/tables/part/PartTestResultTable.tsx:260 -#: src/tables/part/PartTestResultTable.tsx:281 +#: src/tables/part/PartTestResultTable.tsx:268 +#: src/tables/part/PartTestResultTable.tsx:289 #: src/tables/sales/SalesOrderAllocationTable.tsx:149 msgid "Batch Code" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:662 +#: src/forms/PurchaseOrderForms.tsx:714 msgid "Enter batch code for received items" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:675 +#: src/forms/PurchaseOrderForms.tsx:727 #: src/forms/StockForms.tsx:218 msgid "Serial Numbers" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:676 +#: src/forms/PurchaseOrderForms.tsx:728 msgid "Enter serial numbers for received items" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:690 +#: src/forms/PurchaseOrderForms.tsx:742 #: src/pages/stock/StockDetail.tsx:382 #: src/tables/stock/StockItemTable.tsx:294 msgid "Expiry Date" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:691 +#: src/forms/PurchaseOrderForms.tsx:743 msgid "Enter an expiry date for received items" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:703 +#: src/forms/PurchaseOrderForms.tsx:755 #: src/forms/StockForms.tsx:728 #: src/pages/company/SupplierPartDetail.tsx:172 #: src/pages/company/SupplierPartDetail.tsx:236 @@ -4701,19 +4708,19 @@ msgstr "" msgid "Packaging" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:727 +#: src/forms/PurchaseOrderForms.tsx:779 #: src/pages/company/SupplierPartDetail.tsx:120 #: src/tables/ColumnRenderers.tsx:332 msgid "Note" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:799 +#: src/forms/PurchaseOrderForms.tsx:851 #: src/pages/company/SupplierPartDetail.tsx:138 #: src/tables/purchasing/SupplierPriceBreakTable.tsx:49 msgid "SKU" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:800 +#: src/forms/PurchaseOrderForms.tsx:852 #: src/tables/part/PartPurchaseOrdersTable.tsx:127 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:213 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:283 @@ -4721,11 +4728,11 @@ msgstr "" msgid "Received" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:817 +#: src/forms/PurchaseOrderForms.tsx:869 msgid "Receive Line Items" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:823 +#: src/forms/PurchaseOrderForms.tsx:875 msgid "Items received" msgstr "" @@ -4737,7 +4744,7 @@ msgstr "" msgid "Item received into stock" msgstr "" -#: src/forms/SalesOrderForms.tsx:401 +#: src/forms/SalesOrderForms.tsx:419 msgid "Leave blank to use the order address" msgstr "" @@ -5932,6 +5939,9 @@ msgstr "" #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:310 #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:401 +#: src/tables/build/BuildAllocatedStockTable.tsx:181 +#: src/tables/build/BuildLineTable.tsx:668 +#: src/tables/sales/SalesOrderAllocationTable.tsx:220 msgid "Confirm Removal" msgstr "" @@ -6870,8 +6880,8 @@ msgstr "" #: src/pages/sales/ReturnOrderDetail.tsx:108 #: src/pages/sales/SalesOrderDetail.tsx:98 #: src/tables/ColumnRenderers.tsx:321 -#: src/tables/build/BuildAllocatedStockTable.tsx:115 -#: src/tables/build/BuildLineTable.tsx:352 +#: src/tables/build/BuildAllocatedStockTable.tsx:112 +#: src/tables/build/BuildLineTable.tsx:353 msgid "Reference" msgstr "" @@ -7132,7 +7142,7 @@ msgstr "" #: src/pages/build/BuildDetail.tsx:742 #: src/pages/stock/StockDetail.tsx:344 -#: src/tables/build/BuildAllocatedStockTable.tsx:85 +#: src/tables/build/BuildAllocatedStockTable.tsx:82 #: src/tables/part/PartBuildAllocationsTable.tsx:45 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:157 #: src/tables/stock/StockTrackingTable.tsx:109 @@ -7600,7 +7610,7 @@ msgstr "" #: src/pages/part/PartDetail.tsx:542 #: src/tables/bom/BomTable.tsx:439 -#: src/tables/build/BuildLineTable.tsx:305 +#: src/tables/build/BuildLineTable.tsx:306 #: src/tables/part/PartTable.tsx:319 #: src/tables/sales/SalesOrderLineItemTable.tsx:138 msgid "Available Stock" @@ -7608,7 +7618,7 @@ msgstr "" #: src/pages/part/PartDetail.tsx:548 #: src/tables/bom/BomTable.tsx:341 -#: src/tables/build/BuildLineTable.tsx:267 +#: src/tables/build/BuildLineTable.tsx:268 #: src/tables/sales/SalesOrderLineItemTable.tsx:180 msgid "On order" msgstr "" @@ -7782,7 +7792,7 @@ msgstr "" #: src/pages/part/PartDetail.tsx:1144 #: src/pages/stock/StockDetail.tsx:884 -#: src/tables/build/BuildLineTable.tsx:761 +#: src/tables/build/BuildLineTable.tsx:768 msgid "Order Stock" msgstr "" @@ -9219,13 +9229,13 @@ msgstr "" #~ msgstr "Show asssmbled items" #: src/tables/bom/BomTable.tsx:315 -#: src/tables/build/BuildLineTable.tsx:276 +#: src/tables/build/BuildLineTable.tsx:277 #: src/tables/part/PartTable.tsx:145 msgid "External stock" msgstr "" #: src/tables/bom/BomTable.tsx:323 -#: src/tables/build/BuildLineTable.tsx:239 +#: src/tables/build/BuildLineTable.tsx:240 msgid "Includes substitute stock" msgstr "" @@ -9234,7 +9244,7 @@ msgstr "" #~ msgstr "Edit Bom Item" #: src/tables/bom/BomTable.tsx:332 -#: src/tables/build/BuildLineTable.tsx:249 +#: src/tables/build/BuildLineTable.tsx:250 #: src/tables/sales/SalesOrderLineItemTable.tsx:166 msgid "Includes variant stock" msgstr "" @@ -9272,8 +9282,8 @@ msgid "Stock Information" msgstr "" #: src/tables/bom/BomTable.tsx:399 -#: src/tables/build/BuildLineTable.tsx:496 -#: src/tables/build/BuildLineTable.tsx:537 +#: src/tables/build/BuildLineTable.tsx:497 +#: src/tables/build/BuildLineTable.tsx:538 msgid "Consumable item" msgstr "" @@ -9282,7 +9292,7 @@ msgid "No available stock" msgstr "" #: src/tables/bom/BomTable.tsx:420 -#: src/tables/build/BuildLineTable.tsx:213 +#: src/tables/build/BuildLineTable.tsx:214 msgid "Show testable items" msgstr "" @@ -9291,7 +9301,7 @@ msgid "Show trackable items" msgstr "" #: src/tables/bom/BomTable.tsx:430 -#: src/tables/build/BuildLineTable.tsx:208 +#: src/tables/build/BuildLineTable.tsx:209 msgid "Show assembled items" msgstr "" @@ -9335,7 +9345,7 @@ msgstr "" #: src/tables/bom/BomTable.tsx:464 #: src/tables/bom/UsedInTable.tsx:85 -#: src/tables/build/BuildLineTable.tsx:202 +#: src/tables/build/BuildLineTable.tsx:203 msgid "Optional" msgstr "" @@ -9345,7 +9355,7 @@ msgid "Show optional items" msgstr "" #: src/tables/bom/BomTable.tsx:469 -#: src/tables/build/BuildLineTable.tsx:197 +#: src/tables/build/BuildLineTable.tsx:198 msgid "Consumable" msgstr "" @@ -9433,7 +9443,7 @@ msgid "Bill of materials cannot be edited, as the part is locked" msgstr "" #: src/tables/bom/UsedInTable.tsx:34 -#: src/tables/build/BuildLineTable.tsx:207 +#: src/tables/build/BuildLineTable.tsx:208 #: src/tables/part/ParametricPartTable.tsx:364 #: src/tables/part/PartBuildAllocationsTable.tsx:60 #: src/tables/part/PartTable.tsx:209 @@ -9455,11 +9465,11 @@ msgstr "" msgid "Show trackable assemblies" msgstr "" -#: src/tables/build/BuildAllocatedStockTable.tsx:67 +#: src/tables/build/BuildAllocatedStockTable.tsx:64 msgid "Allocated to Output" msgstr "" -#: src/tables/build/BuildAllocatedStockTable.tsx:68 +#: src/tables/build/BuildAllocatedStockTable.tsx:65 msgid "Show items allocated to a build output" msgstr "" @@ -9472,7 +9482,7 @@ msgstr "" #~ msgid "Include orders for part variants" #~ msgstr "Include orders for part variants" -#: src/tables/build/BuildAllocatedStockTable.tsx:97 +#: src/tables/build/BuildAllocatedStockTable.tsx:94 #: src/tables/part/PartBuildAllocationsTable.tsx:84 #: src/tables/part/PartPurchaseOrdersTable.tsx:132 #: src/tables/part/PartSalesAllocationsTable.tsx:69 @@ -9482,40 +9492,58 @@ msgid "Order Status" msgstr "" #: src/tables/build/BuildAllocatedStockTable.tsx:164 -#~ msgid "Edit Build Item" -#~ msgstr "Edit Build Item" - -#: src/tables/build/BuildAllocatedStockTable.tsx:167 -#: src/tables/build/BuildLineTable.tsx:650 +#: src/tables/build/BuildLineTable.tsx:651 msgid "Edit Stock Allocation" msgstr "" +#: src/tables/build/BuildAllocatedStockTable.tsx:164 +#~ msgid "Edit Build Item" +#~ msgstr "Edit Build Item" + #: src/tables/build/BuildAllocatedStockTable.tsx:174 #~ msgid "Delete Build Item" #~ msgstr "Delete Build Item" -#: src/tables/build/BuildAllocatedStockTable.tsx:180 -#: src/tables/build/BuildLineTable.tsx:663 -msgid "Delete Stock Allocation" +#: src/tables/build/BuildAllocatedStockTable.tsx:177 +#: src/tables/build/BuildLineTable.tsx:664 +#: src/tables/sales/SalesOrderAllocationTable.tsx:218 +msgid "Remove Allocated Stock" msgstr "" -#: src/tables/build/BuildAllocatedStockTable.tsx:239 +#: src/tables/build/BuildAllocatedStockTable.tsx:180 +#: src/tables/build/BuildLineTable.tsx:663 +#~ msgid "Delete Stock Allocation" +#~ msgstr "Delete Stock Allocation" + +#: src/tables/build/BuildAllocatedStockTable.tsx:182 +#: src/tables/build/BuildLineTable.tsx:669 +#: src/tables/sales/SalesOrderAllocationTable.tsx:221 +msgid "Are you sure you want to remove this allocated stock from the order?" +msgstr "" + +#: src/tables/build/BuildAllocatedStockTable.tsx:242 msgid "Consume" msgstr "" +#: src/tables/build/BuildAllocatedStockTable.tsx:259 +#: src/tables/build/BuildLineTable.tsx:112 +#: src/tables/sales/SalesOrderAllocationTable.tsx:248 +msgid "Remove allocated stock" +msgstr "" + #: src/tables/build/BuildLineTable.tsx:59 #~ msgid "Show lines with available stock" #~ msgstr "Show lines with available stock" -#: src/tables/build/BuildLineTable.tsx:120 +#: src/tables/build/BuildLineTable.tsx:121 msgid "View Stock Item" msgstr "" -#: src/tables/build/BuildLineTable.tsx:183 +#: src/tables/build/BuildLineTable.tsx:184 msgid "Show fully allocated lines" msgstr "" -#: src/tables/build/BuildLineTable.tsx:188 +#: src/tables/build/BuildLineTable.tsx:189 msgid "Show fully consumed lines" msgstr "" @@ -9523,124 +9551,124 @@ msgstr "" #~ msgid "Show allocated lines" #~ msgstr "Show allocated lines" -#: src/tables/build/BuildLineTable.tsx:193 +#: src/tables/build/BuildLineTable.tsx:194 msgid "Show items with sufficient available stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:198 +#: src/tables/build/BuildLineTable.tsx:199 msgid "Show consumable lines" msgstr "" -#: src/tables/build/BuildLineTable.tsx:203 +#: src/tables/build/BuildLineTable.tsx:204 msgid "Show optional lines" msgstr "" -#: src/tables/build/BuildLineTable.tsx:212 +#: src/tables/build/BuildLineTable.tsx:213 #: src/tables/part/PartTable.tsx:233 msgid "Testable" msgstr "" -#: src/tables/build/BuildLineTable.tsx:217 +#: src/tables/build/BuildLineTable.tsx:218 #: src/tables/stock/StockItemTable.tsx:388 msgid "Tracked" msgstr "" -#: src/tables/build/BuildLineTable.tsx:218 +#: src/tables/build/BuildLineTable.tsx:219 msgid "Show tracked lines" msgstr "" -#: src/tables/build/BuildLineTable.tsx:223 +#: src/tables/build/BuildLineTable.tsx:224 msgid "Show items with stock on order" msgstr "" -#: src/tables/build/BuildLineTable.tsx:258 +#: src/tables/build/BuildLineTable.tsx:259 #: src/tables/sales/SalesOrderLineItemTable.tsx:172 msgid "In production" msgstr "" -#: src/tables/build/BuildLineTable.tsx:286 +#: src/tables/build/BuildLineTable.tsx:287 msgid "Insufficient stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:302 +#: src/tables/build/BuildLineTable.tsx:303 #: src/tables/sales/SalesOrderLineItemTable.tsx:160 #: src/tables/stock/StockItemTable.tsx:191 msgid "No stock available" msgstr "" -#: src/tables/build/BuildLineTable.tsx:375 +#: src/tables/build/BuildLineTable.tsx:376 msgid "Gets Inherited" msgstr "" -#: src/tables/build/BuildLineTable.tsx:388 +#: src/tables/build/BuildLineTable.tsx:389 msgid "Unit Quantity" msgstr "" -#: src/tables/build/BuildLineTable.tsx:415 +#: src/tables/build/BuildLineTable.tsx:416 msgid "Setup Quantity" msgstr "" -#: src/tables/build/BuildLineTable.tsx:424 +#: src/tables/build/BuildLineTable.tsx:425 msgid "Attrition" msgstr "" -#: src/tables/build/BuildLineTable.tsx:432 +#: src/tables/build/BuildLineTable.tsx:433 msgid "Rounding Multiple" msgstr "" -#: src/tables/build/BuildLineTable.tsx:441 +#: src/tables/build/BuildLineTable.tsx:442 msgid "BOM Information" msgstr "" -#: src/tables/build/BuildLineTable.tsx:515 +#: src/tables/build/BuildLineTable.tsx:516 #: src/tables/part/PartBuildAllocationsTable.tsx:102 msgid "Fully allocated" msgstr "" -#: src/tables/build/BuildLineTable.tsx:563 +#: src/tables/build/BuildLineTable.tsx:564 #: src/tables/sales/SalesOrderLineItemTable.tsx:311 msgid "Create Build Order" msgstr "" -#: src/tables/build/BuildLineTable.tsx:592 +#: src/tables/build/BuildLineTable.tsx:593 msgid "Auto allocation in progress" msgstr "" -#: src/tables/build/BuildLineTable.tsx:595 -#: src/tables/build/BuildLineTable.tsx:802 +#: src/tables/build/BuildLineTable.tsx:596 +#: src/tables/build/BuildLineTable.tsx:809 msgid "Auto Allocate Stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:596 +#: src/tables/build/BuildLineTable.tsx:597 msgid "Automatically allocate stock to this build according to the selected options" msgstr "" -#: src/tables/build/BuildLineTable.tsx:616 -#: src/tables/build/BuildLineTable.tsx:630 -#: src/tables/build/BuildLineTable.tsx:751 -#: src/tables/build/BuildLineTable.tsx:852 +#: src/tables/build/BuildLineTable.tsx:617 +#: src/tables/build/BuildLineTable.tsx:631 +#: src/tables/build/BuildLineTable.tsx:758 +#: src/tables/build/BuildLineTable.tsx:859 #: src/tables/build/BuildOutputTable.tsx:355 #: src/tables/build/BuildOutputTable.tsx:360 msgid "Deallocate Stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:632 +#: src/tables/build/BuildLineTable.tsx:633 msgid "Deallocate all untracked stock for this build order" msgstr "" -#: src/tables/build/BuildLineTable.tsx:634 +#: src/tables/build/BuildLineTable.tsx:635 msgid "Deallocate stock from the selected line item" msgstr "" -#: src/tables/build/BuildLineTable.tsx:638 +#: src/tables/build/BuildLineTable.tsx:639 msgid "Stock has been deallocated" msgstr "" -#: src/tables/build/BuildLineTable.tsx:771 +#: src/tables/build/BuildLineTable.tsx:778 msgid "Build Stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:784 +#: src/tables/build/BuildLineTable.tsx:791 #: src/tables/sales/SalesOrderLineItemTable.tsx:487 msgid "View Part" msgstr "" @@ -9739,7 +9767,7 @@ msgid "Serialize Build Output" msgstr "" #: src/tables/build/BuildOutputTable.tsx:405 -#: src/tables/part/PartTestResultTable.tsx:310 +#: src/tables/part/PartTestResultTable.tsx:318 #: src/tables/stock/StockItemTable.tsx:328 msgid "Filter by stock status" msgstr "" @@ -9964,8 +9992,8 @@ msgid "View Item" msgstr "" #: src/tables/general/ExtraLineItemTable.tsx:95 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:299 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:403 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:300 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:405 #: src/tables/sales/ReturnOrderLineItemTable.tsx:83 #: src/tables/sales/ReturnOrderLineItemTable.tsx:187 #: src/tables/sales/SalesOrderLineItemTable.tsx:252 @@ -9974,14 +10002,14 @@ msgid "Add Line Item" msgstr "" #: src/tables/general/ExtraLineItemTable.tsx:108 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:320 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:322 #: src/tables/sales/ReturnOrderLineItemTable.tsx:96 #: src/tables/sales/SalesOrderLineItemTable.tsx:271 msgid "Edit Line Item" msgstr "" #: src/tables/general/ExtraLineItemTable.tsx:117 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:329 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:331 #: src/tables/sales/ReturnOrderLineItemTable.tsx:105 #: src/tables/sales/SalesOrderLineItemTable.tsx:280 msgid "Delete Line Item" @@ -10273,7 +10301,7 @@ msgid "Required Stock" msgstr "" #: src/tables/part/PartBuildAllocationsTable.tsx:124 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:381 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:383 msgid "View Build Order" msgstr "" @@ -10617,8 +10645,8 @@ msgstr "" #: src/tables/part/PartTestResultTable.tsx:103 #: src/tables/part/PartTestResultTable.tsx:181 -#: src/tables/part/PartTestResultTable.tsx:320 -#: src/tables/part/PartTestResultTable.tsx:334 +#: src/tables/part/PartTestResultTable.tsx:328 +#: src/tables/part/PartTestResultTable.tsx:342 #: src/tables/stock/StockItemTestResultTable.tsx:296 #: src/tables/stock/StockItemTestResultTable.tsx:368 #: src/tables/stock/StockItemTestResultTable.tsx:429 @@ -10643,7 +10671,7 @@ msgstr "" msgid "No Result" msgstr "" -#: src/tables/part/PartTestResultTable.tsx:298 +#: src/tables/part/PartTestResultTable.tsx:306 msgid "Show build outputs currently in production" msgstr "" @@ -11073,7 +11101,7 @@ msgid "Show manufacturer parts for active manufacturers." msgstr "" #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:115 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:397 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:399 msgid "Import Line Items" msgstr "" @@ -11099,11 +11127,11 @@ msgstr "" #~ msgid "Add line item" #~ msgstr "Add line item" -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:350 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:352 msgid "Receive line item" msgstr "" -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:414 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:416 msgid "Receive items" msgstr "" @@ -11201,25 +11229,25 @@ msgid "Not shipped" msgstr "" #: src/tables/sales/SalesOrderAllocationTable.tsx:211 -#: src/tables/sales/SalesOrderAllocationTable.tsx:229 +#: src/tables/sales/SalesOrderAllocationTable.tsx:235 msgid "Edit Allocation" msgstr "" #: src/tables/sales/SalesOrderAllocationTable.tsx:218 #: src/tables/sales/SalesOrderAllocationTable.tsx:241 -msgid "Delete Allocation" -msgstr "" +#~ msgid "Delete Allocation" +#~ msgstr "Delete Allocation" -#: src/tables/sales/SalesOrderAllocationTable.tsx:252 -#: src/tables/sales/SalesOrderAllocationTable.tsx:253 +#: src/tables/sales/SalesOrderAllocationTable.tsx:261 +#: src/tables/sales/SalesOrderAllocationTable.tsx:262 msgid "View Shipment" msgstr "" -#: src/tables/sales/SalesOrderAllocationTable.tsx:308 +#: src/tables/sales/SalesOrderAllocationTable.tsx:317 msgid "Assign to Shipment" msgstr "" -#: src/tables/sales/SalesOrderAllocationTable.tsx:324 +#: src/tables/sales/SalesOrderAllocationTable.tsx:333 msgid "Assign to shipment" msgstr "" diff --git a/src/frontend/src/locales/sl/messages.po b/src/frontend/src/locales/sl/messages.po index f9100c1bf8..d840e2b89f 100644 --- a/src/frontend/src/locales/sl/messages.po +++ b/src/frontend/src/locales/sl/messages.po @@ -8,7 +8,7 @@ msgstr "" "Language: sl\n" "Project-Id-Version: inventree\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2025-11-19 19:39\n" +"PO-Revision-Date: 2025-11-22 06:25\n" "Last-Translator: \n" "Language-Team: Slovenian\n" "Plural-Forms: nplurals=4; plural=n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3;\n" @@ -56,7 +56,7 @@ msgstr "" #: lib/components/RowActions.tsx:136 #: src/components/nav/NavigationDrawer.tsx:190 -#: src/forms/PurchaseOrderForms.tsx:802 +#: src/forms/PurchaseOrderForms.tsx:854 #: src/forms/StockForms.tsx:796 #: src/forms/StockForms.tsx:843 #: src/forms/StockForms.tsx:889 @@ -103,9 +103,9 @@ msgstr "" #: src/forms/BuildForms.tsx:630 #: src/forms/BuildForms.tsx:793 #: src/forms/BuildForms.tsx:896 -#: src/forms/PurchaseOrderForms.tsx:798 +#: src/forms/PurchaseOrderForms.tsx:850 #: src/forms/ReturnOrderForms.tsx:242 -#: src/forms/SalesOrderForms.tsx:305 +#: src/forms/SalesOrderForms.tsx:323 #: src/forms/StockForms.tsx:360 #: src/forms/StockForms.tsx:791 #: src/forms/StockForms.tsx:838 @@ -119,6 +119,7 @@ msgstr "" #: src/pages/build/BuildDetail.tsx:200 #: src/pages/part/PartDetail.tsx:1207 #: src/tables/ColumnRenderers.tsx:91 +#: src/tables/part/PartTestResultTable.tsx:247 #: src/tables/part/RelatedPartTable.tsx:53 #: src/tables/stock/StockTrackingTable.tsx:87 msgid "Part" @@ -158,7 +159,7 @@ msgstr "" #: src/components/wizards/OrderPartsWizard.tsx:290 #: src/pages/company/SupplierPartDetail.tsx:413 #: src/pages/stock/StockDetail.tsx:289 -#: src/tables/build/BuildAllocatedStockTable.tsx:155 +#: src/tables/build/BuildAllocatedStockTable.tsx:152 #: src/tables/part/PartPurchaseOrdersTable.tsx:50 #: src/tables/purchasing/SupplierPartTable.tsx:83 #: src/tables/stock/StockItemTable.tsx:247 @@ -201,9 +202,9 @@ msgstr "" #: src/forms/BuildForms.tsx:473 #: src/forms/BuildForms.tsx:633 #: src/forms/BuildForms.tsx:794 -#: src/forms/SalesOrderForms.tsx:307 +#: src/forms/SalesOrderForms.tsx:325 #: src/pages/stock/StockDetail.tsx:1005 -#: src/tables/part/PartTestResultTable.tsx:248 +#: src/tables/part/PartTestResultTable.tsx:256 #: src/tables/stock/StockTrackingTable.tsx:48 #: src/tables/stock/StockTrackingTable.tsx:55 msgid "Stock Item" @@ -517,7 +518,7 @@ msgstr "" #: src/components/dashboard/DashboardLayout.tsx:281 #: src/components/editors/NotesEditor.tsx:74 #: src/components/editors/TemplateEditor/TemplateEditor.tsx:158 -#: src/components/forms/fields/ApiFormField.tsx:273 +#: src/components/forms/fields/ApiFormField.tsx:237 #: src/components/forms/fields/TableField.tsx:45 #: src/components/importer/ImportDataSelector.tsx:192 #: src/components/importer/ImporterColumnSelector.tsx:234 @@ -642,8 +643,8 @@ msgstr "" #: src/components/barcodes/BarcodeScanDialog.tsx:49 #: src/components/buttons/ScanButton.tsx:15 #: src/components/nav/NavigationDrawer.tsx:122 -#: src/forms/PurchaseOrderForms.tsx:457 -#: src/forms/PurchaseOrderForms.tsx:563 +#: src/forms/PurchaseOrderForms.tsx:509 +#: src/forms/PurchaseOrderForms.tsx:615 msgid "Scan Barcode" msgstr "" @@ -728,7 +729,7 @@ msgstr "" #: src/components/barcodes/QRCode.tsx:205 #: src/components/items/ActionDropdown.tsx:192 -#: src/forms/PurchaseOrderForms.tsx:554 +#: src/forms/PurchaseOrderForms.tsx:606 msgid "Unlink Barcode" msgstr "" @@ -1216,6 +1217,12 @@ msgstr "" #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:884 #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:903 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:254 +#: src/tables/build/BuildAllocatedStockTable.tsx:178 +#: src/tables/build/BuildAllocatedStockTable.tsx:258 +#: src/tables/build/BuildLineTable.tsx:111 +#: src/tables/build/BuildLineTable.tsx:665 +#: src/tables/sales/SalesOrderAllocationTable.tsx:224 +#: src/tables/sales/SalesOrderAllocationTable.tsx:247 msgid "Remove" msgstr "" @@ -1241,7 +1248,7 @@ msgid "Upload Error" msgstr "" #: src/components/details/DetailsImage.tsx:250 -#: src/components/forms/fields/TextField.tsx:65 +#: src/components/forms/fields/AutoFillRightSection.tsx:34 msgid "Clear" msgstr "" @@ -1817,10 +1824,14 @@ msgstr "" msgid "Running" msgstr "" -#: src/components/forms/fields/ApiFormField.tsx:233 +#: src/components/forms/fields/ApiFormField.tsx:197 msgid "Select file to upload" msgstr "" +#: src/components/forms/fields/AutoFillRightSection.tsx:47 +msgid "Accept suggested value" +msgstr "" + #: src/components/forms/fields/DateField.tsx:76 msgid "Select date" msgstr "" @@ -1875,10 +1886,6 @@ msgstr "" msgid "Add new row" msgstr "" -#: src/components/forms/fields/TextField.tsx:82 -msgid "Accept suggested value" -msgstr "" - #: src/components/images/DetailsImage.tsx:252 #~ msgid "Select image" #~ msgstr "Select image" @@ -2225,8 +2232,8 @@ msgstr "" #: src/pages/part/PartDetail.tsx:994 #: src/pages/stock/StockDetail.tsx:265 #: src/pages/stock/StockDetail.tsx:942 -#: src/tables/build/BuildAllocatedStockTable.tsx:135 -#: src/tables/build/BuildLineTable.tsx:192 +#: src/tables/build/BuildAllocatedStockTable.tsx:132 +#: src/tables/build/BuildLineTable.tsx:193 #: src/tables/part/PartTable.tsx:137 #: src/tables/stock/StockItemTable.tsx:182 #: src/tables/stock/StockItemTable.tsx:343 @@ -2784,7 +2791,7 @@ msgstr "" #: src/pages/sales/SalesOrderDetail.tsx:119 #: src/pages/stock/LocationDetail.tsx:102 #: src/tables/ColumnRenderers.tsx:278 -#: src/tables/build/BuildAllocatedStockTable.tsx:91 +#: src/tables/build/BuildAllocatedStockTable.tsx:88 #: src/tables/machine/MachineTypeTable.tsx:161 #: src/tables/machine/MachineTypeTable.tsx:257 #: src/tables/plugin/PluginListTable.tsx:110 @@ -2966,7 +2973,7 @@ msgstr "" #: src/pages/company/SupplierPartDetail.tsx:394 #: src/pages/part/PartDetail.tsx:1015 #: src/tables/bom/BomTable.tsx:444 -#: src/tables/build/BuildLineTable.tsx:222 +#: src/tables/build/BuildLineTable.tsx:223 #: src/tables/part/PartTable.tsx:108 msgid "On Order" msgstr "" @@ -2976,7 +2983,7 @@ msgstr "" #: src/pages/part/PartDetail.tsx:587 #: src/pages/part/PartDetail.tsx:1021 #: src/pages/stock/StockDetail.tsx:925 -#: src/tables/part/PartTestResultTable.tsx:297 +#: src/tables/part/PartTestResultTable.tsx:305 #: src/tables/stock/StockItemTable.tsx:359 msgid "In Production" msgstr "" @@ -3000,7 +3007,7 @@ msgstr "" #: src/components/render/Stock.tsx:114 #: src/components/render/Stock.tsx:132 #: src/forms/BuildForms.tsx:795 -#: src/forms/PurchaseOrderForms.tsx:595 +#: src/forms/PurchaseOrderForms.tsx:647 #: src/forms/StockForms.tsx:792 #: src/forms/StockForms.tsx:839 #: src/forms/StockForms.tsx:885 @@ -3023,7 +3030,7 @@ msgstr "" #: src/components/render/Stock.tsx:99 #: src/pages/stock/StockDetail.tsx:198 #: src/pages/stock/StockDetail.tsx:930 -#: src/tables/build/BuildAllocatedStockTable.tsx:121 +#: src/tables/build/BuildAllocatedStockTable.tsx:118 #: src/tables/build/BuildOutputTable.tsx:107 #: src/tables/sales/SalesOrderAllocationTable.tsx:142 msgid "Serial Number" @@ -3034,9 +3041,9 @@ msgstr "" #: src/forms/BuildForms.tsx:240 #: src/forms/BuildForms.tsx:634 #: src/forms/BuildForms.tsx:797 -#: src/forms/PurchaseOrderForms.tsx:801 +#: src/forms/PurchaseOrderForms.tsx:853 #: src/forms/ReturnOrderForms.tsx:243 -#: src/forms/SalesOrderForms.tsx:308 +#: src/forms/SalesOrderForms.tsx:326 #: src/forms/StockForms.tsx:841 #: src/pages/part/PartStockHistoryDetail.tsx:56 #: src/pages/part/PartStockHistoryDetail.tsx:210 @@ -3046,9 +3053,9 @@ msgstr "" #: src/pages/part/pricing/PriceBreakPanel.tsx:172 #: src/pages/stock/StockDetail.tsx:258 #: src/pages/stock/StockDetail.tsx:936 -#: src/tables/build/BuildLineTable.tsx:86 +#: src/tables/build/BuildLineTable.tsx:83 #: src/tables/part/PartPurchaseOrdersTable.tsx:94 -#: src/tables/part/PartTestResultTable.tsx:269 +#: src/tables/part/PartTestResultTable.tsx:277 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:175 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:206 #: src/tables/purchasing/SupplierPriceBreakTable.tsx:69 @@ -3070,7 +3077,7 @@ msgstr "" #: src/forms/StockForms.tsx:1048 #: src/forms/StockForms.tsx:1096 #: src/forms/StockForms.tsx:1140 -#: src/tables/build/BuildLineTable.tsx:96 +#: src/tables/build/BuildLineTable.tsx:93 msgid "Batch" msgstr "" @@ -3755,7 +3762,7 @@ msgid "In Stock" msgstr "" #: src/components/wizards/OrderPartsWizard.tsx:146 -#: src/tables/build/BuildLineTable.tsx:404 +#: src/tables/build/BuildLineTable.tsx:405 msgid "Required Quantity" msgstr "" @@ -3847,7 +3854,7 @@ msgid "Please correct the errors in the selected parts" msgstr "" #: src/components/wizards/OrderPartsWizard.tsx:587 -#: src/tables/build/BuildLineTable.tsx:815 +#: src/tables/build/BuildLineTable.tsx:822 #: src/tables/part/PartTable.tsx:522 #: src/tables/sales/SalesOrderLineItemTable.tsx:370 msgid "Order Parts" @@ -4349,9 +4356,9 @@ msgstr "" #: src/forms/BuildForms.tsx:333 #: src/forms/BuildForms.tsx:408 #: src/forms/BuildForms.tsx:685 -#: src/tables/build/BuildAllocatedStockTable.tsx:150 +#: src/tables/build/BuildAllocatedStockTable.tsx:147 #: src/tables/build/BuildOutputTable.tsx:582 -#: src/tables/part/PartTestResultTable.tsx:272 +#: src/tables/part/PartTestResultTable.tsx:280 msgid "Build Output" msgstr "" @@ -4362,7 +4369,7 @@ msgstr "" #: src/forms/BuildForms.tsx:336 #: src/forms/BuildForms.tsx:411 #: src/forms/BuildForms.tsx:475 -#: src/forms/PurchaseOrderForms.tsx:717 +#: src/forms/PurchaseOrderForms.tsx:769 #: src/forms/ReturnOrderForms.tsx:197 #: src/forms/ReturnOrderForms.tsx:244 #: src/forms/StockForms.tsx:712 @@ -4377,7 +4384,7 @@ msgstr "" #: src/tables/build/BuildOutputTable.tsx:404 #: src/tables/machine/MachineListTable.tsx:387 #: src/tables/part/PartPurchaseOrdersTable.tsx:38 -#: src/tables/part/PartTestResultTable.tsx:309 +#: src/tables/part/PartTestResultTable.tsx:317 #: src/tables/sales/ReturnOrderLineItemTable.tsx:138 #: src/tables/sales/ReturnOrderLineItemTable.tsx:176 #: src/tables/settings/CustomStateTable.tsx:79 @@ -4450,8 +4457,8 @@ msgstr "" #: src/pages/stock/StockDetail.tsx:153 #: src/tables/bom/BomTable.tsx:134 #: src/tables/bom/UsedInTable.tsx:40 -#: src/tables/build/BuildAllocatedStockTable.tsx:108 -#: src/tables/build/BuildLineTable.tsx:336 +#: src/tables/build/BuildAllocatedStockTable.tsx:105 +#: src/tables/build/BuildLineTable.tsx:337 #: src/tables/build/BuildOrderTable.tsx:79 #: src/tables/part/PartSalesAllocationsTable.tsx:61 #: src/tables/part/RelatedPartTable.tsx:73 @@ -4466,47 +4473,47 @@ msgstr "" #: src/forms/BuildForms.tsx:632 #: src/forms/BuildForms.tsx:796 #: src/forms/BuildForms.tsx:897 -#: src/forms/SalesOrderForms.tsx:306 -#: src/tables/build/BuildAllocatedStockTable.tsx:139 -#: src/tables/build/BuildLineTable.tsx:182 +#: src/forms/SalesOrderForms.tsx:324 +#: src/tables/build/BuildAllocatedStockTable.tsx:136 +#: src/tables/build/BuildLineTable.tsx:183 #: src/tables/sales/SalesOrderLineItemTable.tsx:342 #: src/tables/stock/StockItemTable.tsx:338 msgid "Allocated" msgstr "" #: src/forms/BuildForms.tsx:667 -#: src/forms/SalesOrderForms.tsx:295 +#: src/forms/SalesOrderForms.tsx:313 #: src/pages/build/BuildDetail.tsx:108 #: src/pages/build/BuildDetail.tsx:326 msgid "Source Location" msgstr "" #: src/forms/BuildForms.tsx:668 -#: src/forms/SalesOrderForms.tsx:296 +#: src/forms/SalesOrderForms.tsx:314 msgid "Select the source location for the stock allocation" msgstr "" #: src/forms/BuildForms.tsx:700 -#: src/forms/SalesOrderForms.tsx:336 -#: src/tables/build/BuildLineTable.tsx:574 -#: src/tables/build/BuildLineTable.tsx:731 -#: src/tables/build/BuildLineTable.tsx:830 +#: src/forms/SalesOrderForms.tsx:354 +#: src/tables/build/BuildLineTable.tsx:575 +#: src/tables/build/BuildLineTable.tsx:738 +#: src/tables/build/BuildLineTable.tsx:837 #: src/tables/sales/SalesOrderLineItemTable.tsx:380 #: src/tables/sales/SalesOrderLineItemTable.tsx:406 msgid "Allocate Stock" msgstr "" #: src/forms/BuildForms.tsx:703 -#: src/forms/SalesOrderForms.tsx:341 +#: src/forms/SalesOrderForms.tsx:359 msgid "Stock items allocated" msgstr "" #: src/forms/BuildForms.tsx:816 #: src/forms/BuildForms.tsx:917 -#: src/tables/build/BuildAllocatedStockTable.tsx:240 -#: src/tables/build/BuildAllocatedStockTable.tsx:272 -#: src/tables/build/BuildLineTable.tsx:741 -#: src/tables/build/BuildLineTable.tsx:864 +#: src/tables/build/BuildAllocatedStockTable.tsx:243 +#: src/tables/build/BuildAllocatedStockTable.tsx:279 +#: src/tables/build/BuildLineTable.tsx:748 +#: src/tables/build/BuildLineTable.tsx:871 msgid "Consume Stock" msgstr "" @@ -4521,21 +4528,21 @@ msgstr "" #~ msgstr "Stock items consumed" #: src/forms/BuildForms.tsx:853 -#: src/tables/build/BuildLineTable.tsx:514 +#: src/tables/build/BuildLineTable.tsx:515 #: src/tables/part/PartBuildAllocationsTable.tsx:101 msgid "Fully consumed" msgstr "" #: src/forms/BuildForms.tsx:898 -#: src/tables/build/BuildLineTable.tsx:187 +#: src/tables/build/BuildLineTable.tsx:188 #: src/tables/stock/StockItemTable.tsx:367 msgid "Consumed" msgstr "" #: src/forms/CommonForms.tsx:88 -#: src/forms/PurchaseOrderForms.tsx:125 +#: src/forms/PurchaseOrderForms.tsx:176 #: src/forms/ReturnOrderForms.tsx:138 -#: src/forms/SalesOrderForms.tsx:164 +#: src/forms/SalesOrderForms.tsx:182 msgid "Select project code for this line item" msgstr "" @@ -4572,32 +4579,16 @@ msgstr "" msgid "Subscribe to notifications for this category" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:388 -msgid "Assign Batch Code and Serial Numbers" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:390 -msgid "Assign Batch Code" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:410 -msgid "Choose Location" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:418 -msgid "Item Destination selected" -msgstr "" - #: src/forms/PurchaseOrderForms.tsx:421 #~ msgid "Assign Batch Code{0}" #~ msgstr "Assign Batch Code{0}" -#: src/forms/PurchaseOrderForms.tsx:428 -msgid "Part category default location selected" +#: src/forms/PurchaseOrderForms.tsx:440 +msgid "Assign Batch Code and Serial Numbers" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:438 -msgid "Received stock location selected" +#: src/forms/PurchaseOrderForms.tsx:442 +msgid "Assign Batch Code" msgstr "" #: src/forms/PurchaseOrderForms.tsx:444 @@ -4605,94 +4596,110 @@ msgstr "" #~ msgid "Remove item from list" #~ msgstr "Remove item from list" -#: src/forms/PurchaseOrderForms.tsx:446 +#: src/forms/PurchaseOrderForms.tsx:462 +msgid "Choose Location" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:470 +msgid "Item Destination selected" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:480 +msgid "Part category default location selected" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:490 +msgid "Received stock location selected" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:498 msgid "Default location selected" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:507 +#: src/forms/PurchaseOrderForms.tsx:559 msgid "Set Location" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:524 -msgid "Set Expiry Date" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:532 -#: src/forms/StockForms.tsx:693 -msgid "Adjust Packaging" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:540 -#: src/forms/StockForms.tsx:684 -#: src/hooks/UseStockAdjustActions.tsx:148 -msgid "Change Status" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:546 -msgid "Add Note" -msgstr "" - #: src/forms/PurchaseOrderForms.tsx:566 #~ msgid "Serial numbers" #~ msgstr "Serial numbers" +#: src/forms/PurchaseOrderForms.tsx:576 +msgid "Set Expiry Date" +msgstr "" + #: src/forms/PurchaseOrderForms.tsx:582 #~ msgid "Store at line item destination" #~ msgstr "Store at line item destination" -#: src/forms/PurchaseOrderForms.tsx:610 -msgid "Store at default location" +#: src/forms/PurchaseOrderForms.tsx:584 +#: src/forms/StockForms.tsx:693 +msgid "Adjust Packaging" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:625 -msgid "Store at line item destination " +#: src/forms/PurchaseOrderForms.tsx:592 +#: src/forms/StockForms.tsx:684 +#: src/hooks/UseStockAdjustActions.tsx:148 +msgid "Change Status" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:637 -msgid "Store with already received stock" +#: src/forms/PurchaseOrderForms.tsx:598 +msgid "Add Note" msgstr "" #: src/forms/PurchaseOrderForms.tsx:658 #~ msgid "Receive line items" #~ msgstr "Receive line items" -#: src/forms/PurchaseOrderForms.tsx:661 +#: src/forms/PurchaseOrderForms.tsx:662 +msgid "Store at default location" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:677 +msgid "Store at line item destination " +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:689 +msgid "Store with already received stock" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:713 #: src/pages/build/BuildDetail.tsx:340 #: src/pages/stock/StockDetail.tsx:280 #: src/pages/stock/StockDetail.tsx:952 #: src/tables/Filter.tsx:83 -#: src/tables/build/BuildAllocatedStockTable.tsx:128 +#: src/tables/build/BuildAllocatedStockTable.tsx:125 #: src/tables/build/BuildOutputTable.tsx:112 -#: src/tables/part/PartTestResultTable.tsx:260 -#: src/tables/part/PartTestResultTable.tsx:281 +#: src/tables/part/PartTestResultTable.tsx:268 +#: src/tables/part/PartTestResultTable.tsx:289 #: src/tables/sales/SalesOrderAllocationTable.tsx:149 msgid "Batch Code" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:662 +#: src/forms/PurchaseOrderForms.tsx:714 msgid "Enter batch code for received items" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:675 +#: src/forms/PurchaseOrderForms.tsx:727 #: src/forms/StockForms.tsx:218 msgid "Serial Numbers" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:676 +#: src/forms/PurchaseOrderForms.tsx:728 msgid "Enter serial numbers for received items" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:690 +#: src/forms/PurchaseOrderForms.tsx:742 #: src/pages/stock/StockDetail.tsx:382 #: src/tables/stock/StockItemTable.tsx:294 msgid "Expiry Date" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:691 +#: src/forms/PurchaseOrderForms.tsx:743 msgid "Enter an expiry date for received items" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:703 +#: src/forms/PurchaseOrderForms.tsx:755 #: src/forms/StockForms.tsx:728 #: src/pages/company/SupplierPartDetail.tsx:172 #: src/pages/company/SupplierPartDetail.tsx:236 @@ -4701,19 +4708,19 @@ msgstr "" msgid "Packaging" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:727 +#: src/forms/PurchaseOrderForms.tsx:779 #: src/pages/company/SupplierPartDetail.tsx:120 #: src/tables/ColumnRenderers.tsx:332 msgid "Note" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:799 +#: src/forms/PurchaseOrderForms.tsx:851 #: src/pages/company/SupplierPartDetail.tsx:138 #: src/tables/purchasing/SupplierPriceBreakTable.tsx:49 msgid "SKU" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:800 +#: src/forms/PurchaseOrderForms.tsx:852 #: src/tables/part/PartPurchaseOrdersTable.tsx:127 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:213 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:283 @@ -4721,11 +4728,11 @@ msgstr "" msgid "Received" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:817 +#: src/forms/PurchaseOrderForms.tsx:869 msgid "Receive Line Items" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:823 +#: src/forms/PurchaseOrderForms.tsx:875 msgid "Items received" msgstr "" @@ -4737,7 +4744,7 @@ msgstr "" msgid "Item received into stock" msgstr "" -#: src/forms/SalesOrderForms.tsx:401 +#: src/forms/SalesOrderForms.tsx:419 msgid "Leave blank to use the order address" msgstr "" @@ -5932,6 +5939,9 @@ msgstr "" #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:310 #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:401 +#: src/tables/build/BuildAllocatedStockTable.tsx:181 +#: src/tables/build/BuildLineTable.tsx:668 +#: src/tables/sales/SalesOrderAllocationTable.tsx:220 msgid "Confirm Removal" msgstr "" @@ -6870,8 +6880,8 @@ msgstr "" #: src/pages/sales/ReturnOrderDetail.tsx:108 #: src/pages/sales/SalesOrderDetail.tsx:98 #: src/tables/ColumnRenderers.tsx:321 -#: src/tables/build/BuildAllocatedStockTable.tsx:115 -#: src/tables/build/BuildLineTable.tsx:352 +#: src/tables/build/BuildAllocatedStockTable.tsx:112 +#: src/tables/build/BuildLineTable.tsx:353 msgid "Reference" msgstr "" @@ -7132,7 +7142,7 @@ msgstr "" #: src/pages/build/BuildDetail.tsx:742 #: src/pages/stock/StockDetail.tsx:344 -#: src/tables/build/BuildAllocatedStockTable.tsx:85 +#: src/tables/build/BuildAllocatedStockTable.tsx:82 #: src/tables/part/PartBuildAllocationsTable.tsx:45 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:157 #: src/tables/stock/StockTrackingTable.tsx:109 @@ -7600,7 +7610,7 @@ msgstr "" #: src/pages/part/PartDetail.tsx:542 #: src/tables/bom/BomTable.tsx:439 -#: src/tables/build/BuildLineTable.tsx:305 +#: src/tables/build/BuildLineTable.tsx:306 #: src/tables/part/PartTable.tsx:319 #: src/tables/sales/SalesOrderLineItemTable.tsx:138 msgid "Available Stock" @@ -7608,7 +7618,7 @@ msgstr "" #: src/pages/part/PartDetail.tsx:548 #: src/tables/bom/BomTable.tsx:341 -#: src/tables/build/BuildLineTable.tsx:267 +#: src/tables/build/BuildLineTable.tsx:268 #: src/tables/sales/SalesOrderLineItemTable.tsx:180 msgid "On order" msgstr "" @@ -7782,7 +7792,7 @@ msgstr "" #: src/pages/part/PartDetail.tsx:1144 #: src/pages/stock/StockDetail.tsx:884 -#: src/tables/build/BuildLineTable.tsx:761 +#: src/tables/build/BuildLineTable.tsx:768 msgid "Order Stock" msgstr "" @@ -9219,13 +9229,13 @@ msgstr "" #~ msgstr "Show asssmbled items" #: src/tables/bom/BomTable.tsx:315 -#: src/tables/build/BuildLineTable.tsx:276 +#: src/tables/build/BuildLineTable.tsx:277 #: src/tables/part/PartTable.tsx:145 msgid "External stock" msgstr "" #: src/tables/bom/BomTable.tsx:323 -#: src/tables/build/BuildLineTable.tsx:239 +#: src/tables/build/BuildLineTable.tsx:240 msgid "Includes substitute stock" msgstr "" @@ -9234,7 +9244,7 @@ msgstr "" #~ msgstr "Edit Bom Item" #: src/tables/bom/BomTable.tsx:332 -#: src/tables/build/BuildLineTable.tsx:249 +#: src/tables/build/BuildLineTable.tsx:250 #: src/tables/sales/SalesOrderLineItemTable.tsx:166 msgid "Includes variant stock" msgstr "" @@ -9272,8 +9282,8 @@ msgid "Stock Information" msgstr "" #: src/tables/bom/BomTable.tsx:399 -#: src/tables/build/BuildLineTable.tsx:496 -#: src/tables/build/BuildLineTable.tsx:537 +#: src/tables/build/BuildLineTable.tsx:497 +#: src/tables/build/BuildLineTable.tsx:538 msgid "Consumable item" msgstr "" @@ -9282,7 +9292,7 @@ msgid "No available stock" msgstr "" #: src/tables/bom/BomTable.tsx:420 -#: src/tables/build/BuildLineTable.tsx:213 +#: src/tables/build/BuildLineTable.tsx:214 msgid "Show testable items" msgstr "" @@ -9291,7 +9301,7 @@ msgid "Show trackable items" msgstr "" #: src/tables/bom/BomTable.tsx:430 -#: src/tables/build/BuildLineTable.tsx:208 +#: src/tables/build/BuildLineTable.tsx:209 msgid "Show assembled items" msgstr "" @@ -9335,7 +9345,7 @@ msgstr "" #: src/tables/bom/BomTable.tsx:464 #: src/tables/bom/UsedInTable.tsx:85 -#: src/tables/build/BuildLineTable.tsx:202 +#: src/tables/build/BuildLineTable.tsx:203 msgid "Optional" msgstr "" @@ -9345,7 +9355,7 @@ msgid "Show optional items" msgstr "" #: src/tables/bom/BomTable.tsx:469 -#: src/tables/build/BuildLineTable.tsx:197 +#: src/tables/build/BuildLineTable.tsx:198 msgid "Consumable" msgstr "" @@ -9433,7 +9443,7 @@ msgid "Bill of materials cannot be edited, as the part is locked" msgstr "" #: src/tables/bom/UsedInTable.tsx:34 -#: src/tables/build/BuildLineTable.tsx:207 +#: src/tables/build/BuildLineTable.tsx:208 #: src/tables/part/ParametricPartTable.tsx:364 #: src/tables/part/PartBuildAllocationsTable.tsx:60 #: src/tables/part/PartTable.tsx:209 @@ -9455,11 +9465,11 @@ msgstr "" msgid "Show trackable assemblies" msgstr "" -#: src/tables/build/BuildAllocatedStockTable.tsx:67 +#: src/tables/build/BuildAllocatedStockTable.tsx:64 msgid "Allocated to Output" msgstr "" -#: src/tables/build/BuildAllocatedStockTable.tsx:68 +#: src/tables/build/BuildAllocatedStockTable.tsx:65 msgid "Show items allocated to a build output" msgstr "" @@ -9472,7 +9482,7 @@ msgstr "" #~ msgid "Include orders for part variants" #~ msgstr "Include orders for part variants" -#: src/tables/build/BuildAllocatedStockTable.tsx:97 +#: src/tables/build/BuildAllocatedStockTable.tsx:94 #: src/tables/part/PartBuildAllocationsTable.tsx:84 #: src/tables/part/PartPurchaseOrdersTable.tsx:132 #: src/tables/part/PartSalesAllocationsTable.tsx:69 @@ -9482,40 +9492,58 @@ msgid "Order Status" msgstr "" #: src/tables/build/BuildAllocatedStockTable.tsx:164 -#~ msgid "Edit Build Item" -#~ msgstr "Edit Build Item" - -#: src/tables/build/BuildAllocatedStockTable.tsx:167 -#: src/tables/build/BuildLineTable.tsx:650 +#: src/tables/build/BuildLineTable.tsx:651 msgid "Edit Stock Allocation" msgstr "" +#: src/tables/build/BuildAllocatedStockTable.tsx:164 +#~ msgid "Edit Build Item" +#~ msgstr "Edit Build Item" + #: src/tables/build/BuildAllocatedStockTable.tsx:174 #~ msgid "Delete Build Item" #~ msgstr "Delete Build Item" -#: src/tables/build/BuildAllocatedStockTable.tsx:180 -#: src/tables/build/BuildLineTable.tsx:663 -msgid "Delete Stock Allocation" +#: src/tables/build/BuildAllocatedStockTable.tsx:177 +#: src/tables/build/BuildLineTable.tsx:664 +#: src/tables/sales/SalesOrderAllocationTable.tsx:218 +msgid "Remove Allocated Stock" msgstr "" -#: src/tables/build/BuildAllocatedStockTable.tsx:239 +#: src/tables/build/BuildAllocatedStockTable.tsx:180 +#: src/tables/build/BuildLineTable.tsx:663 +#~ msgid "Delete Stock Allocation" +#~ msgstr "Delete Stock Allocation" + +#: src/tables/build/BuildAllocatedStockTable.tsx:182 +#: src/tables/build/BuildLineTable.tsx:669 +#: src/tables/sales/SalesOrderAllocationTable.tsx:221 +msgid "Are you sure you want to remove this allocated stock from the order?" +msgstr "" + +#: src/tables/build/BuildAllocatedStockTable.tsx:242 msgid "Consume" msgstr "" +#: src/tables/build/BuildAllocatedStockTable.tsx:259 +#: src/tables/build/BuildLineTable.tsx:112 +#: src/tables/sales/SalesOrderAllocationTable.tsx:248 +msgid "Remove allocated stock" +msgstr "" + #: src/tables/build/BuildLineTable.tsx:59 #~ msgid "Show lines with available stock" #~ msgstr "Show lines with available stock" -#: src/tables/build/BuildLineTable.tsx:120 +#: src/tables/build/BuildLineTable.tsx:121 msgid "View Stock Item" msgstr "" -#: src/tables/build/BuildLineTable.tsx:183 +#: src/tables/build/BuildLineTable.tsx:184 msgid "Show fully allocated lines" msgstr "" -#: src/tables/build/BuildLineTable.tsx:188 +#: src/tables/build/BuildLineTable.tsx:189 msgid "Show fully consumed lines" msgstr "" @@ -9523,124 +9551,124 @@ msgstr "" #~ msgid "Show allocated lines" #~ msgstr "Show allocated lines" -#: src/tables/build/BuildLineTable.tsx:193 +#: src/tables/build/BuildLineTable.tsx:194 msgid "Show items with sufficient available stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:198 +#: src/tables/build/BuildLineTable.tsx:199 msgid "Show consumable lines" msgstr "" -#: src/tables/build/BuildLineTable.tsx:203 +#: src/tables/build/BuildLineTable.tsx:204 msgid "Show optional lines" msgstr "" -#: src/tables/build/BuildLineTable.tsx:212 +#: src/tables/build/BuildLineTable.tsx:213 #: src/tables/part/PartTable.tsx:233 msgid "Testable" msgstr "" -#: src/tables/build/BuildLineTable.tsx:217 +#: src/tables/build/BuildLineTable.tsx:218 #: src/tables/stock/StockItemTable.tsx:388 msgid "Tracked" msgstr "" -#: src/tables/build/BuildLineTable.tsx:218 +#: src/tables/build/BuildLineTable.tsx:219 msgid "Show tracked lines" msgstr "" -#: src/tables/build/BuildLineTable.tsx:223 +#: src/tables/build/BuildLineTable.tsx:224 msgid "Show items with stock on order" msgstr "" -#: src/tables/build/BuildLineTable.tsx:258 +#: src/tables/build/BuildLineTable.tsx:259 #: src/tables/sales/SalesOrderLineItemTable.tsx:172 msgid "In production" msgstr "" -#: src/tables/build/BuildLineTable.tsx:286 +#: src/tables/build/BuildLineTable.tsx:287 msgid "Insufficient stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:302 +#: src/tables/build/BuildLineTable.tsx:303 #: src/tables/sales/SalesOrderLineItemTable.tsx:160 #: src/tables/stock/StockItemTable.tsx:191 msgid "No stock available" msgstr "" -#: src/tables/build/BuildLineTable.tsx:375 +#: src/tables/build/BuildLineTable.tsx:376 msgid "Gets Inherited" msgstr "" -#: src/tables/build/BuildLineTable.tsx:388 +#: src/tables/build/BuildLineTable.tsx:389 msgid "Unit Quantity" msgstr "" -#: src/tables/build/BuildLineTable.tsx:415 +#: src/tables/build/BuildLineTable.tsx:416 msgid "Setup Quantity" msgstr "" -#: src/tables/build/BuildLineTable.tsx:424 +#: src/tables/build/BuildLineTable.tsx:425 msgid "Attrition" msgstr "" -#: src/tables/build/BuildLineTable.tsx:432 +#: src/tables/build/BuildLineTable.tsx:433 msgid "Rounding Multiple" msgstr "" -#: src/tables/build/BuildLineTable.tsx:441 +#: src/tables/build/BuildLineTable.tsx:442 msgid "BOM Information" msgstr "" -#: src/tables/build/BuildLineTable.tsx:515 +#: src/tables/build/BuildLineTable.tsx:516 #: src/tables/part/PartBuildAllocationsTable.tsx:102 msgid "Fully allocated" msgstr "" -#: src/tables/build/BuildLineTable.tsx:563 +#: src/tables/build/BuildLineTable.tsx:564 #: src/tables/sales/SalesOrderLineItemTable.tsx:311 msgid "Create Build Order" msgstr "" -#: src/tables/build/BuildLineTable.tsx:592 +#: src/tables/build/BuildLineTable.tsx:593 msgid "Auto allocation in progress" msgstr "" -#: src/tables/build/BuildLineTable.tsx:595 -#: src/tables/build/BuildLineTable.tsx:802 +#: src/tables/build/BuildLineTable.tsx:596 +#: src/tables/build/BuildLineTable.tsx:809 msgid "Auto Allocate Stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:596 +#: src/tables/build/BuildLineTable.tsx:597 msgid "Automatically allocate stock to this build according to the selected options" msgstr "" -#: src/tables/build/BuildLineTable.tsx:616 -#: src/tables/build/BuildLineTable.tsx:630 -#: src/tables/build/BuildLineTable.tsx:751 -#: src/tables/build/BuildLineTable.tsx:852 +#: src/tables/build/BuildLineTable.tsx:617 +#: src/tables/build/BuildLineTable.tsx:631 +#: src/tables/build/BuildLineTable.tsx:758 +#: src/tables/build/BuildLineTable.tsx:859 #: src/tables/build/BuildOutputTable.tsx:355 #: src/tables/build/BuildOutputTable.tsx:360 msgid "Deallocate Stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:632 +#: src/tables/build/BuildLineTable.tsx:633 msgid "Deallocate all untracked stock for this build order" msgstr "" -#: src/tables/build/BuildLineTable.tsx:634 +#: src/tables/build/BuildLineTable.tsx:635 msgid "Deallocate stock from the selected line item" msgstr "" -#: src/tables/build/BuildLineTable.tsx:638 +#: src/tables/build/BuildLineTable.tsx:639 msgid "Stock has been deallocated" msgstr "" -#: src/tables/build/BuildLineTable.tsx:771 +#: src/tables/build/BuildLineTable.tsx:778 msgid "Build Stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:784 +#: src/tables/build/BuildLineTable.tsx:791 #: src/tables/sales/SalesOrderLineItemTable.tsx:487 msgid "View Part" msgstr "" @@ -9739,7 +9767,7 @@ msgid "Serialize Build Output" msgstr "" #: src/tables/build/BuildOutputTable.tsx:405 -#: src/tables/part/PartTestResultTable.tsx:310 +#: src/tables/part/PartTestResultTable.tsx:318 #: src/tables/stock/StockItemTable.tsx:328 msgid "Filter by stock status" msgstr "" @@ -9964,8 +9992,8 @@ msgid "View Item" msgstr "" #: src/tables/general/ExtraLineItemTable.tsx:95 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:299 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:403 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:300 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:405 #: src/tables/sales/ReturnOrderLineItemTable.tsx:83 #: src/tables/sales/ReturnOrderLineItemTable.tsx:187 #: src/tables/sales/SalesOrderLineItemTable.tsx:252 @@ -9974,14 +10002,14 @@ msgid "Add Line Item" msgstr "" #: src/tables/general/ExtraLineItemTable.tsx:108 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:320 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:322 #: src/tables/sales/ReturnOrderLineItemTable.tsx:96 #: src/tables/sales/SalesOrderLineItemTable.tsx:271 msgid "Edit Line Item" msgstr "" #: src/tables/general/ExtraLineItemTable.tsx:117 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:329 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:331 #: src/tables/sales/ReturnOrderLineItemTable.tsx:105 #: src/tables/sales/SalesOrderLineItemTable.tsx:280 msgid "Delete Line Item" @@ -10273,7 +10301,7 @@ msgid "Required Stock" msgstr "" #: src/tables/part/PartBuildAllocationsTable.tsx:124 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:381 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:383 msgid "View Build Order" msgstr "" @@ -10617,8 +10645,8 @@ msgstr "" #: src/tables/part/PartTestResultTable.tsx:103 #: src/tables/part/PartTestResultTable.tsx:181 -#: src/tables/part/PartTestResultTable.tsx:320 -#: src/tables/part/PartTestResultTable.tsx:334 +#: src/tables/part/PartTestResultTable.tsx:328 +#: src/tables/part/PartTestResultTable.tsx:342 #: src/tables/stock/StockItemTestResultTable.tsx:296 #: src/tables/stock/StockItemTestResultTable.tsx:368 #: src/tables/stock/StockItemTestResultTable.tsx:429 @@ -10643,7 +10671,7 @@ msgstr "" msgid "No Result" msgstr "" -#: src/tables/part/PartTestResultTable.tsx:298 +#: src/tables/part/PartTestResultTable.tsx:306 msgid "Show build outputs currently in production" msgstr "" @@ -11073,7 +11101,7 @@ msgid "Show manufacturer parts for active manufacturers." msgstr "" #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:115 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:397 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:399 msgid "Import Line Items" msgstr "" @@ -11099,11 +11127,11 @@ msgstr "" #~ msgid "Add line item" #~ msgstr "Add line item" -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:350 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:352 msgid "Receive line item" msgstr "" -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:414 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:416 msgid "Receive items" msgstr "" @@ -11201,25 +11229,25 @@ msgid "Not shipped" msgstr "" #: src/tables/sales/SalesOrderAllocationTable.tsx:211 -#: src/tables/sales/SalesOrderAllocationTable.tsx:229 +#: src/tables/sales/SalesOrderAllocationTable.tsx:235 msgid "Edit Allocation" msgstr "" #: src/tables/sales/SalesOrderAllocationTable.tsx:218 #: src/tables/sales/SalesOrderAllocationTable.tsx:241 -msgid "Delete Allocation" -msgstr "" +#~ msgid "Delete Allocation" +#~ msgstr "Delete Allocation" -#: src/tables/sales/SalesOrderAllocationTable.tsx:252 -#: src/tables/sales/SalesOrderAllocationTable.tsx:253 +#: src/tables/sales/SalesOrderAllocationTable.tsx:261 +#: src/tables/sales/SalesOrderAllocationTable.tsx:262 msgid "View Shipment" msgstr "" -#: src/tables/sales/SalesOrderAllocationTable.tsx:308 +#: src/tables/sales/SalesOrderAllocationTable.tsx:317 msgid "Assign to Shipment" msgstr "" -#: src/tables/sales/SalesOrderAllocationTable.tsx:324 +#: src/tables/sales/SalesOrderAllocationTable.tsx:333 msgid "Assign to shipment" msgstr "" diff --git a/src/frontend/src/locales/sr/messages.po b/src/frontend/src/locales/sr/messages.po index 2ee089ab71..bed3f90ba8 100644 --- a/src/frontend/src/locales/sr/messages.po +++ b/src/frontend/src/locales/sr/messages.po @@ -8,7 +8,7 @@ msgstr "" "Language: sr\n" "Project-Id-Version: inventree\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2025-11-19 19:39\n" +"PO-Revision-Date: 2025-11-22 06:25\n" "Last-Translator: \n" "Language-Team: Serbian (Latin)\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" @@ -56,7 +56,7 @@ msgstr "Poništi" #: lib/components/RowActions.tsx:136 #: src/components/nav/NavigationDrawer.tsx:190 -#: src/forms/PurchaseOrderForms.tsx:802 +#: src/forms/PurchaseOrderForms.tsx:854 #: src/forms/StockForms.tsx:796 #: src/forms/StockForms.tsx:843 #: src/forms/StockForms.tsx:889 @@ -103,9 +103,9 @@ msgstr "Ne" #: src/forms/BuildForms.tsx:630 #: src/forms/BuildForms.tsx:793 #: src/forms/BuildForms.tsx:896 -#: src/forms/PurchaseOrderForms.tsx:798 +#: src/forms/PurchaseOrderForms.tsx:850 #: src/forms/ReturnOrderForms.tsx:242 -#: src/forms/SalesOrderForms.tsx:305 +#: src/forms/SalesOrderForms.tsx:323 #: src/forms/StockForms.tsx:360 #: src/forms/StockForms.tsx:791 #: src/forms/StockForms.tsx:838 @@ -119,6 +119,7 @@ msgstr "Ne" #: src/pages/build/BuildDetail.tsx:200 #: src/pages/part/PartDetail.tsx:1207 #: src/tables/ColumnRenderers.tsx:91 +#: src/tables/part/PartTestResultTable.tsx:247 #: src/tables/part/RelatedPartTable.tsx:53 #: src/tables/stock/StockTrackingTable.tsx:87 msgid "Part" @@ -158,7 +159,7 @@ msgstr "Šabloni testiranja dela" #: src/components/wizards/OrderPartsWizard.tsx:290 #: src/pages/company/SupplierPartDetail.tsx:413 #: src/pages/stock/StockDetail.tsx:289 -#: src/tables/build/BuildAllocatedStockTable.tsx:155 +#: src/tables/build/BuildAllocatedStockTable.tsx:152 #: src/tables/part/PartPurchaseOrdersTable.tsx:50 #: src/tables/purchasing/SupplierPartTable.tsx:83 #: src/tables/stock/StockItemTable.tsx:247 @@ -201,9 +202,9 @@ msgstr "Kategorije delova" #: src/forms/BuildForms.tsx:473 #: src/forms/BuildForms.tsx:633 #: src/forms/BuildForms.tsx:794 -#: src/forms/SalesOrderForms.tsx:307 +#: src/forms/SalesOrderForms.tsx:325 #: src/pages/stock/StockDetail.tsx:1005 -#: src/tables/part/PartTestResultTable.tsx:248 +#: src/tables/part/PartTestResultTable.tsx:256 #: src/tables/stock/StockTrackingTable.tsx:48 #: src/tables/stock/StockTrackingTable.tsx:55 msgid "Stock Item" @@ -517,7 +518,7 @@ msgstr "Liste selekcija" #: src/components/dashboard/DashboardLayout.tsx:281 #: src/components/editors/NotesEditor.tsx:74 #: src/components/editors/TemplateEditor/TemplateEditor.tsx:158 -#: src/components/forms/fields/ApiFormField.tsx:273 +#: src/components/forms/fields/ApiFormField.tsx:237 #: src/components/forms/fields/TableField.tsx:45 #: src/components/importer/ImportDataSelector.tsx:192 #: src/components/importer/ImporterColumnSelector.tsx:234 @@ -642,8 +643,8 @@ msgstr "Unesi podatke bar koda" #: src/components/barcodes/BarcodeScanDialog.tsx:49 #: src/components/buttons/ScanButton.tsx:15 #: src/components/nav/NavigationDrawer.tsx:122 -#: src/forms/PurchaseOrderForms.tsx:457 -#: src/forms/PurchaseOrderForms.tsx:563 +#: src/forms/PurchaseOrderForms.tsx:509 +#: src/forms/PurchaseOrderForms.tsx:615 msgid "Scan Barcode" msgstr "Skeniraj barkod" @@ -728,7 +729,7 @@ msgstr "Ovo će ukloniti link sa povezanim barkodom" #: src/components/barcodes/QRCode.tsx:205 #: src/components/items/ActionDropdown.tsx:192 -#: src/forms/PurchaseOrderForms.tsx:554 +#: src/forms/PurchaseOrderForms.tsx:606 msgid "Unlink Barcode" msgstr "Prekini vezu Barkoda" @@ -1216,6 +1217,12 @@ msgstr "Ukloniti sliku sa ovog predmeta?" #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:884 #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:903 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:254 +#: src/tables/build/BuildAllocatedStockTable.tsx:178 +#: src/tables/build/BuildAllocatedStockTable.tsx:258 +#: src/tables/build/BuildLineTable.tsx:111 +#: src/tables/build/BuildLineTable.tsx:665 +#: src/tables/sales/SalesOrderAllocationTable.tsx:224 +#: src/tables/sales/SalesOrderAllocationTable.tsx:247 msgid "Remove" msgstr "Ukloni" @@ -1241,7 +1248,7 @@ msgid "Upload Error" msgstr "Greška prilikom dodavanja" #: src/components/details/DetailsImage.tsx:250 -#: src/components/forms/fields/TextField.tsx:65 +#: src/components/forms/fields/AutoFillRightSection.tsx:34 msgid "Clear" msgstr "Obriši" @@ -1817,10 +1824,14 @@ msgstr "Zaustavljeno" msgid "Running" msgstr "" -#: src/components/forms/fields/ApiFormField.tsx:233 +#: src/components/forms/fields/ApiFormField.tsx:197 msgid "Select file to upload" msgstr "" +#: src/components/forms/fields/AutoFillRightSection.tsx:47 +msgid "Accept suggested value" +msgstr "" + #: src/components/forms/fields/DateField.tsx:76 msgid "Select date" msgstr "" @@ -1875,10 +1886,6 @@ msgstr "Nema unosa" msgid "Add new row" msgstr "Dodaj novi red" -#: src/components/forms/fields/TextField.tsx:82 -msgid "Accept suggested value" -msgstr "" - #: src/components/images/DetailsImage.tsx:252 #~ msgid "Select image" #~ msgstr "Select image" @@ -2225,8 +2232,8 @@ msgstr "" #: src/pages/part/PartDetail.tsx:994 #: src/pages/stock/StockDetail.tsx:265 #: src/pages/stock/StockDetail.tsx:942 -#: src/tables/build/BuildAllocatedStockTable.tsx:135 -#: src/tables/build/BuildLineTable.tsx:192 +#: src/tables/build/BuildAllocatedStockTable.tsx:132 +#: src/tables/build/BuildLineTable.tsx:193 #: src/tables/part/PartTable.tsx:137 #: src/tables/stock/StockItemTable.tsx:182 #: src/tables/stock/StockItemTable.tsx:343 @@ -2784,7 +2791,7 @@ msgstr "Informacije o ekstenziji" #: src/pages/sales/SalesOrderDetail.tsx:119 #: src/pages/stock/LocationDetail.tsx:102 #: src/tables/ColumnRenderers.tsx:278 -#: src/tables/build/BuildAllocatedStockTable.tsx:91 +#: src/tables/build/BuildAllocatedStockTable.tsx:88 #: src/tables/machine/MachineTypeTable.tsx:161 #: src/tables/machine/MachineTypeTable.tsx:257 #: src/tables/plugin/PluginListTable.tsx:110 @@ -2966,7 +2973,7 @@ msgstr "Nema zalihe" #: src/pages/company/SupplierPartDetail.tsx:394 #: src/pages/part/PartDetail.tsx:1015 #: src/tables/bom/BomTable.tsx:444 -#: src/tables/build/BuildLineTable.tsx:222 +#: src/tables/build/BuildLineTable.tsx:223 #: src/tables/part/PartTable.tsx:108 msgid "On Order" msgstr "Na nalogu" @@ -2976,7 +2983,7 @@ msgstr "Na nalogu" #: src/pages/part/PartDetail.tsx:587 #: src/pages/part/PartDetail.tsx:1021 #: src/pages/stock/StockDetail.tsx:925 -#: src/tables/part/PartTestResultTable.tsx:297 +#: src/tables/part/PartTestResultTable.tsx:305 #: src/tables/stock/StockItemTable.tsx:359 msgid "In Production" msgstr "U produkciji" @@ -3000,7 +3007,7 @@ msgstr "Kategorija" #: src/components/render/Stock.tsx:114 #: src/components/render/Stock.tsx:132 #: src/forms/BuildForms.tsx:795 -#: src/forms/PurchaseOrderForms.tsx:595 +#: src/forms/PurchaseOrderForms.tsx:647 #: src/forms/StockForms.tsx:792 #: src/forms/StockForms.tsx:839 #: src/forms/StockForms.tsx:885 @@ -3023,7 +3030,7 @@ msgstr "Lokacija" #: src/components/render/Stock.tsx:99 #: src/pages/stock/StockDetail.tsx:198 #: src/pages/stock/StockDetail.tsx:930 -#: src/tables/build/BuildAllocatedStockTable.tsx:121 +#: src/tables/build/BuildAllocatedStockTable.tsx:118 #: src/tables/build/BuildOutputTable.tsx:107 #: src/tables/sales/SalesOrderAllocationTable.tsx:142 msgid "Serial Number" @@ -3034,9 +3041,9 @@ msgstr "Serijski broj" #: src/forms/BuildForms.tsx:240 #: src/forms/BuildForms.tsx:634 #: src/forms/BuildForms.tsx:797 -#: src/forms/PurchaseOrderForms.tsx:801 +#: src/forms/PurchaseOrderForms.tsx:853 #: src/forms/ReturnOrderForms.tsx:243 -#: src/forms/SalesOrderForms.tsx:308 +#: src/forms/SalesOrderForms.tsx:326 #: src/forms/StockForms.tsx:841 #: src/pages/part/PartStockHistoryDetail.tsx:56 #: src/pages/part/PartStockHistoryDetail.tsx:210 @@ -3046,9 +3053,9 @@ msgstr "Serijski broj" #: src/pages/part/pricing/PriceBreakPanel.tsx:172 #: src/pages/stock/StockDetail.tsx:258 #: src/pages/stock/StockDetail.tsx:936 -#: src/tables/build/BuildLineTable.tsx:86 +#: src/tables/build/BuildLineTable.tsx:83 #: src/tables/part/PartPurchaseOrdersTable.tsx:94 -#: src/tables/part/PartTestResultTable.tsx:269 +#: src/tables/part/PartTestResultTable.tsx:277 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:175 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:206 #: src/tables/purchasing/SupplierPriceBreakTable.tsx:69 @@ -3070,7 +3077,7 @@ msgstr "Količina" #: src/forms/StockForms.tsx:1048 #: src/forms/StockForms.tsx:1096 #: src/forms/StockForms.tsx:1140 -#: src/tables/build/BuildLineTable.tsx:96 +#: src/tables/build/BuildLineTable.tsx:93 msgid "Batch" msgstr "Serija" @@ -3755,7 +3762,7 @@ msgid "In Stock" msgstr "U zalihama" #: src/components/wizards/OrderPartsWizard.tsx:146 -#: src/tables/build/BuildLineTable.tsx:404 +#: src/tables/build/BuildLineTable.tsx:405 msgid "Required Quantity" msgstr "Potrebna količina" @@ -3847,7 +3854,7 @@ msgid "Please correct the errors in the selected parts" msgstr "Molimo ispravite greške u izabranim delovima" #: src/components/wizards/OrderPartsWizard.tsx:587 -#: src/tables/build/BuildLineTable.tsx:815 +#: src/tables/build/BuildLineTable.tsx:822 #: src/tables/part/PartTable.tsx:522 #: src/tables/sales/SalesOrderLineItemTable.tsx:370 msgid "Order Parts" @@ -4349,9 +4356,9 @@ msgstr "" #: src/forms/BuildForms.tsx:333 #: src/forms/BuildForms.tsx:408 #: src/forms/BuildForms.tsx:685 -#: src/tables/build/BuildAllocatedStockTable.tsx:150 +#: src/tables/build/BuildAllocatedStockTable.tsx:147 #: src/tables/build/BuildOutputTable.tsx:582 -#: src/tables/part/PartTestResultTable.tsx:272 +#: src/tables/part/PartTestResultTable.tsx:280 msgid "Build Output" msgstr "Izlazna kompilacija" @@ -4362,7 +4369,7 @@ msgstr "" #: src/forms/BuildForms.tsx:336 #: src/forms/BuildForms.tsx:411 #: src/forms/BuildForms.tsx:475 -#: src/forms/PurchaseOrderForms.tsx:717 +#: src/forms/PurchaseOrderForms.tsx:769 #: src/forms/ReturnOrderForms.tsx:197 #: src/forms/ReturnOrderForms.tsx:244 #: src/forms/StockForms.tsx:712 @@ -4377,7 +4384,7 @@ msgstr "" #: src/tables/build/BuildOutputTable.tsx:404 #: src/tables/machine/MachineListTable.tsx:387 #: src/tables/part/PartPurchaseOrdersTable.tsx:38 -#: src/tables/part/PartTestResultTable.tsx:309 +#: src/tables/part/PartTestResultTable.tsx:317 #: src/tables/sales/ReturnOrderLineItemTable.tsx:138 #: src/tables/sales/ReturnOrderLineItemTable.tsx:176 #: src/tables/settings/CustomStateTable.tsx:79 @@ -4450,8 +4457,8 @@ msgstr "Izlazne kompilacije poništene" #: src/pages/stock/StockDetail.tsx:153 #: src/tables/bom/BomTable.tsx:134 #: src/tables/bom/UsedInTable.tsx:40 -#: src/tables/build/BuildAllocatedStockTable.tsx:108 -#: src/tables/build/BuildLineTable.tsx:336 +#: src/tables/build/BuildAllocatedStockTable.tsx:105 +#: src/tables/build/BuildLineTable.tsx:337 #: src/tables/build/BuildOrderTable.tsx:79 #: src/tables/part/PartSalesAllocationsTable.tsx:61 #: src/tables/part/RelatedPartTable.tsx:73 @@ -4466,47 +4473,47 @@ msgstr "Identifikacioni broj dela" #: src/forms/BuildForms.tsx:632 #: src/forms/BuildForms.tsx:796 #: src/forms/BuildForms.tsx:897 -#: src/forms/SalesOrderForms.tsx:306 -#: src/tables/build/BuildAllocatedStockTable.tsx:139 -#: src/tables/build/BuildLineTable.tsx:182 +#: src/forms/SalesOrderForms.tsx:324 +#: src/tables/build/BuildAllocatedStockTable.tsx:136 +#: src/tables/build/BuildLineTable.tsx:183 #: src/tables/sales/SalesOrderLineItemTable.tsx:342 #: src/tables/stock/StockItemTable.tsx:338 msgid "Allocated" msgstr "Alocirano" #: src/forms/BuildForms.tsx:667 -#: src/forms/SalesOrderForms.tsx:295 +#: src/forms/SalesOrderForms.tsx:313 #: src/pages/build/BuildDetail.tsx:108 #: src/pages/build/BuildDetail.tsx:326 msgid "Source Location" msgstr "Lokacija izvora" #: src/forms/BuildForms.tsx:668 -#: src/forms/SalesOrderForms.tsx:296 +#: src/forms/SalesOrderForms.tsx:314 msgid "Select the source location for the stock allocation" msgstr "Izaberi lokaciju izvora radi alokacije zaliha" #: src/forms/BuildForms.tsx:700 -#: src/forms/SalesOrderForms.tsx:336 -#: src/tables/build/BuildLineTable.tsx:574 -#: src/tables/build/BuildLineTable.tsx:731 -#: src/tables/build/BuildLineTable.tsx:830 +#: src/forms/SalesOrderForms.tsx:354 +#: src/tables/build/BuildLineTable.tsx:575 +#: src/tables/build/BuildLineTable.tsx:738 +#: src/tables/build/BuildLineTable.tsx:837 #: src/tables/sales/SalesOrderLineItemTable.tsx:380 #: src/tables/sales/SalesOrderLineItemTable.tsx:406 msgid "Allocate Stock" msgstr "Alociraj zalihe" #: src/forms/BuildForms.tsx:703 -#: src/forms/SalesOrderForms.tsx:341 +#: src/forms/SalesOrderForms.tsx:359 msgid "Stock items allocated" msgstr "Stavke zaliha alocirane" #: src/forms/BuildForms.tsx:816 #: src/forms/BuildForms.tsx:917 -#: src/tables/build/BuildAllocatedStockTable.tsx:240 -#: src/tables/build/BuildAllocatedStockTable.tsx:272 -#: src/tables/build/BuildLineTable.tsx:741 -#: src/tables/build/BuildLineTable.tsx:864 +#: src/tables/build/BuildAllocatedStockTable.tsx:243 +#: src/tables/build/BuildAllocatedStockTable.tsx:279 +#: src/tables/build/BuildLineTable.tsx:748 +#: src/tables/build/BuildLineTable.tsx:871 msgid "Consume Stock" msgstr "" @@ -4521,21 +4528,21 @@ msgstr "" #~ msgstr "Stock items consumed" #: src/forms/BuildForms.tsx:853 -#: src/tables/build/BuildLineTable.tsx:514 +#: src/tables/build/BuildLineTable.tsx:515 #: src/tables/part/PartBuildAllocationsTable.tsx:101 msgid "Fully consumed" msgstr "" #: src/forms/BuildForms.tsx:898 -#: src/tables/build/BuildLineTable.tsx:187 +#: src/tables/build/BuildLineTable.tsx:188 #: src/tables/stock/StockItemTable.tsx:367 msgid "Consumed" msgstr "Iskorišćeno" #: src/forms/CommonForms.tsx:88 -#: src/forms/PurchaseOrderForms.tsx:125 +#: src/forms/PurchaseOrderForms.tsx:176 #: src/forms/ReturnOrderForms.tsx:138 -#: src/forms/SalesOrderForms.tsx:164 +#: src/forms/SalesOrderForms.tsx:182 msgid "Select project code for this line item" msgstr "" @@ -4572,127 +4579,127 @@ msgstr "Kategorija sa delovima veće kategorije" msgid "Subscribe to notifications for this category" msgstr "Pretplati se za obaveštenja za ovu kategoriju" -#: src/forms/PurchaseOrderForms.tsx:388 -msgid "Assign Batch Code and Serial Numbers" -msgstr "Dodeli kod serije i serijski broj" - -#: src/forms/PurchaseOrderForms.tsx:390 -msgid "Assign Batch Code" -msgstr "Dodeli kod serije" - -#: src/forms/PurchaseOrderForms.tsx:410 -msgid "Choose Location" -msgstr "Izaberi lokaciju" - -#: src/forms/PurchaseOrderForms.tsx:418 -msgid "Item Destination selected" -msgstr "Destinacije stavke odabrana" - #: src/forms/PurchaseOrderForms.tsx:421 #~ msgid "Assign Batch Code{0}" #~ msgstr "Assign Batch Code{0}" -#: src/forms/PurchaseOrderForms.tsx:428 -msgid "Part category default location selected" -msgstr "Podrazmevana lokacija kategorije dela izabrana" +#: src/forms/PurchaseOrderForms.tsx:440 +msgid "Assign Batch Code and Serial Numbers" +msgstr "Dodeli kod serije i serijski broj" -#: src/forms/PurchaseOrderForms.tsx:438 -msgid "Received stock location selected" -msgstr "Primljena lokacija zaliha selektovana" +#: src/forms/PurchaseOrderForms.tsx:442 +msgid "Assign Batch Code" +msgstr "Dodeli kod serije" #: src/forms/PurchaseOrderForms.tsx:444 #: src/forms/StockForms.tsx:428 #~ msgid "Remove item from list" #~ msgstr "Remove item from list" -#: src/forms/PurchaseOrderForms.tsx:446 +#: src/forms/PurchaseOrderForms.tsx:462 +msgid "Choose Location" +msgstr "Izaberi lokaciju" + +#: src/forms/PurchaseOrderForms.tsx:470 +msgid "Item Destination selected" +msgstr "Destinacije stavke odabrana" + +#: src/forms/PurchaseOrderForms.tsx:480 +msgid "Part category default location selected" +msgstr "Podrazmevana lokacija kategorije dela izabrana" + +#: src/forms/PurchaseOrderForms.tsx:490 +msgid "Received stock location selected" +msgstr "Primljena lokacija zaliha selektovana" + +#: src/forms/PurchaseOrderForms.tsx:498 msgid "Default location selected" msgstr "Podrazumevana lokacija izabrana" -#: src/forms/PurchaseOrderForms.tsx:507 +#: src/forms/PurchaseOrderForms.tsx:559 msgid "Set Location" msgstr "Podesi lokaciju" -#: src/forms/PurchaseOrderForms.tsx:524 -msgid "Set Expiry Date" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:532 -#: src/forms/StockForms.tsx:693 -msgid "Adjust Packaging" -msgstr "Doradi pakovanje" - -#: src/forms/PurchaseOrderForms.tsx:540 -#: src/forms/StockForms.tsx:684 -#: src/hooks/UseStockAdjustActions.tsx:148 -msgid "Change Status" -msgstr "Promeni status" - -#: src/forms/PurchaseOrderForms.tsx:546 -msgid "Add Note" -msgstr "Dodaj belešku" - #: src/forms/PurchaseOrderForms.tsx:566 #~ msgid "Serial numbers" #~ msgstr "Serial numbers" +#: src/forms/PurchaseOrderForms.tsx:576 +msgid "Set Expiry Date" +msgstr "" + #: src/forms/PurchaseOrderForms.tsx:582 #~ msgid "Store at line item destination" #~ msgstr "Store at line item destination" -#: src/forms/PurchaseOrderForms.tsx:610 -msgid "Store at default location" -msgstr "Prodavnica na podrazumevanoj lokaciji" +#: src/forms/PurchaseOrderForms.tsx:584 +#: src/forms/StockForms.tsx:693 +msgid "Adjust Packaging" +msgstr "Doradi pakovanje" -#: src/forms/PurchaseOrderForms.tsx:625 -msgid "Store at line item destination " -msgstr "" +#: src/forms/PurchaseOrderForms.tsx:592 +#: src/forms/StockForms.tsx:684 +#: src/hooks/UseStockAdjustActions.tsx:148 +msgid "Change Status" +msgstr "Promeni status" -#: src/forms/PurchaseOrderForms.tsx:637 -msgid "Store with already received stock" -msgstr "Prodavnica sa već primeljenom zalihom" +#: src/forms/PurchaseOrderForms.tsx:598 +msgid "Add Note" +msgstr "Dodaj belešku" #: src/forms/PurchaseOrderForms.tsx:658 #~ msgid "Receive line items" #~ msgstr "Receive line items" -#: src/forms/PurchaseOrderForms.tsx:661 +#: src/forms/PurchaseOrderForms.tsx:662 +msgid "Store at default location" +msgstr "Prodavnica na podrazumevanoj lokaciji" + +#: src/forms/PurchaseOrderForms.tsx:677 +msgid "Store at line item destination " +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:689 +msgid "Store with already received stock" +msgstr "Prodavnica sa već primeljenom zalihom" + +#: src/forms/PurchaseOrderForms.tsx:713 #: src/pages/build/BuildDetail.tsx:340 #: src/pages/stock/StockDetail.tsx:280 #: src/pages/stock/StockDetail.tsx:952 #: src/tables/Filter.tsx:83 -#: src/tables/build/BuildAllocatedStockTable.tsx:128 +#: src/tables/build/BuildAllocatedStockTable.tsx:125 #: src/tables/build/BuildOutputTable.tsx:112 -#: src/tables/part/PartTestResultTable.tsx:260 -#: src/tables/part/PartTestResultTable.tsx:281 +#: src/tables/part/PartTestResultTable.tsx:268 +#: src/tables/part/PartTestResultTable.tsx:289 #: src/tables/sales/SalesOrderAllocationTable.tsx:149 msgid "Batch Code" msgstr "Kod serije" -#: src/forms/PurchaseOrderForms.tsx:662 +#: src/forms/PurchaseOrderForms.tsx:714 msgid "Enter batch code for received items" msgstr "Unesi kod serije za primljene stavke" -#: src/forms/PurchaseOrderForms.tsx:675 +#: src/forms/PurchaseOrderForms.tsx:727 #: src/forms/StockForms.tsx:218 msgid "Serial Numbers" msgstr "Serijski brojevi" -#: src/forms/PurchaseOrderForms.tsx:676 +#: src/forms/PurchaseOrderForms.tsx:728 msgid "Enter serial numbers for received items" msgstr "Unesi serijske brojeve za primljene stavke" -#: src/forms/PurchaseOrderForms.tsx:690 +#: src/forms/PurchaseOrderForms.tsx:742 #: src/pages/stock/StockDetail.tsx:382 #: src/tables/stock/StockItemTable.tsx:294 msgid "Expiry Date" msgstr "Datum isteka" -#: src/forms/PurchaseOrderForms.tsx:691 +#: src/forms/PurchaseOrderForms.tsx:743 msgid "Enter an expiry date for received items" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:703 +#: src/forms/PurchaseOrderForms.tsx:755 #: src/forms/StockForms.tsx:728 #: src/pages/company/SupplierPartDetail.tsx:172 #: src/pages/company/SupplierPartDetail.tsx:236 @@ -4701,19 +4708,19 @@ msgstr "" msgid "Packaging" msgstr "Pakovanje" -#: src/forms/PurchaseOrderForms.tsx:727 +#: src/forms/PurchaseOrderForms.tsx:779 #: src/pages/company/SupplierPartDetail.tsx:120 #: src/tables/ColumnRenderers.tsx:332 msgid "Note" msgstr "Beleška" -#: src/forms/PurchaseOrderForms.tsx:799 +#: src/forms/PurchaseOrderForms.tsx:851 #: src/pages/company/SupplierPartDetail.tsx:138 #: src/tables/purchasing/SupplierPriceBreakTable.tsx:49 msgid "SKU" msgstr "Jedinica za praćenje zaliha" -#: src/forms/PurchaseOrderForms.tsx:800 +#: src/forms/PurchaseOrderForms.tsx:852 #: src/tables/part/PartPurchaseOrdersTable.tsx:127 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:213 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:283 @@ -4721,11 +4728,11 @@ msgstr "Jedinica za praćenje zaliha" msgid "Received" msgstr "Primljeno" -#: src/forms/PurchaseOrderForms.tsx:817 +#: src/forms/PurchaseOrderForms.tsx:869 msgid "Receive Line Items" msgstr "Primi linijske stavke" -#: src/forms/PurchaseOrderForms.tsx:823 +#: src/forms/PurchaseOrderForms.tsx:875 msgid "Items received" msgstr "" @@ -4737,7 +4744,7 @@ msgstr "Primi stavke" msgid "Item received into stock" msgstr "Stavka primljena u zalihe" -#: src/forms/SalesOrderForms.tsx:401 +#: src/forms/SalesOrderForms.tsx:419 msgid "Leave blank to use the order address" msgstr "" @@ -5932,6 +5939,9 @@ msgstr "" #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:310 #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:401 +#: src/tables/build/BuildAllocatedStockTable.tsx:181 +#: src/tables/build/BuildLineTable.tsx:668 +#: src/tables/sales/SalesOrderAllocationTable.tsx:220 msgid "Confirm Removal" msgstr "" @@ -6870,8 +6880,8 @@ msgstr "Spoljno" #: src/pages/sales/ReturnOrderDetail.tsx:108 #: src/pages/sales/SalesOrderDetail.tsx:98 #: src/tables/ColumnRenderers.tsx:321 -#: src/tables/build/BuildAllocatedStockTable.tsx:115 -#: src/tables/build/BuildLineTable.tsx:352 +#: src/tables/build/BuildAllocatedStockTable.tsx:112 +#: src/tables/build/BuildLineTable.tsx:353 msgid "Reference" msgstr "Referenca" @@ -7132,7 +7142,7 @@ msgstr "Otkaži nalog" #: src/pages/build/BuildDetail.tsx:742 #: src/pages/stock/StockDetail.tsx:344 -#: src/tables/build/BuildAllocatedStockTable.tsx:85 +#: src/tables/build/BuildAllocatedStockTable.tsx:82 #: src/tables/part/PartBuildAllocationsTable.tsx:45 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:157 #: src/tables/stock/StockTrackingTable.tsx:109 @@ -7600,7 +7610,7 @@ msgstr "Ključne reči" #: src/pages/part/PartDetail.tsx:542 #: src/tables/bom/BomTable.tsx:439 -#: src/tables/build/BuildLineTable.tsx:305 +#: src/tables/build/BuildLineTable.tsx:306 #: src/tables/part/PartTable.tsx:319 #: src/tables/sales/SalesOrderLineItemTable.tsx:138 msgid "Available Stock" @@ -7608,7 +7618,7 @@ msgstr "Dostupne zalihe" #: src/pages/part/PartDetail.tsx:548 #: src/tables/bom/BomTable.tsx:341 -#: src/tables/build/BuildLineTable.tsx:267 +#: src/tables/build/BuildLineTable.tsx:268 #: src/tables/sales/SalesOrderLineItemTable.tsx:180 msgid "On order" msgstr "Na nalogu" @@ -7782,7 +7792,7 @@ msgstr "Nalog" #: src/pages/part/PartDetail.tsx:1144 #: src/pages/stock/StockDetail.tsx:884 -#: src/tables/build/BuildLineTable.tsx:761 +#: src/tables/build/BuildLineTable.tsx:768 msgid "Order Stock" msgstr "Naruči zalihe" @@ -9219,13 +9229,13 @@ msgstr "" #~ msgstr "Show asssmbled items" #: src/tables/bom/BomTable.tsx:315 -#: src/tables/build/BuildLineTable.tsx:276 +#: src/tables/build/BuildLineTable.tsx:277 #: src/tables/part/PartTable.tsx:145 msgid "External stock" msgstr "Spoljne zalihe" #: src/tables/bom/BomTable.tsx:323 -#: src/tables/build/BuildLineTable.tsx:239 +#: src/tables/build/BuildLineTable.tsx:240 msgid "Includes substitute stock" msgstr "Uključuje zamenske zalihe" @@ -9234,7 +9244,7 @@ msgstr "Uključuje zamenske zalihe" #~ msgstr "Edit Bom Item" #: src/tables/bom/BomTable.tsx:332 -#: src/tables/build/BuildLineTable.tsx:249 +#: src/tables/build/BuildLineTable.tsx:250 #: src/tables/sales/SalesOrderLineItemTable.tsx:166 msgid "Includes variant stock" msgstr "Uključuje zalihe varijanti" @@ -9272,8 +9282,8 @@ msgid "Stock Information" msgstr "Informacije o zalihama" #: src/tables/bom/BomTable.tsx:399 -#: src/tables/build/BuildLineTable.tsx:496 -#: src/tables/build/BuildLineTable.tsx:537 +#: src/tables/build/BuildLineTable.tsx:497 +#: src/tables/build/BuildLineTable.tsx:538 msgid "Consumable item" msgstr "Potrošna stavka" @@ -9282,7 +9292,7 @@ msgid "No available stock" msgstr "Nema dostupnih zaliha" #: src/tables/bom/BomTable.tsx:420 -#: src/tables/build/BuildLineTable.tsx:213 +#: src/tables/build/BuildLineTable.tsx:214 msgid "Show testable items" msgstr "Prikaži stavke koje mogu da se testiraju" @@ -9291,7 +9301,7 @@ msgid "Show trackable items" msgstr "Prikaži stavke koje mogu da se prate" #: src/tables/bom/BomTable.tsx:430 -#: src/tables/build/BuildLineTable.tsx:208 +#: src/tables/build/BuildLineTable.tsx:209 msgid "Show assembled items" msgstr "Prikaži sklopljene stavke" @@ -9335,7 +9345,7 @@ msgstr "Prikaži stavke koje dozvoljavaju zamenu varijanti" #: src/tables/bom/BomTable.tsx:464 #: src/tables/bom/UsedInTable.tsx:85 -#: src/tables/build/BuildLineTable.tsx:202 +#: src/tables/build/BuildLineTable.tsx:203 msgid "Optional" msgstr "Opciono" @@ -9345,7 +9355,7 @@ msgid "Show optional items" msgstr "Prikaži opcione stavke" #: src/tables/bom/BomTable.tsx:469 -#: src/tables/build/BuildLineTable.tsx:197 +#: src/tables/build/BuildLineTable.tsx:198 msgid "Consumable" msgstr "Potrošno" @@ -9433,7 +9443,7 @@ msgid "Bill of materials cannot be edited, as the part is locked" msgstr "Spisak materijala ne može da se menja, deo je zaključan" #: src/tables/bom/UsedInTable.tsx:34 -#: src/tables/build/BuildLineTable.tsx:207 +#: src/tables/build/BuildLineTable.tsx:208 #: src/tables/part/ParametricPartTable.tsx:364 #: src/tables/part/PartBuildAllocationsTable.tsx:60 #: src/tables/part/PartTable.tsx:209 @@ -9455,11 +9465,11 @@ msgstr "Može da se prati" msgid "Show trackable assemblies" msgstr "Prikaži sklopove koji mogu da se prate" -#: src/tables/build/BuildAllocatedStockTable.tsx:67 +#: src/tables/build/BuildAllocatedStockTable.tsx:64 msgid "Allocated to Output" msgstr "Alocirano za izlaz" -#: src/tables/build/BuildAllocatedStockTable.tsx:68 +#: src/tables/build/BuildAllocatedStockTable.tsx:65 msgid "Show items allocated to a build output" msgstr "Prikaži stavke alocirane nalogu za izradu" @@ -9472,7 +9482,7 @@ msgstr "Prikaži stavke alocirane nalogu za izradu" #~ msgid "Include orders for part variants" #~ msgstr "Include orders for part variants" -#: src/tables/build/BuildAllocatedStockTable.tsx:97 +#: src/tables/build/BuildAllocatedStockTable.tsx:94 #: src/tables/part/PartBuildAllocationsTable.tsx:84 #: src/tables/part/PartPurchaseOrdersTable.tsx:132 #: src/tables/part/PartSalesAllocationsTable.tsx:69 @@ -9482,40 +9492,58 @@ msgid "Order Status" msgstr "Status narudžbenice" #: src/tables/build/BuildAllocatedStockTable.tsx:164 -#~ msgid "Edit Build Item" -#~ msgstr "Edit Build Item" - -#: src/tables/build/BuildAllocatedStockTable.tsx:167 -#: src/tables/build/BuildLineTable.tsx:650 +#: src/tables/build/BuildLineTable.tsx:651 msgid "Edit Stock Allocation" msgstr "Izmeni alokaciju zaliha" +#: src/tables/build/BuildAllocatedStockTable.tsx:164 +#~ msgid "Edit Build Item" +#~ msgstr "Edit Build Item" + #: src/tables/build/BuildAllocatedStockTable.tsx:174 #~ msgid "Delete Build Item" #~ msgstr "Delete Build Item" +#: src/tables/build/BuildAllocatedStockTable.tsx:177 +#: src/tables/build/BuildLineTable.tsx:664 +#: src/tables/sales/SalesOrderAllocationTable.tsx:218 +msgid "Remove Allocated Stock" +msgstr "" + #: src/tables/build/BuildAllocatedStockTable.tsx:180 #: src/tables/build/BuildLineTable.tsx:663 -msgid "Delete Stock Allocation" -msgstr "Obriši alokaciju zaliha" +#~ msgid "Delete Stock Allocation" +#~ msgstr "Delete Stock Allocation" -#: src/tables/build/BuildAllocatedStockTable.tsx:239 +#: src/tables/build/BuildAllocatedStockTable.tsx:182 +#: src/tables/build/BuildLineTable.tsx:669 +#: src/tables/sales/SalesOrderAllocationTable.tsx:221 +msgid "Are you sure you want to remove this allocated stock from the order?" +msgstr "" + +#: src/tables/build/BuildAllocatedStockTable.tsx:242 msgid "Consume" msgstr "" +#: src/tables/build/BuildAllocatedStockTable.tsx:259 +#: src/tables/build/BuildLineTable.tsx:112 +#: src/tables/sales/SalesOrderAllocationTable.tsx:248 +msgid "Remove allocated stock" +msgstr "" + #: src/tables/build/BuildLineTable.tsx:59 #~ msgid "Show lines with available stock" #~ msgstr "Show lines with available stock" -#: src/tables/build/BuildLineTable.tsx:120 +#: src/tables/build/BuildLineTable.tsx:121 msgid "View Stock Item" msgstr "Pogledaj stavku" -#: src/tables/build/BuildLineTable.tsx:183 +#: src/tables/build/BuildLineTable.tsx:184 msgid "Show fully allocated lines" msgstr "" -#: src/tables/build/BuildLineTable.tsx:188 +#: src/tables/build/BuildLineTable.tsx:189 msgid "Show fully consumed lines" msgstr "" @@ -9523,124 +9551,124 @@ msgstr "" #~ msgid "Show allocated lines" #~ msgstr "Show allocated lines" -#: src/tables/build/BuildLineTable.tsx:193 +#: src/tables/build/BuildLineTable.tsx:194 msgid "Show items with sufficient available stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:198 +#: src/tables/build/BuildLineTable.tsx:199 msgid "Show consumable lines" msgstr "Prikaži potrošne stavke" -#: src/tables/build/BuildLineTable.tsx:203 +#: src/tables/build/BuildLineTable.tsx:204 msgid "Show optional lines" msgstr "Prikaži opcione stavke" -#: src/tables/build/BuildLineTable.tsx:212 +#: src/tables/build/BuildLineTable.tsx:213 #: src/tables/part/PartTable.tsx:233 msgid "Testable" msgstr "Moguće testirate" -#: src/tables/build/BuildLineTable.tsx:217 +#: src/tables/build/BuildLineTable.tsx:218 #: src/tables/stock/StockItemTable.tsx:388 msgid "Tracked" msgstr "Praćeno" -#: src/tables/build/BuildLineTable.tsx:218 +#: src/tables/build/BuildLineTable.tsx:219 msgid "Show tracked lines" msgstr "Prikaži praćene stavke" -#: src/tables/build/BuildLineTable.tsx:223 +#: src/tables/build/BuildLineTable.tsx:224 msgid "Show items with stock on order" msgstr "" -#: src/tables/build/BuildLineTable.tsx:258 +#: src/tables/build/BuildLineTable.tsx:259 #: src/tables/sales/SalesOrderLineItemTable.tsx:172 msgid "In production" msgstr "U produkciji" -#: src/tables/build/BuildLineTable.tsx:286 +#: src/tables/build/BuildLineTable.tsx:287 msgid "Insufficient stock" msgstr "Nedovoljno zaliha" -#: src/tables/build/BuildLineTable.tsx:302 +#: src/tables/build/BuildLineTable.tsx:303 #: src/tables/sales/SalesOrderLineItemTable.tsx:160 #: src/tables/stock/StockItemTable.tsx:191 msgid "No stock available" msgstr "Nema dostupnih zaliha" -#: src/tables/build/BuildLineTable.tsx:375 +#: src/tables/build/BuildLineTable.tsx:376 msgid "Gets Inherited" msgstr "Biva nasleđeno" -#: src/tables/build/BuildLineTable.tsx:388 +#: src/tables/build/BuildLineTable.tsx:389 msgid "Unit Quantity" msgstr "Količina po jedinici" -#: src/tables/build/BuildLineTable.tsx:415 +#: src/tables/build/BuildLineTable.tsx:416 msgid "Setup Quantity" msgstr "" -#: src/tables/build/BuildLineTable.tsx:424 +#: src/tables/build/BuildLineTable.tsx:425 msgid "Attrition" msgstr "" -#: src/tables/build/BuildLineTable.tsx:432 +#: src/tables/build/BuildLineTable.tsx:433 msgid "Rounding Multiple" msgstr "" -#: src/tables/build/BuildLineTable.tsx:441 +#: src/tables/build/BuildLineTable.tsx:442 msgid "BOM Information" msgstr "" -#: src/tables/build/BuildLineTable.tsx:515 +#: src/tables/build/BuildLineTable.tsx:516 #: src/tables/part/PartBuildAllocationsTable.tsx:102 msgid "Fully allocated" msgstr "" -#: src/tables/build/BuildLineTable.tsx:563 +#: src/tables/build/BuildLineTable.tsx:564 #: src/tables/sales/SalesOrderLineItemTable.tsx:311 msgid "Create Build Order" msgstr "Kreiraj nalog za izradu" -#: src/tables/build/BuildLineTable.tsx:592 +#: src/tables/build/BuildLineTable.tsx:593 msgid "Auto allocation in progress" msgstr "Automatska alokacija u toku" -#: src/tables/build/BuildLineTable.tsx:595 -#: src/tables/build/BuildLineTable.tsx:802 +#: src/tables/build/BuildLineTable.tsx:596 +#: src/tables/build/BuildLineTable.tsx:809 msgid "Auto Allocate Stock" msgstr "Automatski alociraj zalihe" -#: src/tables/build/BuildLineTable.tsx:596 +#: src/tables/build/BuildLineTable.tsx:597 msgid "Automatically allocate stock to this build according to the selected options" msgstr "Automatski alociraj zalihe ovom nalogu prema izabranim opcijama" -#: src/tables/build/BuildLineTable.tsx:616 -#: src/tables/build/BuildLineTable.tsx:630 -#: src/tables/build/BuildLineTable.tsx:751 -#: src/tables/build/BuildLineTable.tsx:852 +#: src/tables/build/BuildLineTable.tsx:617 +#: src/tables/build/BuildLineTable.tsx:631 +#: src/tables/build/BuildLineTable.tsx:758 +#: src/tables/build/BuildLineTable.tsx:859 #: src/tables/build/BuildOutputTable.tsx:355 #: src/tables/build/BuildOutputTable.tsx:360 msgid "Deallocate Stock" msgstr "Dealociraj zalihe" -#: src/tables/build/BuildLineTable.tsx:632 +#: src/tables/build/BuildLineTable.tsx:633 msgid "Deallocate all untracked stock for this build order" msgstr "Dealociraj sve nepraćene zalihe sa ovog naloga za izradu" -#: src/tables/build/BuildLineTable.tsx:634 +#: src/tables/build/BuildLineTable.tsx:635 msgid "Deallocate stock from the selected line item" msgstr "Dealociraj zalihe sa odabrane stavke" -#: src/tables/build/BuildLineTable.tsx:638 +#: src/tables/build/BuildLineTable.tsx:639 msgid "Stock has been deallocated" msgstr "Zalihe su dealocirane" -#: src/tables/build/BuildLineTable.tsx:771 +#: src/tables/build/BuildLineTable.tsx:778 msgid "Build Stock" msgstr "Kreiraj zalihe" -#: src/tables/build/BuildLineTable.tsx:784 +#: src/tables/build/BuildLineTable.tsx:791 #: src/tables/sales/SalesOrderLineItemTable.tsx:487 msgid "View Part" msgstr "Pogledaj deo" @@ -9739,7 +9767,7 @@ msgid "Serialize Build Output" msgstr "" #: src/tables/build/BuildOutputTable.tsx:405 -#: src/tables/part/PartTestResultTable.tsx:310 +#: src/tables/part/PartTestResultTable.tsx:318 #: src/tables/stock/StockItemTable.tsx:328 msgid "Filter by stock status" msgstr "Filtriraj po statusu zaliha" @@ -9964,8 +9992,8 @@ msgid "View Item" msgstr "Pogledaj stavku" #: src/tables/general/ExtraLineItemTable.tsx:95 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:299 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:403 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:300 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:405 #: src/tables/sales/ReturnOrderLineItemTable.tsx:83 #: src/tables/sales/ReturnOrderLineItemTable.tsx:187 #: src/tables/sales/SalesOrderLineItemTable.tsx:252 @@ -9974,14 +10002,14 @@ msgid "Add Line Item" msgstr "Dodaj stavku" #: src/tables/general/ExtraLineItemTable.tsx:108 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:320 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:322 #: src/tables/sales/ReturnOrderLineItemTable.tsx:96 #: src/tables/sales/SalesOrderLineItemTable.tsx:271 msgid "Edit Line Item" msgstr "Izmeni stavku" #: src/tables/general/ExtraLineItemTable.tsx:117 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:329 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:331 #: src/tables/sales/ReturnOrderLineItemTable.tsx:105 #: src/tables/sales/SalesOrderLineItemTable.tsx:280 msgid "Delete Line Item" @@ -10273,7 +10301,7 @@ msgid "Required Stock" msgstr "Potrebne zalihe" #: src/tables/part/PartBuildAllocationsTable.tsx:124 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:381 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:383 msgid "View Build Order" msgstr "Prikaži nalog za izradu" @@ -10617,8 +10645,8 @@ msgstr "" #: src/tables/part/PartTestResultTable.tsx:103 #: src/tables/part/PartTestResultTable.tsx:181 -#: src/tables/part/PartTestResultTable.tsx:320 -#: src/tables/part/PartTestResultTable.tsx:334 +#: src/tables/part/PartTestResultTable.tsx:328 +#: src/tables/part/PartTestResultTable.tsx:342 #: src/tables/stock/StockItemTestResultTable.tsx:296 #: src/tables/stock/StockItemTestResultTable.tsx:368 #: src/tables/stock/StockItemTestResultTable.tsx:429 @@ -10643,7 +10671,7 @@ msgstr "" msgid "No Result" msgstr "Nema rezultata" -#: src/tables/part/PartTestResultTable.tsx:298 +#: src/tables/part/PartTestResultTable.tsx:306 msgid "Show build outputs currently in production" msgstr "Prikaži naloge za izradu koji su u produkciji" @@ -11073,7 +11101,7 @@ msgid "Show manufacturer parts for active manufacturers." msgstr "" #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:115 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:397 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:399 msgid "Import Line Items" msgstr "Uvezi stavke" @@ -11099,11 +11127,11 @@ msgstr "Prikaži stavke koje su primljene" #~ msgid "Add line item" #~ msgstr "Add line item" -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:350 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:352 msgid "Receive line item" msgstr "Primi stavku" -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:414 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:416 msgid "Receive items" msgstr "Primi stavke" @@ -11201,25 +11229,25 @@ msgid "Not shipped" msgstr "Nije isporučeno" #: src/tables/sales/SalesOrderAllocationTable.tsx:211 -#: src/tables/sales/SalesOrderAllocationTable.tsx:229 +#: src/tables/sales/SalesOrderAllocationTable.tsx:235 msgid "Edit Allocation" msgstr "Izmeni alokaciju" #: src/tables/sales/SalesOrderAllocationTable.tsx:218 #: src/tables/sales/SalesOrderAllocationTable.tsx:241 -msgid "Delete Allocation" -msgstr "Obriši alokaciju" +#~ msgid "Delete Allocation" +#~ msgstr "Delete Allocation" -#: src/tables/sales/SalesOrderAllocationTable.tsx:252 -#: src/tables/sales/SalesOrderAllocationTable.tsx:253 +#: src/tables/sales/SalesOrderAllocationTable.tsx:261 +#: src/tables/sales/SalesOrderAllocationTable.tsx:262 msgid "View Shipment" msgstr "Pogledaj isporuku" -#: src/tables/sales/SalesOrderAllocationTable.tsx:308 +#: src/tables/sales/SalesOrderAllocationTable.tsx:317 msgid "Assign to Shipment" msgstr "" -#: src/tables/sales/SalesOrderAllocationTable.tsx:324 +#: src/tables/sales/SalesOrderAllocationTable.tsx:333 msgid "Assign to shipment" msgstr "" diff --git a/src/frontend/src/locales/sv/messages.po b/src/frontend/src/locales/sv/messages.po index d1fb0b10a1..c719f8ef91 100644 --- a/src/frontend/src/locales/sv/messages.po +++ b/src/frontend/src/locales/sv/messages.po @@ -8,7 +8,7 @@ msgstr "" "Language: sv\n" "Project-Id-Version: inventree\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2025-11-19 19:39\n" +"PO-Revision-Date: 2025-11-22 06:25\n" "Last-Translator: \n" "Language-Team: Swedish\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" @@ -56,7 +56,7 @@ msgstr "Avbryt" #: lib/components/RowActions.tsx:136 #: src/components/nav/NavigationDrawer.tsx:190 -#: src/forms/PurchaseOrderForms.tsx:802 +#: src/forms/PurchaseOrderForms.tsx:854 #: src/forms/StockForms.tsx:796 #: src/forms/StockForms.tsx:843 #: src/forms/StockForms.tsx:889 @@ -103,9 +103,9 @@ msgstr "Nej" #: src/forms/BuildForms.tsx:630 #: src/forms/BuildForms.tsx:793 #: src/forms/BuildForms.tsx:896 -#: src/forms/PurchaseOrderForms.tsx:798 +#: src/forms/PurchaseOrderForms.tsx:850 #: src/forms/ReturnOrderForms.tsx:242 -#: src/forms/SalesOrderForms.tsx:305 +#: src/forms/SalesOrderForms.tsx:323 #: src/forms/StockForms.tsx:360 #: src/forms/StockForms.tsx:791 #: src/forms/StockForms.tsx:838 @@ -119,6 +119,7 @@ msgstr "Nej" #: src/pages/build/BuildDetail.tsx:200 #: src/pages/part/PartDetail.tsx:1207 #: src/tables/ColumnRenderers.tsx:91 +#: src/tables/part/PartTestResultTable.tsx:247 #: src/tables/part/RelatedPartTable.tsx:53 #: src/tables/stock/StockTrackingTable.tsx:87 msgid "Part" @@ -158,7 +159,7 @@ msgstr "Testmall för artiklar" #: src/components/wizards/OrderPartsWizard.tsx:290 #: src/pages/company/SupplierPartDetail.tsx:413 #: src/pages/stock/StockDetail.tsx:289 -#: src/tables/build/BuildAllocatedStockTable.tsx:155 +#: src/tables/build/BuildAllocatedStockTable.tsx:152 #: src/tables/part/PartPurchaseOrdersTable.tsx:50 #: src/tables/purchasing/SupplierPartTable.tsx:83 #: src/tables/stock/StockItemTable.tsx:247 @@ -201,9 +202,9 @@ msgstr "Artikelkategorier" #: src/forms/BuildForms.tsx:473 #: src/forms/BuildForms.tsx:633 #: src/forms/BuildForms.tsx:794 -#: src/forms/SalesOrderForms.tsx:307 +#: src/forms/SalesOrderForms.tsx:325 #: src/pages/stock/StockDetail.tsx:1005 -#: src/tables/part/PartTestResultTable.tsx:248 +#: src/tables/part/PartTestResultTable.tsx:256 #: src/tables/stock/StockTrackingTable.tsx:48 #: src/tables/stock/StockTrackingTable.tsx:55 msgid "Stock Item" @@ -517,7 +518,7 @@ msgstr "" #: src/components/dashboard/DashboardLayout.tsx:281 #: src/components/editors/NotesEditor.tsx:74 #: src/components/editors/TemplateEditor/TemplateEditor.tsx:158 -#: src/components/forms/fields/ApiFormField.tsx:273 +#: src/components/forms/fields/ApiFormField.tsx:237 #: src/components/forms/fields/TableField.tsx:45 #: src/components/importer/ImportDataSelector.tsx:192 #: src/components/importer/ImporterColumnSelector.tsx:234 @@ -642,8 +643,8 @@ msgstr "" #: src/components/barcodes/BarcodeScanDialog.tsx:49 #: src/components/buttons/ScanButton.tsx:15 #: src/components/nav/NavigationDrawer.tsx:122 -#: src/forms/PurchaseOrderForms.tsx:457 -#: src/forms/PurchaseOrderForms.tsx:563 +#: src/forms/PurchaseOrderForms.tsx:509 +#: src/forms/PurchaseOrderForms.tsx:615 msgid "Scan Barcode" msgstr "Skanna streckkod" @@ -728,7 +729,7 @@ msgstr "" #: src/components/barcodes/QRCode.tsx:205 #: src/components/items/ActionDropdown.tsx:192 -#: src/forms/PurchaseOrderForms.tsx:554 +#: src/forms/PurchaseOrderForms.tsx:606 msgid "Unlink Barcode" msgstr "Ta bort länk för streckkod" @@ -1216,6 +1217,12 @@ msgstr "Vill du ta bort den associerade bilden från denna artikel?" #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:884 #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:903 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:254 +#: src/tables/build/BuildAllocatedStockTable.tsx:178 +#: src/tables/build/BuildAllocatedStockTable.tsx:258 +#: src/tables/build/BuildLineTable.tsx:111 +#: src/tables/build/BuildLineTable.tsx:665 +#: src/tables/sales/SalesOrderAllocationTable.tsx:224 +#: src/tables/sales/SalesOrderAllocationTable.tsx:247 msgid "Remove" msgstr "Ta bort" @@ -1241,7 +1248,7 @@ msgid "Upload Error" msgstr "Uppladdningsfel" #: src/components/details/DetailsImage.tsx:250 -#: src/components/forms/fields/TextField.tsx:65 +#: src/components/forms/fields/AutoFillRightSection.tsx:34 msgid "Clear" msgstr "Rensa" @@ -1817,10 +1824,14 @@ msgstr "Stoppad" msgid "Running" msgstr "" -#: src/components/forms/fields/ApiFormField.tsx:233 +#: src/components/forms/fields/ApiFormField.tsx:197 msgid "Select file to upload" msgstr "" +#: src/components/forms/fields/AutoFillRightSection.tsx:47 +msgid "Accept suggested value" +msgstr "" + #: src/components/forms/fields/DateField.tsx:76 msgid "Select date" msgstr "Välj datum" @@ -1875,10 +1886,6 @@ msgstr "Inga poster tillgängliga" msgid "Add new row" msgstr "Lägg till ny rad" -#: src/components/forms/fields/TextField.tsx:82 -msgid "Accept suggested value" -msgstr "" - #: src/components/images/DetailsImage.tsx:252 #~ msgid "Select image" #~ msgstr "Select image" @@ -2225,8 +2232,8 @@ msgstr "" #: src/pages/part/PartDetail.tsx:994 #: src/pages/stock/StockDetail.tsx:265 #: src/pages/stock/StockDetail.tsx:942 -#: src/tables/build/BuildAllocatedStockTable.tsx:135 -#: src/tables/build/BuildLineTable.tsx:192 +#: src/tables/build/BuildAllocatedStockTable.tsx:132 +#: src/tables/build/BuildLineTable.tsx:193 #: src/tables/part/PartTable.tsx:137 #: src/tables/stock/StockItemTable.tsx:182 #: src/tables/stock/StockItemTable.tsx:343 @@ -2784,7 +2791,7 @@ msgstr "" #: src/pages/sales/SalesOrderDetail.tsx:119 #: src/pages/stock/LocationDetail.tsx:102 #: src/tables/ColumnRenderers.tsx:278 -#: src/tables/build/BuildAllocatedStockTable.tsx:91 +#: src/tables/build/BuildAllocatedStockTable.tsx:88 #: src/tables/machine/MachineTypeTable.tsx:161 #: src/tables/machine/MachineTypeTable.tsx:257 #: src/tables/plugin/PluginListTable.tsx:110 @@ -2966,7 +2973,7 @@ msgstr "Inget på lager" #: src/pages/company/SupplierPartDetail.tsx:394 #: src/pages/part/PartDetail.tsx:1015 #: src/tables/bom/BomTable.tsx:444 -#: src/tables/build/BuildLineTable.tsx:222 +#: src/tables/build/BuildLineTable.tsx:223 #: src/tables/part/PartTable.tsx:108 msgid "On Order" msgstr "På order" @@ -2976,7 +2983,7 @@ msgstr "På order" #: src/pages/part/PartDetail.tsx:587 #: src/pages/part/PartDetail.tsx:1021 #: src/pages/stock/StockDetail.tsx:925 -#: src/tables/part/PartTestResultTable.tsx:297 +#: src/tables/part/PartTestResultTable.tsx:305 #: src/tables/stock/StockItemTable.tsx:359 msgid "In Production" msgstr "Under produktion" @@ -3000,7 +3007,7 @@ msgstr "Kategori" #: src/components/render/Stock.tsx:114 #: src/components/render/Stock.tsx:132 #: src/forms/BuildForms.tsx:795 -#: src/forms/PurchaseOrderForms.tsx:595 +#: src/forms/PurchaseOrderForms.tsx:647 #: src/forms/StockForms.tsx:792 #: src/forms/StockForms.tsx:839 #: src/forms/StockForms.tsx:885 @@ -3023,7 +3030,7 @@ msgstr "Plats" #: src/components/render/Stock.tsx:99 #: src/pages/stock/StockDetail.tsx:198 #: src/pages/stock/StockDetail.tsx:930 -#: src/tables/build/BuildAllocatedStockTable.tsx:121 +#: src/tables/build/BuildAllocatedStockTable.tsx:118 #: src/tables/build/BuildOutputTable.tsx:107 #: src/tables/sales/SalesOrderAllocationTable.tsx:142 msgid "Serial Number" @@ -3034,9 +3041,9 @@ msgstr "Serienummer" #: src/forms/BuildForms.tsx:240 #: src/forms/BuildForms.tsx:634 #: src/forms/BuildForms.tsx:797 -#: src/forms/PurchaseOrderForms.tsx:801 +#: src/forms/PurchaseOrderForms.tsx:853 #: src/forms/ReturnOrderForms.tsx:243 -#: src/forms/SalesOrderForms.tsx:308 +#: src/forms/SalesOrderForms.tsx:326 #: src/forms/StockForms.tsx:841 #: src/pages/part/PartStockHistoryDetail.tsx:56 #: src/pages/part/PartStockHistoryDetail.tsx:210 @@ -3046,9 +3053,9 @@ msgstr "Serienummer" #: src/pages/part/pricing/PriceBreakPanel.tsx:172 #: src/pages/stock/StockDetail.tsx:258 #: src/pages/stock/StockDetail.tsx:936 -#: src/tables/build/BuildLineTable.tsx:86 +#: src/tables/build/BuildLineTable.tsx:83 #: src/tables/part/PartPurchaseOrdersTable.tsx:94 -#: src/tables/part/PartTestResultTable.tsx:269 +#: src/tables/part/PartTestResultTable.tsx:277 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:175 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:206 #: src/tables/purchasing/SupplierPriceBreakTable.tsx:69 @@ -3070,7 +3077,7 @@ msgstr "Antal" #: src/forms/StockForms.tsx:1048 #: src/forms/StockForms.tsx:1096 #: src/forms/StockForms.tsx:1140 -#: src/tables/build/BuildLineTable.tsx:96 +#: src/tables/build/BuildLineTable.tsx:93 msgid "Batch" msgstr "" @@ -3755,7 +3762,7 @@ msgid "In Stock" msgstr "" #: src/components/wizards/OrderPartsWizard.tsx:146 -#: src/tables/build/BuildLineTable.tsx:404 +#: src/tables/build/BuildLineTable.tsx:405 msgid "Required Quantity" msgstr "" @@ -3847,7 +3854,7 @@ msgid "Please correct the errors in the selected parts" msgstr "" #: src/components/wizards/OrderPartsWizard.tsx:587 -#: src/tables/build/BuildLineTable.tsx:815 +#: src/tables/build/BuildLineTable.tsx:822 #: src/tables/part/PartTable.tsx:522 #: src/tables/sales/SalesOrderLineItemTable.tsx:370 msgid "Order Parts" @@ -4349,9 +4356,9 @@ msgstr "" #: src/forms/BuildForms.tsx:333 #: src/forms/BuildForms.tsx:408 #: src/forms/BuildForms.tsx:685 -#: src/tables/build/BuildAllocatedStockTable.tsx:150 +#: src/tables/build/BuildAllocatedStockTable.tsx:147 #: src/tables/build/BuildOutputTable.tsx:582 -#: src/tables/part/PartTestResultTable.tsx:272 +#: src/tables/part/PartTestResultTable.tsx:280 msgid "Build Output" msgstr "" @@ -4362,7 +4369,7 @@ msgstr "" #: src/forms/BuildForms.tsx:336 #: src/forms/BuildForms.tsx:411 #: src/forms/BuildForms.tsx:475 -#: src/forms/PurchaseOrderForms.tsx:717 +#: src/forms/PurchaseOrderForms.tsx:769 #: src/forms/ReturnOrderForms.tsx:197 #: src/forms/ReturnOrderForms.tsx:244 #: src/forms/StockForms.tsx:712 @@ -4377,7 +4384,7 @@ msgstr "" #: src/tables/build/BuildOutputTable.tsx:404 #: src/tables/machine/MachineListTable.tsx:387 #: src/tables/part/PartPurchaseOrdersTable.tsx:38 -#: src/tables/part/PartTestResultTable.tsx:309 +#: src/tables/part/PartTestResultTable.tsx:317 #: src/tables/sales/ReturnOrderLineItemTable.tsx:138 #: src/tables/sales/ReturnOrderLineItemTable.tsx:176 #: src/tables/settings/CustomStateTable.tsx:79 @@ -4450,8 +4457,8 @@ msgstr "Tillverkade produkter har raderats" #: src/pages/stock/StockDetail.tsx:153 #: src/tables/bom/BomTable.tsx:134 #: src/tables/bom/UsedInTable.tsx:40 -#: src/tables/build/BuildAllocatedStockTable.tsx:108 -#: src/tables/build/BuildLineTable.tsx:336 +#: src/tables/build/BuildAllocatedStockTable.tsx:105 +#: src/tables/build/BuildLineTable.tsx:337 #: src/tables/build/BuildOrderTable.tsx:79 #: src/tables/part/PartSalesAllocationsTable.tsx:61 #: src/tables/part/RelatedPartTable.tsx:73 @@ -4466,47 +4473,47 @@ msgstr "IAN" #: src/forms/BuildForms.tsx:632 #: src/forms/BuildForms.tsx:796 #: src/forms/BuildForms.tsx:897 -#: src/forms/SalesOrderForms.tsx:306 -#: src/tables/build/BuildAllocatedStockTable.tsx:139 -#: src/tables/build/BuildLineTable.tsx:182 +#: src/forms/SalesOrderForms.tsx:324 +#: src/tables/build/BuildAllocatedStockTable.tsx:136 +#: src/tables/build/BuildLineTable.tsx:183 #: src/tables/sales/SalesOrderLineItemTable.tsx:342 #: src/tables/stock/StockItemTable.tsx:338 msgid "Allocated" msgstr "Allokerad" #: src/forms/BuildForms.tsx:667 -#: src/forms/SalesOrderForms.tsx:295 +#: src/forms/SalesOrderForms.tsx:313 #: src/pages/build/BuildDetail.tsx:108 #: src/pages/build/BuildDetail.tsx:326 msgid "Source Location" msgstr "" #: src/forms/BuildForms.tsx:668 -#: src/forms/SalesOrderForms.tsx:296 +#: src/forms/SalesOrderForms.tsx:314 msgid "Select the source location for the stock allocation" msgstr "" #: src/forms/BuildForms.tsx:700 -#: src/forms/SalesOrderForms.tsx:336 -#: src/tables/build/BuildLineTable.tsx:574 -#: src/tables/build/BuildLineTable.tsx:731 -#: src/tables/build/BuildLineTable.tsx:830 +#: src/forms/SalesOrderForms.tsx:354 +#: src/tables/build/BuildLineTable.tsx:575 +#: src/tables/build/BuildLineTable.tsx:738 +#: src/tables/build/BuildLineTable.tsx:837 #: src/tables/sales/SalesOrderLineItemTable.tsx:380 #: src/tables/sales/SalesOrderLineItemTable.tsx:406 msgid "Allocate Stock" msgstr "" #: src/forms/BuildForms.tsx:703 -#: src/forms/SalesOrderForms.tsx:341 +#: src/forms/SalesOrderForms.tsx:359 msgid "Stock items allocated" msgstr "" #: src/forms/BuildForms.tsx:816 #: src/forms/BuildForms.tsx:917 -#: src/tables/build/BuildAllocatedStockTable.tsx:240 -#: src/tables/build/BuildAllocatedStockTable.tsx:272 -#: src/tables/build/BuildLineTable.tsx:741 -#: src/tables/build/BuildLineTable.tsx:864 +#: src/tables/build/BuildAllocatedStockTable.tsx:243 +#: src/tables/build/BuildAllocatedStockTable.tsx:279 +#: src/tables/build/BuildLineTable.tsx:748 +#: src/tables/build/BuildLineTable.tsx:871 msgid "Consume Stock" msgstr "" @@ -4521,21 +4528,21 @@ msgstr "" #~ msgstr "Stock items consumed" #: src/forms/BuildForms.tsx:853 -#: src/tables/build/BuildLineTable.tsx:514 +#: src/tables/build/BuildLineTable.tsx:515 #: src/tables/part/PartBuildAllocationsTable.tsx:101 msgid "Fully consumed" msgstr "" #: src/forms/BuildForms.tsx:898 -#: src/tables/build/BuildLineTable.tsx:187 +#: src/tables/build/BuildLineTable.tsx:188 #: src/tables/stock/StockItemTable.tsx:367 msgid "Consumed" msgstr "" #: src/forms/CommonForms.tsx:88 -#: src/forms/PurchaseOrderForms.tsx:125 +#: src/forms/PurchaseOrderForms.tsx:176 #: src/forms/ReturnOrderForms.tsx:138 -#: src/forms/SalesOrderForms.tsx:164 +#: src/forms/SalesOrderForms.tsx:182 msgid "Select project code for this line item" msgstr "" @@ -4572,127 +4579,127 @@ msgstr "Överordnad kategori" msgid "Subscribe to notifications for this category" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:388 -msgid "Assign Batch Code and Serial Numbers" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:390 -msgid "Assign Batch Code" -msgstr "Tilldela streckkod" - -#: src/forms/PurchaseOrderForms.tsx:410 -msgid "Choose Location" -msgstr "Välj plats" - -#: src/forms/PurchaseOrderForms.tsx:418 -msgid "Item Destination selected" -msgstr "" - #: src/forms/PurchaseOrderForms.tsx:421 #~ msgid "Assign Batch Code{0}" #~ msgstr "Assign Batch Code{0}" -#: src/forms/PurchaseOrderForms.tsx:428 -msgid "Part category default location selected" +#: src/forms/PurchaseOrderForms.tsx:440 +msgid "Assign Batch Code and Serial Numbers" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:438 -msgid "Received stock location selected" -msgstr "" +#: src/forms/PurchaseOrderForms.tsx:442 +msgid "Assign Batch Code" +msgstr "Tilldela streckkod" #: src/forms/PurchaseOrderForms.tsx:444 #: src/forms/StockForms.tsx:428 #~ msgid "Remove item from list" #~ msgstr "Remove item from list" -#: src/forms/PurchaseOrderForms.tsx:446 +#: src/forms/PurchaseOrderForms.tsx:462 +msgid "Choose Location" +msgstr "Välj plats" + +#: src/forms/PurchaseOrderForms.tsx:470 +msgid "Item Destination selected" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:480 +msgid "Part category default location selected" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:490 +msgid "Received stock location selected" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:498 msgid "Default location selected" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:507 +#: src/forms/PurchaseOrderForms.tsx:559 msgid "Set Location" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:524 -msgid "Set Expiry Date" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:532 -#: src/forms/StockForms.tsx:693 -msgid "Adjust Packaging" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:540 -#: src/forms/StockForms.tsx:684 -#: src/hooks/UseStockAdjustActions.tsx:148 -msgid "Change Status" -msgstr "Ändra status" - -#: src/forms/PurchaseOrderForms.tsx:546 -msgid "Add Note" -msgstr "Lägg till anteckning" - #: src/forms/PurchaseOrderForms.tsx:566 #~ msgid "Serial numbers" #~ msgstr "Serial numbers" +#: src/forms/PurchaseOrderForms.tsx:576 +msgid "Set Expiry Date" +msgstr "" + #: src/forms/PurchaseOrderForms.tsx:582 #~ msgid "Store at line item destination" #~ msgstr "Store at line item destination" -#: src/forms/PurchaseOrderForms.tsx:610 -msgid "Store at default location" +#: src/forms/PurchaseOrderForms.tsx:584 +#: src/forms/StockForms.tsx:693 +msgid "Adjust Packaging" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:625 -msgid "Store at line item destination " -msgstr "" +#: src/forms/PurchaseOrderForms.tsx:592 +#: src/forms/StockForms.tsx:684 +#: src/hooks/UseStockAdjustActions.tsx:148 +msgid "Change Status" +msgstr "Ändra status" -#: src/forms/PurchaseOrderForms.tsx:637 -msgid "Store with already received stock" -msgstr "" +#: src/forms/PurchaseOrderForms.tsx:598 +msgid "Add Note" +msgstr "Lägg till anteckning" #: src/forms/PurchaseOrderForms.tsx:658 #~ msgid "Receive line items" #~ msgstr "Receive line items" -#: src/forms/PurchaseOrderForms.tsx:661 +#: src/forms/PurchaseOrderForms.tsx:662 +msgid "Store at default location" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:677 +msgid "Store at line item destination " +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:689 +msgid "Store with already received stock" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:713 #: src/pages/build/BuildDetail.tsx:340 #: src/pages/stock/StockDetail.tsx:280 #: src/pages/stock/StockDetail.tsx:952 #: src/tables/Filter.tsx:83 -#: src/tables/build/BuildAllocatedStockTable.tsx:128 +#: src/tables/build/BuildAllocatedStockTable.tsx:125 #: src/tables/build/BuildOutputTable.tsx:112 -#: src/tables/part/PartTestResultTable.tsx:260 -#: src/tables/part/PartTestResultTable.tsx:281 +#: src/tables/part/PartTestResultTable.tsx:268 +#: src/tables/part/PartTestResultTable.tsx:289 #: src/tables/sales/SalesOrderAllocationTable.tsx:149 msgid "Batch Code" msgstr "Batchkod" -#: src/forms/PurchaseOrderForms.tsx:662 +#: src/forms/PurchaseOrderForms.tsx:714 msgid "Enter batch code for received items" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:675 +#: src/forms/PurchaseOrderForms.tsx:727 #: src/forms/StockForms.tsx:218 msgid "Serial Numbers" msgstr "Serienummer" -#: src/forms/PurchaseOrderForms.tsx:676 +#: src/forms/PurchaseOrderForms.tsx:728 msgid "Enter serial numbers for received items" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:690 +#: src/forms/PurchaseOrderForms.tsx:742 #: src/pages/stock/StockDetail.tsx:382 #: src/tables/stock/StockItemTable.tsx:294 msgid "Expiry Date" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:691 +#: src/forms/PurchaseOrderForms.tsx:743 msgid "Enter an expiry date for received items" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:703 +#: src/forms/PurchaseOrderForms.tsx:755 #: src/forms/StockForms.tsx:728 #: src/pages/company/SupplierPartDetail.tsx:172 #: src/pages/company/SupplierPartDetail.tsx:236 @@ -4701,19 +4708,19 @@ msgstr "" msgid "Packaging" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:727 +#: src/forms/PurchaseOrderForms.tsx:779 #: src/pages/company/SupplierPartDetail.tsx:120 #: src/tables/ColumnRenderers.tsx:332 msgid "Note" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:799 +#: src/forms/PurchaseOrderForms.tsx:851 #: src/pages/company/SupplierPartDetail.tsx:138 #: src/tables/purchasing/SupplierPriceBreakTable.tsx:49 msgid "SKU" msgstr "SKU" -#: src/forms/PurchaseOrderForms.tsx:800 +#: src/forms/PurchaseOrderForms.tsx:852 #: src/tables/part/PartPurchaseOrdersTable.tsx:127 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:213 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:283 @@ -4721,11 +4728,11 @@ msgstr "SKU" msgid "Received" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:817 +#: src/forms/PurchaseOrderForms.tsx:869 msgid "Receive Line Items" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:823 +#: src/forms/PurchaseOrderForms.tsx:875 msgid "Items received" msgstr "" @@ -4737,7 +4744,7 @@ msgstr "" msgid "Item received into stock" msgstr "" -#: src/forms/SalesOrderForms.tsx:401 +#: src/forms/SalesOrderForms.tsx:419 msgid "Leave blank to use the order address" msgstr "" @@ -5932,6 +5939,9 @@ msgstr "" #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:310 #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:401 +#: src/tables/build/BuildAllocatedStockTable.tsx:181 +#: src/tables/build/BuildLineTable.tsx:668 +#: src/tables/sales/SalesOrderAllocationTable.tsx:220 msgid "Confirm Removal" msgstr "" @@ -6870,8 +6880,8 @@ msgstr "Extern" #: src/pages/sales/ReturnOrderDetail.tsx:108 #: src/pages/sales/SalesOrderDetail.tsx:98 #: src/tables/ColumnRenderers.tsx:321 -#: src/tables/build/BuildAllocatedStockTable.tsx:115 -#: src/tables/build/BuildLineTable.tsx:352 +#: src/tables/build/BuildAllocatedStockTable.tsx:112 +#: src/tables/build/BuildLineTable.tsx:353 msgid "Reference" msgstr "Referens" @@ -7132,7 +7142,7 @@ msgstr "Avbryt order" #: src/pages/build/BuildDetail.tsx:742 #: src/pages/stock/StockDetail.tsx:344 -#: src/tables/build/BuildAllocatedStockTable.tsx:85 +#: src/tables/build/BuildAllocatedStockTable.tsx:82 #: src/tables/part/PartBuildAllocationsTable.tsx:45 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:157 #: src/tables/stock/StockTrackingTable.tsx:109 @@ -7600,7 +7610,7 @@ msgstr "Nyckelord" #: src/pages/part/PartDetail.tsx:542 #: src/tables/bom/BomTable.tsx:439 -#: src/tables/build/BuildLineTable.tsx:305 +#: src/tables/build/BuildLineTable.tsx:306 #: src/tables/part/PartTable.tsx:319 #: src/tables/sales/SalesOrderLineItemTable.tsx:138 msgid "Available Stock" @@ -7608,7 +7618,7 @@ msgstr "Tillgängligt lager" #: src/pages/part/PartDetail.tsx:548 #: src/tables/bom/BomTable.tsx:341 -#: src/tables/build/BuildLineTable.tsx:267 +#: src/tables/build/BuildLineTable.tsx:268 #: src/tables/sales/SalesOrderLineItemTable.tsx:180 msgid "On order" msgstr "På order" @@ -7782,7 +7792,7 @@ msgstr "" #: src/pages/part/PartDetail.tsx:1144 #: src/pages/stock/StockDetail.tsx:884 -#: src/tables/build/BuildLineTable.tsx:761 +#: src/tables/build/BuildLineTable.tsx:768 msgid "Order Stock" msgstr "" @@ -9219,13 +9229,13 @@ msgstr "Virtuell del" #~ msgstr "Show asssmbled items" #: src/tables/bom/BomTable.tsx:315 -#: src/tables/build/BuildLineTable.tsx:276 +#: src/tables/build/BuildLineTable.tsx:277 #: src/tables/part/PartTable.tsx:145 msgid "External stock" msgstr "" #: src/tables/bom/BomTable.tsx:323 -#: src/tables/build/BuildLineTable.tsx:239 +#: src/tables/build/BuildLineTable.tsx:240 msgid "Includes substitute stock" msgstr "" @@ -9234,7 +9244,7 @@ msgstr "" #~ msgstr "Edit Bom Item" #: src/tables/bom/BomTable.tsx:332 -#: src/tables/build/BuildLineTable.tsx:249 +#: src/tables/build/BuildLineTable.tsx:250 #: src/tables/sales/SalesOrderLineItemTable.tsx:166 msgid "Includes variant stock" msgstr "" @@ -9272,8 +9282,8 @@ msgid "Stock Information" msgstr "" #: src/tables/bom/BomTable.tsx:399 -#: src/tables/build/BuildLineTable.tsx:496 -#: src/tables/build/BuildLineTable.tsx:537 +#: src/tables/build/BuildLineTable.tsx:497 +#: src/tables/build/BuildLineTable.tsx:538 msgid "Consumable item" msgstr "" @@ -9282,7 +9292,7 @@ msgid "No available stock" msgstr "" #: src/tables/bom/BomTable.tsx:420 -#: src/tables/build/BuildLineTable.tsx:213 +#: src/tables/build/BuildLineTable.tsx:214 msgid "Show testable items" msgstr "" @@ -9291,7 +9301,7 @@ msgid "Show trackable items" msgstr "" #: src/tables/bom/BomTable.tsx:430 -#: src/tables/build/BuildLineTable.tsx:208 +#: src/tables/build/BuildLineTable.tsx:209 msgid "Show assembled items" msgstr "" @@ -9335,7 +9345,7 @@ msgstr "" #: src/tables/bom/BomTable.tsx:464 #: src/tables/bom/UsedInTable.tsx:85 -#: src/tables/build/BuildLineTable.tsx:202 +#: src/tables/build/BuildLineTable.tsx:203 msgid "Optional" msgstr "" @@ -9345,7 +9355,7 @@ msgid "Show optional items" msgstr "" #: src/tables/bom/BomTable.tsx:469 -#: src/tables/build/BuildLineTable.tsx:197 +#: src/tables/build/BuildLineTable.tsx:198 msgid "Consumable" msgstr "" @@ -9433,7 +9443,7 @@ msgid "Bill of materials cannot be edited, as the part is locked" msgstr "" #: src/tables/bom/UsedInTable.tsx:34 -#: src/tables/build/BuildLineTable.tsx:207 +#: src/tables/build/BuildLineTable.tsx:208 #: src/tables/part/ParametricPartTable.tsx:364 #: src/tables/part/PartBuildAllocationsTable.tsx:60 #: src/tables/part/PartTable.tsx:209 @@ -9455,11 +9465,11 @@ msgstr "Spårbart objekt" msgid "Show trackable assemblies" msgstr "" -#: src/tables/build/BuildAllocatedStockTable.tsx:67 +#: src/tables/build/BuildAllocatedStockTable.tsx:64 msgid "Allocated to Output" msgstr "" -#: src/tables/build/BuildAllocatedStockTable.tsx:68 +#: src/tables/build/BuildAllocatedStockTable.tsx:65 msgid "Show items allocated to a build output" msgstr "" @@ -9472,7 +9482,7 @@ msgstr "" #~ msgid "Include orders for part variants" #~ msgstr "Include orders for part variants" -#: src/tables/build/BuildAllocatedStockTable.tsx:97 +#: src/tables/build/BuildAllocatedStockTable.tsx:94 #: src/tables/part/PartBuildAllocationsTable.tsx:84 #: src/tables/part/PartPurchaseOrdersTable.tsx:132 #: src/tables/part/PartSalesAllocationsTable.tsx:69 @@ -9482,40 +9492,58 @@ msgid "Order Status" msgstr "" #: src/tables/build/BuildAllocatedStockTable.tsx:164 -#~ msgid "Edit Build Item" -#~ msgstr "Edit Build Item" - -#: src/tables/build/BuildAllocatedStockTable.tsx:167 -#: src/tables/build/BuildLineTable.tsx:650 +#: src/tables/build/BuildLineTable.tsx:651 msgid "Edit Stock Allocation" msgstr "" +#: src/tables/build/BuildAllocatedStockTable.tsx:164 +#~ msgid "Edit Build Item" +#~ msgstr "Edit Build Item" + #: src/tables/build/BuildAllocatedStockTable.tsx:174 #~ msgid "Delete Build Item" #~ msgstr "Delete Build Item" -#: src/tables/build/BuildAllocatedStockTable.tsx:180 -#: src/tables/build/BuildLineTable.tsx:663 -msgid "Delete Stock Allocation" +#: src/tables/build/BuildAllocatedStockTable.tsx:177 +#: src/tables/build/BuildLineTable.tsx:664 +#: src/tables/sales/SalesOrderAllocationTable.tsx:218 +msgid "Remove Allocated Stock" msgstr "" -#: src/tables/build/BuildAllocatedStockTable.tsx:239 +#: src/tables/build/BuildAllocatedStockTable.tsx:180 +#: src/tables/build/BuildLineTable.tsx:663 +#~ msgid "Delete Stock Allocation" +#~ msgstr "Delete Stock Allocation" + +#: src/tables/build/BuildAllocatedStockTable.tsx:182 +#: src/tables/build/BuildLineTable.tsx:669 +#: src/tables/sales/SalesOrderAllocationTable.tsx:221 +msgid "Are you sure you want to remove this allocated stock from the order?" +msgstr "" + +#: src/tables/build/BuildAllocatedStockTable.tsx:242 msgid "Consume" msgstr "Konsumera" +#: src/tables/build/BuildAllocatedStockTable.tsx:259 +#: src/tables/build/BuildLineTable.tsx:112 +#: src/tables/sales/SalesOrderAllocationTable.tsx:248 +msgid "Remove allocated stock" +msgstr "" + #: src/tables/build/BuildLineTable.tsx:59 #~ msgid "Show lines with available stock" #~ msgstr "Show lines with available stock" -#: src/tables/build/BuildLineTable.tsx:120 +#: src/tables/build/BuildLineTable.tsx:121 msgid "View Stock Item" msgstr "" -#: src/tables/build/BuildLineTable.tsx:183 +#: src/tables/build/BuildLineTable.tsx:184 msgid "Show fully allocated lines" msgstr "" -#: src/tables/build/BuildLineTable.tsx:188 +#: src/tables/build/BuildLineTable.tsx:189 msgid "Show fully consumed lines" msgstr "" @@ -9523,124 +9551,124 @@ msgstr "" #~ msgid "Show allocated lines" #~ msgstr "Show allocated lines" -#: src/tables/build/BuildLineTable.tsx:193 +#: src/tables/build/BuildLineTable.tsx:194 msgid "Show items with sufficient available stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:198 +#: src/tables/build/BuildLineTable.tsx:199 msgid "Show consumable lines" msgstr "" -#: src/tables/build/BuildLineTable.tsx:203 +#: src/tables/build/BuildLineTable.tsx:204 msgid "Show optional lines" msgstr "" -#: src/tables/build/BuildLineTable.tsx:212 +#: src/tables/build/BuildLineTable.tsx:213 #: src/tables/part/PartTable.tsx:233 msgid "Testable" msgstr "Testbar" -#: src/tables/build/BuildLineTable.tsx:217 +#: src/tables/build/BuildLineTable.tsx:218 #: src/tables/stock/StockItemTable.tsx:388 msgid "Tracked" msgstr "" -#: src/tables/build/BuildLineTable.tsx:218 +#: src/tables/build/BuildLineTable.tsx:219 msgid "Show tracked lines" msgstr "" -#: src/tables/build/BuildLineTable.tsx:223 +#: src/tables/build/BuildLineTable.tsx:224 msgid "Show items with stock on order" msgstr "" -#: src/tables/build/BuildLineTable.tsx:258 +#: src/tables/build/BuildLineTable.tsx:259 #: src/tables/sales/SalesOrderLineItemTable.tsx:172 msgid "In production" msgstr "" -#: src/tables/build/BuildLineTable.tsx:286 +#: src/tables/build/BuildLineTable.tsx:287 msgid "Insufficient stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:302 +#: src/tables/build/BuildLineTable.tsx:303 #: src/tables/sales/SalesOrderLineItemTable.tsx:160 #: src/tables/stock/StockItemTable.tsx:191 msgid "No stock available" msgstr "" -#: src/tables/build/BuildLineTable.tsx:375 +#: src/tables/build/BuildLineTable.tsx:376 msgid "Gets Inherited" msgstr "" -#: src/tables/build/BuildLineTable.tsx:388 +#: src/tables/build/BuildLineTable.tsx:389 msgid "Unit Quantity" msgstr "" -#: src/tables/build/BuildLineTable.tsx:415 +#: src/tables/build/BuildLineTable.tsx:416 msgid "Setup Quantity" msgstr "" -#: src/tables/build/BuildLineTable.tsx:424 +#: src/tables/build/BuildLineTable.tsx:425 msgid "Attrition" msgstr "" -#: src/tables/build/BuildLineTable.tsx:432 +#: src/tables/build/BuildLineTable.tsx:433 msgid "Rounding Multiple" msgstr "" -#: src/tables/build/BuildLineTable.tsx:441 +#: src/tables/build/BuildLineTable.tsx:442 msgid "BOM Information" msgstr "" -#: src/tables/build/BuildLineTable.tsx:515 +#: src/tables/build/BuildLineTable.tsx:516 #: src/tables/part/PartBuildAllocationsTable.tsx:102 msgid "Fully allocated" msgstr "" -#: src/tables/build/BuildLineTable.tsx:563 +#: src/tables/build/BuildLineTable.tsx:564 #: src/tables/sales/SalesOrderLineItemTable.tsx:311 msgid "Create Build Order" msgstr "" -#: src/tables/build/BuildLineTable.tsx:592 +#: src/tables/build/BuildLineTable.tsx:593 msgid "Auto allocation in progress" msgstr "" -#: src/tables/build/BuildLineTable.tsx:595 -#: src/tables/build/BuildLineTable.tsx:802 +#: src/tables/build/BuildLineTable.tsx:596 +#: src/tables/build/BuildLineTable.tsx:809 msgid "Auto Allocate Stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:596 +#: src/tables/build/BuildLineTable.tsx:597 msgid "Automatically allocate stock to this build according to the selected options" msgstr "" -#: src/tables/build/BuildLineTable.tsx:616 -#: src/tables/build/BuildLineTable.tsx:630 -#: src/tables/build/BuildLineTable.tsx:751 -#: src/tables/build/BuildLineTable.tsx:852 +#: src/tables/build/BuildLineTable.tsx:617 +#: src/tables/build/BuildLineTable.tsx:631 +#: src/tables/build/BuildLineTable.tsx:758 +#: src/tables/build/BuildLineTable.tsx:859 #: src/tables/build/BuildOutputTable.tsx:355 #: src/tables/build/BuildOutputTable.tsx:360 msgid "Deallocate Stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:632 +#: src/tables/build/BuildLineTable.tsx:633 msgid "Deallocate all untracked stock for this build order" msgstr "" -#: src/tables/build/BuildLineTable.tsx:634 +#: src/tables/build/BuildLineTable.tsx:635 msgid "Deallocate stock from the selected line item" msgstr "" -#: src/tables/build/BuildLineTable.tsx:638 +#: src/tables/build/BuildLineTable.tsx:639 msgid "Stock has been deallocated" msgstr "" -#: src/tables/build/BuildLineTable.tsx:771 +#: src/tables/build/BuildLineTable.tsx:778 msgid "Build Stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:784 +#: src/tables/build/BuildLineTable.tsx:791 #: src/tables/sales/SalesOrderLineItemTable.tsx:487 msgid "View Part" msgstr "Visa del" @@ -9739,7 +9767,7 @@ msgid "Serialize Build Output" msgstr "" #: src/tables/build/BuildOutputTable.tsx:405 -#: src/tables/part/PartTestResultTable.tsx:310 +#: src/tables/part/PartTestResultTable.tsx:318 #: src/tables/stock/StockItemTable.tsx:328 msgid "Filter by stock status" msgstr "" @@ -9964,8 +9992,8 @@ msgid "View Item" msgstr "" #: src/tables/general/ExtraLineItemTable.tsx:95 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:299 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:403 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:300 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:405 #: src/tables/sales/ReturnOrderLineItemTable.tsx:83 #: src/tables/sales/ReturnOrderLineItemTable.tsx:187 #: src/tables/sales/SalesOrderLineItemTable.tsx:252 @@ -9974,14 +10002,14 @@ msgid "Add Line Item" msgstr "" #: src/tables/general/ExtraLineItemTable.tsx:108 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:320 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:322 #: src/tables/sales/ReturnOrderLineItemTable.tsx:96 #: src/tables/sales/SalesOrderLineItemTable.tsx:271 msgid "Edit Line Item" msgstr "" #: src/tables/general/ExtraLineItemTable.tsx:117 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:329 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:331 #: src/tables/sales/ReturnOrderLineItemTable.tsx:105 #: src/tables/sales/SalesOrderLineItemTable.tsx:280 msgid "Delete Line Item" @@ -10273,7 +10301,7 @@ msgid "Required Stock" msgstr "" #: src/tables/part/PartBuildAllocationsTable.tsx:124 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:381 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:383 msgid "View Build Order" msgstr "" @@ -10617,8 +10645,8 @@ msgstr "" #: src/tables/part/PartTestResultTable.tsx:103 #: src/tables/part/PartTestResultTable.tsx:181 -#: src/tables/part/PartTestResultTable.tsx:320 -#: src/tables/part/PartTestResultTable.tsx:334 +#: src/tables/part/PartTestResultTable.tsx:328 +#: src/tables/part/PartTestResultTable.tsx:342 #: src/tables/stock/StockItemTestResultTable.tsx:296 #: src/tables/stock/StockItemTestResultTable.tsx:368 #: src/tables/stock/StockItemTestResultTable.tsx:429 @@ -10643,7 +10671,7 @@ msgstr "" msgid "No Result" msgstr "Inga resultat" -#: src/tables/part/PartTestResultTable.tsx:298 +#: src/tables/part/PartTestResultTable.tsx:306 msgid "Show build outputs currently in production" msgstr "Visa tillverkat antal som är i produktion" @@ -11073,7 +11101,7 @@ msgid "Show manufacturer parts for active manufacturers." msgstr "" #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:115 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:397 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:399 msgid "Import Line Items" msgstr "" @@ -11099,11 +11127,11 @@ msgstr "" #~ msgid "Add line item" #~ msgstr "Add line item" -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:350 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:352 msgid "Receive line item" msgstr "" -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:414 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:416 msgid "Receive items" msgstr "" @@ -11201,25 +11229,25 @@ msgid "Not shipped" msgstr "" #: src/tables/sales/SalesOrderAllocationTable.tsx:211 -#: src/tables/sales/SalesOrderAllocationTable.tsx:229 +#: src/tables/sales/SalesOrderAllocationTable.tsx:235 msgid "Edit Allocation" msgstr "" #: src/tables/sales/SalesOrderAllocationTable.tsx:218 #: src/tables/sales/SalesOrderAllocationTable.tsx:241 -msgid "Delete Allocation" -msgstr "" +#~ msgid "Delete Allocation" +#~ msgstr "Delete Allocation" -#: src/tables/sales/SalesOrderAllocationTable.tsx:252 -#: src/tables/sales/SalesOrderAllocationTable.tsx:253 +#: src/tables/sales/SalesOrderAllocationTable.tsx:261 +#: src/tables/sales/SalesOrderAllocationTable.tsx:262 msgid "View Shipment" msgstr "" -#: src/tables/sales/SalesOrderAllocationTable.tsx:308 +#: src/tables/sales/SalesOrderAllocationTable.tsx:317 msgid "Assign to Shipment" msgstr "" -#: src/tables/sales/SalesOrderAllocationTable.tsx:324 +#: src/tables/sales/SalesOrderAllocationTable.tsx:333 msgid "Assign to shipment" msgstr "" diff --git a/src/frontend/src/locales/th/messages.po b/src/frontend/src/locales/th/messages.po index 9821de839f..b8a782666f 100644 --- a/src/frontend/src/locales/th/messages.po +++ b/src/frontend/src/locales/th/messages.po @@ -8,7 +8,7 @@ msgstr "" "Language: th\n" "Project-Id-Version: inventree\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2025-11-19 19:39\n" +"PO-Revision-Date: 2025-11-22 06:25\n" "Last-Translator: \n" "Language-Team: Thai\n" "Plural-Forms: nplurals=1; plural=0;\n" @@ -56,7 +56,7 @@ msgstr "" #: lib/components/RowActions.tsx:136 #: src/components/nav/NavigationDrawer.tsx:190 -#: src/forms/PurchaseOrderForms.tsx:802 +#: src/forms/PurchaseOrderForms.tsx:854 #: src/forms/StockForms.tsx:796 #: src/forms/StockForms.tsx:843 #: src/forms/StockForms.tsx:889 @@ -103,9 +103,9 @@ msgstr "" #: src/forms/BuildForms.tsx:630 #: src/forms/BuildForms.tsx:793 #: src/forms/BuildForms.tsx:896 -#: src/forms/PurchaseOrderForms.tsx:798 +#: src/forms/PurchaseOrderForms.tsx:850 #: src/forms/ReturnOrderForms.tsx:242 -#: src/forms/SalesOrderForms.tsx:305 +#: src/forms/SalesOrderForms.tsx:323 #: src/forms/StockForms.tsx:360 #: src/forms/StockForms.tsx:791 #: src/forms/StockForms.tsx:838 @@ -119,6 +119,7 @@ msgstr "" #: src/pages/build/BuildDetail.tsx:200 #: src/pages/part/PartDetail.tsx:1207 #: src/tables/ColumnRenderers.tsx:91 +#: src/tables/part/PartTestResultTable.tsx:247 #: src/tables/part/RelatedPartTable.tsx:53 #: src/tables/stock/StockTrackingTable.tsx:87 msgid "Part" @@ -158,7 +159,7 @@ msgstr "" #: src/components/wizards/OrderPartsWizard.tsx:290 #: src/pages/company/SupplierPartDetail.tsx:413 #: src/pages/stock/StockDetail.tsx:289 -#: src/tables/build/BuildAllocatedStockTable.tsx:155 +#: src/tables/build/BuildAllocatedStockTable.tsx:152 #: src/tables/part/PartPurchaseOrdersTable.tsx:50 #: src/tables/purchasing/SupplierPartTable.tsx:83 #: src/tables/stock/StockItemTable.tsx:247 @@ -201,9 +202,9 @@ msgstr "" #: src/forms/BuildForms.tsx:473 #: src/forms/BuildForms.tsx:633 #: src/forms/BuildForms.tsx:794 -#: src/forms/SalesOrderForms.tsx:307 +#: src/forms/SalesOrderForms.tsx:325 #: src/pages/stock/StockDetail.tsx:1005 -#: src/tables/part/PartTestResultTable.tsx:248 +#: src/tables/part/PartTestResultTable.tsx:256 #: src/tables/stock/StockTrackingTable.tsx:48 #: src/tables/stock/StockTrackingTable.tsx:55 msgid "Stock Item" @@ -517,7 +518,7 @@ msgstr "" #: src/components/dashboard/DashboardLayout.tsx:281 #: src/components/editors/NotesEditor.tsx:74 #: src/components/editors/TemplateEditor/TemplateEditor.tsx:158 -#: src/components/forms/fields/ApiFormField.tsx:273 +#: src/components/forms/fields/ApiFormField.tsx:237 #: src/components/forms/fields/TableField.tsx:45 #: src/components/importer/ImportDataSelector.tsx:192 #: src/components/importer/ImporterColumnSelector.tsx:234 @@ -642,8 +643,8 @@ msgstr "" #: src/components/barcodes/BarcodeScanDialog.tsx:49 #: src/components/buttons/ScanButton.tsx:15 #: src/components/nav/NavigationDrawer.tsx:122 -#: src/forms/PurchaseOrderForms.tsx:457 -#: src/forms/PurchaseOrderForms.tsx:563 +#: src/forms/PurchaseOrderForms.tsx:509 +#: src/forms/PurchaseOrderForms.tsx:615 msgid "Scan Barcode" msgstr "" @@ -728,7 +729,7 @@ msgstr "" #: src/components/barcodes/QRCode.tsx:205 #: src/components/items/ActionDropdown.tsx:192 -#: src/forms/PurchaseOrderForms.tsx:554 +#: src/forms/PurchaseOrderForms.tsx:606 msgid "Unlink Barcode" msgstr "" @@ -1216,6 +1217,12 @@ msgstr "" #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:884 #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:903 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:254 +#: src/tables/build/BuildAllocatedStockTable.tsx:178 +#: src/tables/build/BuildAllocatedStockTable.tsx:258 +#: src/tables/build/BuildLineTable.tsx:111 +#: src/tables/build/BuildLineTable.tsx:665 +#: src/tables/sales/SalesOrderAllocationTable.tsx:224 +#: src/tables/sales/SalesOrderAllocationTable.tsx:247 msgid "Remove" msgstr "" @@ -1241,7 +1248,7 @@ msgid "Upload Error" msgstr "" #: src/components/details/DetailsImage.tsx:250 -#: src/components/forms/fields/TextField.tsx:65 +#: src/components/forms/fields/AutoFillRightSection.tsx:34 msgid "Clear" msgstr "" @@ -1817,10 +1824,14 @@ msgstr "" msgid "Running" msgstr "" -#: src/components/forms/fields/ApiFormField.tsx:233 +#: src/components/forms/fields/ApiFormField.tsx:197 msgid "Select file to upload" msgstr "" +#: src/components/forms/fields/AutoFillRightSection.tsx:47 +msgid "Accept suggested value" +msgstr "" + #: src/components/forms/fields/DateField.tsx:76 msgid "Select date" msgstr "" @@ -1875,10 +1886,6 @@ msgstr "" msgid "Add new row" msgstr "" -#: src/components/forms/fields/TextField.tsx:82 -msgid "Accept suggested value" -msgstr "" - #: src/components/images/DetailsImage.tsx:252 #~ msgid "Select image" #~ msgstr "Select image" @@ -2225,8 +2232,8 @@ msgstr "" #: src/pages/part/PartDetail.tsx:994 #: src/pages/stock/StockDetail.tsx:265 #: src/pages/stock/StockDetail.tsx:942 -#: src/tables/build/BuildAllocatedStockTable.tsx:135 -#: src/tables/build/BuildLineTable.tsx:192 +#: src/tables/build/BuildAllocatedStockTable.tsx:132 +#: src/tables/build/BuildLineTable.tsx:193 #: src/tables/part/PartTable.tsx:137 #: src/tables/stock/StockItemTable.tsx:182 #: src/tables/stock/StockItemTable.tsx:343 @@ -2784,7 +2791,7 @@ msgstr "" #: src/pages/sales/SalesOrderDetail.tsx:119 #: src/pages/stock/LocationDetail.tsx:102 #: src/tables/ColumnRenderers.tsx:278 -#: src/tables/build/BuildAllocatedStockTable.tsx:91 +#: src/tables/build/BuildAllocatedStockTable.tsx:88 #: src/tables/machine/MachineTypeTable.tsx:161 #: src/tables/machine/MachineTypeTable.tsx:257 #: src/tables/plugin/PluginListTable.tsx:110 @@ -2966,7 +2973,7 @@ msgstr "" #: src/pages/company/SupplierPartDetail.tsx:394 #: src/pages/part/PartDetail.tsx:1015 #: src/tables/bom/BomTable.tsx:444 -#: src/tables/build/BuildLineTable.tsx:222 +#: src/tables/build/BuildLineTable.tsx:223 #: src/tables/part/PartTable.tsx:108 msgid "On Order" msgstr "" @@ -2976,7 +2983,7 @@ msgstr "" #: src/pages/part/PartDetail.tsx:587 #: src/pages/part/PartDetail.tsx:1021 #: src/pages/stock/StockDetail.tsx:925 -#: src/tables/part/PartTestResultTable.tsx:297 +#: src/tables/part/PartTestResultTable.tsx:305 #: src/tables/stock/StockItemTable.tsx:359 msgid "In Production" msgstr "" @@ -3000,7 +3007,7 @@ msgstr "" #: src/components/render/Stock.tsx:114 #: src/components/render/Stock.tsx:132 #: src/forms/BuildForms.tsx:795 -#: src/forms/PurchaseOrderForms.tsx:595 +#: src/forms/PurchaseOrderForms.tsx:647 #: src/forms/StockForms.tsx:792 #: src/forms/StockForms.tsx:839 #: src/forms/StockForms.tsx:885 @@ -3023,7 +3030,7 @@ msgstr "" #: src/components/render/Stock.tsx:99 #: src/pages/stock/StockDetail.tsx:198 #: src/pages/stock/StockDetail.tsx:930 -#: src/tables/build/BuildAllocatedStockTable.tsx:121 +#: src/tables/build/BuildAllocatedStockTable.tsx:118 #: src/tables/build/BuildOutputTable.tsx:107 #: src/tables/sales/SalesOrderAllocationTable.tsx:142 msgid "Serial Number" @@ -3034,9 +3041,9 @@ msgstr "" #: src/forms/BuildForms.tsx:240 #: src/forms/BuildForms.tsx:634 #: src/forms/BuildForms.tsx:797 -#: src/forms/PurchaseOrderForms.tsx:801 +#: src/forms/PurchaseOrderForms.tsx:853 #: src/forms/ReturnOrderForms.tsx:243 -#: src/forms/SalesOrderForms.tsx:308 +#: src/forms/SalesOrderForms.tsx:326 #: src/forms/StockForms.tsx:841 #: src/pages/part/PartStockHistoryDetail.tsx:56 #: src/pages/part/PartStockHistoryDetail.tsx:210 @@ -3046,9 +3053,9 @@ msgstr "" #: src/pages/part/pricing/PriceBreakPanel.tsx:172 #: src/pages/stock/StockDetail.tsx:258 #: src/pages/stock/StockDetail.tsx:936 -#: src/tables/build/BuildLineTable.tsx:86 +#: src/tables/build/BuildLineTable.tsx:83 #: src/tables/part/PartPurchaseOrdersTable.tsx:94 -#: src/tables/part/PartTestResultTable.tsx:269 +#: src/tables/part/PartTestResultTable.tsx:277 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:175 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:206 #: src/tables/purchasing/SupplierPriceBreakTable.tsx:69 @@ -3070,7 +3077,7 @@ msgstr "" #: src/forms/StockForms.tsx:1048 #: src/forms/StockForms.tsx:1096 #: src/forms/StockForms.tsx:1140 -#: src/tables/build/BuildLineTable.tsx:96 +#: src/tables/build/BuildLineTable.tsx:93 msgid "Batch" msgstr "" @@ -3755,7 +3762,7 @@ msgid "In Stock" msgstr "" #: src/components/wizards/OrderPartsWizard.tsx:146 -#: src/tables/build/BuildLineTable.tsx:404 +#: src/tables/build/BuildLineTable.tsx:405 msgid "Required Quantity" msgstr "" @@ -3847,7 +3854,7 @@ msgid "Please correct the errors in the selected parts" msgstr "" #: src/components/wizards/OrderPartsWizard.tsx:587 -#: src/tables/build/BuildLineTable.tsx:815 +#: src/tables/build/BuildLineTable.tsx:822 #: src/tables/part/PartTable.tsx:522 #: src/tables/sales/SalesOrderLineItemTable.tsx:370 msgid "Order Parts" @@ -4349,9 +4356,9 @@ msgstr "" #: src/forms/BuildForms.tsx:333 #: src/forms/BuildForms.tsx:408 #: src/forms/BuildForms.tsx:685 -#: src/tables/build/BuildAllocatedStockTable.tsx:150 +#: src/tables/build/BuildAllocatedStockTable.tsx:147 #: src/tables/build/BuildOutputTable.tsx:582 -#: src/tables/part/PartTestResultTable.tsx:272 +#: src/tables/part/PartTestResultTable.tsx:280 msgid "Build Output" msgstr "" @@ -4362,7 +4369,7 @@ msgstr "" #: src/forms/BuildForms.tsx:336 #: src/forms/BuildForms.tsx:411 #: src/forms/BuildForms.tsx:475 -#: src/forms/PurchaseOrderForms.tsx:717 +#: src/forms/PurchaseOrderForms.tsx:769 #: src/forms/ReturnOrderForms.tsx:197 #: src/forms/ReturnOrderForms.tsx:244 #: src/forms/StockForms.tsx:712 @@ -4377,7 +4384,7 @@ msgstr "" #: src/tables/build/BuildOutputTable.tsx:404 #: src/tables/machine/MachineListTable.tsx:387 #: src/tables/part/PartPurchaseOrdersTable.tsx:38 -#: src/tables/part/PartTestResultTable.tsx:309 +#: src/tables/part/PartTestResultTable.tsx:317 #: src/tables/sales/ReturnOrderLineItemTable.tsx:138 #: src/tables/sales/ReturnOrderLineItemTable.tsx:176 #: src/tables/settings/CustomStateTable.tsx:79 @@ -4450,8 +4457,8 @@ msgstr "" #: src/pages/stock/StockDetail.tsx:153 #: src/tables/bom/BomTable.tsx:134 #: src/tables/bom/UsedInTable.tsx:40 -#: src/tables/build/BuildAllocatedStockTable.tsx:108 -#: src/tables/build/BuildLineTable.tsx:336 +#: src/tables/build/BuildAllocatedStockTable.tsx:105 +#: src/tables/build/BuildLineTable.tsx:337 #: src/tables/build/BuildOrderTable.tsx:79 #: src/tables/part/PartSalesAllocationsTable.tsx:61 #: src/tables/part/RelatedPartTable.tsx:73 @@ -4466,47 +4473,47 @@ msgstr "" #: src/forms/BuildForms.tsx:632 #: src/forms/BuildForms.tsx:796 #: src/forms/BuildForms.tsx:897 -#: src/forms/SalesOrderForms.tsx:306 -#: src/tables/build/BuildAllocatedStockTable.tsx:139 -#: src/tables/build/BuildLineTable.tsx:182 +#: src/forms/SalesOrderForms.tsx:324 +#: src/tables/build/BuildAllocatedStockTable.tsx:136 +#: src/tables/build/BuildLineTable.tsx:183 #: src/tables/sales/SalesOrderLineItemTable.tsx:342 #: src/tables/stock/StockItemTable.tsx:338 msgid "Allocated" msgstr "" #: src/forms/BuildForms.tsx:667 -#: src/forms/SalesOrderForms.tsx:295 +#: src/forms/SalesOrderForms.tsx:313 #: src/pages/build/BuildDetail.tsx:108 #: src/pages/build/BuildDetail.tsx:326 msgid "Source Location" msgstr "" #: src/forms/BuildForms.tsx:668 -#: src/forms/SalesOrderForms.tsx:296 +#: src/forms/SalesOrderForms.tsx:314 msgid "Select the source location for the stock allocation" msgstr "" #: src/forms/BuildForms.tsx:700 -#: src/forms/SalesOrderForms.tsx:336 -#: src/tables/build/BuildLineTable.tsx:574 -#: src/tables/build/BuildLineTable.tsx:731 -#: src/tables/build/BuildLineTable.tsx:830 +#: src/forms/SalesOrderForms.tsx:354 +#: src/tables/build/BuildLineTable.tsx:575 +#: src/tables/build/BuildLineTable.tsx:738 +#: src/tables/build/BuildLineTable.tsx:837 #: src/tables/sales/SalesOrderLineItemTable.tsx:380 #: src/tables/sales/SalesOrderLineItemTable.tsx:406 msgid "Allocate Stock" msgstr "" #: src/forms/BuildForms.tsx:703 -#: src/forms/SalesOrderForms.tsx:341 +#: src/forms/SalesOrderForms.tsx:359 msgid "Stock items allocated" msgstr "" #: src/forms/BuildForms.tsx:816 #: src/forms/BuildForms.tsx:917 -#: src/tables/build/BuildAllocatedStockTable.tsx:240 -#: src/tables/build/BuildAllocatedStockTable.tsx:272 -#: src/tables/build/BuildLineTable.tsx:741 -#: src/tables/build/BuildLineTable.tsx:864 +#: src/tables/build/BuildAllocatedStockTable.tsx:243 +#: src/tables/build/BuildAllocatedStockTable.tsx:279 +#: src/tables/build/BuildLineTable.tsx:748 +#: src/tables/build/BuildLineTable.tsx:871 msgid "Consume Stock" msgstr "" @@ -4521,21 +4528,21 @@ msgstr "" #~ msgstr "Stock items consumed" #: src/forms/BuildForms.tsx:853 -#: src/tables/build/BuildLineTable.tsx:514 +#: src/tables/build/BuildLineTable.tsx:515 #: src/tables/part/PartBuildAllocationsTable.tsx:101 msgid "Fully consumed" msgstr "" #: src/forms/BuildForms.tsx:898 -#: src/tables/build/BuildLineTable.tsx:187 +#: src/tables/build/BuildLineTable.tsx:188 #: src/tables/stock/StockItemTable.tsx:367 msgid "Consumed" msgstr "" #: src/forms/CommonForms.tsx:88 -#: src/forms/PurchaseOrderForms.tsx:125 +#: src/forms/PurchaseOrderForms.tsx:176 #: src/forms/ReturnOrderForms.tsx:138 -#: src/forms/SalesOrderForms.tsx:164 +#: src/forms/SalesOrderForms.tsx:182 msgid "Select project code for this line item" msgstr "" @@ -4572,32 +4579,16 @@ msgstr "" msgid "Subscribe to notifications for this category" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:388 -msgid "Assign Batch Code and Serial Numbers" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:390 -msgid "Assign Batch Code" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:410 -msgid "Choose Location" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:418 -msgid "Item Destination selected" -msgstr "" - #: src/forms/PurchaseOrderForms.tsx:421 #~ msgid "Assign Batch Code{0}" #~ msgstr "Assign Batch Code{0}" -#: src/forms/PurchaseOrderForms.tsx:428 -msgid "Part category default location selected" +#: src/forms/PurchaseOrderForms.tsx:440 +msgid "Assign Batch Code and Serial Numbers" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:438 -msgid "Received stock location selected" +#: src/forms/PurchaseOrderForms.tsx:442 +msgid "Assign Batch Code" msgstr "" #: src/forms/PurchaseOrderForms.tsx:444 @@ -4605,94 +4596,110 @@ msgstr "" #~ msgid "Remove item from list" #~ msgstr "Remove item from list" -#: src/forms/PurchaseOrderForms.tsx:446 +#: src/forms/PurchaseOrderForms.tsx:462 +msgid "Choose Location" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:470 +msgid "Item Destination selected" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:480 +msgid "Part category default location selected" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:490 +msgid "Received stock location selected" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:498 msgid "Default location selected" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:507 +#: src/forms/PurchaseOrderForms.tsx:559 msgid "Set Location" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:524 -msgid "Set Expiry Date" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:532 -#: src/forms/StockForms.tsx:693 -msgid "Adjust Packaging" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:540 -#: src/forms/StockForms.tsx:684 -#: src/hooks/UseStockAdjustActions.tsx:148 -msgid "Change Status" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:546 -msgid "Add Note" -msgstr "" - #: src/forms/PurchaseOrderForms.tsx:566 #~ msgid "Serial numbers" #~ msgstr "Serial numbers" +#: src/forms/PurchaseOrderForms.tsx:576 +msgid "Set Expiry Date" +msgstr "" + #: src/forms/PurchaseOrderForms.tsx:582 #~ msgid "Store at line item destination" #~ msgstr "Store at line item destination" -#: src/forms/PurchaseOrderForms.tsx:610 -msgid "Store at default location" +#: src/forms/PurchaseOrderForms.tsx:584 +#: src/forms/StockForms.tsx:693 +msgid "Adjust Packaging" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:625 -msgid "Store at line item destination " +#: src/forms/PurchaseOrderForms.tsx:592 +#: src/forms/StockForms.tsx:684 +#: src/hooks/UseStockAdjustActions.tsx:148 +msgid "Change Status" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:637 -msgid "Store with already received stock" +#: src/forms/PurchaseOrderForms.tsx:598 +msgid "Add Note" msgstr "" #: src/forms/PurchaseOrderForms.tsx:658 #~ msgid "Receive line items" #~ msgstr "Receive line items" -#: src/forms/PurchaseOrderForms.tsx:661 +#: src/forms/PurchaseOrderForms.tsx:662 +msgid "Store at default location" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:677 +msgid "Store at line item destination " +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:689 +msgid "Store with already received stock" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:713 #: src/pages/build/BuildDetail.tsx:340 #: src/pages/stock/StockDetail.tsx:280 #: src/pages/stock/StockDetail.tsx:952 #: src/tables/Filter.tsx:83 -#: src/tables/build/BuildAllocatedStockTable.tsx:128 +#: src/tables/build/BuildAllocatedStockTable.tsx:125 #: src/tables/build/BuildOutputTable.tsx:112 -#: src/tables/part/PartTestResultTable.tsx:260 -#: src/tables/part/PartTestResultTable.tsx:281 +#: src/tables/part/PartTestResultTable.tsx:268 +#: src/tables/part/PartTestResultTable.tsx:289 #: src/tables/sales/SalesOrderAllocationTable.tsx:149 msgid "Batch Code" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:662 +#: src/forms/PurchaseOrderForms.tsx:714 msgid "Enter batch code for received items" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:675 +#: src/forms/PurchaseOrderForms.tsx:727 #: src/forms/StockForms.tsx:218 msgid "Serial Numbers" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:676 +#: src/forms/PurchaseOrderForms.tsx:728 msgid "Enter serial numbers for received items" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:690 +#: src/forms/PurchaseOrderForms.tsx:742 #: src/pages/stock/StockDetail.tsx:382 #: src/tables/stock/StockItemTable.tsx:294 msgid "Expiry Date" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:691 +#: src/forms/PurchaseOrderForms.tsx:743 msgid "Enter an expiry date for received items" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:703 +#: src/forms/PurchaseOrderForms.tsx:755 #: src/forms/StockForms.tsx:728 #: src/pages/company/SupplierPartDetail.tsx:172 #: src/pages/company/SupplierPartDetail.tsx:236 @@ -4701,19 +4708,19 @@ msgstr "" msgid "Packaging" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:727 +#: src/forms/PurchaseOrderForms.tsx:779 #: src/pages/company/SupplierPartDetail.tsx:120 #: src/tables/ColumnRenderers.tsx:332 msgid "Note" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:799 +#: src/forms/PurchaseOrderForms.tsx:851 #: src/pages/company/SupplierPartDetail.tsx:138 #: src/tables/purchasing/SupplierPriceBreakTable.tsx:49 msgid "SKU" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:800 +#: src/forms/PurchaseOrderForms.tsx:852 #: src/tables/part/PartPurchaseOrdersTable.tsx:127 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:213 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:283 @@ -4721,11 +4728,11 @@ msgstr "" msgid "Received" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:817 +#: src/forms/PurchaseOrderForms.tsx:869 msgid "Receive Line Items" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:823 +#: src/forms/PurchaseOrderForms.tsx:875 msgid "Items received" msgstr "" @@ -4737,7 +4744,7 @@ msgstr "" msgid "Item received into stock" msgstr "" -#: src/forms/SalesOrderForms.tsx:401 +#: src/forms/SalesOrderForms.tsx:419 msgid "Leave blank to use the order address" msgstr "" @@ -5932,6 +5939,9 @@ msgstr "" #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:310 #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:401 +#: src/tables/build/BuildAllocatedStockTable.tsx:181 +#: src/tables/build/BuildLineTable.tsx:668 +#: src/tables/sales/SalesOrderAllocationTable.tsx:220 msgid "Confirm Removal" msgstr "" @@ -6870,8 +6880,8 @@ msgstr "" #: src/pages/sales/ReturnOrderDetail.tsx:108 #: src/pages/sales/SalesOrderDetail.tsx:98 #: src/tables/ColumnRenderers.tsx:321 -#: src/tables/build/BuildAllocatedStockTable.tsx:115 -#: src/tables/build/BuildLineTable.tsx:352 +#: src/tables/build/BuildAllocatedStockTable.tsx:112 +#: src/tables/build/BuildLineTable.tsx:353 msgid "Reference" msgstr "" @@ -7132,7 +7142,7 @@ msgstr "" #: src/pages/build/BuildDetail.tsx:742 #: src/pages/stock/StockDetail.tsx:344 -#: src/tables/build/BuildAllocatedStockTable.tsx:85 +#: src/tables/build/BuildAllocatedStockTable.tsx:82 #: src/tables/part/PartBuildAllocationsTable.tsx:45 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:157 #: src/tables/stock/StockTrackingTable.tsx:109 @@ -7600,7 +7610,7 @@ msgstr "" #: src/pages/part/PartDetail.tsx:542 #: src/tables/bom/BomTable.tsx:439 -#: src/tables/build/BuildLineTable.tsx:305 +#: src/tables/build/BuildLineTable.tsx:306 #: src/tables/part/PartTable.tsx:319 #: src/tables/sales/SalesOrderLineItemTable.tsx:138 msgid "Available Stock" @@ -7608,7 +7618,7 @@ msgstr "" #: src/pages/part/PartDetail.tsx:548 #: src/tables/bom/BomTable.tsx:341 -#: src/tables/build/BuildLineTable.tsx:267 +#: src/tables/build/BuildLineTable.tsx:268 #: src/tables/sales/SalesOrderLineItemTable.tsx:180 msgid "On order" msgstr "" @@ -7782,7 +7792,7 @@ msgstr "" #: src/pages/part/PartDetail.tsx:1144 #: src/pages/stock/StockDetail.tsx:884 -#: src/tables/build/BuildLineTable.tsx:761 +#: src/tables/build/BuildLineTable.tsx:768 msgid "Order Stock" msgstr "" @@ -9219,13 +9229,13 @@ msgstr "" #~ msgstr "Show asssmbled items" #: src/tables/bom/BomTable.tsx:315 -#: src/tables/build/BuildLineTable.tsx:276 +#: src/tables/build/BuildLineTable.tsx:277 #: src/tables/part/PartTable.tsx:145 msgid "External stock" msgstr "" #: src/tables/bom/BomTable.tsx:323 -#: src/tables/build/BuildLineTable.tsx:239 +#: src/tables/build/BuildLineTable.tsx:240 msgid "Includes substitute stock" msgstr "" @@ -9234,7 +9244,7 @@ msgstr "" #~ msgstr "Edit Bom Item" #: src/tables/bom/BomTable.tsx:332 -#: src/tables/build/BuildLineTable.tsx:249 +#: src/tables/build/BuildLineTable.tsx:250 #: src/tables/sales/SalesOrderLineItemTable.tsx:166 msgid "Includes variant stock" msgstr "" @@ -9272,8 +9282,8 @@ msgid "Stock Information" msgstr "" #: src/tables/bom/BomTable.tsx:399 -#: src/tables/build/BuildLineTable.tsx:496 -#: src/tables/build/BuildLineTable.tsx:537 +#: src/tables/build/BuildLineTable.tsx:497 +#: src/tables/build/BuildLineTable.tsx:538 msgid "Consumable item" msgstr "" @@ -9282,7 +9292,7 @@ msgid "No available stock" msgstr "" #: src/tables/bom/BomTable.tsx:420 -#: src/tables/build/BuildLineTable.tsx:213 +#: src/tables/build/BuildLineTable.tsx:214 msgid "Show testable items" msgstr "" @@ -9291,7 +9301,7 @@ msgid "Show trackable items" msgstr "" #: src/tables/bom/BomTable.tsx:430 -#: src/tables/build/BuildLineTable.tsx:208 +#: src/tables/build/BuildLineTable.tsx:209 msgid "Show assembled items" msgstr "" @@ -9335,7 +9345,7 @@ msgstr "" #: src/tables/bom/BomTable.tsx:464 #: src/tables/bom/UsedInTable.tsx:85 -#: src/tables/build/BuildLineTable.tsx:202 +#: src/tables/build/BuildLineTable.tsx:203 msgid "Optional" msgstr "" @@ -9345,7 +9355,7 @@ msgid "Show optional items" msgstr "" #: src/tables/bom/BomTable.tsx:469 -#: src/tables/build/BuildLineTable.tsx:197 +#: src/tables/build/BuildLineTable.tsx:198 msgid "Consumable" msgstr "" @@ -9433,7 +9443,7 @@ msgid "Bill of materials cannot be edited, as the part is locked" msgstr "" #: src/tables/bom/UsedInTable.tsx:34 -#: src/tables/build/BuildLineTable.tsx:207 +#: src/tables/build/BuildLineTable.tsx:208 #: src/tables/part/ParametricPartTable.tsx:364 #: src/tables/part/PartBuildAllocationsTable.tsx:60 #: src/tables/part/PartTable.tsx:209 @@ -9455,11 +9465,11 @@ msgstr "" msgid "Show trackable assemblies" msgstr "" -#: src/tables/build/BuildAllocatedStockTable.tsx:67 +#: src/tables/build/BuildAllocatedStockTable.tsx:64 msgid "Allocated to Output" msgstr "" -#: src/tables/build/BuildAllocatedStockTable.tsx:68 +#: src/tables/build/BuildAllocatedStockTable.tsx:65 msgid "Show items allocated to a build output" msgstr "" @@ -9472,7 +9482,7 @@ msgstr "" #~ msgid "Include orders for part variants" #~ msgstr "Include orders for part variants" -#: src/tables/build/BuildAllocatedStockTable.tsx:97 +#: src/tables/build/BuildAllocatedStockTable.tsx:94 #: src/tables/part/PartBuildAllocationsTable.tsx:84 #: src/tables/part/PartPurchaseOrdersTable.tsx:132 #: src/tables/part/PartSalesAllocationsTable.tsx:69 @@ -9482,40 +9492,58 @@ msgid "Order Status" msgstr "" #: src/tables/build/BuildAllocatedStockTable.tsx:164 -#~ msgid "Edit Build Item" -#~ msgstr "Edit Build Item" - -#: src/tables/build/BuildAllocatedStockTable.tsx:167 -#: src/tables/build/BuildLineTable.tsx:650 +#: src/tables/build/BuildLineTable.tsx:651 msgid "Edit Stock Allocation" msgstr "" +#: src/tables/build/BuildAllocatedStockTable.tsx:164 +#~ msgid "Edit Build Item" +#~ msgstr "Edit Build Item" + #: src/tables/build/BuildAllocatedStockTable.tsx:174 #~ msgid "Delete Build Item" #~ msgstr "Delete Build Item" -#: src/tables/build/BuildAllocatedStockTable.tsx:180 -#: src/tables/build/BuildLineTable.tsx:663 -msgid "Delete Stock Allocation" +#: src/tables/build/BuildAllocatedStockTable.tsx:177 +#: src/tables/build/BuildLineTable.tsx:664 +#: src/tables/sales/SalesOrderAllocationTable.tsx:218 +msgid "Remove Allocated Stock" msgstr "" -#: src/tables/build/BuildAllocatedStockTable.tsx:239 +#: src/tables/build/BuildAllocatedStockTable.tsx:180 +#: src/tables/build/BuildLineTable.tsx:663 +#~ msgid "Delete Stock Allocation" +#~ msgstr "Delete Stock Allocation" + +#: src/tables/build/BuildAllocatedStockTable.tsx:182 +#: src/tables/build/BuildLineTable.tsx:669 +#: src/tables/sales/SalesOrderAllocationTable.tsx:221 +msgid "Are you sure you want to remove this allocated stock from the order?" +msgstr "" + +#: src/tables/build/BuildAllocatedStockTable.tsx:242 msgid "Consume" msgstr "" +#: src/tables/build/BuildAllocatedStockTable.tsx:259 +#: src/tables/build/BuildLineTable.tsx:112 +#: src/tables/sales/SalesOrderAllocationTable.tsx:248 +msgid "Remove allocated stock" +msgstr "" + #: src/tables/build/BuildLineTable.tsx:59 #~ msgid "Show lines with available stock" #~ msgstr "Show lines with available stock" -#: src/tables/build/BuildLineTable.tsx:120 +#: src/tables/build/BuildLineTable.tsx:121 msgid "View Stock Item" msgstr "" -#: src/tables/build/BuildLineTable.tsx:183 +#: src/tables/build/BuildLineTable.tsx:184 msgid "Show fully allocated lines" msgstr "" -#: src/tables/build/BuildLineTable.tsx:188 +#: src/tables/build/BuildLineTable.tsx:189 msgid "Show fully consumed lines" msgstr "" @@ -9523,124 +9551,124 @@ msgstr "" #~ msgid "Show allocated lines" #~ msgstr "Show allocated lines" -#: src/tables/build/BuildLineTable.tsx:193 +#: src/tables/build/BuildLineTable.tsx:194 msgid "Show items with sufficient available stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:198 +#: src/tables/build/BuildLineTable.tsx:199 msgid "Show consumable lines" msgstr "" -#: src/tables/build/BuildLineTable.tsx:203 +#: src/tables/build/BuildLineTable.tsx:204 msgid "Show optional lines" msgstr "" -#: src/tables/build/BuildLineTable.tsx:212 +#: src/tables/build/BuildLineTable.tsx:213 #: src/tables/part/PartTable.tsx:233 msgid "Testable" msgstr "" -#: src/tables/build/BuildLineTable.tsx:217 +#: src/tables/build/BuildLineTable.tsx:218 #: src/tables/stock/StockItemTable.tsx:388 msgid "Tracked" msgstr "" -#: src/tables/build/BuildLineTable.tsx:218 +#: src/tables/build/BuildLineTable.tsx:219 msgid "Show tracked lines" msgstr "" -#: src/tables/build/BuildLineTable.tsx:223 +#: src/tables/build/BuildLineTable.tsx:224 msgid "Show items with stock on order" msgstr "" -#: src/tables/build/BuildLineTable.tsx:258 +#: src/tables/build/BuildLineTable.tsx:259 #: src/tables/sales/SalesOrderLineItemTable.tsx:172 msgid "In production" msgstr "" -#: src/tables/build/BuildLineTable.tsx:286 +#: src/tables/build/BuildLineTable.tsx:287 msgid "Insufficient stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:302 +#: src/tables/build/BuildLineTable.tsx:303 #: src/tables/sales/SalesOrderLineItemTable.tsx:160 #: src/tables/stock/StockItemTable.tsx:191 msgid "No stock available" msgstr "" -#: src/tables/build/BuildLineTable.tsx:375 +#: src/tables/build/BuildLineTable.tsx:376 msgid "Gets Inherited" msgstr "" -#: src/tables/build/BuildLineTable.tsx:388 +#: src/tables/build/BuildLineTable.tsx:389 msgid "Unit Quantity" msgstr "" -#: src/tables/build/BuildLineTable.tsx:415 +#: src/tables/build/BuildLineTable.tsx:416 msgid "Setup Quantity" msgstr "" -#: src/tables/build/BuildLineTable.tsx:424 +#: src/tables/build/BuildLineTable.tsx:425 msgid "Attrition" msgstr "" -#: src/tables/build/BuildLineTable.tsx:432 +#: src/tables/build/BuildLineTable.tsx:433 msgid "Rounding Multiple" msgstr "" -#: src/tables/build/BuildLineTable.tsx:441 +#: src/tables/build/BuildLineTable.tsx:442 msgid "BOM Information" msgstr "" -#: src/tables/build/BuildLineTable.tsx:515 +#: src/tables/build/BuildLineTable.tsx:516 #: src/tables/part/PartBuildAllocationsTable.tsx:102 msgid "Fully allocated" msgstr "" -#: src/tables/build/BuildLineTable.tsx:563 +#: src/tables/build/BuildLineTable.tsx:564 #: src/tables/sales/SalesOrderLineItemTable.tsx:311 msgid "Create Build Order" msgstr "" -#: src/tables/build/BuildLineTable.tsx:592 +#: src/tables/build/BuildLineTable.tsx:593 msgid "Auto allocation in progress" msgstr "" -#: src/tables/build/BuildLineTable.tsx:595 -#: src/tables/build/BuildLineTable.tsx:802 +#: src/tables/build/BuildLineTable.tsx:596 +#: src/tables/build/BuildLineTable.tsx:809 msgid "Auto Allocate Stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:596 +#: src/tables/build/BuildLineTable.tsx:597 msgid "Automatically allocate stock to this build according to the selected options" msgstr "" -#: src/tables/build/BuildLineTable.tsx:616 -#: src/tables/build/BuildLineTable.tsx:630 -#: src/tables/build/BuildLineTable.tsx:751 -#: src/tables/build/BuildLineTable.tsx:852 +#: src/tables/build/BuildLineTable.tsx:617 +#: src/tables/build/BuildLineTable.tsx:631 +#: src/tables/build/BuildLineTable.tsx:758 +#: src/tables/build/BuildLineTable.tsx:859 #: src/tables/build/BuildOutputTable.tsx:355 #: src/tables/build/BuildOutputTable.tsx:360 msgid "Deallocate Stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:632 +#: src/tables/build/BuildLineTable.tsx:633 msgid "Deallocate all untracked stock for this build order" msgstr "" -#: src/tables/build/BuildLineTable.tsx:634 +#: src/tables/build/BuildLineTable.tsx:635 msgid "Deallocate stock from the selected line item" msgstr "" -#: src/tables/build/BuildLineTable.tsx:638 +#: src/tables/build/BuildLineTable.tsx:639 msgid "Stock has been deallocated" msgstr "" -#: src/tables/build/BuildLineTable.tsx:771 +#: src/tables/build/BuildLineTable.tsx:778 msgid "Build Stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:784 +#: src/tables/build/BuildLineTable.tsx:791 #: src/tables/sales/SalesOrderLineItemTable.tsx:487 msgid "View Part" msgstr "" @@ -9739,7 +9767,7 @@ msgid "Serialize Build Output" msgstr "" #: src/tables/build/BuildOutputTable.tsx:405 -#: src/tables/part/PartTestResultTable.tsx:310 +#: src/tables/part/PartTestResultTable.tsx:318 #: src/tables/stock/StockItemTable.tsx:328 msgid "Filter by stock status" msgstr "" @@ -9964,8 +9992,8 @@ msgid "View Item" msgstr "" #: src/tables/general/ExtraLineItemTable.tsx:95 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:299 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:403 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:300 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:405 #: src/tables/sales/ReturnOrderLineItemTable.tsx:83 #: src/tables/sales/ReturnOrderLineItemTable.tsx:187 #: src/tables/sales/SalesOrderLineItemTable.tsx:252 @@ -9974,14 +10002,14 @@ msgid "Add Line Item" msgstr "" #: src/tables/general/ExtraLineItemTable.tsx:108 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:320 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:322 #: src/tables/sales/ReturnOrderLineItemTable.tsx:96 #: src/tables/sales/SalesOrderLineItemTable.tsx:271 msgid "Edit Line Item" msgstr "" #: src/tables/general/ExtraLineItemTable.tsx:117 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:329 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:331 #: src/tables/sales/ReturnOrderLineItemTable.tsx:105 #: src/tables/sales/SalesOrderLineItemTable.tsx:280 msgid "Delete Line Item" @@ -10273,7 +10301,7 @@ msgid "Required Stock" msgstr "" #: src/tables/part/PartBuildAllocationsTable.tsx:124 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:381 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:383 msgid "View Build Order" msgstr "" @@ -10617,8 +10645,8 @@ msgstr "" #: src/tables/part/PartTestResultTable.tsx:103 #: src/tables/part/PartTestResultTable.tsx:181 -#: src/tables/part/PartTestResultTable.tsx:320 -#: src/tables/part/PartTestResultTable.tsx:334 +#: src/tables/part/PartTestResultTable.tsx:328 +#: src/tables/part/PartTestResultTable.tsx:342 #: src/tables/stock/StockItemTestResultTable.tsx:296 #: src/tables/stock/StockItemTestResultTable.tsx:368 #: src/tables/stock/StockItemTestResultTable.tsx:429 @@ -10643,7 +10671,7 @@ msgstr "" msgid "No Result" msgstr "" -#: src/tables/part/PartTestResultTable.tsx:298 +#: src/tables/part/PartTestResultTable.tsx:306 msgid "Show build outputs currently in production" msgstr "" @@ -11073,7 +11101,7 @@ msgid "Show manufacturer parts for active manufacturers." msgstr "" #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:115 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:397 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:399 msgid "Import Line Items" msgstr "" @@ -11099,11 +11127,11 @@ msgstr "" #~ msgid "Add line item" #~ msgstr "Add line item" -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:350 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:352 msgid "Receive line item" msgstr "" -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:414 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:416 msgid "Receive items" msgstr "" @@ -11201,25 +11229,25 @@ msgid "Not shipped" msgstr "" #: src/tables/sales/SalesOrderAllocationTable.tsx:211 -#: src/tables/sales/SalesOrderAllocationTable.tsx:229 +#: src/tables/sales/SalesOrderAllocationTable.tsx:235 msgid "Edit Allocation" msgstr "" #: src/tables/sales/SalesOrderAllocationTable.tsx:218 #: src/tables/sales/SalesOrderAllocationTable.tsx:241 -msgid "Delete Allocation" -msgstr "" +#~ msgid "Delete Allocation" +#~ msgstr "Delete Allocation" -#: src/tables/sales/SalesOrderAllocationTable.tsx:252 -#: src/tables/sales/SalesOrderAllocationTable.tsx:253 +#: src/tables/sales/SalesOrderAllocationTable.tsx:261 +#: src/tables/sales/SalesOrderAllocationTable.tsx:262 msgid "View Shipment" msgstr "" -#: src/tables/sales/SalesOrderAllocationTable.tsx:308 +#: src/tables/sales/SalesOrderAllocationTable.tsx:317 msgid "Assign to Shipment" msgstr "" -#: src/tables/sales/SalesOrderAllocationTable.tsx:324 +#: src/tables/sales/SalesOrderAllocationTable.tsx:333 msgid "Assign to shipment" msgstr "" diff --git a/src/frontend/src/locales/tr/messages.po b/src/frontend/src/locales/tr/messages.po index fb7f984c8b..7ddbd637a3 100644 --- a/src/frontend/src/locales/tr/messages.po +++ b/src/frontend/src/locales/tr/messages.po @@ -8,7 +8,7 @@ msgstr "" "Language: tr\n" "Project-Id-Version: inventree\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2025-11-19 19:39\n" +"PO-Revision-Date: 2025-11-22 06:25\n" "Last-Translator: \n" "Language-Team: Turkish\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" @@ -56,7 +56,7 @@ msgstr "Vazgeç" #: lib/components/RowActions.tsx:136 #: src/components/nav/NavigationDrawer.tsx:190 -#: src/forms/PurchaseOrderForms.tsx:802 +#: src/forms/PurchaseOrderForms.tsx:854 #: src/forms/StockForms.tsx:796 #: src/forms/StockForms.tsx:843 #: src/forms/StockForms.tsx:889 @@ -103,9 +103,9 @@ msgstr "Hayır" #: src/forms/BuildForms.tsx:630 #: src/forms/BuildForms.tsx:793 #: src/forms/BuildForms.tsx:896 -#: src/forms/PurchaseOrderForms.tsx:798 +#: src/forms/PurchaseOrderForms.tsx:850 #: src/forms/ReturnOrderForms.tsx:242 -#: src/forms/SalesOrderForms.tsx:305 +#: src/forms/SalesOrderForms.tsx:323 #: src/forms/StockForms.tsx:360 #: src/forms/StockForms.tsx:791 #: src/forms/StockForms.tsx:838 @@ -119,6 +119,7 @@ msgstr "Hayır" #: src/pages/build/BuildDetail.tsx:200 #: src/pages/part/PartDetail.tsx:1207 #: src/tables/ColumnRenderers.tsx:91 +#: src/tables/part/PartTestResultTable.tsx:247 #: src/tables/part/RelatedPartTable.tsx:53 #: src/tables/stock/StockTrackingTable.tsx:87 msgid "Part" @@ -158,7 +159,7 @@ msgstr "Parça Test Şablonları" #: src/components/wizards/OrderPartsWizard.tsx:290 #: src/pages/company/SupplierPartDetail.tsx:413 #: src/pages/stock/StockDetail.tsx:289 -#: src/tables/build/BuildAllocatedStockTable.tsx:155 +#: src/tables/build/BuildAllocatedStockTable.tsx:152 #: src/tables/part/PartPurchaseOrdersTable.tsx:50 #: src/tables/purchasing/SupplierPartTable.tsx:83 #: src/tables/stock/StockItemTable.tsx:247 @@ -201,9 +202,9 @@ msgstr "Parça Kategorileri" #: src/forms/BuildForms.tsx:473 #: src/forms/BuildForms.tsx:633 #: src/forms/BuildForms.tsx:794 -#: src/forms/SalesOrderForms.tsx:307 +#: src/forms/SalesOrderForms.tsx:325 #: src/pages/stock/StockDetail.tsx:1005 -#: src/tables/part/PartTestResultTable.tsx:248 +#: src/tables/part/PartTestResultTable.tsx:256 #: src/tables/stock/StockTrackingTable.tsx:48 #: src/tables/stock/StockTrackingTable.tsx:55 msgid "Stock Item" @@ -517,7 +518,7 @@ msgstr "Seçim Listeleri" #: src/components/dashboard/DashboardLayout.tsx:281 #: src/components/editors/NotesEditor.tsx:74 #: src/components/editors/TemplateEditor/TemplateEditor.tsx:158 -#: src/components/forms/fields/ApiFormField.tsx:273 +#: src/components/forms/fields/ApiFormField.tsx:237 #: src/components/forms/fields/TableField.tsx:45 #: src/components/importer/ImportDataSelector.tsx:192 #: src/components/importer/ImporterColumnSelector.tsx:234 @@ -642,8 +643,8 @@ msgstr "Barkod verisi gir" #: src/components/barcodes/BarcodeScanDialog.tsx:49 #: src/components/buttons/ScanButton.tsx:15 #: src/components/nav/NavigationDrawer.tsx:122 -#: src/forms/PurchaseOrderForms.tsx:457 -#: src/forms/PurchaseOrderForms.tsx:563 +#: src/forms/PurchaseOrderForms.tsx:509 +#: src/forms/PurchaseOrderForms.tsx:615 msgid "Scan Barcode" msgstr "Barkod Tara" @@ -728,7 +729,7 @@ msgstr "Bu, ilgili barkoda olan bağlantıyı kaldıracaktır" #: src/components/barcodes/QRCode.tsx:205 #: src/components/items/ActionDropdown.tsx:192 -#: src/forms/PurchaseOrderForms.tsx:554 +#: src/forms/PurchaseOrderForms.tsx:606 msgid "Unlink Barcode" msgstr "Barkodun Bağlantısını Kaldır" @@ -1216,6 +1217,12 @@ msgstr "Bu ögeyle ilişkilendirilmiş resim kaldırılsın mı?" #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:884 #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:903 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:254 +#: src/tables/build/BuildAllocatedStockTable.tsx:178 +#: src/tables/build/BuildAllocatedStockTable.tsx:258 +#: src/tables/build/BuildLineTable.tsx:111 +#: src/tables/build/BuildLineTable.tsx:665 +#: src/tables/sales/SalesOrderAllocationTable.tsx:224 +#: src/tables/sales/SalesOrderAllocationTable.tsx:247 msgid "Remove" msgstr "Kaldır" @@ -1241,7 +1248,7 @@ msgid "Upload Error" msgstr "Yükleme Hatası" #: src/components/details/DetailsImage.tsx:250 -#: src/components/forms/fields/TextField.tsx:65 +#: src/components/forms/fields/AutoFillRightSection.tsx:34 msgid "Clear" msgstr "Temizle" @@ -1817,10 +1824,14 @@ msgstr "Durdu" msgid "Running" msgstr "Çalışıyor" -#: src/components/forms/fields/ApiFormField.tsx:233 +#: src/components/forms/fields/ApiFormField.tsx:197 msgid "Select file to upload" msgstr "Yüklemek için dosya seçin" +#: src/components/forms/fields/AutoFillRightSection.tsx:47 +msgid "Accept suggested value" +msgstr "Önerilen değeri kabul et" + #: src/components/forms/fields/DateField.tsx:76 msgid "Select date" msgstr "Tarih seçin" @@ -1875,10 +1886,6 @@ msgstr "Kullanılabilir girdi yok" msgid "Add new row" msgstr "Yeni satır ekle" -#: src/components/forms/fields/TextField.tsx:82 -msgid "Accept suggested value" -msgstr "Önerilen değeri kabul et" - #: src/components/images/DetailsImage.tsx:252 #~ msgid "Select image" #~ msgstr "Select image" @@ -2225,8 +2232,8 @@ msgstr "Öğe yok" #: src/pages/part/PartDetail.tsx:994 #: src/pages/stock/StockDetail.tsx:265 #: src/pages/stock/StockDetail.tsx:942 -#: src/tables/build/BuildAllocatedStockTable.tsx:135 -#: src/tables/build/BuildLineTable.tsx:192 +#: src/tables/build/BuildAllocatedStockTable.tsx:132 +#: src/tables/build/BuildLineTable.tsx:193 #: src/tables/part/PartTable.tsx:137 #: src/tables/stock/StockItemTable.tsx:182 #: src/tables/stock/StockItemTable.tsx:343 @@ -2784,7 +2791,7 @@ msgstr "Eklenti Bilgileri" #: src/pages/sales/SalesOrderDetail.tsx:119 #: src/pages/stock/LocationDetail.tsx:102 #: src/tables/ColumnRenderers.tsx:278 -#: src/tables/build/BuildAllocatedStockTable.tsx:91 +#: src/tables/build/BuildAllocatedStockTable.tsx:88 #: src/tables/machine/MachineTypeTable.tsx:161 #: src/tables/machine/MachineTypeTable.tsx:257 #: src/tables/plugin/PluginListTable.tsx:110 @@ -2966,7 +2973,7 @@ msgstr "Stok yok" #: src/pages/company/SupplierPartDetail.tsx:394 #: src/pages/part/PartDetail.tsx:1015 #: src/tables/bom/BomTable.tsx:444 -#: src/tables/build/BuildLineTable.tsx:222 +#: src/tables/build/BuildLineTable.tsx:223 #: src/tables/part/PartTable.tsx:108 msgid "On Order" msgstr "Siparişte" @@ -2976,7 +2983,7 @@ msgstr "Siparişte" #: src/pages/part/PartDetail.tsx:587 #: src/pages/part/PartDetail.tsx:1021 #: src/pages/stock/StockDetail.tsx:925 -#: src/tables/part/PartTestResultTable.tsx:297 +#: src/tables/part/PartTestResultTable.tsx:305 #: src/tables/stock/StockItemTable.tsx:359 msgid "In Production" msgstr "Üretimde" @@ -3000,7 +3007,7 @@ msgstr "Kategori" #: src/components/render/Stock.tsx:114 #: src/components/render/Stock.tsx:132 #: src/forms/BuildForms.tsx:795 -#: src/forms/PurchaseOrderForms.tsx:595 +#: src/forms/PurchaseOrderForms.tsx:647 #: src/forms/StockForms.tsx:792 #: src/forms/StockForms.tsx:839 #: src/forms/StockForms.tsx:885 @@ -3023,7 +3030,7 @@ msgstr "Konum" #: src/components/render/Stock.tsx:99 #: src/pages/stock/StockDetail.tsx:198 #: src/pages/stock/StockDetail.tsx:930 -#: src/tables/build/BuildAllocatedStockTable.tsx:121 +#: src/tables/build/BuildAllocatedStockTable.tsx:118 #: src/tables/build/BuildOutputTable.tsx:107 #: src/tables/sales/SalesOrderAllocationTable.tsx:142 msgid "Serial Number" @@ -3034,9 +3041,9 @@ msgstr "Seri Numarası" #: src/forms/BuildForms.tsx:240 #: src/forms/BuildForms.tsx:634 #: src/forms/BuildForms.tsx:797 -#: src/forms/PurchaseOrderForms.tsx:801 +#: src/forms/PurchaseOrderForms.tsx:853 #: src/forms/ReturnOrderForms.tsx:243 -#: src/forms/SalesOrderForms.tsx:308 +#: src/forms/SalesOrderForms.tsx:326 #: src/forms/StockForms.tsx:841 #: src/pages/part/PartStockHistoryDetail.tsx:56 #: src/pages/part/PartStockHistoryDetail.tsx:210 @@ -3046,9 +3053,9 @@ msgstr "Seri Numarası" #: src/pages/part/pricing/PriceBreakPanel.tsx:172 #: src/pages/stock/StockDetail.tsx:258 #: src/pages/stock/StockDetail.tsx:936 -#: src/tables/build/BuildLineTable.tsx:86 +#: src/tables/build/BuildLineTable.tsx:83 #: src/tables/part/PartPurchaseOrdersTable.tsx:94 -#: src/tables/part/PartTestResultTable.tsx:269 +#: src/tables/part/PartTestResultTable.tsx:277 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:175 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:206 #: src/tables/purchasing/SupplierPriceBreakTable.tsx:69 @@ -3070,7 +3077,7 @@ msgstr "Miktar" #: src/forms/StockForms.tsx:1048 #: src/forms/StockForms.tsx:1096 #: src/forms/StockForms.tsx:1140 -#: src/tables/build/BuildLineTable.tsx:96 +#: src/tables/build/BuildLineTable.tsx:93 msgid "Batch" msgstr "Parti" @@ -3755,7 +3762,7 @@ msgid "In Stock" msgstr "Stokta" #: src/components/wizards/OrderPartsWizard.tsx:146 -#: src/tables/build/BuildLineTable.tsx:404 +#: src/tables/build/BuildLineTable.tsx:405 msgid "Required Quantity" msgstr "" @@ -3847,7 +3854,7 @@ msgid "Please correct the errors in the selected parts" msgstr "" #: src/components/wizards/OrderPartsWizard.tsx:587 -#: src/tables/build/BuildLineTable.tsx:815 +#: src/tables/build/BuildLineTable.tsx:822 #: src/tables/part/PartTable.tsx:522 #: src/tables/sales/SalesOrderLineItemTable.tsx:370 msgid "Order Parts" @@ -4349,9 +4356,9 @@ msgstr "" #: src/forms/BuildForms.tsx:333 #: src/forms/BuildForms.tsx:408 #: src/forms/BuildForms.tsx:685 -#: src/tables/build/BuildAllocatedStockTable.tsx:150 +#: src/tables/build/BuildAllocatedStockTable.tsx:147 #: src/tables/build/BuildOutputTable.tsx:582 -#: src/tables/part/PartTestResultTable.tsx:272 +#: src/tables/part/PartTestResultTable.tsx:280 msgid "Build Output" msgstr "Yapım Çıktısı" @@ -4362,7 +4369,7 @@ msgstr "" #: src/forms/BuildForms.tsx:336 #: src/forms/BuildForms.tsx:411 #: src/forms/BuildForms.tsx:475 -#: src/forms/PurchaseOrderForms.tsx:717 +#: src/forms/PurchaseOrderForms.tsx:769 #: src/forms/ReturnOrderForms.tsx:197 #: src/forms/ReturnOrderForms.tsx:244 #: src/forms/StockForms.tsx:712 @@ -4377,7 +4384,7 @@ msgstr "" #: src/tables/build/BuildOutputTable.tsx:404 #: src/tables/machine/MachineListTable.tsx:387 #: src/tables/part/PartPurchaseOrdersTable.tsx:38 -#: src/tables/part/PartTestResultTable.tsx:309 +#: src/tables/part/PartTestResultTable.tsx:317 #: src/tables/sales/ReturnOrderLineItemTable.tsx:138 #: src/tables/sales/ReturnOrderLineItemTable.tsx:176 #: src/tables/settings/CustomStateTable.tsx:79 @@ -4450,8 +4457,8 @@ msgstr "Yapı çıktıları iptal edildi" #: src/pages/stock/StockDetail.tsx:153 #: src/tables/bom/BomTable.tsx:134 #: src/tables/bom/UsedInTable.tsx:40 -#: src/tables/build/BuildAllocatedStockTable.tsx:108 -#: src/tables/build/BuildLineTable.tsx:336 +#: src/tables/build/BuildAllocatedStockTable.tsx:105 +#: src/tables/build/BuildLineTable.tsx:337 #: src/tables/build/BuildOrderTable.tsx:79 #: src/tables/part/PartSalesAllocationsTable.tsx:61 #: src/tables/part/RelatedPartTable.tsx:73 @@ -4466,47 +4473,47 @@ msgstr "DPN" #: src/forms/BuildForms.tsx:632 #: src/forms/BuildForms.tsx:796 #: src/forms/BuildForms.tsx:897 -#: src/forms/SalesOrderForms.tsx:306 -#: src/tables/build/BuildAllocatedStockTable.tsx:139 -#: src/tables/build/BuildLineTable.tsx:182 +#: src/forms/SalesOrderForms.tsx:324 +#: src/tables/build/BuildAllocatedStockTable.tsx:136 +#: src/tables/build/BuildLineTable.tsx:183 #: src/tables/sales/SalesOrderLineItemTable.tsx:342 #: src/tables/stock/StockItemTable.tsx:338 msgid "Allocated" msgstr "Ayrıldı" #: src/forms/BuildForms.tsx:667 -#: src/forms/SalesOrderForms.tsx:295 +#: src/forms/SalesOrderForms.tsx:313 #: src/pages/build/BuildDetail.tsx:108 #: src/pages/build/BuildDetail.tsx:326 msgid "Source Location" msgstr "Kaynak Konum" #: src/forms/BuildForms.tsx:668 -#: src/forms/SalesOrderForms.tsx:296 +#: src/forms/SalesOrderForms.tsx:314 msgid "Select the source location for the stock allocation" msgstr "" #: src/forms/BuildForms.tsx:700 -#: src/forms/SalesOrderForms.tsx:336 -#: src/tables/build/BuildLineTable.tsx:574 -#: src/tables/build/BuildLineTable.tsx:731 -#: src/tables/build/BuildLineTable.tsx:830 +#: src/forms/SalesOrderForms.tsx:354 +#: src/tables/build/BuildLineTable.tsx:575 +#: src/tables/build/BuildLineTable.tsx:738 +#: src/tables/build/BuildLineTable.tsx:837 #: src/tables/sales/SalesOrderLineItemTable.tsx:380 #: src/tables/sales/SalesOrderLineItemTable.tsx:406 msgid "Allocate Stock" msgstr "Stoku Ayır" #: src/forms/BuildForms.tsx:703 -#: src/forms/SalesOrderForms.tsx:341 +#: src/forms/SalesOrderForms.tsx:359 msgid "Stock items allocated" msgstr "" #: src/forms/BuildForms.tsx:816 #: src/forms/BuildForms.tsx:917 -#: src/tables/build/BuildAllocatedStockTable.tsx:240 -#: src/tables/build/BuildAllocatedStockTable.tsx:272 -#: src/tables/build/BuildLineTable.tsx:741 -#: src/tables/build/BuildLineTable.tsx:864 +#: src/tables/build/BuildAllocatedStockTable.tsx:243 +#: src/tables/build/BuildAllocatedStockTable.tsx:279 +#: src/tables/build/BuildLineTable.tsx:748 +#: src/tables/build/BuildLineTable.tsx:871 msgid "Consume Stock" msgstr "" @@ -4521,21 +4528,21 @@ msgstr "" #~ msgstr "Stock items consumed" #: src/forms/BuildForms.tsx:853 -#: src/tables/build/BuildLineTable.tsx:514 +#: src/tables/build/BuildLineTable.tsx:515 #: src/tables/part/PartBuildAllocationsTable.tsx:101 msgid "Fully consumed" msgstr "" #: src/forms/BuildForms.tsx:898 -#: src/tables/build/BuildLineTable.tsx:187 +#: src/tables/build/BuildLineTable.tsx:188 #: src/tables/stock/StockItemTable.tsx:367 msgid "Consumed" msgstr "Tüketildi" #: src/forms/CommonForms.tsx:88 -#: src/forms/PurchaseOrderForms.tsx:125 +#: src/forms/PurchaseOrderForms.tsx:176 #: src/forms/ReturnOrderForms.tsx:138 -#: src/forms/SalesOrderForms.tsx:164 +#: src/forms/SalesOrderForms.tsx:182 msgid "Select project code for this line item" msgstr "" @@ -4572,127 +4579,127 @@ msgstr "Üst parça sınıfı" msgid "Subscribe to notifications for this category" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:388 -msgid "Assign Batch Code and Serial Numbers" -msgstr "Parti No ve Seri No Ataması" - -#: src/forms/PurchaseOrderForms.tsx:390 -msgid "Assign Batch Code" -msgstr "Parti Kodu Ata" - -#: src/forms/PurchaseOrderForms.tsx:410 -msgid "Choose Location" -msgstr "Konum Seçiniz" - -#: src/forms/PurchaseOrderForms.tsx:418 -msgid "Item Destination selected" -msgstr "Öge hedefi seçildi" - #: src/forms/PurchaseOrderForms.tsx:421 #~ msgid "Assign Batch Code{0}" #~ msgstr "Assign Batch Code{0}" -#: src/forms/PurchaseOrderForms.tsx:428 -msgid "Part category default location selected" -msgstr "Parça sınıfı varsayılan konum seçildi" +#: src/forms/PurchaseOrderForms.tsx:440 +msgid "Assign Batch Code and Serial Numbers" +msgstr "Parti No ve Seri No Ataması" -#: src/forms/PurchaseOrderForms.tsx:438 -msgid "Received stock location selected" -msgstr "Alınan stok konumu seçildi" +#: src/forms/PurchaseOrderForms.tsx:442 +msgid "Assign Batch Code" +msgstr "Parti Kodu Ata" #: src/forms/PurchaseOrderForms.tsx:444 #: src/forms/StockForms.tsx:428 #~ msgid "Remove item from list" #~ msgstr "Remove item from list" -#: src/forms/PurchaseOrderForms.tsx:446 +#: src/forms/PurchaseOrderForms.tsx:462 +msgid "Choose Location" +msgstr "Konum Seçiniz" + +#: src/forms/PurchaseOrderForms.tsx:470 +msgid "Item Destination selected" +msgstr "Öge hedefi seçildi" + +#: src/forms/PurchaseOrderForms.tsx:480 +msgid "Part category default location selected" +msgstr "Parça sınıfı varsayılan konum seçildi" + +#: src/forms/PurchaseOrderForms.tsx:490 +msgid "Received stock location selected" +msgstr "Alınan stok konumu seçildi" + +#: src/forms/PurchaseOrderForms.tsx:498 msgid "Default location selected" msgstr "Varsayılan konum seçildi" -#: src/forms/PurchaseOrderForms.tsx:507 +#: src/forms/PurchaseOrderForms.tsx:559 msgid "Set Location" msgstr "Konum Ayarla" -#: src/forms/PurchaseOrderForms.tsx:524 -msgid "Set Expiry Date" -msgstr "Son Kullanma Tarihi Belirle" - -#: src/forms/PurchaseOrderForms.tsx:532 -#: src/forms/StockForms.tsx:693 -msgid "Adjust Packaging" -msgstr "Paketlemeyi Ayarla" - -#: src/forms/PurchaseOrderForms.tsx:540 -#: src/forms/StockForms.tsx:684 -#: src/hooks/UseStockAdjustActions.tsx:148 -msgid "Change Status" -msgstr "Durumu Değiştir" - -#: src/forms/PurchaseOrderForms.tsx:546 -msgid "Add Note" -msgstr "Note Ekle" - #: src/forms/PurchaseOrderForms.tsx:566 #~ msgid "Serial numbers" #~ msgstr "Serial numbers" +#: src/forms/PurchaseOrderForms.tsx:576 +msgid "Set Expiry Date" +msgstr "Son Kullanma Tarihi Belirle" + #: src/forms/PurchaseOrderForms.tsx:582 #~ msgid "Store at line item destination" #~ msgstr "Store at line item destination" -#: src/forms/PurchaseOrderForms.tsx:610 -msgid "Store at default location" -msgstr "Varsayılan konumda depola" +#: src/forms/PurchaseOrderForms.tsx:584 +#: src/forms/StockForms.tsx:693 +msgid "Adjust Packaging" +msgstr "Paketlemeyi Ayarla" -#: src/forms/PurchaseOrderForms.tsx:625 -msgid "Store at line item destination " -msgstr "Satır ögesinin hedefinde depola " +#: src/forms/PurchaseOrderForms.tsx:592 +#: src/forms/StockForms.tsx:684 +#: src/hooks/UseStockAdjustActions.tsx:148 +msgid "Change Status" +msgstr "Durumu Değiştir" -#: src/forms/PurchaseOrderForms.tsx:637 -msgid "Store with already received stock" -msgstr "Önceden alınmış bir stok ile depola" +#: src/forms/PurchaseOrderForms.tsx:598 +msgid "Add Note" +msgstr "Note Ekle" #: src/forms/PurchaseOrderForms.tsx:658 #~ msgid "Receive line items" #~ msgstr "Receive line items" -#: src/forms/PurchaseOrderForms.tsx:661 +#: src/forms/PurchaseOrderForms.tsx:662 +msgid "Store at default location" +msgstr "Varsayılan konumda depola" + +#: src/forms/PurchaseOrderForms.tsx:677 +msgid "Store at line item destination " +msgstr "Satır ögesinin hedefinde depola " + +#: src/forms/PurchaseOrderForms.tsx:689 +msgid "Store with already received stock" +msgstr "Önceden alınmış bir stok ile depola" + +#: src/forms/PurchaseOrderForms.tsx:713 #: src/pages/build/BuildDetail.tsx:340 #: src/pages/stock/StockDetail.tsx:280 #: src/pages/stock/StockDetail.tsx:952 #: src/tables/Filter.tsx:83 -#: src/tables/build/BuildAllocatedStockTable.tsx:128 +#: src/tables/build/BuildAllocatedStockTable.tsx:125 #: src/tables/build/BuildOutputTable.tsx:112 -#: src/tables/part/PartTestResultTable.tsx:260 -#: src/tables/part/PartTestResultTable.tsx:281 +#: src/tables/part/PartTestResultTable.tsx:268 +#: src/tables/part/PartTestResultTable.tsx:289 #: src/tables/sales/SalesOrderAllocationTable.tsx:149 msgid "Batch Code" msgstr "Parti Kodu" -#: src/forms/PurchaseOrderForms.tsx:662 +#: src/forms/PurchaseOrderForms.tsx:714 msgid "Enter batch code for received items" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:675 +#: src/forms/PurchaseOrderForms.tsx:727 #: src/forms/StockForms.tsx:218 msgid "Serial Numbers" msgstr "Seri Numaraları" -#: src/forms/PurchaseOrderForms.tsx:676 +#: src/forms/PurchaseOrderForms.tsx:728 msgid "Enter serial numbers for received items" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:690 +#: src/forms/PurchaseOrderForms.tsx:742 #: src/pages/stock/StockDetail.tsx:382 #: src/tables/stock/StockItemTable.tsx:294 msgid "Expiry Date" msgstr "Son Kullanma Tarihi" -#: src/forms/PurchaseOrderForms.tsx:691 +#: src/forms/PurchaseOrderForms.tsx:743 msgid "Enter an expiry date for received items" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:703 +#: src/forms/PurchaseOrderForms.tsx:755 #: src/forms/StockForms.tsx:728 #: src/pages/company/SupplierPartDetail.tsx:172 #: src/pages/company/SupplierPartDetail.tsx:236 @@ -4701,19 +4708,19 @@ msgstr "" msgid "Packaging" msgstr "Paketleme" -#: src/forms/PurchaseOrderForms.tsx:727 +#: src/forms/PurchaseOrderForms.tsx:779 #: src/pages/company/SupplierPartDetail.tsx:120 #: src/tables/ColumnRenderers.tsx:332 msgid "Note" msgstr "Not" -#: src/forms/PurchaseOrderForms.tsx:799 +#: src/forms/PurchaseOrderForms.tsx:851 #: src/pages/company/SupplierPartDetail.tsx:138 #: src/tables/purchasing/SupplierPriceBreakTable.tsx:49 msgid "SKU" msgstr "SKU" -#: src/forms/PurchaseOrderForms.tsx:800 +#: src/forms/PurchaseOrderForms.tsx:852 #: src/tables/part/PartPurchaseOrdersTable.tsx:127 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:213 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:283 @@ -4721,11 +4728,11 @@ msgstr "SKU" msgid "Received" msgstr "Alındı" -#: src/forms/PurchaseOrderForms.tsx:817 +#: src/forms/PurchaseOrderForms.tsx:869 msgid "Receive Line Items" msgstr "Alınan Satır Ögeleri" -#: src/forms/PurchaseOrderForms.tsx:823 +#: src/forms/PurchaseOrderForms.tsx:875 msgid "Items received" msgstr "" @@ -4737,7 +4744,7 @@ msgstr "" msgid "Item received into stock" msgstr "" -#: src/forms/SalesOrderForms.tsx:401 +#: src/forms/SalesOrderForms.tsx:419 msgid "Leave blank to use the order address" msgstr "" @@ -5932,6 +5939,9 @@ msgstr "" #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:310 #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:401 +#: src/tables/build/BuildAllocatedStockTable.tsx:181 +#: src/tables/build/BuildLineTable.tsx:668 +#: src/tables/sales/SalesOrderAllocationTable.tsx:220 msgid "Confirm Removal" msgstr "" @@ -6870,8 +6880,8 @@ msgstr "Harici" #: src/pages/sales/ReturnOrderDetail.tsx:108 #: src/pages/sales/SalesOrderDetail.tsx:98 #: src/tables/ColumnRenderers.tsx:321 -#: src/tables/build/BuildAllocatedStockTable.tsx:115 -#: src/tables/build/BuildLineTable.tsx:352 +#: src/tables/build/BuildAllocatedStockTable.tsx:112 +#: src/tables/build/BuildLineTable.tsx:353 msgid "Reference" msgstr "Referans" @@ -7132,7 +7142,7 @@ msgstr "Siparişi iptal et" #: src/pages/build/BuildDetail.tsx:742 #: src/pages/stock/StockDetail.tsx:344 -#: src/tables/build/BuildAllocatedStockTable.tsx:85 +#: src/tables/build/BuildAllocatedStockTable.tsx:82 #: src/tables/part/PartBuildAllocationsTable.tsx:45 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:157 #: src/tables/stock/StockTrackingTable.tsx:109 @@ -7600,7 +7610,7 @@ msgstr "Anahtar Sözcükler" #: src/pages/part/PartDetail.tsx:542 #: src/tables/bom/BomTable.tsx:439 -#: src/tables/build/BuildLineTable.tsx:305 +#: src/tables/build/BuildLineTable.tsx:306 #: src/tables/part/PartTable.tsx:319 #: src/tables/sales/SalesOrderLineItemTable.tsx:138 msgid "Available Stock" @@ -7608,7 +7618,7 @@ msgstr "Mevcut Stok" #: src/pages/part/PartDetail.tsx:548 #: src/tables/bom/BomTable.tsx:341 -#: src/tables/build/BuildLineTable.tsx:267 +#: src/tables/build/BuildLineTable.tsx:268 #: src/tables/sales/SalesOrderLineItemTable.tsx:180 msgid "On order" msgstr "Siparişte" @@ -7782,7 +7792,7 @@ msgstr "Emir" #: src/pages/part/PartDetail.tsx:1144 #: src/pages/stock/StockDetail.tsx:884 -#: src/tables/build/BuildLineTable.tsx:761 +#: src/tables/build/BuildLineTable.tsx:768 msgid "Order Stock" msgstr "Stok Sipariş Et" @@ -9219,13 +9229,13 @@ msgstr "" #~ msgstr "Show asssmbled items" #: src/tables/bom/BomTable.tsx:315 -#: src/tables/build/BuildLineTable.tsx:276 +#: src/tables/build/BuildLineTable.tsx:277 #: src/tables/part/PartTable.tsx:145 msgid "External stock" msgstr "Harici stok" #: src/tables/bom/BomTable.tsx:323 -#: src/tables/build/BuildLineTable.tsx:239 +#: src/tables/build/BuildLineTable.tsx:240 msgid "Includes substitute stock" msgstr "Yedek stok içerir" @@ -9234,7 +9244,7 @@ msgstr "Yedek stok içerir" #~ msgstr "Edit Bom Item" #: src/tables/bom/BomTable.tsx:332 -#: src/tables/build/BuildLineTable.tsx:249 +#: src/tables/build/BuildLineTable.tsx:250 #: src/tables/sales/SalesOrderLineItemTable.tsx:166 msgid "Includes variant stock" msgstr "Türev stok içerir" @@ -9272,8 +9282,8 @@ msgid "Stock Information" msgstr "Stok Bilgisi" #: src/tables/bom/BomTable.tsx:399 -#: src/tables/build/BuildLineTable.tsx:496 -#: src/tables/build/BuildLineTable.tsx:537 +#: src/tables/build/BuildLineTable.tsx:497 +#: src/tables/build/BuildLineTable.tsx:538 msgid "Consumable item" msgstr "Tüketilebilir öge" @@ -9282,7 +9292,7 @@ msgid "No available stock" msgstr "Yetersiz stok" #: src/tables/bom/BomTable.tsx:420 -#: src/tables/build/BuildLineTable.tsx:213 +#: src/tables/build/BuildLineTable.tsx:214 msgid "Show testable items" msgstr "Test edilebilir ögeleri göster" @@ -9291,7 +9301,7 @@ msgid "Show trackable items" msgstr "İzlenebilir ögeleri göster" #: src/tables/bom/BomTable.tsx:430 -#: src/tables/build/BuildLineTable.tsx:208 +#: src/tables/build/BuildLineTable.tsx:209 msgid "Show assembled items" msgstr "Birleştirilmiş ögeleri göster" @@ -9335,7 +9345,7 @@ msgstr "Türev değişimine izin veren ögeleri göster" #: src/tables/bom/BomTable.tsx:464 #: src/tables/bom/UsedInTable.tsx:85 -#: src/tables/build/BuildLineTable.tsx:202 +#: src/tables/build/BuildLineTable.tsx:203 msgid "Optional" msgstr "İsteğe bağlı" @@ -9345,7 +9355,7 @@ msgid "Show optional items" msgstr "İsteğe bağlı ögeleri göster" #: src/tables/bom/BomTable.tsx:469 -#: src/tables/build/BuildLineTable.tsx:197 +#: src/tables/build/BuildLineTable.tsx:198 msgid "Consumable" msgstr "Tüketilebilir" @@ -9433,7 +9443,7 @@ msgid "Bill of materials cannot be edited, as the part is locked" msgstr "Parça kilitli olduğundan malzeme listesi düzenlenemez" #: src/tables/bom/UsedInTable.tsx:34 -#: src/tables/build/BuildLineTable.tsx:207 +#: src/tables/build/BuildLineTable.tsx:208 #: src/tables/part/ParametricPartTable.tsx:364 #: src/tables/part/PartBuildAllocationsTable.tsx:60 #: src/tables/part/PartTable.tsx:209 @@ -9455,11 +9465,11 @@ msgstr "Takip Edilebilir" msgid "Show trackable assemblies" msgstr "İzlenebilir birleştirmeleri göster" -#: src/tables/build/BuildAllocatedStockTable.tsx:67 +#: src/tables/build/BuildAllocatedStockTable.tsx:64 msgid "Allocated to Output" msgstr "Çıktıya Ayrıldı" -#: src/tables/build/BuildAllocatedStockTable.tsx:68 +#: src/tables/build/BuildAllocatedStockTable.tsx:65 msgid "Show items allocated to a build output" msgstr "Bir yapı çıktısına ayrılan ögeleri göster" @@ -9472,7 +9482,7 @@ msgstr "Bir yapı çıktısına ayrılan ögeleri göster" #~ msgid "Include orders for part variants" #~ msgstr "Include orders for part variants" -#: src/tables/build/BuildAllocatedStockTable.tsx:97 +#: src/tables/build/BuildAllocatedStockTable.tsx:94 #: src/tables/part/PartBuildAllocationsTable.tsx:84 #: src/tables/part/PartPurchaseOrdersTable.tsx:132 #: src/tables/part/PartSalesAllocationsTable.tsx:69 @@ -9482,40 +9492,58 @@ msgid "Order Status" msgstr "Sipariş Durumu" #: src/tables/build/BuildAllocatedStockTable.tsx:164 -#~ msgid "Edit Build Item" -#~ msgstr "Edit Build Item" - -#: src/tables/build/BuildAllocatedStockTable.tsx:167 -#: src/tables/build/BuildLineTable.tsx:650 +#: src/tables/build/BuildLineTable.tsx:651 msgid "Edit Stock Allocation" msgstr "" +#: src/tables/build/BuildAllocatedStockTable.tsx:164 +#~ msgid "Edit Build Item" +#~ msgstr "Edit Build Item" + #: src/tables/build/BuildAllocatedStockTable.tsx:174 #~ msgid "Delete Build Item" #~ msgstr "Delete Build Item" -#: src/tables/build/BuildAllocatedStockTable.tsx:180 -#: src/tables/build/BuildLineTable.tsx:663 -msgid "Delete Stock Allocation" +#: src/tables/build/BuildAllocatedStockTable.tsx:177 +#: src/tables/build/BuildLineTable.tsx:664 +#: src/tables/sales/SalesOrderAllocationTable.tsx:218 +msgid "Remove Allocated Stock" msgstr "" -#: src/tables/build/BuildAllocatedStockTable.tsx:239 +#: src/tables/build/BuildAllocatedStockTable.tsx:180 +#: src/tables/build/BuildLineTable.tsx:663 +#~ msgid "Delete Stock Allocation" +#~ msgstr "Delete Stock Allocation" + +#: src/tables/build/BuildAllocatedStockTable.tsx:182 +#: src/tables/build/BuildLineTable.tsx:669 +#: src/tables/sales/SalesOrderAllocationTable.tsx:221 +msgid "Are you sure you want to remove this allocated stock from the order?" +msgstr "" + +#: src/tables/build/BuildAllocatedStockTable.tsx:242 msgid "Consume" msgstr "" +#: src/tables/build/BuildAllocatedStockTable.tsx:259 +#: src/tables/build/BuildLineTable.tsx:112 +#: src/tables/sales/SalesOrderAllocationTable.tsx:248 +msgid "Remove allocated stock" +msgstr "" + #: src/tables/build/BuildLineTable.tsx:59 #~ msgid "Show lines with available stock" #~ msgstr "Show lines with available stock" -#: src/tables/build/BuildLineTable.tsx:120 +#: src/tables/build/BuildLineTable.tsx:121 msgid "View Stock Item" msgstr "" -#: src/tables/build/BuildLineTable.tsx:183 +#: src/tables/build/BuildLineTable.tsx:184 msgid "Show fully allocated lines" msgstr "" -#: src/tables/build/BuildLineTable.tsx:188 +#: src/tables/build/BuildLineTable.tsx:189 msgid "Show fully consumed lines" msgstr "" @@ -9523,124 +9551,124 @@ msgstr "" #~ msgid "Show allocated lines" #~ msgstr "Show allocated lines" -#: src/tables/build/BuildLineTable.tsx:193 +#: src/tables/build/BuildLineTable.tsx:194 msgid "Show items with sufficient available stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:198 +#: src/tables/build/BuildLineTable.tsx:199 msgid "Show consumable lines" msgstr "Tüketilebilir satırları göster" -#: src/tables/build/BuildLineTable.tsx:203 +#: src/tables/build/BuildLineTable.tsx:204 msgid "Show optional lines" msgstr "İsteğe bağlı satırları göster" -#: src/tables/build/BuildLineTable.tsx:212 +#: src/tables/build/BuildLineTable.tsx:213 #: src/tables/part/PartTable.tsx:233 msgid "Testable" msgstr "Test Edilebilir" -#: src/tables/build/BuildLineTable.tsx:217 +#: src/tables/build/BuildLineTable.tsx:218 #: src/tables/stock/StockItemTable.tsx:388 msgid "Tracked" msgstr "İzlenen" -#: src/tables/build/BuildLineTable.tsx:218 +#: src/tables/build/BuildLineTable.tsx:219 msgid "Show tracked lines" msgstr "İzlenen satırları göster" -#: src/tables/build/BuildLineTable.tsx:223 +#: src/tables/build/BuildLineTable.tsx:224 msgid "Show items with stock on order" msgstr "" -#: src/tables/build/BuildLineTable.tsx:258 +#: src/tables/build/BuildLineTable.tsx:259 #: src/tables/sales/SalesOrderLineItemTable.tsx:172 msgid "In production" msgstr "Üretimde" -#: src/tables/build/BuildLineTable.tsx:286 +#: src/tables/build/BuildLineTable.tsx:287 msgid "Insufficient stock" msgstr "Yetersiz stok" -#: src/tables/build/BuildLineTable.tsx:302 +#: src/tables/build/BuildLineTable.tsx:303 #: src/tables/sales/SalesOrderLineItemTable.tsx:160 #: src/tables/stock/StockItemTable.tsx:191 msgid "No stock available" msgstr "Mevcut stok yok" -#: src/tables/build/BuildLineTable.tsx:375 +#: src/tables/build/BuildLineTable.tsx:376 msgid "Gets Inherited" msgstr "Miras Alınır" -#: src/tables/build/BuildLineTable.tsx:388 +#: src/tables/build/BuildLineTable.tsx:389 msgid "Unit Quantity" msgstr "Birim Miktarı" -#: src/tables/build/BuildLineTable.tsx:415 +#: src/tables/build/BuildLineTable.tsx:416 msgid "Setup Quantity" msgstr "" -#: src/tables/build/BuildLineTable.tsx:424 +#: src/tables/build/BuildLineTable.tsx:425 msgid "Attrition" msgstr "" -#: src/tables/build/BuildLineTable.tsx:432 +#: src/tables/build/BuildLineTable.tsx:433 msgid "Rounding Multiple" msgstr "" -#: src/tables/build/BuildLineTable.tsx:441 +#: src/tables/build/BuildLineTable.tsx:442 msgid "BOM Information" msgstr "" -#: src/tables/build/BuildLineTable.tsx:515 +#: src/tables/build/BuildLineTable.tsx:516 #: src/tables/part/PartBuildAllocationsTable.tsx:102 msgid "Fully allocated" msgstr "" -#: src/tables/build/BuildLineTable.tsx:563 +#: src/tables/build/BuildLineTable.tsx:564 #: src/tables/sales/SalesOrderLineItemTable.tsx:311 msgid "Create Build Order" msgstr "Yapım Siparişi Oluştur" -#: src/tables/build/BuildLineTable.tsx:592 +#: src/tables/build/BuildLineTable.tsx:593 msgid "Auto allocation in progress" msgstr "" -#: src/tables/build/BuildLineTable.tsx:595 -#: src/tables/build/BuildLineTable.tsx:802 +#: src/tables/build/BuildLineTable.tsx:596 +#: src/tables/build/BuildLineTable.tsx:809 msgid "Auto Allocate Stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:596 +#: src/tables/build/BuildLineTable.tsx:597 msgid "Automatically allocate stock to this build according to the selected options" msgstr "" -#: src/tables/build/BuildLineTable.tsx:616 -#: src/tables/build/BuildLineTable.tsx:630 -#: src/tables/build/BuildLineTable.tsx:751 -#: src/tables/build/BuildLineTable.tsx:852 +#: src/tables/build/BuildLineTable.tsx:617 +#: src/tables/build/BuildLineTable.tsx:631 +#: src/tables/build/BuildLineTable.tsx:758 +#: src/tables/build/BuildLineTable.tsx:859 #: src/tables/build/BuildOutputTable.tsx:355 #: src/tables/build/BuildOutputTable.tsx:360 msgid "Deallocate Stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:632 +#: src/tables/build/BuildLineTable.tsx:633 msgid "Deallocate all untracked stock for this build order" msgstr "" -#: src/tables/build/BuildLineTable.tsx:634 +#: src/tables/build/BuildLineTable.tsx:635 msgid "Deallocate stock from the selected line item" msgstr "" -#: src/tables/build/BuildLineTable.tsx:638 +#: src/tables/build/BuildLineTable.tsx:639 msgid "Stock has been deallocated" msgstr "" -#: src/tables/build/BuildLineTable.tsx:771 +#: src/tables/build/BuildLineTable.tsx:778 msgid "Build Stock" msgstr "Yapım Stoku" -#: src/tables/build/BuildLineTable.tsx:784 +#: src/tables/build/BuildLineTable.tsx:791 #: src/tables/sales/SalesOrderLineItemTable.tsx:487 msgid "View Part" msgstr "Parçayı Görüntüle" @@ -9739,7 +9767,7 @@ msgid "Serialize Build Output" msgstr "" #: src/tables/build/BuildOutputTable.tsx:405 -#: src/tables/part/PartTestResultTable.tsx:310 +#: src/tables/part/PartTestResultTable.tsx:318 #: src/tables/stock/StockItemTable.tsx:328 msgid "Filter by stock status" msgstr "Stok durumuna göre süz" @@ -9964,8 +9992,8 @@ msgid "View Item" msgstr "" #: src/tables/general/ExtraLineItemTable.tsx:95 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:299 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:403 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:300 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:405 #: src/tables/sales/ReturnOrderLineItemTable.tsx:83 #: src/tables/sales/ReturnOrderLineItemTable.tsx:187 #: src/tables/sales/SalesOrderLineItemTable.tsx:252 @@ -9974,14 +10002,14 @@ msgid "Add Line Item" msgstr "Satır Ögesi Ekle" #: src/tables/general/ExtraLineItemTable.tsx:108 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:320 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:322 #: src/tables/sales/ReturnOrderLineItemTable.tsx:96 #: src/tables/sales/SalesOrderLineItemTable.tsx:271 msgid "Edit Line Item" msgstr "Satır Ögesini Düzenle" #: src/tables/general/ExtraLineItemTable.tsx:117 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:329 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:331 #: src/tables/sales/ReturnOrderLineItemTable.tsx:105 #: src/tables/sales/SalesOrderLineItemTable.tsx:280 msgid "Delete Line Item" @@ -10273,7 +10301,7 @@ msgid "Required Stock" msgstr "" #: src/tables/part/PartBuildAllocationsTable.tsx:124 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:381 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:383 msgid "View Build Order" msgstr "" @@ -10617,8 +10645,8 @@ msgstr "" #: src/tables/part/PartTestResultTable.tsx:103 #: src/tables/part/PartTestResultTable.tsx:181 -#: src/tables/part/PartTestResultTable.tsx:320 -#: src/tables/part/PartTestResultTable.tsx:334 +#: src/tables/part/PartTestResultTable.tsx:328 +#: src/tables/part/PartTestResultTable.tsx:342 #: src/tables/stock/StockItemTestResultTable.tsx:296 #: src/tables/stock/StockItemTestResultTable.tsx:368 #: src/tables/stock/StockItemTestResultTable.tsx:429 @@ -10643,7 +10671,7 @@ msgstr "" msgid "No Result" msgstr "Sonuç Yok" -#: src/tables/part/PartTestResultTable.tsx:298 +#: src/tables/part/PartTestResultTable.tsx:306 msgid "Show build outputs currently in production" msgstr "Üretimde olan yapım çıktılarını göster" @@ -11073,7 +11101,7 @@ msgid "Show manufacturer parts for active manufacturers." msgstr "" #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:115 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:397 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:399 msgid "Import Line Items" msgstr "İçe Satır Ögeleri Aktar" @@ -11099,11 +11127,11 @@ msgstr "" #~ msgid "Add line item" #~ msgstr "Add line item" -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:350 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:352 msgid "Receive line item" msgstr "Satır ögesini teslim al" -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:414 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:416 msgid "Receive items" msgstr "Ögeleri teslim al" @@ -11201,25 +11229,25 @@ msgid "Not shipped" msgstr "" #: src/tables/sales/SalesOrderAllocationTable.tsx:211 -#: src/tables/sales/SalesOrderAllocationTable.tsx:229 +#: src/tables/sales/SalesOrderAllocationTable.tsx:235 msgid "Edit Allocation" msgstr "" #: src/tables/sales/SalesOrderAllocationTable.tsx:218 #: src/tables/sales/SalesOrderAllocationTable.tsx:241 -msgid "Delete Allocation" -msgstr "" +#~ msgid "Delete Allocation" +#~ msgstr "Delete Allocation" -#: src/tables/sales/SalesOrderAllocationTable.tsx:252 -#: src/tables/sales/SalesOrderAllocationTable.tsx:253 +#: src/tables/sales/SalesOrderAllocationTable.tsx:261 +#: src/tables/sales/SalesOrderAllocationTable.tsx:262 msgid "View Shipment" msgstr "" -#: src/tables/sales/SalesOrderAllocationTable.tsx:308 +#: src/tables/sales/SalesOrderAllocationTable.tsx:317 msgid "Assign to Shipment" msgstr "" -#: src/tables/sales/SalesOrderAllocationTable.tsx:324 +#: src/tables/sales/SalesOrderAllocationTable.tsx:333 msgid "Assign to shipment" msgstr "" diff --git a/src/frontend/src/locales/uk/messages.po b/src/frontend/src/locales/uk/messages.po index 3c3046d7c2..bf43bc0ff8 100644 --- a/src/frontend/src/locales/uk/messages.po +++ b/src/frontend/src/locales/uk/messages.po @@ -8,7 +8,7 @@ msgstr "" "Language: uk\n" "Project-Id-Version: inventree\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2025-11-19 19:39\n" +"PO-Revision-Date: 2025-11-22 06:25\n" "Last-Translator: \n" "Language-Team: Ukrainian\n" "Plural-Forms: nplurals=4; plural=((n%10==1 && n%100!=11) ? 0 : ((n%10 >= 2 && n%10 <=4 && (n%100 < 12 || n%100 > 14)) ? 1 : ((n%10 == 0 || (n%10 >= 5 && n%10 <=9)) || (n%100 >= 11 && n%100 <= 14)) ? 2 : 3));\n" @@ -56,7 +56,7 @@ msgstr "Скасувати" #: lib/components/RowActions.tsx:136 #: src/components/nav/NavigationDrawer.tsx:190 -#: src/forms/PurchaseOrderForms.tsx:802 +#: src/forms/PurchaseOrderForms.tsx:854 #: src/forms/StockForms.tsx:796 #: src/forms/StockForms.tsx:843 #: src/forms/StockForms.tsx:889 @@ -103,9 +103,9 @@ msgstr "Ні" #: src/forms/BuildForms.tsx:630 #: src/forms/BuildForms.tsx:793 #: src/forms/BuildForms.tsx:896 -#: src/forms/PurchaseOrderForms.tsx:798 +#: src/forms/PurchaseOrderForms.tsx:850 #: src/forms/ReturnOrderForms.tsx:242 -#: src/forms/SalesOrderForms.tsx:305 +#: src/forms/SalesOrderForms.tsx:323 #: src/forms/StockForms.tsx:360 #: src/forms/StockForms.tsx:791 #: src/forms/StockForms.tsx:838 @@ -119,6 +119,7 @@ msgstr "Ні" #: src/pages/build/BuildDetail.tsx:200 #: src/pages/part/PartDetail.tsx:1207 #: src/tables/ColumnRenderers.tsx:91 +#: src/tables/part/PartTestResultTable.tsx:247 #: src/tables/part/RelatedPartTable.tsx:53 #: src/tables/stock/StockTrackingTable.tsx:87 msgid "Part" @@ -158,7 +159,7 @@ msgstr "" #: src/components/wizards/OrderPartsWizard.tsx:290 #: src/pages/company/SupplierPartDetail.tsx:413 #: src/pages/stock/StockDetail.tsx:289 -#: src/tables/build/BuildAllocatedStockTable.tsx:155 +#: src/tables/build/BuildAllocatedStockTable.tsx:152 #: src/tables/part/PartPurchaseOrdersTable.tsx:50 #: src/tables/purchasing/SupplierPartTable.tsx:83 #: src/tables/stock/StockItemTable.tsx:247 @@ -201,9 +202,9 @@ msgstr "Категорії" #: src/forms/BuildForms.tsx:473 #: src/forms/BuildForms.tsx:633 #: src/forms/BuildForms.tsx:794 -#: src/forms/SalesOrderForms.tsx:307 +#: src/forms/SalesOrderForms.tsx:325 #: src/pages/stock/StockDetail.tsx:1005 -#: src/tables/part/PartTestResultTable.tsx:248 +#: src/tables/part/PartTestResultTable.tsx:256 #: src/tables/stock/StockTrackingTable.tsx:48 #: src/tables/stock/StockTrackingTable.tsx:55 msgid "Stock Item" @@ -517,7 +518,7 @@ msgstr "" #: src/components/dashboard/DashboardLayout.tsx:281 #: src/components/editors/NotesEditor.tsx:74 #: src/components/editors/TemplateEditor/TemplateEditor.tsx:158 -#: src/components/forms/fields/ApiFormField.tsx:273 +#: src/components/forms/fields/ApiFormField.tsx:237 #: src/components/forms/fields/TableField.tsx:45 #: src/components/importer/ImportDataSelector.tsx:192 #: src/components/importer/ImporterColumnSelector.tsx:234 @@ -642,8 +643,8 @@ msgstr "Введіть дані штрихкоду" #: src/components/barcodes/BarcodeScanDialog.tsx:49 #: src/components/buttons/ScanButton.tsx:15 #: src/components/nav/NavigationDrawer.tsx:122 -#: src/forms/PurchaseOrderForms.tsx:457 -#: src/forms/PurchaseOrderForms.tsx:563 +#: src/forms/PurchaseOrderForms.tsx:509 +#: src/forms/PurchaseOrderForms.tsx:615 msgid "Scan Barcode" msgstr "Сканувати штрих-код" @@ -728,7 +729,7 @@ msgstr "Це призведе до видалення посилання з ві #: src/components/barcodes/QRCode.tsx:205 #: src/components/items/ActionDropdown.tsx:192 -#: src/forms/PurchaseOrderForms.tsx:554 +#: src/forms/PurchaseOrderForms.tsx:606 msgid "Unlink Barcode" msgstr "Відв'язати штрих-код" @@ -1216,6 +1217,12 @@ msgstr "Видалити пов'язане зображення з цього е #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:884 #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:903 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:254 +#: src/tables/build/BuildAllocatedStockTable.tsx:178 +#: src/tables/build/BuildAllocatedStockTable.tsx:258 +#: src/tables/build/BuildLineTable.tsx:111 +#: src/tables/build/BuildLineTable.tsx:665 +#: src/tables/sales/SalesOrderAllocationTable.tsx:224 +#: src/tables/sales/SalesOrderAllocationTable.tsx:247 msgid "Remove" msgstr "Видалити" @@ -1241,7 +1248,7 @@ msgid "Upload Error" msgstr "Помилка при завантаженні" #: src/components/details/DetailsImage.tsx:250 -#: src/components/forms/fields/TextField.tsx:65 +#: src/components/forms/fields/AutoFillRightSection.tsx:34 msgid "Clear" msgstr "Очистити" @@ -1817,10 +1824,14 @@ msgstr "Зупинено" msgid "Running" msgstr "" -#: src/components/forms/fields/ApiFormField.tsx:233 +#: src/components/forms/fields/ApiFormField.tsx:197 msgid "Select file to upload" msgstr "" +#: src/components/forms/fields/AutoFillRightSection.tsx:47 +msgid "Accept suggested value" +msgstr "" + #: src/components/forms/fields/DateField.tsx:76 msgid "Select date" msgstr "" @@ -1875,10 +1886,6 @@ msgstr "Немає записів" msgid "Add new row" msgstr "" -#: src/components/forms/fields/TextField.tsx:82 -msgid "Accept suggested value" -msgstr "" - #: src/components/images/DetailsImage.tsx:252 #~ msgid "Select image" #~ msgstr "Select image" @@ -2225,8 +2232,8 @@ msgstr "" #: src/pages/part/PartDetail.tsx:994 #: src/pages/stock/StockDetail.tsx:265 #: src/pages/stock/StockDetail.tsx:942 -#: src/tables/build/BuildAllocatedStockTable.tsx:135 -#: src/tables/build/BuildLineTable.tsx:192 +#: src/tables/build/BuildAllocatedStockTable.tsx:132 +#: src/tables/build/BuildLineTable.tsx:193 #: src/tables/part/PartTable.tsx:137 #: src/tables/stock/StockItemTable.tsx:182 #: src/tables/stock/StockItemTable.tsx:343 @@ -2784,7 +2791,7 @@ msgstr "" #: src/pages/sales/SalesOrderDetail.tsx:119 #: src/pages/stock/LocationDetail.tsx:102 #: src/tables/ColumnRenderers.tsx:278 -#: src/tables/build/BuildAllocatedStockTable.tsx:91 +#: src/tables/build/BuildAllocatedStockTable.tsx:88 #: src/tables/machine/MachineTypeTable.tsx:161 #: src/tables/machine/MachineTypeTable.tsx:257 #: src/tables/plugin/PluginListTable.tsx:110 @@ -2966,7 +2973,7 @@ msgstr "Немає в наявності" #: src/pages/company/SupplierPartDetail.tsx:394 #: src/pages/part/PartDetail.tsx:1015 #: src/tables/bom/BomTable.tsx:444 -#: src/tables/build/BuildLineTable.tsx:222 +#: src/tables/build/BuildLineTable.tsx:223 #: src/tables/part/PartTable.tsx:108 msgid "On Order" msgstr "" @@ -2976,7 +2983,7 @@ msgstr "" #: src/pages/part/PartDetail.tsx:587 #: src/pages/part/PartDetail.tsx:1021 #: src/pages/stock/StockDetail.tsx:925 -#: src/tables/part/PartTestResultTable.tsx:297 +#: src/tables/part/PartTestResultTable.tsx:305 #: src/tables/stock/StockItemTable.tsx:359 msgid "In Production" msgstr "" @@ -3000,7 +3007,7 @@ msgstr "Категорія" #: src/components/render/Stock.tsx:114 #: src/components/render/Stock.tsx:132 #: src/forms/BuildForms.tsx:795 -#: src/forms/PurchaseOrderForms.tsx:595 +#: src/forms/PurchaseOrderForms.tsx:647 #: src/forms/StockForms.tsx:792 #: src/forms/StockForms.tsx:839 #: src/forms/StockForms.tsx:885 @@ -3023,7 +3030,7 @@ msgstr "" #: src/components/render/Stock.tsx:99 #: src/pages/stock/StockDetail.tsx:198 #: src/pages/stock/StockDetail.tsx:930 -#: src/tables/build/BuildAllocatedStockTable.tsx:121 +#: src/tables/build/BuildAllocatedStockTable.tsx:118 #: src/tables/build/BuildOutputTable.tsx:107 #: src/tables/sales/SalesOrderAllocationTable.tsx:142 msgid "Serial Number" @@ -3034,9 +3041,9 @@ msgstr "Серійний номер" #: src/forms/BuildForms.tsx:240 #: src/forms/BuildForms.tsx:634 #: src/forms/BuildForms.tsx:797 -#: src/forms/PurchaseOrderForms.tsx:801 +#: src/forms/PurchaseOrderForms.tsx:853 #: src/forms/ReturnOrderForms.tsx:243 -#: src/forms/SalesOrderForms.tsx:308 +#: src/forms/SalesOrderForms.tsx:326 #: src/forms/StockForms.tsx:841 #: src/pages/part/PartStockHistoryDetail.tsx:56 #: src/pages/part/PartStockHistoryDetail.tsx:210 @@ -3046,9 +3053,9 @@ msgstr "Серійний номер" #: src/pages/part/pricing/PriceBreakPanel.tsx:172 #: src/pages/stock/StockDetail.tsx:258 #: src/pages/stock/StockDetail.tsx:936 -#: src/tables/build/BuildLineTable.tsx:86 +#: src/tables/build/BuildLineTable.tsx:83 #: src/tables/part/PartPurchaseOrdersTable.tsx:94 -#: src/tables/part/PartTestResultTable.tsx:269 +#: src/tables/part/PartTestResultTable.tsx:277 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:175 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:206 #: src/tables/purchasing/SupplierPriceBreakTable.tsx:69 @@ -3070,7 +3077,7 @@ msgstr "Кількість" #: src/forms/StockForms.tsx:1048 #: src/forms/StockForms.tsx:1096 #: src/forms/StockForms.tsx:1140 -#: src/tables/build/BuildLineTable.tsx:96 +#: src/tables/build/BuildLineTable.tsx:93 msgid "Batch" msgstr "Пакетно" @@ -3755,7 +3762,7 @@ msgid "In Stock" msgstr "В наявності" #: src/components/wizards/OrderPartsWizard.tsx:146 -#: src/tables/build/BuildLineTable.tsx:404 +#: src/tables/build/BuildLineTable.tsx:405 msgid "Required Quantity" msgstr "" @@ -3847,7 +3854,7 @@ msgid "Please correct the errors in the selected parts" msgstr "" #: src/components/wizards/OrderPartsWizard.tsx:587 -#: src/tables/build/BuildLineTable.tsx:815 +#: src/tables/build/BuildLineTable.tsx:822 #: src/tables/part/PartTable.tsx:522 #: src/tables/sales/SalesOrderLineItemTable.tsx:370 msgid "Order Parts" @@ -4349,9 +4356,9 @@ msgstr "" #: src/forms/BuildForms.tsx:333 #: src/forms/BuildForms.tsx:408 #: src/forms/BuildForms.tsx:685 -#: src/tables/build/BuildAllocatedStockTable.tsx:150 +#: src/tables/build/BuildAllocatedStockTable.tsx:147 #: src/tables/build/BuildOutputTable.tsx:582 -#: src/tables/part/PartTestResultTable.tsx:272 +#: src/tables/part/PartTestResultTable.tsx:280 msgid "Build Output" msgstr "" @@ -4362,7 +4369,7 @@ msgstr "" #: src/forms/BuildForms.tsx:336 #: src/forms/BuildForms.tsx:411 #: src/forms/BuildForms.tsx:475 -#: src/forms/PurchaseOrderForms.tsx:717 +#: src/forms/PurchaseOrderForms.tsx:769 #: src/forms/ReturnOrderForms.tsx:197 #: src/forms/ReturnOrderForms.tsx:244 #: src/forms/StockForms.tsx:712 @@ -4377,7 +4384,7 @@ msgstr "" #: src/tables/build/BuildOutputTable.tsx:404 #: src/tables/machine/MachineListTable.tsx:387 #: src/tables/part/PartPurchaseOrdersTable.tsx:38 -#: src/tables/part/PartTestResultTable.tsx:309 +#: src/tables/part/PartTestResultTable.tsx:317 #: src/tables/sales/ReturnOrderLineItemTable.tsx:138 #: src/tables/sales/ReturnOrderLineItemTable.tsx:176 #: src/tables/settings/CustomStateTable.tsx:79 @@ -4450,8 +4457,8 @@ msgstr "" #: src/pages/stock/StockDetail.tsx:153 #: src/tables/bom/BomTable.tsx:134 #: src/tables/bom/UsedInTable.tsx:40 -#: src/tables/build/BuildAllocatedStockTable.tsx:108 -#: src/tables/build/BuildLineTable.tsx:336 +#: src/tables/build/BuildAllocatedStockTable.tsx:105 +#: src/tables/build/BuildLineTable.tsx:337 #: src/tables/build/BuildOrderTable.tsx:79 #: src/tables/part/PartSalesAllocationsTable.tsx:61 #: src/tables/part/RelatedPartTable.tsx:73 @@ -4466,47 +4473,47 @@ msgstr "" #: src/forms/BuildForms.tsx:632 #: src/forms/BuildForms.tsx:796 #: src/forms/BuildForms.tsx:897 -#: src/forms/SalesOrderForms.tsx:306 -#: src/tables/build/BuildAllocatedStockTable.tsx:139 -#: src/tables/build/BuildLineTable.tsx:182 +#: src/forms/SalesOrderForms.tsx:324 +#: src/tables/build/BuildAllocatedStockTable.tsx:136 +#: src/tables/build/BuildLineTable.tsx:183 #: src/tables/sales/SalesOrderLineItemTable.tsx:342 #: src/tables/stock/StockItemTable.tsx:338 msgid "Allocated" msgstr "" #: src/forms/BuildForms.tsx:667 -#: src/forms/SalesOrderForms.tsx:295 +#: src/forms/SalesOrderForms.tsx:313 #: src/pages/build/BuildDetail.tsx:108 #: src/pages/build/BuildDetail.tsx:326 msgid "Source Location" msgstr "Розташування джерела" #: src/forms/BuildForms.tsx:668 -#: src/forms/SalesOrderForms.tsx:296 +#: src/forms/SalesOrderForms.tsx:314 msgid "Select the source location for the stock allocation" msgstr "Вибір розташування вихідного товару при розподілі запасів" #: src/forms/BuildForms.tsx:700 -#: src/forms/SalesOrderForms.tsx:336 -#: src/tables/build/BuildLineTable.tsx:574 -#: src/tables/build/BuildLineTable.tsx:731 -#: src/tables/build/BuildLineTable.tsx:830 +#: src/forms/SalesOrderForms.tsx:354 +#: src/tables/build/BuildLineTable.tsx:575 +#: src/tables/build/BuildLineTable.tsx:738 +#: src/tables/build/BuildLineTable.tsx:837 #: src/tables/sales/SalesOrderLineItemTable.tsx:380 #: src/tables/sales/SalesOrderLineItemTable.tsx:406 msgid "Allocate Stock" msgstr "" #: src/forms/BuildForms.tsx:703 -#: src/forms/SalesOrderForms.tsx:341 +#: src/forms/SalesOrderForms.tsx:359 msgid "Stock items allocated" msgstr "Елементи складу виділені" #: src/forms/BuildForms.tsx:816 #: src/forms/BuildForms.tsx:917 -#: src/tables/build/BuildAllocatedStockTable.tsx:240 -#: src/tables/build/BuildAllocatedStockTable.tsx:272 -#: src/tables/build/BuildLineTable.tsx:741 -#: src/tables/build/BuildLineTable.tsx:864 +#: src/tables/build/BuildAllocatedStockTable.tsx:243 +#: src/tables/build/BuildAllocatedStockTable.tsx:279 +#: src/tables/build/BuildLineTable.tsx:748 +#: src/tables/build/BuildLineTable.tsx:871 msgid "Consume Stock" msgstr "" @@ -4521,21 +4528,21 @@ msgstr "" #~ msgstr "Stock items consumed" #: src/forms/BuildForms.tsx:853 -#: src/tables/build/BuildLineTable.tsx:514 +#: src/tables/build/BuildLineTable.tsx:515 #: src/tables/part/PartBuildAllocationsTable.tsx:101 msgid "Fully consumed" msgstr "" #: src/forms/BuildForms.tsx:898 -#: src/tables/build/BuildLineTable.tsx:187 +#: src/tables/build/BuildLineTable.tsx:188 #: src/tables/stock/StockItemTable.tsx:367 msgid "Consumed" msgstr "Використано" #: src/forms/CommonForms.tsx:88 -#: src/forms/PurchaseOrderForms.tsx:125 +#: src/forms/PurchaseOrderForms.tsx:176 #: src/forms/ReturnOrderForms.tsx:138 -#: src/forms/SalesOrderForms.tsx:164 +#: src/forms/SalesOrderForms.tsx:182 msgid "Select project code for this line item" msgstr "" @@ -4572,127 +4579,127 @@ msgstr "" msgid "Subscribe to notifications for this category" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:388 -msgid "Assign Batch Code and Serial Numbers" -msgstr "Призначити Номер серії збірки та Серійний номер" - -#: src/forms/PurchaseOrderForms.tsx:390 -msgid "Assign Batch Code" -msgstr "Призначити Номер серії збірки" - -#: src/forms/PurchaseOrderForms.tsx:410 -msgid "Choose Location" -msgstr "Оберіть розташування" - -#: src/forms/PurchaseOrderForms.tsx:418 -msgid "Item Destination selected" -msgstr "" - #: src/forms/PurchaseOrderForms.tsx:421 #~ msgid "Assign Batch Code{0}" #~ msgstr "Assign Batch Code{0}" -#: src/forms/PurchaseOrderForms.tsx:428 -msgid "Part category default location selected" -msgstr "" +#: src/forms/PurchaseOrderForms.tsx:440 +msgid "Assign Batch Code and Serial Numbers" +msgstr "Призначити Номер серії збірки та Серійний номер" -#: src/forms/PurchaseOrderForms.tsx:438 -msgid "Received stock location selected" -msgstr "" +#: src/forms/PurchaseOrderForms.tsx:442 +msgid "Assign Batch Code" +msgstr "Призначити Номер серії збірки" #: src/forms/PurchaseOrderForms.tsx:444 #: src/forms/StockForms.tsx:428 #~ msgid "Remove item from list" #~ msgstr "Remove item from list" -#: src/forms/PurchaseOrderForms.tsx:446 +#: src/forms/PurchaseOrderForms.tsx:462 +msgid "Choose Location" +msgstr "Оберіть розташування" + +#: src/forms/PurchaseOrderForms.tsx:470 +msgid "Item Destination selected" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:480 +msgid "Part category default location selected" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:490 +msgid "Received stock location selected" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:498 msgid "Default location selected" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:507 +#: src/forms/PurchaseOrderForms.tsx:559 msgid "Set Location" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:524 -msgid "Set Expiry Date" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:532 -#: src/forms/StockForms.tsx:693 -msgid "Adjust Packaging" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:540 -#: src/forms/StockForms.tsx:684 -#: src/hooks/UseStockAdjustActions.tsx:148 -msgid "Change Status" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:546 -msgid "Add Note" -msgstr "" - #: src/forms/PurchaseOrderForms.tsx:566 #~ msgid "Serial numbers" #~ msgstr "Serial numbers" +#: src/forms/PurchaseOrderForms.tsx:576 +msgid "Set Expiry Date" +msgstr "" + #: src/forms/PurchaseOrderForms.tsx:582 #~ msgid "Store at line item destination" #~ msgstr "Store at line item destination" -#: src/forms/PurchaseOrderForms.tsx:610 -msgid "Store at default location" +#: src/forms/PurchaseOrderForms.tsx:584 +#: src/forms/StockForms.tsx:693 +msgid "Adjust Packaging" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:625 -msgid "Store at line item destination " +#: src/forms/PurchaseOrderForms.tsx:592 +#: src/forms/StockForms.tsx:684 +#: src/hooks/UseStockAdjustActions.tsx:148 +msgid "Change Status" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:637 -msgid "Store with already received stock" +#: src/forms/PurchaseOrderForms.tsx:598 +msgid "Add Note" msgstr "" #: src/forms/PurchaseOrderForms.tsx:658 #~ msgid "Receive line items" #~ msgstr "Receive line items" -#: src/forms/PurchaseOrderForms.tsx:661 +#: src/forms/PurchaseOrderForms.tsx:662 +msgid "Store at default location" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:677 +msgid "Store at line item destination " +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:689 +msgid "Store with already received stock" +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:713 #: src/pages/build/BuildDetail.tsx:340 #: src/pages/stock/StockDetail.tsx:280 #: src/pages/stock/StockDetail.tsx:952 #: src/tables/Filter.tsx:83 -#: src/tables/build/BuildAllocatedStockTable.tsx:128 +#: src/tables/build/BuildAllocatedStockTable.tsx:125 #: src/tables/build/BuildOutputTable.tsx:112 -#: src/tables/part/PartTestResultTable.tsx:260 -#: src/tables/part/PartTestResultTable.tsx:281 +#: src/tables/part/PartTestResultTable.tsx:268 +#: src/tables/part/PartTestResultTable.tsx:289 #: src/tables/sales/SalesOrderAllocationTable.tsx:149 msgid "Batch Code" msgstr "Номер серії збірки" -#: src/forms/PurchaseOrderForms.tsx:662 +#: src/forms/PurchaseOrderForms.tsx:714 msgid "Enter batch code for received items" msgstr "Введіть Номер серії збірки для отриманих елементів" -#: src/forms/PurchaseOrderForms.tsx:675 +#: src/forms/PurchaseOrderForms.tsx:727 #: src/forms/StockForms.tsx:218 msgid "Serial Numbers" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:676 +#: src/forms/PurchaseOrderForms.tsx:728 msgid "Enter serial numbers for received items" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:690 +#: src/forms/PurchaseOrderForms.tsx:742 #: src/pages/stock/StockDetail.tsx:382 #: src/tables/stock/StockItemTable.tsx:294 msgid "Expiry Date" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:691 +#: src/forms/PurchaseOrderForms.tsx:743 msgid "Enter an expiry date for received items" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:703 +#: src/forms/PurchaseOrderForms.tsx:755 #: src/forms/StockForms.tsx:728 #: src/pages/company/SupplierPartDetail.tsx:172 #: src/pages/company/SupplierPartDetail.tsx:236 @@ -4701,19 +4708,19 @@ msgstr "" msgid "Packaging" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:727 +#: src/forms/PurchaseOrderForms.tsx:779 #: src/pages/company/SupplierPartDetail.tsx:120 #: src/tables/ColumnRenderers.tsx:332 msgid "Note" msgstr "Нотатки" -#: src/forms/PurchaseOrderForms.tsx:799 +#: src/forms/PurchaseOrderForms.tsx:851 #: src/pages/company/SupplierPartDetail.tsx:138 #: src/tables/purchasing/SupplierPriceBreakTable.tsx:49 msgid "SKU" msgstr "Артикул, SKU" -#: src/forms/PurchaseOrderForms.tsx:800 +#: src/forms/PurchaseOrderForms.tsx:852 #: src/tables/part/PartPurchaseOrdersTable.tsx:127 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:213 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:283 @@ -4721,11 +4728,11 @@ msgstr "Артикул, SKU" msgid "Received" msgstr "Отримано" -#: src/forms/PurchaseOrderForms.tsx:817 +#: src/forms/PurchaseOrderForms.tsx:869 msgid "Receive Line Items" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:823 +#: src/forms/PurchaseOrderForms.tsx:875 msgid "Items received" msgstr "" @@ -4737,7 +4744,7 @@ msgstr "Отримати предмети" msgid "Item received into stock" msgstr "Елемент, отриманий на складі" -#: src/forms/SalesOrderForms.tsx:401 +#: src/forms/SalesOrderForms.tsx:419 msgid "Leave blank to use the order address" msgstr "" @@ -5932,6 +5939,9 @@ msgstr "" #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:310 #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:401 +#: src/tables/build/BuildAllocatedStockTable.tsx:181 +#: src/tables/build/BuildLineTable.tsx:668 +#: src/tables/sales/SalesOrderAllocationTable.tsx:220 msgid "Confirm Removal" msgstr "" @@ -6870,8 +6880,8 @@ msgstr "Зовнішній" #: src/pages/sales/ReturnOrderDetail.tsx:108 #: src/pages/sales/SalesOrderDetail.tsx:98 #: src/tables/ColumnRenderers.tsx:321 -#: src/tables/build/BuildAllocatedStockTable.tsx:115 -#: src/tables/build/BuildLineTable.tsx:352 +#: src/tables/build/BuildAllocatedStockTable.tsx:112 +#: src/tables/build/BuildLineTable.tsx:353 msgid "Reference" msgstr "" @@ -7132,7 +7142,7 @@ msgstr "" #: src/pages/build/BuildDetail.tsx:742 #: src/pages/stock/StockDetail.tsx:344 -#: src/tables/build/BuildAllocatedStockTable.tsx:85 +#: src/tables/build/BuildAllocatedStockTable.tsx:82 #: src/tables/part/PartBuildAllocationsTable.tsx:45 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:157 #: src/tables/stock/StockTrackingTable.tsx:109 @@ -7600,7 +7610,7 @@ msgstr "" #: src/pages/part/PartDetail.tsx:542 #: src/tables/bom/BomTable.tsx:439 -#: src/tables/build/BuildLineTable.tsx:305 +#: src/tables/build/BuildLineTable.tsx:306 #: src/tables/part/PartTable.tsx:319 #: src/tables/sales/SalesOrderLineItemTable.tsx:138 msgid "Available Stock" @@ -7608,7 +7618,7 @@ msgstr "Доступний залишок" #: src/pages/part/PartDetail.tsx:548 #: src/tables/bom/BomTable.tsx:341 -#: src/tables/build/BuildLineTable.tsx:267 +#: src/tables/build/BuildLineTable.tsx:268 #: src/tables/sales/SalesOrderLineItemTable.tsx:180 msgid "On order" msgstr "" @@ -7782,7 +7792,7 @@ msgstr "Замовлення" #: src/pages/part/PartDetail.tsx:1144 #: src/pages/stock/StockDetail.tsx:884 -#: src/tables/build/BuildLineTable.tsx:761 +#: src/tables/build/BuildLineTable.tsx:768 msgid "Order Stock" msgstr "" @@ -9219,13 +9229,13 @@ msgstr "" #~ msgstr "Show asssmbled items" #: src/tables/bom/BomTable.tsx:315 -#: src/tables/build/BuildLineTable.tsx:276 +#: src/tables/build/BuildLineTable.tsx:277 #: src/tables/part/PartTable.tsx:145 msgid "External stock" msgstr "" #: src/tables/bom/BomTable.tsx:323 -#: src/tables/build/BuildLineTable.tsx:239 +#: src/tables/build/BuildLineTable.tsx:240 msgid "Includes substitute stock" msgstr "" @@ -9234,7 +9244,7 @@ msgstr "" #~ msgstr "Edit Bom Item" #: src/tables/bom/BomTable.tsx:332 -#: src/tables/build/BuildLineTable.tsx:249 +#: src/tables/build/BuildLineTable.tsx:250 #: src/tables/sales/SalesOrderLineItemTable.tsx:166 msgid "Includes variant stock" msgstr "" @@ -9272,8 +9282,8 @@ msgid "Stock Information" msgstr "" #: src/tables/bom/BomTable.tsx:399 -#: src/tables/build/BuildLineTable.tsx:496 -#: src/tables/build/BuildLineTable.tsx:537 +#: src/tables/build/BuildLineTable.tsx:497 +#: src/tables/build/BuildLineTable.tsx:538 msgid "Consumable item" msgstr "" @@ -9282,7 +9292,7 @@ msgid "No available stock" msgstr "" #: src/tables/bom/BomTable.tsx:420 -#: src/tables/build/BuildLineTable.tsx:213 +#: src/tables/build/BuildLineTable.tsx:214 msgid "Show testable items" msgstr "" @@ -9291,7 +9301,7 @@ msgid "Show trackable items" msgstr "Показати відстежувані позиції" #: src/tables/bom/BomTable.tsx:430 -#: src/tables/build/BuildLineTable.tsx:208 +#: src/tables/build/BuildLineTable.tsx:209 msgid "Show assembled items" msgstr "" @@ -9335,7 +9345,7 @@ msgstr "" #: src/tables/bom/BomTable.tsx:464 #: src/tables/bom/UsedInTable.tsx:85 -#: src/tables/build/BuildLineTable.tsx:202 +#: src/tables/build/BuildLineTable.tsx:203 msgid "Optional" msgstr "" @@ -9345,7 +9355,7 @@ msgid "Show optional items" msgstr "" #: src/tables/bom/BomTable.tsx:469 -#: src/tables/build/BuildLineTable.tsx:197 +#: src/tables/build/BuildLineTable.tsx:198 msgid "Consumable" msgstr "" @@ -9433,7 +9443,7 @@ msgid "Bill of materials cannot be edited, as the part is locked" msgstr "Біл матеріалів не можна редагувати, тому що частина заблокована" #: src/tables/bom/UsedInTable.tsx:34 -#: src/tables/build/BuildLineTable.tsx:207 +#: src/tables/build/BuildLineTable.tsx:208 #: src/tables/part/ParametricPartTable.tsx:364 #: src/tables/part/PartBuildAllocationsTable.tsx:60 #: src/tables/part/PartTable.tsx:209 @@ -9455,11 +9465,11 @@ msgstr "Відстежуваний" msgid "Show trackable assemblies" msgstr "Показати відстежувані збірки" -#: src/tables/build/BuildAllocatedStockTable.tsx:67 +#: src/tables/build/BuildAllocatedStockTable.tsx:64 msgid "Allocated to Output" msgstr "" -#: src/tables/build/BuildAllocatedStockTable.tsx:68 +#: src/tables/build/BuildAllocatedStockTable.tsx:65 msgid "Show items allocated to a build output" msgstr "" @@ -9472,7 +9482,7 @@ msgstr "" #~ msgid "Include orders for part variants" #~ msgstr "Include orders for part variants" -#: src/tables/build/BuildAllocatedStockTable.tsx:97 +#: src/tables/build/BuildAllocatedStockTable.tsx:94 #: src/tables/part/PartBuildAllocationsTable.tsx:84 #: src/tables/part/PartPurchaseOrdersTable.tsx:132 #: src/tables/part/PartSalesAllocationsTable.tsx:69 @@ -9482,40 +9492,58 @@ msgid "Order Status" msgstr "Статус замовлення" #: src/tables/build/BuildAllocatedStockTable.tsx:164 -#~ msgid "Edit Build Item" -#~ msgstr "Edit Build Item" - -#: src/tables/build/BuildAllocatedStockTable.tsx:167 -#: src/tables/build/BuildLineTable.tsx:650 +#: src/tables/build/BuildLineTable.tsx:651 msgid "Edit Stock Allocation" msgstr "" +#: src/tables/build/BuildAllocatedStockTable.tsx:164 +#~ msgid "Edit Build Item" +#~ msgstr "Edit Build Item" + #: src/tables/build/BuildAllocatedStockTable.tsx:174 #~ msgid "Delete Build Item" #~ msgstr "Delete Build Item" -#: src/tables/build/BuildAllocatedStockTable.tsx:180 -#: src/tables/build/BuildLineTable.tsx:663 -msgid "Delete Stock Allocation" +#: src/tables/build/BuildAllocatedStockTable.tsx:177 +#: src/tables/build/BuildLineTable.tsx:664 +#: src/tables/sales/SalesOrderAllocationTable.tsx:218 +msgid "Remove Allocated Stock" msgstr "" -#: src/tables/build/BuildAllocatedStockTable.tsx:239 +#: src/tables/build/BuildAllocatedStockTable.tsx:180 +#: src/tables/build/BuildLineTable.tsx:663 +#~ msgid "Delete Stock Allocation" +#~ msgstr "Delete Stock Allocation" + +#: src/tables/build/BuildAllocatedStockTable.tsx:182 +#: src/tables/build/BuildLineTable.tsx:669 +#: src/tables/sales/SalesOrderAllocationTable.tsx:221 +msgid "Are you sure you want to remove this allocated stock from the order?" +msgstr "" + +#: src/tables/build/BuildAllocatedStockTable.tsx:242 msgid "Consume" msgstr "" +#: src/tables/build/BuildAllocatedStockTable.tsx:259 +#: src/tables/build/BuildLineTable.tsx:112 +#: src/tables/sales/SalesOrderAllocationTable.tsx:248 +msgid "Remove allocated stock" +msgstr "" + #: src/tables/build/BuildLineTable.tsx:59 #~ msgid "Show lines with available stock" #~ msgstr "Show lines with available stock" -#: src/tables/build/BuildLineTable.tsx:120 +#: src/tables/build/BuildLineTable.tsx:121 msgid "View Stock Item" msgstr "" -#: src/tables/build/BuildLineTable.tsx:183 +#: src/tables/build/BuildLineTable.tsx:184 msgid "Show fully allocated lines" msgstr "" -#: src/tables/build/BuildLineTable.tsx:188 +#: src/tables/build/BuildLineTable.tsx:189 msgid "Show fully consumed lines" msgstr "" @@ -9523,124 +9551,124 @@ msgstr "" #~ msgid "Show allocated lines" #~ msgstr "Show allocated lines" -#: src/tables/build/BuildLineTable.tsx:193 +#: src/tables/build/BuildLineTable.tsx:194 msgid "Show items with sufficient available stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:198 +#: src/tables/build/BuildLineTable.tsx:199 msgid "Show consumable lines" msgstr "" -#: src/tables/build/BuildLineTable.tsx:203 +#: src/tables/build/BuildLineTable.tsx:204 msgid "Show optional lines" msgstr "" -#: src/tables/build/BuildLineTable.tsx:212 +#: src/tables/build/BuildLineTable.tsx:213 #: src/tables/part/PartTable.tsx:233 msgid "Testable" msgstr "" -#: src/tables/build/BuildLineTable.tsx:217 +#: src/tables/build/BuildLineTable.tsx:218 #: src/tables/stock/StockItemTable.tsx:388 msgid "Tracked" msgstr "" -#: src/tables/build/BuildLineTable.tsx:218 +#: src/tables/build/BuildLineTable.tsx:219 msgid "Show tracked lines" msgstr "" -#: src/tables/build/BuildLineTable.tsx:223 +#: src/tables/build/BuildLineTable.tsx:224 msgid "Show items with stock on order" msgstr "" -#: src/tables/build/BuildLineTable.tsx:258 +#: src/tables/build/BuildLineTable.tsx:259 #: src/tables/sales/SalesOrderLineItemTable.tsx:172 msgid "In production" msgstr "" -#: src/tables/build/BuildLineTable.tsx:286 +#: src/tables/build/BuildLineTable.tsx:287 msgid "Insufficient stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:302 +#: src/tables/build/BuildLineTable.tsx:303 #: src/tables/sales/SalesOrderLineItemTable.tsx:160 #: src/tables/stock/StockItemTable.tsx:191 msgid "No stock available" msgstr "" -#: src/tables/build/BuildLineTable.tsx:375 +#: src/tables/build/BuildLineTable.tsx:376 msgid "Gets Inherited" msgstr "" -#: src/tables/build/BuildLineTable.tsx:388 +#: src/tables/build/BuildLineTable.tsx:389 msgid "Unit Quantity" msgstr "" -#: src/tables/build/BuildLineTable.tsx:415 +#: src/tables/build/BuildLineTable.tsx:416 msgid "Setup Quantity" msgstr "" -#: src/tables/build/BuildLineTable.tsx:424 +#: src/tables/build/BuildLineTable.tsx:425 msgid "Attrition" msgstr "" -#: src/tables/build/BuildLineTable.tsx:432 +#: src/tables/build/BuildLineTable.tsx:433 msgid "Rounding Multiple" msgstr "" -#: src/tables/build/BuildLineTable.tsx:441 +#: src/tables/build/BuildLineTable.tsx:442 msgid "BOM Information" msgstr "" -#: src/tables/build/BuildLineTable.tsx:515 +#: src/tables/build/BuildLineTable.tsx:516 #: src/tables/part/PartBuildAllocationsTable.tsx:102 msgid "Fully allocated" msgstr "" -#: src/tables/build/BuildLineTable.tsx:563 +#: src/tables/build/BuildLineTable.tsx:564 #: src/tables/sales/SalesOrderLineItemTable.tsx:311 msgid "Create Build Order" msgstr "" -#: src/tables/build/BuildLineTable.tsx:592 +#: src/tables/build/BuildLineTable.tsx:593 msgid "Auto allocation in progress" msgstr "Виконується автоматичний розподіл" -#: src/tables/build/BuildLineTable.tsx:595 -#: src/tables/build/BuildLineTable.tsx:802 +#: src/tables/build/BuildLineTable.tsx:596 +#: src/tables/build/BuildLineTable.tsx:809 msgid "Auto Allocate Stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:596 +#: src/tables/build/BuildLineTable.tsx:597 msgid "Automatically allocate stock to this build according to the selected options" msgstr "Автоматично виділяти запас для цієї збірки згідно вибраних опцій" -#: src/tables/build/BuildLineTable.tsx:616 -#: src/tables/build/BuildLineTable.tsx:630 -#: src/tables/build/BuildLineTable.tsx:751 -#: src/tables/build/BuildLineTable.tsx:852 +#: src/tables/build/BuildLineTable.tsx:617 +#: src/tables/build/BuildLineTable.tsx:631 +#: src/tables/build/BuildLineTable.tsx:758 +#: src/tables/build/BuildLineTable.tsx:859 #: src/tables/build/BuildOutputTable.tsx:355 #: src/tables/build/BuildOutputTable.tsx:360 msgid "Deallocate Stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:632 +#: src/tables/build/BuildLineTable.tsx:633 msgid "Deallocate all untracked stock for this build order" msgstr "" -#: src/tables/build/BuildLineTable.tsx:634 +#: src/tables/build/BuildLineTable.tsx:635 msgid "Deallocate stock from the selected line item" msgstr "" -#: src/tables/build/BuildLineTable.tsx:638 +#: src/tables/build/BuildLineTable.tsx:639 msgid "Stock has been deallocated" msgstr "" -#: src/tables/build/BuildLineTable.tsx:771 +#: src/tables/build/BuildLineTable.tsx:778 msgid "Build Stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:784 +#: src/tables/build/BuildLineTable.tsx:791 #: src/tables/sales/SalesOrderLineItemTable.tsx:487 msgid "View Part" msgstr "" @@ -9739,7 +9767,7 @@ msgid "Serialize Build Output" msgstr "" #: src/tables/build/BuildOutputTable.tsx:405 -#: src/tables/part/PartTestResultTable.tsx:310 +#: src/tables/part/PartTestResultTable.tsx:318 #: src/tables/stock/StockItemTable.tsx:328 msgid "Filter by stock status" msgstr "" @@ -9964,8 +9992,8 @@ msgid "View Item" msgstr "" #: src/tables/general/ExtraLineItemTable.tsx:95 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:299 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:403 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:300 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:405 #: src/tables/sales/ReturnOrderLineItemTable.tsx:83 #: src/tables/sales/ReturnOrderLineItemTable.tsx:187 #: src/tables/sales/SalesOrderLineItemTable.tsx:252 @@ -9974,14 +10002,14 @@ msgid "Add Line Item" msgstr "" #: src/tables/general/ExtraLineItemTable.tsx:108 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:320 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:322 #: src/tables/sales/ReturnOrderLineItemTable.tsx:96 #: src/tables/sales/SalesOrderLineItemTable.tsx:271 msgid "Edit Line Item" msgstr "" #: src/tables/general/ExtraLineItemTable.tsx:117 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:329 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:331 #: src/tables/sales/ReturnOrderLineItemTable.tsx:105 #: src/tables/sales/SalesOrderLineItemTable.tsx:280 msgid "Delete Line Item" @@ -10273,7 +10301,7 @@ msgid "Required Stock" msgstr "" #: src/tables/part/PartBuildAllocationsTable.tsx:124 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:381 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:383 msgid "View Build Order" msgstr "" @@ -10617,8 +10645,8 @@ msgstr "" #: src/tables/part/PartTestResultTable.tsx:103 #: src/tables/part/PartTestResultTable.tsx:181 -#: src/tables/part/PartTestResultTable.tsx:320 -#: src/tables/part/PartTestResultTable.tsx:334 +#: src/tables/part/PartTestResultTable.tsx:328 +#: src/tables/part/PartTestResultTable.tsx:342 #: src/tables/stock/StockItemTestResultTable.tsx:296 #: src/tables/stock/StockItemTestResultTable.tsx:368 #: src/tables/stock/StockItemTestResultTable.tsx:429 @@ -10643,7 +10671,7 @@ msgstr "" msgid "No Result" msgstr "" -#: src/tables/part/PartTestResultTable.tsx:298 +#: src/tables/part/PartTestResultTable.tsx:306 msgid "Show build outputs currently in production" msgstr "" @@ -11073,7 +11101,7 @@ msgid "Show manufacturer parts for active manufacturers." msgstr "" #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:115 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:397 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:399 msgid "Import Line Items" msgstr "" @@ -11099,11 +11127,11 @@ msgstr "" #~ msgid "Add line item" #~ msgstr "Add line item" -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:350 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:352 msgid "Receive line item" msgstr "" -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:414 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:416 msgid "Receive items" msgstr "" @@ -11201,25 +11229,25 @@ msgid "Not shipped" msgstr "" #: src/tables/sales/SalesOrderAllocationTable.tsx:211 -#: src/tables/sales/SalesOrderAllocationTable.tsx:229 +#: src/tables/sales/SalesOrderAllocationTable.tsx:235 msgid "Edit Allocation" msgstr "" #: src/tables/sales/SalesOrderAllocationTable.tsx:218 #: src/tables/sales/SalesOrderAllocationTable.tsx:241 -msgid "Delete Allocation" -msgstr "" +#~ msgid "Delete Allocation" +#~ msgstr "Delete Allocation" -#: src/tables/sales/SalesOrderAllocationTable.tsx:252 -#: src/tables/sales/SalesOrderAllocationTable.tsx:253 +#: src/tables/sales/SalesOrderAllocationTable.tsx:261 +#: src/tables/sales/SalesOrderAllocationTable.tsx:262 msgid "View Shipment" msgstr "" -#: src/tables/sales/SalesOrderAllocationTable.tsx:308 +#: src/tables/sales/SalesOrderAllocationTable.tsx:317 msgid "Assign to Shipment" msgstr "" -#: src/tables/sales/SalesOrderAllocationTable.tsx:324 +#: src/tables/sales/SalesOrderAllocationTable.tsx:333 msgid "Assign to shipment" msgstr "Призначити для відвантаження" diff --git a/src/frontend/src/locales/vi/messages.po b/src/frontend/src/locales/vi/messages.po index ca71588cd9..ce60c883b7 100644 --- a/src/frontend/src/locales/vi/messages.po +++ b/src/frontend/src/locales/vi/messages.po @@ -8,7 +8,7 @@ msgstr "" "Language: vi\n" "Project-Id-Version: inventree\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2025-11-19 19:39\n" +"PO-Revision-Date: 2025-11-22 06:25\n" "Last-Translator: \n" "Language-Team: Vietnamese\n" "Plural-Forms: nplurals=1; plural=0;\n" @@ -56,7 +56,7 @@ msgstr "Hủy bỏ" #: lib/components/RowActions.tsx:136 #: src/components/nav/NavigationDrawer.tsx:190 -#: src/forms/PurchaseOrderForms.tsx:802 +#: src/forms/PurchaseOrderForms.tsx:854 #: src/forms/StockForms.tsx:796 #: src/forms/StockForms.tsx:843 #: src/forms/StockForms.tsx:889 @@ -103,9 +103,9 @@ msgstr "Không" #: src/forms/BuildForms.tsx:630 #: src/forms/BuildForms.tsx:793 #: src/forms/BuildForms.tsx:896 -#: src/forms/PurchaseOrderForms.tsx:798 +#: src/forms/PurchaseOrderForms.tsx:850 #: src/forms/ReturnOrderForms.tsx:242 -#: src/forms/SalesOrderForms.tsx:305 +#: src/forms/SalesOrderForms.tsx:323 #: src/forms/StockForms.tsx:360 #: src/forms/StockForms.tsx:791 #: src/forms/StockForms.tsx:838 @@ -119,6 +119,7 @@ msgstr "Không" #: src/pages/build/BuildDetail.tsx:200 #: src/pages/part/PartDetail.tsx:1207 #: src/tables/ColumnRenderers.tsx:91 +#: src/tables/part/PartTestResultTable.tsx:247 #: src/tables/part/RelatedPartTable.tsx:53 #: src/tables/stock/StockTrackingTable.tsx:87 msgid "Part" @@ -158,7 +159,7 @@ msgstr "Mẫu thử nghiệm" #: src/components/wizards/OrderPartsWizard.tsx:290 #: src/pages/company/SupplierPartDetail.tsx:413 #: src/pages/stock/StockDetail.tsx:289 -#: src/tables/build/BuildAllocatedStockTable.tsx:155 +#: src/tables/build/BuildAllocatedStockTable.tsx:152 #: src/tables/part/PartPurchaseOrdersTable.tsx:50 #: src/tables/purchasing/SupplierPartTable.tsx:83 #: src/tables/stock/StockItemTable.tsx:247 @@ -201,9 +202,9 @@ msgstr "Danh mục phụ kiện" #: src/forms/BuildForms.tsx:473 #: src/forms/BuildForms.tsx:633 #: src/forms/BuildForms.tsx:794 -#: src/forms/SalesOrderForms.tsx:307 +#: src/forms/SalesOrderForms.tsx:325 #: src/pages/stock/StockDetail.tsx:1005 -#: src/tables/part/PartTestResultTable.tsx:248 +#: src/tables/part/PartTestResultTable.tsx:256 #: src/tables/stock/StockTrackingTable.tsx:48 #: src/tables/stock/StockTrackingTable.tsx:55 msgid "Stock Item" @@ -517,7 +518,7 @@ msgstr "Danh sách chọn" #: src/components/dashboard/DashboardLayout.tsx:281 #: src/components/editors/NotesEditor.tsx:74 #: src/components/editors/TemplateEditor/TemplateEditor.tsx:158 -#: src/components/forms/fields/ApiFormField.tsx:273 +#: src/components/forms/fields/ApiFormField.tsx:237 #: src/components/forms/fields/TableField.tsx:45 #: src/components/importer/ImportDataSelector.tsx:192 #: src/components/importer/ImporterColumnSelector.tsx:234 @@ -642,8 +643,8 @@ msgstr "Nhập dữ liệu mã vạch" #: src/components/barcodes/BarcodeScanDialog.tsx:49 #: src/components/buttons/ScanButton.tsx:15 #: src/components/nav/NavigationDrawer.tsx:122 -#: src/forms/PurchaseOrderForms.tsx:457 -#: src/forms/PurchaseOrderForms.tsx:563 +#: src/forms/PurchaseOrderForms.tsx:509 +#: src/forms/PurchaseOrderForms.tsx:615 msgid "Scan Barcode" msgstr "Quét mã vạch" @@ -728,7 +729,7 @@ msgstr "Thao tác này sẽ xóa liên kết đến mã vạch được liên k #: src/components/barcodes/QRCode.tsx:205 #: src/components/items/ActionDropdown.tsx:192 -#: src/forms/PurchaseOrderForms.tsx:554 +#: src/forms/PurchaseOrderForms.tsx:606 msgid "Unlink Barcode" msgstr "Gỡ liên kết mã vạch" @@ -1216,6 +1217,12 @@ msgstr "Xóa hình liên quan khỏi mục này?" #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:884 #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:903 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:254 +#: src/tables/build/BuildAllocatedStockTable.tsx:178 +#: src/tables/build/BuildAllocatedStockTable.tsx:258 +#: src/tables/build/BuildLineTable.tsx:111 +#: src/tables/build/BuildLineTable.tsx:665 +#: src/tables/sales/SalesOrderAllocationTable.tsx:224 +#: src/tables/sales/SalesOrderAllocationTable.tsx:247 msgid "Remove" msgstr "Xoá" @@ -1241,7 +1248,7 @@ msgid "Upload Error" msgstr "Lỗi tải lên" #: src/components/details/DetailsImage.tsx:250 -#: src/components/forms/fields/TextField.tsx:65 +#: src/components/forms/fields/AutoFillRightSection.tsx:34 msgid "Clear" msgstr "Clear" @@ -1817,10 +1824,14 @@ msgstr "" msgid "Running" msgstr "" -#: src/components/forms/fields/ApiFormField.tsx:233 +#: src/components/forms/fields/ApiFormField.tsx:197 msgid "Select file to upload" msgstr "" +#: src/components/forms/fields/AutoFillRightSection.tsx:47 +msgid "Accept suggested value" +msgstr "" + #: src/components/forms/fields/DateField.tsx:76 msgid "Select date" msgstr "" @@ -1875,10 +1886,6 @@ msgstr "Không mục nhập nào có sẵn" msgid "Add new row" msgstr "" -#: src/components/forms/fields/TextField.tsx:82 -msgid "Accept suggested value" -msgstr "" - #: src/components/images/DetailsImage.tsx:252 #~ msgid "Select image" #~ msgstr "Select image" @@ -2225,8 +2232,8 @@ msgstr "" #: src/pages/part/PartDetail.tsx:994 #: src/pages/stock/StockDetail.tsx:265 #: src/pages/stock/StockDetail.tsx:942 -#: src/tables/build/BuildAllocatedStockTable.tsx:135 -#: src/tables/build/BuildLineTable.tsx:192 +#: src/tables/build/BuildAllocatedStockTable.tsx:132 +#: src/tables/build/BuildLineTable.tsx:193 #: src/tables/part/PartTable.tsx:137 #: src/tables/stock/StockItemTable.tsx:182 #: src/tables/stock/StockItemTable.tsx:343 @@ -2784,7 +2791,7 @@ msgstr "" #: src/pages/sales/SalesOrderDetail.tsx:119 #: src/pages/stock/LocationDetail.tsx:102 #: src/tables/ColumnRenderers.tsx:278 -#: src/tables/build/BuildAllocatedStockTable.tsx:91 +#: src/tables/build/BuildAllocatedStockTable.tsx:88 #: src/tables/machine/MachineTypeTable.tsx:161 #: src/tables/machine/MachineTypeTable.tsx:257 #: src/tables/plugin/PluginListTable.tsx:110 @@ -2966,7 +2973,7 @@ msgstr "Hết hàng" #: src/pages/company/SupplierPartDetail.tsx:394 #: src/pages/part/PartDetail.tsx:1015 #: src/tables/bom/BomTable.tsx:444 -#: src/tables/build/BuildLineTable.tsx:222 +#: src/tables/build/BuildLineTable.tsx:223 #: src/tables/part/PartTable.tsx:108 msgid "On Order" msgstr "On Order" @@ -2976,7 +2983,7 @@ msgstr "On Order" #: src/pages/part/PartDetail.tsx:587 #: src/pages/part/PartDetail.tsx:1021 #: src/pages/stock/StockDetail.tsx:925 -#: src/tables/part/PartTestResultTable.tsx:297 +#: src/tables/part/PartTestResultTable.tsx:305 #: src/tables/stock/StockItemTable.tsx:359 msgid "In Production" msgstr "Đang sản xuất" @@ -3000,7 +3007,7 @@ msgstr "Danh mục" #: src/components/render/Stock.tsx:114 #: src/components/render/Stock.tsx:132 #: src/forms/BuildForms.tsx:795 -#: src/forms/PurchaseOrderForms.tsx:595 +#: src/forms/PurchaseOrderForms.tsx:647 #: src/forms/StockForms.tsx:792 #: src/forms/StockForms.tsx:839 #: src/forms/StockForms.tsx:885 @@ -3023,7 +3030,7 @@ msgstr "Vị trí" #: src/components/render/Stock.tsx:99 #: src/pages/stock/StockDetail.tsx:198 #: src/pages/stock/StockDetail.tsx:930 -#: src/tables/build/BuildAllocatedStockTable.tsx:121 +#: src/tables/build/BuildAllocatedStockTable.tsx:118 #: src/tables/build/BuildOutputTable.tsx:107 #: src/tables/sales/SalesOrderAllocationTable.tsx:142 msgid "Serial Number" @@ -3034,9 +3041,9 @@ msgstr "Số sê-ri" #: src/forms/BuildForms.tsx:240 #: src/forms/BuildForms.tsx:634 #: src/forms/BuildForms.tsx:797 -#: src/forms/PurchaseOrderForms.tsx:801 +#: src/forms/PurchaseOrderForms.tsx:853 #: src/forms/ReturnOrderForms.tsx:243 -#: src/forms/SalesOrderForms.tsx:308 +#: src/forms/SalesOrderForms.tsx:326 #: src/forms/StockForms.tsx:841 #: src/pages/part/PartStockHistoryDetail.tsx:56 #: src/pages/part/PartStockHistoryDetail.tsx:210 @@ -3046,9 +3053,9 @@ msgstr "Số sê-ri" #: src/pages/part/pricing/PriceBreakPanel.tsx:172 #: src/pages/stock/StockDetail.tsx:258 #: src/pages/stock/StockDetail.tsx:936 -#: src/tables/build/BuildLineTable.tsx:86 +#: src/tables/build/BuildLineTable.tsx:83 #: src/tables/part/PartPurchaseOrdersTable.tsx:94 -#: src/tables/part/PartTestResultTable.tsx:269 +#: src/tables/part/PartTestResultTable.tsx:277 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:175 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:206 #: src/tables/purchasing/SupplierPriceBreakTable.tsx:69 @@ -3070,7 +3077,7 @@ msgstr "Số lượng" #: src/forms/StockForms.tsx:1048 #: src/forms/StockForms.tsx:1096 #: src/forms/StockForms.tsx:1140 -#: src/tables/build/BuildLineTable.tsx:96 +#: src/tables/build/BuildLineTable.tsx:93 msgid "Batch" msgstr "" @@ -3755,7 +3762,7 @@ msgid "In Stock" msgstr "Còn hàng" #: src/components/wizards/OrderPartsWizard.tsx:146 -#: src/tables/build/BuildLineTable.tsx:404 +#: src/tables/build/BuildLineTable.tsx:405 msgid "Required Quantity" msgstr "" @@ -3847,7 +3854,7 @@ msgid "Please correct the errors in the selected parts" msgstr "" #: src/components/wizards/OrderPartsWizard.tsx:587 -#: src/tables/build/BuildLineTable.tsx:815 +#: src/tables/build/BuildLineTable.tsx:822 #: src/tables/part/PartTable.tsx:522 #: src/tables/sales/SalesOrderLineItemTable.tsx:370 msgid "Order Parts" @@ -4349,9 +4356,9 @@ msgstr "" #: src/forms/BuildForms.tsx:333 #: src/forms/BuildForms.tsx:408 #: src/forms/BuildForms.tsx:685 -#: src/tables/build/BuildAllocatedStockTable.tsx:150 +#: src/tables/build/BuildAllocatedStockTable.tsx:147 #: src/tables/build/BuildOutputTable.tsx:582 -#: src/tables/part/PartTestResultTable.tsx:272 +#: src/tables/part/PartTestResultTable.tsx:280 msgid "Build Output" msgstr "" @@ -4362,7 +4369,7 @@ msgstr "" #: src/forms/BuildForms.tsx:336 #: src/forms/BuildForms.tsx:411 #: src/forms/BuildForms.tsx:475 -#: src/forms/PurchaseOrderForms.tsx:717 +#: src/forms/PurchaseOrderForms.tsx:769 #: src/forms/ReturnOrderForms.tsx:197 #: src/forms/ReturnOrderForms.tsx:244 #: src/forms/StockForms.tsx:712 @@ -4377,7 +4384,7 @@ msgstr "" #: src/tables/build/BuildOutputTable.tsx:404 #: src/tables/machine/MachineListTable.tsx:387 #: src/tables/part/PartPurchaseOrdersTable.tsx:38 -#: src/tables/part/PartTestResultTable.tsx:309 +#: src/tables/part/PartTestResultTable.tsx:317 #: src/tables/sales/ReturnOrderLineItemTable.tsx:138 #: src/tables/sales/ReturnOrderLineItemTable.tsx:176 #: src/tables/settings/CustomStateTable.tsx:79 @@ -4450,8 +4457,8 @@ msgstr "Xây dựng đầu ra đã bị hủy" #: src/pages/stock/StockDetail.tsx:153 #: src/tables/bom/BomTable.tsx:134 #: src/tables/bom/UsedInTable.tsx:40 -#: src/tables/build/BuildAllocatedStockTable.tsx:108 -#: src/tables/build/BuildLineTable.tsx:336 +#: src/tables/build/BuildAllocatedStockTable.tsx:105 +#: src/tables/build/BuildLineTable.tsx:337 #: src/tables/build/BuildOrderTable.tsx:79 #: src/tables/part/PartSalesAllocationsTable.tsx:61 #: src/tables/part/RelatedPartTable.tsx:73 @@ -4466,47 +4473,47 @@ msgstr "IPN" #: src/forms/BuildForms.tsx:632 #: src/forms/BuildForms.tsx:796 #: src/forms/BuildForms.tsx:897 -#: src/forms/SalesOrderForms.tsx:306 -#: src/tables/build/BuildAllocatedStockTable.tsx:139 -#: src/tables/build/BuildLineTable.tsx:182 +#: src/forms/SalesOrderForms.tsx:324 +#: src/tables/build/BuildAllocatedStockTable.tsx:136 +#: src/tables/build/BuildLineTable.tsx:183 #: src/tables/sales/SalesOrderLineItemTable.tsx:342 #: src/tables/stock/StockItemTable.tsx:338 msgid "Allocated" msgstr "" #: src/forms/BuildForms.tsx:667 -#: src/forms/SalesOrderForms.tsx:295 +#: src/forms/SalesOrderForms.tsx:313 #: src/pages/build/BuildDetail.tsx:108 #: src/pages/build/BuildDetail.tsx:326 msgid "Source Location" msgstr "Vị trí nguồn cung" #: src/forms/BuildForms.tsx:668 -#: src/forms/SalesOrderForms.tsx:296 +#: src/forms/SalesOrderForms.tsx:314 msgid "Select the source location for the stock allocation" msgstr "" #: src/forms/BuildForms.tsx:700 -#: src/forms/SalesOrderForms.tsx:336 -#: src/tables/build/BuildLineTable.tsx:574 -#: src/tables/build/BuildLineTable.tsx:731 -#: src/tables/build/BuildLineTable.tsx:830 +#: src/forms/SalesOrderForms.tsx:354 +#: src/tables/build/BuildLineTable.tsx:575 +#: src/tables/build/BuildLineTable.tsx:738 +#: src/tables/build/BuildLineTable.tsx:837 #: src/tables/sales/SalesOrderLineItemTable.tsx:380 #: src/tables/sales/SalesOrderLineItemTable.tsx:406 msgid "Allocate Stock" msgstr "Phân kho" #: src/forms/BuildForms.tsx:703 -#: src/forms/SalesOrderForms.tsx:341 +#: src/forms/SalesOrderForms.tsx:359 msgid "Stock items allocated" msgstr "" #: src/forms/BuildForms.tsx:816 #: src/forms/BuildForms.tsx:917 -#: src/tables/build/BuildAllocatedStockTable.tsx:240 -#: src/tables/build/BuildAllocatedStockTable.tsx:272 -#: src/tables/build/BuildLineTable.tsx:741 -#: src/tables/build/BuildLineTable.tsx:864 +#: src/tables/build/BuildAllocatedStockTable.tsx:243 +#: src/tables/build/BuildAllocatedStockTable.tsx:279 +#: src/tables/build/BuildLineTable.tsx:748 +#: src/tables/build/BuildLineTable.tsx:871 msgid "Consume Stock" msgstr "" @@ -4521,21 +4528,21 @@ msgstr "" #~ msgstr "Stock items consumed" #: src/forms/BuildForms.tsx:853 -#: src/tables/build/BuildLineTable.tsx:514 +#: src/tables/build/BuildLineTable.tsx:515 #: src/tables/part/PartBuildAllocationsTable.tsx:101 msgid "Fully consumed" msgstr "" #: src/forms/BuildForms.tsx:898 -#: src/tables/build/BuildLineTable.tsx:187 +#: src/tables/build/BuildLineTable.tsx:188 #: src/tables/stock/StockItemTable.tsx:367 msgid "Consumed" msgstr "" #: src/forms/CommonForms.tsx:88 -#: src/forms/PurchaseOrderForms.tsx:125 +#: src/forms/PurchaseOrderForms.tsx:176 #: src/forms/ReturnOrderForms.tsx:138 -#: src/forms/SalesOrderForms.tsx:164 +#: src/forms/SalesOrderForms.tsx:182 msgid "Select project code for this line item" msgstr "" @@ -4572,127 +4579,127 @@ msgstr "Danh mục phụ kiện cha" msgid "Subscribe to notifications for this category" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:388 -msgid "Assign Batch Code and Serial Numbers" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:390 -msgid "Assign Batch Code" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:410 -msgid "Choose Location" -msgstr "Chọn vị trí" - -#: src/forms/PurchaseOrderForms.tsx:418 -msgid "Item Destination selected" -msgstr "Đã chọn đích đến của mặt hàng" - #: src/forms/PurchaseOrderForms.tsx:421 #~ msgid "Assign Batch Code{0}" #~ msgstr "Assign Batch Code{0}" -#: src/forms/PurchaseOrderForms.tsx:428 -msgid "Part category default location selected" -msgstr "Vị trí mặc định danh mục đã được chọn" +#: src/forms/PurchaseOrderForms.tsx:440 +msgid "Assign Batch Code and Serial Numbers" +msgstr "" -#: src/forms/PurchaseOrderForms.tsx:438 -msgid "Received stock location selected" -msgstr "Vị trí kho hàng nhận đã được chọn" +#: src/forms/PurchaseOrderForms.tsx:442 +msgid "Assign Batch Code" +msgstr "" #: src/forms/PurchaseOrderForms.tsx:444 #: src/forms/StockForms.tsx:428 #~ msgid "Remove item from list" #~ msgstr "Remove item from list" -#: src/forms/PurchaseOrderForms.tsx:446 +#: src/forms/PurchaseOrderForms.tsx:462 +msgid "Choose Location" +msgstr "Chọn vị trí" + +#: src/forms/PurchaseOrderForms.tsx:470 +msgid "Item Destination selected" +msgstr "Đã chọn đích đến của mặt hàng" + +#: src/forms/PurchaseOrderForms.tsx:480 +msgid "Part category default location selected" +msgstr "Vị trí mặc định danh mục đã được chọn" + +#: src/forms/PurchaseOrderForms.tsx:490 +msgid "Received stock location selected" +msgstr "Vị trí kho hàng nhận đã được chọn" + +#: src/forms/PurchaseOrderForms.tsx:498 msgid "Default location selected" msgstr "Vị trí mặc định đã chọn" -#: src/forms/PurchaseOrderForms.tsx:507 +#: src/forms/PurchaseOrderForms.tsx:559 msgid "Set Location" msgstr "Cài đặt vị trí" -#: src/forms/PurchaseOrderForms.tsx:524 -msgid "Set Expiry Date" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:532 -#: src/forms/StockForms.tsx:693 -msgid "Adjust Packaging" -msgstr "Điều chỉnh bao bì" - -#: src/forms/PurchaseOrderForms.tsx:540 -#: src/forms/StockForms.tsx:684 -#: src/hooks/UseStockAdjustActions.tsx:148 -msgid "Change Status" -msgstr "Thay đổi trạng thái" - -#: src/forms/PurchaseOrderForms.tsx:546 -msgid "Add Note" -msgstr "Thêm ghi chú" - #: src/forms/PurchaseOrderForms.tsx:566 #~ msgid "Serial numbers" #~ msgstr "Serial numbers" +#: src/forms/PurchaseOrderForms.tsx:576 +msgid "Set Expiry Date" +msgstr "" + #: src/forms/PurchaseOrderForms.tsx:582 #~ msgid "Store at line item destination" #~ msgstr "Store at line item destination" -#: src/forms/PurchaseOrderForms.tsx:610 -msgid "Store at default location" -msgstr "Cửa hàng ở vị trí mặc định" +#: src/forms/PurchaseOrderForms.tsx:584 +#: src/forms/StockForms.tsx:693 +msgid "Adjust Packaging" +msgstr "Điều chỉnh bao bì" -#: src/forms/PurchaseOrderForms.tsx:625 -msgid "Store at line item destination " -msgstr "" +#: src/forms/PurchaseOrderForms.tsx:592 +#: src/forms/StockForms.tsx:684 +#: src/hooks/UseStockAdjustActions.tsx:148 +msgid "Change Status" +msgstr "Thay đổi trạng thái" -#: src/forms/PurchaseOrderForms.tsx:637 -msgid "Store with already received stock" -msgstr "Cửa hàng đã nhận hàng" +#: src/forms/PurchaseOrderForms.tsx:598 +msgid "Add Note" +msgstr "Thêm ghi chú" #: src/forms/PurchaseOrderForms.tsx:658 #~ msgid "Receive line items" #~ msgstr "Receive line items" -#: src/forms/PurchaseOrderForms.tsx:661 +#: src/forms/PurchaseOrderForms.tsx:662 +msgid "Store at default location" +msgstr "Cửa hàng ở vị trí mặc định" + +#: src/forms/PurchaseOrderForms.tsx:677 +msgid "Store at line item destination " +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:689 +msgid "Store with already received stock" +msgstr "Cửa hàng đã nhận hàng" + +#: src/forms/PurchaseOrderForms.tsx:713 #: src/pages/build/BuildDetail.tsx:340 #: src/pages/stock/StockDetail.tsx:280 #: src/pages/stock/StockDetail.tsx:952 #: src/tables/Filter.tsx:83 -#: src/tables/build/BuildAllocatedStockTable.tsx:128 +#: src/tables/build/BuildAllocatedStockTable.tsx:125 #: src/tables/build/BuildOutputTable.tsx:112 -#: src/tables/part/PartTestResultTable.tsx:260 -#: src/tables/part/PartTestResultTable.tsx:281 +#: src/tables/part/PartTestResultTable.tsx:268 +#: src/tables/part/PartTestResultTable.tsx:289 #: src/tables/sales/SalesOrderAllocationTable.tsx:149 msgid "Batch Code" msgstr "Mã lô hàng" -#: src/forms/PurchaseOrderForms.tsx:662 +#: src/forms/PurchaseOrderForms.tsx:714 msgid "Enter batch code for received items" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:675 +#: src/forms/PurchaseOrderForms.tsx:727 #: src/forms/StockForms.tsx:218 msgid "Serial Numbers" msgstr "Số sê-ri" -#: src/forms/PurchaseOrderForms.tsx:676 +#: src/forms/PurchaseOrderForms.tsx:728 msgid "Enter serial numbers for received items" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:690 +#: src/forms/PurchaseOrderForms.tsx:742 #: src/pages/stock/StockDetail.tsx:382 #: src/tables/stock/StockItemTable.tsx:294 msgid "Expiry Date" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:691 +#: src/forms/PurchaseOrderForms.tsx:743 msgid "Enter an expiry date for received items" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:703 +#: src/forms/PurchaseOrderForms.tsx:755 #: src/forms/StockForms.tsx:728 #: src/pages/company/SupplierPartDetail.tsx:172 #: src/pages/company/SupplierPartDetail.tsx:236 @@ -4701,19 +4708,19 @@ msgstr "" msgid "Packaging" msgstr "Đóng gói" -#: src/forms/PurchaseOrderForms.tsx:727 +#: src/forms/PurchaseOrderForms.tsx:779 #: src/pages/company/SupplierPartDetail.tsx:120 #: src/tables/ColumnRenderers.tsx:332 msgid "Note" msgstr "Ghi chú" -#: src/forms/PurchaseOrderForms.tsx:799 +#: src/forms/PurchaseOrderForms.tsx:851 #: src/pages/company/SupplierPartDetail.tsx:138 #: src/tables/purchasing/SupplierPriceBreakTable.tsx:49 msgid "SKU" msgstr "SKU" -#: src/forms/PurchaseOrderForms.tsx:800 +#: src/forms/PurchaseOrderForms.tsx:852 #: src/tables/part/PartPurchaseOrdersTable.tsx:127 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:213 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:283 @@ -4721,11 +4728,11 @@ msgstr "SKU" msgid "Received" msgstr "Đã nhận" -#: src/forms/PurchaseOrderForms.tsx:817 +#: src/forms/PurchaseOrderForms.tsx:869 msgid "Receive Line Items" msgstr "Nhận hạng mục" -#: src/forms/PurchaseOrderForms.tsx:823 +#: src/forms/PurchaseOrderForms.tsx:875 msgid "Items received" msgstr "" @@ -4737,7 +4744,7 @@ msgstr "" msgid "Item received into stock" msgstr "" -#: src/forms/SalesOrderForms.tsx:401 +#: src/forms/SalesOrderForms.tsx:419 msgid "Leave blank to use the order address" msgstr "" @@ -5932,6 +5939,9 @@ msgstr "" #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:310 #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:401 +#: src/tables/build/BuildAllocatedStockTable.tsx:181 +#: src/tables/build/BuildLineTable.tsx:668 +#: src/tables/sales/SalesOrderAllocationTable.tsx:220 msgid "Confirm Removal" msgstr "" @@ -6870,8 +6880,8 @@ msgstr "Bên ngoài" #: src/pages/sales/ReturnOrderDetail.tsx:108 #: src/pages/sales/SalesOrderDetail.tsx:98 #: src/tables/ColumnRenderers.tsx:321 -#: src/tables/build/BuildAllocatedStockTable.tsx:115 -#: src/tables/build/BuildLineTable.tsx:352 +#: src/tables/build/BuildAllocatedStockTable.tsx:112 +#: src/tables/build/BuildLineTable.tsx:353 msgid "Reference" msgstr "Tham chiếu" @@ -7132,7 +7142,7 @@ msgstr "Hủy đơn hàng" #: src/pages/build/BuildDetail.tsx:742 #: src/pages/stock/StockDetail.tsx:344 -#: src/tables/build/BuildAllocatedStockTable.tsx:85 +#: src/tables/build/BuildAllocatedStockTable.tsx:82 #: src/tables/part/PartBuildAllocationsTable.tsx:45 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:157 #: src/tables/stock/StockTrackingTable.tsx:109 @@ -7600,7 +7610,7 @@ msgstr "Từ khóa" #: src/pages/part/PartDetail.tsx:542 #: src/tables/bom/BomTable.tsx:439 -#: src/tables/build/BuildLineTable.tsx:305 +#: src/tables/build/BuildLineTable.tsx:306 #: src/tables/part/PartTable.tsx:319 #: src/tables/sales/SalesOrderLineItemTable.tsx:138 msgid "Available Stock" @@ -7608,7 +7618,7 @@ msgstr "Số hàng tồn" #: src/pages/part/PartDetail.tsx:548 #: src/tables/bom/BomTable.tsx:341 -#: src/tables/build/BuildLineTable.tsx:267 +#: src/tables/build/BuildLineTable.tsx:268 #: src/tables/sales/SalesOrderLineItemTable.tsx:180 msgid "On order" msgstr "Đang đặt hàng" @@ -7782,7 +7792,7 @@ msgstr "" #: src/pages/part/PartDetail.tsx:1144 #: src/pages/stock/StockDetail.tsx:884 -#: src/tables/build/BuildLineTable.tsx:761 +#: src/tables/build/BuildLineTable.tsx:768 msgid "Order Stock" msgstr "" @@ -9219,13 +9229,13 @@ msgstr "" #~ msgstr "Show asssmbled items" #: src/tables/bom/BomTable.tsx:315 -#: src/tables/build/BuildLineTable.tsx:276 +#: src/tables/build/BuildLineTable.tsx:277 #: src/tables/part/PartTable.tsx:145 msgid "External stock" msgstr "Kho ngoài" #: src/tables/bom/BomTable.tsx:323 -#: src/tables/build/BuildLineTable.tsx:239 +#: src/tables/build/BuildLineTable.tsx:240 msgid "Includes substitute stock" msgstr "Bao gồm kho thay thế" @@ -9234,7 +9244,7 @@ msgstr "Bao gồm kho thay thế" #~ msgstr "Edit Bom Item" #: src/tables/bom/BomTable.tsx:332 -#: src/tables/build/BuildLineTable.tsx:249 +#: src/tables/build/BuildLineTable.tsx:250 #: src/tables/sales/SalesOrderLineItemTable.tsx:166 msgid "Includes variant stock" msgstr "Bao gồm kho biến thể" @@ -9272,8 +9282,8 @@ msgid "Stock Information" msgstr "Thông tin kho" #: src/tables/bom/BomTable.tsx:399 -#: src/tables/build/BuildLineTable.tsx:496 -#: src/tables/build/BuildLineTable.tsx:537 +#: src/tables/build/BuildLineTable.tsx:497 +#: src/tables/build/BuildLineTable.tsx:538 msgid "Consumable item" msgstr "Vật tư tiêu hao" @@ -9282,7 +9292,7 @@ msgid "No available stock" msgstr "Không khả dụng" #: src/tables/bom/BomTable.tsx:420 -#: src/tables/build/BuildLineTable.tsx:213 +#: src/tables/build/BuildLineTable.tsx:214 msgid "Show testable items" msgstr "Hiển thị items có thể kiểm" @@ -9291,7 +9301,7 @@ msgid "Show trackable items" msgstr "Hiển thị items có thể theo dõi" #: src/tables/bom/BomTable.tsx:430 -#: src/tables/build/BuildLineTable.tsx:208 +#: src/tables/build/BuildLineTable.tsx:209 msgid "Show assembled items" msgstr "Hiện items đã lắp ráp" @@ -9335,7 +9345,7 @@ msgstr "Hiện items có biến thể con" #: src/tables/bom/BomTable.tsx:464 #: src/tables/bom/UsedInTable.tsx:85 -#: src/tables/build/BuildLineTable.tsx:202 +#: src/tables/build/BuildLineTable.tsx:203 msgid "Optional" msgstr "Tuỳ chọn" @@ -9345,7 +9355,7 @@ msgid "Show optional items" msgstr "Hiện items tuỳ chọn" #: src/tables/bom/BomTable.tsx:469 -#: src/tables/build/BuildLineTable.tsx:197 +#: src/tables/build/BuildLineTable.tsx:198 msgid "Consumable" msgstr "Vật tư tiêu hao" @@ -9433,7 +9443,7 @@ msgid "Bill of materials cannot be edited, as the part is locked" msgstr "Không thể sửa BOM, do nguyên liệu bị khoá" #: src/tables/bom/UsedInTable.tsx:34 -#: src/tables/build/BuildLineTable.tsx:207 +#: src/tables/build/BuildLineTable.tsx:208 #: src/tables/part/ParametricPartTable.tsx:364 #: src/tables/part/PartBuildAllocationsTable.tsx:60 #: src/tables/part/PartTable.tsx:209 @@ -9455,11 +9465,11 @@ msgstr "Có thể theo dõi" msgid "Show trackable assemblies" msgstr "" -#: src/tables/build/BuildAllocatedStockTable.tsx:67 +#: src/tables/build/BuildAllocatedStockTable.tsx:64 msgid "Allocated to Output" msgstr "" -#: src/tables/build/BuildAllocatedStockTable.tsx:68 +#: src/tables/build/BuildAllocatedStockTable.tsx:65 msgid "Show items allocated to a build output" msgstr "" @@ -9472,7 +9482,7 @@ msgstr "" #~ msgid "Include orders for part variants" #~ msgstr "Include orders for part variants" -#: src/tables/build/BuildAllocatedStockTable.tsx:97 +#: src/tables/build/BuildAllocatedStockTable.tsx:94 #: src/tables/part/PartBuildAllocationsTable.tsx:84 #: src/tables/part/PartPurchaseOrdersTable.tsx:132 #: src/tables/part/PartSalesAllocationsTable.tsx:69 @@ -9482,40 +9492,58 @@ msgid "Order Status" msgstr "" #: src/tables/build/BuildAllocatedStockTable.tsx:164 -#~ msgid "Edit Build Item" -#~ msgstr "Edit Build Item" - -#: src/tables/build/BuildAllocatedStockTable.tsx:167 -#: src/tables/build/BuildLineTable.tsx:650 +#: src/tables/build/BuildLineTable.tsx:651 msgid "Edit Stock Allocation" msgstr "" +#: src/tables/build/BuildAllocatedStockTable.tsx:164 +#~ msgid "Edit Build Item" +#~ msgstr "Edit Build Item" + #: src/tables/build/BuildAllocatedStockTable.tsx:174 #~ msgid "Delete Build Item" #~ msgstr "Delete Build Item" -#: src/tables/build/BuildAllocatedStockTable.tsx:180 -#: src/tables/build/BuildLineTable.tsx:663 -msgid "Delete Stock Allocation" +#: src/tables/build/BuildAllocatedStockTable.tsx:177 +#: src/tables/build/BuildLineTable.tsx:664 +#: src/tables/sales/SalesOrderAllocationTable.tsx:218 +msgid "Remove Allocated Stock" msgstr "" -#: src/tables/build/BuildAllocatedStockTable.tsx:239 +#: src/tables/build/BuildAllocatedStockTable.tsx:180 +#: src/tables/build/BuildLineTable.tsx:663 +#~ msgid "Delete Stock Allocation" +#~ msgstr "Delete Stock Allocation" + +#: src/tables/build/BuildAllocatedStockTable.tsx:182 +#: src/tables/build/BuildLineTable.tsx:669 +#: src/tables/sales/SalesOrderAllocationTable.tsx:221 +msgid "Are you sure you want to remove this allocated stock from the order?" +msgstr "" + +#: src/tables/build/BuildAllocatedStockTable.tsx:242 msgid "Consume" msgstr "" +#: src/tables/build/BuildAllocatedStockTable.tsx:259 +#: src/tables/build/BuildLineTable.tsx:112 +#: src/tables/sales/SalesOrderAllocationTable.tsx:248 +msgid "Remove allocated stock" +msgstr "" + #: src/tables/build/BuildLineTable.tsx:59 #~ msgid "Show lines with available stock" #~ msgstr "Show lines with available stock" -#: src/tables/build/BuildLineTable.tsx:120 +#: src/tables/build/BuildLineTable.tsx:121 msgid "View Stock Item" msgstr "" -#: src/tables/build/BuildLineTable.tsx:183 +#: src/tables/build/BuildLineTable.tsx:184 msgid "Show fully allocated lines" msgstr "" -#: src/tables/build/BuildLineTable.tsx:188 +#: src/tables/build/BuildLineTable.tsx:189 msgid "Show fully consumed lines" msgstr "" @@ -9523,124 +9551,124 @@ msgstr "" #~ msgid "Show allocated lines" #~ msgstr "Show allocated lines" -#: src/tables/build/BuildLineTable.tsx:193 +#: src/tables/build/BuildLineTable.tsx:194 msgid "Show items with sufficient available stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:198 +#: src/tables/build/BuildLineTable.tsx:199 msgid "Show consumable lines" msgstr "" -#: src/tables/build/BuildLineTable.tsx:203 +#: src/tables/build/BuildLineTable.tsx:204 msgid "Show optional lines" msgstr "" -#: src/tables/build/BuildLineTable.tsx:212 +#: src/tables/build/BuildLineTable.tsx:213 #: src/tables/part/PartTable.tsx:233 msgid "Testable" msgstr "" -#: src/tables/build/BuildLineTable.tsx:217 +#: src/tables/build/BuildLineTable.tsx:218 #: src/tables/stock/StockItemTable.tsx:388 msgid "Tracked" msgstr "" -#: src/tables/build/BuildLineTable.tsx:218 +#: src/tables/build/BuildLineTable.tsx:219 msgid "Show tracked lines" msgstr "" -#: src/tables/build/BuildLineTable.tsx:223 +#: src/tables/build/BuildLineTable.tsx:224 msgid "Show items with stock on order" msgstr "" -#: src/tables/build/BuildLineTable.tsx:258 +#: src/tables/build/BuildLineTable.tsx:259 #: src/tables/sales/SalesOrderLineItemTable.tsx:172 msgid "In production" msgstr "" -#: src/tables/build/BuildLineTable.tsx:286 +#: src/tables/build/BuildLineTable.tsx:287 msgid "Insufficient stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:302 +#: src/tables/build/BuildLineTable.tsx:303 #: src/tables/sales/SalesOrderLineItemTable.tsx:160 #: src/tables/stock/StockItemTable.tsx:191 msgid "No stock available" msgstr "" -#: src/tables/build/BuildLineTable.tsx:375 +#: src/tables/build/BuildLineTable.tsx:376 msgid "Gets Inherited" msgstr "" -#: src/tables/build/BuildLineTable.tsx:388 +#: src/tables/build/BuildLineTable.tsx:389 msgid "Unit Quantity" msgstr "" -#: src/tables/build/BuildLineTable.tsx:415 +#: src/tables/build/BuildLineTable.tsx:416 msgid "Setup Quantity" msgstr "" -#: src/tables/build/BuildLineTable.tsx:424 +#: src/tables/build/BuildLineTable.tsx:425 msgid "Attrition" msgstr "" -#: src/tables/build/BuildLineTable.tsx:432 +#: src/tables/build/BuildLineTable.tsx:433 msgid "Rounding Multiple" msgstr "" -#: src/tables/build/BuildLineTable.tsx:441 +#: src/tables/build/BuildLineTable.tsx:442 msgid "BOM Information" msgstr "" -#: src/tables/build/BuildLineTable.tsx:515 +#: src/tables/build/BuildLineTable.tsx:516 #: src/tables/part/PartBuildAllocationsTable.tsx:102 msgid "Fully allocated" msgstr "" -#: src/tables/build/BuildLineTable.tsx:563 +#: src/tables/build/BuildLineTable.tsx:564 #: src/tables/sales/SalesOrderLineItemTable.tsx:311 msgid "Create Build Order" msgstr "" -#: src/tables/build/BuildLineTable.tsx:592 +#: src/tables/build/BuildLineTable.tsx:593 msgid "Auto allocation in progress" msgstr "" -#: src/tables/build/BuildLineTable.tsx:595 -#: src/tables/build/BuildLineTable.tsx:802 +#: src/tables/build/BuildLineTable.tsx:596 +#: src/tables/build/BuildLineTable.tsx:809 msgid "Auto Allocate Stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:596 +#: src/tables/build/BuildLineTable.tsx:597 msgid "Automatically allocate stock to this build according to the selected options" msgstr "" -#: src/tables/build/BuildLineTable.tsx:616 -#: src/tables/build/BuildLineTable.tsx:630 -#: src/tables/build/BuildLineTable.tsx:751 -#: src/tables/build/BuildLineTable.tsx:852 +#: src/tables/build/BuildLineTable.tsx:617 +#: src/tables/build/BuildLineTable.tsx:631 +#: src/tables/build/BuildLineTable.tsx:758 +#: src/tables/build/BuildLineTable.tsx:859 #: src/tables/build/BuildOutputTable.tsx:355 #: src/tables/build/BuildOutputTable.tsx:360 msgid "Deallocate Stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:632 +#: src/tables/build/BuildLineTable.tsx:633 msgid "Deallocate all untracked stock for this build order" msgstr "" -#: src/tables/build/BuildLineTable.tsx:634 +#: src/tables/build/BuildLineTable.tsx:635 msgid "Deallocate stock from the selected line item" msgstr "" -#: src/tables/build/BuildLineTable.tsx:638 +#: src/tables/build/BuildLineTable.tsx:639 msgid "Stock has been deallocated" msgstr "" -#: src/tables/build/BuildLineTable.tsx:771 +#: src/tables/build/BuildLineTable.tsx:778 msgid "Build Stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:784 +#: src/tables/build/BuildLineTable.tsx:791 #: src/tables/sales/SalesOrderLineItemTable.tsx:487 msgid "View Part" msgstr "" @@ -9739,7 +9767,7 @@ msgid "Serialize Build Output" msgstr "" #: src/tables/build/BuildOutputTable.tsx:405 -#: src/tables/part/PartTestResultTable.tsx:310 +#: src/tables/part/PartTestResultTable.tsx:318 #: src/tables/stock/StockItemTable.tsx:328 msgid "Filter by stock status" msgstr "" @@ -9964,8 +9992,8 @@ msgid "View Item" msgstr "" #: src/tables/general/ExtraLineItemTable.tsx:95 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:299 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:403 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:300 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:405 #: src/tables/sales/ReturnOrderLineItemTable.tsx:83 #: src/tables/sales/ReturnOrderLineItemTable.tsx:187 #: src/tables/sales/SalesOrderLineItemTable.tsx:252 @@ -9974,14 +10002,14 @@ msgid "Add Line Item" msgstr "Thêm hạng mục" #: src/tables/general/ExtraLineItemTable.tsx:108 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:320 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:322 #: src/tables/sales/ReturnOrderLineItemTable.tsx:96 #: src/tables/sales/SalesOrderLineItemTable.tsx:271 msgid "Edit Line Item" msgstr "Sửa hạng mục" #: src/tables/general/ExtraLineItemTable.tsx:117 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:329 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:331 #: src/tables/sales/ReturnOrderLineItemTable.tsx:105 #: src/tables/sales/SalesOrderLineItemTable.tsx:280 msgid "Delete Line Item" @@ -10273,7 +10301,7 @@ msgid "Required Stock" msgstr "" #: src/tables/part/PartBuildAllocationsTable.tsx:124 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:381 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:383 msgid "View Build Order" msgstr "" @@ -10617,8 +10645,8 @@ msgstr "" #: src/tables/part/PartTestResultTable.tsx:103 #: src/tables/part/PartTestResultTable.tsx:181 -#: src/tables/part/PartTestResultTable.tsx:320 -#: src/tables/part/PartTestResultTable.tsx:334 +#: src/tables/part/PartTestResultTable.tsx:328 +#: src/tables/part/PartTestResultTable.tsx:342 #: src/tables/stock/StockItemTestResultTable.tsx:296 #: src/tables/stock/StockItemTestResultTable.tsx:368 #: src/tables/stock/StockItemTestResultTable.tsx:429 @@ -10643,7 +10671,7 @@ msgstr "" msgid "No Result" msgstr "" -#: src/tables/part/PartTestResultTable.tsx:298 +#: src/tables/part/PartTestResultTable.tsx:306 msgid "Show build outputs currently in production" msgstr "" @@ -11073,7 +11101,7 @@ msgid "Show manufacturer parts for active manufacturers." msgstr "" #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:115 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:397 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:399 msgid "Import Line Items" msgstr "" @@ -11099,11 +11127,11 @@ msgstr "" #~ msgid "Add line item" #~ msgstr "Add line item" -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:350 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:352 msgid "Receive line item" msgstr "Nhận hạng mục" -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:414 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:416 msgid "Receive items" msgstr "Nhận hàng hóa" @@ -11201,25 +11229,25 @@ msgid "Not shipped" msgstr "" #: src/tables/sales/SalesOrderAllocationTable.tsx:211 -#: src/tables/sales/SalesOrderAllocationTable.tsx:229 +#: src/tables/sales/SalesOrderAllocationTable.tsx:235 msgid "Edit Allocation" msgstr "" #: src/tables/sales/SalesOrderAllocationTable.tsx:218 #: src/tables/sales/SalesOrderAllocationTable.tsx:241 -msgid "Delete Allocation" -msgstr "" +#~ msgid "Delete Allocation" +#~ msgstr "Delete Allocation" -#: src/tables/sales/SalesOrderAllocationTable.tsx:252 -#: src/tables/sales/SalesOrderAllocationTable.tsx:253 +#: src/tables/sales/SalesOrderAllocationTable.tsx:261 +#: src/tables/sales/SalesOrderAllocationTable.tsx:262 msgid "View Shipment" msgstr "" -#: src/tables/sales/SalesOrderAllocationTable.tsx:308 +#: src/tables/sales/SalesOrderAllocationTable.tsx:317 msgid "Assign to Shipment" msgstr "" -#: src/tables/sales/SalesOrderAllocationTable.tsx:324 +#: src/tables/sales/SalesOrderAllocationTable.tsx:333 msgid "Assign to shipment" msgstr "" diff --git a/src/frontend/src/locales/zh_Hans/messages.po b/src/frontend/src/locales/zh_Hans/messages.po index ecc5d7675f..97dd2ac898 100644 --- a/src/frontend/src/locales/zh_Hans/messages.po +++ b/src/frontend/src/locales/zh_Hans/messages.po @@ -8,7 +8,7 @@ msgstr "" "Language: zh\n" "Project-Id-Version: inventree\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2025-11-19 19:39\n" +"PO-Revision-Date: 2025-11-22 06:25\n" "Last-Translator: \n" "Language-Team: Chinese Simplified\n" "Plural-Forms: nplurals=1; plural=0;\n" @@ -56,7 +56,7 @@ msgstr "取消" #: lib/components/RowActions.tsx:136 #: src/components/nav/NavigationDrawer.tsx:190 -#: src/forms/PurchaseOrderForms.tsx:802 +#: src/forms/PurchaseOrderForms.tsx:854 #: src/forms/StockForms.tsx:796 #: src/forms/StockForms.tsx:843 #: src/forms/StockForms.tsx:889 @@ -103,9 +103,9 @@ msgstr "否" #: src/forms/BuildForms.tsx:630 #: src/forms/BuildForms.tsx:793 #: src/forms/BuildForms.tsx:896 -#: src/forms/PurchaseOrderForms.tsx:798 +#: src/forms/PurchaseOrderForms.tsx:850 #: src/forms/ReturnOrderForms.tsx:242 -#: src/forms/SalesOrderForms.tsx:305 +#: src/forms/SalesOrderForms.tsx:323 #: src/forms/StockForms.tsx:360 #: src/forms/StockForms.tsx:791 #: src/forms/StockForms.tsx:838 @@ -119,6 +119,7 @@ msgstr "否" #: src/pages/build/BuildDetail.tsx:200 #: src/pages/part/PartDetail.tsx:1207 #: src/tables/ColumnRenderers.tsx:91 +#: src/tables/part/PartTestResultTable.tsx:247 #: src/tables/part/RelatedPartTable.tsx:53 #: src/tables/stock/StockTrackingTable.tsx:87 msgid "Part" @@ -158,7 +159,7 @@ msgstr "零件测试模板" #: src/components/wizards/OrderPartsWizard.tsx:290 #: src/pages/company/SupplierPartDetail.tsx:413 #: src/pages/stock/StockDetail.tsx:289 -#: src/tables/build/BuildAllocatedStockTable.tsx:155 +#: src/tables/build/BuildAllocatedStockTable.tsx:152 #: src/tables/part/PartPurchaseOrdersTable.tsx:50 #: src/tables/purchasing/SupplierPartTable.tsx:83 #: src/tables/stock/StockItemTable.tsx:247 @@ -201,9 +202,9 @@ msgstr "零件类别" #: src/forms/BuildForms.tsx:473 #: src/forms/BuildForms.tsx:633 #: src/forms/BuildForms.tsx:794 -#: src/forms/SalesOrderForms.tsx:307 +#: src/forms/SalesOrderForms.tsx:325 #: src/pages/stock/StockDetail.tsx:1005 -#: src/tables/part/PartTestResultTable.tsx:248 +#: src/tables/part/PartTestResultTable.tsx:256 #: src/tables/stock/StockTrackingTable.tsx:48 #: src/tables/stock/StockTrackingTable.tsx:55 msgid "Stock Item" @@ -517,7 +518,7 @@ msgstr "选择列表" #: src/components/dashboard/DashboardLayout.tsx:281 #: src/components/editors/NotesEditor.tsx:74 #: src/components/editors/TemplateEditor/TemplateEditor.tsx:158 -#: src/components/forms/fields/ApiFormField.tsx:273 +#: src/components/forms/fields/ApiFormField.tsx:237 #: src/components/forms/fields/TableField.tsx:45 #: src/components/importer/ImportDataSelector.tsx:192 #: src/components/importer/ImporterColumnSelector.tsx:234 @@ -642,8 +643,8 @@ msgstr "输入条形码数据" #: src/components/barcodes/BarcodeScanDialog.tsx:49 #: src/components/buttons/ScanButton.tsx:15 #: src/components/nav/NavigationDrawer.tsx:122 -#: src/forms/PurchaseOrderForms.tsx:457 -#: src/forms/PurchaseOrderForms.tsx:563 +#: src/forms/PurchaseOrderForms.tsx:509 +#: src/forms/PurchaseOrderForms.tsx:615 msgid "Scan Barcode" msgstr "扫描条形码" @@ -728,7 +729,7 @@ msgstr "这将删除关联条形码的链接" #: src/components/barcodes/QRCode.tsx:205 #: src/components/items/ActionDropdown.tsx:192 -#: src/forms/PurchaseOrderForms.tsx:554 +#: src/forms/PurchaseOrderForms.tsx:606 msgid "Unlink Barcode" msgstr "解绑条形码" @@ -1216,6 +1217,12 @@ msgstr "删除与此项关联的图片?" #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:884 #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:903 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:254 +#: src/tables/build/BuildAllocatedStockTable.tsx:178 +#: src/tables/build/BuildAllocatedStockTable.tsx:258 +#: src/tables/build/BuildLineTable.tsx:111 +#: src/tables/build/BuildLineTable.tsx:665 +#: src/tables/sales/SalesOrderAllocationTable.tsx:224 +#: src/tables/sales/SalesOrderAllocationTable.tsx:247 msgid "Remove" msgstr "移除" @@ -1241,7 +1248,7 @@ msgid "Upload Error" msgstr "上传错误" #: src/components/details/DetailsImage.tsx:250 -#: src/components/forms/fields/TextField.tsx:65 +#: src/components/forms/fields/AutoFillRightSection.tsx:34 msgid "Clear" msgstr "清除" @@ -1817,10 +1824,14 @@ msgstr "已停止" msgid "Running" msgstr "运行中" -#: src/components/forms/fields/ApiFormField.tsx:233 +#: src/components/forms/fields/ApiFormField.tsx:197 msgid "Select file to upload" msgstr "选择要上传的文件" +#: src/components/forms/fields/AutoFillRightSection.tsx:47 +msgid "Accept suggested value" +msgstr "" + #: src/components/forms/fields/DateField.tsx:76 msgid "Select date" msgstr "选择日期" @@ -1875,10 +1886,6 @@ msgstr "无可用条目" msgid "Add new row" msgstr "添加新行" -#: src/components/forms/fields/TextField.tsx:82 -msgid "Accept suggested value" -msgstr "" - #: src/components/images/DetailsImage.tsx:252 #~ msgid "Select image" #~ msgstr "Select image" @@ -2225,8 +2232,8 @@ msgstr "没有项目" #: src/pages/part/PartDetail.tsx:994 #: src/pages/stock/StockDetail.tsx:265 #: src/pages/stock/StockDetail.tsx:942 -#: src/tables/build/BuildAllocatedStockTable.tsx:135 -#: src/tables/build/BuildLineTable.tsx:192 +#: src/tables/build/BuildAllocatedStockTable.tsx:132 +#: src/tables/build/BuildLineTable.tsx:193 #: src/tables/part/PartTable.tsx:137 #: src/tables/stock/StockItemTable.tsx:182 #: src/tables/stock/StockItemTable.tsx:343 @@ -2784,7 +2791,7 @@ msgstr "插件信息" #: src/pages/sales/SalesOrderDetail.tsx:119 #: src/pages/stock/LocationDetail.tsx:102 #: src/tables/ColumnRenderers.tsx:278 -#: src/tables/build/BuildAllocatedStockTable.tsx:91 +#: src/tables/build/BuildAllocatedStockTable.tsx:88 #: src/tables/machine/MachineTypeTable.tsx:161 #: src/tables/machine/MachineTypeTable.tsx:257 #: src/tables/plugin/PluginListTable.tsx:110 @@ -2966,7 +2973,7 @@ msgstr "无库存" #: src/pages/company/SupplierPartDetail.tsx:394 #: src/pages/part/PartDetail.tsx:1015 #: src/tables/bom/BomTable.tsx:444 -#: src/tables/build/BuildLineTable.tsx:222 +#: src/tables/build/BuildLineTable.tsx:223 #: src/tables/part/PartTable.tsx:108 msgid "On Order" msgstr "订购中" @@ -2976,7 +2983,7 @@ msgstr "订购中" #: src/pages/part/PartDetail.tsx:587 #: src/pages/part/PartDetail.tsx:1021 #: src/pages/stock/StockDetail.tsx:925 -#: src/tables/part/PartTestResultTable.tsx:297 +#: src/tables/part/PartTestResultTable.tsx:305 #: src/tables/stock/StockItemTable.tsx:359 msgid "In Production" msgstr "生产中" @@ -3000,7 +3007,7 @@ msgstr "类别" #: src/components/render/Stock.tsx:114 #: src/components/render/Stock.tsx:132 #: src/forms/BuildForms.tsx:795 -#: src/forms/PurchaseOrderForms.tsx:595 +#: src/forms/PurchaseOrderForms.tsx:647 #: src/forms/StockForms.tsx:792 #: src/forms/StockForms.tsx:839 #: src/forms/StockForms.tsx:885 @@ -3023,7 +3030,7 @@ msgstr "位置" #: src/components/render/Stock.tsx:99 #: src/pages/stock/StockDetail.tsx:198 #: src/pages/stock/StockDetail.tsx:930 -#: src/tables/build/BuildAllocatedStockTable.tsx:121 +#: src/tables/build/BuildAllocatedStockTable.tsx:118 #: src/tables/build/BuildOutputTable.tsx:107 #: src/tables/sales/SalesOrderAllocationTable.tsx:142 msgid "Serial Number" @@ -3034,9 +3041,9 @@ msgstr "序列号" #: src/forms/BuildForms.tsx:240 #: src/forms/BuildForms.tsx:634 #: src/forms/BuildForms.tsx:797 -#: src/forms/PurchaseOrderForms.tsx:801 +#: src/forms/PurchaseOrderForms.tsx:853 #: src/forms/ReturnOrderForms.tsx:243 -#: src/forms/SalesOrderForms.tsx:308 +#: src/forms/SalesOrderForms.tsx:326 #: src/forms/StockForms.tsx:841 #: src/pages/part/PartStockHistoryDetail.tsx:56 #: src/pages/part/PartStockHistoryDetail.tsx:210 @@ -3046,9 +3053,9 @@ msgstr "序列号" #: src/pages/part/pricing/PriceBreakPanel.tsx:172 #: src/pages/stock/StockDetail.tsx:258 #: src/pages/stock/StockDetail.tsx:936 -#: src/tables/build/BuildLineTable.tsx:86 +#: src/tables/build/BuildLineTable.tsx:83 #: src/tables/part/PartPurchaseOrdersTable.tsx:94 -#: src/tables/part/PartTestResultTable.tsx:269 +#: src/tables/part/PartTestResultTable.tsx:277 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:175 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:206 #: src/tables/purchasing/SupplierPriceBreakTable.tsx:69 @@ -3070,7 +3077,7 @@ msgstr "数量" #: src/forms/StockForms.tsx:1048 #: src/forms/StockForms.tsx:1096 #: src/forms/StockForms.tsx:1140 -#: src/tables/build/BuildLineTable.tsx:96 +#: src/tables/build/BuildLineTable.tsx:93 msgid "Batch" msgstr "批次" @@ -3755,7 +3762,7 @@ msgid "In Stock" msgstr "入库" #: src/components/wizards/OrderPartsWizard.tsx:146 -#: src/tables/build/BuildLineTable.tsx:404 +#: src/tables/build/BuildLineTable.tsx:405 msgid "Required Quantity" msgstr "所需数量" @@ -3847,7 +3854,7 @@ msgid "Please correct the errors in the selected parts" msgstr "请修正所选零件中的错误" #: src/components/wizards/OrderPartsWizard.tsx:587 -#: src/tables/build/BuildLineTable.tsx:815 +#: src/tables/build/BuildLineTable.tsx:822 #: src/tables/part/PartTable.tsx:522 #: src/tables/sales/SalesOrderLineItemTable.tsx:370 msgid "Order Parts" @@ -4349,9 +4356,9 @@ msgstr "替代项已添加" #: src/forms/BuildForms.tsx:333 #: src/forms/BuildForms.tsx:408 #: src/forms/BuildForms.tsx:685 -#: src/tables/build/BuildAllocatedStockTable.tsx:150 +#: src/tables/build/BuildAllocatedStockTable.tsx:147 #: src/tables/build/BuildOutputTable.tsx:582 -#: src/tables/part/PartTestResultTable.tsx:272 +#: src/tables/part/PartTestResultTable.tsx:280 msgid "Build Output" msgstr "生产产出" @@ -4362,7 +4369,7 @@ msgstr "待完成数量" #: src/forms/BuildForms.tsx:336 #: src/forms/BuildForms.tsx:411 #: src/forms/BuildForms.tsx:475 -#: src/forms/PurchaseOrderForms.tsx:717 +#: src/forms/PurchaseOrderForms.tsx:769 #: src/forms/ReturnOrderForms.tsx:197 #: src/forms/ReturnOrderForms.tsx:244 #: src/forms/StockForms.tsx:712 @@ -4377,7 +4384,7 @@ msgstr "待完成数量" #: src/tables/build/BuildOutputTable.tsx:404 #: src/tables/machine/MachineListTable.tsx:387 #: src/tables/part/PartPurchaseOrdersTable.tsx:38 -#: src/tables/part/PartTestResultTable.tsx:309 +#: src/tables/part/PartTestResultTable.tsx:317 #: src/tables/sales/ReturnOrderLineItemTable.tsx:138 #: src/tables/sales/ReturnOrderLineItemTable.tsx:176 #: src/tables/settings/CustomStateTable.tsx:79 @@ -4450,8 +4457,8 @@ msgstr "生产已完成" #: src/pages/stock/StockDetail.tsx:153 #: src/tables/bom/BomTable.tsx:134 #: src/tables/bom/UsedInTable.tsx:40 -#: src/tables/build/BuildAllocatedStockTable.tsx:108 -#: src/tables/build/BuildLineTable.tsx:336 +#: src/tables/build/BuildAllocatedStockTable.tsx:105 +#: src/tables/build/BuildLineTable.tsx:337 #: src/tables/build/BuildOrderTable.tsx:79 #: src/tables/part/PartSalesAllocationsTable.tsx:61 #: src/tables/part/RelatedPartTable.tsx:73 @@ -4466,47 +4473,47 @@ msgstr "内部零件编码 IPN" #: src/forms/BuildForms.tsx:632 #: src/forms/BuildForms.tsx:796 #: src/forms/BuildForms.tsx:897 -#: src/forms/SalesOrderForms.tsx:306 -#: src/tables/build/BuildAllocatedStockTable.tsx:139 -#: src/tables/build/BuildLineTable.tsx:182 +#: src/forms/SalesOrderForms.tsx:324 +#: src/tables/build/BuildAllocatedStockTable.tsx:136 +#: src/tables/build/BuildLineTable.tsx:183 #: src/tables/sales/SalesOrderLineItemTable.tsx:342 #: src/tables/stock/StockItemTable.tsx:338 msgid "Allocated" msgstr "已分配" #: src/forms/BuildForms.tsx:667 -#: src/forms/SalesOrderForms.tsx:295 +#: src/forms/SalesOrderForms.tsx:313 #: src/pages/build/BuildDetail.tsx:108 #: src/pages/build/BuildDetail.tsx:326 msgid "Source Location" msgstr "来源地点" #: src/forms/BuildForms.tsx:668 -#: src/forms/SalesOrderForms.tsx:296 +#: src/forms/SalesOrderForms.tsx:314 msgid "Select the source location for the stock allocation" msgstr "选择分配库存的源位置" #: src/forms/BuildForms.tsx:700 -#: src/forms/SalesOrderForms.tsx:336 -#: src/tables/build/BuildLineTable.tsx:574 -#: src/tables/build/BuildLineTable.tsx:731 -#: src/tables/build/BuildLineTable.tsx:830 +#: src/forms/SalesOrderForms.tsx:354 +#: src/tables/build/BuildLineTable.tsx:575 +#: src/tables/build/BuildLineTable.tsx:738 +#: src/tables/build/BuildLineTable.tsx:837 #: src/tables/sales/SalesOrderLineItemTable.tsx:380 #: src/tables/sales/SalesOrderLineItemTable.tsx:406 msgid "Allocate Stock" msgstr "分配库存" #: src/forms/BuildForms.tsx:703 -#: src/forms/SalesOrderForms.tsx:341 +#: src/forms/SalesOrderForms.tsx:359 msgid "Stock items allocated" msgstr "分配的库存项目" #: src/forms/BuildForms.tsx:816 #: src/forms/BuildForms.tsx:917 -#: src/tables/build/BuildAllocatedStockTable.tsx:240 -#: src/tables/build/BuildAllocatedStockTable.tsx:272 -#: src/tables/build/BuildLineTable.tsx:741 -#: src/tables/build/BuildLineTable.tsx:864 +#: src/tables/build/BuildAllocatedStockTable.tsx:243 +#: src/tables/build/BuildAllocatedStockTable.tsx:279 +#: src/tables/build/BuildLineTable.tsx:748 +#: src/tables/build/BuildLineTable.tsx:871 msgid "Consume Stock" msgstr "消耗库存" @@ -4521,21 +4528,21 @@ msgstr "" #~ msgstr "Stock items consumed" #: src/forms/BuildForms.tsx:853 -#: src/tables/build/BuildLineTable.tsx:514 +#: src/tables/build/BuildLineTable.tsx:515 #: src/tables/part/PartBuildAllocationsTable.tsx:101 msgid "Fully consumed" msgstr "已全部消耗" #: src/forms/BuildForms.tsx:898 -#: src/tables/build/BuildLineTable.tsx:187 +#: src/tables/build/BuildLineTable.tsx:188 #: src/tables/stock/StockItemTable.tsx:367 msgid "Consumed" msgstr "已消耗" #: src/forms/CommonForms.tsx:88 -#: src/forms/PurchaseOrderForms.tsx:125 +#: src/forms/PurchaseOrderForms.tsx:176 #: src/forms/ReturnOrderForms.tsx:138 -#: src/forms/SalesOrderForms.tsx:164 +#: src/forms/SalesOrderForms.tsx:182 msgid "Select project code for this line item" msgstr "" @@ -4572,127 +4579,127 @@ msgstr "上级零件类别" msgid "Subscribe to notifications for this category" msgstr "订阅此类别的通知" -#: src/forms/PurchaseOrderForms.tsx:388 -msgid "Assign Batch Code and Serial Numbers" -msgstr "分配批次代码和序列号" - -#: src/forms/PurchaseOrderForms.tsx:390 -msgid "Assign Batch Code" -msgstr "分配批号" - -#: src/forms/PurchaseOrderForms.tsx:410 -msgid "Choose Location" -msgstr "选择位置" - -#: src/forms/PurchaseOrderForms.tsx:418 -msgid "Item Destination selected" -msgstr "已选择项目目的地" - #: src/forms/PurchaseOrderForms.tsx:421 #~ msgid "Assign Batch Code{0}" #~ msgstr "Assign Batch Code{0}" -#: src/forms/PurchaseOrderForms.tsx:428 -msgid "Part category default location selected" -msgstr "已选择零件类别默认位置" +#: src/forms/PurchaseOrderForms.tsx:440 +msgid "Assign Batch Code and Serial Numbers" +msgstr "分配批次代码和序列号" -#: src/forms/PurchaseOrderForms.tsx:438 -msgid "Received stock location selected" -msgstr "已选择接收库存位置" +#: src/forms/PurchaseOrderForms.tsx:442 +msgid "Assign Batch Code" +msgstr "分配批号" #: src/forms/PurchaseOrderForms.tsx:444 #: src/forms/StockForms.tsx:428 #~ msgid "Remove item from list" #~ msgstr "Remove item from list" -#: src/forms/PurchaseOrderForms.tsx:446 +#: src/forms/PurchaseOrderForms.tsx:462 +msgid "Choose Location" +msgstr "选择位置" + +#: src/forms/PurchaseOrderForms.tsx:470 +msgid "Item Destination selected" +msgstr "已选择项目目的地" + +#: src/forms/PurchaseOrderForms.tsx:480 +msgid "Part category default location selected" +msgstr "已选择零件类别默认位置" + +#: src/forms/PurchaseOrderForms.tsx:490 +msgid "Received stock location selected" +msgstr "已选择接收库存位置" + +#: src/forms/PurchaseOrderForms.tsx:498 msgid "Default location selected" msgstr "已选择默认位置" -#: src/forms/PurchaseOrderForms.tsx:507 +#: src/forms/PurchaseOrderForms.tsx:559 msgid "Set Location" msgstr "设置位置" -#: src/forms/PurchaseOrderForms.tsx:524 -msgid "Set Expiry Date" -msgstr "设置到期日期" - -#: src/forms/PurchaseOrderForms.tsx:532 -#: src/forms/StockForms.tsx:693 -msgid "Adjust Packaging" -msgstr "调整封包" - -#: src/forms/PurchaseOrderForms.tsx:540 -#: src/forms/StockForms.tsx:684 -#: src/hooks/UseStockAdjustActions.tsx:148 -msgid "Change Status" -msgstr "更改状态" - -#: src/forms/PurchaseOrderForms.tsx:546 -msgid "Add Note" -msgstr "添加备注" - #: src/forms/PurchaseOrderForms.tsx:566 #~ msgid "Serial numbers" #~ msgstr "Serial numbers" +#: src/forms/PurchaseOrderForms.tsx:576 +msgid "Set Expiry Date" +msgstr "设置到期日期" + #: src/forms/PurchaseOrderForms.tsx:582 #~ msgid "Store at line item destination" #~ msgstr "Store at line item destination" -#: src/forms/PurchaseOrderForms.tsx:610 -msgid "Store at default location" -msgstr "存储在默认位置" +#: src/forms/PurchaseOrderForms.tsx:584 +#: src/forms/StockForms.tsx:693 +msgid "Adjust Packaging" +msgstr "调整封包" -#: src/forms/PurchaseOrderForms.tsx:625 -msgid "Store at line item destination " -msgstr "存储至行项目指定位置 " +#: src/forms/PurchaseOrderForms.tsx:592 +#: src/forms/StockForms.tsx:684 +#: src/hooks/UseStockAdjustActions.tsx:148 +msgid "Change Status" +msgstr "更改状态" -#: src/forms/PurchaseOrderForms.tsx:637 -msgid "Store with already received stock" -msgstr "存储已收到的库存" +#: src/forms/PurchaseOrderForms.tsx:598 +msgid "Add Note" +msgstr "添加备注" #: src/forms/PurchaseOrderForms.tsx:658 #~ msgid "Receive line items" #~ msgstr "Receive line items" -#: src/forms/PurchaseOrderForms.tsx:661 +#: src/forms/PurchaseOrderForms.tsx:662 +msgid "Store at default location" +msgstr "存储在默认位置" + +#: src/forms/PurchaseOrderForms.tsx:677 +msgid "Store at line item destination " +msgstr "存储至行项目指定位置 " + +#: src/forms/PurchaseOrderForms.tsx:689 +msgid "Store with already received stock" +msgstr "存储已收到的库存" + +#: src/forms/PurchaseOrderForms.tsx:713 #: src/pages/build/BuildDetail.tsx:340 #: src/pages/stock/StockDetail.tsx:280 #: src/pages/stock/StockDetail.tsx:952 #: src/tables/Filter.tsx:83 -#: src/tables/build/BuildAllocatedStockTable.tsx:128 +#: src/tables/build/BuildAllocatedStockTable.tsx:125 #: src/tables/build/BuildOutputTable.tsx:112 -#: src/tables/part/PartTestResultTable.tsx:260 -#: src/tables/part/PartTestResultTable.tsx:281 +#: src/tables/part/PartTestResultTable.tsx:268 +#: src/tables/part/PartTestResultTable.tsx:289 #: src/tables/sales/SalesOrderAllocationTable.tsx:149 msgid "Batch Code" msgstr "批号" -#: src/forms/PurchaseOrderForms.tsx:662 +#: src/forms/PurchaseOrderForms.tsx:714 msgid "Enter batch code for received items" msgstr "输入接收项目的批号" -#: src/forms/PurchaseOrderForms.tsx:675 +#: src/forms/PurchaseOrderForms.tsx:727 #: src/forms/StockForms.tsx:218 msgid "Serial Numbers" msgstr "序列号" -#: src/forms/PurchaseOrderForms.tsx:676 +#: src/forms/PurchaseOrderForms.tsx:728 msgid "Enter serial numbers for received items" msgstr "输入接收项目的序列号" -#: src/forms/PurchaseOrderForms.tsx:690 +#: src/forms/PurchaseOrderForms.tsx:742 #: src/pages/stock/StockDetail.tsx:382 #: src/tables/stock/StockItemTable.tsx:294 msgid "Expiry Date" msgstr "有效期至" -#: src/forms/PurchaseOrderForms.tsx:691 +#: src/forms/PurchaseOrderForms.tsx:743 msgid "Enter an expiry date for received items" msgstr "输入接收项目的到期日期" -#: src/forms/PurchaseOrderForms.tsx:703 +#: src/forms/PurchaseOrderForms.tsx:755 #: src/forms/StockForms.tsx:728 #: src/pages/company/SupplierPartDetail.tsx:172 #: src/pages/company/SupplierPartDetail.tsx:236 @@ -4701,19 +4708,19 @@ msgstr "输入接收项目的到期日期" msgid "Packaging" msgstr "包装" -#: src/forms/PurchaseOrderForms.tsx:727 +#: src/forms/PurchaseOrderForms.tsx:779 #: src/pages/company/SupplierPartDetail.tsx:120 #: src/tables/ColumnRenderers.tsx:332 msgid "Note" msgstr "备注" -#: src/forms/PurchaseOrderForms.tsx:799 +#: src/forms/PurchaseOrderForms.tsx:851 #: src/pages/company/SupplierPartDetail.tsx:138 #: src/tables/purchasing/SupplierPriceBreakTable.tsx:49 msgid "SKU" msgstr "库存单位 (SKU)" -#: src/forms/PurchaseOrderForms.tsx:800 +#: src/forms/PurchaseOrderForms.tsx:852 #: src/tables/part/PartPurchaseOrdersTable.tsx:127 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:213 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:283 @@ -4721,11 +4728,11 @@ msgstr "库存单位 (SKU)" msgid "Received" msgstr "已接收" -#: src/forms/PurchaseOrderForms.tsx:817 +#: src/forms/PurchaseOrderForms.tsx:869 msgid "Receive Line Items" msgstr "接收行项目" -#: src/forms/PurchaseOrderForms.tsx:823 +#: src/forms/PurchaseOrderForms.tsx:875 msgid "Items received" msgstr "物料已收货" @@ -4737,7 +4744,7 @@ msgstr "接收物品" msgid "Item received into stock" msgstr "已收到库存物品" -#: src/forms/SalesOrderForms.tsx:401 +#: src/forms/SalesOrderForms.tsx:419 msgid "Leave blank to use the order address" msgstr "" @@ -5932,6 +5939,9 @@ msgstr "" #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:310 #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:401 +#: src/tables/build/BuildAllocatedStockTable.tsx:181 +#: src/tables/build/BuildLineTable.tsx:668 +#: src/tables/sales/SalesOrderAllocationTable.tsx:220 msgid "Confirm Removal" msgstr "" @@ -6870,8 +6880,8 @@ msgstr "外部" #: src/pages/sales/ReturnOrderDetail.tsx:108 #: src/pages/sales/SalesOrderDetail.tsx:98 #: src/tables/ColumnRenderers.tsx:321 -#: src/tables/build/BuildAllocatedStockTable.tsx:115 -#: src/tables/build/BuildLineTable.tsx:352 +#: src/tables/build/BuildAllocatedStockTable.tsx:112 +#: src/tables/build/BuildLineTable.tsx:353 msgid "Reference" msgstr "参考" @@ -7132,7 +7142,7 @@ msgstr "取消订单" #: src/pages/build/BuildDetail.tsx:742 #: src/pages/stock/StockDetail.tsx:344 -#: src/tables/build/BuildAllocatedStockTable.tsx:85 +#: src/tables/build/BuildAllocatedStockTable.tsx:82 #: src/tables/part/PartBuildAllocationsTable.tsx:45 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:157 #: src/tables/stock/StockTrackingTable.tsx:109 @@ -7600,7 +7610,7 @@ msgstr "关键词" #: src/pages/part/PartDetail.tsx:542 #: src/tables/bom/BomTable.tsx:439 -#: src/tables/build/BuildLineTable.tsx:305 +#: src/tables/build/BuildLineTable.tsx:306 #: src/tables/part/PartTable.tsx:319 #: src/tables/sales/SalesOrderLineItemTable.tsx:138 msgid "Available Stock" @@ -7608,7 +7618,7 @@ msgstr "可用库存" #: src/pages/part/PartDetail.tsx:548 #: src/tables/bom/BomTable.tsx:341 -#: src/tables/build/BuildLineTable.tsx:267 +#: src/tables/build/BuildLineTable.tsx:268 #: src/tables/sales/SalesOrderLineItemTable.tsx:180 msgid "On order" msgstr "订购中" @@ -7782,7 +7792,7 @@ msgstr "订单" #: src/pages/part/PartDetail.tsx:1144 #: src/pages/stock/StockDetail.tsx:884 -#: src/tables/build/BuildLineTable.tsx:761 +#: src/tables/build/BuildLineTable.tsx:768 msgid "Order Stock" msgstr "订单库存" @@ -9219,13 +9229,13 @@ msgstr "虚拟零件" #~ msgstr "Show asssmbled items" #: src/tables/bom/BomTable.tsx:315 -#: src/tables/build/BuildLineTable.tsx:276 +#: src/tables/build/BuildLineTable.tsx:277 #: src/tables/part/PartTable.tsx:145 msgid "External stock" msgstr "外部库存" #: src/tables/bom/BomTable.tsx:323 -#: src/tables/build/BuildLineTable.tsx:239 +#: src/tables/build/BuildLineTable.tsx:240 msgid "Includes substitute stock" msgstr "包括替代库存" @@ -9234,7 +9244,7 @@ msgstr "包括替代库存" #~ msgstr "Edit Bom Item" #: src/tables/bom/BomTable.tsx:332 -#: src/tables/build/BuildLineTable.tsx:249 +#: src/tables/build/BuildLineTable.tsx:250 #: src/tables/sales/SalesOrderLineItemTable.tsx:166 msgid "Includes variant stock" msgstr "包括变体库存" @@ -9272,8 +9282,8 @@ msgid "Stock Information" msgstr "库存信息" #: src/tables/bom/BomTable.tsx:399 -#: src/tables/build/BuildLineTable.tsx:496 -#: src/tables/build/BuildLineTable.tsx:537 +#: src/tables/build/BuildLineTable.tsx:497 +#: src/tables/build/BuildLineTable.tsx:538 msgid "Consumable item" msgstr "可耗物品" @@ -9282,7 +9292,7 @@ msgid "No available stock" msgstr "无可用库存" #: src/tables/bom/BomTable.tsx:420 -#: src/tables/build/BuildLineTable.tsx:213 +#: src/tables/build/BuildLineTable.tsx:214 msgid "Show testable items" msgstr "显示可跟踪项目" @@ -9291,7 +9301,7 @@ msgid "Show trackable items" msgstr "显示可跟踪项目" #: src/tables/bom/BomTable.tsx:430 -#: src/tables/build/BuildLineTable.tsx:208 +#: src/tables/build/BuildLineTable.tsx:209 msgid "Show assembled items" msgstr "显示已装配的项目" @@ -9335,7 +9345,7 @@ msgstr "显示允许变体替换的项目" #: src/tables/bom/BomTable.tsx:464 #: src/tables/bom/UsedInTable.tsx:85 -#: src/tables/build/BuildLineTable.tsx:202 +#: src/tables/build/BuildLineTable.tsx:203 msgid "Optional" msgstr "可选项" @@ -9345,7 +9355,7 @@ msgid "Show optional items" msgstr "显示可选项目" #: src/tables/bom/BomTable.tsx:469 -#: src/tables/build/BuildLineTable.tsx:197 +#: src/tables/build/BuildLineTable.tsx:198 msgid "Consumable" msgstr "消耗品" @@ -9433,7 +9443,7 @@ msgid "Bill of materials cannot be edited, as the part is locked" msgstr "无法编辑材料清单,因为零件已锁定" #: src/tables/bom/UsedInTable.tsx:34 -#: src/tables/build/BuildLineTable.tsx:207 +#: src/tables/build/BuildLineTable.tsx:208 #: src/tables/part/ParametricPartTable.tsx:364 #: src/tables/part/PartBuildAllocationsTable.tsx:60 #: src/tables/part/PartTable.tsx:209 @@ -9455,11 +9465,11 @@ msgstr "可追踪" msgid "Show trackable assemblies" msgstr "显示可跟踪装配体" -#: src/tables/build/BuildAllocatedStockTable.tsx:67 +#: src/tables/build/BuildAllocatedStockTable.tsx:64 msgid "Allocated to Output" msgstr "分配至输出" -#: src/tables/build/BuildAllocatedStockTable.tsx:68 +#: src/tables/build/BuildAllocatedStockTable.tsx:65 msgid "Show items allocated to a build output" msgstr "显示分配给构建输出的项目" @@ -9472,7 +9482,7 @@ msgstr "显示分配给构建输出的项目" #~ msgid "Include orders for part variants" #~ msgstr "Include orders for part variants" -#: src/tables/build/BuildAllocatedStockTable.tsx:97 +#: src/tables/build/BuildAllocatedStockTable.tsx:94 #: src/tables/part/PartBuildAllocationsTable.tsx:84 #: src/tables/part/PartPurchaseOrdersTable.tsx:132 #: src/tables/part/PartSalesAllocationsTable.tsx:69 @@ -9482,40 +9492,58 @@ msgid "Order Status" msgstr "订单状态" #: src/tables/build/BuildAllocatedStockTable.tsx:164 -#~ msgid "Edit Build Item" -#~ msgstr "Edit Build Item" - -#: src/tables/build/BuildAllocatedStockTable.tsx:167 -#: src/tables/build/BuildLineTable.tsx:650 +#: src/tables/build/BuildLineTable.tsx:651 msgid "Edit Stock Allocation" msgstr "编辑库存分配" +#: src/tables/build/BuildAllocatedStockTable.tsx:164 +#~ msgid "Edit Build Item" +#~ msgstr "Edit Build Item" + #: src/tables/build/BuildAllocatedStockTable.tsx:174 #~ msgid "Delete Build Item" #~ msgstr "Delete Build Item" +#: src/tables/build/BuildAllocatedStockTable.tsx:177 +#: src/tables/build/BuildLineTable.tsx:664 +#: src/tables/sales/SalesOrderAllocationTable.tsx:218 +msgid "Remove Allocated Stock" +msgstr "" + #: src/tables/build/BuildAllocatedStockTable.tsx:180 #: src/tables/build/BuildLineTable.tsx:663 -msgid "Delete Stock Allocation" -msgstr "删除库存分配" +#~ msgid "Delete Stock Allocation" +#~ msgstr "Delete Stock Allocation" -#: src/tables/build/BuildAllocatedStockTable.tsx:239 +#: src/tables/build/BuildAllocatedStockTable.tsx:182 +#: src/tables/build/BuildLineTable.tsx:669 +#: src/tables/sales/SalesOrderAllocationTable.tsx:221 +msgid "Are you sure you want to remove this allocated stock from the order?" +msgstr "" + +#: src/tables/build/BuildAllocatedStockTable.tsx:242 msgid "Consume" msgstr "库存消耗" +#: src/tables/build/BuildAllocatedStockTable.tsx:259 +#: src/tables/build/BuildLineTable.tsx:112 +#: src/tables/sales/SalesOrderAllocationTable.tsx:248 +msgid "Remove allocated stock" +msgstr "" + #: src/tables/build/BuildLineTable.tsx:59 #~ msgid "Show lines with available stock" #~ msgstr "Show lines with available stock" -#: src/tables/build/BuildLineTable.tsx:120 +#: src/tables/build/BuildLineTable.tsx:121 msgid "View Stock Item" msgstr "查看库存物料详情" -#: src/tables/build/BuildLineTable.tsx:183 +#: src/tables/build/BuildLineTable.tsx:184 msgid "Show fully allocated lines" msgstr "显示已完全分配的行" -#: src/tables/build/BuildLineTable.tsx:188 +#: src/tables/build/BuildLineTable.tsx:189 msgid "Show fully consumed lines" msgstr "显示已完全消耗的行" @@ -9523,124 +9551,124 @@ msgstr "显示已完全消耗的行" #~ msgid "Show allocated lines" #~ msgstr "Show allocated lines" -#: src/tables/build/BuildLineTable.tsx:193 +#: src/tables/build/BuildLineTable.tsx:194 msgid "Show items with sufficient available stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:198 +#: src/tables/build/BuildLineTable.tsx:199 msgid "Show consumable lines" msgstr "显示可消耗项目" -#: src/tables/build/BuildLineTable.tsx:203 +#: src/tables/build/BuildLineTable.tsx:204 msgid "Show optional lines" msgstr "显示可选项目" -#: src/tables/build/BuildLineTable.tsx:212 +#: src/tables/build/BuildLineTable.tsx:213 #: src/tables/part/PartTable.tsx:233 msgid "Testable" msgstr "可测试" -#: src/tables/build/BuildLineTable.tsx:217 +#: src/tables/build/BuildLineTable.tsx:218 #: src/tables/stock/StockItemTable.tsx:388 msgid "Tracked" msgstr "已跟踪" -#: src/tables/build/BuildLineTable.tsx:218 +#: src/tables/build/BuildLineTable.tsx:219 msgid "Show tracked lines" msgstr "显示已跟踪项目" -#: src/tables/build/BuildLineTable.tsx:223 +#: src/tables/build/BuildLineTable.tsx:224 msgid "Show items with stock on order" msgstr "" -#: src/tables/build/BuildLineTable.tsx:258 +#: src/tables/build/BuildLineTable.tsx:259 #: src/tables/sales/SalesOrderLineItemTable.tsx:172 msgid "In production" msgstr "生产中" -#: src/tables/build/BuildLineTable.tsx:286 +#: src/tables/build/BuildLineTable.tsx:287 msgid "Insufficient stock" msgstr "库存不足" -#: src/tables/build/BuildLineTable.tsx:302 +#: src/tables/build/BuildLineTable.tsx:303 #: src/tables/sales/SalesOrderLineItemTable.tsx:160 #: src/tables/stock/StockItemTable.tsx:191 msgid "No stock available" msgstr "无可用库存" -#: src/tables/build/BuildLineTable.tsx:375 +#: src/tables/build/BuildLineTable.tsx:376 msgid "Gets Inherited" msgstr "获取已继承的" -#: src/tables/build/BuildLineTable.tsx:388 +#: src/tables/build/BuildLineTable.tsx:389 msgid "Unit Quantity" msgstr "单位数量" -#: src/tables/build/BuildLineTable.tsx:415 +#: src/tables/build/BuildLineTable.tsx:416 msgid "Setup Quantity" msgstr "设置数量" -#: src/tables/build/BuildLineTable.tsx:424 +#: src/tables/build/BuildLineTable.tsx:425 msgid "Attrition" msgstr "损耗" -#: src/tables/build/BuildLineTable.tsx:432 +#: src/tables/build/BuildLineTable.tsx:433 msgid "Rounding Multiple" msgstr "取整倍数" -#: src/tables/build/BuildLineTable.tsx:441 +#: src/tables/build/BuildLineTable.tsx:442 msgid "BOM Information" msgstr "物料清单信息" -#: src/tables/build/BuildLineTable.tsx:515 +#: src/tables/build/BuildLineTable.tsx:516 #: src/tables/part/PartBuildAllocationsTable.tsx:102 msgid "Fully allocated" msgstr "完全分配" -#: src/tables/build/BuildLineTable.tsx:563 +#: src/tables/build/BuildLineTable.tsx:564 #: src/tables/sales/SalesOrderLineItemTable.tsx:311 msgid "Create Build Order" msgstr "创建生产订单" -#: src/tables/build/BuildLineTable.tsx:592 +#: src/tables/build/BuildLineTable.tsx:593 msgid "Auto allocation in progress" msgstr "自动分配进行中" -#: src/tables/build/BuildLineTable.tsx:595 -#: src/tables/build/BuildLineTable.tsx:802 +#: src/tables/build/BuildLineTable.tsx:596 +#: src/tables/build/BuildLineTable.tsx:809 msgid "Auto Allocate Stock" msgstr "自动分配库存量" -#: src/tables/build/BuildLineTable.tsx:596 +#: src/tables/build/BuildLineTable.tsx:597 msgid "Automatically allocate stock to this build according to the selected options" msgstr "根据选定的选项自动分配库存到此版本" -#: src/tables/build/BuildLineTable.tsx:616 -#: src/tables/build/BuildLineTable.tsx:630 -#: src/tables/build/BuildLineTable.tsx:751 -#: src/tables/build/BuildLineTable.tsx:852 +#: src/tables/build/BuildLineTable.tsx:617 +#: src/tables/build/BuildLineTable.tsx:631 +#: src/tables/build/BuildLineTable.tsx:758 +#: src/tables/build/BuildLineTable.tsx:859 #: src/tables/build/BuildOutputTable.tsx:355 #: src/tables/build/BuildOutputTable.tsx:360 msgid "Deallocate Stock" msgstr "取消库存分配" -#: src/tables/build/BuildLineTable.tsx:632 +#: src/tables/build/BuildLineTable.tsx:633 msgid "Deallocate all untracked stock for this build order" msgstr "为这个构建订单取消分配所有未跟踪库存" -#: src/tables/build/BuildLineTable.tsx:634 +#: src/tables/build/BuildLineTable.tsx:635 msgid "Deallocate stock from the selected line item" msgstr "从选中的行项中取消分配库存" -#: src/tables/build/BuildLineTable.tsx:638 +#: src/tables/build/BuildLineTable.tsx:639 msgid "Stock has been deallocated" msgstr "库存已经取消分配" -#: src/tables/build/BuildLineTable.tsx:771 +#: src/tables/build/BuildLineTable.tsx:778 msgid "Build Stock" msgstr "生产库存" -#: src/tables/build/BuildLineTable.tsx:784 +#: src/tables/build/BuildLineTable.tsx:791 #: src/tables/sales/SalesOrderLineItemTable.tsx:487 msgid "View Part" msgstr "查看零件" @@ -9739,7 +9767,7 @@ msgid "Serialize Build Output" msgstr "序列化生产产出" #: src/tables/build/BuildOutputTable.tsx:405 -#: src/tables/part/PartTestResultTable.tsx:310 +#: src/tables/part/PartTestResultTable.tsx:318 #: src/tables/stock/StockItemTable.tsx:328 msgid "Filter by stock status" msgstr "按库存状态筛选" @@ -9964,8 +9992,8 @@ msgid "View Item" msgstr "查看项目" #: src/tables/general/ExtraLineItemTable.tsx:95 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:299 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:403 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:300 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:405 #: src/tables/sales/ReturnOrderLineItemTable.tsx:83 #: src/tables/sales/ReturnOrderLineItemTable.tsx:187 #: src/tables/sales/SalesOrderLineItemTable.tsx:252 @@ -9974,14 +10002,14 @@ msgid "Add Line Item" msgstr "添加行项目" #: src/tables/general/ExtraLineItemTable.tsx:108 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:320 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:322 #: src/tables/sales/ReturnOrderLineItemTable.tsx:96 #: src/tables/sales/SalesOrderLineItemTable.tsx:271 msgid "Edit Line Item" msgstr "编辑行项目" #: src/tables/general/ExtraLineItemTable.tsx:117 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:329 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:331 #: src/tables/sales/ReturnOrderLineItemTable.tsx:105 #: src/tables/sales/SalesOrderLineItemTable.tsx:280 msgid "Delete Line Item" @@ -10273,7 +10301,7 @@ msgid "Required Stock" msgstr "所需库存" #: src/tables/part/PartBuildAllocationsTable.tsx:124 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:381 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:383 msgid "View Build Order" msgstr "查看生产订单" @@ -10617,8 +10645,8 @@ msgstr "" #: src/tables/part/PartTestResultTable.tsx:103 #: src/tables/part/PartTestResultTable.tsx:181 -#: src/tables/part/PartTestResultTable.tsx:320 -#: src/tables/part/PartTestResultTable.tsx:334 +#: src/tables/part/PartTestResultTable.tsx:328 +#: src/tables/part/PartTestResultTable.tsx:342 #: src/tables/stock/StockItemTestResultTable.tsx:296 #: src/tables/stock/StockItemTestResultTable.tsx:368 #: src/tables/stock/StockItemTestResultTable.tsx:429 @@ -10643,7 +10671,7 @@ msgstr "测试结果已添加" msgid "No Result" msgstr "无结果" -#: src/tables/part/PartTestResultTable.tsx:298 +#: src/tables/part/PartTestResultTable.tsx:306 msgid "Show build outputs currently in production" msgstr "显示当前生产中的构建输出" @@ -11073,7 +11101,7 @@ msgid "Show manufacturer parts for active manufacturers." msgstr "" #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:115 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:397 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:399 msgid "Import Line Items" msgstr "导入行项目" @@ -11099,11 +11127,11 @@ msgstr "显示已收到的行项目" #~ msgid "Add line item" #~ msgstr "Add line item" -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:350 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:352 msgid "Receive line item" msgstr "接收这行项目" -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:414 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:416 msgid "Receive items" msgstr "收到项目" @@ -11201,25 +11229,25 @@ msgid "Not shipped" msgstr "未发货" #: src/tables/sales/SalesOrderAllocationTable.tsx:211 -#: src/tables/sales/SalesOrderAllocationTable.tsx:229 +#: src/tables/sales/SalesOrderAllocationTable.tsx:235 msgid "Edit Allocation" msgstr "编辑分配" #: src/tables/sales/SalesOrderAllocationTable.tsx:218 #: src/tables/sales/SalesOrderAllocationTable.tsx:241 -msgid "Delete Allocation" -msgstr "删除分配" +#~ msgid "Delete Allocation" +#~ msgstr "Delete Allocation" -#: src/tables/sales/SalesOrderAllocationTable.tsx:252 -#: src/tables/sales/SalesOrderAllocationTable.tsx:253 +#: src/tables/sales/SalesOrderAllocationTable.tsx:261 +#: src/tables/sales/SalesOrderAllocationTable.tsx:262 msgid "View Shipment" msgstr "查看发货" -#: src/tables/sales/SalesOrderAllocationTable.tsx:308 +#: src/tables/sales/SalesOrderAllocationTable.tsx:317 msgid "Assign to Shipment" msgstr "安排发货" -#: src/tables/sales/SalesOrderAllocationTable.tsx:324 +#: src/tables/sales/SalesOrderAllocationTable.tsx:333 msgid "Assign to shipment" msgstr "安排发货" diff --git a/src/frontend/src/locales/zh_Hant/messages.po b/src/frontend/src/locales/zh_Hant/messages.po index 449b57fb28..db77b0d18d 100644 --- a/src/frontend/src/locales/zh_Hant/messages.po +++ b/src/frontend/src/locales/zh_Hant/messages.po @@ -8,7 +8,7 @@ msgstr "" "Language: zh\n" "Project-Id-Version: inventree\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2025-11-19 19:39\n" +"PO-Revision-Date: 2025-11-22 06:25\n" "Last-Translator: \n" "Language-Team: Chinese Traditional\n" "Plural-Forms: nplurals=1; plural=0;\n" @@ -56,7 +56,7 @@ msgstr "取消" #: lib/components/RowActions.tsx:136 #: src/components/nav/NavigationDrawer.tsx:190 -#: src/forms/PurchaseOrderForms.tsx:802 +#: src/forms/PurchaseOrderForms.tsx:854 #: src/forms/StockForms.tsx:796 #: src/forms/StockForms.tsx:843 #: src/forms/StockForms.tsx:889 @@ -103,9 +103,9 @@ msgstr "否" #: src/forms/BuildForms.tsx:630 #: src/forms/BuildForms.tsx:793 #: src/forms/BuildForms.tsx:896 -#: src/forms/PurchaseOrderForms.tsx:798 +#: src/forms/PurchaseOrderForms.tsx:850 #: src/forms/ReturnOrderForms.tsx:242 -#: src/forms/SalesOrderForms.tsx:305 +#: src/forms/SalesOrderForms.tsx:323 #: src/forms/StockForms.tsx:360 #: src/forms/StockForms.tsx:791 #: src/forms/StockForms.tsx:838 @@ -119,6 +119,7 @@ msgstr "否" #: src/pages/build/BuildDetail.tsx:200 #: src/pages/part/PartDetail.tsx:1207 #: src/tables/ColumnRenderers.tsx:91 +#: src/tables/part/PartTestResultTable.tsx:247 #: src/tables/part/RelatedPartTable.tsx:53 #: src/tables/stock/StockTrackingTable.tsx:87 msgid "Part" @@ -158,7 +159,7 @@ msgstr "零件測試模板" #: src/components/wizards/OrderPartsWizard.tsx:290 #: src/pages/company/SupplierPartDetail.tsx:413 #: src/pages/stock/StockDetail.tsx:289 -#: src/tables/build/BuildAllocatedStockTable.tsx:155 +#: src/tables/build/BuildAllocatedStockTable.tsx:152 #: src/tables/part/PartPurchaseOrdersTable.tsx:50 #: src/tables/purchasing/SupplierPartTable.tsx:83 #: src/tables/stock/StockItemTable.tsx:247 @@ -201,9 +202,9 @@ msgstr "零件類別" #: src/forms/BuildForms.tsx:473 #: src/forms/BuildForms.tsx:633 #: src/forms/BuildForms.tsx:794 -#: src/forms/SalesOrderForms.tsx:307 +#: src/forms/SalesOrderForms.tsx:325 #: src/pages/stock/StockDetail.tsx:1005 -#: src/tables/part/PartTestResultTable.tsx:248 +#: src/tables/part/PartTestResultTable.tsx:256 #: src/tables/stock/StockTrackingTable.tsx:48 #: src/tables/stock/StockTrackingTable.tsx:55 msgid "Stock Item" @@ -517,7 +518,7 @@ msgstr "選擇列表" #: src/components/dashboard/DashboardLayout.tsx:281 #: src/components/editors/NotesEditor.tsx:74 #: src/components/editors/TemplateEditor/TemplateEditor.tsx:158 -#: src/components/forms/fields/ApiFormField.tsx:273 +#: src/components/forms/fields/ApiFormField.tsx:237 #: src/components/forms/fields/TableField.tsx:45 #: src/components/importer/ImportDataSelector.tsx:192 #: src/components/importer/ImporterColumnSelector.tsx:234 @@ -642,8 +643,8 @@ msgstr "輸入條碼資料" #: src/components/barcodes/BarcodeScanDialog.tsx:49 #: src/components/buttons/ScanButton.tsx:15 #: src/components/nav/NavigationDrawer.tsx:122 -#: src/forms/PurchaseOrderForms.tsx:457 -#: src/forms/PurchaseOrderForms.tsx:563 +#: src/forms/PurchaseOrderForms.tsx:509 +#: src/forms/PurchaseOrderForms.tsx:615 msgid "Scan Barcode" msgstr "掃描條碼" @@ -728,7 +729,7 @@ msgstr "這將刪除關聯條碼的鏈接" #: src/components/barcodes/QRCode.tsx:205 #: src/components/items/ActionDropdown.tsx:192 -#: src/forms/PurchaseOrderForms.tsx:554 +#: src/forms/PurchaseOrderForms.tsx:606 msgid "Unlink Barcode" msgstr "解綁條碼" @@ -1216,6 +1217,12 @@ msgstr "刪除與此項關聯的圖片?" #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:884 #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:903 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:254 +#: src/tables/build/BuildAllocatedStockTable.tsx:178 +#: src/tables/build/BuildAllocatedStockTable.tsx:258 +#: src/tables/build/BuildLineTable.tsx:111 +#: src/tables/build/BuildLineTable.tsx:665 +#: src/tables/sales/SalesOrderAllocationTable.tsx:224 +#: src/tables/sales/SalesOrderAllocationTable.tsx:247 msgid "Remove" msgstr "移除" @@ -1241,7 +1248,7 @@ msgid "Upload Error" msgstr "上傳錯誤" #: src/components/details/DetailsImage.tsx:250 -#: src/components/forms/fields/TextField.tsx:65 +#: src/components/forms/fields/AutoFillRightSection.tsx:34 msgid "Clear" msgstr "清除" @@ -1817,10 +1824,14 @@ msgstr "已停止" msgid "Running" msgstr "" -#: src/components/forms/fields/ApiFormField.tsx:233 +#: src/components/forms/fields/ApiFormField.tsx:197 msgid "Select file to upload" msgstr "" +#: src/components/forms/fields/AutoFillRightSection.tsx:47 +msgid "Accept suggested value" +msgstr "" + #: src/components/forms/fields/DateField.tsx:76 msgid "Select date" msgstr "" @@ -1875,10 +1886,6 @@ msgstr "無可用條目" msgid "Add new row" msgstr "" -#: src/components/forms/fields/TextField.tsx:82 -msgid "Accept suggested value" -msgstr "" - #: src/components/images/DetailsImage.tsx:252 #~ msgid "Select image" #~ msgstr "Select image" @@ -2225,8 +2232,8 @@ msgstr "" #: src/pages/part/PartDetail.tsx:994 #: src/pages/stock/StockDetail.tsx:265 #: src/pages/stock/StockDetail.tsx:942 -#: src/tables/build/BuildAllocatedStockTable.tsx:135 -#: src/tables/build/BuildLineTable.tsx:192 +#: src/tables/build/BuildAllocatedStockTable.tsx:132 +#: src/tables/build/BuildLineTable.tsx:193 #: src/tables/part/PartTable.tsx:137 #: src/tables/stock/StockItemTable.tsx:182 #: src/tables/stock/StockItemTable.tsx:343 @@ -2784,7 +2791,7 @@ msgstr "" #: src/pages/sales/SalesOrderDetail.tsx:119 #: src/pages/stock/LocationDetail.tsx:102 #: src/tables/ColumnRenderers.tsx:278 -#: src/tables/build/BuildAllocatedStockTable.tsx:91 +#: src/tables/build/BuildAllocatedStockTable.tsx:88 #: src/tables/machine/MachineTypeTable.tsx:161 #: src/tables/machine/MachineTypeTable.tsx:257 #: src/tables/plugin/PluginListTable.tsx:110 @@ -2966,7 +2973,7 @@ msgstr "無庫存" #: src/pages/company/SupplierPartDetail.tsx:394 #: src/pages/part/PartDetail.tsx:1015 #: src/tables/bom/BomTable.tsx:444 -#: src/tables/build/BuildLineTable.tsx:222 +#: src/tables/build/BuildLineTable.tsx:223 #: src/tables/part/PartTable.tsx:108 msgid "On Order" msgstr "訂購中" @@ -2976,7 +2983,7 @@ msgstr "訂購中" #: src/pages/part/PartDetail.tsx:587 #: src/pages/part/PartDetail.tsx:1021 #: src/pages/stock/StockDetail.tsx:925 -#: src/tables/part/PartTestResultTable.tsx:297 +#: src/tables/part/PartTestResultTable.tsx:305 #: src/tables/stock/StockItemTable.tsx:359 msgid "In Production" msgstr "生產中" @@ -3000,7 +3007,7 @@ msgstr "類別" #: src/components/render/Stock.tsx:114 #: src/components/render/Stock.tsx:132 #: src/forms/BuildForms.tsx:795 -#: src/forms/PurchaseOrderForms.tsx:595 +#: src/forms/PurchaseOrderForms.tsx:647 #: src/forms/StockForms.tsx:792 #: src/forms/StockForms.tsx:839 #: src/forms/StockForms.tsx:885 @@ -3023,7 +3030,7 @@ msgstr "位置" #: src/components/render/Stock.tsx:99 #: src/pages/stock/StockDetail.tsx:198 #: src/pages/stock/StockDetail.tsx:930 -#: src/tables/build/BuildAllocatedStockTable.tsx:121 +#: src/tables/build/BuildAllocatedStockTable.tsx:118 #: src/tables/build/BuildOutputTable.tsx:107 #: src/tables/sales/SalesOrderAllocationTable.tsx:142 msgid "Serial Number" @@ -3034,9 +3041,9 @@ msgstr "序列號" #: src/forms/BuildForms.tsx:240 #: src/forms/BuildForms.tsx:634 #: src/forms/BuildForms.tsx:797 -#: src/forms/PurchaseOrderForms.tsx:801 +#: src/forms/PurchaseOrderForms.tsx:853 #: src/forms/ReturnOrderForms.tsx:243 -#: src/forms/SalesOrderForms.tsx:308 +#: src/forms/SalesOrderForms.tsx:326 #: src/forms/StockForms.tsx:841 #: src/pages/part/PartStockHistoryDetail.tsx:56 #: src/pages/part/PartStockHistoryDetail.tsx:210 @@ -3046,9 +3053,9 @@ msgstr "序列號" #: src/pages/part/pricing/PriceBreakPanel.tsx:172 #: src/pages/stock/StockDetail.tsx:258 #: src/pages/stock/StockDetail.tsx:936 -#: src/tables/build/BuildLineTable.tsx:86 +#: src/tables/build/BuildLineTable.tsx:83 #: src/tables/part/PartPurchaseOrdersTable.tsx:94 -#: src/tables/part/PartTestResultTable.tsx:269 +#: src/tables/part/PartTestResultTable.tsx:277 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:175 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:206 #: src/tables/purchasing/SupplierPriceBreakTable.tsx:69 @@ -3070,7 +3077,7 @@ msgstr "數量" #: src/forms/StockForms.tsx:1048 #: src/forms/StockForms.tsx:1096 #: src/forms/StockForms.tsx:1140 -#: src/tables/build/BuildLineTable.tsx:96 +#: src/tables/build/BuildLineTable.tsx:93 msgid "Batch" msgstr "批次" @@ -3755,7 +3762,7 @@ msgid "In Stock" msgstr "入庫" #: src/components/wizards/OrderPartsWizard.tsx:146 -#: src/tables/build/BuildLineTable.tsx:404 +#: src/tables/build/BuildLineTable.tsx:405 msgid "Required Quantity" msgstr "" @@ -3847,7 +3854,7 @@ msgid "Please correct the errors in the selected parts" msgstr "" #: src/components/wizards/OrderPartsWizard.tsx:587 -#: src/tables/build/BuildLineTable.tsx:815 +#: src/tables/build/BuildLineTable.tsx:822 #: src/tables/part/PartTable.tsx:522 #: src/tables/sales/SalesOrderLineItemTable.tsx:370 msgid "Order Parts" @@ -4349,9 +4356,9 @@ msgstr "" #: src/forms/BuildForms.tsx:333 #: src/forms/BuildForms.tsx:408 #: src/forms/BuildForms.tsx:685 -#: src/tables/build/BuildAllocatedStockTable.tsx:150 +#: src/tables/build/BuildAllocatedStockTable.tsx:147 #: src/tables/build/BuildOutputTable.tsx:582 -#: src/tables/part/PartTestResultTable.tsx:272 +#: src/tables/part/PartTestResultTable.tsx:280 msgid "Build Output" msgstr "生產產出" @@ -4362,7 +4369,7 @@ msgstr "" #: src/forms/BuildForms.tsx:336 #: src/forms/BuildForms.tsx:411 #: src/forms/BuildForms.tsx:475 -#: src/forms/PurchaseOrderForms.tsx:717 +#: src/forms/PurchaseOrderForms.tsx:769 #: src/forms/ReturnOrderForms.tsx:197 #: src/forms/ReturnOrderForms.tsx:244 #: src/forms/StockForms.tsx:712 @@ -4377,7 +4384,7 @@ msgstr "" #: src/tables/build/BuildOutputTable.tsx:404 #: src/tables/machine/MachineListTable.tsx:387 #: src/tables/part/PartPurchaseOrdersTable.tsx:38 -#: src/tables/part/PartTestResultTable.tsx:309 +#: src/tables/part/PartTestResultTable.tsx:317 #: src/tables/sales/ReturnOrderLineItemTable.tsx:138 #: src/tables/sales/ReturnOrderLineItemTable.tsx:176 #: src/tables/settings/CustomStateTable.tsx:79 @@ -4450,8 +4457,8 @@ msgstr "生產已完成" #: src/pages/stock/StockDetail.tsx:153 #: src/tables/bom/BomTable.tsx:134 #: src/tables/bom/UsedInTable.tsx:40 -#: src/tables/build/BuildAllocatedStockTable.tsx:108 -#: src/tables/build/BuildLineTable.tsx:336 +#: src/tables/build/BuildAllocatedStockTable.tsx:105 +#: src/tables/build/BuildLineTable.tsx:337 #: src/tables/build/BuildOrderTable.tsx:79 #: src/tables/part/PartSalesAllocationsTable.tsx:61 #: src/tables/part/RelatedPartTable.tsx:73 @@ -4466,47 +4473,47 @@ msgstr "內部零件編碼 IPN" #: src/forms/BuildForms.tsx:632 #: src/forms/BuildForms.tsx:796 #: src/forms/BuildForms.tsx:897 -#: src/forms/SalesOrderForms.tsx:306 -#: src/tables/build/BuildAllocatedStockTable.tsx:139 -#: src/tables/build/BuildLineTable.tsx:182 +#: src/forms/SalesOrderForms.tsx:324 +#: src/tables/build/BuildAllocatedStockTable.tsx:136 +#: src/tables/build/BuildLineTable.tsx:183 #: src/tables/sales/SalesOrderLineItemTable.tsx:342 #: src/tables/stock/StockItemTable.tsx:338 msgid "Allocated" msgstr "已分配" #: src/forms/BuildForms.tsx:667 -#: src/forms/SalesOrderForms.tsx:295 +#: src/forms/SalesOrderForms.tsx:313 #: src/pages/build/BuildDetail.tsx:108 #: src/pages/build/BuildDetail.tsx:326 msgid "Source Location" msgstr "來源地點" #: src/forms/BuildForms.tsx:668 -#: src/forms/SalesOrderForms.tsx:296 +#: src/forms/SalesOrderForms.tsx:314 msgid "Select the source location for the stock allocation" msgstr "選擇分配庫存的源位置" #: src/forms/BuildForms.tsx:700 -#: src/forms/SalesOrderForms.tsx:336 -#: src/tables/build/BuildLineTable.tsx:574 -#: src/tables/build/BuildLineTable.tsx:731 -#: src/tables/build/BuildLineTable.tsx:830 +#: src/forms/SalesOrderForms.tsx:354 +#: src/tables/build/BuildLineTable.tsx:575 +#: src/tables/build/BuildLineTable.tsx:738 +#: src/tables/build/BuildLineTable.tsx:837 #: src/tables/sales/SalesOrderLineItemTable.tsx:380 #: src/tables/sales/SalesOrderLineItemTable.tsx:406 msgid "Allocate Stock" msgstr "分配庫存" #: src/forms/BuildForms.tsx:703 -#: src/forms/SalesOrderForms.tsx:341 +#: src/forms/SalesOrderForms.tsx:359 msgid "Stock items allocated" msgstr "分配的庫存項目" #: src/forms/BuildForms.tsx:816 #: src/forms/BuildForms.tsx:917 -#: src/tables/build/BuildAllocatedStockTable.tsx:240 -#: src/tables/build/BuildAllocatedStockTable.tsx:272 -#: src/tables/build/BuildLineTable.tsx:741 -#: src/tables/build/BuildLineTable.tsx:864 +#: src/tables/build/BuildAllocatedStockTable.tsx:243 +#: src/tables/build/BuildAllocatedStockTable.tsx:279 +#: src/tables/build/BuildLineTable.tsx:748 +#: src/tables/build/BuildLineTable.tsx:871 msgid "Consume Stock" msgstr "" @@ -4521,21 +4528,21 @@ msgstr "" #~ msgstr "Stock items consumed" #: src/forms/BuildForms.tsx:853 -#: src/tables/build/BuildLineTable.tsx:514 +#: src/tables/build/BuildLineTable.tsx:515 #: src/tables/part/PartBuildAllocationsTable.tsx:101 msgid "Fully consumed" msgstr "" #: src/forms/BuildForms.tsx:898 -#: src/tables/build/BuildLineTable.tsx:187 +#: src/tables/build/BuildLineTable.tsx:188 #: src/tables/stock/StockItemTable.tsx:367 msgid "Consumed" msgstr "" #: src/forms/CommonForms.tsx:88 -#: src/forms/PurchaseOrderForms.tsx:125 +#: src/forms/PurchaseOrderForms.tsx:176 #: src/forms/ReturnOrderForms.tsx:138 -#: src/forms/SalesOrderForms.tsx:164 +#: src/forms/SalesOrderForms.tsx:182 msgid "Select project code for this line item" msgstr "" @@ -4572,127 +4579,127 @@ msgstr "上級零件類別" msgid "Subscribe to notifications for this category" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:388 -msgid "Assign Batch Code and Serial Numbers" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:390 -msgid "Assign Batch Code" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:410 -msgid "Choose Location" -msgstr "選擇位置" - -#: src/forms/PurchaseOrderForms.tsx:418 -msgid "Item Destination selected" -msgstr "已選擇項目目的地" - #: src/forms/PurchaseOrderForms.tsx:421 #~ msgid "Assign Batch Code{0}" #~ msgstr "Assign Batch Code{0}" -#: src/forms/PurchaseOrderForms.tsx:428 -msgid "Part category default location selected" -msgstr "已選擇零件類別默認位置" +#: src/forms/PurchaseOrderForms.tsx:440 +msgid "Assign Batch Code and Serial Numbers" +msgstr "" -#: src/forms/PurchaseOrderForms.tsx:438 -msgid "Received stock location selected" -msgstr "已選擇接收庫存位置" +#: src/forms/PurchaseOrderForms.tsx:442 +msgid "Assign Batch Code" +msgstr "" #: src/forms/PurchaseOrderForms.tsx:444 #: src/forms/StockForms.tsx:428 #~ msgid "Remove item from list" #~ msgstr "Remove item from list" -#: src/forms/PurchaseOrderForms.tsx:446 +#: src/forms/PurchaseOrderForms.tsx:462 +msgid "Choose Location" +msgstr "選擇位置" + +#: src/forms/PurchaseOrderForms.tsx:470 +msgid "Item Destination selected" +msgstr "已選擇項目目的地" + +#: src/forms/PurchaseOrderForms.tsx:480 +msgid "Part category default location selected" +msgstr "已選擇零件類別默認位置" + +#: src/forms/PurchaseOrderForms.tsx:490 +msgid "Received stock location selected" +msgstr "已選擇接收庫存位置" + +#: src/forms/PurchaseOrderForms.tsx:498 msgid "Default location selected" msgstr "已選擇默認位置" -#: src/forms/PurchaseOrderForms.tsx:507 +#: src/forms/PurchaseOrderForms.tsx:559 msgid "Set Location" msgstr "設置位置" -#: src/forms/PurchaseOrderForms.tsx:524 -msgid "Set Expiry Date" -msgstr "" - -#: src/forms/PurchaseOrderForms.tsx:532 -#: src/forms/StockForms.tsx:693 -msgid "Adjust Packaging" -msgstr "調整封包" - -#: src/forms/PurchaseOrderForms.tsx:540 -#: src/forms/StockForms.tsx:684 -#: src/hooks/UseStockAdjustActions.tsx:148 -msgid "Change Status" -msgstr "更改狀態" - -#: src/forms/PurchaseOrderForms.tsx:546 -msgid "Add Note" -msgstr "添加備註" - #: src/forms/PurchaseOrderForms.tsx:566 #~ msgid "Serial numbers" #~ msgstr "Serial numbers" +#: src/forms/PurchaseOrderForms.tsx:576 +msgid "Set Expiry Date" +msgstr "" + #: src/forms/PurchaseOrderForms.tsx:582 #~ msgid "Store at line item destination" #~ msgstr "Store at line item destination" -#: src/forms/PurchaseOrderForms.tsx:610 -msgid "Store at default location" -msgstr "存儲在默認位置" +#: src/forms/PurchaseOrderForms.tsx:584 +#: src/forms/StockForms.tsx:693 +msgid "Adjust Packaging" +msgstr "調整封包" -#: src/forms/PurchaseOrderForms.tsx:625 -msgid "Store at line item destination " -msgstr "" +#: src/forms/PurchaseOrderForms.tsx:592 +#: src/forms/StockForms.tsx:684 +#: src/hooks/UseStockAdjustActions.tsx:148 +msgid "Change Status" +msgstr "更改狀態" -#: src/forms/PurchaseOrderForms.tsx:637 -msgid "Store with already received stock" -msgstr "存儲已收到的庫存" +#: src/forms/PurchaseOrderForms.tsx:598 +msgid "Add Note" +msgstr "添加備註" #: src/forms/PurchaseOrderForms.tsx:658 #~ msgid "Receive line items" #~ msgstr "Receive line items" -#: src/forms/PurchaseOrderForms.tsx:661 +#: src/forms/PurchaseOrderForms.tsx:662 +msgid "Store at default location" +msgstr "存儲在默認位置" + +#: src/forms/PurchaseOrderForms.tsx:677 +msgid "Store at line item destination " +msgstr "" + +#: src/forms/PurchaseOrderForms.tsx:689 +msgid "Store with already received stock" +msgstr "存儲已收到的庫存" + +#: src/forms/PurchaseOrderForms.tsx:713 #: src/pages/build/BuildDetail.tsx:340 #: src/pages/stock/StockDetail.tsx:280 #: src/pages/stock/StockDetail.tsx:952 #: src/tables/Filter.tsx:83 -#: src/tables/build/BuildAllocatedStockTable.tsx:128 +#: src/tables/build/BuildAllocatedStockTable.tsx:125 #: src/tables/build/BuildOutputTable.tsx:112 -#: src/tables/part/PartTestResultTable.tsx:260 -#: src/tables/part/PartTestResultTable.tsx:281 +#: src/tables/part/PartTestResultTable.tsx:268 +#: src/tables/part/PartTestResultTable.tsx:289 #: src/tables/sales/SalesOrderAllocationTable.tsx:149 msgid "Batch Code" msgstr "批號" -#: src/forms/PurchaseOrderForms.tsx:662 +#: src/forms/PurchaseOrderForms.tsx:714 msgid "Enter batch code for received items" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:675 +#: src/forms/PurchaseOrderForms.tsx:727 #: src/forms/StockForms.tsx:218 msgid "Serial Numbers" msgstr "序列號" -#: src/forms/PurchaseOrderForms.tsx:676 +#: src/forms/PurchaseOrderForms.tsx:728 msgid "Enter serial numbers for received items" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:690 +#: src/forms/PurchaseOrderForms.tsx:742 #: src/pages/stock/StockDetail.tsx:382 #: src/tables/stock/StockItemTable.tsx:294 msgid "Expiry Date" msgstr "有效期至" -#: src/forms/PurchaseOrderForms.tsx:691 +#: src/forms/PurchaseOrderForms.tsx:743 msgid "Enter an expiry date for received items" msgstr "" -#: src/forms/PurchaseOrderForms.tsx:703 +#: src/forms/PurchaseOrderForms.tsx:755 #: src/forms/StockForms.tsx:728 #: src/pages/company/SupplierPartDetail.tsx:172 #: src/pages/company/SupplierPartDetail.tsx:236 @@ -4701,19 +4708,19 @@ msgstr "" msgid "Packaging" msgstr "包裝" -#: src/forms/PurchaseOrderForms.tsx:727 +#: src/forms/PurchaseOrderForms.tsx:779 #: src/pages/company/SupplierPartDetail.tsx:120 #: src/tables/ColumnRenderers.tsx:332 msgid "Note" msgstr "備註" -#: src/forms/PurchaseOrderForms.tsx:799 +#: src/forms/PurchaseOrderForms.tsx:851 #: src/pages/company/SupplierPartDetail.tsx:138 #: src/tables/purchasing/SupplierPriceBreakTable.tsx:49 msgid "SKU" msgstr "庫存單位 (SKU)" -#: src/forms/PurchaseOrderForms.tsx:800 +#: src/forms/PurchaseOrderForms.tsx:852 #: src/tables/part/PartPurchaseOrdersTable.tsx:127 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:213 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:283 @@ -4721,11 +4728,11 @@ msgstr "庫存單位 (SKU)" msgid "Received" msgstr "已接收" -#: src/forms/PurchaseOrderForms.tsx:817 +#: src/forms/PurchaseOrderForms.tsx:869 msgid "Receive Line Items" msgstr "接收行項目" -#: src/forms/PurchaseOrderForms.tsx:823 +#: src/forms/PurchaseOrderForms.tsx:875 msgid "Items received" msgstr "" @@ -4737,7 +4744,7 @@ msgstr "接收物品" msgid "Item received into stock" msgstr "已收到庫存物品" -#: src/forms/SalesOrderForms.tsx:401 +#: src/forms/SalesOrderForms.tsx:419 msgid "Leave blank to use the order address" msgstr "" @@ -5932,6 +5939,9 @@ msgstr "" #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:310 #: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:401 +#: src/tables/build/BuildAllocatedStockTable.tsx:181 +#: src/tables/build/BuildLineTable.tsx:668 +#: src/tables/sales/SalesOrderAllocationTable.tsx:220 msgid "Confirm Removal" msgstr "" @@ -6870,8 +6880,8 @@ msgstr "外部" #: src/pages/sales/ReturnOrderDetail.tsx:108 #: src/pages/sales/SalesOrderDetail.tsx:98 #: src/tables/ColumnRenderers.tsx:321 -#: src/tables/build/BuildAllocatedStockTable.tsx:115 -#: src/tables/build/BuildLineTable.tsx:352 +#: src/tables/build/BuildAllocatedStockTable.tsx:112 +#: src/tables/build/BuildLineTable.tsx:353 msgid "Reference" msgstr "參考" @@ -7132,7 +7142,7 @@ msgstr "取消訂單" #: src/pages/build/BuildDetail.tsx:742 #: src/pages/stock/StockDetail.tsx:344 -#: src/tables/build/BuildAllocatedStockTable.tsx:85 +#: src/tables/build/BuildAllocatedStockTable.tsx:82 #: src/tables/part/PartBuildAllocationsTable.tsx:45 #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:157 #: src/tables/stock/StockTrackingTable.tsx:109 @@ -7600,7 +7610,7 @@ msgstr "關鍵詞" #: src/pages/part/PartDetail.tsx:542 #: src/tables/bom/BomTable.tsx:439 -#: src/tables/build/BuildLineTable.tsx:305 +#: src/tables/build/BuildLineTable.tsx:306 #: src/tables/part/PartTable.tsx:319 #: src/tables/sales/SalesOrderLineItemTable.tsx:138 msgid "Available Stock" @@ -7608,7 +7618,7 @@ msgstr "可用庫存" #: src/pages/part/PartDetail.tsx:548 #: src/tables/bom/BomTable.tsx:341 -#: src/tables/build/BuildLineTable.tsx:267 +#: src/tables/build/BuildLineTable.tsx:268 #: src/tables/sales/SalesOrderLineItemTable.tsx:180 msgid "On order" msgstr "訂購中" @@ -7782,7 +7792,7 @@ msgstr "訂單" #: src/pages/part/PartDetail.tsx:1144 #: src/pages/stock/StockDetail.tsx:884 -#: src/tables/build/BuildLineTable.tsx:761 +#: src/tables/build/BuildLineTable.tsx:768 msgid "Order Stock" msgstr "訂單庫存" @@ -9219,13 +9229,13 @@ msgstr "" #~ msgstr "Show asssmbled items" #: src/tables/bom/BomTable.tsx:315 -#: src/tables/build/BuildLineTable.tsx:276 +#: src/tables/build/BuildLineTable.tsx:277 #: src/tables/part/PartTable.tsx:145 msgid "External stock" msgstr "外部庫存" #: src/tables/bom/BomTable.tsx:323 -#: src/tables/build/BuildLineTable.tsx:239 +#: src/tables/build/BuildLineTable.tsx:240 msgid "Includes substitute stock" msgstr "包括替代庫存" @@ -9234,7 +9244,7 @@ msgstr "包括替代庫存" #~ msgstr "Edit Bom Item" #: src/tables/bom/BomTable.tsx:332 -#: src/tables/build/BuildLineTable.tsx:249 +#: src/tables/build/BuildLineTable.tsx:250 #: src/tables/sales/SalesOrderLineItemTable.tsx:166 msgid "Includes variant stock" msgstr "包括變體庫存" @@ -9272,8 +9282,8 @@ msgid "Stock Information" msgstr "庫存信息" #: src/tables/bom/BomTable.tsx:399 -#: src/tables/build/BuildLineTable.tsx:496 -#: src/tables/build/BuildLineTable.tsx:537 +#: src/tables/build/BuildLineTable.tsx:497 +#: src/tables/build/BuildLineTable.tsx:538 msgid "Consumable item" msgstr "可耗物品" @@ -9282,7 +9292,7 @@ msgid "No available stock" msgstr "無可用庫存" #: src/tables/bom/BomTable.tsx:420 -#: src/tables/build/BuildLineTable.tsx:213 +#: src/tables/build/BuildLineTable.tsx:214 msgid "Show testable items" msgstr "顯示可跟蹤項目" @@ -9291,7 +9301,7 @@ msgid "Show trackable items" msgstr "顯示可跟蹤項目" #: src/tables/bom/BomTable.tsx:430 -#: src/tables/build/BuildLineTable.tsx:208 +#: src/tables/build/BuildLineTable.tsx:209 msgid "Show assembled items" msgstr "顯示已裝配的項目" @@ -9335,7 +9345,7 @@ msgstr "顯示允許變體替換的項目" #: src/tables/bom/BomTable.tsx:464 #: src/tables/bom/UsedInTable.tsx:85 -#: src/tables/build/BuildLineTable.tsx:202 +#: src/tables/build/BuildLineTable.tsx:203 msgid "Optional" msgstr "可選項" @@ -9345,7 +9355,7 @@ msgid "Show optional items" msgstr "顯示可選項目" #: src/tables/bom/BomTable.tsx:469 -#: src/tables/build/BuildLineTable.tsx:197 +#: src/tables/build/BuildLineTable.tsx:198 msgid "Consumable" msgstr "消耗品" @@ -9433,7 +9443,7 @@ msgid "Bill of materials cannot be edited, as the part is locked" msgstr "無法編輯材料清單,因為零件已鎖定" #: src/tables/bom/UsedInTable.tsx:34 -#: src/tables/build/BuildLineTable.tsx:207 +#: src/tables/build/BuildLineTable.tsx:208 #: src/tables/part/ParametricPartTable.tsx:364 #: src/tables/part/PartBuildAllocationsTable.tsx:60 #: src/tables/part/PartTable.tsx:209 @@ -9455,11 +9465,11 @@ msgstr "可追蹤" msgid "Show trackable assemblies" msgstr "顯示可跟蹤裝配體" -#: src/tables/build/BuildAllocatedStockTable.tsx:67 +#: src/tables/build/BuildAllocatedStockTable.tsx:64 msgid "Allocated to Output" msgstr "分配至輸出" -#: src/tables/build/BuildAllocatedStockTable.tsx:68 +#: src/tables/build/BuildAllocatedStockTable.tsx:65 msgid "Show items allocated to a build output" msgstr "顯示分配給構建輸出的項目" @@ -9472,7 +9482,7 @@ msgstr "顯示分配給構建輸出的項目" #~ msgid "Include orders for part variants" #~ msgstr "Include orders for part variants" -#: src/tables/build/BuildAllocatedStockTable.tsx:97 +#: src/tables/build/BuildAllocatedStockTable.tsx:94 #: src/tables/part/PartBuildAllocationsTable.tsx:84 #: src/tables/part/PartPurchaseOrdersTable.tsx:132 #: src/tables/part/PartSalesAllocationsTable.tsx:69 @@ -9482,40 +9492,58 @@ msgid "Order Status" msgstr "訂單狀態" #: src/tables/build/BuildAllocatedStockTable.tsx:164 -#~ msgid "Edit Build Item" -#~ msgstr "Edit Build Item" - -#: src/tables/build/BuildAllocatedStockTable.tsx:167 -#: src/tables/build/BuildLineTable.tsx:650 +#: src/tables/build/BuildLineTable.tsx:651 msgid "Edit Stock Allocation" msgstr "" +#: src/tables/build/BuildAllocatedStockTable.tsx:164 +#~ msgid "Edit Build Item" +#~ msgstr "Edit Build Item" + #: src/tables/build/BuildAllocatedStockTable.tsx:174 #~ msgid "Delete Build Item" #~ msgstr "Delete Build Item" -#: src/tables/build/BuildAllocatedStockTable.tsx:180 -#: src/tables/build/BuildLineTable.tsx:663 -msgid "Delete Stock Allocation" +#: src/tables/build/BuildAllocatedStockTable.tsx:177 +#: src/tables/build/BuildLineTable.tsx:664 +#: src/tables/sales/SalesOrderAllocationTable.tsx:218 +msgid "Remove Allocated Stock" msgstr "" -#: src/tables/build/BuildAllocatedStockTable.tsx:239 +#: src/tables/build/BuildAllocatedStockTable.tsx:180 +#: src/tables/build/BuildLineTable.tsx:663 +#~ msgid "Delete Stock Allocation" +#~ msgstr "Delete Stock Allocation" + +#: src/tables/build/BuildAllocatedStockTable.tsx:182 +#: src/tables/build/BuildLineTable.tsx:669 +#: src/tables/sales/SalesOrderAllocationTable.tsx:221 +msgid "Are you sure you want to remove this allocated stock from the order?" +msgstr "" + +#: src/tables/build/BuildAllocatedStockTable.tsx:242 msgid "Consume" msgstr "" +#: src/tables/build/BuildAllocatedStockTable.tsx:259 +#: src/tables/build/BuildLineTable.tsx:112 +#: src/tables/sales/SalesOrderAllocationTable.tsx:248 +msgid "Remove allocated stock" +msgstr "" + #: src/tables/build/BuildLineTable.tsx:59 #~ msgid "Show lines with available stock" #~ msgstr "Show lines with available stock" -#: src/tables/build/BuildLineTable.tsx:120 +#: src/tables/build/BuildLineTable.tsx:121 msgid "View Stock Item" msgstr "" -#: src/tables/build/BuildLineTable.tsx:183 +#: src/tables/build/BuildLineTable.tsx:184 msgid "Show fully allocated lines" msgstr "" -#: src/tables/build/BuildLineTable.tsx:188 +#: src/tables/build/BuildLineTable.tsx:189 msgid "Show fully consumed lines" msgstr "" @@ -9523,124 +9551,124 @@ msgstr "" #~ msgid "Show allocated lines" #~ msgstr "Show allocated lines" -#: src/tables/build/BuildLineTable.tsx:193 +#: src/tables/build/BuildLineTable.tsx:194 msgid "Show items with sufficient available stock" msgstr "" -#: src/tables/build/BuildLineTable.tsx:198 +#: src/tables/build/BuildLineTable.tsx:199 msgid "Show consumable lines" msgstr "顯示可消耗項目" -#: src/tables/build/BuildLineTable.tsx:203 +#: src/tables/build/BuildLineTable.tsx:204 msgid "Show optional lines" msgstr "顯示可選項目" -#: src/tables/build/BuildLineTable.tsx:212 +#: src/tables/build/BuildLineTable.tsx:213 #: src/tables/part/PartTable.tsx:233 msgid "Testable" msgstr "可測試" -#: src/tables/build/BuildLineTable.tsx:217 +#: src/tables/build/BuildLineTable.tsx:218 #: src/tables/stock/StockItemTable.tsx:388 msgid "Tracked" msgstr "已跟蹤" -#: src/tables/build/BuildLineTable.tsx:218 +#: src/tables/build/BuildLineTable.tsx:219 msgid "Show tracked lines" msgstr "顯示已跟蹤項目" -#: src/tables/build/BuildLineTable.tsx:223 +#: src/tables/build/BuildLineTable.tsx:224 msgid "Show items with stock on order" msgstr "" -#: src/tables/build/BuildLineTable.tsx:258 +#: src/tables/build/BuildLineTable.tsx:259 #: src/tables/sales/SalesOrderLineItemTable.tsx:172 msgid "In production" msgstr "生產中" -#: src/tables/build/BuildLineTable.tsx:286 +#: src/tables/build/BuildLineTable.tsx:287 msgid "Insufficient stock" msgstr "庫存不足" -#: src/tables/build/BuildLineTable.tsx:302 +#: src/tables/build/BuildLineTable.tsx:303 #: src/tables/sales/SalesOrderLineItemTable.tsx:160 #: src/tables/stock/StockItemTable.tsx:191 msgid "No stock available" msgstr "無可用庫存" -#: src/tables/build/BuildLineTable.tsx:375 +#: src/tables/build/BuildLineTable.tsx:376 msgid "Gets Inherited" msgstr "獲取已繼承的" -#: src/tables/build/BuildLineTable.tsx:388 +#: src/tables/build/BuildLineTable.tsx:389 msgid "Unit Quantity" msgstr "單位數量" -#: src/tables/build/BuildLineTable.tsx:415 +#: src/tables/build/BuildLineTable.tsx:416 msgid "Setup Quantity" msgstr "" -#: src/tables/build/BuildLineTable.tsx:424 +#: src/tables/build/BuildLineTable.tsx:425 msgid "Attrition" msgstr "" -#: src/tables/build/BuildLineTable.tsx:432 +#: src/tables/build/BuildLineTable.tsx:433 msgid "Rounding Multiple" msgstr "" -#: src/tables/build/BuildLineTable.tsx:441 +#: src/tables/build/BuildLineTable.tsx:442 msgid "BOM Information" msgstr "" -#: src/tables/build/BuildLineTable.tsx:515 +#: src/tables/build/BuildLineTable.tsx:516 #: src/tables/part/PartBuildAllocationsTable.tsx:102 msgid "Fully allocated" msgstr "" -#: src/tables/build/BuildLineTable.tsx:563 +#: src/tables/build/BuildLineTable.tsx:564 #: src/tables/sales/SalesOrderLineItemTable.tsx:311 msgid "Create Build Order" msgstr "創建生產訂單" -#: src/tables/build/BuildLineTable.tsx:592 +#: src/tables/build/BuildLineTable.tsx:593 msgid "Auto allocation in progress" msgstr "自動分配進行中" -#: src/tables/build/BuildLineTable.tsx:595 -#: src/tables/build/BuildLineTable.tsx:802 +#: src/tables/build/BuildLineTable.tsx:596 +#: src/tables/build/BuildLineTable.tsx:809 msgid "Auto Allocate Stock" msgstr "自動分配庫存量" -#: src/tables/build/BuildLineTable.tsx:596 +#: src/tables/build/BuildLineTable.tsx:597 msgid "Automatically allocate stock to this build according to the selected options" msgstr "根據選定的選項自動分配庫存到此版本" -#: src/tables/build/BuildLineTable.tsx:616 -#: src/tables/build/BuildLineTable.tsx:630 -#: src/tables/build/BuildLineTable.tsx:751 -#: src/tables/build/BuildLineTable.tsx:852 +#: src/tables/build/BuildLineTable.tsx:617 +#: src/tables/build/BuildLineTable.tsx:631 +#: src/tables/build/BuildLineTable.tsx:758 +#: src/tables/build/BuildLineTable.tsx:859 #: src/tables/build/BuildOutputTable.tsx:355 #: src/tables/build/BuildOutputTable.tsx:360 msgid "Deallocate Stock" msgstr "取消庫存分配" -#: src/tables/build/BuildLineTable.tsx:632 +#: src/tables/build/BuildLineTable.tsx:633 msgid "Deallocate all untracked stock for this build order" msgstr "為這個構建訂單取消分配所有未跟蹤庫存" -#: src/tables/build/BuildLineTable.tsx:634 +#: src/tables/build/BuildLineTable.tsx:635 msgid "Deallocate stock from the selected line item" msgstr "從選中的行項中取消分配庫存" -#: src/tables/build/BuildLineTable.tsx:638 +#: src/tables/build/BuildLineTable.tsx:639 msgid "Stock has been deallocated" msgstr "庫存已經取消分配" -#: src/tables/build/BuildLineTable.tsx:771 +#: src/tables/build/BuildLineTable.tsx:778 msgid "Build Stock" msgstr "生產庫存" -#: src/tables/build/BuildLineTable.tsx:784 +#: src/tables/build/BuildLineTable.tsx:791 #: src/tables/sales/SalesOrderLineItemTable.tsx:487 msgid "View Part" msgstr "" @@ -9739,7 +9767,7 @@ msgid "Serialize Build Output" msgstr "" #: src/tables/build/BuildOutputTable.tsx:405 -#: src/tables/part/PartTestResultTable.tsx:310 +#: src/tables/part/PartTestResultTable.tsx:318 #: src/tables/stock/StockItemTable.tsx:328 msgid "Filter by stock status" msgstr "按庫存狀態篩選" @@ -9964,8 +9992,8 @@ msgid "View Item" msgstr "" #: src/tables/general/ExtraLineItemTable.tsx:95 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:299 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:403 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:300 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:405 #: src/tables/sales/ReturnOrderLineItemTable.tsx:83 #: src/tables/sales/ReturnOrderLineItemTable.tsx:187 #: src/tables/sales/SalesOrderLineItemTable.tsx:252 @@ -9974,14 +10002,14 @@ msgid "Add Line Item" msgstr "添加行項目" #: src/tables/general/ExtraLineItemTable.tsx:108 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:320 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:322 #: src/tables/sales/ReturnOrderLineItemTable.tsx:96 #: src/tables/sales/SalesOrderLineItemTable.tsx:271 msgid "Edit Line Item" msgstr "編輯行項目" #: src/tables/general/ExtraLineItemTable.tsx:117 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:329 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:331 #: src/tables/sales/ReturnOrderLineItemTable.tsx:105 #: src/tables/sales/SalesOrderLineItemTable.tsx:280 msgid "Delete Line Item" @@ -10273,7 +10301,7 @@ msgid "Required Stock" msgstr "" #: src/tables/part/PartBuildAllocationsTable.tsx:124 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:381 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:383 msgid "View Build Order" msgstr "" @@ -10617,8 +10645,8 @@ msgstr "" #: src/tables/part/PartTestResultTable.tsx:103 #: src/tables/part/PartTestResultTable.tsx:181 -#: src/tables/part/PartTestResultTable.tsx:320 -#: src/tables/part/PartTestResultTable.tsx:334 +#: src/tables/part/PartTestResultTable.tsx:328 +#: src/tables/part/PartTestResultTable.tsx:342 #: src/tables/stock/StockItemTestResultTable.tsx:296 #: src/tables/stock/StockItemTestResultTable.tsx:368 #: src/tables/stock/StockItemTestResultTable.tsx:429 @@ -10643,7 +10671,7 @@ msgstr "" msgid "No Result" msgstr "無結果" -#: src/tables/part/PartTestResultTable.tsx:298 +#: src/tables/part/PartTestResultTable.tsx:306 msgid "Show build outputs currently in production" msgstr "顯示當前生產中的構建輸出" @@ -11073,7 +11101,7 @@ msgid "Show manufacturer parts for active manufacturers." msgstr "" #: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:115 -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:397 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:399 msgid "Import Line Items" msgstr "導入行項目" @@ -11099,11 +11127,11 @@ msgstr "" #~ msgid "Add line item" #~ msgstr "Add line item" -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:350 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:352 msgid "Receive line item" msgstr "接收這行項目" -#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:414 +#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:416 msgid "Receive items" msgstr "收到項目" @@ -11201,25 +11229,25 @@ msgid "Not shipped" msgstr "" #: src/tables/sales/SalesOrderAllocationTable.tsx:211 -#: src/tables/sales/SalesOrderAllocationTable.tsx:229 +#: src/tables/sales/SalesOrderAllocationTable.tsx:235 msgid "Edit Allocation" msgstr "" #: src/tables/sales/SalesOrderAllocationTable.tsx:218 #: src/tables/sales/SalesOrderAllocationTable.tsx:241 -msgid "Delete Allocation" -msgstr "" +#~ msgid "Delete Allocation" +#~ msgstr "Delete Allocation" -#: src/tables/sales/SalesOrderAllocationTable.tsx:252 -#: src/tables/sales/SalesOrderAllocationTable.tsx:253 +#: src/tables/sales/SalesOrderAllocationTable.tsx:261 +#: src/tables/sales/SalesOrderAllocationTable.tsx:262 msgid "View Shipment" msgstr "" -#: src/tables/sales/SalesOrderAllocationTable.tsx:308 +#: src/tables/sales/SalesOrderAllocationTable.tsx:317 msgid "Assign to Shipment" msgstr "" -#: src/tables/sales/SalesOrderAllocationTable.tsx:324 +#: src/tables/sales/SalesOrderAllocationTable.tsx:333 msgid "Assign to shipment" msgstr "" From ee4e200cf3a5976eb762d40eb39377c0acc6f4ed Mon Sep 17 00:00:00 2001 From: Oliver Date: Mon, 1 Dec 2025 16:46:59 +1100 Subject: [PATCH 13/76] [devcontainer] revert postgres version (#10937) - Our debian image (bookworm) supports only postgres:15 - Revert from postgres:17 to postgres:15 in the devcontainer --- .devcontainer/docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.devcontainer/docker-compose.yml b/.devcontainer/docker-compose.yml index 0c310b5b50..a44c1ea9c3 100644 --- a/.devcontainer/docker-compose.yml +++ b/.devcontainer/docker-compose.yml @@ -1,6 +1,6 @@ services: db: - image: postgres:17 + image: postgres:15 restart: unless-stopped ports: - 5432/tcp From c224606d8dc67e4d03638ae517d1451d8a7003a5 Mon Sep 17 00:00:00 2001 From: Oliver Date: Mon, 1 Dec 2025 23:07:26 +1100 Subject: [PATCH 14/76] [UI] refactor "inactive alerts" panel (#10913) * Remove "inactive alerts" panel * Improve messaging / colors * Refactor to "system status" display * remove duplicate messages * Revert alert messages --------- Co-authored-by: Matthias Mair --- src/frontend/src/components/nav/Alerts.tsx | 20 ++++++------ .../Index/Settings/AdminCenter/HomePanel.tsx | 31 ++++++++++++------- 2 files changed, 31 insertions(+), 20 deletions(-) diff --git a/src/frontend/src/components/nav/Alerts.tsx b/src/frontend/src/components/nav/Alerts.tsx index 7e689ca00b..b69f58e19c 100644 --- a/src/frontend/src/components/nav/Alerts.tsx +++ b/src/frontend/src/components/nav/Alerts.tsx @@ -1,5 +1,5 @@ import { ActionIcon, Alert, Group, Menu, Stack, Tooltip } from '@mantine/core'; -import { IconExclamationCircle } from '@tabler/icons-react'; +import { IconCircleCheck, IconExclamationCircle } from '@tabler/icons-react'; import { useMemo, useState } from 'react'; import type { SettingsStateProps } from '@lib/types/Settings'; @@ -34,7 +34,7 @@ export function Alerts() { const [dismissed, setDismissed] = useState([]); - const alerts: AlertInfo[] = useMemo( + const alerts: ExtendedAlertInfo[] = useMemo( () => getAlerts(server, globalSettings).filter( (alert) => !dismissed.includes(alert.key) @@ -79,11 +79,12 @@ export function Alerts() { export function ServerAlert({ alert, closeAlert -}: { alert: AlertInfo; closeAlert?: (key: string) => void }) { +}: { alert: ExtendedAlertInfo; closeAlert?: (key: string) => void }) { return ( : } title={ {alert.code && `${alert.code}: `} @@ -93,14 +94,15 @@ export function ServerAlert({ onClose={closeAlert ? () => closeAlert(alert.key) : undefined} > - {alert.message} - {alert.code && errorCodeLink(alert.code)} + {!alert.condition && t`No issues detected`} + {alert.condition && alert.message} + {alert.condition && alert.code && errorCodeLink(alert.code)} ); } -type ExtendedAlertInfo = AlertInfo & { +export type ExtendedAlertInfo = AlertInfo & { condition: boolean; }; @@ -112,7 +114,7 @@ export function getAlerts( const n_migrations = Number.parseInt(globalSettings.getSetting('_PENDING_MIGRATIONS')) ?? 0; - const allalerts: ExtendedAlertInfo[] = [ + const allAlerts: ExtendedAlertInfo[] = [ { key: 'debug', title: t`Debug Mode`, @@ -150,7 +152,7 @@ export function getAlerts( } ]; - return allalerts.filter((alert) => inactive || alert.condition); + return allAlerts.filter((alert) => inactive || alert.condition); } export function errorCodeLink(code: string) { diff --git a/src/frontend/src/pages/Index/Settings/AdminCenter/HomePanel.tsx b/src/frontend/src/pages/Index/Settings/AdminCenter/HomePanel.tsx index 0458bb205d..8a0d202166 100644 --- a/src/frontend/src/pages/Index/Settings/AdminCenter/HomePanel.tsx +++ b/src/frontend/src/pages/Index/Settings/AdminCenter/HomePanel.tsx @@ -4,28 +4,37 @@ import { Accordion, Alert, SimpleGrid, Stack, Text } from '@mantine/core'; import { type JSX, useMemo, useState } from 'react'; import { useShallow } from 'zustand/react/shallow'; import { StylishText } from '../../../../components/items/StylishText'; -import { ServerAlert, getAlerts } from '../../../../components/nav/Alerts'; +import { + type ExtendedAlertInfo, + ServerAlert, + getAlerts +} from '../../../../components/nav/Alerts'; import { QuickAction } from '../../../../components/settings/QuickAction'; import { useServerApiState } from '../../../../states/ServerApiState'; import { useGlobalSettingsState } from '../../../../states/SettingsStates'; +function rankAlert(alert: ExtendedAlertInfo): number { + if (!alert.condition) return 0; + if (alert.error) return 2; + + return 1; +} + export default function HomePanel(): JSX.Element { const [dismissed, setDismissed] = useState(false); const [server] = useServerApiState(useShallow((state) => [state.server])); const globalSettings = useGlobalSettingsState(); const accElements = useMemo(() => { - const _alerts = getAlerts(server, globalSettings, true); + const _alerts = getAlerts(server, globalSettings, true).sort( + (a, b) => rankAlert(b) - rankAlert(a) + ); + return [ { - key: 'active', - text: t`Active Alerts`, - elements: _alerts.filter((alert) => alert.condition) - }, - { - key: 'inactive', - text: t`Inactive Alerts`, - elements: _alerts.filter((alert) => !alert.condition) + key: 'system-status', + text: t`System Status`, + elements: _alerts } ]; }, [server, globalSettings]); @@ -67,7 +76,7 @@ export default function HomePanel(): JSX.Element { )} From 4c45716843e1401d3c0aa0d2bce39f35e3c27166 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 2 Dec 2025 16:31:59 +1100 Subject: [PATCH 15/76] chore(deps): bump actions/setup-python in the dependencies group (#10940) Bumps the dependencies group with 1 update: [actions/setup-python](https://github.com/actions/setup-python). Updates `actions/setup-python` from 6.0.0 to 6.1.0 - [Release notes](https://github.com/actions/setup-python/releases) - [Commits](https://github.com/actions/setup-python/compare/e797f83bcb11b83ae66e0230d6156d7c80228e7c...83679a892e2d95755f2dac6acb0bfd1e9ac5d548) --- updated-dependencies: - dependency-name: actions/setup-python dependency-version: 6.1.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/docker.yaml | 2 +- .github/workflows/qc_checks.yaml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/docker.yaml b/.github/workflows/docker.yaml index 9e839da766..4609adf56c 100644 --- a/.github/workflows/docker.yaml +++ b/.github/workflows/docker.yaml @@ -157,7 +157,7 @@ jobs: with: persist-credentials: false - name: Set Up Python ${{ env.python_version }} - uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # pin@v6.0.0 + uses: actions/setup-python@83679a892e2d95755f2dac6acb0bfd1e9ac5d548 # pin@v6.1.0 with: python-version: ${{ env.python_version }} - name: Version Check diff --git a/.github/workflows/qc_checks.yaml b/.github/workflows/qc_checks.yaml index c1b1dd0db4..5a0416c508 100644 --- a/.github/workflows/qc_checks.yaml +++ b/.github/workflows/qc_checks.yaml @@ -86,7 +86,7 @@ jobs: with: persist-credentials: false - name: Set up Python ${{ env.python_version }} - uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # pin@v6.0.0 + uses: actions/setup-python@83679a892e2d95755f2dac6acb0bfd1e9ac5d548 # pin@v6.1.0 with: python-version: ${{ env.python_version }} cache: "pip" @@ -130,7 +130,7 @@ jobs: with: persist-credentials: false - name: Set up Python ${{ env.python_version }} - uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # pin@v6.0.0 + uses: actions/setup-python@83679a892e2d95755f2dac6acb0bfd1e9ac5d548 # pin@v6.1.0 with: python-version: ${{ env.python_version }} - name: Check Config From 38b27271acb3cb05c9ed002e20d25967c1a4dfce Mon Sep 17 00:00:00 2001 From: Oliver Date: Tue, 2 Dec 2025 17:21:24 +1100 Subject: [PATCH 16/76] [bug] Handle TransactionManagementError (#10942) In the case where we try to call refresh_from_db within an atomic transaction block, it will throw a TransactionManagementError --- src/backend/InvenTree/InvenTree/models.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/backend/InvenTree/InvenTree/models.py b/src/backend/InvenTree/InvenTree/models.py index c6f61b3ca3..71bf510871 100644 --- a/src/backend/InvenTree/InvenTree/models.py +++ b/src/backend/InvenTree/InvenTree/models.py @@ -10,6 +10,7 @@ from django.core.exceptions import ValidationError from django.db import models from django.db.models import QuerySet from django.db.models.signals import post_save +from django.db.transaction import TransactionManagementError from django.dispatch import receiver from django.urls import resolve, reverse from django.urls.exceptions import NoReverseMatch @@ -763,7 +764,15 @@ class InvenTreeTree(MPTTModel): if len(trees) > 0: # A tree update was performed, so we need to refresh the instance - self.refresh_from_db() + try: + self.refresh_from_db() + except TransactionManagementError: + # If we are inside a transaction block, we cannot refresh from db + pass + except Exception as e: + # Any other error is unexpected + InvenTree.sentry.report_exception(e) + InvenTree.exceptions.log_error(f'{self.__class__.__name__}.save') def partial_rebuild(self, tree_id: int) -> bool: """Perform a partial rebuild of the tree structure. From c8b1bfb71652857c5fe36db26b5ef944e1111b00 Mon Sep 17 00:00:00 2001 From: Matthias Mair Date: Tue, 2 Dec 2025 07:11:02 +0000 Subject: [PATCH 17/76] refactor (frontend): address code scanning issues (#10935) * remove unused defs * optimize * revert rename --- src/frontend/src/components/buttons/PrintingActions.tsx | 4 ++-- src/frontend/src/hooks/UseDataExport.tsx | 2 +- src/frontend/src/hooks/UseDataOutput.tsx | 2 +- src/frontend/src/hooks/UseImportSession.tsx | 2 +- src/frontend/src/pages/sales/SalesOrderShipmentDetail.tsx | 6 +----- src/frontend/src/tables/machine/MachineTypeTable.tsx | 4 +--- 6 files changed, 7 insertions(+), 13 deletions(-) diff --git a/src/frontend/src/components/buttons/PrintingActions.tsx b/src/frontend/src/components/buttons/PrintingActions.tsx index dad818e96f..4dbb997af9 100644 --- a/src/frontend/src/components/buttons/PrintingActions.tsx +++ b/src/frontend/src/components/buttons/PrintingActions.tsx @@ -52,12 +52,12 @@ export function PrintingActions({ const [labelId, setLabelId] = useState(undefined); const [reportId, setReportId] = useState(undefined); - const labelProgress = useDataOutput({ + useDataOutput({ title: t`Printing Labels`, id: labelId }); - const reportProgress = useDataOutput({ + useDataOutput({ title: t`Printing Reports`, id: reportId }); diff --git a/src/frontend/src/hooks/UseDataExport.tsx b/src/frontend/src/hooks/UseDataExport.tsx index 653a79beb3..8237f326e8 100644 --- a/src/frontend/src/hooks/UseDataExport.tsx +++ b/src/frontend/src/hooks/UseDataExport.tsx @@ -30,7 +30,7 @@ export default function useDataExport({ const [exportId, setExportId] = useState(undefined); - const progress = useDataOutput({ + useDataOutput({ title: t`Exporting Data`, id: exportId }); diff --git a/src/frontend/src/hooks/UseDataOutput.tsx b/src/frontend/src/hooks/UseDataOutput.tsx index 7844e899c0..84be903f70 100644 --- a/src/frontend/src/hooks/UseDataOutput.tsx +++ b/src/frontend/src/hooks/UseDataOutput.tsx @@ -40,7 +40,7 @@ export default function useDataOutput({ } else setLoading(false); }, [id, title]); - const progress = useQuery({ + useQuery({ enabled: !!id && loading && visibility === 'visible', refetchInterval: 500, queryKey: ['data-output', id, title], diff --git a/src/frontend/src/hooks/UseImportSession.tsx b/src/frontend/src/hooks/UseImportSession.tsx index 7503228c03..5410e77ee7 100644 --- a/src/frontend/src/hooks/UseImportSession.tsx +++ b/src/frontend/src/hooks/UseImportSession.tsx @@ -49,7 +49,7 @@ export function useImportSession({ setInstance(data); }, []); - const importSessionStatus = useStatusCodes({ + useStatusCodes({ modelType: ModelType.importsession }); diff --git a/src/frontend/src/pages/sales/SalesOrderShipmentDetail.tsx b/src/frontend/src/pages/sales/SalesOrderShipmentDetail.tsx index 153933dac9..2a0954ea42 100644 --- a/src/frontend/src/pages/sales/SalesOrderShipmentDetail.tsx +++ b/src/frontend/src/pages/sales/SalesOrderShipmentDetail.tsx @@ -72,11 +72,7 @@ export default function SalesOrderShipmentDetail() { } }); - const { - instance: customer, - instanceQuery: customerQuery, - refreshInstance: refreshCustomer - } = useInstance({ + const { instance: customer, instanceQuery: customerQuery } = useInstance({ endpoint: ApiEndpoints.company_list, pk: shipment.order_detail?.customer, hasPrimaryKey: true diff --git a/src/frontend/src/tables/machine/MachineTypeTable.tsx b/src/frontend/src/tables/machine/MachineTypeTable.tsx index f7496da4d7..c9aebc29e8 100644 --- a/src/frontend/src/tables/machine/MachineTypeTable.tsx +++ b/src/frontend/src/tables/machine/MachineTypeTable.tsx @@ -103,9 +103,7 @@ export function MachineDriverTable({ function MachineTypeDrawer({ machineTypeSlug }: Readonly<{ machineTypeSlug: string }>) { - const navigate = useNavigate(); - - const { machineTypes, refresh, isFetching } = useMachineTypeDriver({ + const { machineTypes, isFetching } = useMachineTypeDriver({ includeDrivers: false }); const machineType = useMemo( From 3e35f439c0bc033b087542a8c242e212dd064555 Mon Sep 17 00:00:00 2001 From: Oliver Date: Wed, 3 Dec 2025 17:28:13 +1100 Subject: [PATCH 18/76] [UI] Edit shipment details (#10944) - Pass "pending" status through to the form --- src/frontend/src/tables/sales/SalesOrderShipmentTable.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/frontend/src/tables/sales/SalesOrderShipmentTable.tsx b/src/frontend/src/tables/sales/SalesOrderShipmentTable.tsx index 1727cad418..52a90e6829 100644 --- a/src/frontend/src/tables/sales/SalesOrderShipmentTable.tsx +++ b/src/frontend/src/tables/sales/SalesOrderShipmentTable.tsx @@ -67,7 +67,8 @@ export default function SalesOrderShipmentTable({ }); const editShipmentFields = useSalesOrderShipmentFields({ - customerId: customerId + customerId: customerId, + pending: !selectedShipment.shipment_date }); const completeShipmentFields = useSalesOrderShipmentCompleteFields({}); From 7920b0e67011ca105827336f7ea13e1498a9bb43 Mon Sep 17 00:00:00 2001 From: Oliver Date: Thu, 4 Dec 2025 07:04:07 +1100 Subject: [PATCH 19/76] Allow null values for InvenTreeDecimalField (#10948) - Fixes bug related to importing null "rounding_multiple" BOM field --- src/backend/InvenTree/InvenTree/serializers.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/backend/InvenTree/InvenTree/serializers.py b/src/backend/InvenTree/InvenTree/serializers.py index dd1e096de7..57be6dc1d1 100644 --- a/src/backend/InvenTree/InvenTree/serializers.py +++ b/src/backend/InvenTree/InvenTree/serializers.py @@ -646,6 +646,11 @@ class InvenTreeDecimalField(serializers.FloatField): def to_internal_value(self, data): """Convert to python type.""" + if data in [None, '']: + if self.allow_null: + return None + raise serializers.ValidationError(_('This field may not be null.')) + # Convert the value to a string, and then a decimal try: return Decimal(str(data)) From 8715935bb9213b38f4a3459f306af3e25bcf5f1c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 4 Dec 2025 11:03:29 +1100 Subject: [PATCH 20/76] chore(deps): bump django from 5.2.8 to 5.2.9 in /src/backend (#10950) * chore(deps): bump django from 5.2.8 to 5.2.9 in /src/backend Bumps [django](https://github.com/django/django) from 5.2.8 to 5.2.9. - [Commits](https://github.com/django/django/compare/5.2.8...5.2.9) --- updated-dependencies: - dependency-name: django dependency-version: 5.2.9 dependency-type: direct:production ... Signed-off-by: dependabot[bot] * fix style --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Matthias Mair --- src/backend/requirements-dev.txt | 6 +++--- src/backend/requirements.txt | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/backend/requirements-dev.txt b/src/backend/requirements-dev.txt index 9068c90531..44a2d26509 100644 --- a/src/backend/requirements-dev.txt +++ b/src/backend/requirements-dev.txt @@ -386,9 +386,9 @@ distlib==0.4.0 \ --hash=sha256:9659f7d87e46584a30b5780e43ac7a2143098441670ff0a49d5f9034c54a6c16 \ --hash=sha256:feec40075be03a04501a973d81f633735b4b69f98b05450592310c0f401a4e0d # via virtualenv -django==5.2.8 \ - --hash=sha256:23254866a5bb9a2cfa6004e8b809ec6246eba4b58a7589bc2772f1bcc8456c7f \ - --hash=sha256:37e687f7bd73ddf043e2b6b97cfe02fcbb11f2dbb3adccc6a2b18c6daa054d7f +django==5.2.9 \ + --hash=sha256:16b5ccfc5e8c27e6c0561af551d2ea32852d7352c67d452ae3e76b4f6b2ca495 \ + --hash=sha256:3a4ea88a70370557ab1930b332fd2887a9f48654261cdffda663fef5976bb00a # via # -c src/backend/requirements.txt # django-slowtests diff --git a/src/backend/requirements.txt b/src/backend/requirements.txt index bfaeac6648..a3148aa0a4 100644 --- a/src/backend/requirements.txt +++ b/src/backend/requirements.txt @@ -490,9 +490,9 @@ defusedxml==0.7.1 \ --hash=sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69 \ --hash=sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61 # via python3-openid -django==5.2.8 \ - --hash=sha256:23254866a5bb9a2cfa6004e8b809ec6246eba4b58a7589bc2772f1bcc8456c7f \ - --hash=sha256:37e687f7bd73ddf043e2b6b97cfe02fcbb11f2dbb3adccc6a2b18c6daa054d7f +django==5.2.9 \ + --hash=sha256:16b5ccfc5e8c27e6c0561af551d2ea32852d7352c67d452ae3e76b4f6b2ca495 \ + --hash=sha256:3a4ea88a70370557ab1930b332fd2887a9f48654261cdffda663fef5976bb00a # via # -r src/backend/requirements.in # django-allauth From 2ffc2cb9fc108f236a865b9058aee36cbeb9c836 Mon Sep 17 00:00:00 2001 From: Tyler Tracy Date: Wed, 3 Dec 2025 18:03:56 -0600 Subject: [PATCH 21/76] Fixed typo in shebang interpreter directive (#10952) --- contrib/container/init.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/container/init.sh b/contrib/container/init.sh index a9dceaf6f0..4883c49b0b 100644 --- a/contrib/container/init.sh +++ b/contrib/container/init.sh @@ -1,4 +1,4 @@ -#!/bin/ash +#!/bin/bash # exit when any command fails set -e From c443b4e9b8597c06008179edd00cd9716fa3a0de Mon Sep 17 00:00:00 2001 From: Oliver Date: Thu, 4 Dec 2025 19:30:14 +1100 Subject: [PATCH 22/76] App ready warning (#10938) * Fix for currency functions - Prevent database access until after the 'common' app has loaded * Add decorator to selectively ignore warnings * Add reference to PR * Fix variable assignment * Use functools.wraps * Add wrapper for loading machine registry * Move decorator to ready.py * Add missing code * Set backup values to match default currency codes * Bump API version --- .../InvenTree/InvenTree/api_version.py | 6 ++- src/backend/InvenTree/InvenTree/apps.py | 17 ++++++-- src/backend/InvenTree/InvenTree/ready.py | 42 +++++++++++++++++++ src/backend/InvenTree/common/apps.py | 6 +++ src/backend/InvenTree/common/currency.py | 30 ++++++++----- src/backend/InvenTree/machine/apps.py | 16 ++++--- src/backend/InvenTree/plugin/apps.py | 8 +++- tasks.py | 2 +- 8 files changed, 105 insertions(+), 22 deletions(-) diff --git a/src/backend/InvenTree/InvenTree/api_version.py b/src/backend/InvenTree/InvenTree/api_version.py index f198138e53..c220b37925 100644 --- a/src/backend/InvenTree/InvenTree/api_version.py +++ b/src/backend/InvenTree/InvenTree/api_version.py @@ -1,11 +1,15 @@ """InvenTree API version information.""" # InvenTree API version -INVENTREE_API_VERSION = 428 +INVENTREE_API_VERSION = 429 """Increment this API version number whenever there is a significant change to the API that any clients need to know about.""" INVENTREE_API_TEXT = """ +v429 -> 2025-12-04 : https://github.com/inventree/InvenTree/pull/10938 + - Adjust default values for currency codes in the API schema + - Note that this does not change any functional behavior, only the schema documentation + v428 -> 2025-11-28 : https://github.com/inventree/InvenTree/pull/10926 - Various typo fixes in API - no functional changes diff --git a/src/backend/InvenTree/InvenTree/apps.py b/src/backend/InvenTree/InvenTree/apps.py index 9d94ba5843..16e634e023 100644 --- a/src/backend/InvenTree/InvenTree/apps.py +++ b/src/backend/InvenTree/InvenTree/apps.py @@ -18,6 +18,7 @@ import InvenTree.conversion import InvenTree.ready import InvenTree.tasks from InvenTree.config import get_setting +from InvenTree.ready import ignore_ready_warning logger = structlog.get_logger('inventree') MIGRATIONS_CHECK_DONE = False @@ -70,9 +71,7 @@ class InvenTreeConfig(AppConfig): InvenTree.tasks.offload_task(InvenTree.tasks.check_for_migrations) self.update_site_url() - - # Ensure the unit registry is loaded - InvenTree.conversion.get_unit_registry() + self.load_unit_registry() if InvenTree.ready.canAppAccessDatabase() or settings.TESTING_ENV: self.add_user_on_startup() @@ -84,6 +83,7 @@ class InvenTreeConfig(AppConfig): social_account_updated.connect(sso.ensure_sso_groups) + @ignore_ready_warning def remove_obsolete_tasks(self): """Delete any obsolete scheduled tasks in the database.""" obsolete = [ @@ -112,6 +112,7 @@ class InvenTreeConfig(AppConfig): except Exception: logger.exception('Failed to remove obsolete tasks - database not ready') + @ignore_ready_warning def start_background_tasks(self): """Start all background tests for InvenTree.""" logger.info('Starting background tasks...') @@ -171,6 +172,7 @@ class InvenTreeConfig(AppConfig): logger.info('Started %s scheduled background tasks...', len(tasks)) + @ignore_ready_warning def add_heartbeat(self): """Ensure there is at least one background task in the queue.""" import django_q.models @@ -185,6 +187,7 @@ class InvenTreeConfig(AppConfig): except Exception: pass + @ignore_ready_warning def collect_tasks(self): """Collect all background tasks.""" for app_name, app in apps.app_configs.items(): @@ -197,6 +200,7 @@ class InvenTreeConfig(AppConfig): except Exception as e: # pragma: no cover logger.exception('Error loading tasks for %s: %s', app_name, e) + @ignore_ready_warning def update_site_url(self): """Update the site URL setting. @@ -223,6 +227,12 @@ class InvenTreeConfig(AppConfig): except Exception: pass + @ignore_ready_warning + def load_unit_registry(self): + """Ensure the unit registry is loaded.""" + InvenTree.conversion.get_unit_registry() + + @ignore_ready_warning def add_user_on_startup(self): """Add a user on startup.""" # stop if checks were already created @@ -281,6 +291,7 @@ class InvenTreeConfig(AppConfig): except IntegrityError: logger.warning('The user "%s" could not be created', add_user) + @ignore_ready_warning def add_user_from_file(self): """Add the superuser from a file.""" # stop if checks were already created diff --git a/src/backend/InvenTree/InvenTree/ready.py b/src/backend/InvenTree/InvenTree/ready.py index fd4aa565d6..2fe3cf5846 100644 --- a/src/backend/InvenTree/InvenTree/ready.py +++ b/src/backend/InvenTree/InvenTree/ready.py @@ -1,8 +1,31 @@ """Functions to check if certain parts of InvenTree are ready.""" +import functools import inspect import os import sys +import warnings + +# Keep track of loaded apps, to prevent multiple executions of ready functions +_loaded_apps = set() + + +def clearLoadedApps(): + """Clear the set of loaded apps.""" + global _loaded_apps + _loaded_apps = set() + + +def setAppLoaded(app_name: str): + """Mark an app as loaded.""" + global _loaded_apps + _loaded_apps.add(app_name) + + +def isAppLoaded(app_name: str) -> bool: + """Return True if the app has been marked as loaded.""" + global _loaded_apps + return app_name in _loaded_apps def isInTestMode(): @@ -157,3 +180,22 @@ def isPluginRegistryLoaded(): from plugin import registry return registry.plugins_loaded + + +def ignore_ready_warning(func): + """Decorator to ignore 'AppRegistryNotReady' warnings in functions called during app ready phase. + + Ref: https://github.com/inventree/InvenTree/issues/10806 + """ + + @functools.wraps(func) + def wrapper(*args, **kwargs): + with warnings.catch_warnings(): + warnings.filterwarnings( + 'ignore', + message='Accessing the database during app initialization is discouraged', + category=RuntimeWarning, + ) + return func(*args, **kwargs) + + return wrapper diff --git a/src/backend/InvenTree/common/apps.py b/src/backend/InvenTree/common/apps.py index d795c7136c..ad1f5c321e 100644 --- a/src/backend/InvenTree/common/apps.py +++ b/src/backend/InvenTree/common/apps.py @@ -6,6 +6,7 @@ import structlog import InvenTree.ready from common.settings import get_global_setting, set_global_setting +from InvenTree.ready import ignore_ready_warning logger = structlog.get_logger('inventree') @@ -20,11 +21,16 @@ class CommonConfig(AppConfig): def ready(self): """Initialize restart flag clearance on startup.""" + from InvenTree.ready import setAppLoaded + + setAppLoaded(self.name) + if InvenTree.ready.isRunningMigrations(): # pragma: no cover return self.clear_restart_flag() + @ignore_ready_warning def clear_restart_flag(self): """Clear the SERVER_RESTART_REQUIRED setting.""" try: diff --git a/src/backend/InvenTree/common/currency.py b/src/backend/InvenTree/common/currency.py index 307e54d6d5..6146c321c7 100644 --- a/src/backend/InvenTree/common/currency.py +++ b/src/backend/InvenTree/common/currency.py @@ -11,6 +11,7 @@ import structlog from moneyed import CURRENCIES import InvenTree.helpers +import InvenTree.ready logger = structlog.get_logger('inventree') @@ -19,15 +20,18 @@ def currency_code_default(create: bool = True): """Returns the default currency code (or USD if not specified).""" from common.settings import get_global_setting - try: - code = get_global_setting( - 'INVENTREE_DEFAULT_CURRENCY', create=create, cache=True - ) - except Exception: # pragma: no cover - # Database may not yet be ready, no need to throw an error here - code = '' + code = '' - if code not in CURRENCIES: + if InvenTree.ready.isAppLoaded('common'): + try: + code = get_global_setting( + 'INVENTREE_DEFAULT_CURRENCY', create=create, cache=True + ) + except Exception: # pragma: no cover + # Database may not yet be ready, no need to throw an error here + code = '' + + if not code or code not in CURRENCIES: code = 'USD' # pragma: no cover return code @@ -47,9 +51,13 @@ def currency_codes() -> list: """Returns the current currency codes.""" from common.settings import get_global_setting - codes = get_global_setting( - 'CURRENCY_CODES', create=False, environment_key='INVENTREE_CURRENCY_CODES' - ).strip() + codes = None + + # Ensure we do not hit the database until the common app is loaded + if InvenTree.ready.isAppLoaded('common'): + codes = get_global_setting( + 'CURRENCY_CODES', create=False, environment_key='INVENTREE_CURRENCY_CODES' + ).strip() if not codes: codes = currency_codes_default_list() diff --git a/src/backend/InvenTree/machine/apps.py b/src/backend/InvenTree/machine/apps.py index 95ab925dc1..7130393cce 100755 --- a/src/backend/InvenTree/machine/apps.py +++ b/src/backend/InvenTree/machine/apps.py @@ -7,6 +7,7 @@ import structlog from InvenTree.ready import ( canAppAccessDatabase, + ignore_ready_warning, isImportingData, isInMainThread, isPluginRegistryLoaded, @@ -32,12 +33,17 @@ class MachineConfig(AppConfig): logger.debug('Machine app: Skipping machine loading sequence') return - from machine import registry - try: - logger.info('Loading InvenTree machines') - if not registry.is_ready: - registry.initialize(main=isInMainThread()) + self.initialize_registry() except (OperationalError, ProgrammingError): # Database might not yet be ready logger.warn('Database was not ready for initializing machines') + + @ignore_ready_warning + def initialize_registry(self): + """Initialize the machine registry.""" + from machine import registry + + if not registry.is_ready: + logger.info('Loading InvenTree machines') + registry.initialize(main=isInMainThread()) diff --git a/src/backend/InvenTree/plugin/apps.py b/src/backend/InvenTree/plugin/apps.py index f37e91d006..86655cf70b 100644 --- a/src/backend/InvenTree/plugin/apps.py +++ b/src/backend/InvenTree/plugin/apps.py @@ -9,7 +9,12 @@ from django.apps import AppConfig import structlog from maintenance_mode.core import set_maintenance_mode -from InvenTree.ready import canAppAccessDatabase, isInMainThread, isInWorkerThread +from InvenTree.ready import ( + canAppAccessDatabase, + ignore_ready_warning, + isInMainThread, + isInWorkerThread, +) from plugin import registry logger = structlog.get_logger('inventree') @@ -24,6 +29,7 @@ class PluginAppConfig(AppConfig): """The ready method is extended to initialize plugins.""" self.reload_plugin_registry() + @ignore_ready_warning def reload_plugin_registry(self): """Reload the plugin registry.""" if not isInMainThread() and not isInWorkerThread(): diff --git a/tasks.py b/tasks.py index 7dbc5ca68a..a1941c2ca6 100644 --- a/tasks.py +++ b/tasks.py @@ -1466,7 +1466,7 @@ def schema( 'False' # Disable plugins to ensure they are kep out of schema ) envs['INVENTREE_CURRENCY_CODES'] = ( - 'AUD,CNY,EUR,USD' # Default currency codes to ensure they are stable + 'AUD,CAD,CNY,EUR,GBP,JPY,NZD,USD' # Default currency codes to ensure they are stable ) manage(c, cmd, pty=True, env=envs) From fa0d892a62900acdc1af081e51e017fb40b17f22 Mon Sep 17 00:00:00 2001 From: Oliver Date: Thu, 4 Dec 2025 20:41:36 +1100 Subject: [PATCH 23/76] [WIP] Generic parameters (#10699) * Add ParameterTemplate model - Data structure duplicated from PartParameterTemplate * Apply data migration for templates * Admin integration * API endpoints for ParameterTemplate * Scaffolding * Add validator for ParameterTemplate model type - Update migrations - Make Parameter class abstract (for now) - Validators * API updates - Fix options for model_type - Add API filters * Add definition for Parameter model * Add django admin site integration * Update InvenTreeParameterMixin class - Fetch queryset of all linked Parameter instances - Ensure deletion of linked instances * API endpoints for Parameter instances * Refactor UI table for parameter templates * Add comment for later * Add "enabled" field to ParameterTemplate model * Add new field to serializer * Rough-in new table * Implement generic "parameter" table * Enable parameters for Company model * Change migration for part parameter - Make it "universal" * Remove code for ManufacturerPartParameter * Fix for filters * Add data import for parameter table * Add verbose name to ParameterTemplate model * Removed dead API code * Update global setting * Fix typos * Check global setting for unit validation * Use GenericForeignKey * Add generic relationship to allow reverse lookups * Fixes for table structure * Add custom serializer field for ContentType with choices * Adds ContentTypeField - Handles representation of content type - Provides human-readable options * Refactor API filtering for endpoints - Specify ContentType by ID, model or app label * Revert change to parameters property * Define GenericRelationship for linking model * Refactoring some code * Add a generic way to back-annotate and prefetch parameters for any model type * Change panel position * Directly annotate parameters against different model serializers * remove defunct admin classes * Run plugin validation against parameter * Fix prefetching for PartSerializer * Implement generic "filtering" against queryset * Implement generic "ordering" by parameter * Make parametric table generic * Refactor segmented panels * Consolidate part table views * Fix for parametric part table - Only display parameters for which we know there is a value * Add parametric tables for company views * Fix typo in file name * Prefetch to reduce hits * Add generic API mixin for filtering and ordering by parameter * Fix hook for rebuilding template parameters * Remove serializer * Remove old models * Fix code for copying parameters from category * Implement more parametric tables: - ManufacturerPart - SupplierPart - Fixes and enhancements * Add parameter support for orders * Add UI support for parameters against orders * Update API version * Update CHANGELOG.md * Add parameter support for build orders * Tweak frontend * Add renderer * Remove defunct endpoints * Add migration requirement * Require contenttypes to be updated * Update migration * Try using ID val * Adjust migration dependencies * fix params fixture * fix schema export * fix modelset * Fixes for data migration * tweak table * Fix for Category Parameters * Use branch of demo dataset for testing * Add parameteric build order table * disable broken imports * remove old model from ruleset * correct test * Table tweaks * fix test * Remove old model type * fix test * fix test * Refactor mixin to avoid specifying model type manually * fix test * fix resolve name * remove unneeded import * Tweak unit testing * Fix unit test * Enable bulk-create * More fixes * More unit test tweaks * Enhancements * Unit test fixes * Add some migration tests * Fix admin tests * Fix part tests * adapt expectation * fix remaining typecheck * Docs updates * Rearrange models * fix paramater caching * fix doc links * adjust assumption * Adjust data migration unit tests * docs fixes * Fix docs link * Fixes * Tweak formatting * Add doc for setting * Add metadata view for parameters * Add metadata view for ParamterTemplate * Update CHANGELOG file * Deconflict model_type fields * Invert key:value * Revert "Invert key:value" This reverts commit d555658db21a9e464125aae4f3d956e514358f24. * fix assert * Update API rev notes * Initial unit tests for API * Test parameter create / edit / delete via the API * Add some more unit tests for the API * Validate queryset annotation - Add unit test with large dataset - Ensure number of queries is fixed - Fix for prefetching check * Add breaking change info to CHANGELOG.md * Ensure that parameters are removed when deleting the linked object * Enhance type hinting * Refactor part parameter exporter plugin - Any model which supports parameters can use this now - Update documentation * Improve serializer field * Adjust unit test * Reimplement checks for locked parts * Fix unit test for data migration * Fix for unit test * Allow disable edit for ParameterTable * Fix supplier part import wizard * Add unit tests for template API filtering * Add playwright tests for purchasing index * Add tests for manufacturing index page * ui tests for sales index * Add data migration tests for ManufacturerPartParameter * Pull specific branch for python binding tests * Specify target migration * Remove debug statement * Tweak migration unit tests * Add options for spectacular * Add explicit choice options * Ensure empty string values are converted to None * Don't use custom branch for python checks * Fix for migration test * Fix migration test * Fix reference target * Remove duplicate enum in spectactular.py * Add null choice to custom serializer class * [UI] Edit shipment details - Pass "pending" status through to the form * New migration strategy: part.0144: - Add new "enabled" field to PartParameterTemplate model - Add new ContentType fields to the "PartParameterTemplate" and "PartParameter" models - Data migration for existing "PartParameter" records part.0145: - Set NOT NULL constraints on new fields - Remove the obsolete "part" field from the "PartParameter" model * More migration updates: - Create new "models" (without moving the existing tables) - Data migration for PartCataegoryParameterTemplate model - Remove PartParameterTemplate and PartParameter models * Overhaul of migration strategy - New models simply point to the old database tables - Perform schema and data migrations on the old models first (in the part app) - Swap model references in correct order * Improve checks for data migrations * Bug fix for data migration * Add migration unit test to ensure that primary keys are maintained * Add playwright test for company parameters * Rename underlying database tables * Fixes for migration unit tests * Revert "Rename underlying database tables" This reverts commit 477c692076acc197fe9673352a539924adfe014b. * Fix for migration sequencing * Simplify new playwright test * Remove spectacular collision * Monkey patch the drf-spectacular warn function * Do not use custom branch for playwright testing --------- Co-authored-by: Matthias Mair --- CHANGELOG.md | 11 + docs/docs/api/python/examples.md | 2 +- docs/docs/app/barcode.md | 2 +- .../images/concepts/attachments-tab.png | Bin 0 -> 35775 bytes .../assets/images/concepts/parameter-tab.png | Bin 0 -> 50478 bytes .../images/concepts/parameter-template.png | Bin 0 -> 23510 bytes .../images/concepts/parametric-parts.png | Bin 0 -> 45460 bytes docs/docs/concepts/attachments.md | 18 + .../parameter.md => concepts/parameters.md} | 31 +- docs/docs/concepts/units.md | 4 +- docs/docs/part/views.md | 14 +- docs/docs/plugins/builtin/index.md | 2 +- .../plugins/builtin/parameter_exporter.md | 27 + .../builtin/part_parameter_exporter.md | 25 - docs/docs/plugins/mixins/validation.md | 6 +- docs/docs/report/helpers.md | 12 +- docs/docs/settings/global.md | 9 +- docs/docs/start/docker_install.md | 5 +- docs/mkdocs.yml | 5 +- pyproject.toml | 4 +- src/backend/InvenTree/InvenTree/api.py | 28 + .../InvenTree/InvenTree/api_version.py | 7 +- src/backend/InvenTree/InvenTree/models.py | 200 +++++- src/backend/InvenTree/InvenTree/schema.py | 39 +- .../InvenTree/InvenTree/serializers.py | 95 +++ .../InvenTree/setting/spectacular.py | 3 +- src/backend/InvenTree/build/api.py | 10 +- src/backend/InvenTree/build/models.py | 1 + src/backend/InvenTree/build/serializers.py | 8 + .../InvenTree/build/test_migrations.py | 2 +- src/backend/InvenTree/common/admin.py | 26 + src/backend/InvenTree/common/api.py | 231 ++++++- src/backend/InvenTree/common/filters.py | 316 +++++++++ .../migrations/0023_auto_20240602_1332.py | 2 +- .../0040_parametertemplate_parameter.py | 248 +++++++ .../migrations/0041_auto_20251203_1244.py | 116 ++++ src/backend/InvenTree/common/models.py | 425 +++++++++++- src/backend/InvenTree/common/serializers.py | 123 +++- .../InvenTree/common/setting/system.py | 16 +- src/backend/InvenTree/common/tasks.py | 32 + src/backend/InvenTree/common/test_api.py | 428 ++++++++++++ .../InvenTree/common/test_migrations.py | 4 +- src/backend/InvenTree/common/tests.py | 23 +- src/backend/InvenTree/common/validators.py | 29 + src/backend/InvenTree/company/admin.py | 12 - src/backend/InvenTree/company/api.py | 149 ++-- .../0077_delete_manufacturerpartparameter.py | 22 + src/backend/InvenTree/company/models.py | 52 +- src/backend/InvenTree/company/serializers.py | 59 +- .../InvenTree/company/test_migrations.py | 79 ++- .../InvenTree/generic/states/fields.py | 2 +- src/backend/InvenTree/order/api.py | 13 +- src/backend/InvenTree/order/models.py | 1 + src/backend/InvenTree/order/serializers.py | 17 + src/backend/InvenTree/order/test_api.py | 10 +- src/backend/InvenTree/part/admin.py | 35 +- src/backend/InvenTree/part/api.py | 338 +-------- src/backend/InvenTree/part/filters.py | 159 ----- .../InvenTree/part/fixtures/params.yaml | 68 +- .../0071_alter_partparametertemplate_name.py | 2 +- .../migrations/0144_auto_20251203_1045.py | 161 +++++ .../migrations/0145_auto_20251203_1238.py | 111 +++ .../migrations/0146_auto_20251203_1241.py | 23 + src/backend/InvenTree/part/models.py | 643 ++++-------------- src/backend/InvenTree/part/serializers.py | 149 +--- src/backend/InvenTree/part/tasks.py | 32 - src/backend/InvenTree/part/test_api.py | 45 +- src/backend/InvenTree/part/test_category.py | 10 +- src/backend/InvenTree/part/test_migrations.py | 116 +++- src/backend/InvenTree/part/test_param.py | 180 ++--- .../base/integration/ValidationMixin.py | 6 +- .../InvenTree/plugin/base/supplier/api.py | 6 +- .../InvenTree/plugin/base/supplier/helpers.py | 9 +- .../plugin/builtin/exporter/bom_exporter.py | 4 +- .../builtin/exporter/parameter_exporter.py | 98 +++ .../exporter/part_parameter_exporter.py | 130 ---- .../samples/integration/validation_sample.py | 4 +- .../samples/supplier/test_supplier_sample.py | 16 +- .../InvenTree/report/templatetags/report.py | 35 +- src/backend/InvenTree/report/test_tags.py | 26 +- .../InvenTree/stock/test_migrations.py | 6 +- src/backend/InvenTree/users/ruleset.py | 8 +- src/frontend/lib/enums/ApiEndpoints.tsx | 7 +- src/frontend/lib/enums/ModelInformation.tsx | 19 +- src/frontend/lib/enums/ModelType.tsx | 3 +- .../buttons/SegmentedIconControl.tsx | 2 +- src/frontend/src/components/panels/Panel.tsx | 2 +- .../src/components/panels/ParametersPanel.tsx | 32 + .../panels/SegmentedControlPanel.tsx | 53 ++ .../src/components/render/Generic.tsx | 24 + .../src/components/render/Instance.tsx | 12 +- src/frontend/src/components/render/Part.tsx | 17 - .../components/wizards/ImportPartWizard.tsx | 9 +- src/frontend/src/forms/CommonForms.tsx | 120 +++- src/frontend/src/forms/CompanyForms.tsx | 15 - src/frontend/src/forms/PartForms.tsx | 97 +-- .../Index/Settings/AdminCenter/Index.tsx | 10 +- ...tParameterPanel.tsx => ParameterPanel.tsx} | 12 +- .../pages/Index/Settings/SystemSettings.tsx | 10 +- src/frontend/src/pages/build/BuildDetail.tsx | 5 + src/frontend/src/pages/build/BuildIndex.tsx | 71 +- .../src/pages/company/CompanyDetail.tsx | 5 + .../pages/company/ManufacturerPartDetail.tsx | 19 +- .../src/pages/company/SupplierPartDetail.tsx | 5 + .../src/pages/part/CategoryDetail.tsx | 55 +- src/frontend/src/pages/part/PartDetail.tsx | 39 +- .../pages/purchasing/PurchaseOrderDetail.tsx | 5 + .../src/pages/purchasing/PurchasingIndex.tsx | 216 ++++-- .../src/pages/sales/ReturnOrderDetail.tsx | 5 + src/frontend/src/pages/sales/SalesIndex.tsx | 185 ++--- .../src/pages/sales/SalesOrderDetail.tsx | 5 + .../build/BuildOrderParametricTable.tsx | 40 ++ .../tables/company/ParametricCompanyTable.tsx | 39 ++ .../src/tables/general/ParameterTable.tsx | 276 ++++++++ .../ParameterTemplateTable.tsx} | 249 ++++--- .../tables/general/ParametricDataTable.tsx | 442 ++++++++++++ .../ParametricDataTableFilters.tsx} | 0 .../src/tables/part/ParametricPartTable.tsx | 395 +---------- .../tables/part/PartCategoryTemplateTable.tsx | 12 +- .../src/tables/part/PartParameterTable.tsx | 254 ------- .../ManufacturerPartParameterTable.tsx | 140 ---- .../ManufacturerPartParametricTable.tsx | 70 ++ .../PurchaseOrderParametricTable.tsx | 67 ++ .../SupplierPartParametricTable.tsx | 52 ++ .../sales/ReturnOrderParametricTable.tsx | 65 ++ .../sales/SalesOrderParametricTable.tsx | 65 ++ src/frontend/tests/helpers.ts | 33 +- src/frontend/tests/pages/pui_build.spec.ts | 20 + src/frontend/tests/pages/pui_company.spec.ts | 22 +- src/frontend/tests/pages/pui_part.spec.ts | 42 +- .../tests/pages/pui_purchase_order.spec.ts | 167 +++-- .../tests/pages/pui_sales_order.spec.ts | 28 + src/frontend/tests/pui_settings.spec.ts | 111 ++- .../tests/settings/selectionList.spec.ts | 103 --- tasks.py | 4 +- 135 files changed, 5873 insertions(+), 3307 deletions(-) create mode 100644 docs/docs/assets/images/concepts/attachments-tab.png create mode 100644 docs/docs/assets/images/concepts/parameter-tab.png create mode 100644 docs/docs/assets/images/concepts/parameter-template.png create mode 100644 docs/docs/assets/images/concepts/parametric-parts.png create mode 100644 docs/docs/concepts/attachments.md rename docs/docs/{part/parameter.md => concepts/parameters.md} (79%) create mode 100644 docs/docs/plugins/builtin/parameter_exporter.md delete mode 100644 docs/docs/plugins/builtin/part_parameter_exporter.md create mode 100644 src/backend/InvenTree/common/filters.py create mode 100644 src/backend/InvenTree/common/migrations/0040_parametertemplate_parameter.py create mode 100644 src/backend/InvenTree/common/migrations/0041_auto_20251203_1244.py create mode 100644 src/backend/InvenTree/common/test_api.py create mode 100644 src/backend/InvenTree/company/migrations/0077_delete_manufacturerpartparameter.py create mode 100644 src/backend/InvenTree/part/migrations/0144_auto_20251203_1045.py create mode 100644 src/backend/InvenTree/part/migrations/0145_auto_20251203_1238.py create mode 100644 src/backend/InvenTree/part/migrations/0146_auto_20251203_1241.py create mode 100644 src/backend/InvenTree/plugin/builtin/exporter/parameter_exporter.py delete mode 100644 src/backend/InvenTree/plugin/builtin/exporter/part_parameter_exporter.py create mode 100644 src/frontend/src/components/panels/ParametersPanel.tsx create mode 100644 src/frontend/src/components/panels/SegmentedControlPanel.tsx rename src/frontend/src/pages/Index/Settings/AdminCenter/{PartParameterPanel.tsx => ParameterPanel.tsx} (62%) create mode 100644 src/frontend/src/tables/build/BuildOrderParametricTable.tsx create mode 100644 src/frontend/src/tables/company/ParametricCompanyTable.tsx create mode 100644 src/frontend/src/tables/general/ParameterTable.tsx rename src/frontend/src/tables/{part/PartParameterTemplateTable.tsx => general/ParameterTemplateTable.tsx} (66%) create mode 100644 src/frontend/src/tables/general/ParametricDataTable.tsx rename src/frontend/src/tables/{part/ParametricPartTableFilters.tsx => general/ParametricDataTableFilters.tsx} (100%) delete mode 100644 src/frontend/src/tables/part/PartParameterTable.tsx delete mode 100644 src/frontend/src/tables/purchasing/ManufacturerPartParameterTable.tsx create mode 100644 src/frontend/src/tables/purchasing/ManufacturerPartParametricTable.tsx create mode 100644 src/frontend/src/tables/purchasing/PurchaseOrderParametricTable.tsx create mode 100644 src/frontend/src/tables/purchasing/SupplierPartParametricTable.tsx create mode 100644 src/frontend/src/tables/sales/ReturnOrderParametricTable.tsx create mode 100644 src/frontend/src/tables/sales/SalesOrderParametricTable.tsx delete mode 100644 src/frontend/tests/settings/selectionList.spec.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index d6c1804cc6..862860c1af 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,14 +7,25 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased - YYYY-MM-DD +### Breaking Changes + +- [#10699](https://github.com/inventree/InvenTree/pull/10699) removes the `PartParameter` and `PartParameterTempalate` models (and associated API endpoints). These have been replaced with generic `Parameter` and `ParameterTemplate` models (and API endpoints). Any external client applications which made use of the old endpoints will need to be updated. + ### Added - Adds "Category" columns to BOM and Build Item tables and APIs in [#10722](https://github.com/inventree/InvenTree/pull/10772) +- Adds generic "Parameter" and "ParameterTemplate" models (and associated API endpoints) in [#10699](https://github.com/inventree/InvenTree/pull/10699) +- Adds parameter support for multiple new model types in [#10699](https://github.com/inventree/InvenTree/pull/10699) +- UI overhaul of parameter management in [#10699](https://github.com/inventree/InvenTree/pull/10699) ### Changed +- + ### Removed - Removed python 3.9 / 3.10 support as part of Django 5.2 upgrade in [#10730](https://github.com/inventree/InvenTree/pull/10730) +- Removed the "PartParameter" and "PartParameterTemplate" models (and associated API endpoints) in [#10699](https://github.com/inventree/InvenTree/pull/10699) +- Removed the "ManufacturerPartParameter" model (and associated API endpoints) [#10699](https://github.com/inventree/InvenTree/pull/10699) ## 1.1.0 - 2025-11-02 diff --git a/docs/docs/api/python/examples.md b/docs/docs/api/python/examples.md index 7ec1059f42..34e31c2829 100644 --- a/docs/docs/api/python/examples.md +++ b/docs/docs/api/python/examples.md @@ -67,7 +67,7 @@ print("Minimum stock:", part.minimum_stock) ### Adding Parameters -Each [part](../../part/index.md) can have multiple [parameters](../../part/parameter.md). For the example of the sofa (above) *length* and *weight* make sense. Each parameter has a parameter template that combines the parameter name with a unit. So we first have to create the parameter templates and afterwards add the parameter values to the sofa. +Each [part](../../part/index.md) can have multiple [parameters](../../concepts/parameters.md). For the example of the sofa (above) *length* and *weight* make sense. Each parameter has a parameter template that combines the parameter name with a unit. So we first have to create the parameter templates and afterwards add the parameter values to the sofa. ```python from inventree.part import Parameter diff --git a/docs/docs/app/barcode.md b/docs/docs/app/barcode.md index 5f470b3391..2645287f76 100644 --- a/docs/docs/app/barcode.md +++ b/docs/docs/app/barcode.md @@ -73,7 +73,7 @@ the *Scan Items Into Location* action allows you to scan items into the selected ### Stock Item Actions -From the [Stock Item detail page](./stock.md#stock-item-detail-view), the following barcode actions may be available: +From the [Stock Item detail page](./stock.md#details-tab), the following barcode actions may be available: {{ image("app/barcode_stock_item_actions.png", "Stock item barcode actions") }} diff --git a/docs/docs/assets/images/concepts/attachments-tab.png b/docs/docs/assets/images/concepts/attachments-tab.png new file mode 100644 index 0000000000000000000000000000000000000000..1eff956ca9e35d82deb86708270a23892c0a0418 GIT binary patch literal 35775 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 OL|Rm3?(h?D* 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

#Vap~KXmqr3*_HW>Tc%w*(O#i8$ z_4AwP(roYmlj(O1@$o72Tns7IB>AQx_w+&!K0p{kv&o17 j{`^-b>>#YKu5bVL7YW?6TJ_=vBYvlY{_yz2@X!ARU=fn8 literal 0 HcmV?d00001 diff --git a/docs/docs/assets/images/concepts/parameter-template.png b/docs/docs/assets/images/concepts/parameter-template.png new file mode 100644 index 0000000000000000000000000000000000000000..a3a2234340a29199942bcd4ef22497ff6fc0529c GIT binary patch literal 23510 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 literal 0 HcmV?d00001 diff --git a/docs/docs/assets/images/concepts/parametric-parts.png b/docs/docs/assets/images/concepts/parametric-parts.png new file mode 100644 index 0000000000000000000000000000000000000000..16d108c23dd3cb5810a9132e61f3de47042842f2 GIT binary patch literal 45460 zcmc$`1yq|)v@c3a6$+G6yhtflv=EA0ixihaaA|QZ#hp-SDemslA_)-OrNt!>+}+)s zki7H{{hxEzJ8Rwb&bxQrZ>>P`<(rv3d-iPk?L7%lQh0}hMTUiefq^3}CH@`*<30rj z#_j9}x6yZqHHgL0|8Cj8fAVFp9&l5g+fOKR^5|rD>0Wf!qA& zb*tSb*9iUPOKI^psxEq4(+@qKE?=GPCrtMgKm7Wc3M(;Pl=rrtOWH6f=!1l~1eV&x z<}`8w>7|j|_x4yFLCAD9tTs7;&HR#@$pU*oZPQvvly?3>E-m#bMMwQ8A}zu71h!-H z-HN-mbM=ZW)-{#S2>?%?bzLC^4s!h==g$@XYIyaqQ}6l%hNu-7+(jAIE*1m4x#QpZ zC?`-cYDQ6s@aB%z^5Hp`eCas)(Fr5Uo14_!Nj)aQSI~Fr#{b@8gN{N-aWEdM-;Cw` z^~^)K^m`T4O&i)4t2?4c|9*{O=@0qCNc83Xx&?Ua`t2{W1@QGdj1M@rf2k_+`?nVj zF`d7Z-47KpHTTwHShSxn~h{h>v zYi~O6Z#%iyU4X&h+>A8Iu+6c{G`8+o!{j{qFe4x|jg8>u>2T$R3e35%pC=9Lt))A* zDOVD4LN@7Af%%Ccr%72Fz}nO0p2n^xrGI(!XjtYF{KW#CO}Xf0Mla-;*2NOkQnn&^ z!wzb(R!jZkBW-=NiNmtBmv!^4TVHqrQ~kocKnK${0WXtRr}{5z8a--Qv~8S*t=xbr z2SK}Qpk^$?_sesQ*=a~|n6Vm`$y2S62vW16@;!t=ApKgD6+$95 z!4S7*u3Ny~?P*f!-z9Mf*SG{rP7f%R6N+#E?CoUmhxLty`5XU)1V^y1<1U*Y)?)3O2aQ>T6%Rd3_L!Iis_S8#C@u%#Gh z%(LY+@$3z>ok{XUad>rsY6Erm&dSR{yNae6^@ei8VPNKJT>$d~@XhR{v`DVK1s&YS=6Si&v9zVMRK-@LHs)kxUdVNfJ zHH`QY7x*k=e$Sl>K?6aYiUmLa%Z|{6R^VL#HyJR!VE9etE{Po!GD;YhkTHxwDrn77 z4SUo{<T0 zB+gg0o?m(6R7|z$W63$S3fwhrYqO_RvljyWfVD1^5US!h^Ih;9e|s{Axg4st&v7=KocN zu^pr8f0_71{J&L}dozD^vXsTU$dQf!$83y&gO8MdbxrYhfze-%nfBb>>+W&8z{a+V= z1Gp>1$e(aS!`!?7cE10z@c)?2QI#JwvWax5pDDK-{WMlI-;5`MnDfOG?`=DFSh@Z*{fvc7uutxK(WzflO{dbw39Q>TKKco^_~fLf7AuxLnO#va zvhFakeL~v~gn+@>@<|mRo9`vyI=2$4=W7%%B-{5!nE&AUYc3OVD;grwEf|5o+EoGL zOzYdW!$u>NSKBrq0k@+y9CB_Quk+=`^Bx;L_wDkmd;N!-`lyQmS@x^bMwF1nP_77a zKg{m06n4f6zX9&c@`oevw@XDM)%1_|+o@0&qm8LCF~?D9h^2OGINa+b zi|VRl+X;12*?2WE+CYDwT31>B+DKCqq!e0)ds1}yTW`R;0D!xyz}F)3CMItx1xs^6 zBByYF73$W?$jT-qCC$37rpU5Yi?2u;j+pdxc8=FLS}H3?z$ENq;1v9yq&w}bw;xHo zO#0EQ3e$u9RRl(v4*n2}#FfMIlG4%xJNw(ed!q4YXZnV=?5eG~lg_uL!yxn-6d3!= zyEU7Ietv#bsI&HcU$76!$KO784VDrBrdoLGvGSY-Ft4aCBQMF9X#%Q9q&Ey9b}duh zW?a7Qi|gU(VCn`{kMgryE9?=~(lKAFHYRNvuYTXB(sAgQI9%z8()1c7H)`7bE`pdJ zD>iIZ-K{@Og~@p1hv@KHlvXo3bTg=ZdKo8{HP~FVPFli}N^tPqDpiF~1^B%;1l3OR z1QFE6HuEz@8Ry37p(f>$KXk39c%u3`07@hxig=WuP(j-QMDvMa|GdD)6JneMRu1TI zK(A>arG3-aXnD?5%h__5eAr`?d>mO5HX*DU4};;zmjU8x*9yTqcy7?61nOJ1i6^C{ z4dO%es7*>k4_Hbriq`CUkIt*8!n?? zKT0|*GBOVF66By_0uG-N&UHZDc}sg=eSQLndR`W~nMiz?Vr*1_TkI2mLzc`rw<8w% zxF0-07~k;HxXpf|q%q5%DtzP^*wcP4D;V0FBQ3oWBOR#@JCmQNend|e z(Z;;2h|p8gXJ&FlWI_d6B}$rEcp3tRZDj#nHNf9*3a)lu8Ma3=0w*g-uKGcy(T$87 z`jkoe$ChJ)3?+5fWcJ166=t18*>vu-Scdv4-i>;mLL#rwS5Ei55KQ`Jc4fr`KssMO zsu$(?+(Wn?tFV2MBkCa|DS?0>pVR(?s4s?_)gV=BaQdiQN|j*WhFOtct|o<32#C^< zcz2*V?)^A|4oDDpU;9~nvD%|YA*l);)Vy*qPF^WIh~Fcto_OU}6GhnU_xb0$FLg$^bgFx`y;dTa4zS(+Q zjV>*NCq(-_A<5%Xtvt%0WM0<%ySIhBNfCTsM1OwTI?DU<3yiOZlg7z*wR+br6WN>l zIj%DJTJP`H>?xz+L}Bk=ntSg?am@ReaO*LyWA*b<4IrQ?p!k9(UDw+iDtir z-#Z?giXuiH>j_$6_Nuwtfbqb-cS~7)NhB1fFx7KG4=LbaY?EFyRQ4nZ>hopzfDq2O zpZGQ8DbX+aJ!h@6Zh1GA+Y>8%G4s~F*UBzkw)FK5e%j0zXBT(9?QPeXwX!LD@lfa- z4S;k&cbmc`PFQ*{=OVf@J>{(OtSsy-VzDbuoWbpgM}fj!jLKo__4Zj(L`sL1uz}n} zL?n^ACt|-{mn|-VV1B1|H`ddyt*s5M67Vt^`m4aoVh+@Yso_L%y=AnSU*;BfIh?n%n(`MjNdD{Drg8ju7UOB-JdU=#40c zT(knQsXre1*zC7GQ|~_C^o_Iok76W9YY(LWL}lN_CfXV=T}2$i)40qdVHQ2XiI z^SeO5t^MOe^9Kl$9?w3dAXGL!$bqBz7Dn9e$CDJR1U?MqR%p(%hy-xS6o}qB! zx9hV?&!99L!R7>`1&Nl=^T8sW&_=~BD(aAPfp0~PjJ^7l!1F2T-w8KHXT9)arPJ22 zXiimAQ!oYdL)+o0si|Rzx~ZutyJpGK)#+?pwV%4aCvdPVPR~s`n{avBdG_iY4oZ!R zIz$s3^w9Xz=8;S+^8VP*guwmxxy3=FBpm9^VDk*c=KEw%Ut^XSP@1@?Y4OVVy=%TN zr#$i%PHV+v1&;GjCA`^U)=WZ=tL#|>trD~5$5@_;j zfw=Juin@R%Cnw*h^4LRL+|qHH7Zt*3Hl2}lf2=jyW`d3(`kt4Qv$2>1O5;B&?odv0 zJCfzixGQ-O;ZT~eGcDPiXbot7HNqWLY^01hTHh zGT7g^HXDa>YC6EPW-8>~^sZNBM#lU>H+$o1s=JJgOj|JNi`Y4*<}?&y^>oG^s$KaB zbqYeAF0+F)6{2DvKoVJ6ftwFqKiF%7?C@*ltTiX(uB9#T&7lRu3^14*NI0BvQX{9l-R8}0K3Zk*Wa8F?vxB(C zI>Yu*W@z0(iu25Q8&8AnwBzXU&UCGQqgUo?(kx=deYc*$&1q*U!RyWNLA97KYh|D~ zGiz=eP}un+d3LWAcx`BoHMs7hekXHk_G)h6rua9QwQpYn=09>pouJwpCqlC~17baW z7O~1)#TZVo)?z04EEghcq5~umblKCksV_&+ttJEPS75U!qw^`h6TS+IR9V&^9n1yKIX8Qvj!F>2loG<`J>dxB4&OZjOc2Hu8B|Z6`dyJNq=E z&TLF}D)(*d`y;%=%PVs;z zS74UQ>JaKi;Gc56NX>2w1I?DX$E@L>pRca7TiQDaNSY+b+B} zq-K0d_QDTqXAm8q24`*nl%stPcSxLeBk=W|1upfBj5d9Hpbs96IViqP}=Ywf6uSnGgEtqZc+yoD7};SJ-9$cOj91tHY|LYCIgzJvZkSvh zSc3J==#+w8IOJC@xY`0{3**gu{2=F^zlWzk$Iy`VUP$wfTh50L`4!s4oWhmG9A`nt z5RS*!dIsL`UIV9QRjXC=8q5{;ewxTAhP|ISVH0nqLda=eWZhEYV z{YjPxc0b%|W6#P`XX~mS*25PBGTt`jNZzQUi+mVTH_J( zm{}Z|nLdXI=u%jswY>wui?L)(Y<72;>xsB$WcYs1sD{Mrxs7%#zZv}8a;B$Grz1yE z1HYaf+}GhhyJ!!j&+ofIp+(&@J%KGod7d|+QTP)KUxb-a{fphxrpcENC-YA~&j9ZKT!6IVg|9oMJAHtWm>0V3 zzS-C0a!F6Pc9KLTd38srFZumVKG#mO#X+j8#~1fIZsjd}=C!l4Lr3zZB_+X$r50$I zfG^+L!qPHDA!qs%Lt$Y2f5iQ`VGyju>~jy{u=d46H_t@&7!E1mFr;f@%jtXb$I@|F zHikch#_>NIOkA`%Jh%v${lIzI1AF=kGf$Egm@+;qG;99Iig^KSMsdRqZ@DEW_e7l? z2medQEt>~-fcD2H7|%>h$kB>&^KW+;8EAmT$%BsQTEH+IWd3EtuSBN+2qnM6TB`dF z>8lUkGq3W&fs_$X6YO5yJZx0rWUlWxQD&|vbQ~>rhISNmA!-GY4~=e5{7s&`Ew{M@ zvo|72&OEM;M_)HvLhI=x{~$2IUv4@HAD{TyfX+uO033Q*?Zc6|&>IBstHtaE*o?tA zO4V^~%I>dw-N!LOS2&TQNVR|7Ms5=?jm|&-4q?%73X8g1-Ozf2Ah#*bmLHr6f1%tr z+fUT5V5Y(^grW5(S^z=U#SosrALp(sfvZ*{nSEx`MaNcR5N`i_VfCI@{PVj$#U z+U4o44Sm#yt@tNDEhdTTdCCI3KTxO%Ij>D|+K>IPk$XR!u=&(@TJFVorl0xw)VIyR zRhGo(QLN&Zxb=k=-L8J2q)4IX@{i=0g7VkMIA4{8`0h2n4W{DI4Ymn7vA^E67_^F< zi{S6L6g6n~^xh*9YC|`$#Y*>AaNrw*I~<7#pp~vlRi@UgHvfi_^GV8Z_%?YD=GU*p zkXRPgku}T_q)7o%wJ}pp=M(LV#hhj4)I6qCej$_Tq1@RFkw_{IINBd<7Xkn)Xp3AG zmSLhrrB;#rr315}zgLv8kG=ELDDUFn4#mc?kP?&8;vfm}MFd7FJHeHlwJjvX*ZdXb zqyrRQ)bD!QoF6QI$D@i}Cu*VQ@F9`UhKEz~aSV`=-OGYJANNxt#rbQ2qcHe{Gqxzufe3tQnKLRUxHrj|Z4*sM(9BErJ0a306 zXm|ql9$!__0Xe%L`?Jw!#;B{dUW7h&69t@+e-r&V#5!r9{(U$n5e+*q{Rth#ycB{P zX;v!N@zo4PrBc*yWd9HTW-+&qT5JysT0;BV;|Cu>_Q|z7HL^!k0!~|UWOo=-30%}c z=}tNQk!x~vdqeKU3D(L|mIcZh=eVWH-j5^jb{T-dHiO!XugLE`_Ak5%LOXN*$-r+aC%!xQ0ZAFH5 zxV9nui0nsAGb_JFYTzF?^l;c>xT65LhdJ4j>)`7TA9y}ftWt*p$DV1F^1*I)FUjk_8UcH z>D>%ui|vR|qC+k%d7NH@!{h+Fcn-}m)#oq#@VHDC6eVCHh{~3;in&U3+K?VBEJXb; zUS3m&-i)==pVHuQU(t!1b`-RFg$&@jT|OEJM@JF~(u18*46UXJ+g@*EWR7Fo;SQKz z!u8i94M}1%XReE^{Xd8n0^TbNAY2SlwrzM}kO~;F_^k|doT@M{$;^vCU*QXEd_DBC zi|hqG(>FXWrg%vR&*WQ}4dhYMD5<*I4P5kC79B(>0f8QVy{j<0n(zwY^fa1)%InAn z1H<9&7blEJCH->6G~tEA5T2P=Q7fCs9+E{F{G}!RpYo;GBBW(Gh#fCC($=>Q_!XCP| zid+xl9US%b1lX_H-*A&kdCZis{kKEWxVQgj@(}-I$i93YcE<~ZXa2_Qq5X##(rxjc z_4@l^XCC5j!?C!N_+36U>V3P*8Pc11lS6P?0Q(1Ar_j>@FQEvdmOgv5nKdFaQ|w_o z4b^pTi%n)2Tw{3>3UMRnf}2YmcGA{7fs6DKrfF8z!2S-?Y)z&AYQrM|V}c5zlk?Oc zQZdlL^ybFN!0_*zaEJVxLKUqV`J0-+@c#UtjHB9&_RrT8;ht-5E;j!p3DN=cbZ@1K z*-E-xXBw0RPWwR0^T4vuJ)=6qunmcEgT-<&;lP`&GM z9F$2QlqH!AHJ=b5=MKPcF#HB;vI6`%lxa&s@O!H-OuwPN>#!shH^}} zTcrp53R*l70b1iTl@U0RY{|O#$k+3|F3BW;FY_I(v6s)Y>0?D9qGSx`5Tv=nfXPRY zMAyx9F?6T3cRvZbtV!vm+FuO8L0(O!erf8_X=x1n{fFldc@&cDf=Fm3T`ueKmhOmh z#(#XX-8U<^I|JsTdVe`HN7Bf@*|x2jX46qKyj-=TJGtj7qZhFtJnymZgGG)O!i#ORqLqhuO{gi^e&v?I{C3 zxLvZQ37GC_nwaEf+V?g%`sn5D6*%)y^0`gH?nJg8&QJudl!tl3Y+GlCzeL3#4xbJ` zKNzMYo_L4g-E6Zy8F=@!cCgm7!RbhUg|>59AQL`fJIovkIij5HR}bD2A8$v<*`^jy zoadM>%5jv#tUK)|4o5;J0-T2^4Jn9`dL|~EH`19ddztP5IeR8hv$XXF6P6s?OJV1< zo{OJp8pXjGt|~lvK3kb`Nth6r&Tl0#TNH-~TRZmHlW28>!4#tRgB!=m4@p757@>v{ zrew(&0QF|zv5XpC{jd*SBNO07RjB(+ogU;|l$B(=>VPUR>pKi?^dHPXv`FvsEg%d4 zq}_XmNBE(nFBsBI2AQGxuKimxGY)T8==+OVZJ@5sP&w-6b75q{#m#k;Ef`dv;`tRX059h4~Pk0cb~3D&9I_a0hozl zRkKxE0`(G9+u*pEd_7K)W;%vKw`S9viDXj=2O2;`#_Z~$=W9BQl>n&6neOucH3T;eQcfh!+XKR%6P~z*{G@Bdh{PIdb zDFvP5a-Pg+Gim@*=^s+Oag9nRTXW#1bzg+Ihh5Yr5LT@L7j8d4D@Dk?te4awS-bz1 zx6p%cQ%ybHUZ+?O*I#nmJ>_gjp}~}%Af^L=%22pK>W|bj z+sP@_fg4W#Vfhebp3&)RKyUPl>!urgGwx;2cVo%imFCn@w!^xZ8Xg0>QVIDv~nYbU$!`Niort1un~p9Q@kpIPv$bf}(XIbr?5VN4?CFehQQn@V@vts{mD;}vF` zj=YnG=aORv!7NlKc;*^&F%)0uxkX&nO$uitr6jbBUX{1=(w(xDk1lhj#M25c+I%Zm zv%COlm63c>fSm-f?hRSKPMWgOfpAeo^JQoI(x?cOOYaYLCZD{!1pmXOblFXtuQEL9 zRy#*iS!SG76TSR^VzmnvoTfiZJaUht!}>8J+lFx z?n;+!dzzSc*w(QhqqnMWSn-N_C3aHh9dluVq~!!O#pNB;c-%`%cyZRFqt-k&A?uWj zit`d6rhv+~oO$&YGQ7iMv{~k+C|2GvbU(%X#XVDM`wa+@=b_km@Gn{WXnp+;ughu< zD3cCTId5tY!rh)aG_C~hXPRz{=;h6n!eNhq^`^V_mZ-d!UB+=b)RM8)0gN@DyLyOI zC-;i?!@YXe@BOs3NvH6ZuT4Tk^ocHF>{6O>and}4SgIZz5SV#mkhXb9=?ff`Bm{RI zj^Lne8fMDsHu$5Xzm(n2r!P7%ehpNZm%NLM!#EMM?j zbj*?glrdKGKNBk;IUfYhvJ~o7mb}fr4r(SAN`l&Pp7lX9GHizv8?PL%y3u-p=qkr@ z)5+^SYb0bO|JcLd75F<^hJp>fbMNewMkDW(;e zua-;RDDVN}g{PBc#5~jGfevIAjY%yzl^2zPJST2H{l4v%8QOF-0G0&~*!S0~HVE5+ zZehD?%#u!$ofPqOULFnkh=Th-2~Ov9xojD`1@NdY!Ozwya+|7&tpJfDx#&{CB({LeEUAX!Gjpk8~ueczY`m8IFko|mTM4YX>}plL(e9xVvkcMzFpWe&Lp9sB6= z!2E~3lWetTxBDBd+uPyDBKQb!?=tGy?^iWNPG4rg2exnjX6)2Y@P2%J2L5B~%pwu+0hYgijq&?hb z;Du+ITsw!K(%4J2KI@#@jTEqH@ADYfY^wrK&NAzDnF6?=PD^yVE6{EuaKE;fK_lesBDE%kvs>TpQSOnmkt5 zcY>EqwuO-Lo#lV&oqEfJH3m0Y(=C(DEp6K=1STaHEB z=Jk6KohEpyT`^G9UU|rXwtkL{;oExJYiNH@e>h80Y1o9SxKH@tdHLzEn|Dcw-Muk( zw}Gv4{j;1OjhoWj_Vtts6rA0*=Qa5czi%yiW%0b2^h*b`)mEPMg*KXJFATzn3`3+R zfaskKt=|vb!p85=xm@V3oId{vYOLKK%F{xNqIUMw;leCyMS%7a$g0t{QSZg@2d=^k zie*I;q^x})Z0k;RFG}3z)?6K3T&je_KLG>=Eu#pW@33&vjp*dh_C+hRPMvgCD?W5y z23Au%AiT1=k^WLfP4R^~(Cz{v)HWX25OItWF2)%p|KO-|%-&82;_=hULc1~!oFAoV zS7E$`h<77B@3x5rQ@?%&r!{W-z}N6sNBGgMm8smo4l9VBq0oZUH`Rop^pVKbIJ9MT zXp;WZ^bvSXJWNWs>e-U_S#n+o)r*mGiX4Die zrEpOcrfDJIo*0>;(cHv$b##K$#uC%%6a}lYU=eWIu&HtXJf9pv*DQYe%V#%esW;4t z6m!yGX$@ZnX#6vQF%7l6=Y-J|LZ+ARQ8KL0UT)PTWL$EMB>hVKbndF3^!jS1*3}j} z{E6h`T}=X967=+I;MKpEMA|WTJJeL88f~=af>kp zwfN9II0xC|ztOm}U)gmLd=6&5b}TWZg30iAg46#5fVShwrUCH2c9fWXVGVKwEd#b2 z)&x{KyzR?&B2{avmU=Gxf!%Cgo5RGxwh`HaC|-3BlX5s@@Sm=vitp(6;?iQH15wq# z_1T=8ki=uj9t9Ipue~eO(=@nX<)@`8%l42)+a7H8z$FBg$LPNWu%z^Sw!@o+)jB8N zs`mXLJ*m<>vuC5GD39}>#Dq^Bb~VQqySmvmFQ*P3rVZ;a-XIkiqzru980jjR=#v2G zOVqSUY+Q;%ty&>Zcj5*sl+xx-n%J`IzSGy+(nYVvmmq2?j)vpWuj>|enJY&#zVAF5 zTp}J*Yg%zT?)~zr$HF!uOOZ%#V6sI&`4>ERAR+M2DCj?*{r*Ls|EJaR=B$O_CoVVh z@P1YBRUY{6R>t4x{lU*a$XC`MnCc`0!bB#hbkf@9b`6VpJH$!_Gvk++mn-B9eyXf| zqAsCsA}LD{457Ci7GDiN>+%&Z5>)a27A#(rn$D^L;-sJ(d#L13`kkiRA^O7t|9Ht0 zkOCQ!RT=^OQpE&6y8(9or!)CaHKeq!3pXs^TU1)+bj2iwOhm*&LFww3H*BWVhAkFX-1$T3^_CHQZ%4J!Kt7;4VLauc&V zXSn+mV%#fda&Y5~s4jFPj&=}K=-l)Pwik3I#WM79SM4VLcAwVe+V^2fLt~o-cY-IhqdVTuQ+E?0d<0EUFR`{9Dvh*}g544kxh2E;1|6Ss0s2z?^=tea`QB`wMiB>Mye zw6-o7TrZp4mUg!R3Z@Rugb^{n-dE#wa9Xzi4*uxZTkcUwmREk21@^p;hetVv+WK;J zO3ABpZd?8=oHhdTl`BsUS47MX7{r}aBHhMwR(_nc;H56RT`#DO@H9OjPArvL9&v38 zk{B%8+RA^)GyAyQo_7n()Gh}ms^#329UriW;{V;q;&sm8P9eSJ4zLu804Y_Cf%G$9%j@P=(?Lc{JbKuB2E!^AlX-PU{EYx&Cex+n1?pzayy9LH zuV{u%JX+R&im*45{M>oBo6{+;jq(XdL+LU`)4;wreOtl5WTSnG>@6*)Lgrnfyeq6e zgiuYDh+wHq-&4e(Ljg+_fH^Lg(@L{d19QSA22j>eM=+VnpK%ffsR?!OZp@!B+b~d~nN7*ZI74K`A0C#c_L?_%%=Mk~i*PHc<50eUrkdtBm&* zdXB#iba(()VHT!!8a1n{0R%C*3_?_&rqNBNv(jtjDxp8vmvN_u<#h_pYl(6WK1LP? zIh#)$1aK0{u0R7LVg{Gq02c8R4A%1Y zdnp}G@tR5V@yc!bD%BF7=!_vSl@73}T0EbLDHyt=BQ ziT}R;t6JKi!bAbnz;!jLDSL%9f4*NGI?#a zTdtBUqoTh-YzZaD;QF|nG@Zx;9p)pYq}X1U;-w`ceb4o~RKV?V=e;5rrxnYr*IZve zq%Ev;a$+BYL7lcb8k1P>AxEL{LjL;JMrKF;af=2Y!ty&PCraT#Hzph2iQ!%MVSFc3RCbs>jO`Yv-_S$%&vmS40Gk2xm=~wzatFTb6r46A2gP(%mb&*`B>n&bC^C4i4=UY%AvT7 zEyaexpF>HZuUrbvg# z56mtWp~~9uR_e1j^$*2<*++K?Z4H>e5yuO=jvVJj?2 z@Wo+~0_=2?AtorSM{I#t(s9E(w!q6=6foJhJZjhCQoWN!bmoMW@-_VeQ5rAp zw;hI2Rt_Flhv&bA>ZS7uIGl!TM^mH#L*eM{^_S=uqTpt4Xk&J04rw$Zx4!iTkA!{#onnyWU4Hznr&u z`_F##znEOGuoie~j(P-%m3v6~gj4kCrIO~MD4fSjj~V+%y~B{(6R^Z@aqBlUJJ|$w zQgTfeA3Y1gn@rdlWcHljos$;GO&ln$W2_e;TiBuD+r6MmrC_R(t+%Iej<2v69$BF; zj1tWzYxU8Kn^wm7`*Crc<7dNwhL7SyuMTY3Vr2ywRk~gse`DPAUc>tlZ>ma=!^%l^ z|CL>^Pao8f#^3Icow4}G?Rt(@J>rE2J0z`KV!rQ&KTO}!9i84;dYSm#fjJOV#ZgxC zGDZ1|giO9!&6FgAvyC$OsG03ac*o1=h6l}oRTP-m6wc8JCR=$+6x4uxej$hUr;EAx zc`^3EbQ##Q@PQbY)luXzu+&{Z29$Bq@V;9}b|oDf8%L6nfJ#G9ZG@gD9xnS$NZC^O zUXha@@~dRWqN*-J8LYs%;Odz*bPVukgoq*>86t&!MFqqSMxpI$+P!F$CaAfmsp$Df zMNun``wBX#xM31&AniH1fd}Ujx=OYvYU6LV-MlXCycaC6zJlVdCURF!V#76zpaL(A zh+Ww6xd&&48F%?rnC0`913+A|4w;=Rne59mjZhJRHY}Pr)gxWqspF|+&N4oqxoIzZ zGEd5VkTw?w&sPll@be%9o(x&=tpj3UjNoIruhwb%#8U2SW5={bK4;i%I*jwgzuz(^ zg;tM6mTGC}Gb0f89F1e~jK60otha+j@)D>Ha{NVfvX2t7Ki%C}JI*OD7=z)BQ#Y&g zR>K^M;W=8c7q{BD>~@MPPsQI^DpKhAd^A88)cKETWZICp?MtuF1izoKYY6B{=9F`M zo+zKcAv@+z`815oQ260fm^mrxp@>VD1TC#|EkIUFAxjQNx=bg5zXCR3S!=m0Mb|QA zdryK$V=FV{1$qPf-j<7d5a9$yS|=hk6Z?pdvpwnCv+mhFZ)##gjjuehxSBl^3L^WjdZlik zdiMOp_u7@xU#5ID!ks|j`a)eTD^`~2f?}y^vwHmY7Y`j}5tRdI(}ga?d##Z*bfi*D zQemOeI!#0}O3XEp{pDQm^!k+YQYvIkP6RTA{hhsqi{&Rz6(ebo-e3mFYS^{$_BDL1=U?iqd{ zh)X&>Hfh5_7o)gd*sNUGB(`fP?IY6{__~krF%@}Rbw`kz9RexOeHz96fl!u*K@w?i zQKNlhOUD<%GtuGCoA&PizJ1A?qIdhiq>vP5Qyki%)L5;WCG_6Jk&3h$D-NDQe%40R z$eP_!DYm)59W0aZEQkz(4URN33%;C`4i#_u|wC##e)4;I-Bn;et-?!EX< zh(|dDn*H6JNzQ5JE!A~vTZU3)`HJ)KMBU|QR}t`6Q_Tw-rA=6pMTTh$GNBFO<~qp# zDk=fKws_uY@!i%}oT60lN{c1;4Ad9T_`I2@^g$|0{LzCu&oE^L-Q?wT-xJAN>(=w$ zy10a(h_33f+~X5ozA`MZ4K!fM{>4v?GP0+`nWBs3u@f^;;zy;RQC{pk#DYE@4$;V= zKhR|=()#&kP69)VrZP@}&3Dt>n7dC@B%us`{;a($usyfd5$=?VLZXpTti~ew8QyP- zM}N%I2y#j3Lgxtu&x_HtJ!6CNI)j}w-{6k{v2N{_?$4dpD1T+Tko&=+1(bDf|4g~Z z`5C}PYz2(bNJlo?7h&m?6@eRlvZj>8x){B;3!7;_SD6oHN2f|8Dbq13Ld5VK7h~6+ z4}De0pn-F+pxM7O!G^MPRTzoX`P_dZb)d5m41d`3a^Scq>V0Pb1YC{Tn&Y&k`5d!&?(is_fWu z5L}(UfO_*ge7-8fK8B<;zL>iz-{_~VG)r5bk%zSoi)(fD)#Zt>rD$VPVfB{%sQx^x zCj#^Rn?hkXBcNs-q|S@|cX2X2`` zQw!o>B=fMt$FifMhnp_6o`192`tn5Xb5vM`6FslF(jK&uW^k0M`;X|e_!+OAt7>Bv zFUt01=8{VmEzz^#=~6VwP7VY{z9+3Dz1K^D`9>AA#MP$zra0wZAgkRe%xQFfQg`!v zl8Zp^*g%~bAn%R@zC>(5gA=R*=8=jE1U6Ea^FRs8AFbR zv_3{nO+~d@%Ze=PTBmDz%UA{Xv@?y>aCN3#98u15C zG5U4D5(iZxY#(v*Z~XaIUEjRt$)l;yQU#n>I9&pZF+OGEtXl)(Vx-8|} z^F^e`MJjjS_r`mQO77m8sC)!46@dMCYqk0_@g=$5_otfows^ zl7~L;n<x`J`o!NKFUCH=S7 z>CBIT{pYk^m9#=O;^~-Mi#e(OKd2IeqeNS1sb^6?U11a}^Zx3O`Ps-8{TRdr7{i-Q(&pYve|yDrmBC3K zLs>YND z|EXR@A6mJ8y!(Q{JM$T@hnz==8ZCA=;I2l8)Sbn$dKs4Ene>`bz2t+B22jza~J6`A-M`R2C=o zRP6i8quVP(C%5gYr#@A7z`E^EHik>{GS(AJ)6!19xkGDCO7W0Jw${2S@h!BbHyH2_ z9CQu&-C?u)q8^ljF0Z;jQt{a>X_}_Q#H|i-rL`~GR_lP}Sy@=NX6m(p!-Y9%p2#Rg zuoXA?-)gEK41YQRro@dYz~>Q1P8e}YYT_|9l`<*c@o+2|y&^EWJc{*c+ILX`t*)Kcd!$OrlL zOzz`hX9MdirKRt%kIP0JTu189!Tu$KKo~h2vCRk9Hg+`l%#Ud+cSN<-)GPh=z`jIQ zE42VaDl>erch0rpF>Ljbhac5g@LNC zlB5aKeDC2LxCo-FQuFy-^H*Aw)7sGo`{u*#1AB!pw{%Q*ewFr;0ZbgO*2%sLjkSO| zeAP%es@zArqs=!@HZsS_b>w>_PZ17)N(0NEobwM8#_Q~r^AZXMotNVTby!uNtFdVC zFRVP=RDYK$NH~4kz?Wvs15G1b9+E+TH3eFD;j^rO#}Z{FgWU#*#L4A_>HTm`8QU&g z3~vR4Rtw_<*B_I-+OB7XqKGnsP2A-b;{)n7aCEyQ#&(7QawFnE+@aZ1z~tQ5mhe!< z1eiEVybCW(Cj7~Lk3X6*J$XxWew0w>jZrw7(w;~y?)g?t{PM)UyB=i_w{iVcwEq~P zsm3Yr_>Wv$p!c(Bn&-$=^(>WLFCT-#&@(=}qovNp918`mp^>H46+$QWwb<38szmgu zhdrpo+vlu1D=0BlNszj?Xj`onW;_Kny(qn;??!i=c*Ps(y>eAD9c4yfIXJxBJA)(3^$p0K zFMW2}Y`|KW%P%bQ2_rnFPiM_~o&b*CB=bk*7Xa}*>&16DBq8&*#)KV-lZJf{zJ_CyGD+TxP2qQ;- zqv<8bBpt1)br`4UQ6`9 z$D0)osPvSE&$jW61xHhdy)-iJ^QWQmW+_`lIGx>?U zfV5`exOj^l%d7eI2dCvZW$9&Oy-nmA5oC}2`kI*H`<+!M`C zGxKN=p8kakZdH%}$K3WwAH;|g-91A4!e(#QW|A$&@+G^2BJsHP6xU8;pIjfb<(`9a zbq8MehY63GlJl6}Q{eF7`Eu&%v9#K!$3F;8AeM3xtDQHJhDx#)CZ<9KzAD;>-e{$G ze)(zz41dy2`~V`iqR8m2BB$_vW1-OCX9>@d^{H6uzSg1yzwTJ+4o$)JD0o%s*b&{<-5tg!jrj7TC#J+VnSsVE)9D$>5_{ z7G{RraIG2UsCVir3ZEFHr)_$=+ISOzqOY}b5WCb3b3-Vdisf1Pt5Ol^l(%IMjL#+xbj0;=9kG? zG-5_Vd0p(lQ`?H|`c}y`E}DGOdhwU8cyeO(=oWUGO>S5ahlPO0Ww}VZ{&C-D6_Sik za-!TLTHp1%4}z~hHJerpxw{*mO<22H`LNH(GXz9)eK>l4ah}?CabcZU-r0ftMCm1fnTmK*)W$_uN0>G z!t9tp1&It{dC!FhEH#u=6hT9JwCaxmHo2&NBZOLK>p z?UK|^zUvx(Id+cd(`PLelKSv$lan;kaB?#2xu`HNtTa~W+W8FyiPQSpMSYh||DO%t zgdiu=<5?41CL&56z`c@VHKA>V)+7i|Epr=j(APL?YIT!dewi;Z(#@2kK=uQ&Tv)}4 zcs?8n&J`sqY^cT<=~@~&&Img^dS_KMl%N7fSP?Ebx6yn0eVBHAQK73Ga6%XhJD?uY ztIXTY?7UeG;|}MnNW6Xac;y-V`Z;c=D5W)AL^@rHo75BEm;h*ZPpyZ~ zC@*A(>?O^Xw2#KbeuJB<#oq+uW^^XqQiP-Siy17$B#h+XLW+*>J4)v$d2Tm)zpHvh z=m6+iX36^&bYV}=7{;z9qc{&V&m z2*w+`{sH&Rl9=apMemD+dR6_|#s{^s{6AW@(jS*tKSm^`8YO5z#+Z-2cHf z{7q&5pUlgXWfjFux{Mh4DX%PZXTg`>U4IcAU9&$9W%OC^UjcGhjJErna!olAX2&g5 zMh`C=3T~dqYPgOV`%Ga`5}f}~=>~y035Ojqd=Q8*U6h5k3v3z@|J3Wi*7yj|$>3$S zNswS+S$A3;dcvK2SIQR<8i?ET>nkhwaQdGF;CFx5-IBs*<)Wb1j}KW^VGw>kzQx7G z)75@?PQ>m2IkU>>MwQQI?NW5W@%)g;7GN8^xwl6WA_D>eL46>d7&-!B$Q z_mtMHQ5!=VA1;t1$i=QxvLH_p{)EOBV4JqHq)q{`jqZTWrQp?NRSHnSc;(tbsA<;e zLI*jpv6I%G$v{m&u6zRYf+Z5n%<_X3$r||v90?PP01j}bEMiN^QDKcCNCSo(8?{#- z@3L8)SryqsL-iIqbc1>)IPEMjSMW9LayMyVi`98CLN2kZHs)(ui)|8Gmv4Sa%32B} z-c{nZnifq;QX(^_s%w_UzBf-E?z%Z7J zd084V**n?o7u}Pr6*+S$TPVHgzvgEf*la=?@YBtc%gemzaaQbwj}?tO@_k)uYrO78;>rfGhcG^L~}J1A>< zxo*sGFPBRfU<)Kq=u)yD`B7?7r7}Yut^e|o#{EtV=aVEsrzyx!`bu%U(jzW5``X*w z(ly^4$3*3Ic{r3k@W4MhJDN3GG%M93z55BD*U8>^6Ji&~(%QG?NEr7Yx|{UTq;-6j0$HPCIp3`y zB0jx$K+Xo}jm_fYx=8?uQo-ySLA!TT@hK@scw5+v52_IPloNYc?+#zxuW9ZxusnGi zXt}uP0X#g2N$E$c>}^#XiUoJ6LAv_)Niycslj^*%sU}HeYCMm}19?{&bl3g%?yUe~ z1bXRpG_#7ni2aYcpvI~4)51<9mJ&#``lFfKefz?keB`s8Rj8sv@y;S=SI*B7oRk}lEY{uJ4=w{;X7zRIUkXX62v0fG(;Q8c9*p85O31hkdY+Tp#jo8rA z!F)<>`w5fB-^)g=H4tUEC{ZX06AYyR zwobNdb#4F%nCk1Bbrp`Z(3yJSU$-zHExtKil#*x7ufGOe2C{v!CcTFomE}s!^<%FU zNH5bDzX7P=V1H8f8Yrn4bXBQ2uC0Zt>qLj6PQh#b=Gcrye`l{wjY;T>lS_>LTxb~I z)xz^c!sTU$FYcV)Y`ImcV&0vs_c%K*Dm`5@Pr^7GDL9YV@8pjOQe4xS= z;|*N59P%p{t8KHOylnDEf91PA3859Y-I>+xTw63oK1|kqyaB~W+cjnVK zZtxViTi5B-e6+;rBo;V_ah{^dc}X$g0yo|sP7u2X`n>A&vj$(74N$?O5gH zS`I_gGKcE*tG5=>JQaqdk5h{`O0$Wq{AvE9j+J}Xw9PnA#!*N9Ixynq}< zJx_%ZYV4o#dH7q;&6v}63%Z^M$zAS_ zMlLO$e*?I?n^XF99d`Ws?(S7n8P*LBQ+10=OA-kD7-zsC+uCrE3w#nKj_o#$KG8Ev zhCy%7hhOax(#hL;`3S+S5?}>_CD;sjK#Ld*x|TR%U!$w0V@c>xd)bmE?3Z(TrS|KtwIk{dg$%aKYYC z>~kLb?aGjkP!KFV|o5;`du{yN-nAX1pE{@0$1Lv0~b|% z?z;Yiuc)fOU@PQ8rBM&_wFo@D_YvndZkD|rr?s*tJAiv5?vOgrmvOwJ%JbyoN#6qF z>DOoctW-uUF$E@>nUlp&7s#l3sV9_YOS3ul@3I%Z(trM?TL+4)WmRbzm@QCxZkW!} zT<}6$%%MsY?j*Q7tSR6a-;o2Jdh>OeZr2%z=yNHwnGZflp&xkhKs#Vr5(vn-i#x8e zi&57M$l?3sba~hP-uVP<>m@(Snxggsi@LL7rN(b{W2+vw85QmBFr%(p>k_j393>C- zeJajY<#1>=QalCr$L}CdDzWp?vY0lwc)_?KyZ5x;sTg-=s;qw6A6C6J2nyeMq<_Mo zC?(iyE!{gpz>f*~qtkTY;iAus2IP3-mfy+?Z%at=FtKuaVTAR_8qX;iXh46k|HTv0 zc>0>i(2P&Q{#F`Pk(h03qA7gn)zL2%4e6aCy$HstJpxSIQA*+N9C-LeI~`YN5|gn3lX5%~Ym|c5b)eDW3e~6`;ZvE-0%F zymnqLJP*@b>$_`aTYw2_jen&h6*zrm%+TYBMjnfp z4{L%!Rs=ot4kc^#OtBKUSU}=&vGn)^aA+Tg^H;>~F5PGAk)_qj0Uj_krg9xJX@ZwI zo`iZ=gnP3x^}cwQ|A@DGTR}e26}b8Gu8M(i)yubl|AIC9HgE#faA${6JbD%eA=ZKx z$~8rb+%pm3W6UUd+5(%}nk|nj&xe|NQy`i>@aF zA{3Wr-TLA8M@V`D2l^eLH5R4}g~AXgb++-xy8#;zL~Z|~!@iO0c2Km~e!FA9(P*4D zkZ!9zGTLVqti_id6ebz*+k`@-03_jjzGlHjd(&-C%-hxYcravVXGfF))-Dc-L{=6+r4;6{+~F9gyc! zarKNg0KhDKs;3yUzP=tUj$a;~%N`rkmBTh9_h&$Q=6Ad&r)^;f@3At8M~mRG|V=6f`;4~02*gDp>IFSyOixlI%H*Y!@3E>G$<*agK6XC(Sb*7w@Gn>!UxkivJ3vG#k02UFxyKU zXTrRzEq!vQL(>njegXKHjZQYY4_bjLG6oqz8~5jp3HQa86VR^{CO*px6BN}Lr6iuq ziJVU#`%I=l0uX9syq-W9a_LSOyVukXDZTK)_!`W9y1up{v-fk6yf(tfSVhI%-hKl) z zc#0=TLA}$V<=w{hg_nkBz4Dz~`rAYM6Eir@)xGj7pbJF8*}#&h4T5dm#h6jHpFVlv zCOo#Z1pJl{=c4N`5O-Q;K1W4UddlYAt(cW}=OvfCJP0i}LtR5Yj&Ruv*>%FD39#WS zD`vvbS$9WZBn;=OLv4>fXPZ9=>tixaXoybi7as>9);U$f{|?AV@lDG-5)T4mpQo6R z$LKjG`7|#tG#tpA+(2(kRKX3D$7-Wu@>Mpbs<&cP-TB}K46wEh_e0;J5$&Qx0bhV; zo0)lI{JHxI3pM@5H)^-&dgn5-hlcLuN+CM6_?D|4;sHw^s2Fb)@Rd35AVe%2Z+x(I z8wA6A6;2xlLMT;qPTx+(!4gGn+x$r1Y?I6EmZhBd&N^>z5^u46A=?;`MbUO?C;Bg4 z%;j15b{%lykP+^EKc??Q}`n zL{9y20scFEJ7vgc{QMS6W?Q4R^XL&{uSMh2$?AZu;7D3y&$*!EdeL$x5Ddj+Nv6Ld zBa-5Nz~pd_Lf@mkfoq~l9+~Nc!!`;R%{8kWV?^@TaD9-G!Y@AiVP2%gNH3}It=*K9 zw}oYT+^3CH%*_m>{aqZfMjM_BEJ>eOF=8eD-=#PCfvr+&MJxp^y zSzM52@VhBaQwxH1o0|oT?`KN9GmWB7e82tdk1lTBfi)NqztvgDd1zL5iJL`4-wUfe z{rZww*>4&w(hb-_FNN(D)%W&`ETj!OsFZaPZ=~-HKte!{NH(3Cz$UE>Bgkp{*Ad+Y z55!Bv?w42k!f7iXhiipg(#klW|M-oIrO0iQA>(%ZgunneA|pc*dpLYzKlLt%^mq@p zrU`PZ6$2tZr;w-L0IV=Q+BaJ=;n$FukG$&R6kmJcrek`c_eu*UiZ7E=r&-1Kdm3Kj zcyQ~+=2*7z(!~x|D3spB4KWe_>LPCMv z)YE&wZ0w%Tt#{dnz&8;@b!p~(olmu%mW4(WERdr{&1X%SBm8Y|$2gi%SZ>8oBW&UQ zDFt+xrFsSgIm41#2<{NFMrQR9l%8L{(+55NOz)Mn*V=eFPeSO`uzrRNbw7D=M(c>v zlXb<@QqmPGgO&F03{wE@@6?h@)%B~fKz=1h8fFv((V4L04|!D`e)2RV+YA`8Vt?9pN@ygww>8$(gPrym9g6C5kh-$y8V6ux5Xfa5HaaqI3a> z8F?+=Bl*6lABy2?DGjTd>cgDUjTIC-n{HifC&XTzJD|Dcg}mtNs^Sc6!iq*G{iNMR zB3B!Bl6R#_p3+scT!hB4va)EW{o7U(h}}%t9V4^;bu?xjU?qN5o8@btzczVcn6YLX zym~M(kt8lQIPuY=+6sy+d#QU=-9BEhw^v3iX=!qXJoA8ua`L^5@|* zQuc_m!!7Va>a?E9-oCwDz>U_5lNZj}JLE-cIk5i)k#{idft)DU=1l2tfJ`}{dVBeQ zK=+T2j~o2(3=;m%dm1Rw!-dXhiIW;2X9*){@}U6$q5?iusj{?_gk$nXNZvX8^}J(T zvq^zYWuBg{#EW2M%N5l-Py0NY0Z7^?R^wISFOkL0$Q_j>aPKW|rnWLdC%{R*!n+`s zbi;shdXnAs1YbXQ-~XZZPwTO}TPv4$lgXSPW!l{6RhoSN>U>0-&23v1HP}T>!cWgr z8WDf%N`_>1zpu_s8@3!P57&OyIE{y-yi*@?L7_R|O5vVQZ3c-Ucab6q^YruDgq)1E} zG}P8-8Mx|K+fz)%7wNNBY55*^^s2i1)!QFcr7>>Y5t?ADUOUuh1%?EGeqmHyfYW>H z4|{rmSLk0s^{lj+AP7|1#2Zouszzmg=Qu^GSaYKIHy&2d63nxm@3%S9+%-&`cCH8z zdo6Lf>&u&4&m2xWwN~}ih3g(JD38fmGDt0OFJ66wg?hwAp=oGhB_zn|SDgf71*R+F z61rZkk$2feMt0U*2a>dJ{-P3-!kYZ@TSN*65)VC>MX?)?g?R^9d4BLWQY8r9qp?4K zv1(bRR3G!3>13`nG0J%Nt+NBy$^SAg>=1iQMeIHCT5(dV>j7BsmJe4zIVZrZu91HE zfVg-5k22@Rrp|R@Ca^HTG3vjv1|B!z0@6VL40z&7*+vY;>7HD6Va4=Bli#ICC|%o% zj7Tj`Tu1eT8#-J~+iV183a324h&sK?F9VL>I<{O>bt+|0m_q1Nyca+9npy7uBOH2O zfi}MQq_1&TK$g=_@L`zEbG;GGs=4o~bhqN#`E>%#fau3w8~Dj>$!v$?r;DMl_7Hry zPGM|`P6>9IdGfn`vvc2Em+%j^OXRmA?6mtIw$8d42+}gCE*NN9e?mWFExQMW=YUE-@l&1UxXpOvS zMb!7PKp3oxs%UPGOk5k0IVZ=&;C0QrMpB~Nldx-U9imdCu%sH+|0=@3Z+I@-R zX)T?vH|Qa?2A%m}NWRJwV?y#)zQi78v7`S-_C=9%*SP1^%+4%^29G(|dSaRGiT-%RR0-Fd=`kn zdFy}XYeqED0oDB3%P1;C0(81a)?3=SzfIA=m;WaMMgL=o<-afo zEKJkN&PvdIclL7=aTL9nrm=SRp@ETVOqS=Jo~a=neSM#@s!cPQ`4xPyMi$V7_o~}( zF3@0BL8sa|P-g!r+FLmz{W6O;E1EW0p04+2%QyC$$^#v|6)%aJ(|+TVo%hNqqDGFm zO)YqHgVwX-TU*O@$o1BgMv}oU1fNsZhUWTWJY4?1m?dj5&smwLVN0+ zyRNEwJR*Q3pnXnFS5W?SPV<-HJ?Y>PCJ_<+!Dk>+*s2pq7QOI0xP<6!#TlPjQk!)g z$asp14mgph{r>D%0cqt1 zE*q6@`Knq0^-P?|qo8?CMs9aI2Puz)iK%sWuU)-@nn!%bltrKn*wEe2xeISzW^PlgxLN+YLJ9z=bR6->YjFxZE1C z`_HJJrj&fY+F?O;^*6f;pa3V+HsvJeiMJfbzH88sr{@tQ@o z1sxmCUcS@7027Neb&p`N1n^<`i~l3O+jYW^-hD;O}kG%!3KV1 zgSz*T+%OP#n(DS%di4W`D!jvV7+{{D&Tl>W<+e-5+KWi61`$y=*SE9$O^Q5V+{^4? z@7XvB)34S56=(kA!ifegk)?{=dtL$+aaUZ@3D*1c2^@$dHNQu@l5xfz?tEb@d}Crj zIHw@;PZ+_z>=G_E<~3k45yEtJD8->(3hPy+?R(H6A1B@;axj?%cngDXux}1$f6KS7 zJv5Sc!o^P%uw!!3438|yQUsf*aos~bc=YoRU%2~8QUi6YK2qBf?)Usj*Ja_N zs6hsM-PcYJUyecCT3TA}f7TK+UEO7w0Sp~vX=yV&3U{d?d`XQh#h$SvRCB4am@nW` zD-|cJAsRp){>Nq4c-7byE^}-`tWt#VbHOmuJ!55AN|g$z1d;Vpj|YFMpe~beKT~<3nfpDUrw~+s>;M$nJzc1+VZ;$= z#J~?F#>+t;P?}#`ijRqgxcj;89B^Bv^H%%d25J;dQKVx0DaUG z;KGe`v(43BBKfFW;_cOK11<&`#C`an6M0CXYDn%J5k;+qUWuu?aeLKG=>gl9WgMaf zt&spNfLu5J(4RmJoc3K2m5pt74*<4ISIDyeS<*G~4Y~`GJQ4I7CYljk-ywtNX_q3b zFKP|O`QKlLy&7CaGroQHdC9f2;Z~^SuM4>Z7h@9`8H0L&r-AVFMK=+jpR@WB5{J`1 z4T2{>!tIi``WpQJba8l)ZOF&REHMR#quxrDpUg`%V8O<;x;)+U+nu_pp>Dj{d^sAG zW~oW^m8ChL!FN*QpA^7?pI@G_YhcNw&%=F9Zg)<|x!#}B?%5Q~X)B_X`k~|Q9T`BB zX36)Dkm67V;oLITPtWnx0ki$(C9MLVt~Qf!KReGbze*~ZT>HPnxQF}6b@{~(?q^C2wU-be8P;Hwr%;Cgvbi^bkBIEZY3C+S}SBy=P(8D z(AA+BSO99*e2EH(_Id7=n_C~~3T_SD5O){MzURMx?^s$TP5%*em4(DZMwKt)Lf6h@X10h zRbqFoyx}LBb6V`U{uO!jU#stQPXiw*hrz7)82$l!uL<*C@swtUQVP>G()Y|p);jDm+8h1OY};FVf|yh_vv_R%@TXf zfXYGk39~zBM(dkq&9@N3(33PpD^m%Lk@ahlcy|EJ3{keOO*{n1vv8yZ{F{6D-BHTV zzL*JT6IoDXiA|P(PydOart9TKRvLI78#nl6IQA!v@Y{wBcDhQT)`l|-$(DKKc9CPip6$$CuGvCy!sY!n ziINga&U{`@5w^BenG{)x4QswA%c|680-gvHIXzjq$v;fRqejYt7?Qo#)UM1!nV@AI+KYd7!#1X6Xz-)|2Ou>}6I z>Y!T$>rPa42zC4VdTSy;jz2DEl`~?;_)7%!qN7xYXSL?2AsAqz_K5f2hrALi(WCHE zBGG(6<}$i3*=$(#P0|mezJ=^igc=sp1SrgdUgusUBD$^7@Tj-Ph{*E6L9G2U#d~$? ztY%RdX_vhBPh|P%0<8S@-YO~47kTtE-GEyk)&32O5mWgW<>uzg3g?GtMeivX+H`Z-q5hcd8r0K zJd^*iPM)$IfG{<*7B zRMi0s>=22)0~RgP>A*DYrP_6gDUkjMWh zxdd!86ILA{bm{wfK-Fc>Ckk~dk8obZPFK8DgCZWFudIM2K(Fcj0 zP9sJ*XGZZ8mPX}cInH!CVk2_J?&i#%iTNO=fB?9?X~;Il>;i{`w3BQzwKJgy@r`jD7 zCD@@kQ|6SR%j^>gF_tbEh!DiYqd-wcOUqP1-vvgekNm#*zHV_>*vJpv-cai`l{{r6 z6kfxMxrqYA+6X`}=m6tLMl_;_>|9Z*0zBH2@h-5k?rvY{BtBn%g?g2lxL>@|;V)-X z$eFW=&&wPTzMq)AQd^YCb)FofjTC~%D|xU@@#{YTsU> zdLqF2lk@f21xPM6pZ{;EMUR7KiZeCTM_FL-d zjJnvi(Wyu!wiTTiFJAFVdM_FDxyx?xT}a#*=`=e4TL8IfZv=FucqI)dA*k!3`1ijY z0x`2(G7zmY8*YXM@XzDp%8L!$CQ2SrVU##Uh3cH5=a)AJ<)c%-+S=@nQh--Wgs?|x zXjp(FT)F%SBvsZ9=-t|l_h(6)whYskapn#5KMEx5O`(WaE9A7fw*vRbDLE9sPMftH z6C0;W(!a3XJx@zUb_JG*oAqY>)n$^TA|u%71w7}|3FRyFBbr}9f4qG0lUHi3${5vy z?caLIOb9;+>*;3%M#Y2rpdKq<=Xk|E7JnoO9Gee=pbl(@$QL^eLq`ibBl%uO5|C4~ zd_5mKHIxG+UQ&}Uoysx^J|Y=YFu0YfM))aRdy2-5SQv|*xq~ct{H;66Y67(ZW}&5Z z`uImKQ@UqyoD&(qD(0dEW~dwb{u~c%*qCIf+?B5#dHLcr*zk`F=aX#z3EKdGaVZT= z^pZLs%n)l1)r%jo#CjqefT2Ctym#;NWm%0!CUD@t-|X5#I4@GQa@6K7AAxCkGb{sp z*0k&`X>@Ns`!K%#%lE@mAxscL(5o_yCcA|2JlfYdJr}qS5{U5SVlEULjz7=-y* zS({$*NHz8??k@ZC+k>^BT9s-buj1ey#VgR36f@uLyueyz@CfQ7 z1rE$sd|^2)?$jC^dg+qbj?b>M`xdih|78z})8-GWmS7%_?nckGUU+OLrD}Sc7QRoT zJTCs`TR9NEZ?K%=R6s7~V8q=UzxJJh?$96G+s;p^RcItJr@{)=Q{#p;f7LJYn9R55 zWOD!vGMj1lf&BGh$PH$Z&MOR$0 z>OmSyQn*IYStCpe<@CaUPwM;q5D2AQ(!D5rg40hqSB zL+0IQ&Dw8N9FTK|gy69<>;m051n8J|>+6#N7f`9ZUQV97HFFan44yx$OOxz^83qfU z^M13?%F;6*CIvOF&=kH>YuTr0+GzED1$Bwixnhs<)~*&3u=Ut~|HcYr&q+E~8dI8t zPqen*pxfjnoiJRwU6bs9Uj8gATP|=>5&5E!D3vvb7BI);Xmwwo{AwU{I33T&$cC9J z)vVnLZ1#}Bi^PWIDZQ{_E)JJjD%doG|laqLn$AT_DWZpr*L zou==JEHarS@#MJd>dudC4)eM72T6wbJ{5u=YapBAxQt9^!T&-$bB?9+Ob5ekD_i!z z3qa&?(zU(}Mo}%385CP2bZzw8Sszq?3`+g`R7H)y4QBdpv48wux=Q}*R8=vRHd!tT zzKc>1{HIM}B(bTeh^YeSwde zWW}#l5{$CNq-4{G{r*M2ghiTtGC7ZB)j{Y3wd}=M6m; zBl3Ms#rQLp5e^JeqOLxN-wws6Q>_f1nZF zmOI{@ToCg5lFOf&0FwB7zC$_x;X6!Z)E)Jd-CB`bYceu?R#F6 zfTzR(MV1ZN%c04rHK!4}DSemYw~3v3+6I5_s)6fg=Kqnk(lI-~Be0m=`lB|It!dru z;;d16T_KW?rlhrsiD#-BMZ8F#sTBgnslPjJ--E>eW$9@)smIo&nh*X%>YtzWiT})A zOR`B=C<+ioxU7XhR#zsf)wU0Jg&`2uVF{4$xZRY`zL=ZuOl!bNZ3E_8rdSGYeez&C z1V%4WkzYF(n<`6Z9urZeuYA@HZoj#(0L_uZvCv&PP6oZ8vz9xzPo0Y$I4N3-ry8qUeIBV>KI`B zIr0qT8ule&X5-uDhNCF9El&=;(YsS?2pOMs8>v}~TIH;>Q9g`UH2>k8eM$Q@;0KX& z7-N;i*r#VdP5MFF6sJs6ozqNLQg7B#)Be%oY({jMwz@?jUu#Ufs^+huRXbfvBxyi* zuROi>*OVy1H)s|n&Zi?8#5dc5x^+H^M;AlRW_Sbd14fCPKb0NC2(@%J6Guqf=bni+ zf#UD-`1W>j8(8Pb-!(9=DzniD?~I?~4(pPW2|oKnL#b+-vTmb(kOS2{&&eaG$EfoT zd~spPV$su2h(WcgZORir$^k|(FWu7K{>oj(`Kooi())(yT@gPUCv+9NTmaCS3U z)p?fhIR)vPH2~&r#gQ{pc4^)f+hK0<`JMdOIod+1ROoFH#Bhfm?pbtWB^W~^g-+^p z7JEwjpjEW)E8t;Jd>qUUCgN83e2EhI=OxH_|9jVk)F2a7JbI#NoKCqIlN~~`F;RXr z)Da`@@+m6{ah$xim8kALAKSPTy)u^lZOOXI61VEMF9>JS?|o3kKJne=UDYkJ

2; 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 Length: {{ length.data }} [{{ length.units }}] @@ -570,7 +570,7 @@ Length: {{ length.data }} [{{ length.units }}] {% endraw %} ``` -A [Part Parameter](../part/parameter.md) has the following available attributes: +A [Parameter](../concepts/parameters.md) has the following available attributes: | Attribute | Description | | --- | --- | @@ -578,7 +578,7 @@ A [Part Parameter](../part/parameter.md) has the following available attributes: | Description | The *description* of the parameter | | Data | The *value* of the parameter (e.g. "123.4") | | Units | The *units* of the parameter (e.g. "km") | -| Template | A reference to a [PartParameterTemplate](../part/parameter.md#parameter-templates) | +| Template | A reference to a [ParameterTemplate](../concepts/parameters.md#parameter-templates) | ## Rendering Markdown diff --git a/docs/docs/settings/global.md b/docs/docs/settings/global.md index d60d02a367..4b32f972c0 100644 --- a/docs/docs/settings/global.md +++ b/docs/docs/settings/global.md @@ -174,11 +174,14 @@ Configuration of label printing: {{ globalsetting("PART_COPY_TESTS") }} {{ globalsetting("PART_CATEGORY_PARAMETERS") }} {{ globalsetting("PART_CATEGORY_DEFAULT_ICON") }} -{{ globalsetting("PART_PARAMETER_ENFORCE_UNITS") }} -#### Part Parameter Templates +#### Parameter Templates -Refer to the section describing [how to create part parameter templates](../part/parameter.md#create-template). +| Name | Description | Default | Units | +| ---- | ----------- | ------- | ----- | +{{ globalsetting("PARAMETER_ENFORCE_UNITS") }} + +For more information on parameters, refer to the [parameter documentation](../concepts/parameters.md). ### Categories diff --git a/docs/docs/start/docker_install.md b/docs/docs/start/docker_install.md index 0e53c85f7d..cb4f29da35 100644 --- a/docs/docs/start/docker_install.md +++ b/docs/docs/start/docker_install.md @@ -245,9 +245,10 @@ This can be adjusted using the following environment variables: | INVENTREE_WEB_ADDR | 0.0.0.0 | | INVENTREE_WEB_PORT | 8000 | -These variables are combined in the [Dockerfile](../../../contrib/container/Dockerfile) to build the bind string passed to the InvenTree server on startup. +These variables are combined in the [Dockerfile]({{ sourcefile("contrib/container/Dockerfile") }}) to build the bind string passed to the InvenTree server on startup. -To enable IPv6/Dual Stack support, set `INVENTREE_WEB_ADDR` to `[::]` when you create/start the container. +!!! tip "IPv6 Support" + To enable IPv6/Dual Stack support, set `INVENTREE_WEB_ADDR` to `[::]` when you create/start the container. ### Demo Dataset diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml index 132dc41b2e..9134d6ad04 100644 --- a/docs/mkdocs.yml +++ b/docs/mkdocs.yml @@ -96,6 +96,8 @@ nav: - Custom States: concepts/custom_states.md - Pricing: concepts/pricing.md - Project Codes: concepts/project_codes.md + - Attachments: concepts/attachments.md + - Parameters: concepts/parameters.md - Barcodes: - Barcode Support: barcodes/index.md - Internal Barcodes: barcodes/internal.md @@ -125,7 +127,6 @@ nav: - Virtual Parts: part/virtual.md - Part Views: part/views.md - Tracking: part/trackable.md - - Parameters: part/parameter.md - Revisions: part/revision.md - Templates: part/template.md - Tests: part/test.md @@ -238,7 +239,7 @@ nav: - Export Plugins: - BOM Exporter: plugins/builtin/bom_exporter.md - InvenTree Exporter: plugins/builtin/inventree_exporter.md - - Parameter Exporter: plugins/builtin/part_parameter_exporter.md + - Parameter Exporter: plugins/builtin/parameter_exporter.md - Stocktake Exporter: plugins/builtin/stocktake_exporter.md - Label Printing: - Label Printer: plugins/builtin/inventree_label.md diff --git a/pyproject.toml b/pyproject.toml index c3fa78bf3d..3b53f437d2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -101,8 +101,8 @@ python-version = "3.11.0" no-strip-extras=true generate-hashes=true -[tool.ty.src] -root = "src/backend/InvenTree" +[tool.ty.environment] +root = ["src/backend/InvenTree"] [tool.ty.rules] unresolved-reference="ignore" # 21 # see https://github.com/astral-sh/ty/issues/220 diff --git a/src/backend/InvenTree/InvenTree/api.py b/src/backend/InvenTree/InvenTree/api.py index 4c91ae61cd..cd57fb1cc2 100644 --- a/src/backend/InvenTree/InvenTree/api.py +++ b/src/backend/InvenTree/InvenTree/api.py @@ -600,6 +600,34 @@ class BulkUpdateMixin(BulkOperationMixin): return Response({'success': f'Updated {n} items'}, status=200) +class ParameterListMixin: + """Mixin class which supports filtering against parametric fields.""" + + def filter_queryset(self, queryset): + """Perform filtering against parametric fields.""" + import common.filters + + queryset = super().filter_queryset(queryset) + + # Filter by parametric data + queryset = common.filters.filter_parametric_data( + queryset, self.request.query_params + ) + + serializer_class = ( + getattr(self, 'serializer_class', None) or self.get_serializer_class() + ) + + model_class = serializer_class.Meta.model + + # Apply ordering based on query parameter + queryset = common.filters.order_by_parameter( + queryset, model_class, self.request.query_params.get('ordering', None) + ) + + return queryset + + class BulkDeleteMixin(BulkOperationMixin): """Mixin class for enabling 'bulk delete' operations for various models. diff --git a/src/backend/InvenTree/InvenTree/api_version.py b/src/backend/InvenTree/InvenTree/api_version.py index c220b37925..324e08988d 100644 --- a/src/backend/InvenTree/InvenTree/api_version.py +++ b/src/backend/InvenTree/InvenTree/api_version.py @@ -1,11 +1,16 @@ """InvenTree API version information.""" # InvenTree API version -INVENTREE_API_VERSION = 429 +INVENTREE_API_VERSION = 430 """Increment this API version number whenever there is a significant change to the API that any clients need to know about.""" INVENTREE_API_TEXT = """ +v430 -> 2025-12-04 : https://github.com/inventree/InvenTree/pull/10699 + - Removed the "PartParameter" and "PartParameterTemplate" API endpoints + - Removed the "ManufacturerPartParameter" API endpoint + - Added generic "Parameter" and "ParameterTemplate" API endpoints + v429 -> 2025-12-04 : https://github.com/inventree/InvenTree/pull/10938 - Adjust default values for currency codes in the API schema - Note that this does not change any functional behavior, only the schema documentation diff --git a/src/backend/InvenTree/InvenTree/models.py b/src/backend/InvenTree/InvenTree/models.py index 71bf510871..c3f5b42f93 100644 --- a/src/backend/InvenTree/InvenTree/models.py +++ b/src/backend/InvenTree/InvenTree/models.py @@ -6,8 +6,10 @@ from string import Formatter from typing import Any, Optional from django.contrib.auth import get_user_model +from django.contrib.contenttypes.fields import GenericRelation +from django.contrib.contenttypes.models import ContentType from django.core.exceptions import ValidationError -from django.db import models +from django.db import models, transaction from django.db.models import QuerySet from django.db.models.signals import post_save from django.db.transaction import TransactionManagementError @@ -450,7 +452,18 @@ class ReferenceIndexingMixin(models.Model): reference_int = models.BigIntegerField(default=0) -class InvenTreeModel(PluginValidationMixin, models.Model): +class ContentTypeMixin: + """Mixin class which supports retrieval of the ContentType for a model instance.""" + + @classmethod + def get_content_type(cls): + """Return the ContentType object associated with this model.""" + from django.contrib.contenttypes.models import ContentType + + return ContentType.objects.get_for_model(cls) + + +class InvenTreeModel(ContentTypeMixin, PluginValidationMixin, models.Model): """Base class for InvenTree models, which provides some common functionality. Includes the following mixins by default: @@ -473,7 +486,164 @@ class InvenTreeMetadataModel(MetadataMixin, InvenTreeModel): abstract = True -class InvenTreeAttachmentMixin: +class InvenTreePermissionCheckMixin: + """Provides an abstracted class for managing permissions against related fields.""" + + @classmethod + def check_related_permission(cls, permission, user) -> bool: + """Check if the user has permission to perform the specified action on the attachment. + + The default implementation runs a permission check against *this* model class, + but this can be overridden in the implementing class if required. + + Arguments: + permission: The permission to check (add / change / view / delete) + user: The user to check against + + Returns: + bool: True if the user has permission, False otherwise + """ + perm = f'{cls._meta.app_label}.{permission}_{cls._meta.model_name}' + return user.has_perm(perm) + + +class InvenTreeParameterMixin(InvenTreePermissionCheckMixin, models.Model): + """Provides an abstracted class for managing parameters. + + Links the implementing model to the common.models.Parameter table, + and provides the following methods: + """ + + class Meta: + """Metaclass options for InvenTreeParameterMixin.""" + + abstract = True + + # Define a reverse relation to the Parameter model + parameters_list = GenericRelation( + 'common.Parameter', content_type_field='model_type', object_id_field='model_id' + ) + + @staticmethod + def annotate_parameters(queryset: QuerySet) -> QuerySet: + """Annotate a queryset with pre-fetched parameters. + + Args: + queryset: Queryset to annotate + + Returns: + Annotated queryset + """ + return queryset.prefetch_related( + 'parameters_list', + 'parameters_list__model_type', + 'parameters_list__template', + ) + + @property + def parameters(self) -> QuerySet: + """Return a QuerySet containing all the Parameter instances for this model. + + This will return pre-fetched data if available (i.e. in a serializer context). + """ + # Check the query cache for pre-fetched parameters + if 'parameters_list' in getattr(self, '_prefetched_objects_cache', {}): + return self._prefetched_objects_cache['parameters_list'] + + return self.parameters_list.all() + + def delete(self, *args, **kwargs): + """Handle the deletion of a model instance. + + Before deleting the model instance, delete any associated parameters. + """ + self.parameters_list.all().delete() + super().delete(*args, **kwargs) + + @transaction.atomic + def copy_parameters_from(self, other, clear=True, **kwargs): + """Copy all parameters from another model instance. + + Arguments: + other: The other model instance to copy parameters from + clear: If True, clear existing parameters before copying + **kwargs: Additional keyword arguments to pass to the Parameter constructor + """ + import common.models + + if clear: + self.parameters_list.all().delete() + + parameters = [] + + content_type = ContentType.objects.get_for_model(self.__class__) + + template_ids = [parameter.template.pk for parameter in other.parameters.all()] + + # Remove all conflicting parameters first + self.parameters_list.filter(template__pk__in=template_ids).delete() + + for parameter in other.parameters.all(): + parameter.pk = None + parameter.model_id = self.pk + parameter.model_type = content_type + + parameters.append(parameter) + + if len(parameters) > 0: + common.models.Parameter.objects.bulk_create(parameters) + + def get_parameter(self, name: str): + """Return a Parameter instance for the given parameter name. + + Args: + name: Name of the parameter template + + Returns: + Parameter instance if found, else None + """ + return self.parameters_list.filter(template__name=name).first() + + def get_parameters(self) -> QuerySet: + """Return all Parameter instances for this model.""" + return ( + self.parameters_list.all() + .prefetch_related('template', 'model_type') + .order_by('template__name') + ) + + def parameters_map(self) -> dict: + """Return a map (dict) of parameter values associated with this Part instance, of the form. + + Example: + { + "name_1": "value_1", + "name_2": "value_2", + } + """ + params = {} + + for parameter in self.parameters.all().prefetch_related('template'): + params[parameter.template.name] = parameter.data + + return params + + def check_parameter_delete(self, parameter): + """Run a check to determine if the provided parameter can be deleted. + + The default implementation always returns True, but this can be overridden in the implementing class. + """ + return True + + def check_parameter_save(self, parameter): + """Run a check to determine if the provided parameter can be saved. + + The default implementation always returns True, but this can be overridden in the implementing class. + """ + return True + + +class InvenTreeAttachmentMixin(InvenTreePermissionCheckMixin): """Provides an abstracted class for managing file attachments. Links the implementing model to the common.models.Attachment table, @@ -491,33 +661,15 @@ class InvenTreeAttachmentMixin: super().delete(*args, **kwargs) @property - def attachments(self): + def attachments(self) -> QuerySet: """Return a queryset containing all attachments for this model.""" return self.attachments_for_model().filter(model_id=self.pk) - @classmethod - def check_attachment_permission(cls, permission, user) -> bool: - """Check if the user has permission to perform the specified action on the attachment. - - The default implementation runs a permission check against *this* model class, - but this can be overridden in the implementing class if required. - - Arguments: - permission: The permission to check (add / change / view / delete) - user: The user to check against - - Returns: - bool: True if the user has permission, False otherwise - """ - perm = f'{cls._meta.app_label}.{permission}_{cls._meta.model_name}' - return user.has_perm(perm) - - def attachments_for_model(self): + def attachments_for_model(self) -> QuerySet: """Return all attachments for this model class.""" from common.models import Attachment model_type = self.__class__.__name__.lower() - return Attachment.objects.filter(model_type=model_type) def create_attachment(self, attachment=None, link=None, comment='', **kwargs): @@ -533,7 +685,7 @@ class InvenTreeAttachmentMixin: Attachment.objects.create(**kwargs) -class InvenTreeTree(MPTTModel): +class InvenTreeTree(ContentTypeMixin, MPTTModel): """Provides an abstracted self-referencing tree model, based on the MPTTModel class. Our implementation provides the following key improvements: diff --git a/src/backend/InvenTree/InvenTree/schema.py b/src/backend/InvenTree/InvenTree/schema.py index 36918d3d95..095dbe15d4 100644 --- a/src/backend/InvenTree/InvenTree/schema.py +++ b/src/backend/InvenTree/InvenTree/schema.py @@ -1,7 +1,7 @@ """Schema processing functions for cleaning up generated schema.""" from itertools import chain -from typing import Optional +from typing import Any, Optional from django.conf import settings @@ -138,6 +138,43 @@ class ExtendedAutoSchema(AutoSchema): return operation +def postprocess_schema_enums(result, generator, **kwargs): + """Override call to drf-spectacular's enum postprocessor to filter out specific warnings.""" + from drf_spectacular import drainage + + # Monkey-patch the warn function temporarily + original_warn = drainage.warn + + def custom_warn(msg: str, delayed: Any = None) -> None: + """Custom patch to ignore some drf-spectacular warnings. + + - Some warnings are unavoidable due to the way that InvenTree implements generic relationships (via ContentType). + - The cleanest way to handle this appears to be to override the 'warn' function from drf-spectacular. + + Ref: https://github.com/inventree/InvenTree/pull/10699 + """ + ignore_patterns = [ + 'enum naming encountered a non-optimally resolvable collision for fields named "model_type"' + ] + + if any(pattern in msg for pattern in ignore_patterns): + return + + original_warn(msg, delayed) + + # Replace the warn function with our custom version + drainage.warn = custom_warn + + import drf_spectacular.hooks + + result = drf_spectacular.hooks.postprocess_schema_enums(result, generator, **kwargs) + + # Restore the original warn function + drainage.warn = original_warn + + return result + + def postprocess_required_nullable(result, generator, request, public): """Un-require nullable fields. diff --git a/src/backend/InvenTree/InvenTree/serializers.py b/src/backend/InvenTree/InvenTree/serializers.py index 57be6dc1d1..074b8ce6f7 100644 --- a/src/backend/InvenTree/InvenTree/serializers.py +++ b/src/backend/InvenTree/InvenTree/serializers.py @@ -7,6 +7,7 @@ from decimal import Decimal from typing import Any, Optional from django.conf import settings +from django.contrib.contenttypes.models import ContentType from django.core.exceptions import ValidationError as DjangoValidationError from django.db import models from django.utils.translation import gettext_lazy as _ @@ -28,6 +29,7 @@ import InvenTree.ready from common.currency import currency_code_default, currency_code_mappings from InvenTree.fields import InvenTreeRestURLField, InvenTreeURLField from InvenTree.helpers import str2bool +from InvenTree.helpers_model import getModelsWithMixin from .setting.storages import StorageBackends @@ -721,3 +723,96 @@ class RemoteImageMixin(metaclass=serializers.SerializerMetaclass): raise ValidationError(_('Failed to download image from remote URL')) return url + + +class ContentTypeField(serializers.ChoiceField): + """Serializer field which represents a ContentType as 'app_label.model_name'. + + This field converts a ContentType instance to a string representation in the format 'app_label.model_name' during serialization, and vice versa during deserialization. + + Additionally, a "mixin_class" can be supplied to the field, which will restrict the valid content types to only those models which inherit from the specified mixin. + """ + + mixin_class = None + + def __init__(self, *args, mixin_class=None, **kwargs): + """Initialize the ContentTypeField. + + Args: + mixin_class: Optional mixin class to restrict valid content types. + """ + self.mixin_class = mixin_class + + # Override the 'choices' field, to limit to the appropriate models + if self.mixin_class is not None: + models = getModelsWithMixin(self.mixin_class) + + kwargs['choices'] = [ + ( + f'{model._meta.app_label}.{model._meta.model_name}', + model._meta.verbose_name, + ) + for model in models + ] + else: + content_types = ContentType.objects.all() + + kwargs['choices'] = [ + (f'{ct.app_label}.{ct.model}', str(ct)) for ct in content_types + ] + + if kwargs.get('allow_null') or kwargs.get('allow_blank'): + kwargs['choices'] = [('', '---------'), *kwargs['choices']] + + super().__init__(*args, **kwargs) + + def to_representation(self, value): + """Convert ContentType instance to string representation.""" + return f'{value.app_label}.{value.model}' + + def to_internal_value(self, data): + """Convert string representation back to ContentType instance.""" + from django.contrib.contenttypes.models import ContentType + + content_type = None + + if data in ['', None]: + return None + + # First, try to resolve the content type via direct pk value + try: + content_type_id = int(data) + content_type = ContentType.objects.get_for_id(content_type_id) + except (ValueError, ContentType.DoesNotExist): + content_type = None + + try: + if len(data.split('.')) == 2: + app_label, model = data.split('.') + content_types = ContentType.objects.filter( + app_label=app_label, model=model + ) + + if content_types.count() == 1: + # Try exact match first + content_type = content_types.first() + else: + # Try lookup just on model name + content_types = ContentType.objects.filter(model=data) + if content_types.exists() and content_types.count() == 1: + content_type = content_types.first() + + except Exception: + raise ValidationError(_('Invalid content type format')) + + if content_type is None: + raise ValidationError(_('Content type not found')) + + if self.mixin_class is not None: + model_class = content_type.model_class() + if not issubclass(model_class, self.mixin_class): + raise ValidationError( + _('Content type does not match required mixin class') + ) + + return content_type diff --git a/src/backend/InvenTree/InvenTree/setting/spectacular.py b/src/backend/InvenTree/InvenTree/setting/spectacular.py index 56fdbdc4fa..c83e1f8265 100644 --- a/src/backend/InvenTree/InvenTree/setting/spectacular.py +++ b/src/backend/InvenTree/InvenTree/setting/spectacular.py @@ -20,7 +20,7 @@ def get_spectacular_settings(): 'SERVE_INCLUDE_SCHEMA': False, 'SCHEMA_PATH_PREFIX': '/api/', 'POSTPROCESSING_HOOKS': [ - 'drf_spectacular.hooks.postprocess_schema_enums', + 'InvenTree.schema.postprocess_schema_enums', 'InvenTree.schema.postprocess_required_nullable', 'InvenTree.schema.postprocess_print_stats', ], @@ -28,6 +28,7 @@ def get_spectacular_settings(): 'UserTypeEnum': 'users.models.UserProfile.UserType', 'TemplateModelTypeEnum': 'report.models.ReportTemplateBase.ModelChoices', 'AttachmentModelTypeEnum': 'common.models.Attachment.ModelChoices', + 'ParameterModelTypeEnum': 'common.models.Parameter.ModelChoices', 'DataImportSessionModelTypeEnum': 'importer.models.DataImportSession.ModelChoices', # Allauth 'UnauthorizedStatus': [[401, 401]], diff --git a/src/backend/InvenTree/build/api.py b/src/backend/InvenTree/build/api.py index 2f0cf3d2ab..5e1901f58a 100644 --- a/src/backend/InvenTree/build/api.py +++ b/src/backend/InvenTree/build/api.py @@ -24,7 +24,7 @@ from build.models import Build, BuildItem, BuildLine from build.status_codes import BuildStatus, BuildStatusGroups from data_exporter.mixins import DataExportViewMixin from generic.states.api import StatusView -from InvenTree.api import BulkDeleteMixin, MetadataView +from InvenTree.api import BulkDeleteMixin, MetadataView, ParameterListMixin from InvenTree.fields import InvenTreeOutputOption, OutputConfiguration from InvenTree.filters import ( SEARCH_ORDER_FILTER_ALIAS, @@ -336,7 +336,13 @@ class BuildListOutputOptions(OutputConfiguration): OPTIONS = [InvenTreeOutputOption('part_detail', default=True)] -class BuildList(DataExportViewMixin, BuildMixin, OutputOptionsMixin, ListCreateAPI): +class BuildList( + DataExportViewMixin, + BuildMixin, + OutputOptionsMixin, + ParameterListMixin, + ListCreateAPI, +): """API endpoint for accessing a list of Build objects. - GET: Return list of objects (with filters) diff --git a/src/backend/InvenTree/build/models.py b/src/backend/InvenTree/build/models.py index 32bf0a951b..42e8213099 100644 --- a/src/backend/InvenTree/build/models.py +++ b/src/backend/InvenTree/build/models.py @@ -76,6 +76,7 @@ class BuildReportContext(report.mixins.BaseReportContext): class Build( InvenTree.models.PluginValidationMixin, report.mixins.InvenTreeReportMixin, + InvenTree.models.InvenTreeParameterMixin, InvenTree.models.InvenTreeAttachmentMixin, InvenTree.models.InvenTreeBarcodeMixin, InvenTree.models.InvenTreeNotesMixin, diff --git a/src/backend/InvenTree/build/serializers.py b/src/backend/InvenTree/build/serializers.py index 2da5c2ee85..cdef3a31ed 100644 --- a/src/backend/InvenTree/build/serializers.py +++ b/src/backend/InvenTree/build/serializers.py @@ -22,6 +22,7 @@ from rest_framework import serializers from rest_framework.serializers import ValidationError import build.tasks +import common.serializers import common.settings import company.serializers import InvenTree.helpers @@ -101,6 +102,7 @@ class BuildSerializer( 'issued_by_detail', 'responsible', 'responsible_detail', + 'parameters', 'priority', 'level', ] @@ -124,6 +126,12 @@ class BuildSerializer( True, ) + parameters = enable_filter( + common.serializers.ParameterSerializer(many=True, read_only=True), + False, + filter_name='parameters', + ) + part_name = serializers.CharField( source='part.name', read_only=True, label=_('Part Name') ) diff --git a/src/backend/InvenTree/build/test_migrations.py b/src/backend/InvenTree/build/test_migrations.py index 924b45d249..6613c50dcc 100644 --- a/src/backend/InvenTree/build/test_migrations.py +++ b/src/backend/InvenTree/build/test_migrations.py @@ -86,7 +86,7 @@ class TestReferencePatternMigration(MigratorTestCase): """ migrate_from = ('build', '0019_auto_20201019_1302') - migrate_to = ('build', unit_test.getNewestMigrationFile('build')) + migrate_to = ('build', '0037_build_priority') def prepare(self): """Create some initial data prior to migration.""" diff --git a/src/backend/InvenTree/common/admin.py b/src/backend/InvenTree/common/admin.py index 213f42bd29..a5461b7d02 100644 --- a/src/backend/InvenTree/common/admin.py +++ b/src/backend/InvenTree/common/admin.py @@ -6,6 +6,32 @@ import common.models import common.validators +@admin.register(common.models.ParameterTemplate) +class ParameterTemplateAdmin(admin.ModelAdmin): + """Admin interface for ParameterTemplate objects.""" + + list_display = ('name', 'description', 'model_type', 'units') + search_fields = ('name', 'description') + + +@admin.register(common.models.Parameter) +class ParameterAdmin(admin.ModelAdmin): + """Admin interface for Parameter objects.""" + + list_display = ( + 'template', + 'model_type', + 'model_id', + 'data', + 'updated', + 'updated_by', + ) + + autocomplete_fields = ('template', 'updated_by') + list_filter = ('template', 'model_type', 'updated_by') + search_fields = ('template__name', 'data', 'note') + + @admin.register(common.models.Attachment) class AttachmentAdmin(admin.ModelAdmin): """Admin interface for Attachment objects.""" diff --git a/src/backend/InvenTree/common/api.py b/src/backend/InvenTree/common/api.py index a28bf451cf..ec64f79d87 100644 --- a/src/backend/InvenTree/common/api.py +++ b/src/backend/InvenTree/common/api.py @@ -27,7 +27,9 @@ from rest_framework.exceptions import NotAcceptable, NotFound, PermissionDenied from rest_framework.permissions import IsAdminUser, IsAuthenticated from rest_framework.response import Response from rest_framework.views import APIView +from sql_util.utils import SubqueryCount +import common.filters import common.models import common.serializers import InvenTree.conversion @@ -35,15 +37,20 @@ from common.icons import get_icon_packs from common.settings import get_global_setting from data_exporter.mixins import DataExportViewMixin from generic.states.api import urlpattern as generic_states_api_urls -from InvenTree.api import BulkDeleteMixin, MetadataView +from InvenTree.api import BulkCreateMixin, BulkDeleteMixin, MetadataView from InvenTree.config import CONFIG_LOOKUPS -from InvenTree.filters import ORDER_FILTER, SEARCH_ORDER_FILTER -from InvenTree.helpers import inheritors +from InvenTree.filters import ( + ORDER_FILTER, + SEARCH_ORDER_FILTER, + SEARCH_ORDER_FILTER_ALIAS, +) +from InvenTree.helpers import inheritors, str2bool from InvenTree.helpers_email import send_email from InvenTree.mixins import ( CreateAPI, ListAPI, ListCreateAPI, + OutputOptionsMixin, RetrieveAPI, RetrieveDestroyAPI, RetrieveUpdateAPI, @@ -708,13 +715,17 @@ class AttachmentFilter(FilterSet): return queryset.filter(Q(attachment=None) | Q(attachment='')).distinct() -class AttachmentList(BulkDeleteMixin, ListCreateAPI): - """List API endpoint for Attachment objects.""" +class AttachmentMixin: + """Mixin class for Attachment views.""" queryset = common.models.Attachment.objects.all() serializer_class = common.serializers.AttachmentSerializer permission_classes = [IsAuthenticatedOrReadScope] + +class AttachmentList(AttachmentMixin, BulkDeleteMixin, ListCreateAPI): + """List API endpoint for Attachment objects.""" + filter_backends = SEARCH_ORDER_FILTER filterset_class = AttachmentFilter @@ -746,13 +757,9 @@ class AttachmentList(BulkDeleteMixin, ListCreateAPI): ) -class AttachmentDetail(RetrieveUpdateDestroyAPI): +class AttachmentDetail(AttachmentMixin, RetrieveUpdateDestroyAPI): """Detail API endpoint for Attachment objects.""" - queryset = common.models.Attachment.objects.all() - serializer_class = common.serializers.AttachmentSerializer - permission_classes = [IsAuthenticatedOrReadScope] - def destroy(self, request, *args, **kwargs): """Check user permissions before deleting an attachment.""" attachment = self.get_object() @@ -765,6 +772,165 @@ class AttachmentDetail(RetrieveUpdateDestroyAPI): return super().destroy(request, *args, **kwargs) +class ParameterTemplateFilter(FilterSet): + """FilterSet class for the ParameterTemplateList API endpoint.""" + + class Meta: + """Metaclass options.""" + + model = common.models.ParameterTemplate + fields = ['name', 'units', 'checkbox', 'enabled'] + + has_choices = rest_filters.BooleanFilter( + method='filter_has_choices', label='Has Choice' + ) + + def filter_has_choices(self, queryset, name, value): + """Filter queryset to include only PartParameterTemplates with choices.""" + if str2bool(value): + return queryset.exclude(Q(choices=None) | Q(choices='')) + + return queryset.filter(Q(choices=None) | Q(choices='')).distinct() + + has_units = rest_filters.BooleanFilter(method='filter_has_units', label='Has Units') + + def filter_has_units(self, queryset, name, value): + """Filter queryset to include only PartParameterTemplates with units.""" + if str2bool(value): + return queryset.exclude(Q(units=None) | Q(units='')) + + return queryset.filter(Q(units=None) | Q(units='')).distinct() + + model_type = rest_filters.CharFilter(method='filter_model_type', label='Model Type') + + def filter_model_type(self, queryset, name, value): + """Filter queryset to include only ParameterTemplates of the given model type.""" + return common.filters.filter_content_type( + queryset, 'model_type', value, allow_null=False + ) + + for_model = rest_filters.CharFilter(method='filter_for_model', label='For Model') + + def filter_for_model(self, queryset, name, value): + """Filter queryset to include only ParameterTemplates which apply to the given model. + + Note that this varies from the 'model_type' filter, in that ParameterTemplates + with a blank 'model_type' are considered to apply to all models. + """ + return common.filters.filter_content_type( + queryset, 'model_type', value, allow_null=True + ) + + exists_for_model = rest_filters.CharFilter( + method='filter_exists_for_model', label='Exists For Model' + ) + + def filter_exists_for_model(self, queryset, name, value): + """Filter queryset to include only ParameterTemplates which have at least one Parameter for the given model type.""" + content_type = common.filters.determine_content_type(value) + + if not content_type: + return queryset.none() + + queryset = queryset.prefetch_related('parameters') + + # Annotate the queryset to determine which ParameterTemplates have at least one Parameter for the given model type + queryset = queryset.annotate( + parameter_count=SubqueryCount( + 'parameters', filter=Q(model_type=content_type) + ) + ) + + # Return only those ParameterTemplates which have at least one Parameter for the given model type + return queryset.filter(parameter_count__gt=0) + + +class ParameterTemplateMixin: + """Mixin class for ParameterTemplate views.""" + + queryset = common.models.ParameterTemplate.objects.all() + serializer_class = common.serializers.ParameterTemplateSerializer + permission_classes = [IsAuthenticatedOrReadScope] + + +class ParameterTemplateList(ParameterTemplateMixin, DataExportViewMixin, ListCreateAPI): + """List view for ParameterTemplate objects.""" + + filterset_class = ParameterTemplateFilter + filter_backends = SEARCH_ORDER_FILTER + search_fields = ['name', 'description'] + ordering_fields = ['name', 'units', 'checkbox'] + + +class ParameterTemplateDetail(ParameterTemplateMixin, RetrieveUpdateDestroyAPI): + """Detail view for a ParameterTemplate object.""" + + +class ParameterFilter(FilterSet): + """Custom filters for the ParameterList API endpoint.""" + + class Meta: + """Metaclass options for the filterset.""" + + model = common.models.Parameter + fields = ['model_id', 'template', 'updated_by'] + + enabled = rest_filters.BooleanFilter( + label='Template Enabled', field_name='template__enabled' + ) + + model_type = rest_filters.CharFilter(method='filter_model_type', label='Model Type') + + def filter_model_type(self, queryset, name, value): + """Filter queryset to include only Parameters of the given model type.""" + return common.filters.filter_content_type( + queryset, 'model_type', value, allow_null=False + ) + + +class ParameterMixin: + """Mixin class for Parameter views.""" + + queryset = common.models.Parameter.objects.all() + serializer_class = common.serializers.ParameterSerializer + permission_classes = [IsAuthenticatedOrReadScope] + + +class ParameterList( + OutputOptionsMixin, + ParameterMixin, + BulkCreateMixin, + BulkDeleteMixin, + DataExportViewMixin, + ListCreateAPI, +): + """List API endpoint for Parameter objects.""" + + filterset_class = ParameterFilter + filter_backends = SEARCH_ORDER_FILTER_ALIAS + + ordering_fields = ['name', 'data', 'units', 'template', 'updated', 'updated_by'] + + ordering_field_aliases = { + 'name': 'template__name', + 'units': 'template__units', + 'data': ['data_numeric', 'data'], + } + + search_fields = [ + 'data', + 'template__name', + 'template__description', + 'template__units', + ] + + unique_create_fields = ['model_type', 'model_id', 'template'] + + +class ParameterDetail(ParameterMixin, RetrieveUpdateDestroyAPI): + """Detail API endpoint for Parameter objects.""" + + @method_decorator(cache_control(public=True, max_age=86400), name='dispatch') class IconList(ListAPI): """List view for available icon packages.""" @@ -997,6 +1163,51 @@ common_api_urls = [ path('', AttachmentList.as_view(), name='api-attachment-list'), ]), ), + # Parameters and templates + path( + 'parameter/', + include([ + path( + 'template/', + include([ + path( + '/', + include([ + path( + 'metadata/', + MetadataView.as_view( + model=common.models.ParameterTemplate + ), + name='api-parameter-template-metadata', + ), + path( + '', + ParameterTemplateDetail.as_view(), + name='api-parameter-template-detail', + ), + ]), + ), + path( + '', + ParameterTemplateList.as_view(), + name='api-parameter-template-list', + ), + ]), + ), + path( + '/', + include([ + path( + 'metadata/', + MetadataView.as_view(model=common.models.Parameter), + name='api-parameter-metadata', + ), + path('', ParameterDetail.as_view(), name='api-parameter-detail'), + ]), + ), + path('', ParameterList.as_view(), name='api-parameter-list'), + ]), + ), path( 'error-report/', include([ diff --git a/src/backend/InvenTree/common/filters.py b/src/backend/InvenTree/common/filters.py new file mode 100644 index 0000000000..a7968dbfc1 --- /dev/null +++ b/src/backend/InvenTree/common/filters.py @@ -0,0 +1,316 @@ +"""Custom API filters for InvenTree.""" + +import re + +from django.contrib.contenttypes.models import ContentType +from django.core.exceptions import ValidationError +from django.db.models import ( + Case, + CharField, + Exists, + FloatField, + Model, + OuterRef, + Q, + Subquery, + Value, + When, +) +from django.db.models.query import QuerySet + +import InvenTree.conversion +import InvenTree.helpers + + +def determine_content_type(content_type: str | int | None) -> ContentType | None: + """Determine a ContentType instance from a string or integer input. + + Arguments: + content_type: The content type to resolve (name or ID). + + Returns: + ContentType instance if found, else None. + """ + if content_type is None: + return None + + ct = None + + # First, try to resolve the content type via a PK value + try: + content_type_id = int(content_type) + ct = ContentType.objects.get_for_id(content_type_id) + except (ValueError, ContentType.DoesNotExist): + ct = None + + if len(content_type.split('.')) == 2: + # Next, try to resolve the content type via app_label.model_name + try: + app_label, model = content_type.split('.') + ct = ContentType.objects.get(app_label=app_label, model=model) + except ContentType.DoesNotExist: + ct = None + + else: + # Next, try to resolve the content type via a model name + ct = ContentType.objects.filter(model__iexact=content_type).first() + + return ct + + +def filter_content_type( + queryset, field_name: str, content_type: str | int | None, allow_null: bool = True +): + """Filter a queryset by content type. + + Arguments: + queryset: The queryset to filter. + field_name: The name of the content type field within the current model context. + content_type: The content type to filter by (name or ID). + allow_null: If True, include entries with null content type. + + Returns: + Filtered queryset. + """ + if content_type is None: + return queryset + + ct = determine_content_type(content_type) + + if ct is None: + raise ValidationError(f'Invalid content type: {content_type}') + + q = Q(**{f'{field_name}': ct}) + + if allow_null: + q |= Q(**{f'{field_name}__isnull': True}) + + return queryset.filter(q) + + +"""A list of valid operators for filtering part parameters.""" +PARAMETER_FILTER_OPERATORS: list[str] = ['gt', 'gte', 'lt', 'lte', 'ne', 'icontains'] + + +def filter_parameters_by_value( + queryset: QuerySet, template_id: int, value: str, func: str = '' +) -> QuerySet: + """Filter the Parameter model based on the provided template and value. + + Arguments: + queryset: The initial QuerySet to filter. + template_id: The parameter template ID to filter by. + value: The value to filter against. + func: The filtering function to apply (e.g. 'gt', 'lt', etc). + + Returns: + A list of Parameter instances which match the given criteria. + + Notes: + - Parts which do not have a value for the given parameter are excluded. + """ + from common.models import ParameterTemplate + + # Ensure that the provided function is valid + if func and func not in PARAMETER_FILTER_OPERATORS: + raise ValueError(f'Invalid parameter filter function: {func}') + + # Ensure that the template exists + try: + template = ParameterTemplate.objects.get(pk=template_id) + except ParameterTemplate.DoesNotExist: + raise ValueError(f'Invalid parameter template ID: {template_id}') + + # Construct a "numeric" value for the filter + try: + value_numeric = float(value) + except (ValueError, TypeError): + value_numeric = None + + if template.checkbox: + # Account for 'boolean' parameter values + bool_value = InvenTree.helpers.str2bool(value) + value_numeric = 1 if bool_value else 0 + value = str(bool_value) + + # Boolean filtering is limited to exact matches + func = '' + + elif value_numeric is None and template.units: + # Convert the raw value to the units of the template parameter + try: + value_numeric = InvenTree.conversion.convert_physical_value( + value, template.units + ) + except Exception: + # The value cannot be converted - return an empty queryset + return queryset.none() + + # Special handling for the "not equal" operator + if func == 'ne': + invert = True + func = '' + else: + invert = False + + # Some filters are only applicable to string values + text_only = any([func in ['icontains'], value_numeric is None]) + + # Ensure the function starts with a double underscore + if func and not func.startswith('__'): + func = f'__{func}' + + # Query for 'numeric' value - this has priority over 'string' value + data_numeric = { + 'parameters_list__template': template, + 'parameters_list__data_numeric__isnull': False, + f'parameters_list__data_numeric{func}': value_numeric, + } + + query_numeric = Q(**data_numeric) + + # Query for 'string' value + data_text = { + 'parameters_list__template': template, + f'parameters_list__data{func}': str(value), + } + + if not text_only: + data_text['parameters_list__data_numeric__isnull'] = True + + query_text = Q(**data_text) + + # Combine the queries based on whether we are filtering by text or numeric value + q = query_text if text_only else query_text | query_numeric + + # queryset = Parameter.objects.prefetch_related('template').all() + + # Special handling for the '__ne' (not equal) operator + # In this case, we want the *opposite* of the above queries + if invert: + return queryset.exclude(q).distinct() + else: + return queryset.filter(q).distinct() + + +def filter_parametric_data(queryset: QuerySet, parameters: dict[str, str]) -> QuerySet: + """Filter the provided queryset by parametric data. + + Arguments: + queryset: The initial queryset to filter. + parameters: A dictionary of parameter filters to apply. + + Returns: + Filtered queryset. + + Used to filter returned parts based on their parameter values. + + To filter based on parameter value, supply query parameters like: + - parameter_= + - parameter__gt= + - parameter__lte= + + where: + - is the ID of the ParameterTemplate. + - is the value to filter against. + + Typically these filters would be provided against via an API request. + """ + queryset = queryset.prefetch_related('parameters_list', 'parameters_list__template') + + # Allowed lookup operations for parameter values + operators = '|'.join(PARAMETER_FILTER_OPERATORS) + + regex_pattern = rf'^parameter_(\d+)(_({operators}))?$' + + for param, value in parameters.items(): + result = re.match(regex_pattern, param) + if not result: + continue + + template_id = result.group(1) + operator = result.group(3) or '' + + queryset = filter_parameters_by_value( + queryset, template_id, value, func=operator + ) + + return queryset + + +def order_by_parameter( + queryset: QuerySet, model_type: Model, ordering: str | None +) -> QuerySet: + """Order the provided queryset by a parameter value. + + Arguments: + queryset: The initial queryset to order. + model_type: The model type of the items in the queryset. + ordering: The ordering string provided by the user. + + Returns: + Ordered queryset. + + Used to order returned parts based on their parameter values. + + To order based on parameter value, supply an ordering string like: + - parameter_ + - -parameter_ + + where: + - is the ID of the ParameterTemplate. + - A leading '-' indicates descending order. + """ + import common.models + + if not ordering: + # No ordering provided - return the original queryset + return queryset + + result = re.match(r'^-?parameter_(\d+)$', ordering) + + if not result: + # Ordering does not match the expected pattern - return the original queryset + return queryset + + template_id = result.group(1) + ascending = not ordering.startswith('-') + + template_exists_filter = common.models.Parameter.objects.filter( + template__id=template_id, + model_type=ContentType.objects.get_for_model(model_type), + model_id=OuterRef('id'), + ) + + queryset = queryset.annotate(parameter_exists=Exists(template_exists_filter)) + + # Annotate the queryset with the parameter value for the provided template + queryset = queryset.annotate( + parameter_value=Case( + When( + parameter_exists=True, + then=Subquery( + template_exists_filter.values('data')[:1], output_field=CharField() + ), + ), + default=Value('', output_field=CharField()), + ), + parameter_value_numeric=Case( + When( + parameter_exists=True, + then=Subquery( + template_exists_filter.values('data_numeric')[:1], + output_field=FloatField(), + ), + ), + default=Value(0, output_field=FloatField()), + ), + ) + + prefix = '' if ascending else '-' + + return queryset.order_by( + '-parameter_exists', + f'{prefix}parameter_value_numeric', + f'{prefix}parameter_value', + ) diff --git a/src/backend/InvenTree/common/migrations/0023_auto_20240602_1332.py b/src/backend/InvenTree/common/migrations/0023_auto_20240602_1332.py index a3cc1fd02a..3c29bda31f 100644 --- a/src/backend/InvenTree/common/migrations/0023_auto_20240602_1332.py +++ b/src/backend/InvenTree/common/migrations/0023_auto_20240602_1332.py @@ -44,7 +44,7 @@ def set_currencies(apps, schema_editor): valid_codes.add(code) if len(valid_codes) == 0: - print(f"No valid currency codes found in configuration file") + print(f"No currency codes found in configuration file - skipping migration") return value = ','.join(valid_codes) diff --git a/src/backend/InvenTree/common/migrations/0040_parametertemplate_parameter.py b/src/backend/InvenTree/common/migrations/0040_parametertemplate_parameter.py new file mode 100644 index 0000000000..5bfce74256 --- /dev/null +++ b/src/backend/InvenTree/common/migrations/0040_parametertemplate_parameter.py @@ -0,0 +1,248 @@ +# Generated by Django 5.2.8 on 2025-12-03 12:39 + +import InvenTree.models +import InvenTree.validators +import django.core.validators +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("common", "0039_emailthread_emailmessage"), + ("contenttypes", "0002_remove_content_type_name"), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ("part", "0144_auto_20251203_1045") + ] + + operations = [ + migrations.SeparateDatabaseAndState( + state_operations=[ + migrations.CreateModel( + name="ParameterTemplate", + fields=[ + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "metadata", + models.JSONField( + blank=True, + help_text="JSON metadata field, for use by external plugins", + null=True, + verbose_name="Plugin Metadata", + ), + ), + ( + "name", + models.CharField( + help_text="Parameter Name", + max_length=100, + unique=True, + verbose_name="Name", + ), + ), + ( + "units", + models.CharField( + blank=True, + help_text="Physical units for this parameter", + max_length=25, + validators=[InvenTree.validators.validate_physical_units], + verbose_name="Units", + ), + ), + ( + "description", + models.CharField( + blank=True, + help_text="Parameter description", + max_length=250, + verbose_name="Description", + ), + ), + ( + "checkbox", + models.BooleanField( + default=False, + help_text="Is this parameter a checkbox?", + verbose_name="Checkbox", + ), + ), + ( + "choices", + models.CharField( + blank=True, + help_text="Valid choices for this parameter (comma-separated)", + max_length=5000, + verbose_name="Choices", + ), + ), + ( + "enabled", + models.BooleanField( + default=True, + help_text="Is this parameter template enabled?", + verbose_name="Enabled", + ), + ), + ( + "model_type", + models.ForeignKey( + blank=True, + help_text="Target model type for this parameter template", + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to="contenttypes.contenttype", + verbose_name="Model type", + ), + ), + ( + "selectionlist", + models.ForeignKey( + blank=True, + help_text="Selection list for this parameter", + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="templates", + to="common.selectionlist", + verbose_name="Selection List", + ), + ), + ], + options={ + "verbose_name": "Parameter Template", + "verbose_name_plural": "Parameter Templates", + "db_table": "part_partparametertemplate", + }, + bases=( + InvenTree.models.ContentTypeMixin, + InvenTree.models.PluginValidationMixin, + models.Model, + ), + ), + ], + database_operations=[], + ), + migrations.SeparateDatabaseAndState( + state_operations=[ + migrations.CreateModel( + name="Parameter", + fields=[ + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "metadata", + models.JSONField( + blank=True, + help_text="JSON metadata field, for use by external plugins", + null=True, + verbose_name="Plugin Metadata", + ), + ), + ( + "updated", + models.DateTimeField( + blank=True, + default=None, + help_text="Timestamp of last update", + null=True, + verbose_name="Updated", + ), + ), + ( + "model_id", + models.PositiveIntegerField( + help_text="ID of the target model for this parameter", + verbose_name="Model ID", + ), + ), + ( + "data", + models.CharField( + help_text="Parameter Value", + max_length=500, + validators=[django.core.validators.MinLengthValidator(1)], + verbose_name="Data", + ), + ), + ( + "data_numeric", + models.FloatField(blank=True, default=None, null=True), + ), + ( + "note", + models.CharField( + blank=True, + help_text="Optional note field", + max_length=500, + verbose_name="Note", + ), + ), + ( + "model_type", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + to="contenttypes.contenttype", + ), + ), + ( + "updated_by", + models.ForeignKey( + blank=True, + help_text="User who last updated this object", + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_updated", + to=settings.AUTH_USER_MODEL, + verbose_name="Update By", + ), + ), + ( + "template", + models.ForeignKey( + help_text="Parameter template", + on_delete=django.db.models.deletion.CASCADE, + related_name="parameters", + to="common.parametertemplate", + verbose_name="Template", + ), + ), + ], + options={ + "verbose_name": "Parameter", + "verbose_name_plural": "Parameters", + "db_table": "part_partparameter", + "indexes": [ + models.Index( + fields=["model_type", "model_id"], + name="part_partpa_model_t_198c9d_idx", + ) + ], + "unique_together": {("model_type", "model_id", "template")}, + }, + bases=( + InvenTree.models.ContentTypeMixin, + InvenTree.models.PluginValidationMixin, + models.Model, + ), + ), + ], + database_operations=[], + ), + ] diff --git a/src/backend/InvenTree/common/migrations/0041_auto_20251203_1244.py b/src/backend/InvenTree/common/migrations/0041_auto_20251203_1244.py new file mode 100644 index 0000000000..7be962b226 --- /dev/null +++ b/src/backend/InvenTree/common/migrations/0041_auto_20251203_1244.py @@ -0,0 +1,116 @@ +# Generated by Django 5.2.8 on 2025-12-03 12:44 + +from django.db import migrations + +def convert_to_numeric_value(value: str, units: str): + """Convert a value (with units) to a numeric value. + + Defaults to zero if the value cannot be converted. + """ + + import InvenTree.conversion + + # Default value is null + result = None + + if units: + try: + result = InvenTree.conversion.convert_physical_value(value, units) + result = float(result.magnitude) + except Exception: + pass + else: + try: + result = float(value) + except Exception: + pass + + return result + + +def copy_manufacturer_part_parameters(apps, schema_editor): + """Copy ManufacturerPartParameter to Parameter.""" + + ManufacturerPartParameter = apps.get_model("company", "ManufacturerPartParameter") + Parameter = apps.get_model("common", "Parameter") + ParameterTemplate = apps.get_model("common", "ParameterTemplate") + ContentType = apps.get_model("contenttypes", "ContentType") + parameters = [] + + content_type, _created = ContentType.objects.get_or_create(app_label='company', model='manufacturerpart') + + N = ManufacturerPartParameter.objects.count() + + if N > 0: + print(f"\nMigrating {N} ManufacturerPartParameter objects to the Parameter table.") + + for parameter in ManufacturerPartParameter.objects.all(): + # Find the corresponding ParameterTemplate + template = ParameterTemplate.objects.filter(name=parameter.name).first() + + if not template: + # A matching template does not exist - let's create one + template = ParameterTemplate.objects.create( + name=parameter.name, + description='', + units=parameter.units or '', + model_type=None, + checkbox=False + ) + + parameters.append(Parameter( + template=template, + model_type=content_type, + model_id=parameter.manufacturer_part.id, + data=parameter.value, + data_numeric=convert_to_numeric_value(parameter.value, parameter.units), + )) + + if len(parameters) > 0: + assert ParameterTemplate.objects.count() > 0 + Parameter.objects.bulk_create(parameters) + print(f"\nMigrated {len(parameters)} ManufacturerPartParameter instances.") + + assert Parameter.objects.filter(model_type=content_type).count() == len(parameters) + + +def update_global_setting(apps, schema_editor): + """Update global setting key from PART_PARAMETER_ENFORCE_UNITS to PARAMETER_ENFORCE_UNITS.""" + GlobalSetting = apps.get_model("common", "InvenTreeSetting") + + OLD_KEY = 'PART_PARAMETER_ENFORCE_UNITS' + NEW_KEY = 'PARAMETER_ENFORCE_UNITS' + + try: + setting = GlobalSetting.objects.get(key=OLD_KEY) + + if setting is not None: + # Remove any existing new key + GlobalSetting.objects.filter(key=NEW_KEY).delete() + setting.key = NEW_KEY + setting.save() + print(f"Updated global setting key from {OLD_KEY} to {NEW_KEY}.") + except GlobalSetting.DoesNotExist: + pass + + +class Migration(migrations.Migration): + """Perform data migration for the ManufacturerPartParameter model.""" + + atomic = False + + dependencies = [ + ("common", "0040_parametertemplate_parameter"), + ("part", "0145_auto_20251203_1238"), + ] + + operations = [ + migrations.RunPython( + update_global_setting, + reverse_code=migrations.RunPython.noop + ), + migrations.RunPython( + copy_manufacturer_part_parameters, + reverse_code=migrations.RunPython.noop + ), + ] diff --git a/src/backend/InvenTree/common/models.py b/src/backend/InvenTree/common/models.py index 9104ee04d1..6e1dbd2e5f 100644 --- a/src/backend/InvenTree/common/models.py +++ b/src/backend/InvenTree/common/models.py @@ -7,6 +7,7 @@ import base64 import hashlib import hmac import json +import math import os import uuid from datetime import timedelta, timezone @@ -28,7 +29,7 @@ from django.core.files.base import ContentFile from django.core.files.storage import default_storage from django.core.mail import EmailMultiAlternatives, get_connection from django.core.mail.utils import DNS_NAME -from django.core.validators import MinValueValidator +from django.core.validators import MinLengthValidator, MinValueValidator from django.db import models, transaction from django.db.models import enums from django.db.models.signals import post_delete, post_save @@ -48,11 +49,14 @@ from rest_framework.exceptions import PermissionDenied from taggit.managers import TaggableManager import common.validators +import InvenTree.conversion +import InvenTree.exceptions import InvenTree.fields import InvenTree.helpers import InvenTree.models import InvenTree.ready import InvenTree.tasks +import InvenTree.validators import users.models from common.setting.type import InvenTreeSettingsKeyType, SettingsKeyType from common.settings import get_global_setting, global_setting_overrides @@ -1895,6 +1899,8 @@ class Attachment(InvenTree.models.MetadataMixin, InvenTree.models.InvenTreeModel An attachment can be either an uploaded file, or an external URL. Attributes: + model_type: The type of model to which this attachment is linked + model_id: The ID of the model to which this attachment is linked attachment: The uploaded file url: An external URL comment: A comment or description for the attachment @@ -2050,7 +2056,7 @@ class Attachment(InvenTree.models.MetadataMixin, InvenTree.models.InvenTreeModel if not issubclass(model_class, InvenTreeAttachmentMixin): raise ValidationError(_('Invalid model type specified for attachment')) - return model_class.check_attachment_permission(permission, user) + return model_class.check_related_permission(permission, user) class InvenTreeCustomUserStateModel(models.Model): @@ -2356,6 +2362,421 @@ class SelectionListEntry(models.Model): return self.label +class ParameterTemplate( + InvenTree.models.MetadataMixin, InvenTree.models.InvenTreeModel +): + """A ParameterTemplate provides a template for defining parameter values against various models. + + This allow for assigning arbitrary data fields against existing models, + extending their functionality beyond the built-in fields. + + Attributes: + name: The name (key) of the template + description: A description of the template + model_type: The type of model to which this template applies (e.g. 'part') + units: The units associated with the template (if applicable) + checkbox: Is this template a checkbox (boolean) type? + choices: Comma-separated list of choices (if applicable) + selectionlist: Optional link to a SelectionList for this template + enabled: Is this template enabled? + """ + + class Meta: + """Metaclass options for the ParameterTemplate model.""" + + verbose_name = _('Parameter Template') + verbose_name_plural = _('Parameter Templates') + + # Note: Data was migrated from the existing 'part_partparametertemplate' table + # Ref: https://github.com/inventree/InvenTree/pull/10699 + # To avoid data loss, we retain the existing table name + db_table = 'part_partparametertemplate' + + class ModelChoices(RenderChoices): + """Model choices for parameters.""" + + choice_fnc = common.validators.parameter_template_model_options + + @staticmethod + def get_api_url() -> str: + """Return the API URL associated with the ParameterTemplate model.""" + return reverse('api-parameter-template-list') + + def __str__(self): + """Return a string representation of a ParameterTemplate instance.""" + s = str(self.name) + if self.units: + s += f' ({self.units})' + return s + + def clean(self): + """Custom cleaning step for this model. + + Checks: + - A 'checkbox' field cannot have 'choices' set + - A 'checkbox' field cannot have 'units' set + """ + super().clean() + + # Check that checkbox parameters do not have units or choices + if self.checkbox: + if self.units: + raise ValidationError({ + 'units': _('Checkbox parameters cannot have units') + }) + + if self.choices: + raise ValidationError({ + 'choices': _('Checkbox parameters cannot have choices') + }) + + # Check that 'choices' are in fact valid + if self.choices is None: + self.choices = '' + else: + self.choices = str(self.choices).strip() + + if self.choices: + choice_set = set() + + for choice in self.choices.split(','): + choice = choice.strip() + + # Ignore empty choices + if not choice: + continue + + if choice in choice_set: + raise ValidationError({'choices': _('Choices must be unique')}) + + choice_set.add(choice) + + def validate_unique(self, exclude=None): + """Ensure that ParameterTemplates cannot be created with the same name. + + This test should be case-insensitive (which the unique caveat does not cover). + """ + super().validate_unique(exclude) + + try: + others = ParameterTemplate.objects.filter(name__iexact=self.name).exclude( + pk=self.pk + ) + + if others.exists(): + msg = _('Parameter template name must be unique') + raise ValidationError({'name': msg}) + except ParameterTemplate.DoesNotExist: + pass + + def get_choices(self): + """Return a list of choices for this parameter template.""" + if self.selectionlist: + return self.selectionlist.get_choices() + + if not self.choices: + return [] + + return [x.strip() for x in self.choices.split(',') if x.strip()] + + # TODO: Reintroduce validator for model_type + model_type = models.ForeignKey( + ContentType, + on_delete=models.SET_NULL, + blank=True, + null=True, + verbose_name=_('Model type'), + help_text=_('Target model type for this parameter template'), + ) + + name = models.CharField( + max_length=100, + verbose_name=_('Name'), + help_text=_('Parameter Name'), + unique=True, + ) + + units = models.CharField( + max_length=25, + verbose_name=_('Units'), + help_text=_('Physical units for this parameter'), + blank=True, + validators=[InvenTree.validators.validate_physical_units], + ) + + description = models.CharField( + max_length=250, + verbose_name=_('Description'), + help_text=_('Parameter description'), + blank=True, + ) + + checkbox = models.BooleanField( + default=False, + verbose_name=_('Checkbox'), + help_text=_('Is this parameter a checkbox?'), + ) + + choices = models.CharField( + max_length=5000, + verbose_name=_('Choices'), + help_text=_('Valid choices for this parameter (comma-separated)'), + blank=True, + ) + + selectionlist = models.ForeignKey( + SelectionList, + blank=True, + null=True, + on_delete=models.SET_NULL, + related_name='templates', + verbose_name=_('Selection List'), + help_text=_('Selection list for this parameter'), + ) + + enabled = models.BooleanField( + default=True, + verbose_name=_('Enabled'), + help_text=_('Is this parameter template enabled?'), + ) + + +@receiver( + post_save, sender=ParameterTemplate, dispatch_uid='post_save_parameter_template' +) +def post_save_parameter_template(sender, instance, created, **kwargs): + """Callback function when a ParameterTemplate is created or saved.""" + import common.tasks + + if InvenTree.ready.canAppAccessDatabase() and not InvenTree.ready.isImportingData(): + if not created: + # Schedule a background task to rebuild the parameters against this template + InvenTree.tasks.offload_task( + common.tasks.rebuild_parameters, + instance.pk, + force_async=True, + group='part', + ) + + +class Parameter( + UpdatedUserMixin, InvenTree.models.MetadataMixin, InvenTree.models.InvenTreeModel +): + """Class which represents a parameter value assigned to a particular model instance. + + Attributes: + model_type: The type of model to which this parameter is linked + model_id: The ID of the model to which this parameter is linked + template: The ParameterTemplate which defines this parameter + data: The value of the parameter [string] + data_numeric: Numeric value of the parameter (if applicable) [float] + note: Optional note associated with this parameter [string] + updated: Date/time that this parameter was last updated + updated_by: User who last updated this parameter + """ + + class Meta: + """Meta options for Parameter model.""" + + verbose_name = _('Parameter') + verbose_name_plural = _('Parameters') + unique_together = [['model_type', 'model_id', 'template']] + indexes = [models.Index(fields=['model_type', 'model_id'])] + + # Note: Data was migrated from the existing 'part_partparameter' table + # Ref: https://github.com/inventree/InvenTree/pull/10699 + # To avoid data loss, we retain the existing table name + db_table = 'part_partparameter' + + class ModelChoices(RenderChoices): + """Model choices for parameters.""" + + choice_fnc = common.validators.parameter_model_options + + @staticmethod + def get_api_url() -> str: + """Return the API URL associated with the Parameter model.""" + return reverse('api-parameter-list') + + def save(self, *args, **kwargs): + """Custom save method for Parameter model. + + - Update the numeric data field (if applicable) + """ + self.calculate_numeric_value() + + # Convert 'boolean' values to 'True' / 'False' + if self.template.checkbox: + self.data = InvenTree.helpers.str2bool(self.data) + self.data_numeric = 1 if self.data else 0 + + self.check_save() + super().save(*args, **kwargs) + + def delete(self): + """Perform custom delete checks before deleting a Parameter instance.""" + self.check_delete() + super().delete() + + def clean(self): + """Validate the Parameter before saving to the database.""" + super().clean() + + # Validate the parameter data against the template choices + if choices := self.template.get_choices(): + if self.data not in choices: + raise ValidationError({'data': _('Invalid choice for parameter value')}) + + self.calculate_numeric_value() + + # TODO: Check that the model_type for this parameter matches the template + + # Validate the parameter data against the template units + if ( + get_global_setting( + 'PARAMETER_ENFORCE_UNITS', True, cache=False, create=False + ) + and self.template.units + ): + try: + InvenTree.conversion.convert_physical_value( + self.data, self.template.units + ) + except ValidationError as e: + raise ValidationError({'data': e.message}) + + # Finally, run custom validation checks (via plugins) + from plugin import PluginMixinEnum, registry + + for plugin in registry.with_mixin(PluginMixinEnum.VALIDATION): + # Note: The validate_parameter function may raise a ValidationError + try: + if hasattr(plugin, 'validate_parameter'): + result = plugin.validate_parameter(self, self.data) + if result: + break + except ValidationError as exc: + # Re-throw the ValidationError against the 'data' field + raise ValidationError({'data': exc.message}) + except Exception: + InvenTree.exceptions.log_error('validate_parameter', plugin=plugin.slug) + + def calculate_numeric_value(self): + """Calculate a numeric value for the parameter data. + + - If a 'units' field is provided, then the data will be converted to the base SI unit. + - Otherwise, we'll try to do a simple float cast + """ + if self.template.units: + try: + self.data_numeric = InvenTree.conversion.convert_physical_value( + self.data, self.template.units + ) + except (ValidationError, ValueError): + self.data_numeric = None + + # No units provided, so try to cast to a float + else: + try: + self.data_numeric = float(self.data) + except ValueError: + self.data_numeric = None + + if self.data_numeric is not None and type(self.data_numeric) is float: + # Prevent out of range numbers, etc + # Ref: https://github.com/inventree/InvenTree/issues/7593 + if math.isnan(self.data_numeric) or math.isinf(self.data_numeric): + self.data_numeric = None + + def check_permission(self, permission, user): + """Check if the user has the required permission for this parameter.""" + from InvenTree.models import InvenTreeParameterMixin + + model_class = self.model_type.model_class() + + if not issubclass(model_class, InvenTreeParameterMixin): + raise ValidationError(_('Invalid model type specified for parameter')) + + return model_class.check_related_permission(permission, user) + + def check_save(self): + """Check if this parameter can be saved. + + The linked content_object can implement custom checks by overriding + the 'check_parameter_edit' method. + """ + from InvenTree.models import InvenTreeParameterMixin + + try: + instance = self.content_object + except InvenTree.models.InvenTreeModel.DoesNotExist: + return + + if instance and isinstance(instance, InvenTreeParameterMixin): + instance.check_parameter_save(self) + + def check_delete(self): + """Check if this parameter can be deleted.""" + from InvenTree.models import InvenTreeParameterMixin + + try: + instance = self.content_object + except InvenTree.models.InvenTreeModel.DoesNotExist: + return + + if instance and isinstance(instance, InvenTreeParameterMixin): + instance.check_parameter_delete(self) + + # TODO: Reintroduce validator for model_type + model_type = models.ForeignKey(ContentType, on_delete=models.CASCADE) + + model_id = models.PositiveIntegerField( + verbose_name=_('Model ID'), + help_text=_('ID of the target model for this parameter'), + ) + + content_object = GenericForeignKey('model_type', 'model_id') + + template = models.ForeignKey( + ParameterTemplate, + on_delete=models.CASCADE, + related_name='parameters', + verbose_name=_('Template'), + help_text=_('Parameter template'), + ) + + data = models.CharField( + max_length=500, + verbose_name=_('Data'), + help_text=_('Parameter Value'), + validators=[MinLengthValidator(1)], + ) + + data_numeric = models.FloatField(default=None, null=True, blank=True) + + note = models.CharField( + max_length=500, + blank=True, + verbose_name=_('Note'), + help_text=_('Optional note field'), + ) + + @property + def units(self): + """Return the units associated with the template.""" + return self.template.units + + @property + def name(self): + """Return the name of the template.""" + return self.template.name + + @property + def description(self): + """Return the description of the template.""" + return self.template.description + + class BarcodeScanResult(InvenTree.models.InvenTreeModel): """Model for storing barcode scans results.""" diff --git a/src/backend/InvenTree/common/serializers.py b/src/backend/InvenTree/common/serializers.py index f45e652a90..49c777b476 100644 --- a/src/backend/InvenTree/common/serializers.py +++ b/src/backend/InvenTree/common/serializers.py @@ -21,10 +21,14 @@ from importer.registry import register_importer from InvenTree.helpers import get_objectreference from InvenTree.helpers_model import construct_absolute_url from InvenTree.mixins import DataImportExportSerializerMixin +from InvenTree.models import InvenTreeParameterMixin from InvenTree.serializers import ( + ContentTypeField, + FilterableSerializerMixin, InvenTreeAttachmentSerializerField, InvenTreeImageSerializerField, InvenTreeModelSerializer, + enable_filter, ) from plugin import registry as plugin_registry from users.serializers import OwnerSerializer, UserSerializer @@ -691,12 +695,127 @@ class AttachmentSerializer(InvenTreeModelSerializer): raise PermissionDenied(permission_error_msg) # Check that the user has the required permissions to attach files to the target model - if not target_model_class.check_attachment_permission('change', user): - raise PermissionDenied(_(permission_error_msg)) + if not target_model_class.check_related_permission('change', user): + raise PermissionDenied(permission_error_msg) return super().save(**kwargs) +@register_importer() +class ParameterTemplateSerializer( + DataImportExportSerializerMixin, InvenTreeModelSerializer +): + """Serializer for the ParameterTemplate model.""" + + class Meta: + """Meta options for ParameterTemplateSerializer.""" + + model = common_models.ParameterTemplate + fields = [ + 'pk', + 'name', + 'units', + 'description', + 'model_type', + 'checkbox', + 'choices', + 'selectionlist', + 'enabled', + ] + + # Note: The choices are overridden at run-time on class initialization + model_type = ContentTypeField( + mixin_class=InvenTreeParameterMixin, + choices=common.validators.parameter_template_model_options, + label=_('Model Type'), + default='', + required=False, + allow_null=True, + ) + + def validate_model_type(self, model_type): + """Convert an empty string to None for the model_type field.""" + return model_type or None + + +@register_importer() +class ParameterSerializer( + FilterableSerializerMixin, DataImportExportSerializerMixin, InvenTreeModelSerializer +): + """Serializer for the Parameter model.""" + + class Meta: + """Meta options for ParameterSerializer.""" + + model = common_models.Parameter + fields = [ + 'pk', + 'template', + 'model_type', + 'model_id', + 'data', + 'data_numeric', + 'note', + 'updated', + 'updated_by', + 'template_detail', + 'updated_by_detail', + ] + + read_only_fields = ['updated', 'updated_by'] + + def save(self, **kwargs): + """Save the Parameter instance.""" + from InvenTree.models import InvenTreeParameterMixin + from users.permissions import check_user_permission + + model_type = self.validated_data.get('model_type', None) + + if model_type is None and self.instance: + model_type = self.instance.model_type + + # Ensure that the user has permission to modify parameters for the specified model + user = self.context.get('request').user + + target_model_class = model_type.model_class() + + if not issubclass(target_model_class, InvenTreeParameterMixin): + raise PermissionDenied(_('Invalid model type specified for parameter')) + + permission_error_msg = _( + 'User does not have permission to create or edit parameters for this model' + ) + + if not check_user_permission(user, target_model_class, 'change'): + raise PermissionDenied(permission_error_msg) + + if not target_model_class.check_related_permission('change', user): + raise PermissionDenied(permission_error_msg) + + instance = super().save(**kwargs) + instance.updated_by = user + instance.save() + + return instance + + # Note: The choices are overridden at run-time on class initialization + model_type = ContentTypeField( + mixin_class=InvenTreeParameterMixin, + choices=common.validators.parameter_model_options, + label=_('Model Type'), + default='', + allow_null=False, + ) + + updated_by_detail = enable_filter( + UserSerializer(source='updated_by', read_only=True, many=False), True + ) + + template_detail = enable_filter( + ParameterTemplateSerializer(source='template', read_only=True, many=False), True + ) + + class IconSerializer(serializers.Serializer): """Serializer for an icon.""" diff --git a/src/backend/InvenTree/common/setting/system.py b/src/backend/InvenTree/common/setting/system.py index 49d06e30b4..087e494400 100644 --- a/src/backend/InvenTree/common/setting/system.py +++ b/src/backend/InvenTree/common/setting/system.py @@ -521,14 +521,6 @@ SYSTEM_SETTINGS: dict[str, InvenTreeSettingsKeyType] = { 'default': '', 'validator': common.validators.validate_icon, }, - 'PART_PARAMETER_ENFORCE_UNITS': { - 'name': _('Enforce Parameter Units'), - 'description': _( - 'If units are provided, parameter values must match the specified units' - ), - 'default': True, - 'validator': bool, - }, 'PRICING_DECIMAL_PLACES_MIN': { 'name': _('Minimum Pricing Decimal Places'), 'description': _( @@ -669,6 +661,14 @@ SYSTEM_SETTINGS: dict[str, InvenTreeSettingsKeyType] = { 'default': 'A4', 'choices': report.helpers.report_page_size_options, }, + 'PARAMETER_ENFORCE_UNITS': { + 'name': _('Enforce Parameter Units'), + 'description': _( + 'If units are provided, parameter values must match the specified units' + ), + 'default': True, + 'validator': bool, + }, 'SERIAL_NUMBER_GLOBALLY_UNIQUE': { 'name': _('Globally Unique Serials'), 'description': _('Serial numbers for stock items must be globally unique'), diff --git a/src/backend/InvenTree/common/tasks.py b/src/backend/InvenTree/common/tasks.py index a718c2e201..6a86367937 100644 --- a/src/backend/InvenTree/common/tasks.py +++ b/src/backend/InvenTree/common/tasks.py @@ -172,3 +172,35 @@ def delete_old_notes_images(): if not found: logger.info('Deleting note %s - image file not linked to a note', image) os.remove(os.path.join(notes_dir, image)) + + +@tracer.start_as_current_span('rebuild_parameters') +def rebuild_parameters(template_id): + """Rebuild all parameters for a given template. + + This function is called when a base template is changed, + which may cause the base unit to be adjusted. + """ + from common.models import Parameter, ParameterTemplate + + try: + template = ParameterTemplate.objects.get(pk=template_id) + except ParameterTemplate.DoesNotExist: + return + + parameters = Parameter.objects.filter(template=template) + + n = 0 + + for parameter in parameters: + # Update the parameter if the numeric value has changed + value_old = parameter.data_numeric + parameter.calculate_numeric_value() + + if value_old != parameter.data_numeric: + parameter.full_clean() + parameter.save() + n += 1 + + if n > 0: + logger.info("Rebuilt %s parameters for template '%s'", n, template.name) diff --git a/src/backend/InvenTree/common/test_api.py b/src/backend/InvenTree/common/test_api.py new file mode 100644 index 0000000000..4e77eacf85 --- /dev/null +++ b/src/backend/InvenTree/common/test_api.py @@ -0,0 +1,428 @@ +"""API unit tests for InvenTree common functionality.""" + +from django.urls import reverse + +import common.models +from InvenTree.unit_test import InvenTreeAPITestCase + + +class ParameterAPITests(InvenTreeAPITestCase): + """Tests for the Parameter API.""" + + roles = 'all' + + def test_template_options(self): + """Test OPTIONS information for the ParameterTemplate API endpoint.""" + url = reverse('api-parameter-template-list') + + options = self.options(url) + actions = options.data['actions']['GET'] + + for field in [ + 'pk', + 'name', + 'units', + 'description', + 'model_type', + 'selectionlist', + 'enabled', + ]: + self.assertIn( + field, + actions.keys(), + f'Field "{field}" missing from ParameterTemplate API!', + ) + + model_types = [act['value'] for act in actions['model_type']['choices']] + + for mdl in [ + 'part.part', + 'build.build', + 'company.company', + 'order.purchaseorder', + ]: + self.assertIn( + mdl, + model_types, + f'Model type "{mdl}" missing from ParameterTemplate API!', + ) + + def test_parameter_options(self): + """Test OPTIONS information for the Parameter API endpoint.""" + url = reverse('api-parameter-list') + + options = self.options(url) + actions = options.data['actions']['GET'] + + for field in [ + 'pk', + 'template', + 'model_type', + 'model_id', + 'data', + 'data_numeric', + ]: + self.assertIn( + field, actions.keys(), f'Field "{field}" missing from Parameter API!' + ) + + self.assertFalse(actions['data']['read_only']) + self.assertFalse(actions['model_type']['read_only']) + + def test_template_api(self): + """Test ParameterTemplate API functionality.""" + url = reverse('api-parameter-template-list') + + N = common.models.ParameterTemplate.objects.count() + + # Create a new ParameterTemplate - initially with invalid model_type field + data = { + 'name': 'Test Parameter', + 'units': 'mm', + 'description': 'A test parameter template', + 'model_type': 'order.salesorderx', + 'enabled': True, + } + + response = self.post(url, data, expected_code=400) + self.assertIn('Content type not found', str(response.data['model_type'])) + + data['model_type'] = 'order.salesorder' + + response = self.post(url, data, expected_code=201) + pk = response.data['pk'] + + # Verify that the ParameterTemplate was created + self.assertEqual(common.models.ParameterTemplate.objects.count(), N + 1) + + template = common.models.ParameterTemplate.objects.get(pk=pk) + self.assertEqual(template.name, 'Test Parameter') + self.assertEqual(template.description, 'A test parameter template') + self.assertEqual(template.units, 'mm') + + # Let's update the Template via the API + data = {'description': 'An UPDATED test parameter template'} + + response = self.patch( + reverse('api-parameter-template-detail', kwargs={'pk': pk}), + data, + expected_code=200, + ) + + template.refresh_from_db() + self.assertEqual(template.description, 'An UPDATED test parameter template') + + # Finally, let's delete the Template + response = self.delete( + reverse('api-parameter-template-detail', kwargs={'pk': pk}), + expected_code=204, + ) + + self.assertEqual(common.models.ParameterTemplate.objects.count(), N) + self.assertFalse(common.models.ParameterTemplate.objects.filter(pk=pk).exists()) + + # Let's create a template which does not specify a model_type + data = { + 'name': 'Universal Parameter', + 'units': '', + 'description': 'A parameter template for all models', + 'enabled': False, + } + + response = self.post(url, data, expected_code=201) + + self.assertIsNone(response.data['model_type']) + self.assertFalse(response.data['enabled']) + + def test_template_filters(self): + """Tests for API filters against ParameterTemplate endpoint.""" + from company.models import Company + + # Create some ParameterTemplate objects + t1 = common.models.ParameterTemplate.objects.create( + name='Template A', + description='Template with choices', + choices='apple,banana,cherry', + enabled=True, + ) + + t2 = common.models.ParameterTemplate.objects.create( + name='Template B', + description='Template without choices', + enabled=True, + units='mm', + model_type=Company.get_content_type(), + ) + + t3 = common.models.ParameterTemplate.objects.create( + name='Template C', description='Another template', enabled=False + ) + + url = reverse('api-parameter-template-list') + + # Filter by 'enabled' status + response = self.get(url, data={'enabled': True}) + self.assertEqual(len(response.data), 2) + + response = self.get(url, data={'enabled': False}) + self.assertEqual(len(response.data), 1) + self.assertEqual(response.data[0]['pk'], t3.pk) + + # Filter by 'has_choices' + response = self.get(url, data={'has_choices': True}) + self.assertEqual(len(response.data), 1) + self.assertEqual(response.data[0]['pk'], t1.pk) + + response = self.get(url, data={'has_choices': False}) + self.assertEqual(len(response.data), 2) + + # Filter by 'model_type' + response = self.get(url, data={'model_type': 'company.company'}) + self.assertEqual(len(response.data), 1) + self.assertEqual(response.data[0]['pk'], t2.pk) + + # Filter by 'has_units' + response = self.get(url, data={'has_units': True}) + self.assertEqual(len(response.data), 1) + self.assertEqual(response.data[0]['pk'], t2.pk) + + response = self.get(url, data={'has_units': False}) + self.assertEqual(len(response.data), 2) + + # Filter by 'for_model' + # Note that a 'blank' model_type is considered to match all models + response = self.get(url, data={'for_model': 'part.part'}) + self.assertEqual(len(response.data), 2) + + response = self.get(url, data={'for_model': 'company'}) + self.assertEqual(len(response.data), 3) + + # Create a Parameter against a specific Company instance + company = Company.objects.create( + name='Test Company', description='A company for testing' + ) + + common.models.Parameter.objects.create( + template=t1, + model_type=company.get_content_type(), + model_id=company.pk, + data='apple', + ) + + model_types = {'company': 3, 'part.part': 2, 'order.purchaseorder': 2} + + for model_name, count in model_types.items(): + response = self.get(url, data={'for_model': model_name}) + self.assertEqual( + len(response.data), + count, + f'Incorrect number of templates for model "{model_name}"', + ) + + # Filter with an invalid 'for_model' + response = self.get( + url, data={'for_model': 'invalid.modelname'}, expected_code=400 + ) + + self.assertIn('Invalid content type: invalid.modelname', str(response.data)) + + # Filter the "exists for model" filter + model_types = {'company': 1, 'part.part': 0, 'order.purchaseorder': 0} + + for model_name, count in model_types.items(): + response = self.get(url, data={'exists_for_model': model_name}) + self.assertEqual( + len(response.data), + count, + f'Incorrect number of templates for model "{model_name}"', + ) + + def test_parameter_api(self): + """Test Parameter API functionality.""" + # Create a simple part to test with + from part.models import Part + + part = Part.objects.create(name='Test Part', description='A part for testing') + + N = common.models.Parameter.objects.count() + + # Create a ParameterTemplate for the Part model + template = common.models.ParameterTemplate.objects.create( + name='Length', + units='mm', + model_type=part.get_content_type(), + description='Length of part', + enabled=True, + ) + + # Create a Parameter via the API + url = reverse('api-parameter-list') + + data = { + 'template': template.pk, + 'model_type': 'part.part', + 'model_id': part.pk, + 'data': '25.4', + } + + # Initially, user does not have correct permissions + response = self.post(url, data=data, expected_code=403) + + self.assertIn( + 'User does not have permission to create or edit parameters for this model', + str(response.data['detail']), + ) + + # Grant user the correct permissions + self.assignRole('part.add') + + response = self.post(url, data=data, expected_code=201) + + parameter = common.models.Parameter.objects.get(pk=response.data['pk']) + + # Check that the Parameter was created + self.assertEqual(common.models.Parameter.objects.count(), N + 1) + + # Try to create a duplicate Parameter (should fail) + response = self.post(url, data=data, expected_code=400) + + self.assertIn( + 'The fields model_type, model_id, template must make a unique set.', + str(response.data['non_field_errors']), + ) + + # Let's edit the Parameter via the API + url = reverse('api-parameter-detail', kwargs={'pk': parameter.pk}) + + response = self.patch(url, data={'data': '-2 inches'}, expected_code=200) + + # Ensure parameter conversion has correctly updated data_numeric field + data = response.data + self.assertEqual(data['data'], '-2 inches') + self.assertAlmostEqual(data['data_numeric'], -50.8, places=2) + + # Finally, delete the Parameter via the API + response = self.delete(url, expected_code=204) + + self.assertEqual(common.models.Parameter.objects.count(), N) + self.assertFalse( + common.models.Parameter.objects.filter(pk=parameter.pk).exists() + ) + + def test_parameter_annotation(self): + """Test that we can annotate parameters against a queryset.""" + from company.models import Company + + templates = [] + parameters = [] + companies = [] + + for ii in range(100): + company = Company( + name=f'Test Company {ii}', + description='A company for testing parameter annotations', + ) + companies.append(company) + + Company.objects.bulk_create(companies) + + # Let's create a large number of parameters + for ii in range(25): + templates.append( + common.models.ParameterTemplate( + name=f'Test Parameter {ii}', + units='', + description='A parameter for testing annotations', + model_type=Company.get_content_type(), + enabled=True, + ) + ) + + common.models.ParameterTemplate.objects.bulk_create(templates) + + # Create a parameter for every company against every template + for company in Company.objects.all(): + for template in common.models.ParameterTemplate.objects.all(): + parameters.append( + common.models.Parameter( + template=template, + model_type=company.get_content_type(), + model_id=company.pk, + data=f'Test data for {company.name} - {template.name}', + ) + ) + + common.models.Parameter.objects.bulk_create(parameters) + + self.assertEqual( + common.models.Parameter.objects.count(), len(companies) * len(templates) + ) + + # We will fetch the companies, annotated with all parameters + url = reverse('api-company-list') + + # By default, we do not expect any parameter annotations + response = self.get(url, data={'limit': 5}) + + self.assertEqual(response.data['count'], len(companies)) + for company in response.data['results']: + self.assertNotIn('parameters', company) + + # Fetch all companies, explicitly without parameters + with self.assertNumQueriesLessThan(20): + response = self.get(url, data={'parameters': False}) + + # Now, annotate with parameters + # This must be done efficiently, without an 1 + N query pattern + with self.assertNumQueriesLessThan(45): + response = self.get(url, data={'parameters': True}) + + self.assertEqual(len(response.data), len(companies)) + + for company in response.data: + self.assertIn('parameters', company) + self.assertEqual( + len(company['parameters']), + len(templates), + 'Incorrect number of parameter annotations found', + ) + + def test_parameter_delete(self): + """Test that associated parameters are correctly deleted when removing the linked model.""" + from part.models import Part + + part = Part.objects.create( + name='Test Part', description='A part for testing', active=False + ) + + # Create a ParameterTemplate for the Part model + template = common.models.ParameterTemplate.objects.create( + name='Test Parameter', + description='A parameter template for testing parameter deletion', + model_type=None, + ) + + # Create a Parameter for the Build + parameter = common.models.Parameter.objects.create( + template=template, + model_type=part.get_content_type(), + model_id=part.pk, + data='Test data', + ) + + self.assertTrue( + common.models.Parameter.objects.filter(pk=parameter.pk).exists() + ) + + N = common.models.Parameter.objects.count() + + # Now delete the part instance + self.assignRole('part.delete') + self.delete( + reverse('api-part-detail', kwargs={'pk': part.pk}), expected_code=204 + ) + + self.assertEqual(common.models.Parameter.objects.count(), N - 1) + self.assertFalse( + common.models.Parameter.objects.filter(template=template.pk).exists() + ) diff --git a/src/backend/InvenTree/common/test_migrations.py b/src/backend/InvenTree/common/test_migrations.py index 74b899f3f8..6c21dc1074 100644 --- a/src/backend/InvenTree/common/test_migrations.py +++ b/src/backend/InvenTree/common/test_migrations.py @@ -7,8 +7,6 @@ from django.core.files.base import ContentFile from django_test_migrations.contrib.unittest_case import MigratorTestCase -from InvenTree import unit_test - def get_legacy_models(): """Return a set of legacy attachment models.""" @@ -43,7 +41,7 @@ class TestForwardMigrations(MigratorTestCase): """Test entire schema migration sequence for the common app.""" migrate_from = ('common', '0024_notesimage_model_id_notesimage_model_type') - migrate_to = ('common', unit_test.getNewestMigrationFile('common')) + migrate_to = ('common', '0039_emailthread_emailmessage') def prepare(self): """Create initial data. diff --git a/src/backend/InvenTree/common/tests.py b/src/backend/InvenTree/common/tests.py index 52a1eeca95..4cc16136bd 100644 --- a/src/backend/InvenTree/common/tests.py +++ b/src/backend/InvenTree/common/tests.py @@ -32,7 +32,7 @@ from InvenTree.unit_test import ( PluginMixin, addUserPermission, ) -from part.models import Part, PartParameterTemplate +from part.models import Part from plugin import registry from .api import WebhookView @@ -45,6 +45,7 @@ from .models import ( NotesImage, NotificationEntry, NotificationMessage, + ParameterTemplate, ProjectCode, SelectionList, SelectionListEntry, @@ -2055,27 +2056,37 @@ class SelectionListTest(InvenTreeAPITestCase): # Add to parameter part = Part.objects.get(pk=1) - template = PartParameterTemplate.objects.create( + template = ParameterTemplate.objects.create( name='test_parameter', units='', selectionlist=self.list ) rsp = self.get( - reverse('api-part-parameter-template-detail', kwargs={'pk': template.pk}) + reverse('api-parameter-template-detail', kwargs={'pk': template.pk}) ) self.assertEqual(rsp.data['name'], 'test_parameter') self.assertEqual(rsp.data['choices'], '') # Add to part - url = reverse('api-part-parameter-list') + url = reverse('api-parameter-list') response = self.post( url, - {'part': part.pk, 'template': template.pk, 'data': 70}, + { + 'model_id': part.pk, + 'model_type': 'part.part', + 'template': template.pk, + 'data': 70, + }, expected_code=400, ) self.assertIn('Invalid choice for parameter value', response.data['data']) response = self.post( url, - {'part': part.pk, 'template': template.pk, 'data': self.entry1.value}, + { + 'model_id': part.pk, + 'model_type': 'part.part', + 'template': template.pk, + 'data': self.entry1.value, + }, expected_code=201, ) self.assertEqual(response.data['data'], self.entry1.value) diff --git a/src/backend/InvenTree/common/validators.py b/src/backend/InvenTree/common/validators.py index 056bc4ca1b..02c3805f96 100644 --- a/src/backend/InvenTree/common/validators.py +++ b/src/backend/InvenTree/common/validators.py @@ -9,6 +9,35 @@ import common.icons from common.settings import get_global_setting +def parameter_model_types(): + """Return a list of valid parameter model choices.""" + import InvenTree.models + + return list( + InvenTree.helpers_model.getModelsWithMixin( + InvenTree.models.InvenTreeParameterMixin + ) + ) + + +def parameter_model_options(): + """Return a list of options for models which support parameters.""" + return [ + (model.__name__.lower(), model._meta.verbose_name) + for model in parameter_model_types() + ] + + +def parameter_template_model_options(): + """Return a list of options for models which support parameter templates.""" + options = [ + (model.__name__.lower(), model._meta.verbose_name) + for model in parameter_model_types() + ] + + return [(None, _('All models')), *options] + + def attachment_model_types(): """Return a list of valid attachment model choices.""" import InvenTree.models diff --git a/src/backend/InvenTree/company/admin.py b/src/backend/InvenTree/company/admin.py index 64610709af..b35218ad1e 100644 --- a/src/backend/InvenTree/company/admin.py +++ b/src/backend/InvenTree/company/admin.py @@ -9,7 +9,6 @@ from .models import ( Company, Contact, ManufacturerPart, - ManufacturerPartParameter, SupplierPart, SupplierPriceBreak, ) @@ -56,17 +55,6 @@ class ManufacturerPartAdmin(admin.ModelAdmin): autocomplete_fields = ('part', 'manufacturer') -@admin.register(ManufacturerPartParameter) -class ManufacturerPartParameterAdmin(admin.ModelAdmin): - """Admin class for ManufacturerPartParameter model.""" - - list_display = ('manufacturer_part', 'name', 'value') - - search_fields = ['manufacturer_part__manufacturer__name', 'name', 'value'] - - autocomplete_fields = ('manufacturer_part',) - - @admin.register(SupplierPriceBreak) class SupplierPriceBreakAdmin(admin.ModelAdmin): """Admin class for the SupplierPriceBreak model.""" diff --git a/src/backend/InvenTree/company/api.py b/src/backend/InvenTree/company/api.py index 42a58fef79..15406ca71a 100644 --- a/src/backend/InvenTree/company/api.py +++ b/src/backend/InvenTree/company/api.py @@ -9,7 +9,7 @@ from django_filters.rest_framework.filterset import FilterSet import part.models from data_exporter.mixins import DataExportViewMixin -from InvenTree.api import ListCreateDestroyAPIView, MetadataView +from InvenTree.api import ListCreateDestroyAPIView, MetadataView, ParameterListMixin from InvenTree.fields import InvenTreeOutputOption, OutputConfiguration from InvenTree.filters import SEARCH_ORDER_FILTER, SEARCH_ORDER_FILTER_ALIAS from InvenTree.mixins import ( @@ -24,7 +24,6 @@ from .models import ( Company, Contact, ManufacturerPart, - ManufacturerPartParameter, SupplierPart, SupplierPriceBreak, ) @@ -32,14 +31,27 @@ from .serializers import ( AddressSerializer, CompanySerializer, ContactSerializer, - ManufacturerPartParameterSerializer, ManufacturerPartSerializer, SupplierPartSerializer, SupplierPriceBreakSerializer, ) -class CompanyList(DataExportViewMixin, ListCreateAPI): +class CompanyMixin(OutputOptionsMixin): + """Mixin class for Company API endpoints.""" + + queryset = Company.objects.all() + serializer_class = CompanySerializer + + def get_queryset(self): + """Return annotated queryset for the company endpoints.""" + queryset = super().get_queryset() + queryset = CompanySerializer.annotate_queryset(queryset) + + return queryset + + +class CompanyList(CompanyMixin, ParameterListMixin, DataExportViewMixin, ListCreateAPI): """API endpoint for accessing a list of Company objects. Provides two methods: @@ -48,14 +60,6 @@ class CompanyList(DataExportViewMixin, ListCreateAPI): - POST: Create a new Company object """ - serializer_class = CompanySerializer - queryset = Company.objects.all() - - def get_queryset(self): - """Return annotated queryset for the company list endpoint.""" - queryset = super().get_queryset() - return CompanySerializer.annotate_queryset(queryset) - filter_backends = SEARCH_ORDER_FILTER filterset_fields = [ @@ -73,19 +77,9 @@ class CompanyList(DataExportViewMixin, ListCreateAPI): ordering = 'name' -class CompanyDetail(RetrieveUpdateDestroyAPI): +class CompanyDetail(CompanyMixin, RetrieveUpdateDestroyAPI): """API endpoint for detail of a single Company object.""" - queryset = Company.objects.all() - serializer_class = CompanySerializer - - def get_queryset(self): - """Return annotated queryset for the company detail endpoint.""" - queryset = super().get_queryset() - queryset = CompanySerializer.annotate_queryset(queryset) - - return queryset - class ContactList(DataExportViewMixin, ListCreateDestroyAPIView): """API endpoint for list view of Company model.""" @@ -174,10 +168,30 @@ class ManufacturerOutputOptions(OutputConfiguration): ] +class ManufacturerPartMixin(SerializerContextMixin): + """Mixin class for ManufacturerPart API endpoints.""" + + queryset = ManufacturerPart.objects.all() + serializer_class = ManufacturerPartSerializer + + def get_queryset(self, *args, **kwargs): + """Return annotated queryset for the ManufacturerPart list endpoint.""" + queryset = super().get_queryset(*args, **kwargs) + + queryset = queryset.prefetch_related( + 'part', 'manufacturer', 'supplier_parts', 'tags' + ) + + queryset = ManufacturerPart.annotate_parameters(queryset) + + return queryset + + class ManufacturerPartList( + ManufacturerPartMixin, SerializerContextMixin, - DataExportViewMixin, OutputOptionsMixin, + ParameterListMixin, ListCreateDestroyAPIView, ): """API endpoint for list view of ManufacturerPart object. @@ -186,13 +200,10 @@ class ManufacturerPartList( - POST: Create a new ManufacturerPart object """ - queryset = ManufacturerPart.objects.all().prefetch_related( - 'part', 'manufacturer', 'supplier_parts', 'tags' - ) - serializer_class = ManufacturerPartSerializer filterset_class = ManufacturerPartFilter - output_options = ManufacturerOutputOptions filter_backends = SEARCH_ORDER_FILTER + output_options = ManufacturerOutputOptions + search_fields = [ 'manufacturer__name', 'description', @@ -205,7 +216,9 @@ class ManufacturerPartList( ] -class ManufacturerPartDetail(RetrieveUpdateDestroyAPI): +class ManufacturerPartDetail( + ManufacturerPartMixin, OutputOptionsMixin, RetrieveUpdateDestroyAPI +): """API endpoint for detail view of ManufacturerPart object. - GET: Retrieve detail view @@ -213,59 +226,6 @@ class ManufacturerPartDetail(RetrieveUpdateDestroyAPI): - DELETE: Delete object """ - queryset = ManufacturerPart.objects.all() - serializer_class = ManufacturerPartSerializer - - -class ManufacturerPartParameterFilter(FilterSet): - """Custom filterset for the ManufacturerPartParameterList API endpoint.""" - - class Meta: - """Metaclass options.""" - - model = ManufacturerPartParameter - fields = ['name', 'value', 'units', 'manufacturer_part'] - - manufacturer = rest_filters.ModelChoiceFilter( - queryset=Company.objects.all(), field_name='manufacturer_part__manufacturer' - ) - - part = rest_filters.ModelChoiceFilter( - queryset=part.models.Part.objects.all(), field_name='manufacturer_part__part' - ) - - -class ManufacturerPartParameterOptions(OutputConfiguration): - """Available output options for the ManufacturerPartParameter endpoints.""" - - OPTIONS = [ - InvenTreeOutputOption( - description='Include detailed information about the linked ManufacturerPart in the response', - flag='manufacturer_part_detail', - default=False, - ) - ] - - -class ManufacturerPartParameterList( - SerializerContextMixin, ListCreateDestroyAPIView, OutputOptionsMixin -): - """API endpoint for list view of ManufacturerPartParamater model.""" - - queryset = ManufacturerPartParameter.objects.all() - serializer_class = ManufacturerPartParameterSerializer - filterset_class = ManufacturerPartParameterFilter - output_options = ManufacturerPartParameterOptions - filter_backends = SEARCH_ORDER_FILTER - search_fields = ['name', 'value', 'units'] - - -class ManufacturerPartParameterDetail(RetrieveUpdateDestroyAPI): - """API endpoint for detail view of ManufacturerPartParameter model.""" - - queryset = ManufacturerPartParameter.objects.all() - serializer_class = ManufacturerPartParameterSerializer - class SupplierPartFilter(FilterSet): """API filters for the SupplierPartList endpoint.""" @@ -378,7 +338,11 @@ class SupplierPartMixin: class SupplierPartList( - DataExportViewMixin, SupplierPartMixin, OutputOptionsMixin, ListCreateDestroyAPIView + DataExportViewMixin, + SupplierPartMixin, + ParameterListMixin, + OutputOptionsMixin, + ListCreateDestroyAPIView, ): """API endpoint for list view of SupplierPart object. @@ -387,7 +351,6 @@ class SupplierPartList( """ filterset_class = SupplierPartFilter - filter_backends = SEARCH_ORDER_FILTER_ALIAS output_options = SupplierPartOutputOptions @@ -518,22 +481,6 @@ class SupplierPriceBreakDetail(SupplierPriceBreakMixin, RetrieveUpdateDestroyAPI manufacturer_part_api_urls = [ - path( - 'parameter/', - include([ - path( - '/', - ManufacturerPartParameterDetail.as_view(), - name='api-manufacturer-part-parameter-detail', - ), - # Catch anything else - path( - '', - ManufacturerPartParameterList.as_view(), - name='api-manufacturer-part-parameter-list', - ), - ]), - ), path( '/', include([ diff --git a/src/backend/InvenTree/company/migrations/0077_delete_manufacturerpartparameter.py b/src/backend/InvenTree/company/migrations/0077_delete_manufacturerpartparameter.py new file mode 100644 index 0000000000..0b39842dc3 --- /dev/null +++ b/src/backend/InvenTree/company/migrations/0077_delete_manufacturerpartparameter.py @@ -0,0 +1,22 @@ +# Generated by Django 5.2.8 on 2025-11-25 07:03 + +from django.db import migrations + + +class Migration(migrations.Migration): + """Remove the ManufacturerPartParameter model. + + The data has been migrated to the common.Parameter model in a previous migration. + """ + + dependencies = [ + ("company", "0076_alter_company_image"), + ("common", "0041_auto_20251203_1244"), + ("part", "0146_auto_20251203_1241") + ] + + operations = [ + migrations.DeleteModel( + name="ManufacturerPartParameter", + ), + ] diff --git a/src/backend/InvenTree/company/models.py b/src/backend/InvenTree/company/models.py index 013a6b011b..fbe8ccdd01 100644 --- a/src/backend/InvenTree/company/models.py +++ b/src/backend/InvenTree/company/models.py @@ -77,6 +77,7 @@ class CompanyReportContext(report.mixins.BaseReportContext): class Company( InvenTree.models.InvenTreeAttachmentMixin, + InvenTree.models.InvenTreeParameterMixin, InvenTree.models.InvenTreeNotesMixin, report.mixins.InvenTreeReportMixin, InvenTree.models.InvenTreeImageMixin, @@ -472,6 +473,7 @@ class Address(InvenTree.models.InvenTreeModel): class ManufacturerPart( InvenTree.models.InvenTreeAttachmentMixin, + InvenTree.models.InvenTreeParameterMixin, InvenTree.models.InvenTreeBarcodeMixin, InvenTree.models.InvenTreeNotesMixin, InvenTree.models.InvenTreeMetadataModel, @@ -583,55 +585,6 @@ class ManufacturerPart( return s -class ManufacturerPartParameter(InvenTree.models.InvenTreeModel): - """A ManufacturerPartParameter represents a key:value parameter for a MnaufacturerPart. - - This is used to represent parameters / properties for a particular manufacturer part. - - Each parameter is a simple string (text) value. - """ - - class Meta: - """Metaclass defines extra model options.""" - - verbose_name = _('Manufacturer Part Parameter') - unique_together = ('manufacturer_part', 'name') - - @staticmethod - def get_api_url(): - """Return the API URL associated with the ManufacturerPartParameter model.""" - return reverse('api-manufacturer-part-parameter-list') - - manufacturer_part = models.ForeignKey( - ManufacturerPart, - on_delete=models.CASCADE, - related_name='parameters', - verbose_name=_('Manufacturer Part'), - ) - - name = models.CharField( - max_length=500, - blank=False, - verbose_name=_('Name'), - help_text=_('Parameter name'), - ) - - value = models.CharField( - max_length=500, - blank=False, - verbose_name=_('Value'), - help_text=_('Parameter value'), - ) - - units = models.CharField( - max_length=64, - blank=True, - null=True, - verbose_name=_('Units'), - help_text=_('Parameter units'), - ) - - class SupplierPartManager(models.Manager): """Define custom SupplierPart objects manager. @@ -651,6 +604,7 @@ class SupplierPartManager(models.Manager): class SupplierPart( InvenTree.models.InvenTreeAttachmentMixin, + InvenTree.models.InvenTreeParameterMixin, InvenTree.models.MetadataMixin, InvenTree.models.InvenTreeBarcodeMixin, InvenTree.models.InvenTreeNotesMixin, diff --git a/src/backend/InvenTree/company/serializers.py b/src/backend/InvenTree/company/serializers.py index 5488abbf43..ba68d4a42b 100644 --- a/src/backend/InvenTree/company/serializers.py +++ b/src/backend/InvenTree/company/serializers.py @@ -11,6 +11,7 @@ from rest_framework import serializers from sql_util.utils import SubqueryCount from taggit.serializers import TagListSerializerField +import common.serializers import company.filters import part.filters import part.serializers as part_serializers @@ -36,7 +37,6 @@ from .models import ( Company, Contact, ManufacturerPart, - ManufacturerPartParameter, SupplierPart, SupplierPriceBreak, ) @@ -113,6 +113,7 @@ class AddressBriefSerializer(InvenTreeModelSerializer): @register_importer() class CompanySerializer( + FilterableSerializerMixin, DataImportExportSerializerMixin, NotesFieldMixin, RemoteImageMixin, @@ -152,6 +153,7 @@ class CompanySerializer( 'address_count', 'primary_address', 'tax_id', + 'parameters', ] @staticmethod @@ -174,14 +176,18 @@ class CompanySerializer( ) ) + queryset = Company.annotate_parameters(queryset) + return queryset address = serializers.SerializerMethodField( - label=_( + label=_('Primary Address'), + help_text=_( 'Return the string representation for the primary address. This property exists for backwards compatibility.' ), allow_null=True, ) + primary_address = serializers.SerializerMethodField(allow_null=True) @extend_schema_field(serializers.CharField()) @@ -212,6 +218,12 @@ class CompanySerializer( help_text=_('Default currency used for this supplier'), required=True ) + parameters = enable_filter( + common.serializers.ParameterSerializer(many=True, read_only=True), + False, + filter_name='parameters', + ) + def save(self): """Save the Company instance.""" super().save() @@ -275,10 +287,17 @@ class ManufacturerPartSerializer( 'barcode_hash', 'notes', 'tags', + 'parameters', ] tags = TagListSerializerField(required=False) + parameters = enable_filter( + common.serializers.ParameterSerializer(many=True, read_only=True), + False, + filter_name='parameters', + ) + part_detail = enable_filter( part_serializers.PartBriefSerializer( source='part', many=False, read_only=True, allow_null=True @@ -302,33 +321,6 @@ class ManufacturerPartSerializer( ) -@register_importer() -class ManufacturerPartParameterSerializer( - FilterableSerializerMixin, DataImportExportSerializerMixin, InvenTreeModelSerializer -): - """Serializer for the ManufacturerPartParameter model.""" - - class Meta: - """Metaclass options.""" - - model = ManufacturerPartParameter - - fields = [ - 'pk', - 'manufacturer_part', - 'manufacturer_part_detail', - 'name', - 'value', - 'units', - ] - - manufacturer_part_detail = enable_filter( - ManufacturerPartSerializer( - source='manufacturer_part', many=False, read_only=True, allow_null=True - ) - ) - - class SupplierPriceBreakBriefSerializer( FilterableSerializerMixin, InvenTreeModelSerializer ): @@ -415,6 +407,7 @@ class SupplierPartSerializer( 'part_detail', 'tags', 'price_breaks', + 'parameters', ] read_only_fields = [ 'availability_updated', @@ -487,6 +480,12 @@ class SupplierPartSerializer( filter_name='price_breaks', ) + parameters = enable_filter( + common.serializers.ParameterSerializer(many=True, read_only=True), + False, + filter_name='parameters', + ) + part_detail = part_serializers.PartBriefSerializer( label=_('Part'), source='part', many=False, read_only=True, allow_null=True ) @@ -543,6 +542,8 @@ class SupplierPartSerializer( on_order=company.filters.annotate_on_order_quantity() ) + queryset = SupplierPart.annotate_parameters(queryset) + return queryset def update(self, supplier_part, data): diff --git a/src/backend/InvenTree/company/test_migrations.py b/src/backend/InvenTree/company/test_migrations.py index 305eaf6031..cfea9f7cca 100644 --- a/src/backend/InvenTree/company/test_migrations.py +++ b/src/backend/InvenTree/company/test_migrations.py @@ -316,7 +316,7 @@ class TestSupplierPartQuantity(MigratorTestCase): """Test that the supplier part quantity is correctly migrated.""" migrate_from = ('company', '0058_auto_20230515_0004') - migrate_to = ('company', unit_test.getNewestMigrationFile('company')) + migrate_to = ('company', '0062_contact_metadata') def prepare(self): """Prepare a number of SupplierPart objects.""" @@ -361,3 +361,80 @@ class TestSupplierPartQuantity(MigratorTestCase): # And the 'pack_size' attribute has been removed with self.assertRaises(AttributeError): sp.pack_size + + +class TestManufacturerPartParameterMigration(MigratorTestCase): + """Test migration of ManufacturerPartParameter data. + + Ref: https://github.com/inventree/InvenTree/pull/10699 + + In the referenced PR: + + - Generic ParameterTemplate and Parameter models were created + - Existing ManufacturerPartParameter data was migrated to the new models + - ManufacturerPartParameter model was removed + """ + + migrate_from = ('common', '0038_alter_attachment_model_type') + migrate_to = ('company', '0077_delete_manufacturerpartparameter') + + def prepare(self): + """Create some existing data before migration.""" + Part = self.old_state.apps.get_model('part', 'part') + + Company = self.old_state.apps.get_model('company', 'company') + ManufacturerPart = self.old_state.apps.get_model('company', 'manufacturerpart') + ManufacturerPartParameter = self.old_state.apps.get_model( + 'company', 'manufacturerpartparameter' + ) + + # Create a ManufacturerPart + part = Part.objects.create( + name='PART', + description='A purchaseable part', + purchaseable=True, + level=0, + tree_id=0, + lft=0, + rght=0, + ) + + manufacturer = Company.objects.create( + name='Manufacturer', description='A manufacturer', is_manufacturer=True + ) + + manu_part = ManufacturerPart.objects.create( + part=part, manufacturer=manufacturer, MPN='MPN-001' + ) + + # Create a parameter which does NOT correlate with any existing template + for name in ['Width', 'Height', 'Depth']: + ManufacturerPartParameter.objects.create( + manufacturer_part=manu_part, name=name, value='100', units='mm' + ) + + def test_manufacturer_part_parameter_migration(self): + """Test that ManufacturerPartParameter data has been migrated correctly.""" + ContentType = self.new_state.apps.get_model('contenttypes', 'contenttype') + ParameterTemplate = self.new_state.apps.get_model('common', 'parametertemplate') + Parameter = self.new_state.apps.get_model('common', 'parameter') + ManufacturerPart = self.new_state.apps.get_model('company', 'manufacturerpart') + + # There should be 6 ParameterTemplate objects + self.assertEqual(ParameterTemplate.objects.count(), 3) + + manu_part = ManufacturerPart.objects.first() + + content_type, _created = ContentType.objects.get_or_create( + app_label='company', model='manufacturerpart' + ) + + # There should be 3 Parameter objects linked to the ManufacturerPart + params = Parameter.objects.filter( + model_type=content_type, model_id=manu_part.pk + ) + + self.assertEqual(params.count(), 3) + + for name in ['Width', 'Height', 'Depth']: + self.assertTrue(params.filter(template__name=name).exists()) diff --git a/src/backend/InvenTree/generic/states/fields.py b/src/backend/InvenTree/generic/states/fields.py index 458a13dacb..9ffa81d8eb 100644 --- a/src/backend/InvenTree/generic/states/fields.py +++ b/src/backend/InvenTree/generic/states/fields.py @@ -144,7 +144,7 @@ class InvenTreeCustomStatusModelField(models.PositiveIntegerField): validators.append(CustomStatusCodeValidator(status_class=self.status_class)) help_text = _('Additional status information for this item') - if InvenTree.ready.isGeneratingSchema(): + if InvenTree.ready.isGeneratingSchema() and self.status_class: help_text = ( help_text + '\n\n' diff --git a/src/backend/InvenTree/order/api.py b/src/backend/InvenTree/order/api.py index 05f848f518..ee2fa7a4c9 100644 --- a/src/backend/InvenTree/order/api.py +++ b/src/backend/InvenTree/order/api.py @@ -28,7 +28,12 @@ import stock.models as stock_models import stock.serializers as stock_serializers from data_exporter.mixins import DataExportViewMixin from generic.states.api import StatusView -from InvenTree.api import BulkUpdateMixin, ListCreateDestroyAPIView, MetadataView +from InvenTree.api import ( + BulkUpdateMixin, + ListCreateDestroyAPIView, + MetadataView, + ParameterListMixin, +) from InvenTree.fields import InvenTreeOutputOption, OutputConfiguration from InvenTree.filters import ( SEARCH_ORDER_FILTER, @@ -378,6 +383,7 @@ class PurchaseOrderList( OrderCreateMixin, DataExportViewMixin, OutputOptionsMixin, + ParameterListMixin, ListCreateAPI, ): """API endpoint for accessing a list of PurchaseOrder objects. @@ -847,6 +853,7 @@ class SalesOrderList( OrderCreateMixin, DataExportViewMixin, OutputOptionsMixin, + ParameterListMixin, ListCreateAPI, ): """API endpoint for accessing a list of SalesOrder objects. @@ -856,9 +863,7 @@ class SalesOrderList( """ filterset_class = SalesOrderFilter - filter_backends = SEARCH_ORDER_FILTER_ALIAS - output_options = SalesOrderOutputOptions ordering_field_aliases = { @@ -1525,12 +1530,12 @@ class ReturnOrderList( OrderCreateMixin, DataExportViewMixin, OutputOptionsMixin, + ParameterListMixin, ListCreateAPI, ): """API endpoint for accessing a list of ReturnOrder objects.""" filterset_class = ReturnOrderFilter - filter_backends = SEARCH_ORDER_FILTER_ALIAS output_options = ReturnOrderOutputOptions diff --git a/src/backend/InvenTree/order/models.py b/src/backend/InvenTree/order/models.py index 3030ade4fb..bf699af334 100644 --- a/src/backend/InvenTree/order/models.py +++ b/src/backend/InvenTree/order/models.py @@ -268,6 +268,7 @@ class ReturnOrderReportContext(report.mixins.BaseReportContext): class Order( StatusCodeMixin, StateTransitionMixin, + InvenTree.models.InvenTreeParameterMixin, InvenTree.models.InvenTreeAttachmentMixin, InvenTree.models.InvenTreeBarcodeMixin, InvenTree.models.InvenTreeNotesMixin, diff --git a/src/backend/InvenTree/order/serializers.py b/src/backend/InvenTree/order/serializers.py index bc993581c1..caac022c91 100644 --- a/src/backend/InvenTree/order/serializers.py +++ b/src/backend/InvenTree/order/serializers.py @@ -22,6 +22,7 @@ from rest_framework.serializers import ValidationError from sql_util.utils import SubqueryCount, SubquerySum import build.serializers +import common.serializers import order.models import part.filters as part_filters import part.models as part_models @@ -177,6 +178,12 @@ class AbstractOrderSerializer( True, ) + parameters = enable_filter( + common.serializers.ParameterSerializer(many=True, read_only=True), + False, + filter_name='parameters', + ) + # Boolean field indicating if this order is overdue (Note: must be annotated) overdue = serializers.BooleanField(read_only=True, allow_null=True) @@ -240,6 +247,7 @@ class AbstractOrderSerializer( 'project_code_detail', 'project_code_label', 'responsible_detail', + 'parameters', *extra_fields, ] @@ -444,6 +452,9 @@ class PurchaseOrderSerializer( """ queryset = AbstractOrderSerializer.annotate_queryset(queryset) + # Annotate parametric data + queryset = order.models.PurchaseOrder.annotate_parameters(queryset) + queryset = queryset.annotate( completed_lines=SubqueryCount( 'lines', filter=Q(quantity__lte=F('received')) @@ -1087,6 +1098,9 @@ class SalesOrderSerializer( """ queryset = AbstractOrderSerializer.annotate_queryset(queryset) + # Annotate parametric data + queryset = order.models.SalesOrder.annotate_parameters(queryset) + queryset = queryset.annotate( completed_lines=SubqueryCount('lines', filter=Q(quantity__lte=F('shipped'))) ) @@ -1936,6 +1950,9 @@ class ReturnOrderSerializer( """Custom annotation for the serializer queryset.""" queryset = AbstractOrderSerializer.annotate_queryset(queryset) + # Annotate parametric data + queryset = order.models.ReturnOrder.annotate_parameters(queryset) + queryset = queryset.annotate( completed_lines=SubqueryCount( 'lines', filter=~Q(outcome=ReturnOrderLineStatus.PENDING.value) diff --git a/src/backend/InvenTree/order/test_api.py b/src/backend/InvenTree/order/test_api.py index 93610e80ed..58c74e7f6d 100644 --- a/src/backend/InvenTree/order/test_api.py +++ b/src/backend/InvenTree/order/test_api.py @@ -204,8 +204,8 @@ class PurchaseOrderTest(OrderTest): self.LIST_URL, data={'limit': limit}, expected_code=200 ) - # Total database queries must be below 20, independent of the number of results - self.assertLess(len(ctx), 20) + # Total database queries must be below 25, independent of the number of results + self.assertLess(len(ctx), 25) for result in response.data['results']: self.assertIn('total_price', result) @@ -1267,7 +1267,7 @@ class PurchaseOrderReceiveTest(OrderTest): ], 'location': location.pk, }, - max_query_count=100 + 2 * N_LINES, + max_query_count=104 + 2 * N_LINES, ).data # Check for expected response @@ -1428,8 +1428,8 @@ class SalesOrderTest(OrderTest): self.LIST_URL, data={'limit': limit}, expected_code=200 ) - # Total database queries must be less than 20 - self.assertLess(len(ctx), 20) + # Total database queries must be less than 25 + self.assertLess(len(ctx), 25) n = len(response.data['results']) diff --git a/src/backend/InvenTree/part/admin.py b/src/backend/InvenTree/part/admin.py index 6c6ae85b7a..377a0b1a4a 100644 --- a/src/backend/InvenTree/part/admin.py +++ b/src/backend/InvenTree/part/admin.py @@ -5,12 +5,6 @@ from django.contrib import admin from part import models -class PartParameterInline(admin.TabularInline): - """Inline for part parameter data.""" - - model = models.PartParameter - - @admin.register(models.Part) class PartAdmin(admin.ModelAdmin): """Admin class for the Part model.""" @@ -36,7 +30,7 @@ class PartAdmin(admin.ModelAdmin): 'creation_user', ] - inlines = [PartParameterInline] + inlines = [] @admin.register(models.PartPricing) @@ -99,33 +93,6 @@ class BomItemAdmin(admin.ModelAdmin): autocomplete_fields = ('part', 'sub_part') -@admin.register(models.PartParameterTemplate) -class ParameterTemplateAdmin(admin.ModelAdmin): - """Admin class for the PartParameterTemplate model.""" - - list_display = ('name', 'units') - - search_fields = ('name', 'units') - - -@admin.register(models.PartParameter) -class ParameterAdmin(admin.ModelAdmin): - """Admin class for the PartParameter model.""" - - list_display = ('part', 'template', 'data') - - readonly_fields = ('updated', 'updated_by') - - autocomplete_fields = ('part', 'template') - - -@admin.register(models.PartCategoryParameterTemplate) -class PartCategoryParameterAdmin(admin.ModelAdmin): - """Admin class for the PartCategoryParameterTemplate model.""" - - autocomplete_fields = ('category', 'parameter_template') - - @admin.register(models.PartSellPriceBreak) class PartSellPriceBreakAdmin(admin.ModelAdmin): """Admin class for the PartSellPriceBreak model.""" diff --git a/src/backend/InvenTree/part/api.py b/src/backend/InvenTree/part/api.py index 2af9a7f05f..57fcc7cb85 100644 --- a/src/backend/InvenTree/part/api.py +++ b/src/backend/InvenTree/part/api.py @@ -1,7 +1,5 @@ """Provides a JSON API for the Part app.""" -import re - from django.db.models import Count, F, Q from django.urls import include, path from django.utils.translation import gettext_lazy as _ @@ -14,15 +12,14 @@ from drf_spectacular.utils import extend_schema_field from rest_framework import serializers from rest_framework.response import Response -import part.filters import part.tasks as part_tasks from data_exporter.mixins import DataExportViewMixin from InvenTree.api import ( - BulkCreateMixin, BulkDeleteMixin, BulkUpdateMixin, ListCreateDestroyAPIView, MetadataView, + ParameterListMixin, ) from InvenTree.fields import InvenTreeOutputOption, OutputConfiguration from InvenTree.filters import ( @@ -59,8 +56,6 @@ from .models import ( PartCategory, PartCategoryParameterTemplate, PartInternalPriceBreak, - PartParameter, - PartParameterTemplate, PartRelated, PartSellPriceBreak, PartStocktake, @@ -323,7 +318,7 @@ class CategoryTree(ListAPI): return queryset -class CategoryParameterList(DataExportViewMixin, ListCreateAPI): +class CategoryParameterList(DataExportViewMixin, OutputOptionsMixin, ListCreateAPI): """API endpoint for accessing a list of PartCategoryParameterTemplate objects. - GET: Return a list of PartCategoryParameterTemplate objects @@ -1025,10 +1020,6 @@ class PartMixin(SerializerContextMixin): queryset = part_serializers.PartSerializer.annotate_queryset(queryset) - # Annotate with parameter template data? - if str2bool(self.request.query_params.get('parameters', False)): - queryset = queryset.prefetch_related('parameters', 'parameters__template') - if str2bool(self.request.query_params.get('price_breaks', True)): queryset = queryset.prefetch_related('salepricebreaks') @@ -1076,7 +1067,12 @@ class PartOutputOptions(OutputConfiguration): class PartList( - PartMixin, BulkUpdateMixin, DataExportViewMixin, OutputOptionsMixin, ListCreateAPI + PartMixin, + BulkUpdateMixin, + ParameterListMixin, + DataExportViewMixin, + OutputOptionsMixin, + ListCreateAPI, ): """API endpoint for accessing a list of Part objects, or creating a new Part instance.""" @@ -1084,75 +1080,6 @@ class PartList( filterset_class = PartFilter is_create = True - def filter_queryset(self, queryset): - """Perform custom filtering of the queryset.""" - queryset = super().filter_queryset(queryset) - - queryset = self.filter_parametric_data(queryset) - queryset = self.order_by_parameter(queryset) - - return queryset - - def filter_parametric_data(self, queryset): - """Filter queryset against part parameters. - - Used to filter returned parts based on their parameter values. - - To filter based on parameter value, supply query parameters like: - - parameter_= - - parameter__gt= - - parameter__lte= - - where: - - is the ID of the PartParameterTemplate. - - is the value to filter against. - """ - # Allowed lookup operations for parameter values - operators = '|'.join(part.filters.PARAMETER_FILTER_OPERATORS) - - regex_pattern = rf'^parameter_(\d+)(_({operators}))?$' - - for param in self.request.query_params: - result = re.match(regex_pattern, param) - - if not result: - continue - - template_id = result.group(1) - operator = result.group(3) or '' - - value = self.request.query_params.get(param, None) - - queryset = part.filters.filter_by_parameter( - queryset, template_id, value, func=operator - ) - - return queryset - - def order_by_parameter(self, queryset): - """Perform queryset ordering based on parameter value. - - - Used if the 'ordering' query param points to a parameter - - e.g. '&ordering=param_' where specifies the PartParameterTemplate - - Only parts which have a matching parameter are returned - - Queryset is ordered based on parameter value - """ - # Extract "ordering" parameter from query args - ordering = self.request.query_params.get('ordering', None) - - if ordering: - # Ordering value must match required regex pattern - result = re.match(r'^\-?parameter_(\d+)$', ordering) - - if result: - template_id = result.group(1) - ascending = not ordering.startswith('-') - queryset = part.filters.order_by_parameter( - queryset, template_id, ascending - ) - - return queryset - filter_backends = SEARCH_ORDER_FILTER_ALIAS ordering_fields = [ @@ -1267,208 +1194,6 @@ class PartRelatedDetail(PartRelatedMixin, RetrieveUpdateDestroyAPI): """API endpoint for accessing detail view of a PartRelated object.""" -class PartParameterTemplateFilter(FilterSet): - """FilterSet for PartParameterTemplate objects.""" - - class Meta: - """Metaclass options.""" - - model = PartParameterTemplate - - # Simple filter fields - fields = ['name', 'units', 'checkbox'] - - has_choices = rest_filters.BooleanFilter( - method='filter_has_choices', label='Has Choice' - ) - - def filter_has_choices(self, queryset, name, value): - """Filter queryset to include only PartParameterTemplates with choices.""" - if str2bool(value): - return queryset.exclude(Q(choices=None) | Q(choices='')) - - return queryset.filter(Q(choices=None) | Q(choices='')).distinct() - - has_units = rest_filters.BooleanFilter(method='filter_has_units', label='Has Units') - - def filter_has_units(self, queryset, name, value): - """Filter queryset to include only PartParameterTemplates with units.""" - if str2bool(value): - return queryset.exclude(Q(units=None) | Q(units='')) - - return queryset.filter(Q(units=None) | Q(units='')).distinct() - - part = rest_filters.ModelChoiceFilter( - queryset=Part.objects.all(), method='filter_part', label=_('Part') - ) - - @extend_schema_field(OpenApiTypes.INT) - def filter_part(self, queryset, name, part): - """Filter queryset to include only PartParameterTemplates which are referenced by a part.""" - parameters = PartParameter.objects.filter(part=part) - template_ids = parameters.values_list('template').distinct() - return queryset.filter(pk__in=[el[0] for el in template_ids]) - - # Filter against a "PartCategory" - return only parameter templates which are referenced by parts in this category - category = rest_filters.ModelChoiceFilter( - queryset=PartCategory.objects.all(), - method='filter_category', - label=_('Category'), - ) - - @extend_schema_field(OpenApiTypes.INT) - def filter_category(self, queryset, name, category): - """Filter queryset to include only PartParameterTemplates which are referenced by parts in this category.""" - cats = category.get_descendants(include_self=True) - parameters = PartParameter.objects.filter(part__category__in=cats) - template_ids = parameters.values_list('template').distinct() - return queryset.filter(pk__in=[el[0] for el in template_ids]) - - -class PartParameterTemplateMixin: - """Mixin class for PartParameterTemplate API endpoints.""" - - queryset = PartParameterTemplate.objects.all() - serializer_class = part_serializers.PartParameterTemplateSerializer - - def get_queryset(self, *args, **kwargs): - """Return an annotated queryset for the PartParameterTemplateDetail endpoint.""" - queryset = super().get_queryset(*args, **kwargs) - - queryset = part_serializers.PartParameterTemplateSerializer.annotate_queryset( - queryset - ) - - return queryset - - -class PartParameterTemplateList( - PartParameterTemplateMixin, DataExportViewMixin, ListCreateAPI -): - """API endpoint for accessing a list of PartParameterTemplate objects. - - - GET: Return list of PartParameterTemplate objects - - POST: Create a new PartParameterTemplate object - """ - - filterset_class = PartParameterTemplateFilter - - filter_backends = SEARCH_ORDER_FILTER - - search_fields = ['name', 'description'] - - ordering_fields = ['name', 'units', 'checkbox', 'parts'] - - -class PartParameterTemplateDetail(PartParameterTemplateMixin, RetrieveUpdateDestroyAPI): - """API endpoint for accessing the detail view for a PartParameterTemplate object.""" - - -class PartParameterOutputOptions(OutputConfiguration): - """Output options for the PartParameter endpoints.""" - - OPTIONS = [ - InvenTreeOutputOption('part_detail'), - InvenTreeOutputOption( - 'template_detail', - default=True, - description='Include detailed information about the part parameter template.', - ), - ] - - -class PartParameterAPIMixin: - """Mixin class for PartParameter API endpoints.""" - - queryset = PartParameter.objects.all() - serializer_class = part_serializers.PartParameterSerializer - output_options = PartParameterOutputOptions - - def get_queryset(self, *args, **kwargs): - """Override get_queryset method to prefetch related fields.""" - queryset = super().get_queryset(*args, **kwargs) - queryset = queryset.prefetch_related('part', 'template', 'updated_by') - return queryset - - def get_serializer_context(self): - """Pass the 'request' object through to the serializer context.""" - context = super().get_serializer_context() - context['request'] = self.request - - return context - - -class PartParameterFilter(FilterSet): - """Custom filters for the PartParameterList API endpoint.""" - - class Meta: - """Metaclass options for the filterset.""" - - model = PartParameter - fields = ['template', 'updated_by'] - - part = rest_filters.ModelChoiceFilter( - queryset=Part.objects.all(), method='filter_part' - ) - - def filter_part(self, queryset, name, part): - """Filter against the provided part. - - If 'include_variants' query parameter is provided, filter against variant parts also - """ - try: - include_variants = str2bool(self.request.GET.get('include_variants', False)) - except AttributeError: - include_variants = False - - if include_variants: - return queryset.filter(part__in=part.get_descendants(include_self=True)) - else: - return queryset.filter(part=part) - - -class PartParameterList( - BulkCreateMixin, - PartParameterAPIMixin, - OutputOptionsMixin, - DataExportViewMixin, - ListCreateAPI, -): - """API endpoint for accessing a list of PartParameter objects. - - - GET: Return list of PartParameter objects - - POST: Create a new PartParameter object - """ - - filterset_class = PartParameterFilter - - filter_backends = SEARCH_ORDER_FILTER_ALIAS - - ordering_fields = ['name', 'data', 'part', 'template', 'updated', 'updated_by'] - - ordering_field_aliases = { - 'name': 'template__name', - 'units': 'template__units', - 'data': ['data_numeric', 'data'], - 'part': 'part__name', - } - - search_fields = [ - 'data', - 'template__name', - 'template__description', - 'template__units', - ] - - unique_create_fields = ['part', 'template'] - - -class PartParameterDetail( - PartParameterAPIMixin, OutputOptionsMixin, RetrieveUpdateDestroyAPI -): - """API endpoint for detail view of a single PartParameter object.""" - - class PartStocktakeFilter(FilterSet): """Custom filter for the PartStocktakeList endpoint.""" @@ -1880,53 +1605,6 @@ part_api_urls = [ path('', PartRelatedList.as_view(), name='api-part-related-list'), ]), ), - # Base URL for PartParameter API endpoints - path( - 'parameter/', - include([ - path( - 'template/', - include([ - path( - '/', - include([ - path( - 'metadata/', - MetadataView.as_view(model=PartParameterTemplate), - name='api-part-parameter-template-metadata', - ), - path( - '', - PartParameterTemplateDetail.as_view(), - name='api-part-parameter-template-detail', - ), - ]), - ), - path( - '', - PartParameterTemplateList.as_view(), - name='api-part-parameter-template-list', - ), - ]), - ), - path( - '/', - include([ - path( - 'metadata/', - MetadataView.as_view(model=PartParameter), - name='api-part-parameter-metadata', - ), - path( - '', - PartParameterDetail.as_view(), - name='api-part-parameter-detail', - ), - ]), - ), - path('', PartParameterList.as_view(), name='api-part-parameter-list'), - ]), - ), # Part stocktake data path( 'stocktake/', diff --git a/src/backend/InvenTree/part/filters.py b/src/backend/InvenTree/part/filters.py index 33f3998ab6..ad4107566e 100644 --- a/src/backend/InvenTree/part/filters.py +++ b/src/backend/InvenTree/part/filters.py @@ -18,7 +18,6 @@ from django.db import models from django.db.models import ( Case, DecimalField, - Exists, ExpressionWrapper, F, FloatField, @@ -35,8 +34,6 @@ from django.db.models.query import QuerySet from sql_util.utils import SubquerySum -import InvenTree.conversion -import InvenTree.helpers import part.models import stock.models from build.status_codes import BuildStatusGroups @@ -519,159 +516,3 @@ def annotate_bom_item_can_build(queryset: QuerySet, reference: str = '') -> Quer ) return queryset - - -"""A list of valid operators for filtering part parameters.""" -PARAMETER_FILTER_OPERATORS: list[str] = ['gt', 'gte', 'lt', 'lte', 'ne', 'icontains'] - - -def filter_by_parameter( - queryset: QuerySet, template_id: int, value: str, func: str = '' -) -> QuerySet: - """Filter the given queryset by a given template parameter. - - Parts which do not have a value for the given parameter are excluded. - - Arguments: - queryset: A queryset of Part objects - template_id (int): The ID of the template parameter to filter by - value (str): The value of the parameter to filter by - func (str): The function to use for the filter (e.g. __gt, __lt, __contains) - - Returns: - A queryset of Part objects filtered by the given parameter - """ - if func and func not in PARAMETER_FILTER_OPERATORS: - raise ValueError(f'Invalid parameter filter function supplied: {func}.') - - try: - template = part.models.PartParameterTemplate.objects.get(pk=template_id) - except (ValueError, part.models.PartParameterTemplate.DoesNotExist): - # Return queryset unchanged if the template does not exist - return queryset - - # Construct a "numeric" value - try: - value_numeric = float(value) - except (ValueError, TypeError): - value_numeric = None - - if template.checkbox: - # Account for 'boolean' parameter values - # Convert to "True" or "False" string in this case - bool_value = InvenTree.helpers.str2bool(value) - value_numeric = 1 if bool_value else 0 - value = str(bool_value) - - # Boolean filtering is limited to exact matches - func = '' - - elif value_numeric is None and template.units: - # Convert the raw value to the units of the template parameter - try: - value_numeric = InvenTree.conversion.convert_physical_value( - value, template.units - ) - except Exception: - # The value cannot be converted - return an empty queryset - return queryset.none() - - # Special handling for the "not equal" operator - if func == 'ne': - invert = True - func = '' - else: - invert = False - - # Some filters are only applicable to string values - text_only = any([func in ['icontains'], value_numeric is None]) - - # Ensure the function starts with a double underscore - if func and not func.startswith('__'): - func = f'__{func}' - - # Query for 'numeric' value - this has priority over 'string' value - data_numeric = { - 'parameters__template': template, - 'parameters__data_numeric__isnull': False, - f'parameters__data_numeric{func}': value_numeric, - } - - query_numeric = Q(**data_numeric) - - # Query for 'string' value - data_text = { - 'parameters__template': template, - f'parameters__data{func}': str(value), - } - - if not text_only: - data_text['parameters__data_numeric__isnull'] = True - - query_text = Q(**data_text) - - # Combine the queries based on whether we are filtering by text or numeric value - q = query_text if text_only else query_text | query_numeric - - # Special handling for the '__ne' (not equal) operator - # In this case, we want the *opposite* of the above queries - if invert: - return queryset.exclude(q).distinct() - else: - return queryset.filter(q).distinct() - - -def order_by_parameter( - queryset: QuerySet, template_id: int, ascending: bool = True -) -> QuerySet: - """Order the given queryset by a given template parameter. - - Parts which do not have a value for the given parameter are ordered last. - - Arguments: - queryset: A queryset of Part objects - template_id (int): The ID of the template parameter to order by - ascending (bool): Order by ascending or descending (default = True) - - Returns: - A queryset of Part objects ordered by the given parameter - """ - template_filter = part.models.PartParameter.objects.filter( - template__id=template_id, part_id=OuterRef('id') - ) - - # Annotate the queryset with the parameter value, and whether it exists - queryset = queryset.annotate(parameter_exists=Exists(template_filter)) - - # Annotate the text data value - queryset = queryset.annotate( - parameter_value=Case( - When( - parameter_exists=True, - then=Subquery( - template_filter.values('data')[:1], output_field=models.CharField() - ), - ), - default=Value('', output_field=models.CharField()), - ), - parameter_value_numeric=Case( - When( - parameter_exists=True, - then=Subquery( - template_filter.values('data_numeric')[:1], - output_field=models.FloatField(), - ), - ), - default=Value(0, output_field=models.FloatField()), - ), - ) - - prefix = '' if ascending else '-' - - # Return filtered queryset - - return queryset.order_by( - '-parameter_exists', - f'{prefix}parameter_value_numeric', - f'{prefix}parameter_value', - ) diff --git a/src/backend/InvenTree/part/fixtures/params.yaml b/src/backend/InvenTree/part/fixtures/params.yaml index 2364a95fdb..54c1e3fd2b 100644 --- a/src/backend/InvenTree/part/fixtures/params.yaml +++ b/src/backend/InvenTree/part/fixtures/params.yaml @@ -1,70 +1,100 @@ # Create some PartParameter templtes -- model: part.PartParameterTemplate +- model: common.parametertemplate pk: 1 fields: name: Length units: mm + model_type: + - part + - part -- model: part.PartParameterTemplate +- model: common.parametertemplate pk: 2 fields: name: Width units: mm + model_type: + - part + - part -- model: part.PartParameterTemplate +- model: common.parametertemplate pk: 3 fields: name: Thickness units: mm + model_type: + - part + - part # Add some parameters to parts (requires part.yaml) -- model: part.PartParameter +- model: common.parameter pk: 1 fields: - part: 1 + model_id: 1 + model_type: + - part + - part template: 1 data: 4 -- model: part.PartParameter +- model: common.parameter pk: 2 fields: - part: 2 + model_id: 2 + model_type: + - part + - part template: 1 data: 12 -- model: part.PartParameter +- model: common.parameter pk: 3 fields: - part: 3 + model_id: 3 + model_type: + - part + - part template: 1 data: 12 -- model: part.PartParameter +- model: common.parameter pk: 4 fields: - part: 3 + model_id: 3 + model_type: + - part + - part template: 2 data: 12 -- model: part.PartParameter +- model: common.parameter pk: 5 fields: - part: 3 + model_id: 3 + model_type: + - part + - part template: 3 data: 12 -- model: part.PartParameter +- model: common.parameter pk: 6 fields: - part: 100 + model_id: 100 + model_type: + - part + - part template: 3 data: 12 -- model: part.PartParameter +- model: common.parameter pk: 7 fields: - part: 100 + model_id: 100 + model_type: + - part + - part template: 1 data: 12 @@ -73,12 +103,12 @@ pk: 1 fields: category: 7 - parameter_template: 1 + template: 1 default_value: '2.8' - model: part.PartCategoryParameterTemplate pk: 2 fields: category: 7 - parameter_template: 3 + template: 3 default_value: '0.5' diff --git a/src/backend/InvenTree/part/migrations/0071_alter_partparametertemplate_name.py b/src/backend/InvenTree/part/migrations/0071_alter_partparametertemplate_name.py index fef49e73f6..4fad4a9bf1 100644 --- a/src/backend/InvenTree/part/migrations/0071_alter_partparametertemplate_name.py +++ b/src/backend/InvenTree/part/migrations/0071_alter_partparametertemplate_name.py @@ -14,6 +14,6 @@ class Migration(migrations.Migration): migrations.AlterField( model_name='partparametertemplate', name='name', - field=models.CharField(help_text='Parameter Name', max_length=100, unique=True, validators=[part.models.validate_template_name], verbose_name='Name'), + field=models.CharField(help_text='Parameter Name', max_length=100, unique=True, validators=[], verbose_name='Name'), ), ] diff --git a/src/backend/InvenTree/part/migrations/0144_auto_20251203_1045.py b/src/backend/InvenTree/part/migrations/0144_auto_20251203_1045.py new file mode 100644 index 0000000000..52d9b61ffa --- /dev/null +++ b/src/backend/InvenTree/part/migrations/0144_auto_20251203_1045.py @@ -0,0 +1,161 @@ +# Generated by Django 5.2.8 on 2025-12-03 10:45 + +from django.db import migrations, models +from django.db.models import deletion + + +def update_parameter(apps, schema_editor): + """Data migration to update existing PartParameter records. + + - Set 'model_type' to the ContentType for 'part.Part' + - Set 'model_id' to the existing 'part_id' value + """ + + PartParameter = apps.get_model("part", "PartParameter") + ContentType = apps.get_model("contenttypes", "ContentType") + + part_content_type, created = ContentType.objects.get_or_create( + app_label="part", + model="part", + ) + + parameters_to_update = [] + + N = PartParameter.objects.count() + + # Update any existing PartParameter object, setting the new fields + for parameter in PartParameter.objects.all(): + parameter.model_type = part_content_type + parameter.model_id = parameter.part_id + parameters_to_update.append(parameter) + + if len(parameters_to_update) > 0: + + print(f"Updating {len(parameters_to_update)} PartParameter records.") + + PartParameter.objects.bulk_update( + parameters_to_update, + fields=["model_type", "model_id"], + ) + + # Ensure that the number of updated records matches the total number of records + assert PartParameter.objects.count() == N + + # Ensure that no PartParameter records have null model_type or model_id + assert PartParameter.objects.filter(model_type=None).count() == 0 + assert PartParameter.objects.filter(model_id=None).count() == 0 + + +def reverse_update_parameter(apps, schema_editor): + """Reverse data migration to restore existing PartParameter records. + + - Set 'part_id' to the existing 'model_id' value + """ + + PartParameter = apps.get_model("part", "PartParameter") + + parmeters_to_update = [] + + for parameter in PartParameter.objects.all(): + parameter.part = parameter.model_id + parmeters_to_update.append(parameter) + + if len(parmeters_to_update) > 0: + + print(f"Reversing update of {len(parmeters_to_update)} PartParameter records.") + + PartParameter.objects.bulk_update( + parmeters_to_update, + fields=["part"], + ) + + +class Migration(migrations.Migration): + """Data migration for making the PartParameterTemplate and PartParameter models generic. + + - Add new fields to the "PartParameterTemplate" and "PartParameter" models + - Migrate existing data to populate the new fields + - Make the new fields non-nullable (if appropriate) + - Remove any obsolete fields (if necessary) + """ + + atomic = False + + dependencies = [ + ("part", "0143_alter_part_image"), + ] + + operations = [ + # Add the new "enabled" field to the PartParameterTemplate model + migrations.AddField( + model_name="partparametertemplate", + name="enabled", + field=models.BooleanField( + default=True, + help_text="Is this parameter template enabled?", + verbose_name="Enabled", + ), + ), + # Add the "model_type" field to the PartParmaeterTemplate model + migrations.AddField( + model_name="partparametertemplate", + name="model_type", + field=models.ForeignKey( + blank=True, null=True, + help_text="Target model type for this parameter template", + on_delete=deletion.SET_NULL, + to="contenttypes.contenttype", + verbose_name="Model type", + ), + ), + # Add the "model_type" field to the PartParameter model + # Note: This field is initially nullable, to allow existing records to remain valid. + migrations.AddField( + model_name="partparameter", + name="model_type", + field=models.ForeignKey( + blank=True, null=True, + on_delete=deletion.CASCADE, + to="contenttypes.contenttype", + ), + ), + # Add the "model_id" field to the PartParameter model + # Note: This field is initially nullable, to allow existing records to remain valid. + migrations.AddField( + model_name="partparameter", + name="model_id", + field=models.PositiveIntegerField( + blank=True, null=True, + help_text="ID of the target model for this parameter", + verbose_name="Model ID", + ) + ), + # Migrate existing PartParameter records to populate the new fields + migrations.RunPython( + update_parameter, + reverse_code=reverse_update_parameter, + ), + # Update the "model_type" field on the PartParameter model to be non-nullable + migrations.AlterField( + model_name="partparameter", + name="model_type", + field=models.ForeignKey( + on_delete=deletion.CASCADE, + to="contenttypes.contenttype", + ), + ), + # Update the "model_id" field on the PartParameter model to be non-nullable + migrations.AlterField( + model_name="partparameter", + name="model_id", + field=models.PositiveIntegerField( + help_text="ID of the target model for this parameter", + verbose_name="Model ID", + ) + ), + # Remove the "unique_together" constraint on the PartParameter model + migrations.AlterUniqueTogether( + name="partparameter", + unique_together={('model_type', 'model_id', 'template')}, + ), + ] diff --git a/src/backend/InvenTree/part/migrations/0145_auto_20251203_1238.py b/src/backend/InvenTree/part/migrations/0145_auto_20251203_1238.py new file mode 100644 index 0000000000..0924f9065e --- /dev/null +++ b/src/backend/InvenTree/part/migrations/0145_auto_20251203_1238.py @@ -0,0 +1,111 @@ +# Generated by Django 5.2.8 on 2025-12-03 12:38 + +from django.db import migrations, models +from django.db.models import deletion + + +def update_category_parameters(apps, schema_editor): + """Copy the 'parameter_template' field to the new 'template' field.""" + + PartCategoryParameterTemplate = apps.get_model("part", "PartCategoryParameterTemplate") + ParameterTemplate = apps.get_model("common", "ParameterTemplate") + + category_parameters_to_update = [] + + for cat_param in PartCategoryParameterTemplate.objects.all(): + template = ParameterTemplate.objects.get(pk=cat_param.parameter_template_id) + cat_param.template = template + category_parameters_to_update.append(cat_param) + + if len(category_parameters_to_update) > 0: + + print(f"Updating {len(category_parameters_to_update)} PartCategoryParameterTemplate records.") + + PartCategoryParameterTemplate.objects.bulk_update( + category_parameters_to_update, + fields=["template"], + ) + + +def reverse_update_category_parameters(apps, schema_editor): + """Copy the 'template' field back to the 'parameter_template' field.""" + + PartParameterTemplate = apps.get_model("part", "PartParameterTemplate") + PartCategoryParameterTemplate = apps.get_model("part", "PartCategoryParameterTemplate") + + category_parameters_to_update = [] + + for cat_param in PartCategoryParameterTemplate.objects.all(): + template = PartParameterTemplate.objects.get(pk=cat_param.template_id) + cat_param.parameter_template = template + category_parameters_to_update.append(cat_param) + + if len(category_parameters_to_update) > 0: + + print(f"Reversing update of {len(category_parameters_to_update)} PartCategoryParameterTemplate records.") + + PartCategoryParameterTemplate.objects.bulk_update( + category_parameters_to_update, + fields=["parameter_template"], + ) + + +class Migration(migrations.Migration): + + dependencies = [ + ("part", "0144_auto_20251203_1045"), + ("common", "0040_parametertemplate_parameter") + ] + + operations = [ + # Remove the obsolete "part" field from the PartParameter model + migrations.RemoveField( + model_name="partparameter", + name="part", + ), + # Add a new "template" field to the PartCategoryParameterTemplate model + migrations.AddField( + model_name="partcategoryparametertemplate", + name="template", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=deletion.CASCADE, + related_name="part_categories", + to="common.parametertemplate", + ), + ), + # Remove unique constraint on PartCategoryParameterTemplate model + migrations.RemoveConstraint( + model_name="partcategoryparametertemplate", + name="unique_category_parameter_template_pair", + ), + # Perform data migration for the PartCategoryParameterTemplate model + migrations.RunPython( + update_category_parameters, + reverse_code=reverse_update_category_parameters, + ), + # Remove the obsolete "part_template" field from the PartCategoryParameterTemplate model + migrations.RemoveField( + model_name="partcategoryparametertemplate", + name="parameter_template", + ), + # Remove nullable attribute from the new 'template' field + migrations.AlterField( + model_name="partcategoryparametertemplate", + name="template", + field=models.ForeignKey( + on_delete=deletion.CASCADE, + related_name="part_categories", + to="common.parametertemplate", + ), + ), + # Update uniqueness constraint on PartCategoryParameterTemplate model + migrations.AddConstraint( + model_name="partcategoryparametertemplate", + constraint=models.UniqueConstraint( + fields=("category", "template"), + name="unique_category_parameter_pair", + ), + ), + ] diff --git a/src/backend/InvenTree/part/migrations/0146_auto_20251203_1241.py b/src/backend/InvenTree/part/migrations/0146_auto_20251203_1241.py new file mode 100644 index 0000000000..bd6bdfbe31 --- /dev/null +++ b/src/backend/InvenTree/part/migrations/0146_auto_20251203_1241.py @@ -0,0 +1,23 @@ +# Generated by Django 5.2.8 on 2025-12-03 12:41 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ("part", "0145_auto_20251203_1238"), + ] + + # Remove the PartParameterTemplate and PartParameter models + # Note: We *DO NOT* drop the underlying database tables, + # as these are now used by the common.ParameterTemplate and common.Parameter models + operations = [ + migrations.SeparateDatabaseAndState( + state_operations=[ + migrations.DeleteModel(name='PartParameterTemplate'), + migrations.DeleteModel(name='PartParameter'), + ], + database_operations=[] + ), + ] diff --git a/src/backend/InvenTree/part/models.py b/src/backend/InvenTree/part/models.py index 18840608fb..2f2b74961f 100644 --- a/src/backend/InvenTree/part/models.py +++ b/src/backend/InvenTree/part/models.py @@ -14,12 +14,9 @@ from typing import cast from django.conf import settings from django.contrib.auth.models import User +from django.contrib.contenttypes.models import ContentType from django.core.exceptions import ValidationError -from django.core.validators import ( - MaxValueValidator, - MinLengthValidator, - MinValueValidator, -) +from django.core.validators import MaxValueValidator, MinValueValidator from django.db import models, transaction from django.db.models import F, Q, QuerySet, Sum, UniqueConstraint from django.db.models.functions import Coalesce @@ -59,7 +56,7 @@ from company.models import SupplierPart from InvenTree import helpers, validators from InvenTree.exceptions import log_error from InvenTree.fields import InvenTreeURLField -from InvenTree.helpers import decimal2money, decimal2string, normalize, str2bool +from InvenTree.helpers import decimal2money, decimal2string, normalize from order import models as OrderModels from order.status_codes import ( PurchaseOrderStatus, @@ -229,7 +226,7 @@ class PartCategory( """Prefectch parts parameters.""" return ( self.get_parts(cascade=cascade) - .prefetch_related('parameters', 'parameters__template') + .prefetch_related('parameters_list', 'parameters_list__template') .all() ) @@ -240,7 +237,7 @@ class PartCategory( parts = prefetch or self.prefetch_parts_parameters(cascade=cascade) for part in parts: - for parameter in part.parameters.all(): + for parameter in part.parameters_list.all(): parameter_name = parameter.template.name if parameter_name not in unique_parameters_names: unique_parameters_names.append(parameter_name) @@ -263,7 +260,7 @@ class PartCategory( if part.IPN: part_parameters['IPN'] = part.IPN - for parameter in part.parameters.all(): + for parameter in part.parameters_list.all(): parameter_name = parameter.template.name parameter_value = parameter.data part_parameters[parameter_name] = parameter_value @@ -287,7 +284,7 @@ class PartCategory( def get_parameter_templates(self): """Return parameter templates associated to category.""" prefetch = PartCategoryParameterTemplate.objects.prefetch_related( - 'category', 'parameter_template' + 'category', 'parameter' ) return prefetch.filter(category=self.id) @@ -373,6 +370,86 @@ class PartManager(TreeManager): ) +class PartCategoryParameterTemplate(InvenTree.models.InvenTreeMetadataModel): + """A PartCategoryParameterTemplate creates a unique relationship between a PartCategory and a ParameterTemplate. + + Multiple ParameterTemplate instances can be associated to a PartCategory to drive a default list of parameter templates attached to a Part instance upon creation. + + Attributes: + category: Reference to a single PartCategory object + template: Reference to a single ParameterTemplate object + default_value: The default value for the parameter in the context of the selected category + """ + + @staticmethod + def get_api_url(): + """Return the API endpoint URL associated with the PartCategoryParameterTemplate model.""" + return reverse('api-part-category-parameter-list') + + class Meta: + """Metaclass providing extra model definition.""" + + verbose_name = _('Part Category Parameter Template') + + constraints = [ + UniqueConstraint( + fields=['category', 'template'], name='unique_category_parameter_pair' + ) + ] + + def __str__(self): + """String representation of a PartCategoryParameterTemplate (admin interface).""" + if self.default_value: + return f'{self.category.name} | {self.template.name} | {self.default_value}' + return f'{self.category.name} | {self.template.name}' + + def clean(self): + """Validate this PartCategoryParameterTemplate instance. + + Checks the provided 'default_value', and (if not blank), ensure it is valid. + """ + super().clean() + + self.default_value = ( + '' if self.default_value is None else str(self.default_value.strip()) + ) + + if ( + self.default_value + and get_global_setting( + 'PARAMETER_ENFORCE_UNITS', True, cache=False, create=False + ) + and self.template.units + ): + try: + InvenTree.conversion.convert_physical_value( + self.default_value, self.template.units + ) + except ValidationError as e: + raise ValidationError({'default_value': e.message}) + + category = models.ForeignKey( + PartCategory, + on_delete=models.CASCADE, + related_name='parameter_templates', + verbose_name=_('Category'), + help_text=_('Part Category'), + ) + + template = models.ForeignKey( + common.models.ParameterTemplate, + on_delete=models.CASCADE, + related_name='part_categories', + ) + + default_value = models.CharField( + max_length=500, + blank=True, + verbose_name=_('Default Value'), + help_text=_('Default Parameter Value'), + ) + + class PartReportContext(report.mixins.BaseReportContext): """Report context for the Part model. @@ -408,6 +485,7 @@ class PartReportContext(report.mixins.BaseReportContext): @cleanup.ignore class Part( InvenTree.models.PluginValidationMixin, + InvenTree.models.InvenTreeParameterMixin, InvenTree.models.InvenTreeAttachmentMixin, InvenTree.models.InvenTreeBarcodeMixin, InvenTree.models.InvenTreeNotesMixin, @@ -513,6 +591,16 @@ class Part( 'test_templates': self.getTestTemplateMap(), } + def check_parameter_delete(self, parameter): + """Custom delete check for Paramteter instances associated with this Part.""" + if self.locked: + raise ValidationError(_('Cannot delete parameters of a locked part')) + + def check_parameter_save(self, parameter): + """Custom save check for Parameter instances associated with this Part.""" + if self.locked: + raise ValidationError(_('Cannot modify parameters of a locked part')) + def delete(self, **kwargs): """Custom delete method for the Part model. @@ -2387,36 +2475,6 @@ class Part( sub.bom_item = bom_item sub.save() - @transaction.atomic - def copy_parameters_from(self, other: Part, **kwargs) -> None: - """Copy all parameter values from another Part instance.""" - clear = kwargs.get('clear', True) - - if clear: - self.get_parameters().delete() - - parameters = [] - - for parameter in other.get_parameters(): - # If this part already has a parameter pointing to the same template, - # delete that parameter from this part first! - - try: - existing = PartParameter.objects.get( - part=self, template=parameter.template - ) - existing.delete() - except PartParameter.DoesNotExist: - pass - - parameter.part = self - parameter.pk = None - - parameters.append(parameter) - - if len(parameters) > 0: - PartParameter.objects.bulk_create(parameters) - @transaction.atomic def copy_tests_from(self, other: Part, **kwargs) -> None: """Copy all test templates from another Part instance. @@ -2444,6 +2502,42 @@ class Part( if len(templates) > 0: PartTestTemplate.objects.bulk_create(templates) + @transaction.atomic + def copy_category_parameters(self, category: PartCategory): + """Copy parameter templates from the specified PartCategory. + + This function is normally called when the Part is first created. + """ + from common.models import Parameter + + categories = category.get_ancestors(include_self=True) + + category_templates = PartCategoryParameterTemplate.objects.filter( + category__in=categories + ).order_by('-category__level') + + parameters = [] + content_type = ContentType.objects.get_for_model(Part) + + for category_template in category_templates: + # First ensure that the part doesn't have that parameter + if self.parameters_list.filter( + template=category_template.template + ).exists(): + continue + + parameters.append( + Parameter( + template=category_template.template, + model_type=content_type, + model_id=self.pk, + data=category_template.default_value, + ) + ) + + if len(parameters) > 0: + Parameter.objects.bulk_create(parameters) + def getTestTemplates( self, required=None, include_parent: bool = True, enabled=None ) -> QuerySet[PartTestTemplate]: @@ -2543,36 +2637,6 @@ class Part( return quantity - def get_parameter(self, name): - """Return the parameter with the given name. - - If no matching parameter is found, return None. - """ - try: - return self.parameters.get(template__name=name) - except PartParameter.DoesNotExist: - return None - - def get_parameters(self): - """Return all parameters for this part, ordered by name.""" - return self.parameters.order_by('template__name') - - def parameters_map(self): - """Return a map (dict) of parameter values associated with this Part instance, of the form. - - Example: - { - "name_1": "value_1", - "name_2": "value_2", - } - """ - params = {} - - for parameter in self.parameters.all(): - params[parameter.template.name] = parameter.data - - return params - @property def has_variants(self): """Check if this Part object has variants underneath it.""" @@ -3740,445 +3804,6 @@ class PartTestTemplate(InvenTree.models.InvenTreeMetadataModel): return [x.strip() for x in self.choices.split(',') if x.strip()] -def validate_template_name(name): - """Placeholder for legacy function used in migrations.""" - - -class PartParameterTemplate(InvenTree.models.InvenTreeMetadataModel): - """A PartParameterTemplate provides a template for key:value pairs for extra parameters fields/values to be added to a Part. - - This allows users to arbitrarily assign data fields to a Part beyond the built-in attributes. - - Attributes: - name: The name (key) of the Parameter [string] - units: The units of the Parameter [string] - description: Description of the parameter [string] - checkbox: Boolean flag to indicate whether the parameter is a checkbox [bool] - choices: List of valid choices for the parameter [string] - selectionlist: SelectionList that should be used for choices [selectionlist] - """ - - class Meta: - """Metaclass options for the PartParameterTemplate model.""" - - verbose_name = _('Part Parameter Template') - - @staticmethod - def get_api_url(): - """Return the list API endpoint URL associated with the PartParameterTemplate model.""" - return reverse('api-part-parameter-template-list') - - def __str__(self): - """Return a string representation of a PartParameterTemplate instance.""" - s = str(self.name) - if self.units: - s += f' ({self.units})' - return s - - def clean(self): - """Custom cleaning step for this model. - - Checks: - - A 'checkbox' field cannot have 'choices' set - - A 'checkbox' field cannot have 'units' set - """ - super().clean() - - # Check that checkbox parameters do not have units or choices - if self.checkbox: - if self.units: - raise ValidationError({ - 'units': _('Checkbox parameters cannot have units') - }) - - if self.choices: - raise ValidationError({ - 'choices': _('Checkbox parameters cannot have choices') - }) - - # Check that 'choices' are in fact valid - if self.choices is None: - self.choices = '' - else: - self.choices = str(self.choices).strip() - - if self.choices: - choice_set = set() - - for choice in self.choices.split(','): - choice = choice.strip() - - # Ignore empty choices - if not choice: - continue - - if choice in choice_set: - raise ValidationError({'choices': _('Choices must be unique')}) - - choice_set.add(choice) - - def validate_unique(self, exclude=None): - """Ensure that PartParameterTemplates cannot be created with the same name. - - This test should be case-insensitive (which the unique caveat does not cover). - """ - super().validate_unique(exclude) - - try: - others = PartParameterTemplate.objects.filter( - name__iexact=self.name - ).exclude(pk=self.pk) - - if others.exists(): - msg = _('Parameter template name must be unique') - raise ValidationError({'name': msg}) - except PartParameterTemplate.DoesNotExist: - pass - - def get_choices(self): - """Return a list of choices for this parameter template.""" - if self.selectionlist: - return self.selectionlist.get_choices() - - if not self.choices: - return [] - - return [x.strip() for x in self.choices.split(',') if x.strip()] - - name = models.CharField( - max_length=100, - verbose_name=_('Name'), - help_text=_('Parameter Name'), - unique=True, - ) - - units = models.CharField( - max_length=25, - verbose_name=_('Units'), - help_text=_('Physical units for this parameter'), - blank=True, - validators=[validators.validate_physical_units], - ) - - description = models.CharField( - max_length=250, - verbose_name=_('Description'), - help_text=_('Parameter description'), - blank=True, - ) - - checkbox = models.BooleanField( - default=False, - verbose_name=_('Checkbox'), - help_text=_('Is this parameter a checkbox?'), - ) - - choices = models.CharField( - max_length=5000, - verbose_name=_('Choices'), - help_text=_('Valid choices for this parameter (comma-separated)'), - blank=True, - ) - - selectionlist = models.ForeignKey( - common.models.SelectionList, - blank=True, - null=True, - on_delete=models.SET_NULL, - related_name='parameter_templates', - verbose_name=_('Selection List'), - help_text=_('Selection list for this parameter'), - ) - - -@receiver( - post_save, - sender=PartParameterTemplate, - dispatch_uid='post_save_part_parameter_template', -) -def post_save_part_parameter_template(sender, instance, created, **kwargs): - """Callback function when a PartParameterTemplate is created or saved.""" - import part.tasks as part_tasks - - if InvenTree.ready.canAppAccessDatabase() and not InvenTree.ready.isImportingData(): - if not created: - # Schedule a background task to rebuild the parameters against this template - InvenTree.tasks.offload_task( - part_tasks.rebuild_parameters, - instance.pk, - force_async=True, - group='part', - ) - - -class PartParameter( - common.models.UpdatedUserMixin, InvenTree.models.InvenTreeMetadataModel -): - """A PartParameter is a specific instance of a PartParameterTemplate. It assigns a particular parameter pair to a part. - - Attributes: - part: Reference to a single Part object - template: Reference to a single PartParameterTemplate object - data: The data (value) of the Parameter [string] - data_numeric: Numeric value of the parameter (if applicable) [float] - note: Optional note field for the parameter [string] - updated: Timestamp of when the parameter was last updated [datetime] - updated_by: Reference to the User who last updated the parameter [User] - """ - - class Meta: - """Metaclass providing extra model definition.""" - - verbose_name = _('Part Parameter') - # Prevent multiple instances of a parameter for a single part - unique_together = ('part', 'template') - - @staticmethod - def get_api_url(): - """Return the list API endpoint URL associated with the PartParameter model.""" - return reverse('api-part-parameter-list') - - def __str__(self): - """String representation of a PartParameter (used in the admin interface).""" - return f'{self.part.full_name} : {self.template.name} = {self.data} ({self.template.units})' - - def delete(self): - """Custom delete handler for the PartParameter model. - - - Check if the parameter can be deleted - """ - self.check_part_lock() - super().delete() - - def check_part_lock(self): - """Check if the referenced part is locked.""" - # TODO: Potentially control this behaviour via a global setting - - if self.part.locked: - raise ValidationError(_('Parameter cannot be modified - part is locked')) - - def save(self, *args, **kwargs): - """Custom save method for the PartParameter model.""" - # Validate the PartParameter before saving - self.calculate_numeric_value() - - # Check if the part is locked - self.check_part_lock() - - # Convert 'boolean' values to 'True' / 'False' - if self.template.checkbox: - self.data = str2bool(self.data) - self.data_numeric = 1 if self.data else 0 - - super().save(*args, **kwargs) - - def clean(self): - """Validate the PartParameter before saving to the database.""" - super().clean() - - # Validate the parameter data against the template units - if ( - get_global_setting( - 'PART_PARAMETER_ENFORCE_UNITS', True, cache=False, create=False - ) - and self.template.units - ): - try: - InvenTree.conversion.convert_physical_value( - self.data, self.template.units - ) - except ValidationError as e: - raise ValidationError({'data': e.message}) - - # Validate the parameter data against the template choices - if choices := self.template.get_choices(): - if self.data not in choices: - raise ValidationError({'data': _('Invalid choice for parameter value')}) - - self.calculate_numeric_value() - - # Run custom validation checks (via plugins) - from plugin import PluginMixinEnum, registry - - for plugin in registry.with_mixin(PluginMixinEnum.VALIDATION): - # Note: The validate_part_parameter function may raise a ValidationError - try: - result = plugin.validate_part_parameter(self, self.data) - if result: - break - except ValidationError as exc: - # Re-throw the ValidationError against the 'data' field - raise ValidationError({'data': exc.message}) - except Exception: - log_error('validate_part_parameter', plugin=plugin.slug) - - def calculate_numeric_value(self): - """Calculate a numeric value for the parameter data. - - - If a 'units' field is provided, then the data will be converted to the base SI unit. - - Otherwise, we'll try to do a simple float cast - """ - if self.template.units: - try: - self.data_numeric = InvenTree.conversion.convert_physical_value( - self.data, self.template.units - ) - except (ValidationError, ValueError): - self.data_numeric = None - - # No units provided, so try to cast to a float - else: - try: - self.data_numeric = float(self.data) - except ValueError: - self.data_numeric = None - - if self.data_numeric is not None and type(self.data_numeric) is float: - # Prevent out of range numbers, etc - # Ref: https://github.com/inventree/InvenTree/issues/7593 - if math.isnan(self.data_numeric) or math.isinf(self.data_numeric): - self.data_numeric = None - - part = models.ForeignKey( - Part, - on_delete=models.CASCADE, - related_name='parameters', - verbose_name=_('Part'), - help_text=_('Parent Part'), - ) - - template = models.ForeignKey( - PartParameterTemplate, - on_delete=models.CASCADE, - related_name='instances', - verbose_name=_('Template'), - help_text=_('Parameter Template'), - ) - - data = models.CharField( - max_length=500, - verbose_name=_('Data'), - help_text=_('Parameter Value'), - validators=[MinLengthValidator(1)], - ) - - data_numeric = models.FloatField(default=None, null=True, blank=True) - - note = models.CharField( - max_length=500, - blank=True, - verbose_name=_('Note'), - help_text=_('Optional note field'), - ) - - @property - def units(self): - """Return the units associated with the template.""" - return self.template.units - - @property - def name(self): - """Return the name of the template.""" - return self.template.name - - @property - def description(self): - """Return the description of the template.""" - return self.template.description - - @classmethod - def create(cls, part, template, data, save=False): - """Custom save method for the PartParameter class.""" - part_parameter = cls(part=part, template=template, data=data) - if save: - part_parameter.save() - return part_parameter - - -class PartCategoryParameterTemplate(InvenTree.models.InvenTreeMetadataModel): - """A PartCategoryParameterTemplate creates a unique relationship between a PartCategory and a PartParameterTemplate. - - Multiple PartParameterTemplate instances can be associated to a PartCategory to drive a default list of parameter templates attached to a Part instance upon creation. - - Attributes: - category: Reference to a single PartCategory object - parameter_template: Reference to a single PartParameterTemplate object - default_value: The default value for the parameter in the context of the selected - category - """ - - @staticmethod - def get_api_url(): - """Return the API endpoint URL associated with the PartCategoryParameterTemplate model.""" - return reverse('api-part-category-parameter-list') - - class Meta: - """Metaclass providing extra model definition.""" - - verbose_name = _('Part Category Parameter Template') - - constraints = [ - UniqueConstraint( - fields=['category', 'parameter_template'], - name='unique_category_parameter_template_pair', - ) - ] - - def __str__(self): - """String representation of a PartCategoryParameterTemplate (admin interface).""" - if self.default_value: - return f'{self.category.name} | {self.parameter_template.name} | {self.default_value}' - return f'{self.category.name} | {self.parameter_template.name}' - - def clean(self): - """Validate this PartCategoryParameterTemplate instance. - - Checks the provided 'default_value', and (if not blank), ensure it is valid. - """ - super().clean() - - self.default_value = ( - '' if self.default_value is None else str(self.default_value.strip()) - ) - - if ( - self.default_value - and get_global_setting( - 'PART_PARAMETER_ENFORCE_UNITS', True, cache=False, create=False - ) - and self.parameter_template.units - ): - try: - InvenTree.conversion.convert_physical_value( - self.default_value, self.parameter_template.units - ) - except ValidationError as e: - raise ValidationError({'default_value': e.message}) - - category = models.ForeignKey( - PartCategory, - on_delete=models.CASCADE, - related_name='parameter_templates', - verbose_name=_('Category'), - help_text=_('Part Category'), - ) - - parameter_template = models.ForeignKey( - PartParameterTemplate, - on_delete=models.CASCADE, - related_name='part_categories', - verbose_name=_('Parameter Template'), - help_text=_('Parameter Template'), - ) - - default_value = models.CharField( - max_length=500, - blank=True, - verbose_name=_('Default Value'), - help_text=_('Default Parameter Value'), - ) - - class BomItem(InvenTree.models.MetadataMixin, InvenTree.models.InvenTreeModel): """A BomItem links a part to its component items. diff --git a/src/backend/InvenTree/part/serializers.py b/src/backend/InvenTree/part/serializers.py index 2a8b62fa52..8a9d1e1acb 100644 --- a/src/backend/InvenTree/part/serializers.py +++ b/src/backend/InvenTree/part/serializers.py @@ -7,7 +7,7 @@ from decimal import Decimal from django.core.exceptions import ValidationError from django.core.files.base import ContentFile from django.core.validators import MinValueValidator -from django.db import IntegrityError, models, transaction +from django.db import models, transaction from django.db.models import ExpressionWrapper, F, Q from django.db.models.functions import Coalesce, Greatest from django.urls import reverse_lazy @@ -22,6 +22,7 @@ from sql_util.utils import SubqueryCount from taggit.serializers import TagListSerializerField import common.currency +import common.serializers import company.models import InvenTree.helpers import InvenTree.serializers @@ -48,8 +49,6 @@ from .models import ( PartCategory, PartCategoryParameterTemplate, PartInternalPriceBreak, - PartParameter, - PartParameterTemplate, PartPricing, PartRelated, PartSellPriceBreak, @@ -283,40 +282,6 @@ class PartThumbSerializerUpdate(InvenTree.serializers.InvenTreeModelSerializer): image = InvenTree.serializers.InvenTreeAttachmentSerializerField(required=True) -@register_importer() -class PartParameterTemplateSerializer( - DataImportExportSerializerMixin, InvenTree.serializers.InvenTreeModelSerializer -): - """JSON serializer for the PartParameterTemplate model.""" - - class Meta: - """Metaclass defining serializer fields.""" - - model = PartParameterTemplate - fields = [ - 'pk', - 'name', - 'units', - 'description', - 'parts', - 'checkbox', - 'choices', - 'selectionlist', - ] - - parts = serializers.IntegerField( - read_only=True, - allow_null=True, - label=_('Parts'), - help_text=_('Number of parts using this template'), - ) - - @staticmethod - def annotate_queryset(queryset): - """Annotate the queryset with the number of parts which use each parameter template.""" - return queryset.annotate(parts=SubqueryCount('instances')) - - class PartBriefSerializer( InvenTree.serializers.FilterableSerializerMixin, InvenTree.serializers.InvenTreeModelSerializer, @@ -394,60 +359,6 @@ class PartBriefSerializer( ) -@register_importer() -class PartParameterSerializer( - InvenTree.serializers.FilterableSerializerMixin, - DataImportExportSerializerMixin, - InvenTree.serializers.InvenTreeModelSerializer, -): - """JSON serializers for the PartParameter model.""" - - class Meta: - """Metaclass defining serializer fields.""" - - model = PartParameter - fields = [ - 'pk', - 'part', - 'part_detail', - 'template', - 'template_detail', - 'data', - 'data_numeric', - 'note', - 'updated', - 'updated_by', - 'updated_by_detail', - ] - read_only_fields = ['updated', 'updated_by'] - - def save(self): - """Save the PartParameter instance.""" - instance = super().save() - - if request := self.context.get('request', None): - # If the request is provided, update the 'updated_by' field - instance.updated_by = request.user - instance.save() - - return instance - - part_detail = enable_filter( - PartBriefSerializer(source='part', many=False, read_only=True, allow_null=True) - ) - - template_detail = enable_filter( - PartParameterTemplateSerializer( - source='template', many=False, read_only=True, allow_null=True - ), - True, - ) - - updated_by_detail = UserSerializer( - source='updated_by', many=False, read_only=True, allow_null=True - ) - - class DuplicatePartSerializer(serializers.Serializer): """Serializer for specifying options when duplicating a Part. @@ -771,6 +682,8 @@ class PartSerializer( """ queryset = queryset.prefetch_related('category', 'default_location') + queryset = Part.annotate_parameters(queryset) + # Annotate with the total number of revisions queryset = queryset.annotate(revision_count=SubqueryCount('revisions')) @@ -1010,7 +923,11 @@ class PartSerializer( ) parameters = enable_filter( - PartParameterSerializer(many=True, read_only=True, allow_null=True) + common.serializers.ParameterSerializer( + many=True, read_only=True, allow_null=True + ), + False, + filter_name='parameters', ) price_breaks = enable_filter( @@ -1113,31 +1030,7 @@ class PartSerializer( # Duplicate parameter data from part category (and parents) if copy_category_parameters and instance.category is not None: # Get flattened list of parent categories - categories = instance.category.get_ancestors(include_self=True) - - # All parameter templates within these categories - templates = PartCategoryParameterTemplate.objects.filter( - category__in=categories - ) - - for template in templates: - # First ensure that the part doesn't have that parameter - if PartParameter.objects.filter( - part=instance, template=template.parameter_template - ).exists(): - continue - - try: - PartParameter.create( - part=instance, - template=template.parameter_template, - data=template.default_value, - save=True, - ) - except IntegrityError: - logger.exception( - 'Could not create new PartParameter for part %s', instance - ) + instance.copy_category_parameters(instance.category) # Create initial stock entry if initial_stock: @@ -1852,7 +1745,9 @@ class BomItemSerializer( @register_importer() class CategoryParameterTemplateSerializer( - DataImportExportSerializerMixin, InvenTree.serializers.InvenTreeModelSerializer + InvenTree.serializers.FilterableSerializerMixin, + DataImportExportSerializerMixin, + InvenTree.serializers.InvenTreeModelSerializer, ): """Serializer for the PartCategoryParameterTemplate model.""" @@ -1864,17 +1759,23 @@ class CategoryParameterTemplateSerializer( 'pk', 'category', 'category_detail', - 'parameter_template', - 'parameter_template_detail', + 'template', + 'template_detail', 'default_value', ] - parameter_template_detail = PartParameterTemplateSerializer( - source='parameter_template', many=False, read_only=True + template_detail = enable_filter( + common.serializers.ParameterTemplateSerializer( + source='template', many=False, read_only=True + ), + True, ) - category_detail = CategorySerializer( - source='category', many=False, read_only=True, allow_null=True + category_detail = enable_filter( + CategorySerializer( + source='category', many=False, read_only=True, allow_null=True + ), + True, ) diff --git a/src/backend/InvenTree/part/tasks.py b/src/backend/InvenTree/part/tasks.py index e168b6d33a..a7008f7576 100644 --- a/src/backend/InvenTree/part/tasks.py +++ b/src/backend/InvenTree/part/tasks.py @@ -355,38 +355,6 @@ def scheduled_stocktake_reports(): record_task_success('STOCKTAKE_RECENT_REPORT') -@tracer.start_as_current_span('rebuild_parameters') -def rebuild_parameters(template_id): - """Rebuild all parameters for a given template. - - This function is called when a base template is changed, - which may cause the base unit to be adjusted. - """ - from part.models import PartParameter, PartParameterTemplate - - try: - template = PartParameterTemplate.objects.get(pk=template_id) - except PartParameterTemplate.DoesNotExist: - return - - parameters = PartParameter.objects.filter(template=template) - - n = 0 - - for parameter in parameters: - # Update the parameter if the numeric value has changed - value_old = parameter.data_numeric - parameter.calculate_numeric_value() - - if value_old != parameter.data_numeric: - parameter.full_clean() - parameter.save() - n += 1 - - if n > 0: - logger.info("Rebuilt %s parameters for template '%s'", n, template.name) - - @tracer.start_as_current_span('rebuild_supplier_parts') def rebuild_supplier_parts(part_id: int): """Rebuild all SupplierPart objects for a given part. diff --git a/src/backend/InvenTree/part/test_api.py b/src/backend/InvenTree/part/test_api.py index 2344c63aa8..fb70ed442b 100644 --- a/src/backend/InvenTree/part/test_api.py +++ b/src/backend/InvenTree/part/test_api.py @@ -18,7 +18,7 @@ import build.models import company.models import order.models from build.status_codes import BuildStatus -from common.models import InvenTreeSetting +from common.models import InvenTreeSetting, ParameterTemplate from company.models import Company, SupplierPart from InvenTree.config import get_testfolder_dir from InvenTree.unit_test import InvenTreeAPITestCase @@ -29,8 +29,6 @@ from part.models import ( Part, PartCategory, PartCategoryParameterTemplate, - PartParameter, - PartParameterTemplate, PartRelated, PartSellPriceBreak, PartTestTemplate, @@ -235,21 +233,14 @@ class PartCategoryAPITest(InvenTreeAPITestCase): self.assertEqual(len(response.data), 2) # Add some more category templates via the API - n = PartParameterTemplate.objects.count() + n = ParameterTemplate.objects.count() # Ensure validation of parameter values is disabled for these checks - InvenTreeSetting.set_setting( - 'PART_PARAMETER_ENFORCE_UNITS', False, change_user=None - ) + InvenTreeSetting.set_setting('PARAMETER_ENFORCE_UNITS', False, change_user=None) - for template in PartParameterTemplate.objects.all(): + for template in ParameterTemplate.objects.all(): response = self.post( - url, - { - 'category': 2, - 'parameter_template': template.pk, - 'default_value': 'xyz', - }, + url, {'category': 2, 'template': template.pk, 'default_value': '123'} ) # Total number of category templates should have increased @@ -273,8 +264,8 @@ class PartCategoryAPITest(InvenTreeAPITestCase): 'pk', 'category', 'category_detail', - 'parameter_template', - 'parameter_template_detail', + 'template', + 'template_detail', 'default_value', ]: self.assertIn(key, data.keys()) @@ -1645,7 +1636,7 @@ class PartCreationTests(PartAPITestBase): # Add some parameter template to the parent category for pk in [1, 2, 3]: PartCategoryParameterTemplate.objects.create( - parameter_template=PartParameterTemplate.objects.get(pk=pk), + template=ParameterTemplate.objects.get(pk=pk), category=cat, default_value=f'Value {pk}', ) @@ -2074,8 +2065,8 @@ class PartListTests(PartAPITestBase): if b and result['category'] is not None: self.assertIn('category_detail', result) - # No more than 20 DB queries - self.assertLessEqual(len(ctx), 20) + # No more than 22 DB queries + self.assertLessEqual(len(ctx), 22) def test_price_breaks(self): """Test that price_breaks parameter works correctly and efficiently.""" @@ -3056,13 +3047,13 @@ class BomItemTest(InvenTreeAPITestCase): self.assertAlmostEqual(can_build, 482.9, places=1) -class PartAttachmentTest(InvenTreeAPITestCase): - """Unit tests for the PartAttachment API endpoint.""" +class AttachmentTest(InvenTreeAPITestCase): + """Unit tests for the Attachment API endpoint.""" fixtures = ['category', 'part', 'location'] def test_add_attachment(self): - """Test that we can create a new PartAttachment via the API.""" + """Test that we can create a new Attachment instances via the API.""" url = reverse('api-attachment-list') # Upload without permission @@ -3238,8 +3229,6 @@ class PartMetadataAPITest(InvenTreeAPITestCase): 'api-part-category-metadata': PartCategory, 'api-part-test-template-metadata': PartTestTemplate, 'api-part-related-metadata': PartRelated, - 'api-part-parameter-template-metadata': PartParameterTemplate, - 'api-part-parameter-metadata': PartParameter, 'api-part-metadata': Part, 'api-bom-substitute-metadata': BomItemSubstitute, 'api-bom-item-metadata': BomItem, @@ -3341,12 +3330,12 @@ class PartTestTemplateTest(PartAPITestBase): self.assertIn('Choices must be unique', str(response.data['choices'])) -class PartParameterTests(PartAPITestBase): - """Unit test for PartParameter API endpoints.""" +class ParameterTests(PartAPITestBase): + """Unit test for Parameter API endpoints.""" def test_export_data(self): - """Test data export functionality for PartParameter objects.""" - url = reverse('api-part-parameter-list') + """Test data export functionality for Parameter objects.""" + url = reverse('api-parameter-list') response = self.options( url, diff --git a/src/backend/InvenTree/part/test_category.py b/src/backend/InvenTree/part/test_category.py index c7672245e5..a5bb5e6a2d 100644 --- a/src/backend/InvenTree/part/test_category.py +++ b/src/backend/InvenTree/part/test_category.py @@ -3,9 +3,9 @@ from django.core.exceptions import ValidationError from django.test import TestCase -from common.models import InvenTreeSetting +from common.models import InvenTreeSetting, Parameter, ParameterTemplate -from .models import Part, PartCategory, PartParameter, PartParameterTemplate +from .models import Part, PartCategory class CategoryTest(TestCase): @@ -163,9 +163,9 @@ class CategoryTest(TestCase): # Iterate through all parts and parameters for fastener in fasteners: self.assertIsInstance(fastener, Part) - for parameter in fastener.parameters.all(): - self.assertIsInstance(parameter, PartParameter) - self.assertIsInstance(parameter.template, PartParameterTemplate) + for parameter in fastener.parameters_list.all(): + self.assertIsInstance(parameter, Parameter) + self.assertIsInstance(parameter.template, ParameterTemplate) # Test number of unique parameters self.assertEqual( diff --git a/src/backend/InvenTree/part/test_migrations.py b/src/backend/InvenTree/part/test_migrations.py index 1a15e57ebf..643ec7043f 100644 --- a/src/backend/InvenTree/part/test_migrations.py +++ b/src/backend/InvenTree/part/test_migrations.py @@ -52,7 +52,7 @@ class TestBomItemMigrations(MigratorTestCase): """Tests for BomItem migrations.""" migrate_from = ('part', '0002_auto_20190520_2204') - migrate_to = ('part', unit_test.getNewestMigrationFile('part')) + migrate_to = ('part', '0101_bomitem_validated') def prepare(self): """Create initial dataset.""" @@ -86,7 +86,7 @@ class TestParameterMigrations(MigratorTestCase): """Unit test for part parameter migrations.""" migrate_from = ('part', '0106_part_tags') - migrate_to = ('part', unit_test.getNewestMigrationFile('part')) + migrate_to = ('part', '0143_alter_part_image') def prepare(self): """Create some parts, and templates with parameters.""" @@ -158,7 +158,7 @@ class PartUnitsMigrationTest(MigratorTestCase): """Test for data migration of Part.units field.""" migrate_from = ('part', '0109_auto_20230517_1048') - migrate_to = ('part', unit_test.getNewestMigrationFile('part')) + migrate_to = ('part', '0115_part_responsible_owner') def prepare(self): """Prepare some parts with units.""" @@ -273,3 +273,113 @@ class TestPartTestParameterMigration(MigratorTestCase): for key, value in self.test_keys.items(): template = PartTestTemplate.objects.get(test_name=value) self.assertEqual(template.key, key) + + +class TestPartParameterDeletion(MigratorTestCase): + """Test for PartParameter deletion migration. + + Ref: https://github.com/inventree/InvenTree/pull/10699 + + In the linked PR: + + 1. The Parameter and ParameterTemplate models are added + 2. Data is migrated from PartParameter to Parameter and PartParameterTemplate to ParameterTemplate + 3. The PartParameter and PartParameterTemplate models are deleted + """ + + UNITS = ['mm', 'Ampere', 'kg'] + + migrate_from = ('part', '0143_alter_part_image') + migrate_to = ('part', '0146_auto_20251203_1241') + + def prepare(self): + """Prepare some parts and parameters.""" + Part = self.old_state.apps.get_model('part', 'part') + PartParameter = self.old_state.apps.get_model('part', 'partparameter') + PartParameterTemplate = self.old_state.apps.get_model( + 'part', 'partparametertemplate' + ) + + # Create some parts + for i in range(3): + Part.objects.create( + name=f'Part {i + 1}', + description=f'My part {i + 1}', + level=0, + lft=0, + rght=0, + tree_id=0, + ) + + self.templates = {} + + # Create some parameter templates + for idx, units in enumerate(self.UNITS): + template = PartParameterTemplate.objects.create( + name=f'Template {idx + 1}', + description=f'Description for template {idx + 1}', + units=units, + ) + + self.templates[template.pk] = template + + # Keep track of the parameters we create + # We need to ensure that the PK values are preserved across the migration + self.parameters = {} + + # Create some parameters + for ii, part in enumerate(Part.objects.all()): + for jj, template in enumerate(PartParameterTemplate.objects.all()): + parameter = PartParameter.objects.create( + part=part, template=template, data=str(ii * jj) + ) + + self.parameters[parameter.pk] = parameter + + self.assertEqual(Part.objects.count(), 3) + self.assertEqual(PartParameterTemplate.objects.count(), 3) + self.assertEqual(PartParameter.objects.count(), 9) + + def test_parameter_deletion(self): + """Test that PartParameter objects have been deleted.""" + # Test that the PartParameter objects have been deleted + with self.assertRaises(LookupError): + self.new_state.apps.get_model('part', 'partparameter') + + # Load the new PartParameter model + ParameterTemplate = self.new_state.apps.get_model('common', 'parametertemplate') + Parameter = self.new_state.apps.get_model('common', 'parameter') + Part = self.new_state.apps.get_model('part', 'part') + ContentType = self.new_state.apps.get_model('contenttypes', 'contenttype') + + self.assertEqual(ParameterTemplate.objects.count(), 3) + self.assertEqual(Parameter.objects.count(), 9) + self.assertEqual(Part.objects.count(), 3) + + content_type, _created = ContentType.objects.get_or_create( + app_label='part', model='part' + ) + + for p in Part.objects.all(): + params = Parameter.objects.filter(model_type=content_type, model_id=p.id) + + self.assertEqual(len(params), 3) + + for unit in self.UNITS: + self.assertTrue(params.filter(template__units=unit).exists()) + + # Test that each parameter has been migrated correctly + for pk, old_parameter in self.parameters.items(): + new_parameter = Parameter.objects.get(pk=pk) + + self.assertEqual(new_parameter.data, old_parameter.data) + self.assertEqual(new_parameter.template.name, old_parameter.template.name) + self.assertEqual(new_parameter.template.units, old_parameter.template.units) + + # Test that each template has been migrated correctly + for pk, old_template in self.templates.items(): + new_template = ParameterTemplate.objects.get(pk=pk) + + self.assertEqual(new_template.name, old_template.name) + self.assertEqual(new_template.description, old_template.description) + self.assertTrue(new_template.enabled) diff --git a/src/backend/InvenTree/part/test_param.py b/src/backend/InvenTree/part/test_param.py index 2891f5c839..76b3fb241b 100644 --- a/src/backend/InvenTree/part/test_param.py +++ b/src/backend/InvenTree/part/test_param.py @@ -5,37 +5,32 @@ from django.contrib.auth.models import User from django.test import TestCase, TransactionTestCase from django.urls import reverse -from common.models import InvenTreeSetting +from common.models import InvenTreeSetting, Parameter, ParameterTemplate from InvenTree.unit_test import InvenTreeAPITestCase -from .models import ( - Part, - PartCategory, - PartCategoryParameterTemplate, - PartParameter, - PartParameterTemplate, -) +from .models import Part, PartCategory, PartCategoryParameterTemplate class TestParams(TestCase): - """Unit test class for testing the PartParameter model.""" + """Unit test class for testing the Parameter model.""" fixtures = ['location', 'category', 'part', 'params', 'users'] def test_str(self): - """Test the str representation of the PartParameterTemplate model.""" - t1 = PartParameterTemplate.objects.get(pk=1) + """Test the str representation of the ParameterTemplate model.""" + t1 = ParameterTemplate.objects.get(pk=1) self.assertEqual(str(t1), 'Length (mm)') - p1 = PartParameter.objects.get(pk=1) - self.assertEqual(str(p1), 'M2x4 LPHS : Length = 4 (mm)') + # TODO fix assertion + # p1 = Parameter.objects.get(pk=1) + # self.assertEqual(str(p1), 'M2x4 LPHS : Length = 4 (mm)') c1 = PartCategoryParameterTemplate.objects.get(pk=1) self.assertEqual(str(c1), 'Mechanical | Length | 2.8') def test_updated(self): """Test that the 'updated' field is correctly set.""" - p1 = PartParameter.objects.get(pk=1) + p1 = Parameter.objects.get(pk=1) self.assertIsNone(p1.updated) self.assertIsNone(p1.updated_by) @@ -47,41 +42,41 @@ class TestParams(TestCase): def test_validate(self): """Test validation for part templates.""" - n = PartParameterTemplate.objects.all().count() + n = ParameterTemplate.objects.all().count() - t1 = PartParameterTemplate(name='abcde', units='dd') + t1 = ParameterTemplate(name='abcde', units='dd') t1.save() - self.assertEqual(n + 1, PartParameterTemplate.objects.all().count()) + self.assertEqual(n + 1, ParameterTemplate.objects.all().count()) # Test that the case-insensitive name throws a ValidationError with self.assertRaises(django_exceptions.ValidationError): - t3 = PartParameterTemplate(name='aBcde', units='dd') + t3 = ParameterTemplate(name='aBcde', units='dd') t3.full_clean() t3.save() # pragma: no cover def test_invalid_numbers(self): """Test that invalid floating point numbers are correctly handled.""" p = Part.objects.first() - t = PartParameterTemplate.objects.create(name='Yaks') + t = ParameterTemplate.objects.create(name='Yaks') valid_floats = ['-12', '1.234', '17', '3e45', '-12e34'] for value in valid_floats: - param = PartParameter(part=p, template=t, data=value) + param = Parameter(content_object=p, template=t, data=value) param.full_clean() self.assertIsNotNone(param.data_numeric) invalid_floats = ['88E6352', 'inf', '-inf', 'nan', '3.14.15', '3eee3'] for value in invalid_floats: - param = PartParameter(part=p, template=t, data=value) + param = Parameter(content_object=p, template=t, data=value) param.full_clean() self.assertIsNone(param.data_numeric) def test_metadata(self): """Unit tests for the metadata field.""" - for model in [PartParameterTemplate]: + for model in [ParameterTemplate]: p = model.objects.first() self.assertIsNone(p.get_metadata('test')) @@ -118,8 +113,8 @@ class TestParams(TestCase): IPN='TEST-PART', ) - parameter = PartParameter.objects.create( - part=part, template=PartParameterTemplate.objects.first(), data='123' + parameter = Parameter.objects.create( + content_object=part, template=ParameterTemplate.objects.first(), data='123' ) # Lock the part @@ -160,9 +155,9 @@ class TestCategoryTemplates(TransactionTestCase): category = PartCategory.objects.get(pk=8) - t1 = PartParameterTemplate.objects.get(pk=2) + t1 = ParameterTemplate.objects.get(pk=2) c1 = PartCategoryParameterTemplate( - category=category, parameter_template=t1, default_value='xyz' + category=category, template=t1, default_value='xyz' ) c1.save() @@ -177,7 +172,7 @@ class ParameterTests(TestCase): def test_choice_validation(self): """Test that parameter choices are correctly validated.""" - template = PartParameterTemplate.objects.create( + template = ParameterTemplate.objects.create( name='My Template', description='A template with choices', choices='red, blue, green', @@ -189,16 +184,16 @@ class ParameterTests(TestCase): part = Part.objects.all().first() for value in pass_values: - param = PartParameter(part=part, template=template, data=value) + param = Parameter(content_object=part, template=template, data=value) param.full_clean() for value in fail_values: - param = PartParameter(part=part, template=template, data=value) + param = Parameter(content_object=part, template=template, data=value) with self.assertRaises(django_exceptions.ValidationError): param.full_clean() def test_unit_validation(self): - """Test validation of 'units' field for PartParameterTemplate.""" + """Test validation of 'units' field for ParameterTemplate.""" # Test that valid units pass for unit in [ None, @@ -215,18 +210,18 @@ class ParameterTests(TestCase): 'mF', 'millifarad', ]: - tmp = PartParameterTemplate(name='test', units=unit) + tmp = ParameterTemplate(name='test', units=unit) tmp.full_clean() # Test that invalid units fail for unit in ['mmmmm', '-', 'x', int]: - tmp = PartParameterTemplate(name='test', units=unit) + tmp = ParameterTemplate(name='test', units=unit) with self.assertRaises(django_exceptions.ValidationError): tmp.full_clean() def test_param_unit_validation(self): """Test that parameters are correctly validated against template units.""" - template = PartParameterTemplate.objects.create(name='My Template', units='m') + template = ParameterTemplate.objects.create(name='My Template', units='m') prt = Part.objects.get(pk=1) @@ -243,42 +238,36 @@ class ParameterTests(TestCase): 'foot', '3 yards', ]: - param = PartParameter(part=prt, template=template, data=value) + param = Parameter(content_object=prt, template=template, data=value) param.full_clean() # Test that percent unit is working - template2 = PartParameterTemplate.objects.create( - name='My Template 2', units='%' - ) + template2 = ParameterTemplate.objects.create(name='My Template 2', units='%') for value in ['1', '1%', '1 percent']: - param = PartParameter(part=prt, template=template2, data=value) + param = Parameter(content_object=prt, template=template2, data=value) param.full_clean() bad_values = ['3 Amps', '-3 zogs', '3.14F'] # Disable enforcing of part parameter units - InvenTreeSetting.set_setting( - 'PART_PARAMETER_ENFORCE_UNITS', False, change_user=None - ) + InvenTreeSetting.set_setting('PARAMETER_ENFORCE_UNITS', False, change_user=None) # Invalid units also pass, but will be converted to the template units for value in bad_values: - param = PartParameter(part=prt, template=template, data=value) + param = Parameter(content_object=prt, template=template, data=value) param.full_clean() # Enable enforcing of part parameter units - InvenTreeSetting.set_setting( - 'PART_PARAMETER_ENFORCE_UNITS', True, change_user=None - ) + InvenTreeSetting.set_setting('PARAMETER_ENFORCE_UNITS', True, change_user=None) for value in bad_values: - param = PartParameter(part=prt, template=template, data=value) + param = Parameter(content_object=prt, template=template, data=value) with self.assertRaises(django_exceptions.ValidationError): param.full_clean() def test_param_unit_conversion(self): """Test that parameters are correctly converted to template units.""" - template = PartParameterTemplate.objects.create(name='My Template', units='m') + template = ParameterTemplate.objects.create(name='My Template', units='m') tests = { '1': 1.0, @@ -290,7 +279,7 @@ class ParameterTests(TestCase): } prt = Part.objects.get(pk=1) - param = PartParameter(part=prt, template=template, data='1') + param = Parameter(content_object=prt, template=template, data='1') for value, expected in tests.items(): param.data = value @@ -298,8 +287,8 @@ class ParameterTests(TestCase): self.assertAlmostEqual(param.data_numeric, expected, places=2) -class PartParameterTest(InvenTreeAPITestCase): - """Tests for the ParParameter API.""" +class ParameterTest(InvenTreeAPITestCase): + """Tests for the Parameter API.""" superuser = True @@ -307,14 +296,14 @@ class PartParameterTest(InvenTreeAPITestCase): def test_list_params(self): """Test for listing part parameters.""" - url = reverse('api-part-parameter-list') + url = reverse('api-parameter-list') response = self.get(url) self.assertEqual(len(response.data), 7) # Filter by part - response = self.get(url, {'part': 3}) + response = self.get(url, {'model_id': 3, 'model_type': 'part.part'}) self.assertEqual(len(response.data), 3) @@ -327,7 +316,7 @@ class PartParameterTest(InvenTreeAPITestCase): """Test that part parameter template validation routines work correctly.""" # Checkbox parameter cannot have "units" specified with self.assertRaises(django_exceptions.ValidationError): - template = PartParameterTemplate( + template = ParameterTemplate( name='test', description='My description', units='mm', checkbox=True ) @@ -335,7 +324,7 @@ class PartParameterTest(InvenTreeAPITestCase): # Checkbox parameter cannot have "choices" specified with self.assertRaises(django_exceptions.ValidationError): - template = PartParameterTemplate( + template = ParameterTemplate( name='test', description='My description', choices='a,b,c', @@ -346,7 +335,7 @@ class PartParameterTest(InvenTreeAPITestCase): # Choices must be 'unique' with self.assertRaises(django_exceptions.ValidationError): - template = PartParameterTemplate( + template = ParameterTemplate( name='test', description='My description', choices='a,a,b' ) @@ -354,9 +343,12 @@ class PartParameterTest(InvenTreeAPITestCase): def test_create_param(self): """Test that we can create a param via the API.""" - url = reverse('api-part-parameter-list') + url = reverse('api-parameter-list') - response = self.post(url, {'part': '2', 'template': '3', 'data': 70}) + response = self.post( + url, + {'model_id': '2', 'model_type': 'part.part', 'template': '3', 'data': 70}, + ) self.assertEqual(response.status_code, 201) @@ -366,37 +358,51 @@ class PartParameterTest(InvenTreeAPITestCase): def test_bulk_create_params(self): """Test that we can bulk create parameters via the API.""" - url = reverse('api-part-parameter-list') + url = reverse('api-parameter-list') part4 = Part.objects.get(pk=4) data = [ - {'part': 4, 'template': 1, 'data': 70}, - {'part': 4, 'template': 2, 'data': 80}, - {'part': 4, 'template': 1, 'data': 80}, + {'model_id': 4, 'model_type': 'part.part', 'template': 1, 'data': 70}, + {'model_id': 4, 'model_type': 'part.part', 'template': 2, 'data': 80}, + {'model_id': 4, 'model_type': 'part.part', 'template': 1, 'data': 80}, ] # test that having non unique part/template combinations fails res = self.post(url, data, expected_code=400) + self.assertEqual(len(res.data), 3) self.assertEqual(len(res.data[1]), 0) for err in [res.data[0], res.data[2]]: - self.assertEqual(len(err), 2) - self.assertEqual(str(err['part'][0]), 'This field must be unique.') + self.assertEqual(len(err), 3) + self.assertEqual(str(err['model_id'][0]), 'This field must be unique.') + self.assertEqual(str(err['model_type'][0]), 'This field must be unique.') self.assertEqual(str(err['template'][0]), 'This field must be unique.') - self.assertEqual(PartParameter.objects.filter(part=part4).count(), 0) + + self.assertEqual( + Parameter.objects.filter( + model_type=part4.get_content_type(), model_id=part4.pk + ).count(), + 0, + ) # Now, create a valid set of parameters data = [ - {'part': 4, 'template': 1, 'data': 70}, - {'part': 4, 'template': 2, 'data': 80}, + {'model_id': 4, 'model_type': 'part.part', 'template': 1, 'data': 70}, + {'model_id': 4, 'model_type': 'part.part', 'template': 2, 'data': 80}, ] res = self.post(url, data, expected_code=201) self.assertEqual(len(res.data), 2) - self.assertEqual(PartParameter.objects.filter(part=part4).count(), 2) + + self.assertEqual( + Parameter.objects.filter( + model_type=part4.get_content_type(), model_id=part4.pk + ).count(), + 2, + ) def test_param_detail(self): - """Tests for the PartParameter detail endpoint.""" - url = reverse('api-part-parameter-detail', kwargs={'pk': 5}) + """Tests for the Parameter detail endpoint.""" + url = reverse('api-parameter-detail', kwargs={'pk': 5}) response = self.get(url) @@ -405,7 +411,7 @@ class PartParameterTest(InvenTreeAPITestCase): data = response.data self.assertEqual(data['pk'], 5) - self.assertEqual(data['part'], 3) + self.assertEqual(data['model_id'], 3) self.assertEqual(data['data'], '12') # PATCH data back in @@ -435,7 +441,7 @@ class PartParameterTest(InvenTreeAPITestCase): return None # Create a new parameter template - template = PartParameterTemplate.objects.create( + template = ParameterTemplate.objects.create( name='Test Template', description='My test template', units='m' ) @@ -452,8 +458,8 @@ class PartParameterTest(InvenTreeAPITestCase): suffix = 'mm' if idx % 3 == 0 else 'm' params.append( - PartParameter.objects.create( - part=part, template=template, data=f'{idx}{suffix}' + Parameter.objects.create( + content_object=part, template=template, data=f'{idx}{suffix}' ) ) @@ -490,7 +496,7 @@ class PartParameterTest(InvenTreeAPITestCase): self.assertEqual(actual, expected) -class PartParameterFilterTest(InvenTreeAPITestCase): +class ParameterFilterTest(InvenTreeAPITestCase): """Unit tests for filtering parts by parameter values.""" superuser = True @@ -503,19 +509,19 @@ class PartParameterFilterTest(InvenTreeAPITestCase): cls.url = reverse('api-part-list') # Create a number of part parameter templates - cls.template_length = PartParameterTemplate.objects.create( + cls.template_length = ParameterTemplate.objects.create( name='Length', description='Length of the part', units='mm' ) - cls.template_width = PartParameterTemplate.objects.create( + cls.template_width = ParameterTemplate.objects.create( name='Width', description='Width of the part', units='mm' ) - cls.template_ionized = PartParameterTemplate.objects.create( + cls.template_ionized = ParameterTemplate.objects.create( name='Ionized', description='Is the part ionized?', checkbox=True ) - cls.template_color = PartParameterTemplate.objects.create( + cls.template_color = ParameterTemplate.objects.create( name='Color', description='Color of the part', choices='red,green,blue' ) @@ -545,8 +551,8 @@ class PartParameterFilterTest(InvenTreeAPITestCase): for ii, part in enumerate(Part.objects.all()): parameters.append( - PartParameter( - part=part, + Parameter( + content_object=part, template=cls.template_length, data=(ii * 10) + 5, # Length in mm data_numeric=(ii * 10) + 5, # Numeric value for length @@ -554,8 +560,8 @@ class PartParameterFilterTest(InvenTreeAPITestCase): ) parameters.append( - PartParameter( - part=part, + Parameter( + content_object=part, template=cls.template_width, data=(50 - ii) * 5 + 2, # Width in mm data_numeric=(50 - ii) * 5 + 2, # Width in mm @@ -564,8 +570,8 @@ class PartParameterFilterTest(InvenTreeAPITestCase): if ii < 25: parameters.append( - PartParameter( - part=part, + Parameter( + content_object=part, template=cls.template_ionized, data='true' if ii % 5 == 0 @@ -578,8 +584,8 @@ class PartParameterFilterTest(InvenTreeAPITestCase): if ii < 15: parameters.append( - PartParameter( - part=part, + Parameter( + content_object=part, template=cls.template_color, data=['red', 'green', 'blue'][ii % 3], # Cycle through colors data_numeric=None, # No numeric value for color @@ -587,7 +593,7 @@ class PartParameterFilterTest(InvenTreeAPITestCase): ) # Bulk create all parameters - PartParameter.objects.bulk_create(parameters) + Parameter.objects.bulk_create(parameters) def test_filter_by_length(self): """Test basic filtering by length parameter.""" diff --git a/src/backend/InvenTree/plugin/base/integration/ValidationMixin.py b/src/backend/InvenTree/plugin/base/integration/ValidationMixin.py index 0678bb3260..134c2206a6 100644 --- a/src/backend/InvenTree/plugin/base/integration/ValidationMixin.py +++ b/src/backend/InvenTree/plugin/base/integration/ValidationMixin.py @@ -5,6 +5,7 @@ from typing import Optional from django.core.exceptions import ValidationError from django.db.models import Model +import common.models import part.models import stock.models from plugin import PluginMixinEnum @@ -227,8 +228,8 @@ class ValidationMixin: """ return None - def validate_part_parameter( - self, parameter: part.models.PartParameter, data: str + def validate_parameter( + self, parameter: common.models.Parameter, data: str ) -> Optional[bool]: """Validate a parameter value. @@ -242,3 +243,4 @@ class ValidationMixin: Raises: ValidationError: If the proposed parameter value is objectionable """ + return None diff --git a/src/backend/InvenTree/plugin/base/supplier/api.py b/src/backend/InvenTree/plugin/base/supplier/api.py index ec96e21e04..7dc6c6045b 100644 --- a/src/backend/InvenTree/plugin/base/supplier/api.py +++ b/src/backend/InvenTree/plugin/base/supplier/api.py @@ -213,17 +213,17 @@ class ImportPart(APIView): for c in category_parameters: for p in parameters: - if p.parameter_template == c.parameter_template: + if p.parameter_template == c.template: p.on_category = True p.value = p.value if p.value is not None else c.default_value break else: parameters.append( supplier.ImportParameter( - name=c.parameter_template.name, + name=c.template.name, value=c.default_value, on_category=True, - parameter_template=c.parameter_template, + parameter_template=c.template, ) ) parameters.sort(key=lambda x: x.on_category, reverse=True) diff --git a/src/backend/InvenTree/plugin/base/supplier/helpers.py b/src/backend/InvenTree/plugin/base/supplier/helpers.py index da4828fd91..de11f5bf1e 100644 --- a/src/backend/InvenTree/plugin/base/supplier/helpers.py +++ b/src/backend/InvenTree/plugin/base/supplier/helpers.py @@ -3,6 +3,7 @@ from dataclasses import dataclass from typing import Optional +import common.models import part.models as part_models @@ -61,22 +62,22 @@ class ImportParameter: name (str): The name of the parameter. value (str): The value of the parameter. on_category (Optional[bool]): Indicates if the parameter is associated with a category. This will be automatically set by InvenTree - parameter_template (Optional[PartParameterTemplate]): The associated parameter template, if any. + parameter_template (Optional[ParameterTemplate]): The associated parameter template, if any. """ name: str value: str on_category: Optional[bool] = False - parameter_template: Optional[part_models.PartParameterTemplate] = None + parameter_template: Optional[common.models.ParameterTemplate] = None def __post_init__(self): """Post-initialization to fetch the parameter template if not provided.""" if not self.parameter_template: try: - self.parameter_template = part_models.PartParameterTemplate.objects.get( + self.parameter_template = common.models.ParameterTemplate.objects.get( name__iexact=self.name ) - except part_models.PartParameterTemplate.DoesNotExist: + except common.models.ParameterTemplate.DoesNotExist: pass diff --git a/src/backend/InvenTree/plugin/builtin/exporter/bom_exporter.py b/src/backend/InvenTree/plugin/builtin/exporter/bom_exporter.py index a432a2c6e2..bb86ea0a1f 100644 --- a/src/backend/InvenTree/plugin/builtin/exporter/bom_exporter.py +++ b/src/backend/InvenTree/plugin/builtin/exporter/bom_exporter.py @@ -158,8 +158,8 @@ class BomExporterPlugin(DataExportMixin, InvenTreePlugin): queryset = queryset.prefetch_related('sub_part__manufacturer_parts') if self.export_parameter_data: - queryset = queryset.prefetch_related('sub_part__parameters') - queryset = queryset.prefetch_related('sub_part__parameters__template') + queryset = queryset.prefetch_related('sub_part__parameters_list') + queryset = queryset.prefetch_related('sub_part__parameters_list__template') return queryset diff --git a/src/backend/InvenTree/plugin/builtin/exporter/parameter_exporter.py b/src/backend/InvenTree/plugin/builtin/exporter/parameter_exporter.py new file mode 100644 index 0000000000..0c890d8a8b --- /dev/null +++ b/src/backend/InvenTree/plugin/builtin/exporter/parameter_exporter.py @@ -0,0 +1,98 @@ +"""Custom exporter for Parameter data.""" + +from django.utils.translation import gettext_lazy as _ + +from rest_framework import serializers + +from plugin import InvenTreePlugin +from plugin.mixins import DataExportMixin + + +class ParameterExportOptionsSerializer(serializers.Serializer): + """Custom export options for the ParameterExporter plugin.""" + + export_exclude_inactive_parameters = serializers.BooleanField( + default=True, + label=_('Exclude Inactive'), + help_text=_('Exclude parameters which are inactive'), + ) + + +class ParameterExporter(DataExportMixin, InvenTreePlugin): + """Builtin plugin for exporting Parameter data. + + Extends the export process, to include all associated Parameter data. + """ + + NAME = 'Parameter Exporter' + SLUG = 'parameter-exporter' + TITLE = _('Parameter Exporter') + DESCRIPTION = _('Exporter for model parameter data') + VERSION = '2.0.0' + AUTHOR = _('InvenTree contributors') + + ExportOptionsSerializer = ParameterExportOptionsSerializer + + def supports_export( + self, + model_class: type, + user=None, + serializer_class=None, + view_class=None, + *args, + **kwargs, + ) -> bool: + """Supported if the base model implements the InvenTreeParameterMixin.""" + from InvenTree.models import InvenTreeParameterMixin + + return issubclass(model_class, InvenTreeParameterMixin) + + def update_headers(self, headers, context, **kwargs): + """Update headers for the export.""" + # Add in a header for each parameter + for pk, name in self.parameters.items(): + headers[f'parameter_{pk}'] = str(name) + + return headers + + def prefetch_queryset(self, queryset): + """Ensure that the associated parameters are prefetched.""" + from InvenTree.models import InvenTreeParameterMixin + + queryset = InvenTreeParameterMixin.annotate_parameters(queryset) + return queryset + + def export_data( + self, queryset, serializer_class, headers, context, output, **kwargs + ): + """Export parameter data.""" + # Extract custom serializer options and cache + queryset = self.prefetch_queryset(queryset) + self.serializer_class = serializer_class + + self.exclude_inactive = context.get('export_exclude_inactive_parameters', True) + + # Keep a dict of observed parameters against their primary key + self.parameters = {} + + # Serialize the queryset using DRF first + rows = self.serializer_class( + queryset, parameters=True, exporting=True, many=True + ).data + + for row in rows: + # Extract the associated parameters from the serialized data + for parameter in row.get('parameters', []): + template_detail = parameter['template_detail'] + template_id = template_detail['pk'] + + active = template_detail.get('enabled', True) + + if not active and self.exclude_inactive: + continue + + self.parameters[template_id] = template_detail['name'] + + row[f'parameter_{template_id}'] = parameter['data'] + + return rows diff --git a/src/backend/InvenTree/plugin/builtin/exporter/part_parameter_exporter.py b/src/backend/InvenTree/plugin/builtin/exporter/part_parameter_exporter.py deleted file mode 100644 index 8ecab0e447..0000000000 --- a/src/backend/InvenTree/plugin/builtin/exporter/part_parameter_exporter.py +++ /dev/null @@ -1,130 +0,0 @@ -"""Custom exporter for PartParameters.""" - -from django.utils.translation import gettext_lazy as _ - -from rest_framework import serializers - -from part.models import Part -from part.serializers import PartSerializer -from plugin import InvenTreePlugin -from plugin.mixins import DataExportMixin - - -class PartParameterExportOptionsSerializer(serializers.Serializer): - """Custom export options for the PartParameterExporter plugin.""" - - export_stock_data = serializers.BooleanField( - default=True, label=_('Stock Data'), help_text=_('Include part stock data') - ) - - export_pricing_data = serializers.BooleanField( - default=True, label=_('Pricing Data'), help_text=_('Include part pricing data') - ) - - -class PartParameterExporter(DataExportMixin, InvenTreePlugin): - """Builtin plugin for exporting PartParameter data. - - Extends the "part" export process, to include all associated PartParameter data. - """ - - NAME = 'Part Parameter Exporter' - SLUG = 'parameter-exporter' - TITLE = _('Part Parameter Exporter') - DESCRIPTION = _('Exporter for part parameter data') - VERSION = '1.0.0' - AUTHOR = _('InvenTree contributors') - - ExportOptionsSerializer = PartParameterExportOptionsSerializer - - def supports_export( - self, - model_class: type, - user=None, - serializer_class=None, - view_class=None, - *args, - **kwargs, - ) -> bool: - """Supported if the base model is Part.""" - return model_class == Part and serializer_class == PartSerializer - - def update_headers(self, headers, context, **kwargs): - """Update headers for the export.""" - if not self.export_stock_data: - # Remove stock data from the headers - for field in [ - 'allocated_to_build_orders', - 'allocated_to_sales_orders', - 'available_stock', - 'available_substitute_stock', - 'available_variant_stock', - 'building', - 'can_build', - 'external_stock', - 'in_stock', - 'on_order', - 'ordering', - 'required_for_build_orders', - 'required_for_sales_orders', - 'stock_item_count', - 'total_in_stock', - 'unallocated_stock', - 'variant_stock', - ]: - headers.pop(field, None) - - if not self.export_pricing_data: - # Remove pricing data from the headers - for field in [ - 'pricing_min', - 'pricing_max', - 'pricing_min_total', - 'pricing_max_total', - 'pricing_updated', - ]: - headers.pop(field, None) - - # Add in a header for each part parameter - for pk, name in self.parameters.items(): - headers[f'parameter_{pk}'] = str(name) - - return headers - - def prefetch_queryset(self, queryset): - """Ensure that the part parameters are prefetched.""" - queryset = queryset.prefetch_related('parameters', 'parameters__template') - - return queryset - - def export_data( - self, queryset, serializer_class, headers, context, output, **kwargs - ): - """Export part and parameter data.""" - # Extract custom serializer options and cache - self.export_stock_data = context.get('export_stock_data', True) - self.export_pricing_data = context.get('export_pricing_data', True) - - queryset = self.prefetch_queryset(queryset) - self.serializer_class = serializer_class - - # Keep a dict of observed part parameters against their primary key - self.parameters = {} - - # Serialize the queryset using DRF first - parts = self.serializer_class( - queryset, parameters=True, exporting=True, many=True - ).data - - for part in parts: - # Extract the part parameters from the serialized data - for parameter in part.get('parameters', []): - if template := parameter.get('template_detail', None): - template_id = template['pk'] - - if template_id not in self.parameters: - self.parameters[template_id] = template['name'] - - part[f'parameter_{template_id}'] = parameter['data'] - - return parts diff --git a/src/backend/InvenTree/plugin/samples/integration/validation_sample.py b/src/backend/InvenTree/plugin/samples/integration/validation_sample.py index 903cc59b34..7a8592f25d 100644 --- a/src/backend/InvenTree/plugin/samples/integration/validation_sample.py +++ b/src/backend/InvenTree/plugin/samples/integration/validation_sample.py @@ -111,8 +111,8 @@ class SampleValidatorPlugin(SettingsMixin, ValidationMixin, InvenTreePlugin): if self.get_setting('IPN_MUST_CONTAIN_Q') and 'Q' not in ipn: self.raise_error("IPN must contain 'Q'") - def validate_part_parameter(self, parameter, data): - """Validate part parameter data. + def validate_parameter(self, parameter, data): + """Validate parameter data. These examples are silly, but serve to demonstrate how the feature could be used """ diff --git a/src/backend/InvenTree/plugin/samples/supplier/test_supplier_sample.py b/src/backend/InvenTree/plugin/samples/supplier/test_supplier_sample.py index 22f86a05a5..a8772a0707 100644 --- a/src/backend/InvenTree/plugin/samples/supplier/test_supplier_sample.py +++ b/src/backend/InvenTree/plugin/samples/supplier/test_supplier_sample.py @@ -2,14 +2,10 @@ from django.urls import reverse +from common.models import ParameterTemplate from company.models import ManufacturerPart, SupplierPart from InvenTree.unit_test import InvenTreeAPITestCase -from part.models import ( - Part, - PartCategory, - PartCategoryParameterTemplate, - PartParameterTemplate, -) +from part.models import Part, PartCategory, PartCategoryParameterTemplate from plugin import registry @@ -134,14 +130,14 @@ class SampleSupplierTest(InvenTreeAPITestCase): # valid supplier, valid part import category = PartCategory.objects.get(pk=1) - p_len = PartParameterTemplate(name='Length', units='mm') - p_test = PartParameterTemplate(name='Test Parameter') + p_len = ParameterTemplate(name='Length', units='mm') + p_test = ParameterTemplate(name='Test Parameter') p_len.save() p_test.save() PartCategoryParameterTemplate.objects.bulk_create([ - PartCategoryParameterTemplate(category=category, parameter_template=p_len), + PartCategoryParameterTemplate(category=category, template=p_len), PartCategoryParameterTemplate( - category=category, parameter_template=p_test, default_value='Test Value' + category=category, template=p_test, default_value='Test Value' ), ]) res = self.post( diff --git a/src/backend/InvenTree/report/templatetags/report.py b/src/backend/InvenTree/report/templatetags/report.py index 1455028fdf..6329b5a9dc 100644 --- a/src/backend/InvenTree/report/templatetags/report.py +++ b/src/backend/InvenTree/report/templatetags/report.py @@ -11,6 +11,7 @@ from django import template from django.apps.registry import apps from django.conf import settings from django.core.exceptions import ValidationError +from django.db.models import Model from django.db.models.query import QuerySet from django.utils.safestring import SafeString, mark_safe from django.utils.translation import gettext_lazy as _ @@ -22,6 +23,7 @@ from PIL import Image import common.currency import common.icons +import common.models import InvenTree.helpers import InvenTree.helpers_model import report.helpers @@ -329,19 +331,38 @@ def part_image(part: Part, preview: bool = False, thumbnail: bool = False, **kwa @register.simple_tag() -def part_parameter(part: Part, parameter_name: str) -> Optional[str]: - """Return a PartParameter object for the given part and parameter name. +def parameter( + instance: Model, parameter_name: str +) -> Optional[common.models.Parameter]: + """Return a Parameter object for the given part and parameter name. Arguments: - part: A Part object + instance: A Model object parameter_name: The name of the parameter to retrieve Returns: - A PartParameter object, or None if not found + A Parameter object, or None if not found """ - if type(part) is Part: - return part.get_parameter(parameter_name) - return None + if instance is None: + raise ValueError('parameter tag requires a valid Model instance') + + if not isinstance(instance, Model) or not hasattr(instance, 'parameters'): + raise TypeError("parameter tag requires a Model with 'parameters' attribute") + + return ( + instance.parameters.prefetch_related('template') + .filter(template__name=parameter_name) + .first() + ) + + +@register.simple_tag() +def part_parameter(instance, parameter_name): + """Included for backwards compatibility - use 'parameter' tag instead. + + Ref: https://github.com/inventree/InvenTree/pull/10699 + """ + return parameter(instance, parameter_name) @register.simple_tag() diff --git a/src/backend/InvenTree/report/test_tags.py b/src/backend/InvenTree/report/test_tags.py index f2f3a8b8f7..337b46e6b2 100644 --- a/src/backend/InvenTree/report/test_tags.py +++ b/src/backend/InvenTree/report/test_tags.py @@ -4,6 +4,7 @@ from decimal import Decimal from zoneinfo import ZoneInfo from django.conf import settings +from django.contrib.contenttypes.models import ContentType from django.core.exceptions import ValidationError from django.test import TestCase, override_settings from django.utils import timezone @@ -12,10 +13,10 @@ from django.utils.safestring import SafeString from djmoney.money import Money from PIL import Image -from common.models import InvenTreeSetting +from common.models import InvenTreeSetting, Parameter, ParameterTemplate from InvenTree.config import get_testfolder_dir from InvenTree.unit_test import InvenTreeTestCase -from part.models import Part, PartParameter, PartParameterTemplate +from part.models import Part # TODO fix import: PartParameter, PartParameterTemplate from part.test_api import PartImageTestMixin from report.templatetags import barcode as barcode_tags from report.templatetags import report as report_tags @@ -408,13 +409,24 @@ class ReportTagTest(PartImageTestMixin, InvenTreeTestCase): """Test the part_parameter template tag.""" # Test with a valid part part = Part.objects.create(name='test', description='test') - t1 = PartParameterTemplate.objects.create(name='Template 1', units='mm') - parameter = PartParameter.objects.create(part=part, template=t1, data='test') + t1 = ParameterTemplate.objects.create(name='Template 1', units='mm') + content_type = ContentType.objects.get_for_model(Part) + parameter = Parameter.objects.create( + model_type=content_type, model_id=part.pk, template=t1, data='test' + ) + + # Note, use the 'parameter' and 'part_parameter' tags interchangeably here self.assertEqual(report_tags.part_parameter(part, 'name'), None) - self.assertEqual(report_tags.part_parameter(part, 'Template 1'), parameter) - # Test with an invalid part - self.assertEqual(report_tags.part_parameter(None, 'name'), None) + self.assertEqual(report_tags.parameter(part, 'Template 1'), parameter) + + # Test with a null part + with self.assertRaises(ValueError): + report_tags.parameter(None, 'name') + + # Test with an invalid model type + with self.assertRaises(TypeError): + report_tags.parameter(parameter, 'name') def test_render_currency(self): """Test the render_currency template tag.""" diff --git a/src/backend/InvenTree/stock/test_migrations.py b/src/backend/InvenTree/stock/test_migrations.py index 6407f5ea29..7901239951 100644 --- a/src/backend/InvenTree/stock/test_migrations.py +++ b/src/backend/InvenTree/stock/test_migrations.py @@ -2,14 +2,12 @@ from django_test_migrations.contrib.unittest_case import MigratorTestCase -from InvenTree import unit_test - class TestSerialNumberMigration(MigratorTestCase): """Test data migration which updates serial numbers.""" migrate_from = ('stock', '0067_alter_stockitem_part') - migrate_to = ('stock', unit_test.getNewestMigrationFile('stock')) + migrate_to = ('stock', '0070_auto_20211128_0151') def prepare(self): """Create initial data for this migration.""" @@ -72,7 +70,7 @@ class TestScheduledForDeletionMigration(MigratorTestCase): """Test data migration for removing 'scheduled_for_deletion' field.""" migrate_from = ('stock', '0066_stockitem_scheduled_for_deletion') - migrate_to = ('stock', unit_test.getNewestMigrationFile('stock')) + migrate_to = ('stock', '0073_alter_stockitem_belongs_to') def prepare(self): """Create some initial stock items.""" diff --git a/src/backend/InvenTree/users/ruleset.py b/src/backend/InvenTree/users/ruleset.py index 0fe705bfd5..7beb4f1eec 100644 --- a/src/backend/InvenTree/users/ruleset.py +++ b/src/backend/InvenTree/users/ruleset.py @@ -40,7 +40,7 @@ RULESET_NAMES = [choice[0] for choice in RULESET_CHOICES] # Permission types available for each ruleset. RULESET_PERMISSIONS = ['view', 'add', 'change', 'delete'] -RULESET_CHANGE_INHERIT = [('part', 'partparameter'), ('part', 'bomitem')] +RULESET_CHANGE_INHERIT = [('part', 'bomitem')] def get_ruleset_models() -> dict: @@ -106,15 +106,12 @@ def get_ruleset_models() -> dict: 'part_partsellpricebreak', 'part_partinternalpricebreak', 'part_parttesttemplate', - 'part_partparametertemplate', - 'part_partparameter', 'part_partrelated', 'part_partstar', 'part_partstocktake', 'part_partcategorystar', 'company_supplierpart', 'company_manufacturerpart', - 'company_manufacturerpartparameter', ], RuleSetEnum.STOCK_LOCATION: ['stock_stocklocation', 'stock_stocklocationtype'], RuleSetEnum.STOCK: [ @@ -138,7 +135,6 @@ def get_ruleset_models() -> dict: 'company_contact', 'company_address', 'company_manufacturerpart', - 'company_manufacturerpartparameter', 'company_supplierpart', 'company_supplierpricebreak', 'order_purchaseorder', @@ -179,6 +175,8 @@ def get_ruleset_ignore() -> list[str]: 'contenttypes_contenttype', # Models which currently do not require permissions 'common_attachment', + 'common_parametertemplate', + 'common_parameter', 'common_customunit', 'common_dataoutput', 'common_inventreesetting', diff --git a/src/frontend/lib/enums/ApiEndpoints.tsx b/src/frontend/lib/enums/ApiEndpoints.tsx index c3c3ecdd8b..c46d50af71 100644 --- a/src/frontend/lib/enums/ApiEndpoints.tsx +++ b/src/frontend/lib/enums/ApiEndpoints.tsx @@ -111,8 +111,6 @@ export enum ApiEndpoints { // Part API endpoints part_list = 'part/', - part_parameter_list = 'part/parameter/', - part_parameter_template_list = 'part/parameter/template/', part_thumbs_list = 'part/thumbs/', part_pricing = 'part/:id/pricing/', part_requirements = 'part/:id/requirements/', @@ -134,7 +132,6 @@ export enum ApiEndpoints { supplier_part_list = 'company/part/', supplier_part_pricing_list = 'company/price-break/', manufacturer_part_list = 'company/part/manufacturer/', - manufacturer_part_parameter_list = 'company/part/manufacturer/parameter/', // Stock location endpoints stock_location_list = 'stock/location/', @@ -243,5 +240,7 @@ export enum ApiEndpoints { notes_image_upload = 'notes-image-upload/', email_list = 'admin/email/', email_test = 'admin/email/test/', - config_list = 'admin/config/' + config_list = 'admin/config/', + parameter_list = 'parameter/', + parameter_template_list = 'parameter/template/' } diff --git a/src/frontend/lib/enums/ModelInformation.tsx b/src/frontend/lib/enums/ModelInformation.tsx index ba73e5ddf3..b529e2c49a 100644 --- a/src/frontend/lib/enums/ModelInformation.tsx +++ b/src/frontend/lib/enums/ModelInformation.tsx @@ -33,13 +33,18 @@ export const ModelInformationDict: ModelDict = { admin_url: '/part/part/', icon: 'part' }, - partparametertemplate: { - label: () => t`Part Parameter Template`, - label_multiple: () => t`Part Parameter Templates`, - url_overview: '/settings/admin/part-parameters', - url_detail: '/partparametertemplate/:pk/', - api_endpoint: ApiEndpoints.part_parameter_template_list, - icon: 'test_templates' + parameter: { + label: () => t`Parameter`, + label_multiple: () => t`Parameters`, + api_endpoint: ApiEndpoints.parameter_list, + icon: 'list_details' + }, + parametertemplate: { + label: () => t`Parameter Template`, + label_multiple: () => t`Parameter Templates`, + api_endpoint: ApiEndpoints.parameter_template_list, + admin_url: '/common/parametertemplate/', + icon: 'list' }, parttesttemplate: { label: () => t`Part Test Template`, diff --git a/src/frontend/lib/enums/ModelType.tsx b/src/frontend/lib/enums/ModelType.tsx index 84bf7ca60b..57aa1b7205 100644 --- a/src/frontend/lib/enums/ModelType.tsx +++ b/src/frontend/lib/enums/ModelType.tsx @@ -6,7 +6,6 @@ export enum ModelType { supplierpart = 'supplierpart', manufacturerpart = 'manufacturerpart', partcategory = 'partcategory', - partparametertemplate = 'partparametertemplate', parttesttemplate = 'parttesttemplate', projectcode = 'projectcode', stockitem = 'stockitem', @@ -17,6 +16,8 @@ export enum ModelType { buildline = 'buildline', builditem = 'builditem', company = 'company', + parameter = 'parameter', + parametertemplate = 'parametertemplate', purchaseorder = 'purchaseorder', purchaseorderlineitem = 'purchaseorderlineitem', salesorder = 'salesorder', diff --git a/src/frontend/src/components/buttons/SegmentedIconControl.tsx b/src/frontend/src/components/buttons/SegmentedIconControl.tsx index 9cdbfc9132..0271a2dcbe 100644 --- a/src/frontend/src/components/buttons/SegmentedIconControl.tsx +++ b/src/frontend/src/components/buttons/SegmentedIconControl.tsx @@ -33,7 +33,7 @@ export default function SegmentedIconControl({ data={data.map((item) => ({ value: item.value, label: ( - + , + content: + model_type && model_id ? ( + + ) : ( + + ) + }; +} diff --git a/src/frontend/src/components/panels/SegmentedControlPanel.tsx b/src/frontend/src/components/panels/SegmentedControlPanel.tsx new file mode 100644 index 0000000000..e403948070 --- /dev/null +++ b/src/frontend/src/components/panels/SegmentedControlPanel.tsx @@ -0,0 +1,53 @@ +import SegmentedIconControl from '../buttons/SegmentedIconControl'; +import type { PanelType } from './Panel'; + +export type SegmentedControlPanelSelection = { + value: string; + label: string; + icon: React.ReactNode; + content: React.ReactNode; +}; + +interface SegmentedPanelType extends PanelType { + options: SegmentedControlPanelSelection[]; + selection: string; + onChange: (value: string) => void; +} + +/** + * Display a panel which can be used to display multiple options, + * based on a built-in segmented control. + */ +export default function SegmentedControlPanel( + props: SegmentedPanelType +): PanelType { + // Extract the content based on the selection + let content = null; + + for (const option of props.options) { + if (option.value === props.selection) { + content = option.content; + break; + } + } + + if (content === null && props.options.length > 0) { + content = props.options[0].content; + } + + return { + ...props, + content: content, + controls: ( + ({ + value: option.value, + label: option.label, + icon: option.icon + }))} + /> + ) + }; +} diff --git a/src/frontend/src/components/render/Generic.tsx b/src/frontend/src/components/render/Generic.tsx index b828c8b00a..9c08837567 100644 --- a/src/frontend/src/components/render/Generic.tsx +++ b/src/frontend/src/components/render/Generic.tsx @@ -2,6 +2,30 @@ import type { ReactNode } from 'react'; import { type InstanceRenderInterface, RenderInlineModel } from './Instance'; +export function RenderParameterTemplate({ + instance +}: Readonly): ReactNode { + return ( + + ); +} + +export function RenderParameter({ + instance +}: Readonly): ReactNode { + return ( + + ); +} + export function RenderProjectCode({ instance }: Readonly): ReactNode { diff --git a/src/frontend/src/components/render/Instance.tsx b/src/frontend/src/components/render/Instance.tsx index 09a7c33e2d..a3174e1c58 100644 --- a/src/frontend/src/components/render/Instance.tsx +++ b/src/frontend/src/components/render/Instance.tsx @@ -36,6 +36,8 @@ import { RenderContentType, RenderError, RenderImportSession, + RenderParameter, + RenderParameterTemplate, RenderProjectCode, RenderSelectionList } from './Generic'; @@ -46,12 +48,7 @@ import { RenderSalesOrder, RenderSalesOrderShipment } from './Order'; -import { - RenderPart, - RenderPartCategory, - RenderPartParameterTemplate, - RenderPartTestTemplate -} from './Part'; +import { RenderPart, RenderPartCategory, RenderPartTestTemplate } from './Part'; import { RenderPlugin } from './Plugin'; import { RenderLabelTemplate, RenderReportTemplate } from './Report'; import { @@ -71,11 +68,12 @@ export const RendererLookup: ModelRendererDict = { [ModelType.builditem]: RenderBuildItem, [ModelType.company]: RenderCompany, [ModelType.contact]: RenderContact, + [ModelType.parameter]: RenderParameter, + [ModelType.parametertemplate]: RenderParameterTemplate, [ModelType.manufacturerpart]: RenderManufacturerPart, [ModelType.owner]: RenderOwner, [ModelType.part]: RenderPart, [ModelType.partcategory]: RenderPartCategory, - [ModelType.partparametertemplate]: RenderPartParameterTemplate, [ModelType.parttesttemplate]: RenderPartTestTemplate, [ModelType.projectcode]: RenderProjectCode, [ModelType.purchaseorder]: RenderPurchaseOrder, diff --git a/src/frontend/src/components/render/Part.tsx b/src/frontend/src/components/render/Part.tsx index fc11a73c86..14be70f6ce 100644 --- a/src/frontend/src/components/render/Part.tsx +++ b/src/frontend/src/components/render/Part.tsx @@ -141,23 +141,6 @@ export function RenderPartCategory( ); } -/** - * Inline rendering of a PartParameterTemplate instance - */ -export function RenderPartParameterTemplate({ - instance -}: Readonly<{ - instance: any; -}>): ReactNode { - return ( - - ); -} - export function RenderPartTestTemplate({ instance }: Readonly<{ diff --git a/src/frontend/src/components/wizards/ImportPartWizard.tsx b/src/frontend/src/components/wizards/ImportPartWizard.tsx index 6759148031..68c3fa6aae 100644 --- a/src/frontend/src/components/wizards/ImportPartWizard.tsx +++ b/src/frontend/src/components/wizards/ImportPartWizard.tsx @@ -419,8 +419,8 @@ const ParametersStep = ({ hideLabels fieldDefinition={{ field_type: 'related field', - model: ModelType.partparametertemplate, - api_url: apiUrl(ApiEndpoints.part_parameter_template_list), + model: ModelType.parametertemplate, + api_url: apiUrl(ApiEndpoints.parameter_template_list), disabled: p.on_category, value: p.parameter_template, onValueChange: (v) => { @@ -677,13 +677,14 @@ export default function ImportPartWizard({ {} as Record ); const createParameters = useParameters.map((p) => ({ - part: importResult!.part_id, + model_type: 'part', + model_id: importResult!.part_id, template: p.parameter_template, data: p.value })); try { await api.post( - apiUrl(ApiEndpoints.part_parameter_list), + apiUrl(ApiEndpoints.parameter_list), createParameters ); showNotification({ diff --git a/src/frontend/src/forms/CommonForms.tsx b/src/frontend/src/forms/CommonForms.tsx index e8992746f3..04d1da4ed9 100644 --- a/src/frontend/src/forms/CommonForms.tsx +++ b/src/frontend/src/forms/CommonForms.tsx @@ -1,12 +1,16 @@ import { IconUsers } from '@tabler/icons-react'; -import { useMemo, useState } from 'react'; +import { useEffect, useMemo, useState } from 'react'; +import { ApiEndpoints } from '@lib/enums/ApiEndpoints'; +import type { ModelType } from '@lib/enums/ModelType'; +import { apiUrl } from '@lib/functions/Api'; import type { ApiFormFieldSet } from '@lib/types/Forms'; import { t } from '@lingui/core/macro'; import type { StatusCodeInterface, StatusCodeListInterface } from '../components/render/StatusRenderer'; +import { useApi } from '../contexts/ApiContext'; import { useGlobalStatusState } from '../states/GlobalStatusState'; export function projectCodeFields(): ApiFormFieldSet { @@ -91,3 +95,117 @@ export function extraLineItemFields(): ApiFormFieldSet { link: {} }; } + +export function useParameterFields({ + modelType, + modelId +}: { + modelType: ModelType; + modelId: number; +}): ApiFormFieldSet { + const api = useApi(); + + // Valid field choices + const [choices, setChoices] = useState([]); + + // Field type for "data" input + const [fieldType, setFieldType] = useState<'string' | 'boolean' | 'choice'>( + 'string' + ); + + const [data, setData] = useState(''); + + // Reset the field type and choices when the model changes + useEffect(() => { + setFieldType('string'); + setChoices([]); + setData(''); + }, [modelType, modelId]); + + return useMemo(() => { + return { + model_type: { + hidden: true, + value: modelType + }, + model_id: { + hidden: true, + value: modelId + }, + template: { + filters: { + for_model: modelType, + enabled: true + }, + onValueChange: (value: any, record: any) => { + // Adjust the type of the "data" field based on the selected template + if (record?.checkbox) { + // This is a "checkbox" field + setChoices([]); + setFieldType('boolean'); + } else if (record?.choices) { + const _choices: string[] = record.choices.split(','); + + if (_choices.length > 0) { + setChoices( + _choices.map((choice) => { + return { + display_name: choice.trim(), + value: choice.trim() + }; + }) + ); + setFieldType('choice'); + } else { + setChoices([]); + setFieldType('string'); + } + } else if (record?.selectionlist) { + api + .get( + apiUrl(ApiEndpoints.selectionlist_detail, record.selectionlist) + ) + .then((res) => { + setChoices( + res.data.choices.map((item: any) => { + return { + value: item.value, + display_name: item.label + }; + }) + ); + setFieldType('choice'); + }); + } else { + setChoices([]); + setFieldType('string'); + } + } + }, + data: { + value: data, + onValueChange: (value: any) => { + setData(value); + }, + type: fieldType, + field_type: fieldType, + choices: fieldType === 'choice' ? choices : undefined, + default: fieldType === 'boolean' ? false : undefined, + adjustValue: (value: any) => { + // Coerce boolean value into a string (required by backend) + + let v: string = value.toString().trim(); + + if (fieldType === 'boolean') { + if (v.toLowerCase() !== 'true') { + v = 'false'; + } + } + + return v; + } + }, + note: {} + }; + }, [data, modelType, fieldType, choices, modelId]); +} diff --git a/src/frontend/src/forms/CompanyForms.tsx b/src/frontend/src/forms/CompanyForms.tsx index 3d442863e7..8336aa4fc8 100644 --- a/src/frontend/src/forms/CompanyForms.tsx +++ b/src/frontend/src/forms/CompanyForms.tsx @@ -97,21 +97,6 @@ export function useManufacturerPartFields() { }, []); } -export function useManufacturerPartParameterFields() { - return useMemo(() => { - const fields: ApiFormFieldSet = { - manufacturer_part: { - disabled: true - }, - name: {}, - value: {}, - units: {} - }; - - return fields; - }, []); -} - /** * Field set for editing a company instance */ diff --git a/src/frontend/src/forms/PartForms.tsx b/src/frontend/src/forms/PartForms.tsx index 4125d00788..61c14a0103 100644 --- a/src/frontend/src/forms/PartForms.tsx +++ b/src/frontend/src/forms/PartForms.tsx @@ -1,11 +1,7 @@ +import type { ApiFormFieldSet } from '@lib/types/Forms'; import { t } from '@lingui/core/macro'; import { IconBuildingStore, IconCopy, IconPackages } from '@tabler/icons-react'; import { useMemo, useState } from 'react'; - -import { ApiEndpoints } from '@lib/enums/ApiEndpoints'; -import { apiUrl } from '@lib/functions/Api'; -import type { ApiFormFieldSet } from '@lib/types/Forms'; -import { useApi } from '../contexts/ApiContext'; import { useGlobalSettingsState } from '../states/SettingsStates'; /** @@ -224,97 +220,6 @@ export function partCategoryFields({ return fields; } -export function usePartParameterFields({ - editTemplate -}: { - editTemplate?: boolean; -}): ApiFormFieldSet { - const api = useApi(); - - // Valid field choices - const [choices, setChoices] = useState([]); - - // Field type for "data" input - const [fieldType, setFieldType] = useState<'string' | 'boolean' | 'choice'>( - 'string' - ); - - return useMemo(() => { - return { - part: { - disabled: true - }, - template: { - disabled: editTemplate == false, - onValueChange: (value: any, record: any) => { - // Adjust the type of the "data" field based on the selected template - if (record?.checkbox) { - // This is a "checkbox" field - setChoices([]); - setFieldType('boolean'); - } else if (record?.choices) { - const _choices: string[] = record.choices.split(','); - - if (_choices.length > 0) { - setChoices( - _choices.map((choice) => { - return { - display_name: choice.trim(), - value: choice.trim() - }; - }) - ); - setFieldType('choice'); - } else { - setChoices([]); - setFieldType('string'); - } - } else if (record?.selectionlist) { - api - .get( - apiUrl(ApiEndpoints.selectionlist_detail, record.selectionlist) - ) - .then((res) => { - setChoices( - res.data.choices.map((item: any) => { - return { - value: item.value, - display_name: item.label - }; - }) - ); - setFieldType('choice'); - }); - } else { - setChoices([]); - setFieldType('string'); - } - } - }, - data: { - type: fieldType, - field_type: fieldType, - choices: fieldType === 'choice' ? choices : undefined, - default: fieldType === 'boolean' ? false : undefined, - adjustValue: (value: any) => { - // Coerce boolean value into a string (required by backend) - - let v: string = value.toString().trim(); - - if (fieldType === 'boolean') { - if (v.toLowerCase() !== 'true') { - v = 'false'; - } - } - - return v; - } - }, - note: {} - }; - }, [editTemplate, fieldType, choices]); -} - export function partStocktakeFields(): ApiFormFieldSet { return { part: { diff --git a/src/frontend/src/pages/Index/Settings/AdminCenter/Index.tsx b/src/frontend/src/pages/Index/Settings/AdminCenter/Index.tsx index 7ee01d0e5c..4c700b4ed1 100644 --- a/src/frontend/src/pages/Index/Settings/AdminCenter/Index.tsx +++ b/src/frontend/src/pages/Index/Settings/AdminCenter/Index.tsx @@ -71,7 +71,7 @@ const MachineManagementPanel = Loadable( lazy(() => import('./MachineManagementPanel')) ); -const PartParameterPanel = Loadable(lazy(() => import('./PartParameterPanel'))); +const ParameterPanel = Loadable(lazy(() => import('./ParameterPanel'))); const ErrorReportTable = Loadable( lazy(() => import('../../../../tables/settings/ErrorTable')) @@ -191,10 +191,10 @@ export default function AdminCenter() { content: }, { - name: 'part-parameters', - label: t`Part Parameters`, + name: 'parameters', + label: t`Parameters`, icon: , - content: , + content: , hidden: !user.hasViewRole(UserRoles.part) }, { @@ -274,7 +274,7 @@ export default function AdminCenter() { id: 'plm', label: t`PLM`, panelIDs: [ - 'part-parameters', + 'parameters', 'category-parameters', 'location-types', 'stocktake' diff --git a/src/frontend/src/pages/Index/Settings/AdminCenter/PartParameterPanel.tsx b/src/frontend/src/pages/Index/Settings/AdminCenter/ParameterPanel.tsx similarity index 62% rename from src/frontend/src/pages/Index/Settings/AdminCenter/PartParameterPanel.tsx rename to src/frontend/src/pages/Index/Settings/AdminCenter/ParameterPanel.tsx index 2240475702..b352df5ee5 100644 --- a/src/frontend/src/pages/Index/Settings/AdminCenter/PartParameterPanel.tsx +++ b/src/frontend/src/pages/Index/Settings/AdminCenter/ParameterPanel.tsx @@ -2,21 +2,21 @@ import { t } from '@lingui/core/macro'; import { Accordion } from '@mantine/core'; import { StylishText } from '../../../../components/items/StylishText'; -import PartParameterTemplateTable from '../../../../tables/part/PartParameterTemplateTable'; +import ParameterTemplateTable from '../../../../tables/general/ParameterTemplateTable'; import SelectionListTable from '../../../../tables/part/SelectionListTable'; export default function PartParameterPanel() { return ( - - + + - {t`Part Parameter Template`} + {t`Parameter Templates`} - + - + {t`Selection Lists`} diff --git a/src/frontend/src/pages/Index/Settings/SystemSettings.tsx b/src/frontend/src/pages/Index/Settings/SystemSettings.tsx index 918033494a..0e3ef515d7 100644 --- a/src/frontend/src/pages/Index/Settings/SystemSettings.tsx +++ b/src/frontend/src/pages/Index/Settings/SystemSettings.tsx @@ -7,6 +7,7 @@ import { IconCurrencyDollar, IconFileAnalytics, IconFingerprint, + IconList, IconPackages, IconPlugConnected, IconQrcode, @@ -185,6 +186,12 @@ export default function SystemSettings() { /> ) }, + { + name: 'parameters', + label: t`Parameters`, + icon: , + content: + }, { name: 'parts', label: t`Parts`, @@ -213,8 +220,7 @@ export default function SystemSettings() { 'PART_COPY_PARAMETERS', 'PART_COPY_TESTS', 'PART_CATEGORY_PARAMETERS', - 'PART_CATEGORY_DEFAULT_ICON', - 'PART_PARAMETER_ENFORCE_UNITS' + 'PART_CATEGORY_DEFAULT_ICON' ]} /> ) diff --git a/src/frontend/src/pages/build/BuildDetail.tsx b/src/frontend/src/pages/build/BuildDetail.tsx index d856376d95..d5016e2909 100644 --- a/src/frontend/src/pages/build/BuildDetail.tsx +++ b/src/frontend/src/pages/build/BuildDetail.tsx @@ -45,6 +45,7 @@ import AttachmentPanel from '../../components/panels/AttachmentPanel'; import NotesPanel from '../../components/panels/NotesPanel'; import type { PanelType } from '../../components/panels/Panel'; import { PanelGroup } from '../../components/panels/PanelGroup'; +import ParametersPanel from '../../components/panels/ParametersPanel'; import { StatusRenderer } from '../../components/render/StatusRenderer'; import { RenderStockLocation } from '../../components/render/Stock'; import { useBuildOrderFields } from '../../forms/BuildForms'; @@ -519,6 +520,10 @@ export default function BuildDetail() { ) }, + ParametersPanel({ + model_type: ModelType.build, + model_id: build.pk + }), AttachmentPanel({ model_type: ModelType.build, model_id: build.pk diff --git a/src/frontend/src/pages/build/BuildIndex.tsx b/src/frontend/src/pages/build/BuildIndex.tsx index bd95117a53..2b8f4e681c 100644 --- a/src/frontend/src/pages/build/BuildIndex.tsx +++ b/src/frontend/src/pages/build/BuildIndex.tsx @@ -1,21 +1,27 @@ import { t } from '@lingui/core/macro'; import { Stack } from '@mantine/core'; -import { IconCalendar, IconTable, IconTools } from '@tabler/icons-react'; +import { + IconCalendar, + IconListDetails, + IconTable, + IconTools +} from '@tabler/icons-react'; import { useMemo } from 'react'; import { ModelType } from '@lib/enums/ModelType'; import { UserRoles } from '@lib/enums/Roles'; import type { TableFilter } from '@lib/types/Filters'; import { useLocalStorage } from '@mantine/hooks'; -import SegmentedIconControl from '../../components/buttons/SegmentedIconControl'; import OrderCalendar from '../../components/calendar/OrderCalendar'; import PermissionDenied from '../../components/errors/PermissionDenied'; import { PageDetail } from '../../components/nav/PageDetail'; import type { PanelType } from '../../components/panels/Panel'; import { PanelGroup } from '../../components/panels/PanelGroup'; +import SegmentedControlPanel from '../../components/panels/SegmentedControlPanel'; import { useGlobalSettingsState } from '../../states/SettingsStates'; import { useUserState } from '../../states/UserState'; import { PartCategoryFilter } from '../../tables/Filter'; +import BuildOrderParametricTable from '../../tables/build/BuildOrderParametricTable'; import { BuildOrderTable } from '../../tables/build/BuildOrderTable'; function BuildOrderCalendar() { @@ -43,20 +49,6 @@ function BuildOrderCalendar() { ); } -function BuildOverview({ - view -}: { - view: string; -}) { - switch (view) { - case 'calendar': - return ; - case 'table': - default: - return ; - } -} - /** * Build Order index page */ @@ -64,34 +56,41 @@ export default function BuildIndex() { const user = useUserState(); const [buildOrderView, setBuildOrderView] = useLocalStorage({ - key: 'buildOrderView', + key: 'build-order-view', defaultValue: 'table' }); const panels: PanelType[] = useMemo(() => { return [ - { - name: 'buildorders', + SegmentedControlPanel({ + name: 'buildorder', label: t`Build Orders`, - content: , icon: , - controls: ( - }, - { - value: 'calendar', - label: t`Calendar View`, - icon: - } - ]} - /> - ) - } + selection: buildOrderView, + onChange: setBuildOrderView, + options: [ + { + value: 'table', + label: t`Table View`, + icon: , + content: + }, + { + value: 'calendar', + label: t`Calendar View`, + icon: , + content: + }, + { + value: 'parametric', + label: t`Parametric View`, + icon: , + content: + } + ] + }) ]; - }, [buildOrderView, setBuildOrderView]); + }, [user, buildOrderView]); if (!user.isLoggedIn() || !user.hasViewRole(UserRoles.build)) { return ; diff --git a/src/frontend/src/pages/company/CompanyDetail.tsx b/src/frontend/src/pages/company/CompanyDetail.tsx index 228cdc2940..1c1383841d 100644 --- a/src/frontend/src/pages/company/CompanyDetail.tsx +++ b/src/frontend/src/pages/company/CompanyDetail.tsx @@ -39,6 +39,7 @@ import AttachmentPanel from '../../components/panels/AttachmentPanel'; import NotesPanel from '../../components/panels/NotesPanel'; import type { PanelType } from '../../components/panels/Panel'; import { PanelGroup } from '../../components/panels/PanelGroup'; +import ParametersPanel from '../../components/panels/ParametersPanel'; import { companyFields } from '../../forms/CompanyForms'; import { useDeleteApiFormModal, @@ -265,6 +266,10 @@ export default function CompanyDetail(props: Readonly) { icon: , content: company?.pk && }, + ParametersPanel({ + model_type: ModelType.company, + model_id: company?.pk + }), AttachmentPanel({ model_type: ModelType.company, model_id: company.pk diff --git a/src/frontend/src/pages/company/ManufacturerPartDetail.tsx b/src/frontend/src/pages/company/ManufacturerPartDetail.tsx index 693906af1a..1ad145e45a 100644 --- a/src/frontend/src/pages/company/ManufacturerPartDetail.tsx +++ b/src/frontend/src/pages/company/ManufacturerPartDetail.tsx @@ -3,7 +3,6 @@ import { Grid, Skeleton, Stack } from '@mantine/core'; import { IconBuildingWarehouse, IconInfoCircle, - IconList, IconPackages } from '@tabler/icons-react'; import { useMemo } from 'react'; @@ -33,6 +32,7 @@ import AttachmentPanel from '../../components/panels/AttachmentPanel'; import NotesPanel from '../../components/panels/NotesPanel'; import type { PanelType } from '../../components/panels/Panel'; import { PanelGroup } from '../../components/panels/PanelGroup'; +import ParametersPanel from '../../components/panels/ParametersPanel'; import { useManufacturerPartFields } from '../../forms/CompanyForms'; import { useCreateApiFormModal, @@ -41,7 +41,6 @@ import { } from '../../hooks/UseForm'; import { useInstance } from '../../hooks/UseInstance'; import { useUserState } from '../../states/UserState'; -import ManufacturerPartParameterTable from '../../tables/purchasing/ManufacturerPartParameterTable'; import { SupplierPartTable } from '../../tables/purchasing/SupplierPartTable'; import { StockItemTable } from '../../tables/stock/StockItemTable'; @@ -161,18 +160,6 @@ export default function ManufacturerPartDetail() { icon: , content: detailsPanel }, - { - name: 'parameters', - label: t`Parameters`, - icon: , - content: manufacturerPart?.pk ? ( - - ) : ( - - ) - }, { name: 'stock', label: t`Received Stock`, @@ -201,6 +188,10 @@ export default function ManufacturerPartDetail() { ) }, + ParametersPanel({ + model_type: ModelType.manufacturerpart, + model_id: manufacturerPart?.pk + }), AttachmentPanel({ model_type: ModelType.manufacturerpart, model_id: manufacturerPart?.pk diff --git a/src/frontend/src/pages/company/SupplierPartDetail.tsx b/src/frontend/src/pages/company/SupplierPartDetail.tsx index 35cdf4f836..e640c3e8da 100644 --- a/src/frontend/src/pages/company/SupplierPartDetail.tsx +++ b/src/frontend/src/pages/company/SupplierPartDetail.tsx @@ -36,6 +36,7 @@ import AttachmentPanel from '../../components/panels/AttachmentPanel'; import NotesPanel from '../../components/panels/NotesPanel'; import type { PanelType } from '../../components/panels/Panel'; import { PanelGroup } from '../../components/panels/PanelGroup'; +import ParametersPanel from '../../components/panels/ParametersPanel'; import { useSupplierPartFields } from '../../forms/CompanyForms'; import { useCreateApiFormModal, @@ -284,6 +285,10 @@ export default function SupplierPartDetail() { ) }, + ParametersPanel({ + model_type: ModelType.supplierpart, + model_id: supplierPart?.pk + }), AttachmentPanel({ model_type: ModelType.supplierpart, model_id: supplierPart?.pk diff --git a/src/frontend/src/pages/part/CategoryDetail.tsx b/src/frontend/src/pages/part/CategoryDetail.tsx index 55b9ce440f..a39ce98f5e 100644 --- a/src/frontend/src/pages/part/CategoryDetail.tsx +++ b/src/frontend/src/pages/part/CategoryDetail.tsx @@ -6,7 +6,8 @@ import { IconListCheck, IconListDetails, IconPackages, - IconSitemap + IconSitemap, + IconTable } from '@tabler/icons-react'; import { useMemo, useState } from 'react'; import { useNavigate, useParams } from 'react-router-dom'; @@ -15,6 +16,7 @@ import { ApiEndpoints } from '@lib/enums/ApiEndpoints'; import { ModelType } from '@lib/enums/ModelType'; import { UserRoles } from '@lib/enums/Roles'; import { getDetailUrl } from '@lib/functions/Navigation'; +import { useLocalStorage } from '@mantine/hooks'; import AdminButton from '../../components/buttons/AdminButton'; import StarredToggleButton from '../../components/buttons/StarredToggleButton'; import { @@ -33,6 +35,7 @@ import NavigationTree from '../../components/nav/NavigationTree'; import { PageDetail } from '../../components/nav/PageDetail'; import type { PanelType } from '../../components/panels/Panel'; import { PanelGroup } from '../../components/panels/PanelGroup'; +import SegmentedControlPanel from '../../components/panels/SegmentedControlPanel'; import { partCategoryFields } from '../../forms/PartForms'; import { useDeleteApiFormModal, @@ -258,6 +261,11 @@ export default function CategoryDetail() { ]; }, [id, user, category.pk, category.starred]); + const [partsView, setPartsView] = useLocalStorage({ + key: 'category-parts-view', + defaultValue: 'table' + }); + const panels: PanelType[] = useMemo( () => [ { @@ -272,20 +280,35 @@ export default function CategoryDetail() { icon: , content: }, - { + SegmentedControlPanel({ name: 'parts', label: t`Parts`, icon: , - content: ( - - ) - }, + selection: partsView, + onChange: setPartsView, + options: [ + { + value: 'table', + label: t`Table View`, + icon: , + content: ( + + ) + }, + { + value: 'parametric', + label: t`Parametric View`, + icon: , + content: + } + ] + }), { name: 'stockitem', label: t`Stock Items`, @@ -307,15 +330,9 @@ export default function CategoryDetail() { icon: , hidden: !id || !category.pk, content: - }, - { - name: 'parameters', - label: t`Part Parameters`, - icon: , - content: } ], - [category, id] + [category, id, partsView] ); const breadcrumbs = useMemo( diff --git a/src/frontend/src/pages/part/PartDetail.tsx b/src/frontend/src/pages/part/PartDetail.tsx index 927d6ac978..23b9350fce 100644 --- a/src/frontend/src/pages/part/PartDetail.tsx +++ b/src/frontend/src/pages/part/PartDetail.tsx @@ -22,8 +22,8 @@ import { IconExclamationCircle, IconInfoCircle, IconLayersLinked, - IconList, IconListCheck, + IconListDetails, IconListTree, IconLock, IconPackages, @@ -97,7 +97,7 @@ import { useUserState } from '../../states/UserState'; import { BomTable } from '../../tables/bom/BomTable'; import { UsedInTable } from '../../tables/bom/UsedInTable'; import { BuildOrderTable } from '../../tables/build/BuildOrderTable'; -import { PartParameterTable } from '../../tables/part/PartParameterTable'; +import { ParameterTable } from '../../tables/general/ParameterTable'; import PartPurchaseOrdersTable from '../../tables/part/PartPurchaseOrdersTable'; import PartTestResultTable from '../../tables/part/PartTestResultTable'; import PartTestTemplateTable from '../../tables/part/PartTestTemplateTable'; @@ -788,17 +788,6 @@ export default function PartDetail() { icon: , content: detailsPanel }, - { - name: 'parameters', - label: t`Parameters`, - icon: , - content: ( - - ) - }, { name: 'stock', label: t`Stock`, @@ -949,6 +938,30 @@ export default function PartDetail() { icon: , content: }, + { + name: 'parameters', + label: t`Parameters`, + icon: , + content: ( + <> + {part.locked && ( + } + p='xs' + > + {t`Part parameters cannot be edited, as the part is locked`} + + )} + + + ) + }, AttachmentPanel({ model_type: ModelType.part, model_id: part?.pk diff --git a/src/frontend/src/pages/purchasing/PurchaseOrderDetail.tsx b/src/frontend/src/pages/purchasing/PurchaseOrderDetail.tsx index 87e1c4cbba..0d0a2fc754 100644 --- a/src/frontend/src/pages/purchasing/PurchaseOrderDetail.tsx +++ b/src/frontend/src/pages/purchasing/PurchaseOrderDetail.tsx @@ -32,6 +32,7 @@ import AttachmentPanel from '../../components/panels/AttachmentPanel'; import NotesPanel from '../../components/panels/NotesPanel'; import type { PanelType } from '../../components/panels/Panel'; import { PanelGroup } from '../../components/panels/PanelGroup'; +import ParametersPanel from '../../components/panels/ParametersPanel'; import { StatusRenderer } from '../../components/render/StatusRenderer'; import { formatCurrency } from '../../defaults/formatters'; import { usePurchaseOrderFields } from '../../forms/PurchaseOrderForms'; @@ -389,6 +390,10 @@ export default function PurchaseOrderDetail() { /> ) }, + ParametersPanel({ + model_type: ModelType.purchaseorder, + model_id: order.pk + }), AttachmentPanel({ model_type: ModelType.purchaseorder, model_id: order.pk diff --git a/src/frontend/src/pages/purchasing/PurchasingIndex.tsx b/src/frontend/src/pages/purchasing/PurchasingIndex.tsx index 0101f84f21..706c7e737d 100644 --- a/src/frontend/src/pages/purchasing/PurchasingIndex.tsx +++ b/src/frontend/src/pages/purchasing/PurchasingIndex.tsx @@ -5,6 +5,7 @@ import { IconBuildingStore, IconBuildingWarehouse, IconCalendar, + IconListDetails, IconPackageExport, IconShoppingCart, IconTable @@ -14,104 +15,193 @@ import { useMemo } from 'react'; import { ModelType } from '@lib/enums/ModelType'; import { UserRoles } from '@lib/enums/Roles'; import { useLocalStorage } from '@mantine/hooks'; -import SegmentedIconControl from '../../components/buttons/SegmentedIconControl'; import OrderCalendar from '../../components/calendar/OrderCalendar'; import PermissionDenied from '../../components/errors/PermissionDenied'; import { PageDetail } from '../../components/nav/PageDetail'; import { PanelGroup } from '../../components/panels/PanelGroup'; +import SegmentedControlPanel from '../../components/panels/SegmentedControlPanel'; import { useUserState } from '../../states/UserState'; import { CompanyTable } from '../../tables/company/CompanyTable'; +import ParametricCompanyTable from '../../tables/company/ParametricCompanyTable'; +import ManufacturerPartParametricTable from '../../tables/purchasing/ManufacturerPartParametricTable'; import { ManufacturerPartTable } from '../../tables/purchasing/ManufacturerPartTable'; +import PurchaseOrderParametricTable from '../../tables/purchasing/PurchaseOrderParametricTable'; import { PurchaseOrderTable } from '../../tables/purchasing/PurchaseOrderTable'; +import SupplierPartParametricTable from '../../tables/purchasing/SupplierPartParametricTable'; import { SupplierPartTable } from '../../tables/purchasing/SupplierPartTable'; -function PurchaseOrderOverview({ - view -}: { - view: string; -}) { - switch (view) { - case 'calendar': - return ( - - ); - case 'table': - default: - return ; - } -} - export default function PurchasingIndex() { const user = useUserState(); - const [purchaseOrderView, setpurchaseOrderView] = useLocalStorage({ - key: 'purchaseOrderView', + const [purchaseOrderView, setPurchaseOrderView] = useLocalStorage({ + key: 'purchase-order-view', + defaultValue: 'table' + }); + + const [supplierView, setSupplierView] = useLocalStorage({ + key: 'supplier-view', + defaultValue: 'table' + }); + + const [manufacturerView, setManufacturerView] = useLocalStorage({ + key: 'manufacturer-view', + defaultValue: 'table' + }); + + const [manufacturerPartsView, setManufacturerPartsView] = + useLocalStorage({ + key: 'manufacturer-parts-view', + defaultValue: 'table' + }); + + const [supplierPartsView, setSupplierPartsView] = useLocalStorage({ + key: 'supplier-parts-view', defaultValue: 'table' }); const panels = useMemo(() => { return [ - { + SegmentedControlPanel({ name: 'purchaseorders', label: t`Purchase Orders`, icon: , hidden: !user.hasViewRole(UserRoles.purchase_order), - content: , - controls: ( - }, - { - value: 'calendar', - label: t`Calendar View`, - icon: - } - ]} - /> - ) - }, - { + selection: purchaseOrderView, + onChange: setPurchaseOrderView, + options: [ + { + value: 'table', + label: t`Table View`, + icon: , + content: + }, + { + value: 'calendar', + label: t`Calendar View`, + icon: , + content: ( + + ) + }, + { + value: 'parametric', + label: t`Parametric View`, + icon: , + content: + } + ] + }), + SegmentedControlPanel({ name: 'suppliers', label: t`Suppliers`, icon: , - content: ( - - ) - }, - { + selection: supplierView, + onChange: setSupplierView, + options: [ + { + value: 'table', + label: t`Table View`, + icon: , + content: ( + + ) + }, + { + value: 'parametric', + label: t`Parametric View`, + icon: , + content: ( + + ) + } + ] + }), + SegmentedControlPanel({ name: 'supplier-parts', label: t`Supplier Parts`, icon: , - content: - }, - { + selection: supplierPartsView, + onChange: setSupplierPartsView, + options: [ + { + value: 'table', + label: t`Table View`, + icon: , + content: + }, + { + value: 'parametric', + label: t`Parametric View`, + icon: , + content: + } + ] + }), + SegmentedControlPanel({ name: 'manufacturer', label: t`Manufacturers`, icon: , - content: ( - - ) - }, - { + selection: manufacturerView, + onChange: setManufacturerView, + options: [ + { + value: 'table', + label: t`Table View`, + icon: , + content: ( + + ) + }, + { + value: 'parametric', + label: t`Parametric View`, + icon: , + content: ( + + ) + } + ] + }), + SegmentedControlPanel({ name: 'manufacturer-parts', label: t`Manufacturer Parts`, icon: , - content: - } + selection: manufacturerPartsView, + onChange: setManufacturerPartsView, + options: [ + { + value: 'table', + label: t`Table View`, + icon: , + content: + }, + { + value: 'parametric', + label: t`Parametric View`, + icon: , + content: + } + ] + }) ]; - }, [user, purchaseOrderView]); + }, [ + user, + manufacturerPartsView, + manufacturerView, + purchaseOrderView, + supplierPartsView, + supplierView + ]); if (!user.isLoggedIn() || !user.hasViewRole(UserRoles.purchase_order)) { return ; diff --git a/src/frontend/src/pages/sales/ReturnOrderDetail.tsx b/src/frontend/src/pages/sales/ReturnOrderDetail.tsx index 2c644c4be1..5bce7c6306 100644 --- a/src/frontend/src/pages/sales/ReturnOrderDetail.tsx +++ b/src/frontend/src/pages/sales/ReturnOrderDetail.tsx @@ -32,6 +32,7 @@ import AttachmentPanel from '../../components/panels/AttachmentPanel'; import NotesPanel from '../../components/panels/NotesPanel'; import type { PanelType } from '../../components/panels/Panel'; import { PanelGroup } from '../../components/panels/PanelGroup'; +import ParametersPanel from '../../components/panels/ParametersPanel'; import { RenderAddress } from '../../components/render/Company'; import { StatusRenderer } from '../../components/render/StatusRenderer'; import { formatCurrency } from '../../defaults/formatters'; @@ -354,6 +355,10 @@ export default function ReturnOrderDetail() { ) }, + ParametersPanel({ + model_type: ModelType.returnorder, + model_id: order.pk + }), AttachmentPanel({ model_type: ModelType.returnorder, model_id: order.pk diff --git a/src/frontend/src/pages/sales/SalesIndex.tsx b/src/frontend/src/pages/sales/SalesIndex.tsx index ffa1e1d5d3..0fe4b8a31c 100644 --- a/src/frontend/src/pages/sales/SalesIndex.tsx +++ b/src/frontend/src/pages/sales/SalesIndex.tsx @@ -4,6 +4,7 @@ import { IconBuildingStore, IconCalendar, IconCubeSend, + IconListDetails, IconTable, IconTruckDelivery, IconTruckReturn @@ -13,93 +14,74 @@ import { useMemo } from 'react'; import { ModelType } from '@lib/enums/ModelType'; import { UserRoles } from '@lib/enums/Roles'; import { useLocalStorage } from '@mantine/hooks'; -import SegmentedIconControl from '../../components/buttons/SegmentedIconControl'; import OrderCalendar from '../../components/calendar/OrderCalendar'; import PermissionDenied from '../../components/errors/PermissionDenied'; import { PageDetail } from '../../components/nav/PageDetail'; import { PanelGroup } from '../../components/panels/PanelGroup'; +import SegmentedControlPanel from '../../components/panels/SegmentedControlPanel'; import { useUserState } from '../../states/UserState'; import { CompanyTable } from '../../tables/company/CompanyTable'; +import ParametricCompanyTable from '../../tables/company/ParametricCompanyTable'; +import ReturnOrderParametricTable from '../../tables/sales/ReturnOrderParametricTable'; import { ReturnOrderTable } from '../../tables/sales/ReturnOrderTable'; +import SalesOrderParametricTable from '../../tables/sales/SalesOrderParametricTable'; import SalesOrderShipmentTable from '../../tables/sales/SalesOrderShipmentTable'; import { SalesOrderTable } from '../../tables/sales/SalesOrderTable'; -function SalesOrderOverview({ - view -}: { - view: string; -}) { - switch (view) { - case 'calendar': - return ( - - ); - case 'table': - default: - return ; - } -} - -function ReturnOrderOverview({ - view -}: { - view: string; -}) { - switch (view) { - case 'calendar': - return ( - - ); - case 'table': - default: - return ; - } -} - export default function SalesIndex() { const user = useUserState(); + const [customersView, setCustomersView] = useLocalStorage({ + key: 'customer-view', + defaultValue: 'table' + }); + const [salesOrderView, setSalesOrderView] = useLocalStorage({ - key: 'salesOrderView', + key: 'sales-order-view', defaultValue: 'table' }); const [returnOrderView, setReturnOrderView] = useLocalStorage({ - key: 'returnOrderView', + key: 'return-order-view', defaultValue: 'table' }); const panels = useMemo(() => { return [ - { + SegmentedControlPanel({ name: 'salesorders', label: t`Sales Orders`, icon: , - content: , - controls: ( - }, - { - value: 'calendar', - label: t`Calendar View`, - icon: - } - ]} - /> - ), - hidden: !user.hasViewRole(UserRoles.sales_order) - }, + hidden: !user.hasViewRole(UserRoles.sales_order), + selection: salesOrderView, + onChange: setSalesOrderView, + options: [ + { + value: 'table', + label: t`Table View`, + icon: , + content: + }, + { + value: 'calendar', + label: t`Calendar View`, + icon: , + content: ( + + ) + }, + { + value: 'parametric', + label: t`Parametric View`, + icon: , + content: + } + ] + }), { name: 'shipments', label: t`Pending Shipments`, @@ -112,37 +94,70 @@ export default function SalesIndex() { /> ) }, - { + SegmentedControlPanel({ name: 'returnorders', label: t`Return Orders`, icon: , - content: , - controls: ( - }, - { - value: 'calendar', - label: t`Calendar View`, - icon: - } - ]} - /> - ), - hidden: !user.hasViewRole(UserRoles.return_order) - }, - { + hidden: !user.hasViewRole(UserRoles.return_order), + selection: returnOrderView, + onChange: setReturnOrderView, + options: [ + { + value: 'table', + label: t`Table View`, + icon: , + content: + }, + { + value: 'calendar', + label: t`Calendar View`, + icon: , + content: ( + + ) + }, + { + value: 'parametric', + label: t`Parametric View`, + icon: , + content: + } + ] + }), + SegmentedControlPanel({ name: 'customers', label: t`Customers`, icon: , - content: ( - - ) - } + selection: customersView, + onChange: setCustomersView, + options: [ + { + value: 'table', + label: t`Table View`, + icon: , + content: ( + + ) + }, + { + value: 'parametric', + label: t`Parametric View`, + icon: , + content: ( + + ) + } + ] + }) ]; - }, [user, salesOrderView, returnOrderView]); + }, [user, customersView, salesOrderView, returnOrderView]); if (!user.isLoggedIn() || !user.hasViewRole(UserRoles.sales_order)) { return ; diff --git a/src/frontend/src/pages/sales/SalesOrderDetail.tsx b/src/frontend/src/pages/sales/SalesOrderDetail.tsx index bd3178fb3d..15bc26cdda 100644 --- a/src/frontend/src/pages/sales/SalesOrderDetail.tsx +++ b/src/frontend/src/pages/sales/SalesOrderDetail.tsx @@ -38,6 +38,7 @@ import AttachmentPanel from '../../components/panels/AttachmentPanel'; import NotesPanel from '../../components/panels/NotesPanel'; import type { PanelType } from '../../components/panels/Panel'; import { PanelGroup } from '../../components/panels/PanelGroup'; +import ParametersPanel from '../../components/panels/ParametersPanel'; import { RenderAddress } from '../../components/render/Company'; import { StatusRenderer } from '../../components/render/StatusRenderer'; import { formatCurrency } from '../../defaults/formatters'; @@ -427,6 +428,10 @@ export default function SalesOrderDetail() { ) }, + ParametersPanel({ + model_type: ModelType.salesorder, + model_id: order.pk + }), AttachmentPanel({ model_type: ModelType.salesorder, model_id: order.pk diff --git a/src/frontend/src/tables/build/BuildOrderParametricTable.tsx b/src/frontend/src/tables/build/BuildOrderParametricTable.tsx new file mode 100644 index 0000000000..d9f85cb295 --- /dev/null +++ b/src/frontend/src/tables/build/BuildOrderParametricTable.tsx @@ -0,0 +1,40 @@ +import { ApiEndpoints, ModelType } from '@lib/index'; +import type { TableFilter } from '@lib/types/Filters'; +import type { TableColumn } from '@lib/types/Tables'; +import { type ReactNode, useMemo } from 'react'; +import { DescriptionColumn, ReferenceColumn } from '../ColumnRenderers'; +import { OrderStatusFilter, OutstandingFilter } from '../Filter'; +import ParametricDataTable from '../general/ParametricDataTable'; + +export default function BuildOrderParametricTable({ + queryParams +}: { + queryParams?: Record; +}): ReactNode { + const customColumns: TableColumn[] = useMemo(() => { + return [ + ReferenceColumn({ + switchable: false + }), + DescriptionColumn({ + accessor: 'title' + }) + ]; + }, []); + + const customFilters: TableFilter[] = useMemo(() => { + return [OutstandingFilter(), OrderStatusFilter({ model: ModelType.build })]; + }, []); + + return ( + + ); +} diff --git a/src/frontend/src/tables/company/ParametricCompanyTable.tsx b/src/frontend/src/tables/company/ParametricCompanyTable.tsx new file mode 100644 index 0000000000..a309b44790 --- /dev/null +++ b/src/frontend/src/tables/company/ParametricCompanyTable.tsx @@ -0,0 +1,39 @@ +import { ApiEndpoints } from '@lib/enums/ApiEndpoints'; +import { ModelType } from '@lib/enums/ModelType'; +import type { TableColumn } from '@lib/types/Tables'; +import { t } from '@lingui/core/macro'; +import { useMemo } from 'react'; +import { CompanyColumn, DescriptionColumn } from '../ColumnRenderers'; +import ParametricDataTable from '../general/ParametricDataTable'; + +export default function ParametricCompanyTable({ + queryParams +}: { + queryParams?: any; +}) { + const customColumns: TableColumn[] = useMemo(() => { + return [ + { + accessor: 'name', + title: t`Company`, + sortable: true, + switchable: false, + render: (record: any) => { + return ; + } + }, + DescriptionColumn({}) + ]; + }, []); + + return ( + + ); +} diff --git a/src/frontend/src/tables/general/ParameterTable.tsx b/src/frontend/src/tables/general/ParameterTable.tsx new file mode 100644 index 0000000000..d7654e878a --- /dev/null +++ b/src/frontend/src/tables/general/ParameterTable.tsx @@ -0,0 +1,276 @@ +import { + ApiEndpoints, + ModelType, + RowDeleteAction, + RowEditAction, + YesNoButton, + apiUrl, + formatDecimal +} from '@lib/index'; +import type { TableFilter } from '@lib/types/Filters'; +import type { TableColumn } from '@lib/types/Tables'; +import { t } from '@lingui/core/macro'; +import { IconFileUpload, IconPlus } from '@tabler/icons-react'; +import { useCallback, useMemo, useState } from 'react'; +import ImporterDrawer from '../../components/importer/ImporterDrawer'; +import { ActionDropdown } from '../../components/items/ActionDropdown'; +import { useParameterFields } from '../../forms/CommonForms'; +import { dataImporterSessionFields } from '../../forms/ImporterForms'; +import { + useCreateApiFormModal, + useDeleteApiFormModal, + useEditApiFormModal +} from '../../hooks/UseForm'; +import { useTable } from '../../hooks/UseTable'; +import { useUserState } from '../../states/UserState'; +import { + DateColumn, + DescriptionColumn, + NoteColumn, + UserColumn +} from '../ColumnRenderers'; +import { UserFilter } from '../Filter'; +import { InvenTreeTable } from '../InvenTreeTable'; +import { TableHoverCard } from '../TableHoverCard'; + +/** + * Construct a table listing parameters + */ +export function ParameterTable({ + modelType, + modelId, + allowEdit = true +}: { + modelType: ModelType; + modelId: number; + allowEdit?: boolean; +}) { + const table = useTable('parameters'); + const user = useUserState(); + + const tableColumns: TableColumn[] = useMemo(() => { + return [ + { + accessor: 'template_detail.name', + switchable: false, + sortable: true, + ordering: 'name' + }, + DescriptionColumn({ + accessor: 'template_detail.description' + }), + { + accessor: 'data', + switchable: false, + sortable: true, + render: (record) => { + const template = record.template_detail; + + if (template?.checkbox) { + return ; + } + + const extra: any[] = []; + + if ( + template.units && + record.data_numeric && + record.data_numeric != record.data + ) { + const numeric = formatDecimal(record.data_numeric, { digits: 15 }); + extra.push(`${numeric} [${template.units}]`); + } + + return ( + + ); + } + }, + { + accessor: 'template_detail.units', + ordering: 'units', + sortable: true + }, + NoteColumn({}), + DateColumn({ + accessor: 'updated', + title: t`Last Updated`, + sortable: true, + switchable: true + }), + UserColumn({ + accessor: 'updated_by_detail', + ordering: 'updated_by', + title: t`Updated By` + }) + ]; + }, [user]); + + const tableFilters: TableFilter[] = useMemo(() => { + return [ + { + name: 'enabled', + label: 'Enabled', + description: t`Show parameters for enabled templates`, + type: 'boolean' + }, + UserFilter({ + name: 'updated_by', + label: t`Updated By`, + description: t`Filter by user who last updated the parameter` + }) + ]; + }, []); + + const [selectedParameter, setSelectedParameter] = useState( + undefined + ); + + const [importOpened, setImportOpened] = useState(false); + + const [selectedSession, setSelectedSession] = useState( + undefined + ); + + const importSessionFields = useMemo(() => { + const fields = dataImporterSessionFields({ + modelType: ModelType.parameter + }); + + fields.field_overrides.value = { + model_type: modelType, + model_id: modelId + }; + + return fields; + }, [modelType, modelId]); + + const importParameters = useCreateApiFormModal({ + url: ApiEndpoints.import_session_list, + title: t`Import Parameters`, + fields: importSessionFields, + onFormSuccess: (response: any) => { + setSelectedSession(response.pk); + setImportOpened(true); + } + }); + + const newParameter = useCreateApiFormModal({ + url: ApiEndpoints.parameter_list, + title: t`Add Parameter`, + fields: useParameterFields({ modelType, modelId }), + initialData: { + data: '' + }, + table: table + }); + + const editParameter = useEditApiFormModal({ + url: ApiEndpoints.parameter_list, + pk: selectedParameter?.pk, + title: t`Edit Parameter`, + fields: useParameterFields({ modelType, modelId }), + table: table + }); + + const deleteParameter = useDeleteApiFormModal({ + url: ApiEndpoints.parameter_list, + pk: selectedParameter?.pk, + title: t`Delete Parameter`, + table: table + }); + + const tableActions = useMemo(() => { + return [ + } + hidden={!user.hasAddPermission(modelType)} + actions={[ + { + name: t`Create Parameter`, + icon: , + tooltip: t`Create a new parameter`, + onClick: () => { + setSelectedParameter(undefined); + newParameter.open(); + } + }, + { + name: t`Import from File`, + icon: , + tooltip: t`Import parameters from a file`, + onClick: () => { + importParameters.open(); + } + } + ]} + /> + ]; + }, [allowEdit, user]); + + const rowActions = useCallback( + (record: any) => { + return [ + RowEditAction({ + tooltip: t`Edit Parameter`, + onClick: () => { + setSelectedParameter(record); + editParameter.open(); + }, + hidden: !user.hasChangePermission(modelType) + }), + RowDeleteAction({ + tooltip: t`Delete Parameter`, + onClick: () => { + setSelectedParameter(record); + deleteParameter.open(); + }, + hidden: !user.hasDeletePermission(modelType) + }) + ]; + }, + [user] + ); + + return ( + <> + {newParameter.modal} + {editParameter.modal} + {deleteParameter.modal} + {importParameters.modal} + + { + setSelectedSession(undefined); + setImportOpened(false); + table.refreshTable(); + }} + /> + + ); +} diff --git a/src/frontend/src/tables/part/PartParameterTemplateTable.tsx b/src/frontend/src/tables/general/ParameterTemplateTable.tsx similarity index 66% rename from src/frontend/src/tables/part/PartParameterTemplateTable.tsx rename to src/frontend/src/tables/general/ParameterTemplateTable.tsx index c9961422be..fbf8103664 100644 --- a/src/frontend/src/tables/part/PartParameterTemplateTable.tsx +++ b/src/frontend/src/tables/general/ParameterTemplateTable.tsx @@ -1,19 +1,18 @@ -import { t } from '@lingui/core/macro'; -import { useCallback, useMemo, useState } from 'react'; - -import { AddItemButton } from '@lib/components/AddItemButton'; import { - type RowAction, + AddItemButton, + ApiEndpoints, + type ApiFormFieldSet, RowDeleteAction, RowDuplicateAction, - RowEditAction -} from '@lib/components/RowActions'; -import { ApiEndpoints } from '@lib/enums/ApiEndpoints'; -import { UserRoles } from '@lib/enums/Roles'; -import { apiUrl } from '@lib/functions/Api'; + RowEditAction, + UserRoles, + apiUrl +} from '@lib/index'; import type { TableFilter } from '@lib/types/Filters'; -import type { ApiFormFieldSet } from '@lib/types/Forms'; -import type { TableColumn } from '@lib/types/Tables'; +import type { RowAction, TableColumn } from '@lib/types/Tables'; +import { t } from '@lingui/core/macro'; +import { useCallback, useMemo, useState } from 'react'; +import { useFilters } from '../../hooks/UseFilter'; import { useCreateApiFormModal, useDeleteApiFormModal, @@ -24,11 +23,114 @@ import { useUserState } from '../../states/UserState'; import { BooleanColumn, DescriptionColumn } from '../ColumnRenderers'; import { InvenTreeTable } from '../InvenTreeTable'; -export default function PartParameterTemplateTable() { - const table = useTable('part-parameter-templates'); - +/** + * Render a table of ParameterTemplate objects + */ +export default function ParameterTemplateTable() { + const table = useTable('parameter-templates'); const user = useUserState(); + const parameterTemplateFields: ApiFormFieldSet = useMemo(() => { + return { + name: {}, + description: {}, + units: {}, + model_type: {}, + choices: {}, + checkbox: {}, + selectionlist: {}, + enabled: {} + }; + }, []); + + const newTemplate = useCreateApiFormModal({ + url: ApiEndpoints.parameter_template_list, + title: t`Add Parameter Template`, + table: table, + fields: useMemo( + () => ({ + ...parameterTemplateFields + }), + [parameterTemplateFields] + ) + }); + + const [selectedTemplate, setSelectedTemplate] = useState( + undefined + ); + + const duplicateTemplate = useCreateApiFormModal({ + url: ApiEndpoints.parameter_template_list, + title: t`Duplicate Parameter Template`, + table: table, + fields: useMemo( + () => ({ + ...parameterTemplateFields + }), + [parameterTemplateFields] + ), + initialData: selectedTemplate + }); + + const deleteTemplate = useDeleteApiFormModal({ + url: ApiEndpoints.parameter_template_list, + pk: selectedTemplate?.pk, + title: t`Delete Parameter Template`, + table: table + }); + + const editTemplate = useEditApiFormModal({ + url: ApiEndpoints.parameter_template_list, + pk: selectedTemplate?.pk, + title: t`Edit Parameter Template`, + table: table, + fields: useMemo( + () => ({ + ...parameterTemplateFields + }), + [parameterTemplateFields] + ) + }); + + // Callback for row actions + const rowActions = useCallback( + (record: any): RowAction[] => { + return [ + RowEditAction({ + onClick: () => { + setSelectedTemplate(record); + editTemplate.open(); + } + }), + RowDuplicateAction({ + onClick: () => { + setSelectedTemplate(record); + duplicateTemplate.open(); + } + }), + RowDeleteAction({ + onClick: () => { + setSelectedTemplate(record); + deleteTemplate.open(); + } + }) + ]; + }, + [user] + ); + + const modelTypeFilters = useFilters({ + url: apiUrl(ApiEndpoints.parameter_template_list), + method: 'OPTIONS', + accessor: 'data.actions.POST.model_type.choices', + transform: (item: any) => { + return { + value: item.value, + label: item.display_name + }; + } + }); + const tableFilters: TableFilter[] = useMemo(() => { return [ { @@ -45,9 +147,20 @@ export default function PartParameterTemplateTable() { name: 'has_units', label: t`Has Units`, description: t`Show templates with units` + }, + { + name: 'enabled', + label: t`Enabled`, + description: t`Show enabled templates` + }, + { + name: 'model_type', + label: t`Model Type`, + description: t`Filter by model type`, + choices: modelTypeFilters.choices } ]; - }, []); + }, [modelTypeFilters.choices]); const tableColumns: TableColumn[] = useMemo(() => { return [ @@ -56,109 +169,27 @@ export default function PartParameterTemplateTable() { sortable: true, switchable: false }, - { - accessor: 'parts', - sortable: true, - switchable: true - }, + DescriptionColumn({}), { accessor: 'units', sortable: true }, - DescriptionColumn({}), + { + accessor: 'model_type' + }, BooleanColumn({ accessor: 'checkbox' }), { accessor: 'choices' - } + }, + BooleanColumn({ + accessor: 'enabled', + title: t`Enabled` + }) ]; }, []); - const partParameterTemplateFields: ApiFormFieldSet = useMemo(() => { - return { - name: {}, - description: {}, - units: {}, - choices: {}, - checkbox: {}, - selectionlist: {} - }; - }, []); - - const newTemplate = useCreateApiFormModal({ - url: ApiEndpoints.part_parameter_template_list, - title: t`Add Parameter Template`, - table: table, - fields: useMemo( - () => ({ ...partParameterTemplateFields }), - [partParameterTemplateFields] - ) - }); - - const [selectedTemplate, setSelectedTemplate] = useState( - undefined - ); - - const duplicateTemplate = useCreateApiFormModal({ - url: ApiEndpoints.part_parameter_template_list, - title: t`Duplicate Parameter Template`, - table: table, - fields: useMemo( - () => ({ ...partParameterTemplateFields }), - [partParameterTemplateFields] - ), - initialData: selectedTemplate - }); - - const editTemplate = useEditApiFormModal({ - url: ApiEndpoints.part_parameter_template_list, - pk: selectedTemplate?.pk, - title: t`Edit Parameter Template`, - table: table, - fields: useMemo( - () => ({ ...partParameterTemplateFields }), - [partParameterTemplateFields] - ) - }); - - const deleteTemplate = useDeleteApiFormModal({ - url: ApiEndpoints.part_parameter_template_list, - pk: selectedTemplate?.pk, - title: t`Delete Parameter Template`, - table: table - }); - - // Callback for row actions - const rowActions = useCallback( - (record: any): RowAction[] => { - return [ - RowEditAction({ - hidden: !user.hasChangeRole(UserRoles.part), - onClick: () => { - setSelectedTemplate(record); - editTemplate.open(); - } - }), - RowDuplicateAction({ - hidden: !user.hasAddRole(UserRoles.part), - onClick: () => { - setSelectedTemplate(record); - duplicateTemplate.open(); - } - }), - RowDeleteAction({ - hidden: !user.hasDeleteRole(UserRoles.part), - onClick: () => { - setSelectedTemplate(record); - deleteTemplate.open(); - } - }) - ]; - }, - [user] - ); - const tableActions = useMemo(() => { return [ diff --git a/src/frontend/src/tables/general/ParametricDataTable.tsx b/src/frontend/src/tables/general/ParametricDataTable.tsx new file mode 100644 index 0000000000..279f68e90b --- /dev/null +++ b/src/frontend/src/tables/general/ParametricDataTable.tsx @@ -0,0 +1,442 @@ +import { cancelEvent } from '@lib/functions/Events'; +import { + ApiEndpoints, + type ApiFormFieldSet, + type ModelType, + UserRoles, + YesNoButton, + apiUrl, + formatDecimal, + getDetailUrl, + navigateToLink +} from '@lib/index'; +import type { TableFilter } from '@lib/types/Filters'; +import type { TableColumn } from '@lib/types/Tables'; +import { t } from '@lingui/core/macro'; +import { Group } from '@mantine/core'; +import { useHover } from '@mantine/hooks'; +import { IconCirclePlus } from '@tabler/icons-react'; +import { useQuery } from '@tanstack/react-query'; +import { type ReactNode, useCallback, useMemo, useState } from 'react'; +import { useNavigate } from 'react-router-dom'; +import { useApi } from '../../contexts/ApiContext'; +import { useParameterFields } from '../../forms/CommonForms'; +import { + useCreateApiFormModal, + useEditApiFormModal +} from '../../hooks/UseForm'; +import { useTable } from '../../hooks/UseTable'; +import { useUserState } from '../../states/UserState'; +import { InvenTreeTable } from '../InvenTreeTable'; +import { TableHoverCard } from '../TableHoverCard'; +import { + PARAMETER_FILTER_OPERATORS, + ParameterFilter +} from './ParametricDataTableFilters'; + +// Render an individual parameter cell +function ParameterCell({ + record, + template, + canEdit +}: Readonly<{ + record: any; + template: any; + canEdit: boolean; +}>) { + const { hovered, ref } = useHover(); + + // Find matching template parameter + const parameter = useMemo(() => { + return record.parameters?.find((p: any) => p.template == template.pk); + }, [record, template]); + + const extra: any[] = []; + + // Format the value for display + const value: ReactNode = useMemo(() => { + let v: any = parameter?.data; + + // Handle boolean values + if (template?.checkbox && v != undefined) { + v = ; + } + + return v; + }, [parameter, template]); + + if ( + template.units && + parameter && + parameter.data_numeric && + parameter.data_numeric != parameter.data + ) { + const numeric = formatDecimal(parameter.data_numeric, { digits: 15 }); + extra.push(`${numeric} [${template.units}]`); + } + + if (hovered && canEdit) { + extra.push(t`Click to edit`); + } + + return ( +

+ ); +} + +/** + * A table which displays parametric data for generic model types. + * The table can be extended by passing in additional column, filters, and actions. + */ +export default function ParametricDataTable({ + modelType, + endpoint, + queryParams, + customFilters, + customColumns +}: { + modelType: ModelType; + endpoint: ApiEndpoints | string; + queryParams?: Record; + customFilters?: TableFilter[]; + customColumns?: TableColumn[]; +}) { + const api = useApi(); + const table = useTable(`parametric-data-${modelType}`); + const user = useUserState(); + const navigate = useNavigate(); + + // Fetch all active parameter templates for the given model type + const parameterTemplates = useQuery({ + queryKey: ['parameter-templates', modelType], + queryFn: async () => { + return api + .get(apiUrl(ApiEndpoints.parameter_template_list), { + params: { + active: true, + for_model: modelType, + exists_for_model: modelType + } + }) + .then((response) => response.data); + }, + refetchOnMount: true + }); + + /* Store filters against selected part parameters. + * These are stored in the format: + * { + * parameter_1: { + * '=': 'value1', + * '<': 'value2', + * ... + * }, + * parameter_2: { + * '=': 'value3', + * }, + * ... + * } + * + * Which allows multiple filters to be applied against each parameter template. + */ + const [parameterFilters, setParameterFilters] = useState({}); + + /* Remove filters for a specific parameter template + * - If no operator is specified, remove all filters for this template + * - If an operator is specified, remove filters for that operator only + */ + const clearParameterFilter = useCallback( + (templateId: number, operator?: string) => { + const filterName = `parameter_${templateId}`; + + if (!operator) { + // If no operator is specified, remove all filters for this template + setParameterFilters((prev: any) => { + const newFilters = { ...prev }; + // Remove any filters that match the template ID + Object.keys(newFilters).forEach((key: string) => { + if (key == filterName) { + delete newFilters[key]; + } + }); + return newFilters; + }); + + return; + } + + // An operator is specified, so we remove filters for that operator only + setParameterFilters((prev: any) => { + const filters = { ...prev }; + + const paramFilters = filters[filterName] || {}; + + if (paramFilters[operator] !== undefined) { + // Remove the specific operator filter + delete paramFilters[operator]; + } + + return { + ...filters, + [filterName]: paramFilters + }; + }); + + table.refreshTable(); + }, + [setParameterFilters, table.refreshTable] + ); + + /** + * Add (or update) a filter for a specific parameter template. + * @param templateId - The ID of the parameter template to filter on. + * @param value - The value to filter by. + * @param operator - The operator to use for filtering (e.g., '=', '<', '>', etc.). + */ + const addParameterFilter = useCallback( + (templateId: number, value: string, operator: string) => { + const filterName = `parameter_${templateId}`; + + const filterValue = value?.toString().trim() ?? ''; + + if (filterValue.length > 0) { + setParameterFilters((prev: any) => { + const filters = { ...prev }; + const paramFilters = filters[filterName] || {}; + + paramFilters[operator] = filterValue; + + return { + ...filters, + [filterName]: paramFilters + }; + }); + + table.refreshTable(); + } + }, + [setParameterFilters, clearParameterFilter, table.refreshTable] + ); + + // Construct the query filters for the table based on the parameter filters + const parametricQueryFilters = useMemo(() => { + const filters: Record = {}; + + Object.keys(parameterFilters).forEach((key: string) => { + const paramFilters: any = parameterFilters[key]; + + Object.keys(paramFilters).forEach((operator: string) => { + const name = `${key}${PARAMETER_FILTER_OPERATORS[operator] || ''}`; + const value = paramFilters[operator]; + + filters[name] = value; + }); + }); + + return filters; + }, [parameterFilters]); + + const [selectedInstance, setSelectedInstance] = useState(-1); + const [selectedTemplate, setSelectedTemplate] = useState(null); + const [selectedParameter, setSelectedParameter] = useState(-1); + + const parameterFields: ApiFormFieldSet = useParameterFields({ + modelType: modelType, + modelId: selectedInstance + }); + + const addParameter = useCreateApiFormModal({ + url: ApiEndpoints.parameter_list, + title: t`Add Parameter`, + fields: useMemo(() => ({ ...parameterFields }), [parameterFields]), + focus: 'data', + onFormSuccess: (parameter: any) => { + updateParameterRecord(selectedInstance, parameter); + + // Ensure that the parameter template is included in the table + const template = parameterTemplates.data.find( + (t: any) => t.pk == parameter.template + ); + + if (!template) { + // Reload the parameter templates + parameterTemplates.refetch(); + } + }, + initialData: { + part: selectedInstance, + template: selectedTemplate + } + }); + + const editParameter = useEditApiFormModal({ + url: ApiEndpoints.parameter_list, + title: t`Edit Parameter`, + pk: selectedParameter, + fields: useMemo(() => ({ ...parameterFields }), [parameterFields]), + focus: 'data', + onFormSuccess: (parameter: any) => { + updateParameterRecord(selectedInstance, parameter); + } + }); + + // Update a single parameter record in the table + const updateParameterRecord = useCallback( + (part: number, parameter: any) => { + const records = table.records; + const recordIndex = records.findIndex((record: any) => record.pk == part); + + if (recordIndex < 0) { + // No matching part: reload the entire table + table.refreshTable(); + return; + } + + const parameterIndex = records[recordIndex].parameters.findIndex( + (p: any) => p.pk == parameter.pk + ); + + if (parameterIndex < 0) { + // No matching parameter - append new parameter + records[recordIndex].parameters.push(parameter); + } else { + records[recordIndex].parameters[parameterIndex] = parameter; + } + + table.updateRecord(records[recordIndex]); + }, + [table.records, table.updateRecord] + ); + + const parameterColumns: TableColumn[] = useMemo(() => { + const data = parameterTemplates?.data || []; + + return data.map((template: any) => { + let title = template.name; + + if (template.units) { + title += ` [${template.units}]`; + } + + const filters = parameterFilters[`parameter_${template.pk}`] || {}; + + return { + accessor: `parameter_${template.pk}`, + title: title, + sortable: true, + extra: { + template: template.pk + }, + render: (record: any) => ( + + ), + filtering: Object.keys(filters).length > 0, + filter: ({ close }: { close: () => void }) => { + return ( + + ); + } + }; + }); + }, [user, parameterTemplates.data, parameterFilters]); + + // Callback function when a parameter cell is clicked + const onParameterClick = useCallback((template: number, instance: any) => { + setSelectedTemplate(template); + setSelectedInstance(instance.pk); + const parameter = instance.parameters?.find( + (p: any) => p.template == template + ); + + if (parameter) { + setSelectedParameter(parameter.pk); + editParameter.open(); + } else { + addParameter.open(); + } + }, []); + + const tableFilters: TableFilter[] = useMemo(() => { + return [...(customFilters || [])]; + }, [customFilters]); + + const tableColumns: TableColumn[] = useMemo(() => { + return [...(customColumns || []), ...parameterColumns]; + }, [customColumns, parameterColumns]); + + const rowActions = useCallback( + (record: any) => { + return [ + { + title: t`Add Parameter`, + icon: , + color: 'green', + hidden: !user.hasAddPermission(modelType), + onClick: () => { + setSelectedInstance(record.pk); + setSelectedTemplate(null); + addParameter.open(); + } + } + ]; + }, + [modelType, user] + ); + + return ( + <> + {addParameter.modal} + {editParameter.modal} + { + cancelEvent(event); + + // Is this a "parameter" cell? + if (column?.accessor?.toString()?.startsWith('parameter_')) { + const col = column as any; + onParameterClick(col.extra.template, record); + } else if (record?.pk) { + // Navigate through to the detail page + const url = getDetailUrl(modelType, record.pk); + navigateToLink(url, navigate, event); + } + } + }} + /> + + ); +} diff --git a/src/frontend/src/tables/part/ParametricPartTableFilters.tsx b/src/frontend/src/tables/general/ParametricDataTableFilters.tsx similarity index 100% rename from src/frontend/src/tables/part/ParametricPartTableFilters.tsx rename to src/frontend/src/tables/general/ParametricDataTableFilters.tsx diff --git a/src/frontend/src/tables/part/ParametricPartTable.tsx b/src/frontend/src/tables/part/ParametricPartTable.tsx index 4203fdd96f..f99e3ee668 100644 --- a/src/frontend/src/tables/part/ParametricPartTable.tsx +++ b/src/frontend/src/tables/part/ParametricPartTable.tsx @@ -1,353 +1,18 @@ -import { t } from '@lingui/core/macro'; -import { Group } from '@mantine/core'; -import { useHover } from '@mantine/hooks'; -import { useQuery } from '@tanstack/react-query'; -import { type ReactNode, useCallback, useMemo, useState } from 'react'; -import { useNavigate } from 'react-router-dom'; - -import { YesNoButton } from '@lib/components/YesNoButton'; import { ApiEndpoints } from '@lib/enums/ApiEndpoints'; import { ModelType } from '@lib/enums/ModelType'; -import { UserRoles } from '@lib/enums/Roles'; -import { apiUrl } from '@lib/functions/Api'; -import { cancelEvent } from '@lib/functions/Events'; -import { getDetailUrl } from '@lib/functions/Navigation'; -import { navigateToLink } from '@lib/functions/Navigation'; import type { TableFilter } from '@lib/types/Filters'; -import type { ApiFormFieldSet } from '@lib/types/Forms'; import type { TableColumn } from '@lib/types/Tables'; -import { useApi } from '../../contexts/ApiContext'; -import { formatDecimal } from '../../defaults/formatters'; -import { usePartParameterFields } from '../../forms/PartForms'; -import { - useCreateApiFormModal, - useEditApiFormModal -} from '../../hooks/UseForm'; -import { useTable } from '../../hooks/UseTable'; -import { useUserState } from '../../states/UserState'; +import { t } from '@lingui/core/macro'; +import { useMemo } from 'react'; import { DescriptionColumn, PartColumn } from '../ColumnRenderers'; -import { InvenTreeTable } from '../InvenTreeTable'; -import { TableHoverCard } from '../TableHoverCard'; -import { - PARAMETER_FILTER_OPERATORS, - ParameterFilter -} from './ParametricPartTableFilters'; - -// Render an individual parameter cell -function ParameterCell({ - record, - template, - canEdit -}: Readonly<{ - record: any; - template: any; - canEdit: boolean; -}>) { - const { hovered, ref } = useHover(); - - // Find matching template parameter - const parameter = useMemo(() => { - return record.parameters?.find((p: any) => p.template == template.pk); - }, [record, template]); - - const extra: any[] = []; - - // Format the value for display - const value: ReactNode = useMemo(() => { - let v: any = parameter?.data; - - // Handle boolean values - if (template?.checkbox && v != undefined) { - v = ; - } - - return v; - }, [parameter, template]); - - if ( - template.units && - parameter && - parameter.data_numeric && - parameter.data_numeric != parameter.data - ) { - const numeric = formatDecimal(parameter.data_numeric, { digits: 15 }); - extra.push(`${numeric} [${template.units}]`); - } - - if (hovered && canEdit) { - extra.push(t`Click to edit`); - } - - return ( -
- - - - - -
- ); -} +import ParametricDataTable from '../general/ParametricDataTable'; export default function ParametricPartTable({ categoryId }: Readonly<{ categoryId?: any; }>) { - const api = useApi(); - const table = useTable('parametric-parts'); - const user = useUserState(); - const navigate = useNavigate(); - - const categoryParameters = useQuery({ - queryKey: ['category-parameters', categoryId], - queryFn: async () => { - return api - .get(apiUrl(ApiEndpoints.part_parameter_template_list), { - params: { - category: categoryId - } - }) - .then((response) => response.data); - }, - refetchOnMount: true - }); - - /* Store filters against selected part parameters. - * These are stored in the format: - * { - * parameter_1: { - * '=': 'value1', - * '<': 'value2', - * ... - * }, - * parameter_2: { - * '=': 'value3', - * }, - * ... - * } - * - * Which allows multiple filters to be applied against each parameter template. - */ - const [parameterFilters, setParameterFilters] = useState({}); - - /* Remove filters for a specific parameter template - * - If no operator is specified, remove all filters for this template - * - If an operator is specified, remove filters for that operator only - */ - const clearParameterFilter = useCallback( - (templateId: number, operator?: string) => { - const filterName = `parameter_${templateId}`; - - if (!operator) { - // If no operator is specified, remove all filters for this template - setParameterFilters((prev: any) => { - const newFilters = { ...prev }; - // Remove any filters that match the template ID - Object.keys(newFilters).forEach((key: string) => { - if (key == filterName) { - delete newFilters[key]; - } - }); - return newFilters; - }); - - return; - } - - // An operator is specified, so we remove filters for that operator only - setParameterFilters((prev: any) => { - const filters = { ...prev }; - - const paramFilters = filters[filterName] || {}; - - if (paramFilters[operator] !== undefined) { - // Remove the specific operator filter - delete paramFilters[operator]; - } - - return { - ...filters, - [filterName]: paramFilters - }; - }); - - table.refreshTable(); - }, - [setParameterFilters, table.refreshTable] - ); - - /** - * Add (or update) a filter for a specific parameter template. - * @param templateId - The ID of the parameter template to filter on. - * @param value - The value to filter by. - * @param operator - The operator to use for filtering (e.g., '=', '<', '>', etc.). - */ - const addParameterFilter = useCallback( - (templateId: number, value: string, operator: string) => { - const filterName = `parameter_${templateId}`; - - const filterValue = value?.toString().trim() ?? ''; - - if (filterValue.length > 0) { - setParameterFilters((prev: any) => { - const filters = { ...prev }; - const paramFilters = filters[filterName] || {}; - - paramFilters[operator] = filterValue; - - return { - ...filters, - [filterName]: paramFilters - }; - }); - - table.refreshTable(); - } - }, - [setParameterFilters, clearParameterFilter, table.refreshTable] - ); - - // Construct the query filters for the table based on the parameter filters - const parametricQueryFilters = useMemo(() => { - const filters: Record = {}; - - Object.keys(parameterFilters).forEach((key: string) => { - const paramFilters: any = parameterFilters[key]; - - Object.keys(paramFilters).forEach((operator: string) => { - const name = `${key}${PARAMETER_FILTER_OPERATORS[operator] || ''}`; - const value = paramFilters[operator]; - - filters[name] = value; - }); - }); - - return filters; - }, [parameterFilters]); - - const [selectedPart, setSelectedPart] = useState(0); - const [selectedTemplate, setSelectedTemplate] = useState(0); - const [selectedParameter, setSelectedParameter] = useState(0); - - const partParameterFields: ApiFormFieldSet = usePartParameterFields({ - editTemplate: false - }); - - const addParameter = useCreateApiFormModal({ - url: ApiEndpoints.part_parameter_list, - title: t`Add Part Parameter`, - fields: useMemo(() => ({ ...partParameterFields }), [partParameterFields]), - focus: 'data', - onFormSuccess: (parameter: any) => { - updateParameterRecord(selectedPart, parameter); - }, - initialData: { - part: selectedPart, - template: selectedTemplate - } - }); - - const editParameter = useEditApiFormModal({ - url: ApiEndpoints.part_parameter_list, - title: t`Edit Part Parameter`, - pk: selectedParameter, - fields: useMemo(() => ({ ...partParameterFields }), [partParameterFields]), - focus: 'data', - onFormSuccess: (parameter: any) => { - updateParameterRecord(selectedPart, parameter); - } - }); - - // Update a single parameter record in the table - const updateParameterRecord = useCallback( - (part: number, parameter: any) => { - const records = table.records; - const partIndex = records.findIndex((record: any) => record.pk == part); - - if (partIndex < 0) { - // No matching part: reload the entire table - table.refreshTable(); - return; - } - - const parameterIndex = records[partIndex].parameters.findIndex( - (p: any) => p.pk == parameter.pk - ); - - if (parameterIndex < 0) { - // No matching parameter - append new parameter - records[partIndex].parameters.push(parameter); - } else { - records[partIndex].parameters[parameterIndex] = parameter; - } - - table.updateRecord(records[partIndex]); - }, - [table.records, table.updateRecord] - ); - - const parameterColumns: TableColumn[] = useMemo(() => { - const data = categoryParameters?.data || []; - - return data.map((template: any) => { - let title = template.name; - - if (template.units) { - title += ` [${template.units}]`; - } - - const filters = parameterFilters[`parameter_${template.pk}`] || {}; - - return { - accessor: `parameter_${template.pk}`, - title: title, - sortable: true, - extra: { - template: template.pk - }, - render: (record: any) => ( - - ), - filtering: Object.keys(filters).length > 0, - filter: ({ close }: { close: () => void }) => { - return ( - - ); - } - }; - }); - }, [user, categoryParameters.data, parameterFilters]); - - const onParameterClick = useCallback((template: number, part: any) => { - setSelectedTemplate(template); - setSelectedPart(part.pk); - const parameter = part.parameters?.find((p: any) => p.template == template); - - if (parameter) { - setSelectedParameter(parameter.pk); - editParameter.open(); - } else { - addParameter.open(); - } - }, []); - - const tableFilters: TableFilter[] = useMemo(() => { + const customFilters: TableFilter[] = useMemo(() => { return [ { name: 'active', @@ -367,8 +32,8 @@ export default function ParametricPartTable({ ]; }, []); - const tableColumns: TableColumn[] = useMemo(() => { - const partColumns: TableColumn[] = [ + const customColumns: TableColumn[] = useMemo(() => { + return [ PartColumn({ part: '', switchable: false @@ -386,43 +51,19 @@ export default function ParametricPartTable({ sortable: true } ]; - - return [...partColumns, ...parameterColumns]; - }, [parameterColumns]); + }, []); return ( - <> - {addParameter.modal} - {editParameter.modal} - { - cancelEvent(event); - - // Is this a "parameter" cell? - if (column?.accessor?.toString()?.startsWith('parameter_')) { - const col = column as any; - onParameterClick(col.extra.template, record); - } else if (record?.pk) { - // Navigate through to the part detail page - const url = getDetailUrl(ModelType.part, record.pk); - navigateToLink(url, navigate, event); - } - } - }} - /> - + ); } diff --git a/src/frontend/src/tables/part/PartCategoryTemplateTable.tsx b/src/frontend/src/tables/part/PartCategoryTemplateTable.tsx index 6d705afbce..604e18609a 100644 --- a/src/frontend/src/tables/part/PartCategoryTemplateTable.tsx +++ b/src/frontend/src/tables/part/PartCategoryTemplateTable.tsx @@ -37,7 +37,7 @@ export default function PartCategoryTemplateTable({ value: categoryId, disabled: categoryId !== undefined }, - parameter_template: {}, + template: {}, default_value: {} }; }, [categoryId]); @@ -83,7 +83,7 @@ export default function PartCategoryTemplateTable({ accessor: 'category_detail.pathstring' }, { - accessor: 'parameter_template_detail.name', + accessor: 'template_detail.name', title: t`Parameter Template`, sortable: true, switchable: false @@ -99,8 +99,8 @@ export default function PartCategoryTemplateTable({ let units = ''; - if (record?.parameter_template_detail?.units) { - units = `[${record.parameter_template_detail.units}]`; + if (record?.template_detail?.units) { + units = `[${record.template_detail.units}]`; } return ( @@ -162,7 +162,9 @@ export default function PartCategoryTemplateTable({ tableActions: tableActions, enableDownload: true, params: { - category: categoryId + category: categoryId, + template_detail: true, + category_detail: true } }} /> diff --git a/src/frontend/src/tables/part/PartParameterTable.tsx b/src/frontend/src/tables/part/PartParameterTable.tsx deleted file mode 100644 index d7119e4324..0000000000 --- a/src/frontend/src/tables/part/PartParameterTable.tsx +++ /dev/null @@ -1,254 +0,0 @@ -import { t } from '@lingui/core/macro'; -import { Alert, Stack, Text } from '@mantine/core'; -import { IconLock } from '@tabler/icons-react'; -import { useCallback, useMemo, useState } from 'react'; - -import { AddItemButton } from '@lib/components/AddItemButton'; -import { - type RowAction, - RowDeleteAction, - RowEditAction -} from '@lib/components/RowActions'; -import { YesNoButton } from '@lib/components/YesNoButton'; -import { ApiEndpoints } from '@lib/enums/ApiEndpoints'; -import { UserRoles } from '@lib/enums/Roles'; -import { apiUrl } from '@lib/functions/Api'; -import type { TableFilter } from '@lib/types/Filters'; -import type { ApiFormFieldSet } from '@lib/types/Forms'; -import type { TableColumn } from '@lib/types/Tables'; -import { formatDecimal } from '../../defaults/formatters'; -import { usePartParameterFields } from '../../forms/PartForms'; -import { - useCreateApiFormModal, - useDeleteApiFormModal, - useEditApiFormModal -} from '../../hooks/UseForm'; -import { useTable } from '../../hooks/UseTable'; -import { useUserState } from '../../states/UserState'; -import { - DateColumn, - DescriptionColumn, - NoteColumn, - PartColumn, - UserColumn -} from '../ColumnRenderers'; -import { IncludeVariantsFilter, UserFilter } from '../Filter'; -import { InvenTreeTable } from '../InvenTreeTable'; -import { TableHoverCard } from '../TableHoverCard'; - -/** - * Construct a table listing parameters for a given part - */ -export function PartParameterTable({ - partId, - partLocked -}: Readonly<{ - partId: any; - partLocked?: boolean; -}>) { - const table = useTable('part-parameters'); - - const user = useUserState(); - - const tableColumns: TableColumn[] = useMemo(() => { - return [ - PartColumn({ - part: 'part_detail' - }), - { - accessor: 'part_detail.IPN', - sortable: false, - switchable: true, - defaultVisible: false - }, - { - accessor: 'template_detail.name', - switchable: false, - sortable: true, - ordering: 'name', - render: (record) => { - const variant = String(partId) != String(record.part); - - return ( - - {record.template_detail?.name} - - ); - } - }, - DescriptionColumn({ - accessor: 'template_detail.description' - }), - { - accessor: 'data', - switchable: false, - sortable: true, - render: (record) => { - const template = record.template_detail; - - if (template?.checkbox) { - return ; - } - - const extra: any[] = []; - - if ( - template.units && - record.data_numeric && - record.data_numeric != record.data - ) { - const numeric = formatDecimal(record.data_numeric, { digits: 15 }); - extra.push(`${numeric} [${template.units}]`); - } - - return ( - - ); - } - }, - { - accessor: 'template_detail.units', - ordering: 'units', - sortable: true - }, - NoteColumn({}), - DateColumn({ - accessor: 'updated', - title: t`Last Updated`, - sortable: true, - switchable: true - }), - UserColumn({ - accessor: 'updated_by_detail', - ordering: 'updated_by', - title: t`Updated By` - }) - ]; - }, [partId]); - - const tableFilters: TableFilter[] = useMemo(() => { - return [ - IncludeVariantsFilter(), - UserFilter({ - name: 'updated_by', - label: t`Updated By`, - description: t`Filter by user who last updated the parameter` - }) - ]; - }, []); - - const partParameterFields: ApiFormFieldSet = usePartParameterFields({}); - - const newParameter = useCreateApiFormModal({ - url: ApiEndpoints.part_parameter_list, - title: t`New Part Parameter`, - fields: useMemo(() => ({ ...partParameterFields }), [partParameterFields]), - focus: 'template', - initialData: { - part: partId - }, - table: table - }); - - const [selectedParameter, setSelectedParameter] = useState< - number | undefined - >(undefined); - - const editParameter = useEditApiFormModal({ - url: ApiEndpoints.part_parameter_list, - pk: selectedParameter, - title: t`Edit Part Parameter`, - focus: 'data', - fields: useMemo(() => ({ ...partParameterFields }), [partParameterFields]), - table: table - }); - - const deleteParameter = useDeleteApiFormModal({ - url: ApiEndpoints.part_parameter_list, - pk: selectedParameter, - title: t`Delete Part Parameter`, - table: table - }); - - // Callback for row actions - const rowActions = useCallback( - (record: any): RowAction[] => { - // Actions not allowed for "variant" rows - if (String(partId) != String(record.part)) { - return []; - } - - return [ - RowEditAction({ - tooltip: t`Edit Part Parameter`, - hidden: partLocked || !user.hasChangeRole(UserRoles.part), - onClick: () => { - setSelectedParameter(record.pk); - editParameter.open(); - } - }), - RowDeleteAction({ - tooltip: t`Delete Part Parameter`, - hidden: partLocked || !user.hasDeleteRole(UserRoles.part), - onClick: () => { - setSelectedParameter(record.pk); - deleteParameter.open(); - } - }) - ]; - }, - [partId, partLocked, user] - ); - - // Custom table actions - const tableActions = useMemo(() => { - return [ -
{% endraw %} ``` -#### Rendering a single report vs. multiple report from selection -Users can select multiple items such as `part`, `stockItem`,...etc to render from a report template. By default, the `merge` attribute of report template is disabled, which means an independent report will be generated for each item in the list of selected items. If `merge` is enabled, all selected items will be available in the `instances` context variable of the report template. Users are free to access them by indexing or in a loop. For more details, visit [context variable](./context_variables.md) + +## Merging Reports + +When rendering reports for multiple items, the default behaviour is that each item is rendered as a separate report. The chosen templeate is rendered multiple times, once for each item selected, and expects a single item in the context variable. + +However, it is possible to merge multiple items into a single report document. This is achieved by enabling the `merge` attribute of the report template: + +{{ image("report/report_merge.png", alt="Report Merge Option") }} + +When the `merge` is enabled, all selected items are passed to the report template in the `instances` context variable, which is a list of all selected items. The user can then iterate over this list to render multiple items in a single report document. + +### Instance Context + +When rendering a single template against multiple *instances* of a particular model (e.g. multiple parts, multiple stock items, etc), each instance being rendered has its own unique context data. + +Each "instance" is provided to the report template as a dictionary of context variables, which can be accessed using standard django template syntax. + +Refer to the [context variable documentation](./context_variables.md) for more information about the available context variables for each model type. + +The `instances` variable is provided as a list of all selected items, where each item in the list is a dictionary of context variables for that particular instance. Within the report template, the user can iterate over the `instances` list to render each item in turn. + +### Example + +As an example, let's consider a report template where we are printing multiple parts in a single report document. + +When the `merge` option is enabled, the report template is provided with an `instances` variable, which is a list of all selected parts. + +Each *instance* in the `instances` list is a dictionary of context variables for that particular part, which conforms to the standard [part context structure](./context_variables.md#part). + +```django +{% raw %} + +{% for instance in instances %} +Part Name: {{ instance.part.name }}
+IPN: {{ instance.part.IPN }}
+Description: {{ instance.part.description }}
+ +{% endraw %} +``` + +!!! tip "Instance Prefix" + Note that the context variable is prefixed with `instance.` when accessing variables for each item in the `instances` list. From c489423c07bb9cf8cf386e422112f850fd36c211 Mon Sep 17 00:00:00 2001 From: Oliver Date: Tue, 9 Dec 2025 19:33:38 +1100 Subject: [PATCH 43/76] [docs] database update (#10985) Instructions for updating from one database backend version to another --- docs/docs/start/migrate.md | 83 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) diff --git a/docs/docs/start/migrate.md b/docs/docs/start/migrate.md index 8cc760ffdb..f8189c08f7 100644 --- a/docs/docs/start/migrate.md +++ b/docs/docs/start/migrate.md @@ -114,3 +114,86 @@ Once the migration process completes, the database records are now updated! Rest !!! tip "Example: Docker" If running under docker, run `docker compose up -d` + +## Migrating Between Incompatible Database Versions + +There may be occasions when InvenTree data needs to be migrated between two database installations running *incompatible* versions of the database software. For example, InvenTree may be running on a Postgres database running on version 12, and the administrator wishes to migrate the data to a Postgres version 17 database. + +!!! warning "Advanced Procedure" + The following procedure is *advanced*, and should only be attempted by experienced database administrators. Always ensure that database backups are made before attempting any migration procedure. + +Due to inherit incompatibilities between different major versions of database software, it is not always possible to directly migrate data between two different database versions. In such cases, the following procedure can be used as a workaround. + +!!! warning "InvenTree Version" + It is *crucial* that both InvenTree database installations are running the same version of InvenTree software! If this is not the case, data migration may fail, and there is a possibility that data corruption can occur. Ensure that the original database is up to date, by running `invoke update`. + +The following instructions assume that the source (old) database is Postgres version 15, and the target (new) database is Postgres version 17. Additionally, it assumes that the InvenTree installation is running under [docker / docker compose](./docker.md), for simplicity. Adjust commands as required for other InvenTree configurations or database software. + +The overall procedure is as follows: + +### Backup Old Database + +Run the following command to create a backup dump of the old database: + +``` +docker compose run --rm inventree-server invoke backup +``` + +This will create a database backup file in the InvenTree backup directory. + +!!! tip "Secondary Backup" + It may be prudent to create a secondary backup of the database, separate to the one created by InvenTree. + +### Shutdown Old Database + +Stop the old InvenTree installation, to ensure that the database is not being accessed during the migration process: + +``` +docker compose down +``` + +### Remove Old Database Files + +The raw database files are incompatible between different major versions of Postgres. Thus, the old database files must be removed before starting the new database. + +!!! warning "Data Loss" + Ensure that a complete backup of the old database has been made before proceeding! Removing the database files will result in data loss if a backup does not exist. + +``` +rm -rf ./path/to/database/* +``` + +!!! info "Database Location" + The location of the database files depends on how InvenTree was configured. + +### Start New Database + +Update the InvenTree docker configuration to use the new version of Postgres (e.g. `postgres:17`), and then start the InvenTree installation: + +``` +docker compose up -d +``` + +This will initialize a new, empty database using the new version of Postgres. + +### Run Database Migrations + +Run the database migration process to ensure that the new database schema is correctly initialized: + +``` +docker compose run --rm inventree-server invoke update +``` + +### Restore Database Backup + +Finally, restore the database backup created earlier into the new database: + +``` +docker compose run --rm inventree-server invoke restore +``` + +This will load the database records from the backup file into the new database. + +### Caveats + +The process described here is a *suggested* procedure for migrating between incompatible database versions. However, due to the complexity of database software, there may be unforeseen complications that arise during the process. From dbb55a63fdc6c7db5d5ad10a8222bf4f949456d0 Mon Sep 17 00:00:00 2001 From: Oliver Date: Wed, 10 Dec 2025 10:21:32 +1100 Subject: [PATCH 44/76] [docs] Adjusting serial numbers (#10989) Add brief docs on adjusting serial numbers for a stock item --- docs/docs/assets/images/stock/serial_edit.png | Bin 0 -> 45858 bytes .../assets/images/stock/serial_edit_error.png | Bin 0 -> 42484 bytes docs/docs/stock/tracking.md | 11 +++++++++++ 3 files changed, 11 insertions(+) create mode 100644 docs/docs/assets/images/stock/serial_edit.png create mode 100644 docs/docs/assets/images/stock/serial_edit_error.png diff --git a/docs/docs/assets/images/stock/serial_edit.png b/docs/docs/assets/images/stock/serial_edit.png new file mode 100644 index 0000000000000000000000000000000000000000..913dde91fedb039ce0f0bb0353bd8ff6822aab25 GIT binary patch literal 45858 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
  • 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 U>+erufTAPnsye@wD&G(L4_`U$3IG5A literal 0 HcmV?d00001 diff --git a/docs/docs/assets/images/stock/serial_edit_error.png b/docs/docs/assets/images/stock/serial_edit_error.png new file mode 100644 index 0000000000000000000000000000000000000000..26cad8d44d6dbf9a179262527f858a09c23f6534 GIT binary patch literal 42484 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

    }d%8ATpLCa_@aD>mA+0F4sC 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 Date: Wed, 10 Dec 2025 23:02:06 +1100 Subject: [PATCH 45/76] [security] Bump react deps (#10991) --- src/frontend/package.json | 6 +++--- src/frontend/yarn.lock | 34 +++++++++++++++++----------------- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/src/frontend/package.json b/src/frontend/package.json index 29f04e6fe5..1e6d57d0b3 100644 --- a/src/frontend/package.json +++ b/src/frontend/package.json @@ -91,11 +91,11 @@ "mantine-contextmenu": "^8.2.0", "mantine-datatable": "^8.2.0", "qrcode": "^1.5.4", - "react": "^19.1.1", - "react-dom": "^19.1.1", + "react": "^19.1.2", + "react-dom": "^19.1.2", "react-grid-layout": "1.4.4", "react-hook-form": "^7.62.0", - "react-is": "^19.1.1", + "react-is": "^19.1.2", "react-router-dom": "^6.26.2", "react-select": "^5.9.0", "react-simplemde-editor": "^5.2.0", diff --git a/src/frontend/yarn.lock b/src/frontend/yarn.lock index dd0dc66425..0fe4624b8c 100644 --- a/src/frontend/yarn.lock +++ b/src/frontend/yarn.lock @@ -4483,12 +4483,12 @@ quansync@^0.2.8: resolved "https://registry.npmjs.org/quansync/-/quansync-0.2.10.tgz" integrity sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A== -react-dom@^19.1.1: - version "19.1.1" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-19.1.1.tgz#2daa9ff7f3ae384aeb30e76d5ee38c046dc89893" - integrity sha512-Dlq/5LAZgF0Gaz6yiqZCf6VCcZs1ghAJyrsu84Q/GT0gV+mCxbfmKNoGRKBYMJ8IEdGPqu49YWXD02GCknEDkw== +react-dom@^19.1.2: + version "19.2.1" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-19.2.1.tgz#ce3527560bda4f997e47d10dab754825b3061f59" + integrity sha512-ibrK8llX2a4eOskq1mXKu/TGZj9qzomO+sNfO98M6d9zIPOEhlBkMkBUBLd1vgS0gQsLDBzA+8jJBVXDnfHmJg== dependencies: - scheduler "^0.26.0" + scheduler "^0.27.0" react-draggable@^4.0.3, react-draggable@^4.4.5: version "4.4.6" @@ -4534,10 +4534,10 @@ react-is@^18.0.0: resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.3.1.tgz#e83557dc12eae63a99e003a46388b1dcbb44db7e" integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg== -react-is@^19.1.1: - version "19.1.1" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-19.1.1.tgz#038ebe313cf18e1fd1235d51c87360eb87f7c36a" - integrity sha512-tr41fA15Vn8p4X9ntI+yCyeGSf1TlYaY5vlTZfQmeLBrFo3psOPX6HhTDnFNL9uj3EhP0KAQ80cugCl4b4BERA== +react-is@^19.1.2: + version "19.2.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-19.2.1.tgz#712fa6ee30c8398dc34260017325dad92b9224c5" + integrity sha512-L7BnWgRbMwzMAubQcS7sXdPdNLmKlucPlopgAzx7FtYbksWZgEWiuYM5x9T6UqS2Ne0rsgQTq5kY2SGqpzUkYA== react-number-format@^5.4.3: version "5.4.3" @@ -4656,10 +4656,10 @@ react-window@1.8.11: "@babel/runtime" "^7.0.0" memoize-one ">=3.1.1 <6" -react@^19.1.1: - version "19.1.1" - resolved "https://registry.yarnpkg.com/react/-/react-19.1.1.tgz#06d9149ec5e083a67f9a1e39ce97b06a03b644af" - integrity sha512-w8nqGImo45dmMIfljjMwOGtbmC/mk4CMYhWIicdSflH91J9TyCyczcPFXJzrZ/ZXcgGRFeP6BU0BEJTw6tZdfQ== +react@^19.1.2: + version "19.2.1" + resolved "https://registry.yarnpkg.com/react/-/react-19.2.1.tgz#8600fa205e58e2e807f6ef431c9f6492591a2700" + integrity sha512-DGrYcCWK7tvYMnWh79yrPHt+vdx9tY+1gPZa7nJQtO/p8bLTDaHp4dzwEhQB7pZ4Xe3ok4XKuEPrVuc+wlpkmw== readable-stream@^3.4.0: version "3.6.2" @@ -4856,10 +4856,10 @@ safe-buffer@~5.2.0: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== -scheduler@^0.26.0: - version "0.26.0" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.26.0.tgz#4ce8a8c2a2095f13ea11bf9a445be50c555d6337" - integrity sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA== +scheduler@^0.27.0: + version "0.27.0" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.27.0.tgz#0c4ef82d67d1e5c1e359e8fc76d3a87f045fe5bd" + integrity sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q== semver@^6.0.0, semver@^6.3.1: version "6.3.1" From 0723c74567f6773370d41144d46820ffabe1f134 Mon Sep 17 00:00:00 2001 From: Oliver Date: Thu, 11 Dec 2025 16:19:37 +1100 Subject: [PATCH 46/76] [UI] Spotlight Updates (#10994) - Fix broken "admin" action - Add action to jump to plugins page --- src/frontend/src/defaults/actions.tsx | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/frontend/src/defaults/actions.tsx b/src/frontend/src/defaults/actions.tsx index c8ac22fd81..cf42a8960f 100644 --- a/src/frontend/src/defaults/actions.tsx +++ b/src/frontend/src/defaults/actions.tsx @@ -3,6 +3,7 @@ import type { SpotlightActionData } from '@mantine/spotlight'; import { IconBarcode, IconLink, + IconPlug, IconPointer, IconSettings, IconUserBolt, @@ -152,10 +153,19 @@ export function getActions(navigate: NavigateFunction) { id: 'admin-center', label: t`Admin Center`, description: t`Go to the Admin Center`, - onClick: () => {}, /// navigate(menuItems['settings-admin'].link),} + onClick: () => navigate('/settings/admin'), leftSection: }); + user?.isStaff() && + _actions.push({ + id: 'plugin-settings', + label: t`Plugins`, + description: t`Manage InvenTree plugins`, + onClick: () => navigate('/settings/admin/plugin'), + leftSection: + }); + return _actions; }, [navigate, setNavigationOpen, globalSettings, user]); From 20c7a5b5b84702a4eaa33c891b84fcc801c7a220 Mon Sep 17 00:00:00 2001 From: Oliver Date: Thu, 11 Dec 2025 16:19:47 +1100 Subject: [PATCH 47/76] Barcode scan tweaks (#10992) * Remove duplicate tooltip * Adjust default value * docs update * Tweak unit test * Fix playwright tests --- .../images/barcode/barcode_allocate_stock.png | Bin 0 -> 26307 bytes docs/docs/barcodes/index.md | 10 ++++++- src/backend/InvenTree/common/setting/user.py | 2 +- .../src/components/buttons/ScanButton.tsx | 1 - src/frontend/tests/api.ts | 10 +++++-- src/frontend/tests/helpers.ts | 2 +- src/frontend/tests/pages/pui_scan.spec.ts | 25 ++++++++++++++++++ src/frontend/tests/pui_settings.spec.ts | 8 +++--- src/frontend/tests/settings.ts | 4 +-- 9 files changed, 49 insertions(+), 13 deletions(-) create mode 100644 docs/docs/assets/images/barcode/barcode_allocate_stock.png diff --git a/docs/docs/assets/images/barcode/barcode_allocate_stock.png b/docs/docs/assets/images/barcode/barcode_allocate_stock.png new file mode 100644 index 0000000000000000000000000000000000000000..676efcb1e392474849868f259a311c2fdb9714d7 GIT binary patch literal 26307 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 literal 0 HcmV?d00001 diff --git a/docs/docs/barcodes/index.md b/docs/docs/barcodes/index.md index b9e53b38b6..6d5eb04d76 100644 --- a/docs/docs/barcodes/index.md +++ b/docs/docs/barcodes/index.md @@ -69,7 +69,7 @@ To access this page, select *Scan Barcode* from the main navigation menu: {{ image("barcode/barcode_nav_menu.png", "Barcode menu item") }} {{ image("barcode/barcode_scan_page.png", "Barcode scan page") }} -### Barcodes in Forms +## Barcodes in Forms The InvenTree user interface supports direct scanning of barcodes within certain forms in the web UI. This means that any form field which points to a model which supports barcodes can accept barcode input. If barcode scanning is supported for a particular field, a barcode icon will be displayed next to the input field: @@ -83,6 +83,14 @@ Once scanned, the form field will be automatically populated with the correct it {{ image("barcode/barcode_field_filled.png", "Barcode field populated") }} +Any field which supports barcode input will have this functionality, such as allocating stock items to an order: + +{{ image("barcode/barcode_allocate_stock.png", "Allocate stock via barcode") }} + +### User Configuration + +By default, barcode scanning in form fields is disabled. Each user can enable this feature via their [user preferences](../settings/user.md#display-settings). + ## App Integration Barcode scanning is a key feature of the [companion mobile app](../app/barcode.md). When running on a device with an integrated camera, the app can scan barcodes directly from the camera feed. diff --git a/src/backend/InvenTree/common/setting/user.py b/src/backend/InvenTree/common/setting/user.py index b318a00213..23dee7e5bd 100644 --- a/src/backend/InvenTree/common/setting/user.py +++ b/src/backend/InvenTree/common/setting/user.py @@ -44,7 +44,7 @@ USER_SETTINGS: dict[str, InvenTreeSettingsKeyType] = { 'BARCODE_IN_FORM_FIELDS': { 'name': _('Barcode Scanner in Form Fields'), 'description': _('Allow barcode scanner input in form fields'), - 'default': True, + 'default': False, 'validator': bool, }, 'SEARCH_PREVIEW_SHOW_PARTS': { diff --git a/src/frontend/src/components/buttons/ScanButton.tsx b/src/frontend/src/components/buttons/ScanButton.tsx index 542656aed1..286f3ef4ac 100644 --- a/src/frontend/src/components/buttons/ScanButton.tsx +++ b/src/frontend/src/components/buttons/ScanButton.tsx @@ -29,7 +29,6 @@ export function ScanButton({ aria-label={`barcode-scan-button-${modelType ?? 'any'}`} onClick={open} variant='transparent' - title={t`Open Barcode Scanner`} > diff --git a/src/frontend/tests/api.ts b/src/frontend/tests/api.ts index 7d4e694a65..7c609fd5e4 100644 --- a/src/frontend/tests/api.ts +++ b/src/frontend/tests/api.ts @@ -1,10 +1,16 @@ import { request } from '@playwright/test'; import { adminuser, apiUrl } from './defaults'; -export const createApi = () => +export const createApi = ({ + username, + password +}: { + username?: string; + password?: string; +}) => request.newContext({ baseURL: apiUrl, extraHTTPHeaders: { - Authorization: `Basic ${btoa(`${adminuser.username}:${adminuser.password}`)}` + Authorization: `Basic ${btoa(`${username || adminuser.username}:${password || adminuser.password}`)}` } }); diff --git a/src/frontend/tests/helpers.ts b/src/frontend/tests/helpers.ts index a7dfed6e8a..4cb02129d2 100644 --- a/src/frontend/tests/helpers.ts +++ b/src/frontend/tests/helpers.ts @@ -152,7 +152,7 @@ export const globalSearch = async (page: Page, query: string) => { }; export const deletePart = async (name: string) => { - const api = await createApi(); + const api = await createApi({}); const parts = await api .get('part/', { params: { search: name } diff --git a/src/frontend/tests/pages/pui_scan.spec.ts b/src/frontend/tests/pages/pui_scan.spec.ts index 139e122724..5db51523fc 100644 --- a/src/frontend/tests/pages/pui_scan.spec.ts +++ b/src/frontend/tests/pages/pui_scan.spec.ts @@ -1,4 +1,5 @@ import type { Page } from '@playwright/test'; +import { createApi } from '../api'; import { test } from '../baseFixtures'; import { doCachedLogin } from '../login'; @@ -128,9 +129,33 @@ test('Barcode Scanning - Build', async ({ browser }) => { test('Barcode Scanning - Forms', async ({ browser }) => { const page = await doCachedLogin(browser, { + username: 'admin', + password: 'inventree', url: '/stock/location/index/stock-items' }); + // Ensure the user setting is enabled + const api = await createApi({}); + + let patched = false; + + await api + .patch('/api/settings/user/BARCODE_IN_FORM_FIELDS/', { + data: { + value: true + } + }) + .then((response) => { + patched = response.status() === 200; + }); + + // Assert that the setting was patched successfully + if (!patched) { + throw new Error('Could not patch user setting: BARCODE_IN_FORM_FIELDS'); + } + + await page.reload(); + // Open the "Add Stock Item" form await page .getByRole('button', { name: 'action-button-add-stock-item' }) diff --git a/src/frontend/tests/pui_settings.spec.ts b/src/frontend/tests/pui_settings.spec.ts index fbdd590b6c..f30415af2b 100644 --- a/src/frontend/tests/pui_settings.spec.ts +++ b/src/frontend/tests/pui_settings.spec.ts @@ -332,7 +332,7 @@ test('Settings - Admin - Barcode History', async ({ browser }) => { // Scan some barcodes (via API calls) const barcodes = ['ABC1234', 'XYZ5678', 'QRS9012']; - const api = await createApi(); + const api = await createApi({}); for (let i = 0; i < barcodes.length; i++) { const barcode = barcodes[i]; @@ -349,8 +349,8 @@ test('Settings - Admin - Barcode History', async ({ browser }) => { }, timeout: 5000 }) - .then(() => { - result = true; + .then((response) => { + result = response.status() === 200; }); if (result) { @@ -478,8 +478,6 @@ test('Settings - Admin - Parameter', async ({ browser }) => { await page.getByRole('option', { name: 'my custom parameter' }).click(); await page.getByLabel('choice-field-data').fill('2'); await page.getByRole('button', { name: 'Submit' }).click(); - - await page.waitForTimeout(2500); }); test('Settings - Admin - Unauthorized', async ({ browser }) => { diff --git a/src/frontend/tests/settings.ts b/src/frontend/tests/settings.ts index a8fcdc0a68..72d3126808 100644 --- a/src/frontend/tests/settings.ts +++ b/src/frontend/tests/settings.ts @@ -16,7 +16,7 @@ export const setSettingState = async ({ type?: 'global' | 'plugin'; plugin?: string; }) => { - const api = await createApi(); + const api = await createApi({}); const url = type === 'global' ? `settings/global/${setting}/` @@ -37,7 +37,7 @@ export const setPluginState = async ({ plugin: string; state: boolean; }) => { - const api = await createApi(); + const api = await createApi({}); const response = await api.patch(`plugins/${plugin}/activate/`, { data: { active: state From e4a6c1abfb3d5d921c61864a4b1a8c0fa82d4ad4 Mon Sep 17 00:00:00 2001 From: Oliver Date: Fri, 12 Dec 2025 21:14:25 +1100 Subject: [PATCH 48/76] Add information about building docs (#10998) --- docs/README.md | 24 ++++++++++++++++++++++++ tasks.py | 2 +- 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/docs/README.md b/docs/README.md index d9d1b1e1da..41f0287f81 100644 --- a/docs/README.md +++ b/docs/README.md @@ -15,6 +15,18 @@ $ git clone https://github.com/inventree/inventree $ pip install --require-hashes -r docs/requirements.txt ``` +## Build Documentation + +Before serving the documentation, you will need to build the documentation files: + +``` +invoke build-docs +``` + +This is required to generate the required API schema files, and must be run before the documentation can be served. + +Note that this command is only required when building the documentation for the first time, or when changes have been made to the API schema. + ## Serve Locally To serve the pages locally, run the following command (from the top-level project directory): @@ -23,6 +35,18 @@ To serve the pages locally, run the following command (from the top-level projec $ mkdocs serve -f docs/mkdocs.yml -a localhost:8080 ``` +Alternatively, you can use the `invoke` command: + +``` +invoke dev.docs-server +``` + +To see all the available options: + +``` +invoke dev.docs-server --help +``` + ## Edit Documentation Files Once the server is running, it will monitor the documentation files for any changes, and update the served pages. diff --git a/tasks.py b/tasks.py index 9c2e0227d9..d0d1be5089 100644 --- a/tasks.py +++ b/tasks.py @@ -1904,7 +1904,7 @@ def doc_schema(c): @task( help={ 'address': 'Host and port to run the server on (default: localhost:8080)', - 'compile_schema': 'Compile the schema documentation first (default: False)', + 'compile_schema': 'Compile the API schema documentation first (default: False)', } ) def docs_server(c, address='localhost:8080', compile_schema=False): From 2d14364a4d83dc277d01413fcf5f84bcfd2cab31 Mon Sep 17 00:00:00 2001 From: Oliver Date: Sat, 13 Dec 2025 10:19:37 +1100 Subject: [PATCH 49/76] Add helper funcs for debugging (#10997) * Add helper funcs for debugging * Exclude from coverage * Raise error if not in debug * Raise error if not in DEBUG mode --- .gitignore | 5 + src/backend/InvenTree/InvenTree/profiling.py | 130 +++++++++++++++++++ 2 files changed, 135 insertions(+) create mode 100644 src/backend/InvenTree/InvenTree/profiling.py diff --git a/.gitignore b/.gitignore index 7ac5d57dee..3ff470669e 100644 --- a/.gitignore +++ b/.gitignore @@ -37,6 +37,11 @@ local_settings.py *.backup *.old +# Files generated by profiling tools +*.prof +*.log +*.sql + # Files used for testing inventree-demo-dataset/ inventree-data/ diff --git a/src/backend/InvenTree/InvenTree/profiling.py b/src/backend/InvenTree/InvenTree/profiling.py new file mode 100644 index 0000000000..bed703a3d3 --- /dev/null +++ b/src/backend/InvenTree/InvenTree/profiling.py @@ -0,0 +1,130 @@ +"""Helper functions for profiling InvenTree code. + +A set of decorators to assist with profiling functions and logging, +which implement oft-repeated patterns used during development and debugging. + +Note: These functions are not to be used in production code. +""" + +from functools import wraps + + +def ensure_debug(): + """Ensure that InvenTree is running in DEBUG mode.""" + from django.conf import settings + + if not settings.DEBUG: + raise RuntimeError('Profiling functions can only be used in DEBUG mode!') + + +def time_function(func): # pragma: no cover + """Decorator to time a function's execution duration. + + Args: + func: Function to be timed + """ + + @wraps(func) + def wrapper(*args, **kwargs): + import time + + ensure_debug() + + start_time = time.time() + result = func(*args, **kwargs) + end_time = time.time() + + duration = end_time - start_time + print(f"Function '{func.__name__}' executed in {duration:.6f} seconds.") + + return result + + return wrapper + + +def profile_function(filename='profile.prof'): # pragma: no cover + """Decorator to profile a function using cProfile. + + Args: + func: Function to be profiled + filename: Output filename for the profiling data + """ + + def decorator(func): + + @wraps(func) + def wrapper(*args, **kwargs): + import cProfile + import io + import pstats + + ensure_debug() + + pr = cProfile.Profile() + pr.enable() + + result = func(*args, **kwargs) + + pr.disable() + s = io.StringIO() + sortby = pstats.SortKey.CUMULATIVE + ps = pstats.Stats(pr, stream=s).sort_stats(sortby) + ps.dump_stats(filename) + print(s.getvalue()) + + return result + + return wrapper + + return decorator + + +def log_slow_queries( + threshold: float = 0.01, n: int = 5, log_to_file: bool = True +): # pragma: no cover + """Decorator to log slow database queries in a Django view function. + + Args: + func: Function to be decorated + threshold: Time threshold (in seconds) for logging slow queries + n: Number of slowest queries to log + log_to_file: Whether to log to a file or print to console + """ + + def decorator(func): + + @wraps(func) + def wrapper(*args, **kwargs): + from django.db import connection + + ensure_debug() + + result = func(*args, **kwargs) + + slow_queries = [ + q for q in connection.queries if float(q.get('time', 0)) >= threshold + ] + slow_queries.sort(key=lambda x: float(x.get('time', 0)), reverse=True) + + log_entries = [] + for query in slow_queries[:n]: + log_entry = f'Time: {query["time"]}s | SQL: {query["sql"]}' + log_entries.append(log_entry) + + if log_entries: + log_message = '\n'.join(log_entries) + if log_to_file: + with open('slow_queries.log', 'w', encoding='utf-8') as f: + f.write(f'Slow queries detected:\n{log_message}\n') + else: + print(f'Slow queries detected:\n{log_message}') + + return result + + return wrapper + + return decorator + + +# Raise an exception if this file is imported outside of DEBUG mode +ensure_debug() From edc68b21ab603f375ddaf24c8937b18b6a11f57b Mon Sep 17 00:00:00 2001 From: Oliver Date: Sat, 13 Dec 2025 16:45:17 +1100 Subject: [PATCH 50/76] [dev] Django silk (#11001) * Add developer support for django-silk * Update docs * Fix typo * Tweak docs * Revert ty version --- docs/docs/api/index.md | 2 +- docs/docs/develop/index.md | 52 +++++ docs/docs/start/config.md | 11 +- docs/mkdocs.yml | 1 + src/backend/InvenTree/InvenTree/settings.py | 10 + src/backend/InvenTree/InvenTree/urls.py | 3 + src/backend/requirements-dev.in | 1 + src/backend/requirements-dev.txt | 220 ++++++++++---------- 8 files changed, 186 insertions(+), 114 deletions(-) create mode 100644 docs/docs/develop/index.md diff --git a/docs/docs/api/index.md b/docs/docs/api/index.md index b65c63b159..58c21fa947 100644 --- a/docs/docs/api/index.md +++ b/docs/docs/api/index.md @@ -106,7 +106,7 @@ response = request.get('http://localhost:8080/api/part/', data=data, headers=hea InvenTree has built-in support for using [oAuth2](https://oauth.net/2/) and OpenID Connect (OIDC) for authentication to the API. This enables using the instance as a very limited identity provider. -A default application using a public client with PKCE enabled ships with each instance. Intended to be used with the python api and configured with very wide scopes this can also be used for quick tests - the cliend_id is `zDFnsiRheJIOKNx6aCQ0quBxECg1QBHtVFDPloJ6`. +A default application using a public client with PKCE enabled ships with each instance. Intended to be used with the python api and configured with very wide scopes this can also be used for quick tests - the client_id is `zDFnsiRheJIOKNx6aCQ0quBxECg1QBHtVFDPloJ6`. #### Managing applications diff --git a/docs/docs/develop/index.md b/docs/docs/develop/index.md new file mode 100644 index 0000000000..cbdbbbd051 --- /dev/null +++ b/docs/docs/develop/index.md @@ -0,0 +1,52 @@ +--- +title: InvenTree Development +--- + +## Introduction + +If you are interested in contributing to InvenTree, then this section is for you! Here you will find information about the architecture of InvenTree, how to set up a development environment, and guidelines for contributing code or documentation. + +### Architecture Overview + +Read the [architecture overview](./architecture.md) to understand the high-level architecture of InvenTree, including how requests are processed, the backend and frontend architecture, and various components of the system. + +### Contribution Guide + +Start with the [contribution guide](./contributing.md) to understand how to get involved with the InvenTree project. + +### Devcontainer Setup + +We provide a [devcontainer](./devcontainer.md) configuration to help you quickly set up a development environment using vscode. + +### Frontend Development + +For information on developing the InvenTree frontend, refer to the [frontend development guide](./react-frontend.md). + +## Profiling Tools + +The InvenTree project supports integrated profiling tools to help developers analyze and optimize performance. Note that the following tools are intended for development use only and should not be enabled in production environments. In fact, they are explicitly disabled unless the server is running in [debug mode](../start/index.md#debug-mode). + +### Django Silk + +[django-silk](https://silk.readthedocs.io/en/latest/) is a profiling tool that can be used to monitor and analyze the performance of Django applications. It provides insights into SQL queries, request/response times, and more. + +To enable django-silk profiling, ensure that the `debug_silk` option is set to `True` in your [config file](../start/config.md#configuration-file). Alternative, you can set the `INVENTREE_DEBUG_SILK` environment variable to enable this feature. + +Once enabled, you can access the silk interface at the `/silk/` endpoint of your InvenTree instance. + +!!! tip "Run Migrations" + If you are enabling django-silk for the first time, you may need to run database migrations to create the necessary tables. You can do this by running `invoke migrate`. + +### Django QueryCount + +Enabling the `INVENTREE_DEBUG_QUERYCOUNT` setting will log (to the terminal) the number of database queries executed for each page load. This can be useful for identifying performance bottlenecks in the InvenTree server. Note that this setting is only available if `INVENTREE_DEBUG` is also enabled. + +### Database Logging + +Enabling the `INVENTREE_DB_LOGGING` setting will log all database queries to the terminal. This can be useful for debugging database-related issues. + +### Internal Profiling Tools + +In addition to the above third-party tools, InvenTree includes some internal profiling tools that can be enabled in debug mode. These tools can be used to provide additional insights into the performance of various components of the InvenTree server. + +These profiling tools can be found in `./src/backend/InvenTree/profiling.py`. diff --git a/docs/docs/start/config.md b/docs/docs/start/config.md index 7e68bf0452..8575be8e03 100644 --- a/docs/docs/start/config.md +++ b/docs/docs/start/config.md @@ -92,7 +92,8 @@ The following debugging / logging options are available: | Environment Variable | Configuration File | Description | Default | | --- | --- | --- | --- | | INVENTREE_DEBUG | debug | Enable [debug mode](./index.md#debug-mode) | False | -| INVENTREE_DEBUG_QUERYCOUNT | debug_querycount | Enable [query count logging](https://github.com/bradmontgomery/django-querycount) in the terminal | False | +| INVENTREE_DEBUG_QUERYCOUNT | debug_querycount | Enable support for [django-querycount](../develop/index.md#django-querycount) middleware. | False | +| INVENTREE_DEBUG_SILK | debug_silk | Enable support for [django-silk](../develop/index.md#django-silk) profiling tool. | False | | INVENTREE_DB_LOGGING | db_logging | Enable logging of database messages | False | | INVENTREE_LOG_LEVEL | log_level | Set level of logging to terminal | WARNING | | INVENTREE_JSON_LOG | json_log | log as json | False | @@ -103,13 +104,7 @@ The following debugging / logging options are available: Enabling the `INVENTREE_DEBUG` setting will turn on [Django debug mode]({% include "django.html" %}/ref/settings/#debug). This mode is intended for development purposes, and should not be enabled in a production environment. Read more about [InvenTree debug mode](./index.md#debug-mode). -### Query Count Logging - -Enabling the `INVENTREE_DEBUG_QUERYCOUNT` setting will log the number of database queries executed for each page load. This can be useful for identifying performance bottlenecks in the InvenTree server. Note that this setting is only available if `INVENTREE_DEBUG` is also enabled. - -### Database Logging - -Enabling the `INVENTREE_DB_LOGGING` setting will log all database queries to the terminal. This can be useful for debugging database-related issues. +In debug mode, there are additional [profiling tools](../develop/index.md#profiling-tools) available to help developers analyze and optimize performance. ## Server Access diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml index 9a1d28c4b2..d9585f3996 100644 --- a/docs/mkdocs.yml +++ b/docs/mkdocs.yml @@ -78,6 +78,7 @@ nav: - Demo: demo.md - Release Notes: releases/release_notes.md - Development: + - InvenTree Development: develop/index.md - Contributing: develop/contributing.md - Architecture: develop/architecture.md - Roadmap: develop/roadmap.md diff --git a/src/backend/InvenTree/InvenTree/settings.py b/src/backend/InvenTree/InvenTree/settings.py index 747f946779..076cc53c96 100644 --- a/src/backend/InvenTree/InvenTree/settings.py +++ b/src/backend/InvenTree/InvenTree/settings.py @@ -367,6 +367,16 @@ MIDDLEWARE = CONFIG.get( ], ) +# In DEBUG mode, add support for django-silk +# Ref: https://silk.readthedocs.io/en/latest/ +DJANGO_SILK_ENABLED = DEBUG and get_boolean_setting( # pragma: no cover + 'INVENTREE_DEBUG_SILK', 'debug_silk', False +) + +if DJANGO_SILK_ENABLED: # pragma: no cover + MIDDLEWARE.append('silk.middleware.SilkyMiddleware') + INSTALLED_APPS.append('silk') + # In DEBUG mode, add support for django-querycount # Ref: https://github.com/bradmontgomery/django-querycount if DEBUG and get_boolean_setting( # pragma: no cover diff --git a/src/backend/InvenTree/InvenTree/urls.py b/src/backend/InvenTree/InvenTree/urls.py index 78ecedc744..2820606347 100644 --- a/src/backend/InvenTree/InvenTree/urls.py +++ b/src/backend/InvenTree/InvenTree/urls.py @@ -186,6 +186,9 @@ urlpatterns.append( if settings.FRONTEND_SETTINGS.get('url_compatibility'): urlpatterns += cui_compatibility_urls(settings.FRONTEND_URL_BASE) +if settings.DJANGO_SILK_ENABLED: + urlpatterns += [path('silk/', include('silk.urls', namespace='silk'))] + # Send any unknown URLs to the index page urlpatterns += [ re_path( diff --git a/src/backend/requirements-dev.in b/src/backend/requirements-dev.in index 686068e18d..5764b6d019 100644 --- a/src/backend/requirements-dev.in +++ b/src/backend/requirements-dev.in @@ -2,6 +2,7 @@ -c requirements.txt coverage[toml] # Unit test coverage django-querycount # Display number of URL queries for requests +django-silk # API query profiling django-slowtests # Show which unit tests are running slowly django-test-migrations # Unit testing for database migrations isort # python import sorting diff --git a/src/backend/requirements-dev.txt b/src/backend/requirements-dev.txt index 9073f95006..126637a2cb 100644 --- a/src/backend/requirements-dev.txt +++ b/src/backend/requirements-dev.txt @@ -104,9 +104,9 @@ cffi==2.0.0 \ # via # -c src/backend/requirements.txt # cryptography -cfgv==3.4.0 \ - --hash=sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9 \ - --hash=sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560 +cfgv==3.5.0 \ + --hash=sha256:a8dc6b26ad22ff227d2634a65cb388215ce6cc96bbcc5cfde7641ae87e8dacc0 \ + --hash=sha256:d5b1034354820651caa73ede66a6294d6e95c1b00acc5e9b098e917404669132 # via pre-commit charset-normalizer==3.4.4 \ --hash=sha256:027f6de494925c0ab2a55eab46ae5129951638a49a34d87f4c3eda90f696b4ad \ @@ -226,103 +226,103 @@ charset-normalizer==3.4.4 \ # -c src/backend/requirements.txt # pdfminer-six # requests -click==8.3.0 \ - --hash=sha256:9b9f285302c6e3064f4330c05f05b81945b2a39544279343e6e7c5f27a9baddc \ - --hash=sha256:e7b8232224eba16f4ebe410c25ced9f7875cb5f3263ffc93cc3e8da705e229c4 +click==8.3.1 \ + --hash=sha256:12ff4785d337a1bb490bb7e9c2b1ee5da3112e94a8622f26a6c77f5d2fc6842a \ + --hash=sha256:981153a64e25f12d547d3426c367a4857371575ee7ad18df2a6183ab0545b2a6 # via pip-tools -coverage[toml]==7.12.0 \ - --hash=sha256:01d24af36fedda51c2b1aca56e4330a3710f83b02a5ff3743a6b015ffa7c9384 \ - --hash=sha256:04a79245ab2b7a61688958f7a855275997134bc84f4a03bc240cf64ff132abf6 \ - --hash=sha256:083631eeff5eb9992c923e14b810a179798bb598e6a0dd60586819fc23be6e60 \ - --hash=sha256:099d11698385d572ceafb3288a5b80fe1fc58bf665b3f9d362389de488361d3d \ - --hash=sha256:09a86acaaa8455f13d6a99221d9654df249b33937b4e212b4e5a822065f12aa7 \ - --hash=sha256:159d50c0b12e060b15ed3d39f87ed43d4f7f7ad40b8a534f4dd331adbb51104a \ - --hash=sha256:172cf3a34bfef42611963e2b661302a8931f44df31629e5b1050567d6b90287d \ - --hash=sha256:22a7aade354a72dff3b59c577bfd18d6945c61f97393bc5fb7bd293a4237024b \ - --hash=sha256:24cff9d1f5743f67db7ba46ff284018a6e9aeb649b67aa1e70c396aa1b7cb23c \ - --hash=sha256:29644c928772c78512b48e14156b81255000dcfd4817574ff69def189bcb3647 \ - --hash=sha256:297bc2da28440f5ae51c845a47c8175a4db0553a53827886e4fb25c66633000c \ - --hash=sha256:2fd8354ed5d69775ac42986a691fbf68b4084278710cee9d7c3eaa0c28fa982a \ - --hash=sha256:313672140638b6ddb2c6455ddeda41c6a0b208298034544cfca138978c6baed6 \ - --hash=sha256:31b8b2e38391a56e3cea39d22a23faaa7c3fc911751756ef6d2621d2a9daf742 \ - --hash=sha256:32b75c2ba3f324ee37af3ccee5b30458038c50b349ad9b88cee85096132a575b \ - --hash=sha256:33baadc0efd5c7294f436a632566ccc1f72c867f82833eb59820ee37dc811c6f \ - --hash=sha256:3ff651dcd36d2fea66877cd4a82de478004c59b849945446acb5baf9379a1b64 \ - --hash=sha256:40c867af715f22592e0d0fb533a33a71ec9e0f73a6945f722a0c85c8c1cbe3a2 \ - --hash=sha256:42435d46d6461a3b305cdfcad7cdd3248787771f53fe18305548cba474e6523b \ - --hash=sha256:459443346509476170d553035e4a3eed7b860f4fe5242f02de1010501956ce87 \ - --hash=sha256:4648158fd8dd9381b5847622df1c90ff314efbfc1df4550092ab6013c238a5fc \ - --hash=sha256:47324fffca8d8eae7e185b5bb20c14645f23350f870c1649003618ea91a78941 \ - --hash=sha256:473dc45d69694069adb7680c405fb1e81f60b2aff42c81e2f2c3feaf544d878c \ - --hash=sha256:4b59b501455535e2e5dde5881739897967b272ba25988c89145c12d772810ccb \ - --hash=sha256:4c589361263ab2953e3c4cd2a94db94c4ad4a8e572776ecfbad2389c626e4507 \ - --hash=sha256:51777647a749abdf6f6fd8c7cffab12de68ab93aab15efc72fbbb83036c2a068 \ - --hash=sha256:52ca620260bd8cd6027317bdd8b8ba929be1d741764ee765b42c4d79a408601e \ - --hash=sha256:5560c7e0d82b42eb1951e4f68f071f8017c824ebfd5a6ebe42c60ac16c6c2434 \ - --hash=sha256:5734b5d913c3755e72f70bf6cc37a0518d4f4745cde760c5d8e12005e62f9832 \ - --hash=sha256:583f9adbefd278e9de33c33d6846aa8f5d164fa49b47144180a0e037f0688bb9 \ - --hash=sha256:58c1c6aa677f3a1411fe6fb28ec3a942e4f665df036a3608816e0847fad23296 \ - --hash=sha256:5b3c889c0b8b283a24d721a9eabc8ccafcfc3aebf167e4cd0d0e23bf8ec4e339 \ - --hash=sha256:5bcead88c8423e1855e64b8057d0544e33e4080b95b240c2a355334bb7ced937 \ - --hash=sha256:5ea5a9f7dc8877455b13dd1effd3202e0bca72f6f3ab09f9036b1bcf728f69ac \ - --hash=sha256:5f3738279524e988d9da2893f307c2093815c623f8d05a8f79e3eff3a7a9e553 \ - --hash=sha256:68b0d0a2d84f333de875666259dadf28cc67858bc8fd8b3f1eae84d3c2bec455 \ - --hash=sha256:6d907ddccbca819afa2cd014bc69983b146cca2735a0b1e6259b2a6c10be1e70 \ - --hash=sha256:6e1a8c066dabcde56d5d9fed6a66bc19a2883a3fe051f0c397a41fc42aedd4cc \ - --hash=sha256:6ff7651cc01a246908eac162a6a86fc0dbab6de1ad165dfb9a1e2ec660b44984 \ - --hash=sha256:737c3814903be30695b2de20d22bcc5428fdae305c61ba44cdc8b3252984c49c \ - --hash=sha256:73f9e7fbd51a221818fd11b7090eaa835a353ddd59c236c57b2199486b116c6d \ - --hash=sha256:76336c19a9ef4a94b2f8dc79f8ac2da3f193f625bb5d6f51a328cd19bfc19933 \ - --hash=sha256:7670d860e18b1e3ee5930b17a7d55ae6287ec6e55d9799982aa103a2cc1fa2ef \ - --hash=sha256:79a44421cd5fba96aa57b5e3b5a4d3274c449d4c622e8f76882d76635501fd13 \ - --hash=sha256:7c1059b600aec6ef090721f8f633f60ed70afaffe8ecab85b59df748f24b31fe \ - --hash=sha256:8638cbb002eaa5d7c8d04da667813ce1067080b9a91099801a0053086e52b736 \ - --hash=sha256:874fe69a0785d96bd066059cd4368022cebbec1a8958f224f0016979183916e6 \ - --hash=sha256:8787b0f982e020adb732b9f051f3e49dd5054cebbc3f3432061278512a2b1360 \ - --hash=sha256:8bb5b894b3ec09dcd6d3743229dc7f2c42ef7787dc40596ae04c0edda487371e \ - --hash=sha256:907e0df1b71ba77463687a74149c6122c3f6aac56c2510a5d906b2f368208560 \ - --hash=sha256:90d58ac63bc85e0fb919f14d09d6caa63f35a5512a2205284b7816cafd21bb03 \ - --hash=sha256:9157a5e233c40ce6613dead4c131a006adfda70e557b6856b97aceed01b0e27a \ - --hash=sha256:91b810a163ccad2e43b1faa11d70d3cf4b6f3d83f9fd5f2df82a32d47b648e0d \ - --hash=sha256:950411f1eb5d579999c5f66c62a40961f126fc71e5e14419f004471957b51508 \ - --hash=sha256:99d5415c73ca12d558e07776bd957c4222c687b9f1d26fa0e1b57e3598bdcde8 \ - --hash=sha256:9b57e2d0ddd5f0582bae5437c04ee71c46cd908e7bc5d4d0391f9a41e812dd12 \ - --hash=sha256:9bb44c889fb68004e94cab71f6a021ec83eac9aeabdbb5a5a88821ec46e1da73 \ - --hash=sha256:a00594770eb715854fb1c57e0dea08cce6720cfbc531accdb9850d7c7770396c \ - --hash=sha256:a1783ed5bd0d5938d4435014626568dc7f93e3cb99bc59188cc18857c47aa3c4 \ - --hash=sha256:a1c59b7dc169809a88b21a936eccf71c3895a78f5592051b1af8f4d59c2b4f92 \ - --hash=sha256:aa124a3683d2af98bd9d9c2bfa7a5076ca7e5ab09fdb96b81fa7d89376ae928f \ - --hash=sha256:aa7d48520a32cb21c7a9b31f81799e8eaec7239db36c3b670be0fa2403828d1d \ - --hash=sha256:b1518ecbad4e6173f4c6e6c4a46e49555ea5679bf3feda5edb1b935c7c44e8a0 \ - --hash=sha256:b1aab7302a87bafebfe76b12af681b56ff446dc6f32ed178ff9c092ca776e6bc \ - --hash=sha256:b2089cc445f2dc0af6f801f0d1355c025b76c24481935303cf1af28f636688f0 \ - --hash=sha256:b365adc70a6936c6b0582dc38746b33b2454148c02349345412c6e743efb646d \ - --hash=sha256:b527a08cdf15753279b7afb2339a12073620b761d79b81cbe2cdebdb43d90daa \ - --hash=sha256:bc13baf85cd8a4cfcf4a35c7bc9d795837ad809775f782f697bf630b7e200211 \ - --hash=sha256:bcec6f47e4cb8a4c2dc91ce507f6eefc6a1b10f58df32cdc61dff65455031dfc \ - --hash=sha256:c406a71f544800ef7e9e0000af706b88465f3573ae8b8de37e5f96c59f689ad1 \ - --hash=sha256:c5a6f20bf48b8866095c6820641e7ffbe23f2ac84a2efc218d91235e404c7777 \ - --hash=sha256:c87395744f5c77c866d0f5a43d97cc39e17c7f1cb0115e54a2fe67ca75c5d14d \ - --hash=sha256:ca8ecfa283764fdda3eae1bdb6afe58bf78c2c3ec2b2edcb05a671f0bba7b3f9 \ - --hash=sha256:cb2a1b6ab9fe833714a483a915de350abc624a37149649297624c8d57add089c \ - --hash=sha256:ccf3b2ede91decd2fb53ec73c1f949c3e034129d1e0b07798ff1d02ea0c8fa4a \ - --hash=sha256:ce61969812d6a98a981d147d9ac583a36ac7db7766f2e64a9d4d059c2fe29d07 \ - --hash=sha256:d6c2e26b481c9159c2773a37947a9718cfdc58893029cdfb177531793e375cfc \ - --hash=sha256:d7e0d0303c13b54db495eb636bc2465b2fb8475d4c8bcec8fe4b5ca454dfbae8 \ - --hash=sha256:d8842f17095b9868a05837b7b1b73495293091bed870e099521ada176aa3e00e \ - --hash=sha256:d93fbf446c31c0140208dcd07c5d882029832e8ed7891a39d6d44bd65f2316c3 \ - --hash=sha256:dcbb630ab034e86d2a0f79aefd2be07e583202f41e037602d438c80044957baa \ - --hash=sha256:e0d68c1f7eabbc8abe582d11fa393ea483caf4f44b0af86881174769f185c94d \ - --hash=sha256:e0f483ab4f749039894abaf80c2f9e7ed77bbf3c737517fb88c8e8e305896a17 \ - --hash=sha256:e71bba6a40883b00c6d571599b4627f50c360b3d0d02bfc658168936be74027b \ - --hash=sha256:e84da3a0fd233aeec797b981c51af1cabac74f9bd67be42458365b30d11b5291 \ - --hash=sha256:e949ebf60c717c3df63adb4a1a366c096c8d7fd8472608cd09359e1bd48ef59f \ - --hash=sha256:f3433ffd541380f3a0e423cff0f4926d55b0cc8c1d160fdc3be24a4c03aa65f7 \ - --hash=sha256:f7ba9da4726e446d8dd8aae5a6cd872511184a5d861de80a86ef970b5dacce3e \ - --hash=sha256:f7bbb321d4adc9f65e402c677cd1c8e4c2d0105d3ce285b51b4d87f1d5db5245 \ - --hash=sha256:f999813dddeb2a56aab5841e687b68169da0d3f6fc78ccf50952fa2463746022 \ - --hash=sha256:fc11e0a4e372cb5f282f16ef90d4a585034050ccda536451901abfb19a57f40c \ - --hash=sha256:fdba9f15849534594f60b47c9a30bc70409b54947319a7c4fd0e8e3d8d2f355d +coverage[toml]==7.13.0 \ + --hash=sha256:0018f73dfb4301a89292c73be6ba5f58722ff79f51593352759c1790ded1cabe \ + --hash=sha256:00c3d22cf6fb1cf3bf662aaaa4e563be8243a5ed2630339069799835a9cc7f9b \ + --hash=sha256:02d9fb9eccd48f6843c98a37bd6817462f130b86da8660461e8f5e54d4c06070 \ + --hash=sha256:0602f701057c6823e5db1b74530ce85f17c3c5be5c85fc042ac939cbd909426e \ + --hash=sha256:06cac81bf10f74034e055e903f5f946e3e26fc51c09fc9f584e4a1605d977053 \ + --hash=sha256:086cede306d96202e15a4b77ace8472e39d9f4e5f9fd92dd4fecdfb2313b2080 \ + --hash=sha256:0900872f2fdb3ee5646b557918d02279dc3af3dfb39029ac4e945458b13f73bc \ + --hash=sha256:0a3a30f0e257df382f5f9534d4ce3d4cf06eafaf5192beb1a7bd066cb10e78fb \ + --hash=sha256:0b3d67d31383c4c68e19a88e28fc4c2e29517580f1b0ebec4a069d502ce1e0bf \ + --hash=sha256:0dfa3855031070058add1a59fdfda0192fd3e8f97e7c81de0596c145dea51820 \ + --hash=sha256:0f4872f5d6c54419c94c25dd6ae1d015deeb337d06e448cd890a1e89a8ee7f3b \ + --hash=sha256:11c21557d0e0a5a38632cbbaca5f008723b26a89d70db6315523df6df77d6232 \ + --hash=sha256:166ad2a22ee770f5656e1257703139d3533b4a0b6909af67c6b4a3adc1c98657 \ + --hash=sha256:193c3887285eec1dbdb3f2bd7fbc351d570ca9c02ca756c3afbc71b3c98af6ef \ + --hash=sha256:1d84e91521c5e4cb6602fe11ece3e1de03b2760e14ae4fcf1a4b56fa3c801fcd \ + --hash=sha256:1ed5630d946859de835a85e9a43b721123a8a44ec26e2830b296d478c7fd4259 \ + --hash=sha256:22486cdafba4f9e471c816a2a5745337742a617fef68e890d8baf9f3036d7833 \ + --hash=sha256:22ccfe8d9bb0d6134892cbe1262493a8c70d736b9df930f3f3afae0fe3ac924d \ + --hash=sha256:24e4e56304fdb56f96f80eabf840eab043b3afea9348b88be680ec5986780a0f \ + --hash=sha256:25dc33618d45456ccb1d37bce44bc78cf269909aa14c4db2e03d63146a8a1493 \ + --hash=sha256:263c3dbccc78e2e331e59e90115941b5f53e85cfcc6b3b2fbff1fd4e3d2c6ea8 \ + --hash=sha256:28ee1c96109974af104028a8ef57cec21447d42d0e937c0275329272e370ebcf \ + --hash=sha256:30a3a201a127ea57f7e14ba43c93c9c4be8b7d17a26e03bb49e6966d019eede9 \ + --hash=sha256:3188936845cd0cb114fa6a51842a304cdbac2958145d03be2377ec41eb285d19 \ + --hash=sha256:367449cf07d33dc216c083f2036bb7d976c6e4903ab31be400ad74ad9f85ce98 \ + --hash=sha256:37eee4e552a65866f15dedd917d5e5f3d59805994260720821e2c1b51ac3248f \ + --hash=sha256:3a10260e6a152e5f03f26db4a407c4c62d3830b9af9b7c0450b183615f05d43b \ + --hash=sha256:3a7b1cd820e1b6116f92c6128f1188e7afe421c7e1b35fa9836b11444e53ebd9 \ + --hash=sha256:3ab483ea0e251b5790c2aac03acde31bff0c736bf8a86829b89382b407cd1c3b \ + --hash=sha256:3ad968d1e3aa6ce5be295ab5fe3ae1bf5bb4769d0f98a80a0252d543a2ef2e9e \ + --hash=sha256:445badb539005283825959ac9fa4a28f712c214b65af3a2c464f1adc90f5fcbc \ + --hash=sha256:453b7ec753cf5e4356e14fe858064e5520c460d3bbbcb9c35e55c0d21155c256 \ + --hash=sha256:494f5459ffa1bd45e18558cd98710c36c0b8fbfa82a5eabcbe671d80ecffbfe8 \ + --hash=sha256:4b5de7d4583e60d5fd246dd57fcd3a8aa23c6e118a8c72b38adf666ba8e7e927 \ + --hash=sha256:4f3e223b2b2db5e0db0c2b97286aba0036ca000f06aca9b12112eaa9af3d92ae \ + --hash=sha256:4fdb6f54f38e334db97f72fa0c701e66d8479af0bc3f9bfb5b90f1c30f54500f \ + --hash=sha256:51a202e0f80f241ccb68e3e26e19ab5b3bf0f813314f2c967642f13ebcf1ddfe \ + --hash=sha256:581f086833d24a22c89ae0fe2142cfaa1c92c930adf637ddf122d55083fb5a0f \ + --hash=sha256:583221913fbc8f53b88c42e8dbb8fca1d0f2e597cb190ce45916662b8b9d9621 \ + --hash=sha256:58632b187be6f0be500f553be41e277712baa278147ecb7559983c6d9faf7ae1 \ + --hash=sha256:5c67dace46f361125e6b9cace8fe0b729ed8479f47e70c89b838d319375c8137 \ + --hash=sha256:5e70f92ef89bac1ac8a99b3324923b4749f008fdbd7aa9cb35e01d7a284a04f9 \ + --hash=sha256:5f5d9bd30756fff3e7216491a0d6d520c448d5124d3d8e8f56446d6412499e74 \ + --hash=sha256:5f8a0297355e652001015e93be345ee54393e45dc3050af4a0475c5a2b767d46 \ + --hash=sha256:62d7c4f13102148c78d7353c6052af6d899a7f6df66a32bddcc0c0eb7c5326f8 \ + --hash=sha256:69ac2c492918c2461bc6ace42d0479638e60719f2a4ef3f0815fa2df88e9f940 \ + --hash=sha256:6abb3a4c52f05e08460bd9acf04fec027f8718ecaa0d09c40ffbc3fbd70ecc39 \ + --hash=sha256:6e63ccc6e0ad8986386461c3c4b737540f20426e7ec932f42e030320896c311a \ + --hash=sha256:6e9e451dee940a86789134b6b0ffbe31c454ade3b849bb8a9d2cca2541a8e91d \ + --hash=sha256:6fb2d5d272341565f08e962cce14cdf843a08ac43bd621783527adb06b089c4b \ + --hash=sha256:71936a8b3b977ddd0b694c28c6a34f4fff2e9dd201969a4ff5d5fc7742d614b0 \ + --hash=sha256:73419b89f812f498aca53f757dd834919b48ce4799f9d5cad33ca0ae442bdb1a \ + --hash=sha256:739c6c051a7540608d097b8e13c76cfa85263ced467168dc6b477bae3df7d0e2 \ + --hash=sha256:7464663eaca6adba4175f6c19354feea61ebbdd735563a03d1e472c7072d27bb \ + --hash=sha256:74c136e4093627cf04b26a35dab8cbfc9b37c647f0502fc313376e11726ba303 \ + --hash=sha256:76541dc8d53715fb4f7a3a06b34b0dc6846e3c69bc6204c55653a85dd6220971 \ + --hash=sha256:7a485ff48fbd231efa32d58f479befce52dcb6bfb2a88bb7bf9a0b89b1bc8030 \ + --hash=sha256:7e442c013447d1d8d195be62852270b78b6e255b79b8675bad8479641e21fd96 \ + --hash=sha256:7f15a931a668e58087bc39d05d2b4bf4b14ff2875b49c994bbdb1c2217a8daeb \ + --hash=sha256:7f88ae3e69df2ab62fb0bc5219a597cb890ba5c438190ffa87490b315190bb33 \ + --hash=sha256:8069e831f205d2ff1f3d355e82f511eb7c5522d7d413f5db5756b772ec8697f8 \ + --hash=sha256:850d2998f380b1e266459ca5b47bc9e7daf9af1d070f66317972f382d46f1904 \ + --hash=sha256:898cce66d0836973f48dda4e3514d863d70142bdf6dfab932b9b6a90ea5b222d \ + --hash=sha256:9097818b6cc1cfb5f174e3263eba4a62a17683bcfe5c4b5d07f4c97fa51fbf28 \ + --hash=sha256:936bc20503ce24770c71938d1369461f0c5320830800933bc3956e2a4ded930e \ + --hash=sha256:9372dff5ea15930fea0445eaf37bbbafbc771a49e70c0aeed8b4e2c2614cc00e \ + --hash=sha256:9987a9e4f8197a1000280f7cc089e3ea2c8b3c0a64d750537809879a7b4ceaf9 \ + --hash=sha256:99acd4dfdfeb58e1937629eb1ab6ab0899b131f183ee5f23e0b5da5cba2fec74 \ + --hash=sha256:9b01c22bc74a7fb44066aaf765224c0d933ddf1f5047d6cdfe4795504a4493f8 \ + --hash=sha256:a00d3a393207ae12f7c49bb1c113190883b500f48979abb118d8b72b8c95c032 \ + --hash=sha256:a23e5a1f8b982d56fa64f8e442e037f6ce29322f1f9e6c2344cd9e9f4407ee57 \ + --hash=sha256:a2bdb3babb74079f021696cb46b8bb5f5661165c385d3a238712b031a12355be \ + --hash=sha256:a394aa27f2d7ff9bc04cf703817773a59ad6dfbd577032e690f961d2460ee936 \ + --hash=sha256:a6c6e16b663be828a8f0b6c5027d36471d4a9f90d28444aa4ced4d48d7d6ae8f \ + --hash=sha256:af0a583efaacc52ae2521f8d7910aff65cdb093091d76291ac5820d5e947fc1c \ + --hash=sha256:af827b7cbb303e1befa6c4f94fd2bf72f108089cfa0f8abab8f4ca553cf5ca5a \ + --hash=sha256:c4be718e51e86f553bcf515305a158a1cd180d23b72f07ae76d6017c3cc5d791 \ + --hash=sha256:cdb3c9f8fef0a954c632f64328a3935988d33a6604ce4bf67ec3e39670f12ae5 \ + --hash=sha256:d10fd186aac2316f9bbb46ef91977f9d394ded67050ad6d84d94ed6ea2e8e54e \ + --hash=sha256:d1e97353dcc5587b85986cda4ff3ec98081d7e84dd95e8b2a6d59820f0545f8a \ + --hash=sha256:d2a9d7f1c11487b1c69367ab3ac2d81b9b3721f097aa409a3191c3e90f8f3dd7 \ + --hash=sha256:de7f6748b890708578fc4b7bb967d810aeb6fcc9bff4bb77dbca77dab2f9df6a \ + --hash=sha256:e5330fa0cc1f5c3c4c3bb8e101b742025933e7848989370a1d4c8c5e401ea753 \ + --hash=sha256:e999e2dcc094002d6e2c7bbc1fb85b58ba4f465a760a8014d97619330cdbbbf3 \ + --hash=sha256:eb76670874fdd6091eedcc856128ee48c41a9bbbb9c3f1c7c3cf169290e3ffd6 \ + --hash=sha256:f1c23e24a7000da892a312fb17e33c5f94f8b001de44b7cf8ba2e36fbd15859e \ + --hash=sha256:f2ffc92b46ed6e6760f1d47a71e56b5664781bc68986dbd1836b2b70c0ce2071 \ + --hash=sha256:f4f72a85316d8e13234cafe0a9f81b40418ad7a082792fa4165bd7d45d96066b \ + --hash=sha256:f59883c643cb19630500f57016f76cfdcd6845ca8c5b5ea1f6e17f74c8e5f511 \ + --hash=sha256:f6aaef16d65d1787280943f1c8718dc32e9cf141014e4634d64446702d26e0ff \ + --hash=sha256:fe81055d8c6c9de76d60c94ddea73c290b416e061d40d542b24a5871bad498b7 \ + --hash=sha256:ff45e0cd8451e293b63ced93161e189780baf444119391b3e7d25315060368a6 # via -r src/backend/requirements-dev.in cryptography==46.0.3 \ --hash=sha256:00a5e7e87938e5ff9ff5447ab086a5706a957137e6e433841e9d24f38a065217 \ @@ -391,22 +391,27 @@ django==5.2.9 \ --hash=sha256:3a4ea88a70370557ab1930b332fd2887a9f48654261cdffda663fef5976bb00a # via # -c src/backend/requirements.txt + # django-silk # django-slowtests # django-stubs # django-stubs-ext django-querycount==0.8.3 \ --hash=sha256:0782484e8a1bd29498fa0195a67106e47cdcc98fafe80cebb1991964077cb694 # via -r src/backend/requirements-dev.in +django-silk==5.4.3 \ + --hash=sha256:bedb17c8fd9c029a7746cb947864f5c9ea943ae33d6a9581e60f67c45e4490ad \ + --hash=sha256:f7920ae91a34716654296140b2cbf449e9798237a0c6eb7cf2cd79c2cfb39321 + # via -r src/backend/requirements-dev.in django-slowtests==1.1.1 \ --hash=sha256:3c6936d420c9df444ac03625b41d97de043c662bbde61fbcd33e4cd407d0c247 # via -r src/backend/requirements-dev.in -django-stubs==5.2.7 \ - --hash=sha256:2864e74b56ead866ff1365a051f24d852f6ed02238959664f558a6c9601c95bf \ - --hash=sha256:2a07e47a8a867836a763c6bba8bf3775847b4fd9555bfa940360e32d0ee384a1 +django-stubs==5.2.8 \ + --hash=sha256:9bba597c9a8ed8c025cae4696803d5c8be1cf55bfc7648a084cbf864187e2f8b \ + --hash=sha256:a3c63119fd7062ac63d58869698d07c9e5ec0561295c4e700317c54e8d26716c # via -r src/backend/requirements-dev.in -django-stubs-ext==5.2.7 \ - --hash=sha256:0466a7132587d49c5bbe12082ac9824d117a0dedcad5d0ada75a6e0d3aca6f60 \ - --hash=sha256:b690655bd4cb8a44ae57abb314e0995dc90414280db8f26fff0cb9fb367d1cac +django-stubs-ext==5.2.8 \ + --hash=sha256:1dd5470c9675591362c78a157a3cf8aec45d0e7a7f0cf32f227a1363e54e0652 \ + --hash=sha256:b39938c46d7a547cd84e4a6378dbe51a3dd64d70300459087229e5fee27e5c6b # via django-stubs django-test-migrations==1.5.0 \ --hash=sha256:1cbff04b1e82c5564a6f635284907b381cc11a2ff883adff46776d9126824f07 \ @@ -420,6 +425,10 @@ filelock==3.20.0 \ --hash=sha256:339b4732ffda5cd79b13f4e2711a31b0365ce445d95d243bb996273d072546a2 \ --hash=sha256:711e943b4ec6be42e1d4e6690b48dc175c822967466bb31c0c293f34334c13f4 # via virtualenv +gprof2dot==2025.4.14 \ + --hash=sha256:0742e4c0b4409a5e8777e739388a11e1ed3750be86895655312ea7c20bd0090e \ + --hash=sha256:35743e2d2ca027bf48fa7cba37021aaf4a27beeae1ae8e05a50b55f1f921a6ce + # via django-silk identify==2.6.15 \ --hash=sha256:1181ef7608e00704db228516541eb83a88a9f94433a8c80bb9b5bd54b1d81757 \ --hash=sha256:e4f4864b96c6557ef2a1e1c951771838f4edc9df3a72ec7118b338801b11c7bf @@ -578,6 +587,7 @@ sqlparse==0.5.3 \ # via # -c src/backend/requirements.txt # django + # django-silk tomli==2.3.0 \ --hash=sha256:00b5f5d95bbfc7d12f91ad8c593a1659b6387b43f054104cda404be6bda62456 \ --hash=sha256:0a154a9ae14bfcf5d8917a59b51ffd5a3ac1fd149b71b47a3a104ca4edcfa845 \ From 0a2b53789a677712ba6a125a1195a5f68fdfca8f Mon Sep 17 00:00:00 2001 From: Oliver Date: Sat, 13 Dec 2025 20:11:53 +1100 Subject: [PATCH 51/76] [dev] django silk - advanced profiling (#11004) * django silk - advanced profiling - Adds option for enabling advanced silk profiling * Enable binary file generation --- docs/docs/develop/index.md | 4 ++++ docs/docs/start/config.md | 1 + src/backend/InvenTree/InvenTree/settings.py | 5 +++++ src/backend/InvenTree/config_template.yaml | 2 ++ 4 files changed, 12 insertions(+) diff --git a/docs/docs/develop/index.md b/docs/docs/develop/index.md index cbdbbbd051..907d12099a 100644 --- a/docs/docs/develop/index.md +++ b/docs/docs/develop/index.md @@ -37,6 +37,10 @@ Once enabled, you can access the silk interface at the `/silk/` endpoint of your !!! tip "Run Migrations" If you are enabling django-silk for the first time, you may need to run database migrations to create the necessary tables. You can do this by running `invoke migrate`. +#### Detailed Profiling + +To enable detailed profiling in django-silk, set the `INVENTREE_DEBUG_SILK_PROFILING` environment variable to `True`, or set the `debug_silk_profiling` option to `True` in your config file. This will enable more granular profiling features within django-silk. Refer to the [django-silk documentation](https://github.com/jazzband/django-silk#profiling) for more information. + ### Django QueryCount Enabling the `INVENTREE_DEBUG_QUERYCOUNT` setting will log (to the terminal) the number of database queries executed for each page load. This can be useful for identifying performance bottlenecks in the InvenTree server. Note that this setting is only available if `INVENTREE_DEBUG` is also enabled. diff --git a/docs/docs/start/config.md b/docs/docs/start/config.md index 8575be8e03..c739ad2a97 100644 --- a/docs/docs/start/config.md +++ b/docs/docs/start/config.md @@ -94,6 +94,7 @@ The following debugging / logging options are available: | INVENTREE_DEBUG | debug | Enable [debug mode](./index.md#debug-mode) | False | | INVENTREE_DEBUG_QUERYCOUNT | debug_querycount | Enable support for [django-querycount](../develop/index.md#django-querycount) middleware. | False | | INVENTREE_DEBUG_SILK | debug_silk | Enable support for [django-silk](../develop/index.md#django-silk) profiling tool. | False | +| INVENTREE_DEBUG_SILK_PROFILING | debug_silk_profiling | Enable detailed profiling in django-silk | False | | INVENTREE_DB_LOGGING | db_logging | Enable logging of database messages | False | | INVENTREE_LOG_LEVEL | log_level | Set level of logging to terminal | WARNING | | INVENTREE_JSON_LOG | json_log | log as json | False | diff --git a/src/backend/InvenTree/InvenTree/settings.py b/src/backend/InvenTree/InvenTree/settings.py index 076cc53c96..7becfe63c5 100644 --- a/src/backend/InvenTree/InvenTree/settings.py +++ b/src/backend/InvenTree/InvenTree/settings.py @@ -377,6 +377,11 @@ if DJANGO_SILK_ENABLED: # pragma: no cover MIDDLEWARE.append('silk.middleware.SilkyMiddleware') INSTALLED_APPS.append('silk') + # Optionally enable the silk python profiler + SILKY_PYTHON_PROFILER = SILKY_PYTHON_PROFILER_BINARY = get_boolean_setting( + 'INVENTREE_DEBUG_SILK_PROFILING', 'debug_silk_profiling', False + ) + # In DEBUG mode, add support for django-querycount # Ref: https://github.com/bradmontgomery/django-querycount if DEBUG and get_boolean_setting( # pragma: no cover diff --git a/src/backend/InvenTree/config_template.yaml b/src/backend/InvenTree/config_template.yaml index 4fa23d3eb3..f08d86a84d 100644 --- a/src/backend/InvenTree/config_template.yaml +++ b/src/backend/InvenTree/config_template.yaml @@ -36,6 +36,8 @@ debug: False # Additional debug options debug_querycount: False +debug_silk: False +debug_silk_profiling: False debug_shell: False # Set to False to disable the admin interface, or use the environment variable INVENTREE_ADMIN_ENABLED From 2600690fc18f4f37b6d62f4fd564bc39ca775f8d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 14 Dec 2025 07:01:09 +1100 Subject: [PATCH 52/76] chore(deps): bump the dependencies group across 1 directory with 2 updates (#11003) * chore(deps): bump the dependencies group across 1 directory with 2 updates Bumps the dependencies group with 2 updates in the /src/backend directory: [django-q2](https://github.com/GDay/django-q2) and [sentry-sdk](https://github.com/getsentry/sentry-python). Updates `django-q2` from 1.8.0 to 1.9.0 - [Release notes](https://github.com/GDay/django-q2/releases) - [Changelog](https://github.com/django-q2/django-q2/blob/master/CHANGELOG.md) - [Commits](https://github.com/GDay/django-q2/compare/v1.8.0...v1.9.0) Updates `sentry-sdk` from 2.46.0 to 2.47.0 - [Release notes](https://github.com/getsentry/sentry-python/releases) - [Changelog](https://github.com/getsentry/sentry-python/blob/master/CHANGELOG.md) - [Commits](https://github.com/getsentry/sentry-python/compare/2.46.0...2.47.0) --- updated-dependencies: - dependency-name: django-q2 dependency-version: 1.9.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: sentry-sdk dependency-version: 2.47.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies ... Signed-off-by: dependabot[bot] * fix style --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Matthias Mair --- src/backend/requirements.txt | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/backend/requirements.txt b/src/backend/requirements.txt index 7dd5272c85..e012fd8d81 100644 --- a/src/backend/requirements.txt +++ b/src/backend/requirements.txt @@ -600,9 +600,9 @@ django-picklefield==3.3 \ django-q-sentry==0.1.6 \ --hash=sha256:9b8b4d7fad253a7d9a47f2c2ab0d9dea83078b7ef45c8849dbb1e4176ef8d050 # via -r src/backend/requirements.in -django-q2==1.8.0 \ - --hash=sha256:78aaaf18dff1ad3e35bcf6556666f2c26494120f0b75961c13206e37d180dfaa \ - --hash=sha256:e86b9625c0ce57a5ae31ca8fd7e798d63b9ef91a227c52f8b47536ba50b2b284 +django-q2==1.9.0 \ + --hash=sha256:4eded27644b0ffb291839c9f9c12fea6c0dec63ebd891fa6881b0b446098a49d \ + --hash=sha256:ef7facca96fae9c11ddf2c5252d3817975c7a9a6d989fa0d65487d8823d57799 # via -r src/backend/requirements.in django-recurrence==1.11.1 \ --hash=sha256:0c65f30872599b5813a9bab6952dada23c55894f28674490a753ada559f14bc5 \ @@ -1824,9 +1824,9 @@ s3transfer==0.14.0 \ --hash=sha256:ea3b790c7077558ed1f02a3072fb3cb992bbbd253392f4b6e9e8976941c7d456 \ --hash=sha256:eff12264e7c8b4985074ccce27a3b38a485bb7f7422cc8046fee9be4983e4125 # via boto3 -sentry-sdk==2.46.0 \ - --hash=sha256:4eeeb60198074dff8d066ea153fa6f241fef1668c10900ea53a4200abc8da9b1 \ - --hash=sha256:91821a23460725734b7741523021601593f35731808afc0bb2ba46c27b8acd91 +sentry-sdk==2.47.0 \ + --hash=sha256:8218891d5e41b4ea8d61d2aed62ed10c80e39d9f2959d6f939efbf056857e050 \ + --hash=sha256:d72f8c61025b7d1d9e52510d03a6247b280094a327dd900d987717a4fce93412 # via # -r src/backend/requirements.in # django-q-sentry From d3d957e924f630599fa8a3092529a6ed470d36c1 Mon Sep 17 00:00:00 2001 From: Michael Date: Sat, 13 Dec 2025 23:38:49 +0100 Subject: [PATCH 53/76] Rearrange python package installs in are metal setup (#11005) * Reorder pip installation steps in bare metal setup * Reorder pip installation steps in bare metal setup * remove unused lines --- docs/docs/start/install.md | 61 ++++++++++++++++++++++++++++---------- 1 file changed, 45 insertions(+), 16 deletions(-) diff --git a/docs/docs/start/install.md b/docs/docs/start/install.md index 80e5eaba06..4d888a6c1a 100644 --- a/docs/docs/start/install.md +++ b/docs/docs/start/install.md @@ -108,6 +108,26 @@ The Python packages required by the InvenTree server must be installed into the ``` pip install --upgrade --ignore-installed invoke +``` + +#### Install Python Bindings + +Depending on your database the python bindings must also be installed (into your virtual environment). +For PostgreSQL install: + +``` +pip3 install psycopg pgcli +``` + +For MySQL install: + +``` +pip3 install mysqlclient mariadb +``` + +If all packages have been installed run: + +``` invoke install ``` @@ -136,6 +156,31 @@ And start the postgresql service: sudo service postgresql start ``` +This installs all required Python packages using pip package manager. It also creates a (default) database configuration file which needs to be edited to meet user needs before proceeding (see next step below). + +## Create Database + +As part of the initial setup, an empty database needs to be created. Follow the instructions below particular to your database engine of choice: + +### PostgreSQL + +#### Install PostgreSQL + +Install required system packages: + +!!! info "Sudo Actions" + Perform sudo actions from a separate shell, as 'inventree' user does not have sudo access + +``` +sudo apt-get install postgresql postgresql-contrib libpq-dev +``` + +And start the postgresql service: + +``` +sudo service postgresql start +``` + #### Create Database and User We need to create new database, and a postgres user to allow database access. @@ -155,14 +200,6 @@ grant all privileges on database inventree to myuser; !!! info "Username / Password" You should change the username and password from the values specified above. This username and password will also be for the InvenTree database connection configuration. -#### Install Python Bindings - -The PostgreSQL python binding must also be installed (into your virtual environment): - -``` -pip3 install psycopg pgcli -``` - #### Install Postgresql client If PostgreSQL and InvenTree are installed on separate servers / containers the PostgreSQL client has to be installed also where InvenTree is running. @@ -184,14 +221,6 @@ To run InvenTree with the MySQL or MariaDB backends, a number of extra packages sudo apt-get install mysql-server libmysqlclient-dev ``` -#### Install Python Bindings - -Install the python bindings for MySQL (into the python virtual environment). - -``` -pip3 install mysqlclient mariadb -``` - #### Create Database Assuming the MySQL server is installed and running, login to the MySQL server as follows: From be8911eed329b1120483e4e2dad0b8181c9677bb Mon Sep 17 00:00:00 2001 From: Oliver Date: Sun, 14 Dec 2025 17:58:59 +1100 Subject: [PATCH 54/76] Fix docs formatting (#11008) --- docs/docs/start/install.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/docs/start/install.md b/docs/docs/start/install.md index 4d888a6c1a..d8be8b9924 100644 --- a/docs/docs/start/install.md +++ b/docs/docs/start/install.md @@ -112,7 +112,8 @@ pip install --upgrade --ignore-installed invoke #### Install Python Bindings -Depending on your database the python bindings must also be installed (into your virtual environment). +Depending on your database the python bindings must also be installed (into your virtual environment). + For PostgreSQL install: ``` From 2a20eeb033c0631c2684b81a6952a0db4ae47468 Mon Sep 17 00:00:00 2001 From: Oliver Date: Sun, 14 Dec 2025 19:08:42 +1100 Subject: [PATCH 55/76] Remove prefetch_related from parametric data filter (#11007) - Not required as we do not process the parameter fields in python --- src/backend/InvenTree/common/filters.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/backend/InvenTree/common/filters.py b/src/backend/InvenTree/common/filters.py index a7968dbfc1..98237648d6 100644 --- a/src/backend/InvenTree/common/filters.py +++ b/src/backend/InvenTree/common/filters.py @@ -183,8 +183,6 @@ def filter_parameters_by_value( # Combine the queries based on whether we are filtering by text or numeric value q = query_text if text_only else query_text | query_numeric - # queryset = Parameter.objects.prefetch_related('template').all() - # Special handling for the '__ne' (not equal) operator # In this case, we want the *opposite* of the above queries if invert: @@ -216,8 +214,6 @@ def filter_parametric_data(queryset: QuerySet, parameters: dict[str, str]) -> Qu Typically these filters would be provided against via an API request. """ - queryset = queryset.prefetch_related('parameters_list', 'parameters_list__template') - # Allowed lookup operations for parameter values operators = '|'.join(PARAMETER_FILTER_OPERATORS) From 9c6d16baba79e6befb6dbe584612ff92f5801d42 Mon Sep 17 00:00:00 2001 From: Oliver Date: Sun, 14 Dec 2025 19:08:52 +1100 Subject: [PATCH 56/76] [refactor] Generic status API (#11009) * Fix docs formatting * [refactor] cache custom states - Generic state API endpoint executed query for each state type - We can run a single database query and cache these in memory - Reduces query time by ~50% --- src/backend/InvenTree/generic/states/api.py | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/src/backend/InvenTree/generic/states/api.py b/src/backend/InvenTree/generic/states/api.py index 925fc772ce..4047c69161 100644 --- a/src/backend/InvenTree/generic/states/api.py +++ b/src/backend/InvenTree/generic/states/api.py @@ -129,11 +129,24 @@ class AllStatusViews(StatusView): # Find all inherited status classes status_classes = inheritors(StatusCode) - for cls in status_classes: - cls_data = {'status_class': cls.__name__, 'values': cls.dict()} + # Pre-fetch all custom values from the database + # This reduces the number of queries required + from common.models import InvenTreeCustomUserStateModel - # Extend with custom values - for item in cls.custom_values(): + custom_states_map = {} + for state in InvenTreeCustomUserStateModel.objects.all(): + key = state.reference_status + if key not in custom_states_map: + custom_states_map[key] = [] + custom_states_map[key].append(state) + + for cls in status_classes: + cls_data = {'status_class': cls.__name__, 'values': cls.dict(custom=False)} + + # Extend with custom values (from pre-cached queryset) + custom_states = custom_states_map.get(cls.__name__, []) + + for item in custom_states: label = str(item.name) if label not in cls_data['values']: cls_data['values'][label] = { From 0460e81f9ae7af913d18024f5372970d1e6b73eb Mon Sep 17 00:00:00 2001 From: Oliver Date: Sun, 14 Dec 2025 19:09:01 +1100 Subject: [PATCH 57/76] [refactor] Build list (#11010) - Prefetch project_code - Annotate parameter data --- src/backend/InvenTree/build/api.py | 13 +++---------- src/backend/InvenTree/build/serializers.py | 2 ++ 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/src/backend/InvenTree/build/api.py b/src/backend/InvenTree/build/api.py index 5e1901f58a..6ecb34b222 100644 --- a/src/backend/InvenTree/build/api.py +++ b/src/backend/InvenTree/build/api.py @@ -317,14 +317,15 @@ class BuildMixin: """Return the queryset for the Build API endpoints.""" queryset = super().get_queryset() + queryset = build.serializers.BuildSerializer.annotate_queryset(queryset) + queryset = queryset.prefetch_related( 'responsible', 'issued_by', 'build_lines', - 'build_lines__bom_item', - 'build_lines__build', 'part', 'part__pricing_data', + 'project_code', ) return queryset @@ -384,14 +385,6 @@ class BuildList( 'priority', ] - def get_queryset(self): - """Override the queryset filtering, as some of the fields don't natively play nicely with DRF.""" - queryset = super().get_queryset().select_related('part') - - queryset = build.serializers.BuildSerializer.annotate_queryset(queryset) - - return queryset - def get_serializer(self, *args, **kwargs): """Add extra context information to the endpoint serializer.""" kwargs['create'] = True diff --git a/src/backend/InvenTree/build/serializers.py b/src/backend/InvenTree/build/serializers.py index cdef3a31ed..9d7f80b9e1 100644 --- a/src/backend/InvenTree/build/serializers.py +++ b/src/backend/InvenTree/build/serializers.py @@ -192,6 +192,8 @@ class BuildSerializer( ) ) + queryset = Build.annotate_parameters(queryset) + return queryset def __init__(self, *args, **kwargs): From a727c4e2f94bffa445e77956e47865abcf6eb4ee Mon Sep 17 00:00:00 2001 From: Mitch Davis Date: Sun, 14 Dec 2025 21:26:06 +1100 Subject: [PATCH 58/76] Improve the documentation installation instructions. (#11011) Co-authored-by: Mitch Davis --- docs/README.md | 74 ++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 63 insertions(+), 11 deletions(-) diff --git a/docs/README.md b/docs/README.md index 41f0287f81..5d51b82029 100644 --- a/docs/README.md +++ b/docs/README.md @@ -4,32 +4,82 @@ This repository hosts the [official documentation](https://inventree.readthedocs.io/) for [InvenTree](https://github.com/inventree/inventree), an open source inventory management system. -To serve this documentation locally (e.g. for development), you will need to have Python 3 installed on your system. +## Prerequisites -## Setup +InvenTree uses [MkDocs](https://www.mkdocs.org/) to convert [Markdown](https://www.mkdocs.org/user-guide/writing-your-docs/#writing-with-markdown) format `.md` files into HTML suitable for viewing in a web browser. -Run the following commands from the top-level project directory: +!!! info "Prerequisites" + To build and serve this documentation locally (e.g. for development), you will need: + + * Python 3 installed on your system. + * An existing InvenTree installation containing the virtual environment that was created during installation. + + These instructions assume you followed the [InvenTree bare metal installation instructions](./docs/start/install.md), so you'll have an `inventree` user, a home directory at `/home/inventree`, the InvenTree source code cloned from [GitHub](https://github.com/inventree/inventree) into `/home/inventree/src`, and a virtual environment at `/home/inventree/env`. If you installed InvenTree some other way, this might vary, and you'll have to adjust these instructions accordingly. + +!!! warning "Your InvenTree install will be updated!" + Some of the commands that follow will make changes to your install, for example, by running any pending database migrations. There's a small risk this may cause issues with your existing installation. If you can't risk this, consider setting up a separate InvenTree installation specifically for documentation development. + +## Building the documentation locally + +To build the documentation locally, run these commands as the `inventree` user: ``` -$ git clone https://github.com/inventree/inventree +$ cd /home/inventree +$ source env/bin/activate +``` + +!!! info "(env) prefix" + The shell prompt should now display the `(env)` prefix, showing that you are operating within the context of the python virtual environment + +You can now install the additional packages needed by mkdocs: + +``` +$ cd src $ pip install --require-hashes -r docs/requirements.txt ``` ## Build Documentation -Before serving the documentation, you will need to build the documentation files: +Before serving the documentation, you will need to build the API schema files from the source code, so they can be included in the documentation: ``` invoke build-docs ``` -This is required to generate the required API schema files, and must be run before the documentation can be served. +!!! tip + This command is only required when building the documentation for the first time, or when changes have been made to the API schema. -Note that this command is only required when building the documentation for the first time, or when changes have been made to the API schema. +## Serve Local files -## Serve Locally +``` +$ invoke build-docs +``` -To serve the pages locally, run the following command (from the top-level project directory): +You will see output similar to this (truncated for brevity): +``` +Running InvenTree database migrations... +Exporting definitions... +Exporting settings definition to '/home/inventree/src/docs/generated/inventree_settings.json'... +Exported InvenTree settings definitions to '/home/inventree/src/docs/generated/inventree_settings.json' +Exported InvenTree tag definitions to '/home/inventree/src/docs/generated/inventree_tags.yml' +Exported InvenTree filter definitions to '/home/inventree/src/docs/generated/inventree_filters.yml' +Exported InvenTree report context definitions to '/home/inventree/src/docs/generated/inventree_report_context.json' +Exporting definitions complete +Exporting schema file to '/home/inventree/src/docs/generated/schema.yml' + +Schema export completed: /home/inventree/src/docs/generated/schema.yml +Documentation build complete, but mkdocs not requested +``` + +If that worked, you can now generate the HTML format documentation pages: + +``` +$ mkdocs build -f docs/mkdocs.yml +``` + +## Viewing the generated output + +To view the documentation locally, run the following command to start the MkDocs webpage server: ``` $ mkdocs serve -f docs/mkdocs.yml -a localhost:8080 @@ -47,9 +97,11 @@ To see all the available options: invoke dev.docs-server --help ``` -## Edit Documentation Files +You can then point your web browser at http://localhost:8080/ -Once the server is running, it will monitor the documentation files for any changes, and update the served pages. +## Editing the Documentation Files + +Once the server is running, it will monitor the documentation files for any changes, and regenerate the HTML pages. ### Admonitions From 71c2f5ca735c041c5faa849832635da2e58883a0 Mon Sep 17 00:00:00 2001 From: Oliver Date: Sun, 14 Dec 2025 21:54:07 +1100 Subject: [PATCH 59/76] [refactor] Improve primary_address annotation for Company API (#11006) * Refactor primary_address annotation - Remove SerializerMethodField - Better cache introspection * Allow address detail to be optional * Refactor address caching * Fix primary_address annotation * Remove "address_count" field - Pointless annotation which is not used anywhere * Update API version * Tweak docs page * Tweak unit tests --- .../InvenTree/InvenTree/api_version.py | 7 +++- src/backend/InvenTree/InvenTree/models.py | 7 ++-- src/backend/InvenTree/company/models.py | 10 ++++-- src/backend/InvenTree/company/serializers.py | 33 +++---------------- src/backend/InvenTree/part/test_api.py | 4 +-- 5 files changed, 26 insertions(+), 35 deletions(-) diff --git a/src/backend/InvenTree/InvenTree/api_version.py b/src/backend/InvenTree/InvenTree/api_version.py index 324e08988d..91e54fa77c 100644 --- a/src/backend/InvenTree/InvenTree/api_version.py +++ b/src/backend/InvenTree/InvenTree/api_version.py @@ -1,11 +1,16 @@ """InvenTree API version information.""" # InvenTree API version -INVENTREE_API_VERSION = 430 +INVENTREE_API_VERSION = 431 """Increment this API version number whenever there is a significant change to the API that any clients need to know about.""" INVENTREE_API_TEXT = """ +v431 -> 2025-12-14 : https://github.com/inventree/InvenTree/pull/11006 + - Remove duplicate "address" field on the Company API endpoint + - Make "primary_address" field optional on the Company API endpoint + - Remove "address_count" field from the Company API endpoint + v430 -> 2025-12-04 : https://github.com/inventree/InvenTree/pull/10699 - Removed the "PartParameter" and "PartParameterTemplate" API endpoints - Removed the "ManufacturerPartParameter" API endpoint diff --git a/src/backend/InvenTree/InvenTree/models.py b/src/backend/InvenTree/InvenTree/models.py index c3f5b42f93..978b11532c 100644 --- a/src/backend/InvenTree/InvenTree/models.py +++ b/src/backend/InvenTree/InvenTree/models.py @@ -537,7 +537,9 @@ class InvenTreeParameterMixin(InvenTreePermissionCheckMixin, models.Model): return queryset.prefetch_related( 'parameters_list', 'parameters_list__model_type', + 'parameters_list__updated_by', 'parameters_list__template', + 'parameters_list__template__model_type', ) @property @@ -547,8 +549,9 @@ class InvenTreeParameterMixin(InvenTreePermissionCheckMixin, models.Model): This will return pre-fetched data if available (i.e. in a serializer context). """ # Check the query cache for pre-fetched parameters - if 'parameters_list' in getattr(self, '_prefetched_objects_cache', {}): - return self._prefetched_objects_cache['parameters_list'] + if cache := getattr(self, '_prefetched_objects_cache', None): + if 'parameters_list' in cache: + return cache['parameters_list'] return self.parameters_list.all() diff --git a/src/backend/InvenTree/company/models.py b/src/backend/InvenTree/company/models.py index fbe8ccdd01..4e83275df7 100644 --- a/src/backend/InvenTree/company/models.py +++ b/src/backend/InvenTree/company/models.py @@ -238,8 +238,14 @@ class Company( @property def primary_address(self): - """Returns address object of primary address. Parsed by serializer.""" - return Address.objects.filter(company=self.id).filter(primary=True).first() + """Returns address object of primary address for this Company.""" + # We may have a pre-fetched primary address list + if hasattr(self, 'primary_address_list'): + addresses = self.primary_address_list + return addresses[0] if len(addresses) > 0 else None + + # Otherwise, query the database + return self.addresses.filter(primary=True).first() @property def currency_code(self): diff --git a/src/backend/InvenTree/company/serializers.py b/src/backend/InvenTree/company/serializers.py index ba68d4a42b..67fbfe763e 100644 --- a/src/backend/InvenTree/company/serializers.py +++ b/src/backend/InvenTree/company/serializers.py @@ -6,7 +6,6 @@ from django.core.files.base import ContentFile from django.db.models import Prefetch from django.utils.translation import gettext_lazy as _ -from drf_spectacular.utils import extend_schema_field from rest_framework import serializers from sql_util.utils import SubqueryCount from taggit.serializers import TagListSerializerField @@ -136,7 +135,6 @@ class CompanySerializer( 'website', 'name', 'phone', - 'address', 'email', 'currency', 'contact', @@ -150,7 +148,6 @@ class CompanySerializer( 'parts_supplied', 'parts_manufactured', 'remote_image', - 'address_count', 'primary_address', 'tax_id', 'parameters', @@ -166,8 +163,6 @@ class CompanySerializer( queryset = queryset.annotate(parts_supplied=SubqueryCount('supplied_parts')) - queryset = queryset.annotate(address_count=SubqueryCount('addresses')) - queryset = queryset.prefetch_related( Prefetch( 'addresses', @@ -180,30 +175,12 @@ class CompanySerializer( return queryset - address = serializers.SerializerMethodField( - label=_('Primary Address'), - help_text=_( - 'Return the string representation for the primary address. This property exists for backwards compatibility.' - ), - allow_null=True, + primary_address = enable_filter( + AddressBriefSerializer(read_only=True, allow_null=True), + True, + filter_name='address_detail', ) - primary_address = serializers.SerializerMethodField(allow_null=True) - - @extend_schema_field(serializers.CharField()) - def get_address(self, obj): - """Return string version of primary address (for backwards compatibility).""" - if hasattr(obj, 'primary_address_list') and obj.primary_address_list: - return str(obj.primary_address_list[0]) - return None - - @extend_schema_field(AddressSerializer()) - def get_primary_address(self, obj): - """Return full address object for primary address using prefetch data.""" - if hasattr(obj, 'primary_address_list') and obj.primary_address_list: - return AddressSerializer(obj.primary_address_list[0]).data - return None - image = InvenTreeImageSerializerField(required=False, allow_null=True) email = serializers.EmailField( @@ -211,8 +188,8 @@ class CompanySerializer( ) parts_supplied = serializers.IntegerField(read_only=True) + parts_manufactured = serializers.IntegerField(read_only=True) - address_count = serializers.IntegerField(read_only=True) currency = InvenTreeCurrencySerializer( help_text=_('Default currency used for this supplier'), required=True diff --git a/src/backend/InvenTree/part/test_api.py b/src/backend/InvenTree/part/test_api.py index fb70ed442b..2deb287f08 100644 --- a/src/backend/InvenTree/part/test_api.py +++ b/src/backend/InvenTree/part/test_api.py @@ -2065,8 +2065,8 @@ class PartListTests(PartAPITestBase): if b and result['category'] is not None: self.assertIn('category_detail', result) - # No more than 22 DB queries - self.assertLessEqual(len(ctx), 22) + # No more than 25 DB queries + self.assertLessEqual(len(ctx), 25) def test_price_breaks(self): """Test that price_breaks parameter works correctly and efficiently.""" From 6cbed50794401f1376d40f45b5368219d981d9fe Mon Sep 17 00:00:00 2001 From: Michael Date: Mon, 15 Dec 2025 22:59:49 +0100 Subject: [PATCH 60/76] Remove dublicate lines (#11016) --- docs/docs/start/install.md | 25 ------------------------- 1 file changed, 25 deletions(-) diff --git a/docs/docs/start/install.md b/docs/docs/start/install.md index d8be8b9924..b9276928c2 100644 --- a/docs/docs/start/install.md +++ b/docs/docs/start/install.md @@ -157,31 +157,6 @@ And start the postgresql service: sudo service postgresql start ``` -This installs all required Python packages using pip package manager. It also creates a (default) database configuration file which needs to be edited to meet user needs before proceeding (see next step below). - -## Create Database - -As part of the initial setup, an empty database needs to be created. Follow the instructions below particular to your database engine of choice: - -### PostgreSQL - -#### Install PostgreSQL - -Install required system packages: - -!!! info "Sudo Actions" - Perform sudo actions from a separate shell, as 'inventree' user does not have sudo access - -``` -sudo apt-get install postgresql postgresql-contrib libpq-dev -``` - -And start the postgresql service: - -``` -sudo service postgresql start -``` - #### Create Database and User We need to create new database, and a postgres user to allow database access. From 1e120c3589e3b4eb2dacfbd71d11d2e18b1209c2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 16 Dec 2025 09:04:49 +1100 Subject: [PATCH 61/76] chore(deps): bump the dependencies group with 3 updates (#11018) Bumps the dependencies group with 3 updates: [actions/checkout](https://github.com/actions/checkout), [actions/stale](https://github.com/actions/stale) and [crowdin/github-action](https://github.com/crowdin/github-action). Updates `actions/checkout` from 6.0.0 to 6.0.1 - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/1af3b93b6815bc44a9784bd300feb67ff0d1eeb3...8e8c483db84b4bee98b60c0593521ed34d9990e8) Updates `actions/stale` from 10.1.0 to 10.1.1 - [Release notes](https://github.com/actions/stale/releases) - [Changelog](https://github.com/actions/stale/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/stale/compare/5f858e3efba33a5ca4407a664cc011ad407f2008...997185467fa4f803885201cee163a9f38240193d) Updates `crowdin/github-action` from 2.12.0 to 2.13.0 - [Release notes](https://github.com/crowdin/github-action/releases) - [Commits](https://github.com/crowdin/github-action/compare/08713f00a50548bfe39b37e8f44afb53e7a802d4...60debf382ee245b21794321190ad0501db89d8c1) --- updated-dependencies: - dependency-name: actions/checkout dependency-version: 6.0.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: actions/stale dependency-version: 10.1.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: crowdin/github-action dependency-version: 2.13.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/check_translations.yaml | 2 +- .github/workflows/docker.yaml | 8 +++--- .github/workflows/qc_checks.yaml | 30 +++++++++++------------ .github/workflows/release.yaml | 6 ++--- .github/workflows/scorecard.yaml | 2 +- .github/workflows/stale.yaml | 2 +- .github/workflows/translations.yaml | 4 +-- 7 files changed, 27 insertions(+), 27 deletions(-) diff --git a/.github/workflows/check_translations.yaml b/.github/workflows/check_translations.yaml index e41cc7befe..7f3cf46758 100644 --- a/.github/workflows/check_translations.yaml +++ b/.github/workflows/check_translations.yaml @@ -31,7 +31,7 @@ jobs: steps: - name: Checkout Code - uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # pin@v6.0.0 + uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # pin@v6.0.1 with: persist-credentials: false diff --git a/.github/workflows/docker.yaml b/.github/workflows/docker.yaml index 0637e6ec99..6eab2a60ed 100644 --- a/.github/workflows/docker.yaml +++ b/.github/workflows/docker.yaml @@ -39,7 +39,7 @@ jobs: docker: ${{ steps.filter.outputs.docker }} steps: - - uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # pin@v6.0.0 + - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # pin@v6.0.1 with: persist-credentials: false - uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # pin@v3.0.2 @@ -67,7 +67,7 @@ jobs: steps: - name: Check out repo - uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # pin@v6.0.0 + uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # pin@v6.0.1 with: persist-credentials: false - name: Test Docker Image @@ -129,7 +129,7 @@ jobs: steps: - name: Check out repo - uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # pin@v6.0.0 + uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # pin@v6.0.1 with: persist-credentials: false - name: Run Migration Tests @@ -153,7 +153,7 @@ jobs: steps: - name: Check out repo - uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # pin@v6.0.0 + uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # pin@v6.0.1 with: persist-credentials: false - name: Set Up Python ${{ env.python_version }} diff --git a/.github/workflows/qc_checks.yaml b/.github/workflows/qc_checks.yaml index 5a0416c508..be937e7abc 100644 --- a/.github/workflows/qc_checks.yaml +++ b/.github/workflows/qc_checks.yaml @@ -41,7 +41,7 @@ jobs: requirements: ${{ steps.filter.outputs.requirements }} steps: - - uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # pin@v6.0.0 + - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # pin@v6.0.1 with: persist-credentials: false - uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # pin@v3.0.2 @@ -82,7 +82,7 @@ jobs: if: needs.paths-filter.outputs.cicd == 'true' || needs.paths-filter.outputs.server == 'true' || needs.paths-filter.outputs.frontend == 'true' || needs.paths-filter.outputs.requirements == 'true' || needs.paths-filter.outputs.force == 'true' steps: - - uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # pin@v6.0.0 + - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # pin@v6.0.1 with: persist-credentials: false - name: Set up Python ${{ env.python_version }} @@ -104,7 +104,7 @@ jobs: if: needs.paths-filter.outputs.server == 'true' || needs.paths-filter.outputs.requirements == 'true' || needs.paths-filter.outputs.force == 'true' steps: - - uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # pin@v6.0.0 + - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # pin@v6.0.1 with: persist-credentials: false - name: Environment Setup @@ -126,7 +126,7 @@ jobs: steps: - name: Checkout Code - uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # pin@v6.0.0 + uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # pin@v6.0.1 with: persist-credentials: false - name: Set up Python ${{ env.python_version }} @@ -164,7 +164,7 @@ jobs: version: ${{ steps.version.outputs.version }} steps: - - uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # pin@v6.0.0 + - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # pin@v6.0.1 with: persist-credentials: false - name: Environment Setup @@ -249,7 +249,7 @@ jobs: version: ${{ needs.schema.outputs.version }} steps: - - uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # pin@v6.0.0 + - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # pin@v6.0.1 name: Checkout Code with: repository: inventree/schema @@ -302,7 +302,7 @@ jobs: INVENTREE_LOG_LEVEL: WARNING steps: - - uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # pin@v6.0.0 + - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # pin@v6.0.1 with: persist-credentials: false - name: Environment Setup @@ -346,7 +346,7 @@ jobs: python_version: ${{ matrix.python_version }} steps: - - uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # pin@v6.0.0 + - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # pin@v6.0.1 with: persist-credentials: false - name: Environment Setup @@ -410,7 +410,7 @@ jobs: - 6379:6379 steps: - - uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # pin@v6.0.0 + - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # pin@v6.0.1 with: persist-credentials: false - name: Environment Setup @@ -458,7 +458,7 @@ jobs: - 3306:3306 steps: - - uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # pin@v6.0.0 + - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # pin@v6.0.1 with: persist-credentials: false - name: Environment Setup @@ -500,7 +500,7 @@ jobs: - 5432:5432 steps: - - uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # pin@v6.0.0 + - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # pin@v6.0.1 with: persist-credentials: false - name: Environment Setup @@ -534,7 +534,7 @@ jobs: INVENTREE_PLUGINS_ENABLED: false steps: - - uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # pin@v6.0.0 + - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # pin@v6.0.1 with: persist-credentials: false name: Checkout Code @@ -613,7 +613,7 @@ jobs: VITE_COVERAGE_BUILD: true steps: - - uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # pin@v6.0.0 + - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # pin@v6.0.1 with: persist-credentials: false - name: Environment Setup @@ -663,7 +663,7 @@ jobs: timeout-minutes: 60 steps: - - uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # pin@v6.0.0 + - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # pin@v6.0.1 with: persist-credentials: false - name: Environment Setup @@ -696,7 +696,7 @@ jobs: security-events: write steps: - name: Checkout repository - uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # pin@v6.0.0 + uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # pin@v6.0.1 with: persist-credentials: false - uses: hynek/setup-cached-uv@757bedc3f972eb7227a1aa657651f15a8527c817 # pin@v2 diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index fb8161dc80..35f2aeea44 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -20,7 +20,7 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} steps: - name: Checkout Code - uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # pin@v6.0.0 + uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # pin@v6.0.1 with: persist-credentials: false - name: Version Check @@ -43,7 +43,7 @@ jobs: contents: write attestations: write steps: - - uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # pin@v6.0.0 + - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # pin@v6.0.1 with: persist-credentials: false - name: Environment Setup @@ -107,7 +107,7 @@ jobs: INVENTREE_DEBUG: true steps: - - uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # pin@v6.0.0 + - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # pin@v6.0.1 with: persist-credentials: false - name: Environment Setup diff --git a/.github/workflows/scorecard.yaml b/.github/workflows/scorecard.yaml index ddfb5c3f3e..167b29bc60 100644 --- a/.github/workflows/scorecard.yaml +++ b/.github/workflows/scorecard.yaml @@ -32,7 +32,7 @@ jobs: steps: - name: "Checkout code" - uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0 + uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 with: persist-credentials: false diff --git a/.github/workflows/stale.yaml b/.github/workflows/stale.yaml index 131ed2d94a..d8b024b852 100644 --- a/.github/workflows/stale.yaml +++ b/.github/workflows/stale.yaml @@ -16,7 +16,7 @@ jobs: pull-requests: write steps: - - uses: actions/stale@5f858e3efba33a5ca4407a664cc011ad407f2008 # pin@v10.1.0 + - uses: actions/stale@997185467fa4f803885201cee163a9f38240193d # pin@v10.1.1 with: repo-token: ${{ secrets.GITHUB_TOKEN }} stale-issue-message: "This issue seems stale. Please react to show this is still important." diff --git a/.github/workflows/translations.yaml b/.github/workflows/translations.yaml index 35747dadec..0cce768eeb 100644 --- a/.github/workflows/translations.yaml +++ b/.github/workflows/translations.yaml @@ -32,7 +32,7 @@ jobs: steps: - name: Checkout Code - uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # pin@v6.0.0 + uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # pin@v6.0.1 with: persist-credentials: false - name: Environment Setup @@ -56,7 +56,7 @@ jobs: echo "Resetting to HEAD~" git reset HEAD~ || true - name: crowdin action - uses: crowdin/github-action@08713f00a50548bfe39b37e8f44afb53e7a802d4 # pin@v2 + uses: crowdin/github-action@60debf382ee245b21794321190ad0501db89d8c1 # pin@v2 with: upload_sources: true upload_translations: false From ba7b776257b91afc7b8875bb9e4b02045929a287 Mon Sep 17 00:00:00 2001 From: Oliver Date: Tue, 16 Dec 2025 14:46:17 +1100 Subject: [PATCH 62/76] [refactor] Optional prefetch (#11012) * Automatic prefetch of related fields for enable_filter - Allows us to *not* prefetch fields (expensive) when they are not going to be used - Enables re-usable components for common detail fields * Refactor "project_code_detail" filter into common component - Automatically apply correct prefetch fields * Refactor 'parameters' annotation - add 'enable_parameters_filter' function - Prefetch parameters only when needed - Refactor / consolidate code * Refactor SupplierPartSerializer - Make fields switchable - Ensure correct prefetch_related * Refactor serializer for ManufacturerPart * Refactor BuildSerializer * Refactor PurchaseOrderSerializer * Refactor SalesOrderSerializer * Refactor ReturnOrderSerializer * Remove debug statements * Tweaks * Simplify custom filterable fields * Bump API version * Fix for data export * Additional unit tests * Remove unused "prefetch_func" option * Refactor PurchaseOrderLineItemList * Refactor SalesOrderLineItemList * Refactor ReturnOrderLineItem * Cleanup "pretty_name" * Fix for build list * Refactoring StockItem API endpoint - Needs significant work still * Refactoring for BuildLineSerializer * Keep all optional fields when exporting data * Improve "UserRoles" API endpoint - Prefetch roles - Prevents significant number of db hits * Prefetch Parameter API list * Bug fix for exporting logic * Specify InvenTreeOutputOption * Optional prefetch for primary_address * Fix typing * Fix unit test * fixes for playwright tests * Update Part API - Improved prefetching * Fix for prefetch --- .../InvenTree/InvenTree/api_version.py | 8 +- src/backend/InvenTree/InvenTree/mixins.py | 13 ++ .../InvenTree/InvenTree/serializers.py | 49 ++++- src/backend/InvenTree/build/api.py | 42 +---- src/backend/InvenTree/build/serializers.py | 173 +++++++----------- src/backend/InvenTree/common/api.py | 8 +- src/backend/InvenTree/common/filters.py | 70 +++++++ src/backend/InvenTree/company/api.py | 13 +- src/backend/InvenTree/company/serializers.py | 138 ++++++-------- src/backend/InvenTree/company/test_api.py | 64 +++++++ src/backend/InvenTree/data_exporter/mixins.py | 8 +- src/backend/InvenTree/order/api.py | 18 +- src/backend/InvenTree/order/models.py | 15 +- src/backend/InvenTree/order/serializers.py | 169 +++++++---------- src/backend/InvenTree/part/api.py | 5 +- src/backend/InvenTree/part/serializers.py | 36 +--- src/backend/InvenTree/stock/serializers.py | 34 ++-- src/backend/InvenTree/stock/test_api.py | 11 +- src/backend/InvenTree/users/permissions.py | 30 ++- src/backend/InvenTree/users/serializers.py | 7 +- .../src/tables/build/BuildLineTable.tsx | 4 +- .../src/tables/build/BuildOutputTable.tsx | 4 +- .../tables/part/PartBuildAllocationsTable.tsx | 3 +- .../purchasing/PurchaseOrderLineItemTable.tsx | 3 +- .../tests/pages/pui_purchase_order.spec.ts | 3 +- 25 files changed, 508 insertions(+), 420 deletions(-) diff --git a/src/backend/InvenTree/InvenTree/api_version.py b/src/backend/InvenTree/InvenTree/api_version.py index 91e54fa77c..a1e04531d4 100644 --- a/src/backend/InvenTree/InvenTree/api_version.py +++ b/src/backend/InvenTree/InvenTree/api_version.py @@ -1,11 +1,17 @@ """InvenTree API version information.""" # InvenTree API version -INVENTREE_API_VERSION = 431 +INVENTREE_API_VERSION = 432 """Increment this API version number whenever there is a significant change to the API that any clients need to know about.""" INVENTREE_API_TEXT = """ +v432 -> 2025-12-15 : https://github.com/inventree/InvenTree/pull/11012 + - The "part_detail" field on the SupplierPart API endpoint is now optional + - The "supplier_detail" field on the SupplierPart API endpoint is now optional + - The "manufacturer_detail" field on the ManufacturerPart API endpoint is now optional + - The "part_detail" field on the StockItem API is now disabled by default + v431 -> 2025-12-14 : https://github.com/inventree/InvenTree/pull/11006 - Remove duplicate "address" field on the Company API endpoint - Make "primary_address" field optional on the Company API endpoint diff --git a/src/backend/InvenTree/InvenTree/mixins.py b/src/backend/InvenTree/InvenTree/mixins.py index ac394f1e6d..498b201872 100644 --- a/src/backend/InvenTree/InvenTree/mixins.py +++ b/src/backend/InvenTree/InvenTree/mixins.py @@ -258,6 +258,19 @@ class OutputOptionsMixin: return serializer + def get_queryset(self): + """Return the queryset with output options applied. + + This automatically applies any prefetching defined against the optional fields. + """ + queryset = super().get_queryset() + serializer = self.get_serializer() + + if isinstance(serializer, FilterableSerializerMixin): + queryset = serializer.prefetch_queryset(queryset) + + return queryset + class SerializerContextMixin: """Mixin to add context to serializer.""" diff --git a/src/backend/InvenTree/InvenTree/serializers.py b/src/backend/InvenTree/InvenTree/serializers.py index 074b8ce6f7..e9034344b5 100644 --- a/src/backend/InvenTree/InvenTree/serializers.py +++ b/src/backend/InvenTree/InvenTree/serializers.py @@ -10,6 +10,7 @@ from django.conf import settings from django.contrib.contenttypes.models import ContentType from django.core.exceptions import ValidationError as DjangoValidationError from django.db import models +from django.db.models import QuerySet from django.utils.translation import gettext_lazy as _ from djmoney.contrib.django_rest_framework.fields import MoneyField @@ -44,11 +45,15 @@ class FilterableSerializerField: is_filterable = None is_filterable_vals = {} + # Options for automatic queryset prefetching + prefetch_fields: Optional[list[str]] = None + def __init__(self, *args, **kwargs): """Initialize the serializer.""" - if self.is_filterable is None: # Materialize parameters for later usage - self.is_filterable = kwargs.pop('is_filterable', None) - self.is_filterable_vals = kwargs.pop('is_filterable_vals', {}) + self.is_filterable = kwargs.pop('is_filterable', None) + self.is_filterable_vals = kwargs.pop('is_filterable_vals', {}) + self.prefetch_fields = kwargs.pop('prefetch_fields', None) + super().__init__(*args, **kwargs) @@ -57,6 +62,7 @@ def enable_filter( default_include: bool = False, filter_name: Optional[str] = None, filter_by_query: bool = True, + prefetch_fields: Optional[list[str]] = None, ): """Decorator for marking a serializer field as filterable. @@ -67,6 +73,7 @@ def enable_filter( default_include (bool): If True, the field will be included by default unless explicitly excluded. If False, the field will be excluded by default unless explicitly included. filter_name (str, optional): The name of the filter parameter to use in the URL. If None, the function name of the (decorated) function will be used. filter_by_query (bool): If True, also look for filter parameters in the request query parameters. + prefetch_fields (list of str, optional): List of related fields to prefetch when this field is included. This can be used to optimize database queries. Returns: The decorated serializer field, marked as filterable. @@ -84,6 +91,10 @@ def enable_filter( 'filter_name': filter_name if filter_name else func.field_name, 'filter_by_query': filter_by_query, } + + # Attach queryset prefetching information + func._kwargs['prefetch_fields'] = prefetch_fields + return func @@ -113,6 +124,34 @@ class FilterableSerializerMixin: super().__init__(*args, **kwargs) self.do_filtering() + def prefetch_queryset(self, queryset: QuerySet) -> QuerySet: + """Apply any prefetching to the queryset based on the optionally included fields. + + Args: + queryset: The original queryset. + + Returns: + The modified queryset with prefetching applied. + """ + # Gather up the set of simple 'prefetch' fields and functions + prefetch_fields = set() + + filterable_fields = [ + field + for field in self.fields.values() + if getattr(field, 'is_filterable', None) + ] + + for field in filterable_fields: + if prefetch_names := getattr(field, 'prefetch_fields', None): + for pf in prefetch_names: + prefetch_fields.add(pf) + + if prefetch_fields and len(prefetch_fields) > 0: + queryset = queryset.prefetch_related(*list(prefetch_fields)) + + return queryset + def gather_filters(self, kwargs) -> None: """Gather filterable fields through introspection.""" # Fast exit if this has already been done or would not have any effect @@ -168,6 +207,10 @@ class FilterableSerializerMixin: ): return + # Skip filtering when exporting data - leave all fields intact + if getattr(self, '_exporting_data', False): + return + # Throw out fields which are not requested (either by default or explicitly) for k, v in self.filter_target_values.items(): # See `enable_filter` where` is_filterable and is_filterable_vals are set diff --git a/src/backend/InvenTree/build/api.py b/src/backend/InvenTree/build/api.py index 6ecb34b222..d7b8692bab 100644 --- a/src/backend/InvenTree/build/api.py +++ b/src/backend/InvenTree/build/api.py @@ -319,15 +319,6 @@ class BuildMixin: queryset = build.serializers.BuildSerializer.annotate_queryset(queryset) - queryset = queryset.prefetch_related( - 'responsible', - 'issued_by', - 'build_lines', - 'part', - 'part__pricing_data', - 'project_code', - ) - return queryset @@ -568,26 +559,27 @@ class BuildLineOutputOptions(OutputConfiguration): InvenTreeOutputOption( 'bom_item_detail', description='Include detailed information about the BOM item linked to this build line.', - default=True, + default=False, ), InvenTreeOutputOption( 'assembly_detail', description='Include brief details of the assembly (parent part) related to the BOM item in this build line.', - default=True, + default=False, ), InvenTreeOutputOption( 'part_detail', description='Include detailed information about the specific part being built or consumed in this build line.', - default=True, + default=False, ), InvenTreeOutputOption( 'build_detail', description='Include detailed information about the associated build order.', + default=False, ), InvenTreeOutputOption( 'allocations', description='Include allocation details showing which stock items are allocated to this build line.', - default=True, + default=False, ), ] @@ -905,6 +897,7 @@ class BuildItemOutputOptions(OutputConfiguration): InvenTreeOutputOption('location_detail'), InvenTreeOutputOption('stock_detail'), InvenTreeOutputOption('build_detail'), + InvenTreeOutputOption('supplier_part_detail'), ] @@ -927,26 +920,9 @@ class BuildItemList( """Override the queryset method, to perform custom prefetch.""" queryset = super().get_queryset() - queryset = queryset.select_related( - 'build_line', - 'build_line__build', - 'build_line__build__part', - 'build_line__build__responsible', - 'build_line__build__issued_by', - 'build_line__build__project_code', - 'build_line__build__part__pricing_data', - 'build_line__bom_item', - 'build_line__bom_item__part', - 'build_line__bom_item__sub_part', - 'install_into', - 'stock_item', - 'stock_item__location', - 'stock_item__part', - 'stock_item__supplier_part__part', - 'stock_item__supplier_part__supplier', - 'stock_item__supplier_part__manufacturer_part', - 'stock_item__supplier_part__manufacturer_part__manufacturer', - ).prefetch_related('stock_item__location__tags', 'stock_item__tags') + queryset = queryset.select_related('install_into').prefetch_related( + 'build_line', 'build_line__build', 'build_line__bom_item' + ) return queryset diff --git a/src/backend/InvenTree/build/serializers.py b/src/backend/InvenTree/build/serializers.py index 9d7f80b9e1..97324bef95 100644 --- a/src/backend/InvenTree/build/serializers.py +++ b/src/backend/InvenTree/build/serializers.py @@ -22,18 +22,16 @@ from rest_framework import serializers from rest_framework.serializers import ValidationError import build.tasks -import common.serializers +import common.filters import common.settings import company.serializers import InvenTree.helpers import part.filters import part.serializers as part_serializers -from common.serializers import ProjectCodeSerializer from common.settings import get_global_setting from generic.states.fields import InvenTreeCustomStatusSerializerMixin from InvenTree.mixins import DataImportExportSerializerMixin from InvenTree.serializers import ( - FilterableCharField, FilterableSerializerMixin, InvenTreeDecimalField, InvenTreeModelSerializer, @@ -124,13 +122,10 @@ class BuildSerializer( part_detail = enable_filter( part_serializers.PartBriefSerializer(source='part', many=False, read_only=True), True, + prefetch_fields=['part', 'part__category', 'part__pricing_data'], ) - parameters = enable_filter( - common.serializers.ParameterSerializer(many=True, read_only=True), - False, - filter_name='parameters', - ) + parameters = common.filters.enable_parameters_filter() part_name = serializers.CharField( source='part.name', read_only=True, label=_('Part Name') @@ -144,34 +139,21 @@ class BuildSerializer( UserSerializer(source='issued_by', read_only=True), True, filter_name='user_detail', + prefetch_fields=['issued_by'], ) responsible_detail = enable_filter( OwnerSerializer(source='responsible', read_only=True, allow_null=True), True, filter_name='user_detail', + prefetch_fields=['responsible'], ) barcode_hash = serializers.CharField(read_only=True) - project_code_label = enable_filter( - FilterableCharField( - source='project_code.code', - read_only=True, - label=_('Project Code Label'), - allow_null=True, - ), - True, - filter_name='project_code_detail', - ) + project_code_label = common.filters.enable_project_label_filter() - project_code_detail = enable_filter( - ProjectCodeSerializer( - source='project_code', many=False, read_only=True, allow_null=True - ), - True, - filter_name='project_code_detail', - ) + project_code_detail = common.filters.enable_project_code_filter() @staticmethod def annotate_queryset(queryset): @@ -192,8 +174,6 @@ class BuildSerializer( ) ) - queryset = Build.annotate_parameters(queryset) - return queryset def __init__(self, *args, **kwargs): @@ -1240,6 +1220,7 @@ class BuildItemSerializer( pricing=False, ), True, + prefetch_fields=['stock_item__part'], ) stock_item_detail = enable_filter( @@ -1255,6 +1236,13 @@ class BuildItemSerializer( ), True, filter_name='stock_detail', + prefetch_fields=[ + 'stock_item', + 'stock_item__tags', + 'stock_item__part', + 'stock_item__supplier_part', + 'stock_item__supplier_part__manufacturer_part', + ], ) location = serializers.PrimaryKeyRelatedField( @@ -1269,6 +1257,7 @@ class BuildItemSerializer( allow_null=True, ), True, + prefetch_fields=['stock_item__location', 'stock_item__location__tags'], ) build_detail = enable_filter( @@ -1280,15 +1269,32 @@ class BuildItemSerializer( allow_null=True, ), True, + prefetch_fields=[ + 'build_line__build', + 'build_line__build__part', + 'build_line__build__responsible', + 'build_line__build__issued_by', + 'build_line__build__project_code', + 'build_line__build__part__pricing_data', + ], ) - supplier_part_detail = company.serializers.SupplierPartSerializer( - label=_('Supplier Part'), - source='stock_item.supplier_part', - many=False, - read_only=True, - allow_null=True, - brief=True, + supplier_part_detail = enable_filter( + company.serializers.SupplierPartSerializer( + label=_('Supplier Part'), + source='stock_item.supplier_part', + many=False, + read_only=True, + allow_null=True, + brief=True, + ), + False, + prefetch_fields=[ + 'stock_item__supplier_part', + 'stock_item__supplier_part__supplier', + 'stock_item__supplier_part__manufacturer_part', + 'stock_item__supplier_part__manufacturer_part__manufacturer', + ], ) quantity = InvenTreeDecimalField(label=_('Allocated Quantity')) @@ -1373,7 +1379,18 @@ class BuildLineSerializer( ) allocations = enable_filter( - BuildItemSerializer(many=True, read_only=True, build_detail=False), True + BuildItemSerializer(many=True, read_only=True, build_detail=False), + True, + prefetch_fields=[ + 'allocations', + 'allocations__stock_item', + 'allocations__stock_item__part', + 'allocations__stock_item__part__pricing_data', + 'allocations__stock_item__supplier_part', + 'allocations__stock_item__supplier_part__manufacturer_part', + 'allocations__stock_item__location', + 'allocations__stock_item__tags', + ], ) # BOM item info fields @@ -1417,7 +1434,7 @@ class BuildLineSerializer( part_detail=False, can_build=False, ), - True, + False, ) assembly_detail = enable_filter( @@ -1429,7 +1446,8 @@ class BuildLineSerializer( allow_null=True, pricing=False, ), - True, + False, + prefetch_fields=['bom_item__part', 'bom_item__part__pricing_data'], ) part_detail = enable_filter( @@ -1440,7 +1458,8 @@ class BuildLineSerializer( read_only=True, pricing=False, ), - True, + False, + prefetch_fields=['bom_item__sub_part', 'bom_item__sub_part__pricing_data'], ) category_detail = enable_filter( @@ -1452,6 +1471,7 @@ class BuildLineSerializer( allow_null=True, ), False, + prefetch_fields=['bom_item__sub_part__category'], ) build_detail = enable_filter( @@ -1517,77 +1537,16 @@ class BuildLineSerializer( 'bom_item__sub_part__pricing_data', ) - # Pre-fetch related fields - queryset = queryset.prefetch_related( - 'allocations', - 'allocations__stock_item', - 'allocations__stock_item__part', - 'allocations__stock_item__supplier_part', - 'allocations__stock_item__supplier_part__manufacturer_part', - 'allocations__stock_item__location', - 'allocations__stock_item__tags', - 'bom_item', - 'bom_item__part', - 'bom_item__sub_part', - 'bom_item__sub_part__category', - 'bom_item__sub_part__stock_items', - 'bom_item__sub_part__stock_items__allocations', - 'bom_item__sub_part__stock_items__sales_order_allocations', - 'bom_item__substitutes', - 'bom_item__substitutes__part__stock_items', - 'bom_item__substitutes__part__stock_items__allocations', - 'bom_item__substitutes__part__stock_items__sales_order_allocations', - ) - # Defer expensive fields which we do not need for this serializer - queryset = ( - queryset.defer( - 'build__lft', - 'build__rght', - 'build__level', - 'build__tree_id', - 'build__destination', - 'build__take_from', - 'build__completed_by', - 'build__sales_order', - 'build__parent', - 'build__notes', - 'build__metadata', - 'build__responsible', - 'build__barcode_data', - 'build__barcode_hash', - 'build__project_code', - ) - .defer('bom_item__metadata') - .defer( - 'bom_item__part__lft', - 'bom_item__part__rght', - 'bom_item__part__level', - 'bom_item__part__tree_id', - 'bom_item__part__tags', - 'bom_item__part__notes', - 'bom_item__part__variant_of', - 'bom_item__part__revision_of', - 'bom_item__part__creation_user', - 'bom_item__part__bom_checked_by', - 'bom_item__part__default_supplier', - 'bom_item__part__responsible_owner', - ) - .defer( - 'bom_item__sub_part__lft', - 'bom_item__sub_part__rght', - 'bom_item__sub_part__level', - 'bom_item__sub_part__tree_id', - 'bom_item__sub_part__tags', - 'bom_item__sub_part__notes', - 'bom_item__sub_part__variant_of', - 'bom_item__sub_part__revision_of', - 'bom_item__sub_part__creation_user', - 'bom_item__sub_part__bom_checked_by', - 'bom_item__sub_part__default_supplier', - 'bom_item__sub_part__responsible_owner', - ) + queryset = queryset.defer( + 'build__notes', + 'build__metadata', + 'bom_item__metadata', + 'bom_item__part__notes', + 'bom_item__part__metadata', + 'bom_item__sub_part__notes', + 'bom_item__sub_part__metadata', ) # Annotate the "allocated" quantity diff --git a/src/backend/InvenTree/common/api.py b/src/backend/InvenTree/common/api.py index ec64f79d87..ae972f6ed1 100644 --- a/src/backend/InvenTree/common/api.py +++ b/src/backend/InvenTree/common/api.py @@ -848,7 +848,9 @@ class ParameterTemplateFilter(FilterSet): class ParameterTemplateMixin: """Mixin class for ParameterTemplate views.""" - queryset = common.models.ParameterTemplate.objects.all() + queryset = common.models.ParameterTemplate.objects.all().prefetch_related( + 'model_type' + ) serializer_class = common.serializers.ParameterTemplateSerializer permission_classes = [IsAuthenticatedOrReadScope] @@ -891,7 +893,9 @@ class ParameterFilter(FilterSet): class ParameterMixin: """Mixin class for Parameter views.""" - queryset = common.models.Parameter.objects.all() + queryset = common.models.Parameter.objects.all().prefetch_related( + 'model_type', 'updated_by', 'template', 'template__model_type' + ) serializer_class = common.serializers.ParameterSerializer permission_classes = [IsAuthenticatedOrReadScope] diff --git a/src/backend/InvenTree/common/filters.py b/src/backend/InvenTree/common/filters.py index 98237648d6..b75aea3a95 100644 --- a/src/backend/InvenTree/common/filters.py +++ b/src/backend/InvenTree/common/filters.py @@ -17,9 +17,11 @@ from django.db.models import ( When, ) from django.db.models.query import QuerySet +from django.utils.translation import gettext_lazy as _ import InvenTree.conversion import InvenTree.helpers +import InvenTree.serializers def determine_content_type(content_type: str | int | None) -> ContentType | None: @@ -310,3 +312,71 @@ def order_by_parameter( f'{prefix}parameter_value_numeric', f'{prefix}parameter_value', ) + + +def enable_project_code_filter(default: bool = True): + """Add an optional 'project_code_detail' field to an API serializer. + + Arguments: + filter_name: The name of the filter field. + default: If True, enable the filter by default. + + If applied, this field will automatically prefetch the 'project_code' relationship. + """ + from common.serializers import ProjectCodeSerializer + + return InvenTree.serializers.enable_filter( + ProjectCodeSerializer( + source='project_code', many=False, read_only=True, allow_null=True + ), + default, + filter_name='project_code_detail', + prefetch_fields=['project_code'], + ) + + +def enable_project_label_filter(default: bool = True): + """Add an optional 'project_code_label' field to an API serializer. + + Arguments: + filter_name: The name of the filter field. + default: If True, enable the filter by default. + + If applied, this field will automatically prefetch the 'project_code' relationship. + """ + return InvenTree.serializers.enable_filter( + InvenTree.serializers.FilterableCharField( + source='project_code.code', + read_only=True, + label=_('Project Code Label'), + allow_null=True, + ), + default, + filter_name='project_code_detail', + prefetch_fields=['project_code'], + ) + + +def enable_parameters_filter(): + """Add an optional 'parameters' field to an API serializer. + + Arguments: + source: The source field for the serializer. + filter_name: The name of the filter field. + default: If True, enable the filter by default. + + If applied, this field will automatically annotate the queryset with parameter data. + """ + from common.serializers import ParameterSerializer + + return InvenTree.serializers.enable_filter( + ParameterSerializer(many=True, read_only=True, allow_null=True), + False, + filter_name='parameters', + prefetch_fields=[ + 'parameters_list', + 'parameters_list__model_type', + 'parameters_list__updated_by', + 'parameters_list__template', + ], + ) diff --git a/src/backend/InvenTree/company/api.py b/src/backend/InvenTree/company/api.py index 15406ca71a..ba119ce8e6 100644 --- a/src/backend/InvenTree/company/api.py +++ b/src/backend/InvenTree/company/api.py @@ -178,11 +178,7 @@ class ManufacturerPartMixin(SerializerContextMixin): """Return annotated queryset for the ManufacturerPart list endpoint.""" queryset = super().get_queryset(*args, **kwargs) - queryset = queryset.prefetch_related( - 'part', 'manufacturer', 'supplier_parts', 'tags' - ) - - queryset = ManufacturerPart.annotate_parameters(queryset) + queryset = queryset.prefetch_related('supplier_parts', 'tags') return queryset @@ -304,13 +300,18 @@ class SupplierPartOutputOptions(OutputConfiguration): InvenTreeOutputOption( description='Include detailed information about the Supplier in the response', flag='supplier_detail', - default=True, + default=False, ), InvenTreeOutputOption( description='Include detailed information about the Manufacturer in the response', flag='manufacturer_detail', default=False, ), + InvenTreeOutputOption( + flag='manufacturer_part_detail', + description='Include detailed information about the linked ManufacturerPart in the response', + default=False, + ), InvenTreeOutputOption( description='Format the output with a more readable (pretty) name', flag='pretty', diff --git a/src/backend/InvenTree/company/serializers.py b/src/backend/InvenTree/company/serializers.py index 67fbfe763e..eb4dc0f229 100644 --- a/src/backend/InvenTree/company/serializers.py +++ b/src/backend/InvenTree/company/serializers.py @@ -10,7 +10,7 @@ from rest_framework import serializers from sql_util.utils import SubqueryCount from taggit.serializers import TagListSerializerField -import common.serializers +import common.filters import company.filters import part.filters import part.serializers as part_serializers @@ -163,22 +163,19 @@ class CompanySerializer( queryset = queryset.annotate(parts_supplied=SubqueryCount('supplied_parts')) - queryset = queryset.prefetch_related( + return queryset + + primary_address = enable_filter( + AddressBriefSerializer(read_only=True, allow_null=True), + False, + filter_name='address_detail', + prefetch_fields=[ Prefetch( 'addresses', queryset=Address.objects.filter(primary=True), to_attr='primary_address_list', ) - ) - - queryset = Company.annotate_parameters(queryset) - - return queryset - - primary_address = enable_filter( - AddressBriefSerializer(read_only=True, allow_null=True), - True, - filter_name='address_detail', + ], ) image = InvenTreeImageSerializerField(required=False, allow_null=True) @@ -195,11 +192,7 @@ class CompanySerializer( help_text=_('Default currency used for this supplier'), required=True ) - parameters = enable_filter( - common.serializers.ParameterSerializer(many=True, read_only=True), - False, - filter_name='parameters', - ) + parameters = common.filters.enable_parameters_filter() def save(self): """Save the Company instance.""" @@ -269,24 +262,14 @@ class ManufacturerPartSerializer( tags = TagListSerializerField(required=False) - parameters = enable_filter( - common.serializers.ParameterSerializer(many=True, read_only=True), - False, - filter_name='parameters', - ) + parameters = common.filters.enable_parameters_filter() part_detail = enable_filter( part_serializers.PartBriefSerializer( source='part', many=False, read_only=True, allow_null=True ), True, - ) - - manufacturer_detail = enable_filter( - CompanyBriefSerializer( - source='manufacturer', many=False, read_only=True, allow_null=True - ), - True, + prefetch_fields=['part'], ) pretty_name = enable_filter( @@ -297,6 +280,14 @@ class ManufacturerPartSerializer( queryset=Company.objects.filter(is_manufacturer=True) ) + manufacturer_detail = enable_filter( + CompanyBriefSerializer( + source='manufacturer', many=False, read_only=True, allow_null=True + ), + True, + prefetch_fields=['manufacturer'], + ) + class SupplierPriceBreakBriefSerializer( FilterableSerializerMixin, InvenTreeModelSerializer @@ -399,33 +390,13 @@ class SupplierPartSerializer( # Check if 'available' quantity was supplied self.has_available_quantity = 'available' in kwargs.get('data', {}) - # TODO INVE-T1 support complex filters brief = kwargs.pop('brief', False) - detail_default = not brief - part_detail = kwargs.pop('part_detail', detail_default) - supplier_detail = kwargs.pop('supplier_detail', detail_default) - manufacturer_detail = kwargs.pop('manufacturer_detail', detail_default) - - prettify = kwargs.pop('pretty', False) super().__init__(*args, **kwargs) if isGeneratingSchema(): return - if part_detail is not True: - self.fields.pop('part_detail', None) - - if supplier_detail is not True: - self.fields.pop('supplier_detail', None) - - if manufacturer_detail is not True: - self.fields.pop('manufacturer_detail', None) - self.fields.pop('manufacturer_part_detail', None) - - if brief or prettify is not True: - self.fields.pop('pretty_name', None) - if brief: self.fields.pop('tags') self.fields.pop('available') @@ -455,46 +426,61 @@ class SupplierPartSerializer( ), False, filter_name='price_breaks', + prefetch_fields=['pricebreaks'], ) - parameters = enable_filter( - common.serializers.ParameterSerializer(many=True, read_only=True), + parameters = common.filters.enable_parameters_filter() + + part_detail = enable_filter( + part_serializers.PartBriefSerializer( + label=_('Part'), source='part', many=False, read_only=True, allow_null=True + ), False, - filter_name='parameters', + prefetch_fields=['part'], ) - part_detail = part_serializers.PartBriefSerializer( - label=_('Part'), source='part', many=False, read_only=True, allow_null=True + supplier_detail = enable_filter( + CompanyBriefSerializer( + label=_('Supplier'), + source='supplier', + many=False, + read_only=True, + allow_null=True, + ), + False, + prefetch_fields=['supplier'], ) - supplier_detail = CompanyBriefSerializer( - label=_('Supplier'), - source='supplier', - many=False, - read_only=True, - allow_null=True, + manufacturer_detail = enable_filter( + CompanyBriefSerializer( + label=_('Manufacturer'), + source='manufacturer_part.manufacturer', + many=False, + read_only=True, + allow_null=True, + ), + False, + prefetch_fields=['manufacturer_part__manufacturer'], ) - manufacturer_detail = CompanyBriefSerializer( - label=_('Manufacturer'), - source='manufacturer_part.manufacturer', - many=False, - read_only=True, - allow_null=True, + pretty_name = enable_filter( + FilterableCharField(read_only=True, allow_null=True), filter_name='pretty' ) - pretty_name = serializers.CharField(read_only=True, allow_null=True) - supplier = serializers.PrimaryKeyRelatedField( label=_('Supplier'), queryset=Company.objects.filter(is_supplier=True) ) - manufacturer_part_detail = ManufacturerPartSerializer( - label=_('Manufacturer Part'), - source='manufacturer_part', - part_detail=False, - read_only=True, - allow_null=True, + manufacturer_part_detail = enable_filter( + ManufacturerPartSerializer( + label=_('Manufacturer Part'), + source='manufacturer_part', + part_detail=False, + read_only=True, + allow_null=True, + ), + False, + prefetch_fields=['manufacturer_part'], ) MPN = serializers.CharField( @@ -511,15 +497,13 @@ class SupplierPartSerializer( Fields: in_stock: Current stock quantity for each SupplierPart """ - queryset = queryset.prefetch_related('part', 'pricebreaks') - queryset = queryset.annotate(in_stock=part.filters.annotate_total_stock()) queryset = queryset.annotate( on_order=company.filters.annotate_on_order_quantity() ) - queryset = SupplierPart.annotate_parameters(queryset) + queryset = queryset.prefetch_related('supplier', 'manufacturer_part') return queryset diff --git a/src/backend/InvenTree/company/test_api.py b/src/backend/InvenTree/company/test_api.py index 5e5ffd372f..3599160d93 100644 --- a/src/backend/InvenTree/company/test_api.py +++ b/src/backend/InvenTree/company/test_api.py @@ -210,6 +210,34 @@ class CompanyTest(InvenTreeAPITestCase): self.assertEqual(response.data['notes'], note) + def test_company_parameters(self): + """Test for annotation of 'parameters' field in Company API.""" + url = reverse('api-company-list') + + response = self.get(url, expected_code=200) + + self.assertGreater(len(response.data), 0) + + # Default = not included + for result in response.data: + self.assertNotIn('parameters', result) + + # Exclude parameters + response = self.get(url, {'parameters': 'false'}, expected_code=200) + + self.assertGreater(len(response.data), 0) + + for result in response.data: + self.assertNotIn('parameters', result) + + # Include parameters + response = self.get(url, {'parameters': 'true'}, expected_code=200) + + self.assertGreater(len(response.data), 0) + + for result in response.data: + self.assertIn('parameters', result) + class ContactTest(InvenTreeAPITestCase): """Tests for the Contact models.""" @@ -682,6 +710,42 @@ class SupplierPartTest(InvenTreeAPITestCase): for result in response.data: self.assertEqual(result['supplier'], company.pk) + def test_filterable_fields(self): + """Test inclusion/exclusion of optional API fields.""" + fields = { + 'price_breaks': False, + 'part_detail': False, + 'supplier_detail': False, + 'manufacturer_detail': False, + 'manufacturer_part_detail': False, + } + + url = reverse('api-supplier-part-list') + + for field, included in fields.items(): + # Test default behavior + response = self.get(url, data={}, expected_code=200) + self.assertGreater(len(response.data), 0) + self.assertEqual( + included, + field in response.data[0], + f'Field: {field} failed default test', + ) + + # Test explicit inclusion + response = self.get(url, data={field: 'true'}, expected_code=200) + self.assertGreater(len(response.data), 0) + self.assertIn( + field, response.data[0], f'Field: {field} failed inclusion test' + ) + + # Test explicit exclusion + response = self.get(url, data={field: 'false'}, expected_code=200) + self.assertGreater(len(response.data), 0) + self.assertNotIn( + field, response.data[0], f'Field: {field} failed exclusion test' + ) + class CompanyMetadataAPITest(InvenTreeAPITestCase): """Unit tests for the various metadata endpoints of API.""" diff --git a/src/backend/InvenTree/data_exporter/mixins.py b/src/backend/InvenTree/data_exporter/mixins.py index 33077354ff..316dfdfbce 100644 --- a/src/backend/InvenTree/data_exporter/mixins.py +++ b/src/backend/InvenTree/data_exporter/mixins.py @@ -53,7 +53,7 @@ class DataExportSerializerMixin: Determine if the serializer is being used for data export, and if so, adjust the serializer fields accordingly. """ - exporting = kwargs.pop('exporting', False) + self._exporting_data = exporting = kwargs.pop('exporting', False) super().__init__(*args, **kwargs) @@ -264,10 +264,8 @@ class DataExportViewMixin: exporting = kwargs.pop('exporting', None) if exporting is None: - exporting = ( - self.request.method.lower() in ['options', 'get'] - and self.is_exporting() - ) + method = str(getattr(self.request, 'method', '')).lower() + exporting = method in ['options', 'get'] and self.is_exporting() if exporting: # Override kwargs when initializing the DataExportOptionsSerializer diff --git a/src/backend/InvenTree/order/api.py b/src/backend/InvenTree/order/api.py index ee2fa7a4c9..a81e338084 100644 --- a/src/backend/InvenTree/order/api.py +++ b/src/backend/InvenTree/order/api.py @@ -369,12 +369,10 @@ class PurchaseOrderMixin(SerializerContextMixin): """Return the annotated queryset for this endpoint.""" queryset = super().get_queryset(*args, **kwargs) - queryset = queryset.prefetch_related( - 'supplier', 'project_code', 'lines', 'responsible' - ) - queryset = serializers.PurchaseOrderSerializer.annotate_queryset(queryset) + queryset = queryset.prefetch_related('supplier', 'created_by') + return queryset @@ -833,9 +831,7 @@ class SalesOrderMixin(SerializerContextMixin): """Return annotated queryset for this endpoint.""" queryset = super().get_queryset(*args, **kwargs) - queryset = queryset.prefetch_related( - 'customer', 'responsible', 'project_code', 'lines' - ) + queryset = queryset.prefetch_related('customer', 'created_by') queryset = serializers.SalesOrderSerializer.annotate_queryset(queryset) @@ -1018,17 +1014,13 @@ class SalesOrderLineItemMixin(SerializerContextMixin): queryset = queryset.prefetch_related( 'part', - 'part__stock_items', 'allocations', 'allocations__shipment', 'allocations__item__part', 'allocations__item__location', 'order', - 'order__stock_items', ) - queryset = queryset.select_related('part__pricing_data') - queryset = serializers.SalesOrderLineItemSerializer.annotate_queryset(queryset) return queryset @@ -1510,9 +1502,7 @@ class ReturnOrderMixin(SerializerContextMixin): """Return annotated queryset for this endpoint.""" queryset = super().get_queryset(*args, **kwargs) - queryset = queryset.prefetch_related( - 'customer', 'lines', 'project_code', 'responsible' - ) + queryset = queryset.prefetch_related('customer', 'created_by') queryset = serializers.ReturnOrderSerializer.annotate_queryset(queryset) diff --git a/src/backend/InvenTree/order/models.py b/src/backend/InvenTree/order/models.py index bf699af334..d159b988eb 100644 --- a/src/backend/InvenTree/order/models.py +++ b/src/backend/InvenTree/order/models.py @@ -1989,17 +1989,16 @@ class PurchaseOrderLineItem(OrderLineItem): def get_destination(self): """Show where the line item is or should be placed. - NOTE: If a line item gets split when received, only an arbitrary - stock items location will be reported as the location for the - entire line. + 1. If a destination is specified against this line item, return that. + 2. If a destination is specified against the PurchaseOrderPart, return that. + 3. If a default location is specified against the linked Part, return that. """ - for item in stock.models.StockItem.objects.filter( - supplier_part=self.part, purchase_order=self.order - ): - if item.location: - return item.location if self.destination: return self.destination + + if self.order.destination: + return self.order.destination + if self.part and self.part.part and self.part.part.default_location: return self.part.part.default_location diff --git a/src/backend/InvenTree/order/serializers.py b/src/backend/InvenTree/order/serializers.py index caac022c91..0bdc90daa1 100644 --- a/src/backend/InvenTree/order/serializers.py +++ b/src/backend/InvenTree/order/serializers.py @@ -4,16 +4,7 @@ from decimal import Decimal from django.core.exceptions import ValidationError as DjangoValidationError from django.db import models, transaction -from django.db.models import ( - BooleanField, - Case, - ExpressionWrapper, - F, - Prefetch, - Q, - Value, - When, -) +from django.db.models import BooleanField, Case, ExpressionWrapper, F, Q, Value, When from django.db.models.functions import Coalesce, Greatest from django.utils.translation import gettext_lazy as _ @@ -22,13 +13,12 @@ from rest_framework.serializers import ValidationError from sql_util.utils import SubqueryCount, SubquerySum import build.serializers -import common.serializers +import common.filters import order.models import part.filters as part_filters import part.models as part_models import stock.models import stock.serializers -from common.serializers import ProjectCodeSerializer from company.serializers import ( AddressBriefSerializer, CompanyBriefSerializer, @@ -46,7 +36,6 @@ from InvenTree.helpers import ( ) from InvenTree.mixins import DataImportExportSerializerMixin from InvenTree.serializers import ( - FilterableCharField, FilterableSerializerMixin, InvenTreeCurrencySerializer, InvenTreeDecimalField, @@ -141,6 +130,7 @@ class AbstractOrderSerializer( source='contact', many=False, read_only=True, allow_null=True ), True, + prefetch_fields=['contact'], ) # Detail for responsible field @@ -149,26 +139,11 @@ class AbstractOrderSerializer( source='responsible', read_only=True, allow_null=True, many=False ), True, + prefetch_fields=['responsible'], ) - project_code_label = enable_filter( - FilterableCharField( - source='project_code.code', - read_only=True, - label='Project Code Label', - allow_null=True, - ), - True, - filter_name='project_code_detail', - ) - - # Detail for project code field - project_code_detail = enable_filter( - ProjectCodeSerializer( - source='project_code', read_only=True, many=False, allow_null=True - ), - True, - ) + project_code_label = common.filters.enable_project_label_filter() + project_code_detail = common.filters.enable_project_code_filter() # Detail for address field address_detail = enable_filter( @@ -176,13 +151,10 @@ class AbstractOrderSerializer( source='address', many=False, read_only=True, allow_null=True ), True, + prefetch_fields=['address'], ) - parameters = enable_filter( - common.serializers.ParameterSerializer(many=True, read_only=True), - False, - filter_name='parameters', - ) + parameters = common.filters.enable_parameters_filter() # Boolean field indicating if this order is overdue (Note: must be annotated) overdue = serializers.BooleanField(read_only=True, allow_null=True) @@ -317,23 +289,9 @@ class AbstractLineItemSerializer(FilterableSerializerMixin, serializers.Serializ required=False, allow_null=True, label=_('Target Date') ) - project_code_label = enable_filter( - FilterableCharField( - source='project_code.code', - read_only=True, - label='Project Code Label', - allow_null=True, - ), - True, - filter_name='project_code_detail', - ) + project_code_label = common.filters.enable_project_label_filter() - project_code_detail = enable_filter( - ProjectCodeSerializer( - source='project_code', read_only=True, many=False, allow_null=True - ), - True, - ) + project_code_detail = common.filters.enable_project_code_filter() class AbstractExtraLineSerializer( @@ -369,24 +327,9 @@ class AbstractExtraLineSerializer( price_currency = InvenTreeCurrencySerializer() - project_code_label = enable_filter( - FilterableCharField( - source='project_code.code', - read_only=True, - label='Project Code Label', - allow_null=True, - ), - True, - filter_name='project_code_detail', - ) + project_code_label = common.filters.enable_project_label_filter() - # Detail for project code field - project_code_detail = enable_filter( - ProjectCodeSerializer( - source='project_code', read_only=True, many=False, allow_null=True - ), - True, - ) + project_code_detail = common.filters.enable_project_code_filter() class AbstractExtraLineMeta: @@ -452,9 +395,6 @@ class PurchaseOrderSerializer( """ queryset = AbstractOrderSerializer.annotate_queryset(queryset) - # Annotate parametric data - queryset = order.models.PurchaseOrder.annotate_parameters(queryset) - queryset = queryset.annotate( completed_lines=SubqueryCount( 'lines', filter=Q(quantity__lte=F('received')) @@ -471,6 +411,8 @@ class PurchaseOrderSerializer( ) ) + queryset = queryset.prefetch_related('created_by') + return queryset supplier_name = serializers.CharField( @@ -480,7 +422,8 @@ class PurchaseOrderSerializer( supplier_detail = enable_filter( CompanyBriefSerializer( source='supplier', many=False, read_only=True, allow_null=True - ) + ), + prefetch_fields=['supplier'], ) @@ -612,27 +555,18 @@ class PurchaseOrderLineItemSerializer( - "total_price" = purchase_price * quantity - "overdue" status (boolean field) """ - queryset = queryset.prefetch_related( - Prefetch( - 'part__part', - queryset=part_models.Part.objects.annotate( - category_default_location=part_filters.annotate_default_location( - 'category__' - ) - ).prefetch_related(None), - ) - ) - queryset = queryset.prefetch_related( 'order', 'order__responsible', 'order__stock_items', + 'part', + 'part__part', + 'part__part__pricing_data', + 'part__part__default_location', 'part__tags', 'part__supplier', 'part__manufacturer_part', 'part__manufacturer_part__manufacturer', - 'part__part__pricing_data', - 'part__part__tags', ) queryset = queryset.annotate( @@ -687,6 +621,7 @@ class PurchaseOrderLineItemSerializer( PartBriefSerializer( source='get_base_part', many=False, read_only=True, allow_null=True ), + False, filter_name='part_detail', ) @@ -694,6 +629,7 @@ class PurchaseOrderLineItemSerializer( SupplierPartSerializer( source='part', brief=True, many=False, read_only=True, allow_null=True ), + False, filter_name='part_detail', ) @@ -707,8 +643,12 @@ class PurchaseOrderLineItemSerializer( default=True, ) - destination_detail = stock.serializers.LocationBriefSerializer( - source='get_destination', read_only=True, allow_null=True + destination_detail = enable_filter( + stock.serializers.LocationBriefSerializer( + source='get_destination', read_only=True, allow_null=True + ), + True, + prefetch_fields=['destination', 'order__destination'], ) purchase_price_currency = InvenTreeCurrencySerializer( @@ -721,8 +661,16 @@ class PurchaseOrderLineItemSerializer( ) ) - build_order_detail = build.serializers.BuildSerializer( - source='build_order', read_only=True, allow_null=True, many=False + build_order_detail = enable_filter( + build.serializers.BuildSerializer( + source='build_order', read_only=True, allow_null=True, many=False + ), + True, + prefetch_fields=[ + 'build_order__responsible', + 'build_order__issued_by', + 'build_order__part', + ], ) merge_items = serializers.BooleanField( @@ -1098,9 +1046,6 @@ class SalesOrderSerializer( """ queryset = AbstractOrderSerializer.annotate_queryset(queryset) - # Annotate parametric data - queryset = order.models.SalesOrder.annotate_parameters(queryset) - queryset = queryset.annotate( completed_lines=SubqueryCount('lines', filter=Q(quantity__lte=F('shipped'))) ) @@ -1128,7 +1073,8 @@ class SalesOrderSerializer( customer_detail = enable_filter( CompanyBriefSerializer( source='customer', many=False, read_only=True, allow_null=True - ) + ), + prefetch_fields=['customer'], ) shipments_count = serializers.IntegerField( @@ -1277,15 +1223,26 @@ class SalesOrderLineItemSerializer( order_detail = enable_filter( SalesOrderSerializer( source='order', many=False, read_only=True, allow_null=True - ) + ), + prefetch_fields=[ + 'order__created_by', + 'order__responsible', + 'order__address', + 'order__project_code', + 'order__contact', + ], ) + part_detail = enable_filter( - PartBriefSerializer(source='part', many=False, read_only=True, allow_null=True) + PartBriefSerializer(source='part', many=False, read_only=True, allow_null=True), + prefetch_fields=['part__pricing_data'], ) + customer_detail = enable_filter( CompanyBriefSerializer( source='order.customer', many=False, read_only=True, allow_null=True - ) + ), + prefetch_fields=['order__customer'], ) # Annotated fields @@ -1950,9 +1907,6 @@ class ReturnOrderSerializer( """Custom annotation for the serializer queryset.""" queryset = AbstractOrderSerializer.annotate_queryset(queryset) - # Annotate parametric data - queryset = order.models.ReturnOrder.annotate_parameters(queryset) - queryset = queryset.annotate( completed_lines=SubqueryCount( 'lines', filter=~Q(outcome=ReturnOrderLineStatus.PENDING.value) @@ -1974,7 +1928,8 @@ class ReturnOrderSerializer( customer_detail = enable_filter( CompanyBriefSerializer( source='customer', many=False, read_only=True, allow_null=True - ) + ), + prefetch_fields=['customer'], ) @@ -2134,7 +2089,14 @@ class ReturnOrderLineItemSerializer( order_detail = enable_filter( ReturnOrderSerializer( source='order', many=False, read_only=True, allow_null=True - ) + ), + prefetch_fields=[ + 'order__created_by', + 'order__responsible', + 'order__address', + 'order__project_code', + 'order__contact', + ], ) quantity = serializers.FloatField( @@ -2144,7 +2106,8 @@ class ReturnOrderLineItemSerializer( item_detail = enable_filter( stock.serializers.StockItemSerializer( source='item', many=False, read_only=True, allow_null=True - ) + ), + prefetch_fields=['item__supplier_part'], ) part_detail = enable_filter( diff --git a/src/backend/InvenTree/part/api.py b/src/backend/InvenTree/part/api.py index 57fcc7cb85..aa18739cbc 100644 --- a/src/backend/InvenTree/part/api.py +++ b/src/backend/InvenTree/part/api.py @@ -1009,7 +1009,7 @@ class PartMixin(SerializerContextMixin): """Mixin class for Part API endpoints.""" serializer_class = part_serializers.PartSerializer - queryset = Part.objects.all() + queryset = Part.objects.all().select_related('pricing_data') starred_parts = None is_create = False @@ -1020,9 +1020,6 @@ class PartMixin(SerializerContextMixin): queryset = part_serializers.PartSerializer.annotate_queryset(queryset) - if str2bool(self.request.query_params.get('price_breaks', True)): - queryset = queryset.prefetch_related('salepricebreaks') - return queryset def get_serializer(self, *args, **kwargs): diff --git a/src/backend/InvenTree/part/serializers.py b/src/backend/InvenTree/part/serializers.py index 8a9d1e1acb..0f5ad566ae 100644 --- a/src/backend/InvenTree/part/serializers.py +++ b/src/backend/InvenTree/part/serializers.py @@ -9,7 +9,7 @@ from django.core.files.base import ContentFile from django.core.validators import MinValueValidator from django.db import models, transaction from django.db.models import ExpressionWrapper, F, Q -from django.db.models.functions import Coalesce, Greatest +from django.db.models.functions import Greatest from django.urls import reverse_lazy from django.utils.translation import gettext_lazy as _ @@ -22,6 +22,7 @@ from sql_util.utils import SubqueryCount from taggit.serializers import TagListSerializerField import common.currency +import common.filters import common.serializers import company.models import InvenTree.helpers @@ -619,7 +620,6 @@ class PartSerializer( 'required_for_build_orders', 'required_for_sales_orders', 'stock_item_count', - 'suppliers', 'total_in_stock', 'external_stock', 'unallocated_stock', @@ -680,10 +680,6 @@ class PartSerializer( Performing database queries as efficiently as possible, to reduce database trips. """ - queryset = queryset.prefetch_related('category', 'default_location') - - queryset = Part.annotate_parameters(queryset) - # Annotate with the total number of revisions queryset = queryset.annotate(revision_count=SubqueryCount('revisions')) @@ -708,15 +704,6 @@ class PartSerializer( scheduled_to_build=part_filters.annotate_scheduled_to_build_quantity() ) - # Annotate with the number of 'suppliers' - queryset = queryset.annotate( - suppliers=Coalesce( - SubqueryCount('supplier_parts'), - Decimal(0), - output_field=models.DecimalField(), - ) - ) - queryset = queryset.annotate( ordering=part_filters.annotate_on_order_quantity(), in_stock=part_filters.annotate_total_stock(), @@ -775,7 +762,8 @@ class PartSerializer( category_detail = enable_filter( CategorySerializer( source='category', many=False, read_only=True, allow_null=True - ) + ), + prefetch_fields=['category'], ) category_path = enable_filter( @@ -786,6 +774,7 @@ class PartSerializer( allow_null=True, ), filter_name='path_detail', + prefetch_fields=['category'], ) default_location_detail = enable_filter( @@ -793,6 +782,7 @@ class PartSerializer( source='default_location', many=False, read_only=True, allow_null=True ), filter_name='location_detail', + prefetch_fields=['default_location'], ) category_name = serializers.CharField( @@ -860,10 +850,6 @@ class PartSerializer( read_only=True, allow_null=True, label=_('Revisions') ) - suppliers = serializers.IntegerField( - read_only=True, allow_null=True, label=_('Suppliers') - ) - total_in_stock = serializers.FloatField( read_only=True, allow_null=True, label=_('Total Stock') ) @@ -922,13 +908,7 @@ class PartSerializer( filter_name='pricing', ) - parameters = enable_filter( - common.serializers.ParameterSerializer( - many=True, read_only=True, allow_null=True - ), - False, - filter_name='parameters', - ) + parameters = common.filters.enable_parameters_filter() price_breaks = enable_filter( PartSalePriceSerializer( @@ -936,6 +916,7 @@ class PartSerializer( ), False, filter_name='price_breaks', + prefetch_fields=['salepricebreaks'], ) # Extra fields used only for creation of a new Part instance @@ -963,6 +944,7 @@ class PartSerializer( copy_category_parameters = serializers.BooleanField( default=True, required=False, + write_only=True, label=_('Copy Category Parameters'), help_text=_('Copy parameter templates from selected part category'), ) diff --git a/src/backend/InvenTree/stock/serializers.py b/src/backend/InvenTree/stock/serializers.py index 490ee2dc87..b6541db622 100644 --- a/src/backend/InvenTree/stock/serializers.py +++ b/src/backend/InvenTree/stock/serializers.py @@ -475,9 +475,7 @@ class StockItemSerializer( """Add some extra annotations to the queryset, performing database queries as efficiently as possible.""" queryset = queryset.prefetch_related( 'location', - 'allocations', 'sales_order', - 'sales_order_allocations', 'purchase_order', Prefetch( 'part', @@ -489,25 +487,15 @@ class StockItemSerializer( ), 'parent', 'part__category', - 'part__supplier_parts', - 'part__supplier_parts__purchase_order_line_items', 'part__pricing_data', - 'part__tags', 'supplier_part', - 'supplier_part__part', - 'supplier_part__supplier', 'supplier_part__manufacturer_part', - 'supplier_part__manufacturer_part__manufacturer', - 'supplier_part__manufacturer_part__tags', - 'supplier_part__purchase_order_line_items', - 'supplier_part__tags', - 'test_results', 'customer', 'belongs_to', 'sales_order', 'consumed_by', 'tags', - ) + ).select_related('part') # Annotate the queryset with the total allocated to sales orders queryset = queryset.annotate( @@ -586,7 +574,14 @@ class StockItemSerializer( read_only=True, allow_null=True, ), - True, + False, + prefetch_fields=[ + 'supplier_part__supplier', + 'supplier_part__manufacturer_part__manufacturer', + 'supplier_part__manufacturer_part__tags', + 'supplier_part__purchase_order_line_items', + 'supplier_part__tags', + ], ) part_detail = enable_filter( @@ -604,13 +599,20 @@ class StockItemSerializer( read_only=True, allow_null=True, ), - True, + False, + prefetch_fields=['location'], ) tests = enable_filter( StockItemTestResultSerializer( source='test_results', many=True, read_only=True, allow_null=True - ) + ), + False, + prefetch_fields=[ + 'test_results', + 'test_results__user', + 'test_results__template', + ], ) quantity = InvenTreeDecimalField() diff --git a/src/backend/InvenTree/stock/test_api.py b/src/backend/InvenTree/stock/test_api.py index f3973676ef..49936d9d6c 100644 --- a/src/backend/InvenTree/stock/test_api.py +++ b/src/backend/InvenTree/stock/test_api.py @@ -866,7 +866,9 @@ class StockItemListTest(StockAPITestCase): excluded_headers = ['metadata'] - with self.export_data(self.list_url) as data_file: + filters = {} + + with self.export_data(self.list_url, filters) as data_file: self.process_csv( data_file, required_cols=required_headers, @@ -875,9 +877,10 @@ class StockItemListTest(StockAPITestCase): ) # Now, add a filter to the results - with self.export_data( - self.list_url, {'location': 1, 'cascade': True} - ) as data_file: + filters['location'] = 1 + filters['cascade'] = True + + with self.export_data(self.list_url, filters) as data_file: data = self.process_csv(data_file, required_rows=9) for row in data: diff --git a/src/backend/InvenTree/users/permissions.py b/src/backend/InvenTree/users/permissions.py index c4dd898ed6..67b735ae4b 100644 --- a/src/backend/InvenTree/users/permissions.py +++ b/src/backend/InvenTree/users/permissions.py @@ -1,7 +1,10 @@ """Helper functions for user permission checks.""" +from typing import Optional + from django.contrib.auth.models import User from django.db import models +from django.db.models.query import Prefetch, QuerySet import InvenTree.cache from users.ruleset import RULESET_CHANGE_INHERIT, get_ruleset_ignore, get_ruleset_models @@ -55,8 +58,26 @@ def split_permission(app: str, perm: str) -> tuple[str, str]: return perm, model +def prefetch_rule_sets(user) -> QuerySet: + """Return a queryset of groups with prefetched rule sets for the given user. + + Arguments: + user: The user object + + Returns: + QuerySet: The queryset of groups with prefetched rule sets + """ + return user.groups.all().prefetch_related( + Prefetch('rule_sets', to_attr='prefetched_rule_sets') + ) + + def check_user_role( - user: User, role: str, permission: str, allow_inactive: bool = False + user: User, + role: str, + permission: str, + allow_inactive: bool = False, + groups: Optional[QuerySet] = None, ) -> bool: """Check if a user has a particular role:permission combination. @@ -65,6 +86,7 @@ def check_user_role( role: The role to check (e.g. 'part' / 'stock') permission: The permission to check (e.g. 'view' / 'delete') allow_inactive: If False, disallow inactive users from having permissions + groups: Optional cached queryset of groups to check (defaults to user's groups) Returns: bool: True if the user has the specified role:permission combination @@ -90,8 +112,10 @@ def check_user_role( # Default for no match result = False - for group in user.groups.all(): - for rule in group.rule_sets.all(): + groups = groups or prefetch_rule_sets(user) + + for group in groups: + for rule in group.prefetched_rule_sets: if rule.name == role: # Check if the rule has the specified permission # e.g. "view" role maps to "can_view" attribute diff --git a/src/backend/InvenTree/users/serializers.py b/src/backend/InvenTree/users/serializers.py index 178d8c483c..28b67204f9 100644 --- a/src/backend/InvenTree/users/serializers.py +++ b/src/backend/InvenTree/users/serializers.py @@ -19,7 +19,7 @@ from InvenTree.serializers import ( ) from .models import ApiToken, Owner, RuleSet, UserProfile -from .permissions import check_user_role +from .permissions import check_user_role, prefetch_rule_sets from .ruleset import RULESET_CHOICES, RULESET_PERMISSIONS, RuleSetEnum @@ -83,13 +83,16 @@ class RoleSerializer(InvenTreeModelSerializer): """Roles associated with the user.""" roles = {} + # Cache the 'groups' queryset for the user + groups = prefetch_rule_sets(user) + for ruleset in RULESET_CHOICES: role, _text = ruleset permissions = [] for permission in RULESET_PERMISSIONS: - if check_user_role(user, role, permission): + if check_user_role(user, role, permission, groups=groups): permissions.append(permission) if len(permissions) > 0: diff --git a/src/frontend/src/tables/build/BuildLineTable.tsx b/src/frontend/src/tables/build/BuildLineTable.tsx index 976f977c62..a247b69018 100644 --- a/src/frontend/src/tables/build/BuildLineTable.tsx +++ b/src/frontend/src/tables/build/BuildLineTable.tsx @@ -972,8 +972,10 @@ export default function BuildLineTable({ ...params, build: build.pk, assembly_detail: false, + bom_item_detail: true, category_detail: true, - part_detail: true + part_detail: true, + allocations: true }, tableActions: tableActions, tableFilters: tableFilters, diff --git a/src/frontend/src/tables/build/BuildOutputTable.tsx b/src/frontend/src/tables/build/BuildOutputTable.tsx index 319db2476f..35f86c6993 100644 --- a/src/frontend/src/tables/build/BuildOutputTable.tsx +++ b/src/frontend/src/tables/build/BuildOutputTable.tsx @@ -206,7 +206,9 @@ export default function BuildOutputTable({ .get(apiUrl(ApiEndpoints.build_line_list), { params: { build: buildId, - tracked: true + tracked: true, + bom_item_detail: true, + allocations: true } }) .then((response) => response.data); diff --git a/src/frontend/src/tables/part/PartBuildAllocationsTable.tsx b/src/frontend/src/tables/part/PartBuildAllocationsTable.tsx index 1fbda1c775..ee4b58f650 100644 --- a/src/frontend/src/tables/part/PartBuildAllocationsTable.tsx +++ b/src/frontend/src/tables/part/PartBuildAllocationsTable.tsx @@ -165,7 +165,8 @@ export default function PartBuildAllocationsTable({ project_code_detail: true, assembly_detail: true, build_detail: true, - order_outstanding: true + order_outstanding: true, + allocations: true }, enableColumnSwitching: true, enableSearch: false, diff --git a/src/frontend/src/tables/purchasing/PurchaseOrderLineItemTable.tsx b/src/frontend/src/tables/purchasing/PurchaseOrderLineItemTable.tsx index 7fc536e2b0..293ab271df 100644 --- a/src/frontend/src/tables/purchasing/PurchaseOrderLineItemTable.tsx +++ b/src/frontend/src/tables/purchasing/PurchaseOrderLineItemTable.tsx @@ -439,7 +439,8 @@ export function PurchaseOrderLineItemTable({ params: { ...params, order: orderId, - part_detail: true + part_detail: true, + destination_detail: true }, rowActions: rowActions, tableActions: tableActions, diff --git a/src/frontend/tests/pages/pui_purchase_order.spec.ts b/src/frontend/tests/pages/pui_purchase_order.spec.ts index 2ce5412e13..a31118799a 100644 --- a/src/frontend/tests/pages/pui_purchase_order.spec.ts +++ b/src/frontend/tests/pages/pui_purchase_order.spec.ts @@ -419,7 +419,8 @@ test('Purchase Orders - Receive Items', async ({ browser }) => { .getByRole('cell', { name: /Choose Location/ }) .getByText('Room 101') .waitFor(); - await page.getByText('Mechanical Lab').waitFor(); + + await page.getByText('Mechanical Lab').first().waitFor(); await page.getByRole('button', { name: 'Cancel' }).click(); From c78b03b6ff66e3ff48c1123fe6d9735932bdb07f Mon Sep 17 00:00:00 2001 From: Oliver Date: Tue, 16 Dec 2025 18:15:32 +1100 Subject: [PATCH 63/76] [ui] Table fix (#11022) * Optimize printing actions - Don't fire API request until dialog is opened - This prevents a lot of unnecessary API calls from the UI * Do not fire export options query until required --- .../src/components/buttons/PrintingActions.tsx | 8 ++++++-- src/frontend/src/hooks/UseDataExport.tsx | 12 ++++++++++-- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/frontend/src/components/buttons/PrintingActions.tsx b/src/frontend/src/components/buttons/PrintingActions.tsx index 4dbb997af9..7f028320b8 100644 --- a/src/frontend/src/components/buttons/PrintingActions.tsx +++ b/src/frontend/src/components/buttons/PrintingActions.tsx @@ -64,10 +64,12 @@ export function PrintingActions({ const [itemIdList, setItemIdList] = useState([]); + const [labelDialogOpen, setLabelDialogOpen] = useState(false); + // Fetch available printing fields via OPTIONS request const printingFields = useQuery({ - enabled: labelPrintingEnabled, - queryKey: ['printingFields', modelType, pluginKey], + enabled: labelDialogOpen && !!modelType && !!labelPrintingEnabled, + queryKey: ['printingFields', modelType, pluginKey, labelDialogOpen], gcTime: 500, queryFn: () => api @@ -126,9 +128,11 @@ export function PrintingActions({ fields: labelFields, timeout: 5000, onOpen: () => { + setLabelDialogOpen(true); setItemIdList(items); }, onClose: () => { + setLabelDialogOpen(false); setPluginKey(''); }, submitText: t`Print`, diff --git a/src/frontend/src/hooks/UseDataExport.tsx b/src/frontend/src/hooks/UseDataExport.tsx index 8237f326e8..bf5b2e5611 100644 --- a/src/frontend/src/hooks/UseDataExport.tsx +++ b/src/frontend/src/hooks/UseDataExport.tsx @@ -59,10 +59,12 @@ export default function useDataExport({ return queryParams; }, [pluginKey, filters, searchTerm]); + const [exportDialogOpen, setExportDialogOpen] = useState(false); + // Fetch available export fields via OPTIONS request const extraExportFields = useQuery({ - enabled: !!url && enabled, - queryKey: ['export-fields', pluginKey, url, exportParams], + enabled: !!url && enabled && exportDialogOpen, + queryKey: ['export-fields', pluginKey, url, exportParams, exportDialogOpen], gcTime: 500, queryFn: () => api @@ -112,6 +114,12 @@ export default function useDataExport({ submitText: t`Export`, successMessage: null, timeout: 30 * 1000, + onOpen: () => { + setExportDialogOpen(true); + }, + onClose: () => { + setExportDialogOpen(false); + }, onFormSuccess: (response: any) => { setExportId(response.pk); setPluginKey('inventree-exporter'); From 19239c86212d7ac3c28e6cf362d33749cbc8a357 Mon Sep 17 00:00:00 2001 From: Oliver Date: Tue, 16 Dec 2025 21:13:28 +1100 Subject: [PATCH 64/76] [API] API refactoring (#11023) * API refactoring - Specify prefetch_fields for optional child serializers - Ref: https://github.com/inventree/InvenTree/pull/11012/ * Fixes for unit tests --- src/backend/InvenTree/InvenTree/api_version.py | 6 +++++- src/backend/InvenTree/build/serializers.py | 1 + src/backend/InvenTree/common/api.py | 4 +--- src/backend/InvenTree/common/serializers.py | 8 ++++++-- src/backend/InvenTree/company/api.py | 7 ------- src/backend/InvenTree/company/serializers.py | 5 ++++- src/backend/InvenTree/part/api.py | 4 +++- src/backend/InvenTree/part/serializers.py | 16 ++++++++++++---- src/backend/InvenTree/part/test_api.py | 3 ++- src/backend/InvenTree/stock/serializers.py | 12 ++++++++---- src/backend/InvenTree/users/api.py | 7 ------- src/backend/InvenTree/users/serializers.py | 2 ++ 12 files changed, 44 insertions(+), 31 deletions(-) diff --git a/src/backend/InvenTree/InvenTree/api_version.py b/src/backend/InvenTree/InvenTree/api_version.py index a1e04531d4..81d0e5ba0b 100644 --- a/src/backend/InvenTree/InvenTree/api_version.py +++ b/src/backend/InvenTree/InvenTree/api_version.py @@ -1,11 +1,15 @@ """InvenTree API version information.""" # InvenTree API version -INVENTREE_API_VERSION = 432 +INVENTREE_API_VERSION = 433 """Increment this API version number whenever there is a significant change to the API that any clients need to know about.""" INVENTREE_API_TEXT = """ +v433 -> 2025-12-16 : https://github.com/inventree/InvenTree/pull/11023 + - "substitutes" field on the BomItem API endpoint is now excluded by default + - Add "?substitutes=true" query parameter to include substitute parts in BomItem API endpoint(s) + v432 -> 2025-12-15 : https://github.com/inventree/InvenTree/pull/11012 - The "part_detail" field on the SupplierPart API endpoint is now optional - The "supplier_detail" field on the SupplierPart API endpoint is now optional diff --git a/src/backend/InvenTree/build/serializers.py b/src/backend/InvenTree/build/serializers.py index 97324bef95..19e01491a8 100644 --- a/src/backend/InvenTree/build/serializers.py +++ b/src/backend/InvenTree/build/serializers.py @@ -1435,6 +1435,7 @@ class BuildLineSerializer( can_build=False, ), False, + prefetch_fields=['bom_item'], ) assembly_detail = enable_filter( diff --git a/src/backend/InvenTree/common/api.py b/src/backend/InvenTree/common/api.py index ae972f6ed1..4118548acc 100644 --- a/src/backend/InvenTree/common/api.py +++ b/src/backend/InvenTree/common/api.py @@ -893,9 +893,7 @@ class ParameterFilter(FilterSet): class ParameterMixin: """Mixin class for Parameter views.""" - queryset = common.models.Parameter.objects.all().prefetch_related( - 'model_type', 'updated_by', 'template', 'template__model_type' - ) + queryset = common.models.Parameter.objects.all().prefetch_related('model_type') serializer_class = common.serializers.ParameterSerializer permission_classes = [IsAuthenticatedOrReadScope] diff --git a/src/backend/InvenTree/common/serializers.py b/src/backend/InvenTree/common/serializers.py index 49c777b476..b69593a559 100644 --- a/src/backend/InvenTree/common/serializers.py +++ b/src/backend/InvenTree/common/serializers.py @@ -808,11 +808,15 @@ class ParameterSerializer( ) updated_by_detail = enable_filter( - UserSerializer(source='updated_by', read_only=True, many=False), True + UserSerializer(source='updated_by', read_only=True, many=False), + True, + prefetch_fields=['updated_by'], ) template_detail = enable_filter( - ParameterTemplateSerializer(source='template', read_only=True, many=False), True + ParameterTemplateSerializer(source='template', read_only=True, many=False), + True, + prefetch_fields=['template', 'template__model_type'], ) diff --git a/src/backend/InvenTree/company/api.py b/src/backend/InvenTree/company/api.py index ba119ce8e6..f76cc3a7c8 100644 --- a/src/backend/InvenTree/company/api.py +++ b/src/backend/InvenTree/company/api.py @@ -430,13 +430,6 @@ class SupplierPriceBreakMixin: queryset = SupplierPriceBreak.objects.all() serializer_class = SupplierPriceBreakSerializer - def get_queryset(self): - """Return annotated queryset for the SupplierPriceBreak list endpoint.""" - queryset = super().get_queryset() - queryset = SupplierPriceBreakSerializer.annotate_queryset(queryset) - - return queryset - class SupplierPriceBreakOutputOptions(OutputConfiguration): """Available output options for the SupplierPriceBreak endpoints.""" diff --git a/src/backend/InvenTree/company/serializers.py b/src/backend/InvenTree/company/serializers.py index eb4dc0f229..d9b7782436 100644 --- a/src/backend/InvenTree/company/serializers.py +++ b/src/backend/InvenTree/company/serializers.py @@ -572,7 +572,9 @@ class SupplierPriceBreakSerializer( supplier_detail = enable_filter( CompanyBriefSerializer( source='part.supplier', many=False, read_only=True, allow_null=True - ) + ), + False, + prefetch_fields=['part__supplier'], ) part_detail = enable_filter( @@ -580,4 +582,5 @@ class SupplierPriceBreakSerializer( source='part', brief=True, many=False, read_only=True, allow_null=True ), False, + prefetch_fields=['part', 'part__part', 'part__part__pricing_data'], ) diff --git a/src/backend/InvenTree/part/api.py b/src/backend/InvenTree/part/api.py index aa18739cbc..612fc02654 100644 --- a/src/backend/InvenTree/part/api.py +++ b/src/backend/InvenTree/part/api.py @@ -570,7 +570,7 @@ class PartPricingDetail(RetrieveUpdateAPI): """API endpoint for viewing part pricing data.""" serializer_class = part_serializers.PartPricingSerializer - queryset = Part.objects.all() + queryset = Part.objects.all().select_related('pricing_data') def get_object(self): """Return the PartPricing object associated with the linked Part.""" @@ -1361,6 +1361,8 @@ class BomOutputOptions(OutputConfiguration): InvenTreeOutputOption('can_build', default=True), InvenTreeOutputOption('part_detail'), InvenTreeOutputOption('sub_part_detail'), + InvenTreeOutputOption('substitutes'), + InvenTreeOutputOption('pricing'), ] diff --git a/src/backend/InvenTree/part/serializers.py b/src/backend/InvenTree/part/serializers.py index 0f5ad566ae..125c140ba6 100644 --- a/src/backend/InvenTree/part/serializers.py +++ b/src/backend/InvenTree/part/serializers.py @@ -1563,7 +1563,15 @@ class BomItemSerializer( ) substitutes = enable_filter( - BomItemSubstituteSerializer(many=True, read_only=True, allow_null=True), True + BomItemSubstituteSerializer(many=True, read_only=True, allow_null=True), + False, + filter_name='substitutes', + prefetch_fields=[ + 'substitutes', + 'substitutes__part', + 'substitutes__part__stock_items', + 'substitutes__part__pricing_data', + ], ) part_detail = enable_filter( @@ -1684,9 +1692,7 @@ class BomItemSerializer( 'sub_part__stock_items', 'sub_part__stock_items__allocations', 'sub_part__stock_items__sales_order_allocations', - 'substitutes', - 'substitutes__part__stock_items', - ).select_related('part__pricing_data', 'sub_part__pricing_data') + ) # Annotate with the 'total pricing' information based on unit pricing and quantity queryset = queryset.annotate( @@ -1751,6 +1757,7 @@ class CategoryParameterTemplateSerializer( source='template', many=False, read_only=True ), True, + prefetch_fields=['template'], ) category_detail = enable_filter( @@ -1758,6 +1765,7 @@ class CategoryParameterTemplateSerializer( source='category', many=False, read_only=True, allow_null=True ), True, + prefetch_fields=['category'], ) diff --git a/src/backend/InvenTree/part/test_api.py b/src/backend/InvenTree/part/test_api.py index 2deb287f08..97f52a9d88 100644 --- a/src/backend/InvenTree/part/test_api.py +++ b/src/backend/InvenTree/part/test_api.py @@ -2708,7 +2708,7 @@ class BomItemTest(InvenTreeAPITestCase): """Get the detail view for a single BomItem object.""" url = reverse('api-bom-item-detail', kwargs={'pk': 3}) - response = self.get(url, expected_code=200) + response = self.get(url, {'substitutes': True}, expected_code=200) expected_values = [ 'allow_variants', @@ -2882,6 +2882,7 @@ class BomItemTest(InvenTreeAPITestCase): # The BomItem detail endpoint should now also reflect the substitute data data = self.get( reverse('api-bom-item-detail', kwargs={'pk': bom_item.pk}), + data={'substitutes': True}, expected_code=200, ).data diff --git a/src/backend/InvenTree/stock/serializers.py b/src/backend/InvenTree/stock/serializers.py index b6541db622..9a8111dbc2 100644 --- a/src/backend/InvenTree/stock/serializers.py +++ b/src/backend/InvenTree/stock/serializers.py @@ -223,7 +223,8 @@ class StockItemTestResultSerializer( read_only_fields = ['pk', 'user', 'date'] user_detail = enable_filter( - UserSerializer(source='user', read_only=True, allow_null=True) + UserSerializer(source='user', read_only=True, allow_null=True), + prefetch_fields=['user'], ) template = serializers.PrimaryKeyRelatedField( @@ -238,7 +239,8 @@ class StockItemTestResultSerializer( template_detail = enable_filter( part_serializers.PartTestTemplateSerializer( source='template', read_only=True, allow_null=True - ) + ), + prefetch_fields=['template'], ) attachment = InvenTree.serializers.InvenTreeAttachmentSerializerField( @@ -1244,11 +1246,13 @@ class StockTrackingSerializer( label = serializers.CharField(read_only=True) item_detail = enable_filter( - StockItemSerializer(source='item', many=False, read_only=True, allow_null=True) + StockItemSerializer(source='item', many=False, read_only=True, allow_null=True), + prefetch_fields=['item'], ) user_detail = enable_filter( - UserSerializer(source='user', many=False, read_only=True, allow_null=True) + UserSerializer(source='user', many=False, read_only=True, allow_null=True), + prefetch_fields=['user'], ) deltas = serializers.JSONField(read_only=True) diff --git a/src/backend/InvenTree/users/api.py b/src/backend/InvenTree/users/api.py index 5cb0646719..42201ed095 100644 --- a/src/backend/InvenTree/users/api.py +++ b/src/backend/InvenTree/users/api.py @@ -291,13 +291,6 @@ class GroupMixin(SerializerContextMixin): serializer_class = GroupSerializer permission_classes = [InvenTree.permissions.IsStaffOrReadOnlyScope] - def get_queryset(self): - """Return queryset for this endpoint. - - Note that the queryset is filtered by the permissions of the current user. - """ - return super().get_queryset().prefetch_related('rule_sets', 'user_set') - class GroupOutputOptions(OutputConfiguration): """Holds all available output options for Group views.""" diff --git a/src/backend/InvenTree/users/serializers.py b/src/backend/InvenTree/users/serializers.py index 28b67204f9..0fdd481137 100644 --- a/src/backend/InvenTree/users/serializers.py +++ b/src/backend/InvenTree/users/serializers.py @@ -268,11 +268,13 @@ class GroupSerializer(FilterableSerializerMixin, InvenTreeModelSerializer): source='rule_sets', many=True, read_only=True, allow_null=True ), filter_name='role_detail', + prefetch_fields=['rule_sets'], ) users = enable_filter( UserSerializer(source='user_set', many=True, read_only=True, allow_null=True), filter_name='user_detail', + prefetch_fields=['user_set'], ) From 2eccf13c93d728ec8b9a6958f47bbb0c29794dbc Mon Sep 17 00:00:00 2001 From: Matthias Mair Date: Tue, 16 Dec 2025 12:12:35 +0100 Subject: [PATCH 65/76] Default Supplier Support Missing in 1.X.X (#10980) Fixes #10979 --- src/frontend/src/forms/PartForms.tsx | 8 ++++++++ src/frontend/src/pages/part/PartDetail.tsx | 7 +++++++ 2 files changed, 15 insertions(+) diff --git a/src/frontend/src/forms/PartForms.tsx b/src/frontend/src/forms/PartForms.tsx index 90f03bf78c..bdb3e25b74 100644 --- a/src/frontend/src/forms/PartForms.tsx +++ b/src/frontend/src/forms/PartForms.tsx @@ -1,3 +1,4 @@ +import { ApiEndpoints, ModelType, apiUrl } from '@lib/index'; import type { ApiFormFieldSet } from '@lib/types/Forms'; import { t } from '@lingui/core/macro'; import { IconBuildingStore, IconCopy, IconPackages } from '@tabler/icons-react'; @@ -53,6 +54,13 @@ export function usePartFields({ structural: false } }, + default_supplier: { + model: ModelType.company, + api_url: apiUrl(ApiEndpoints.company_list), + filters: { + is_supplier: true + } + }, default_expiry: {}, minimum_stock: {}, responsible: { diff --git a/src/frontend/src/pages/part/PartDetail.tsx b/src/frontend/src/pages/part/PartDetail.tsx index 23b9350fce..e5f97edfa6 100644 --- a/src/frontend/src/pages/part/PartDetail.tsx +++ b/src/frontend/src/pages/part/PartDetail.tsx @@ -501,6 +501,13 @@ export default function PartDetail() { model: ModelType.stocklocation, hidden: part.default_location || !part.category_default_location }, + { + type: 'link', + name: 'default_supplier', + label: t`Default Supplier`, + model: ModelType.company, + hidden: !part.default_supplier + }, { type: 'string', name: 'units', From 140c65b26c038dc0db2d8950969f2f61866e276b Mon Sep 17 00:00:00 2001 From: Oliver Date: Wed, 17 Dec 2025 07:14:56 +1100 Subject: [PATCH 66/76] [API] Tags filters (#11021) * Add optional "tags" field * Refactor "tags" field - Off by default - Only prefetch when requested (expensive) - Ref: https://github.com/inventree/InvenTree/pull/11012 - Ref: https://github.com/inventree/InvenTree/issues/11002 - Closes https://github.com/inventree/InvenTree/issues/10996 * Bump API version * Tweak unit tests * Ensure all fields are available when writing data * Handle case where request has *no* method --- .../InvenTree/InvenTree/api_version.py | 6 ++++- .../InvenTree/InvenTree/serializers.py | 15 ++++++++++- src/backend/InvenTree/build/serializers.py | 4 +-- src/backend/InvenTree/common/filters.py | 18 +++++++++++++ src/backend/InvenTree/common/serializers.py | 6 ++--- src/backend/InvenTree/company/api.py | 8 +++--- src/backend/InvenTree/company/models.py | 19 -------------- src/backend/InvenTree/company/serializers.py | 12 ++++----- src/backend/InvenTree/order/serializers.py | 1 - src/backend/InvenTree/part/api.py | 1 + src/backend/InvenTree/part/models.py | 25 +------------------ src/backend/InvenTree/part/serializers.py | 5 ++-- src/backend/InvenTree/part/test_api.py | 8 ++---- src/backend/InvenTree/part/test_category.py | 2 +- src/backend/InvenTree/stock/models.py | 17 +------------ src/backend/InvenTree/stock/serializers.py | 11 +++----- 16 files changed, 61 insertions(+), 97 deletions(-) diff --git a/src/backend/InvenTree/InvenTree/api_version.py b/src/backend/InvenTree/InvenTree/api_version.py index 81d0e5ba0b..358530faec 100644 --- a/src/backend/InvenTree/InvenTree/api_version.py +++ b/src/backend/InvenTree/InvenTree/api_version.py @@ -1,11 +1,15 @@ """InvenTree API version information.""" # InvenTree API version -INVENTREE_API_VERSION = 433 +INVENTREE_API_VERSION = 434 """Increment this API version number whenever there is a significant change to the API that any clients need to know about.""" INVENTREE_API_TEXT = """ +v434 -> 2025-12-16 : https://github.com/inventree/InvenTree/pull/11021 + - The "tags" fields (on various API endpoints) is now optional, and disabled by default + - To request tags information, add "tags=true" to the API request query parameters + v433 -> 2025-12-16 : https://github.com/inventree/InvenTree/pull/11023 - "substitutes" field on the BomItem API endpoint is now excluded by default - Add "?substitutes=true" query parameter to include substitute parts in BomItem API endpoint(s) diff --git a/src/backend/InvenTree/InvenTree/serializers.py b/src/backend/InvenTree/InvenTree/serializers.py index e9034344b5..6c21d9b2d6 100644 --- a/src/backend/InvenTree/InvenTree/serializers.py +++ b/src/backend/InvenTree/InvenTree/serializers.py @@ -23,7 +23,7 @@ from rest_framework.fields import empty from rest_framework.mixins import ListModelMixin from rest_framework.serializers import DecimalField from rest_framework.utils import model_meta -from taggit.serializers import TaggitSerializer +from taggit.serializers import TaggitSerializer, TagListSerializerField import common.models as common_models import InvenTree.ready @@ -211,6 +211,12 @@ class FilterableSerializerMixin: if getattr(self, '_exporting_data', False): return + # Skip filtering for a write requests - all fields should be present for data creation + if request := self.context.get('request', None): + if method := getattr(request, 'method', None): + if str(method).lower() in ['post', 'put', 'patch']: + return + # Throw out fields which are not requested (either by default or explicitly) for k, v in self.filter_target_values.items(): # See `enable_filter` where` is_filterable and is_filterable_vals are set @@ -253,6 +259,13 @@ class FilterableIntegerField(FilterableSerializerField, serializers.IntegerField """Custom IntegerField which allows filtering.""" +class FilterableTagListField(FilterableSerializerField, TagListSerializerField): + """Custom TagListSerializerField which allows filtering.""" + + class Meta: + """Empty Meta class.""" + + # endregion diff --git a/src/backend/InvenTree/build/serializers.py b/src/backend/InvenTree/build/serializers.py index 19e01491a8..b13d5fdf17 100644 --- a/src/backend/InvenTree/build/serializers.py +++ b/src/backend/InvenTree/build/serializers.py @@ -1238,7 +1238,6 @@ class BuildItemSerializer( filter_name='stock_detail', prefetch_fields=[ 'stock_item', - 'stock_item__tags', 'stock_item__part', 'stock_item__supplier_part', 'stock_item__supplier_part__manufacturer_part', @@ -1257,7 +1256,7 @@ class BuildItemSerializer( allow_null=True, ), True, - prefetch_fields=['stock_item__location', 'stock_item__location__tags'], + prefetch_fields=['stock_item__location'], ) build_detail = enable_filter( @@ -1389,7 +1388,6 @@ class BuildLineSerializer( 'allocations__stock_item__supplier_part', 'allocations__stock_item__supplier_part__manufacturer_part', 'allocations__stock_item__location', - 'allocations__stock_item__tags', ], ) diff --git a/src/backend/InvenTree/common/filters.py b/src/backend/InvenTree/common/filters.py index b75aea3a95..35b59908ed 100644 --- a/src/backend/InvenTree/common/filters.py +++ b/src/backend/InvenTree/common/filters.py @@ -380,3 +380,21 @@ def enable_parameters_filter(): 'parameters_list__template', ], ) + + +def enable_tags_filter(default: bool = False): + """Add an optional 'tags' field to an API serializer. + + Arguments: + default: If True, enable the filter by default. + + If applied, this field will automatically prefetch the 'tags' relationship. + """ + from InvenTree.serializers import FilterableTagListField + + return InvenTree.serializers.enable_filter( + FilterableTagListField(required=False), + default, + filter_name='tags', + prefetch_fields=['tags', 'tagged_items', 'tagged_items__tag'], + ) diff --git a/src/backend/InvenTree/common/serializers.py b/src/backend/InvenTree/common/serializers.py index b69593a559..d2fee07132 100644 --- a/src/backend/InvenTree/common/serializers.py +++ b/src/backend/InvenTree/common/serializers.py @@ -12,8 +12,8 @@ from error_report.models import Error from flags.state import flag_state from rest_framework import serializers from rest_framework.exceptions import PermissionDenied -from taggit.serializers import TagListSerializerField +import common.filters import common.models as common_models import common.validators import generic.states.custom @@ -612,7 +612,7 @@ class FailedTaskSerializer(InvenTreeModelSerializer): result = serializers.CharField() -class AttachmentSerializer(InvenTreeModelSerializer): +class AttachmentSerializer(FilterableSerializerMixin, InvenTreeModelSerializer): """Serializer class for the Attachment model.""" class Meta: @@ -645,7 +645,7 @@ class AttachmentSerializer(InvenTreeModelSerializer): 'model_type' ].choices = common.validators.attachment_model_options() - tags = TagListSerializerField(required=False) + tags = common.filters.enable_tags_filter() user_detail = UserSerializer(source='upload_user', read_only=True, many=False) diff --git a/src/backend/InvenTree/company/api.py b/src/backend/InvenTree/company/api.py index f76cc3a7c8..8ec8a4ae14 100644 --- a/src/backend/InvenTree/company/api.py +++ b/src/backend/InvenTree/company/api.py @@ -178,7 +178,7 @@ class ManufacturerPartMixin(SerializerContextMixin): """Return annotated queryset for the ManufacturerPart list endpoint.""" queryset = super().get_queryset(*args, **kwargs) - queryset = queryset.prefetch_related('supplier_parts', 'tags') + queryset = queryset.prefetch_related('supplier_parts') return queryset @@ -323,7 +323,7 @@ class SupplierPartOutputOptions(OutputConfiguration): class SupplierPartMixin: """Mixin class for SupplierPart API endpoints.""" - queryset = SupplierPart.objects.all().prefetch_related('tags') + queryset = SupplierPart.objects.all() serializer_class = SupplierPartSerializer def get_queryset(self, *args, **kwargs): @@ -331,9 +331,7 @@ class SupplierPartMixin: queryset = super().get_queryset(*args, **kwargs) queryset = SupplierPartSerializer.annotate_queryset(queryset) - queryset = queryset.prefetch_related( - 'part', 'part__pricing_data', 'manufacturer_part__tags' - ) + queryset = queryset.prefetch_related('part', 'part__pricing_data') return queryset diff --git a/src/backend/InvenTree/company/models.py b/src/backend/InvenTree/company/models.py index 4e83275df7..96934ff277 100644 --- a/src/backend/InvenTree/company/models.py +++ b/src/backend/InvenTree/company/models.py @@ -591,23 +591,6 @@ class ManufacturerPart( return s -class SupplierPartManager(models.Manager): - """Define custom SupplierPart objects manager. - - The main purpose of this manager is to improve database hit as the - SupplierPart model involves A LOT of foreign keys lookups - """ - - def get_queryset(self): - """Prefetch related fields when querying against the SupplierPart model.""" - # Always prefetch related models - return ( - super() - .get_queryset() - .prefetch_related('part', 'supplier', 'manufacturer_part__manufacturer') - ) - - class SupplierPart( InvenTree.models.InvenTreeAttachmentMixin, InvenTree.models.InvenTreeParameterMixin, @@ -647,8 +630,6 @@ class SupplierPart( # This model was moved from the 'Part' app db_table = 'part_supplierpart' - objects = SupplierPartManager() - tags = TaggableManager(blank=True) @staticmethod diff --git a/src/backend/InvenTree/company/serializers.py b/src/backend/InvenTree/company/serializers.py index d9b7782436..d68e3973fd 100644 --- a/src/backend/InvenTree/company/serializers.py +++ b/src/backend/InvenTree/company/serializers.py @@ -8,7 +8,6 @@ from django.utils.translation import gettext_lazy as _ from rest_framework import serializers from sql_util.utils import SubqueryCount -from taggit.serializers import TagListSerializerField import common.filters import company.filters @@ -260,7 +259,7 @@ class ManufacturerPartSerializer( 'parameters', ] - tags = TagListSerializerField(required=False) + tags = common.filters.enable_tags_filter() parameters = common.filters.enable_parameters_filter() @@ -383,7 +382,7 @@ class SupplierPartSerializer( 'pack_quantity_native', ] - tags = TagListSerializerField(required=False) + tags = common.filters.enable_tags_filter() def __init__(self, *args, **kwargs): """Initialize this serializer with extra detail fields as required.""" @@ -398,10 +397,9 @@ class SupplierPartSerializer( return if brief: - self.fields.pop('tags') - self.fields.pop('available') - self.fields.pop('on_order') - self.fields.pop('availability_updated') + self.fields.pop('available', None) + self.fields.pop('on_order', None) + self.fields.pop('availability_updated', None) # Annotated field showing total in-stock quantity in_stock = serializers.FloatField( diff --git a/src/backend/InvenTree/order/serializers.py b/src/backend/InvenTree/order/serializers.py index 0bdc90daa1..e8ca521915 100644 --- a/src/backend/InvenTree/order/serializers.py +++ b/src/backend/InvenTree/order/serializers.py @@ -563,7 +563,6 @@ class PurchaseOrderLineItemSerializer( 'part__part', 'part__part__pricing_data', 'part__part__default_location', - 'part__tags', 'part__supplier', 'part__manufacturer_part', 'part__manufacturer_part__manufacturer', diff --git a/src/backend/InvenTree/part/api.py b/src/backend/InvenTree/part/api.py index 612fc02654..8e969dea30 100644 --- a/src/backend/InvenTree/part/api.py +++ b/src/backend/InvenTree/part/api.py @@ -1060,6 +1060,7 @@ class PartOutputOptions(OutputConfiguration): InvenTreeOutputOption('location_detail'), InvenTreeOutputOption('path_detail'), InvenTreeOutputOption('price_breaks'), + InvenTreeOutputOption('tags'), ] diff --git a/src/backend/InvenTree/part/models.py b/src/backend/InvenTree/part/models.py index 2f2b74961f..6de1d544d0 100644 --- a/src/backend/InvenTree/part/models.py +++ b/src/backend/InvenTree/part/models.py @@ -347,29 +347,6 @@ def rename_part_image(instance, filename): return os.path.join(base, fname) -class PartManager(TreeManager): - """Defines a custom object manager for the Part model. - - The main purpose of this manager is to reduce the number of database hits, - as the Part model has a large number of ForeignKey fields! - """ - - def get_queryset(self): - """Perform default prefetch operations when accessing Part model from the database.""" - return ( - super() - .get_queryset() - .prefetch_related( - 'category', - 'pricing_data', - 'category__parent', - 'stock_items', - 'builds', - 'tags', - ) - ) - - class PartCategoryParameterTemplate(InvenTree.models.InvenTreeMetadataModel): """A PartCategoryParameterTemplate creates a unique relationship between a PartCategory and a ParameterTemplate. @@ -540,7 +517,7 @@ class Part( NODE_PARENT_KEY = 'variant_of' IMAGE_RENAME = rename_part_image - objects = PartManager() + objects = TreeManager() tags = TaggableManager(blank=True) diff --git a/src/backend/InvenTree/part/serializers.py b/src/backend/InvenTree/part/serializers.py index 125c140ba6..60ce08275a 100644 --- a/src/backend/InvenTree/part/serializers.py +++ b/src/backend/InvenTree/part/serializers.py @@ -19,7 +19,6 @@ from djmoney.contrib.exchange.models import convert_money from drf_spectacular.utils import extend_schema_field from rest_framework import serializers from sql_util.utils import SubqueryCount -from taggit.serializers import TagListSerializerField import common.currency import common.filters @@ -633,8 +632,6 @@ class PartSerializer( ] read_only_fields = ['barcode_hash', 'creation_date', 'creation_user'] - tags = TagListSerializerField(required=False) - def __init__(self, *args, **kwargs): """Custom initialization method for PartSerializer. @@ -910,6 +907,8 @@ class PartSerializer( parameters = common.filters.enable_parameters_filter() + tags = common.filters.enable_tags_filter() + price_breaks = enable_filter( PartSalePriceSerializer( source='salepricebreaks', many=True, read_only=True, allow_null=True diff --git a/src/backend/InvenTree/part/test_api.py b/src/backend/InvenTree/part/test_api.py index 97f52a9d88..6892488a7a 100644 --- a/src/backend/InvenTree/part/test_api.py +++ b/src/backend/InvenTree/part/test_api.py @@ -1734,8 +1734,6 @@ class PartDetailTests(PartImageTestMixin, PartAPITestBase): # Now, try to set the name to the *same* value # 2021-06-22 this test is to check that the "duplicate part" checks don't do strange things response = self.patch(url, {'name': 'a new better name'}) - - # Try to remove a tag response = self.patch(url, {'tags': ['tag1']}) self.assertEqual(response.data['tags'], ['tag1']) @@ -2051,8 +2049,7 @@ class PartListTests(PartAPITestBase): with CaptureQueriesContext(connection) as ctx: self.get(url, query, expected_code=200) - # No more than 25 database queries - self.assertLess(len(ctx), 25) + self.assertLess(len(ctx), 30) # Test 'category_detail' annotation for b in [False, True]: @@ -2065,8 +2062,7 @@ class PartListTests(PartAPITestBase): if b and result['category'] is not None: self.assertIn('category_detail', result) - # No more than 25 DB queries - self.assertLessEqual(len(ctx), 25) + self.assertLessEqual(len(ctx), 30) def test_price_breaks(self): """Test that price_breaks parameter works correctly and efficiently.""" diff --git a/src/backend/InvenTree/part/test_category.py b/src/backend/InvenTree/part/test_category.py index a5bb5e6a2d..dca64697da 100644 --- a/src/backend/InvenTree/part/test_category.py +++ b/src/backend/InvenTree/part/test_category.py @@ -157,7 +157,7 @@ class CategoryTest(TestCase): def test_parameters(self): """Test that the Category parameters are correctly fetched.""" # Check number of SQL queries to iterate other parameters - with self.assertNumQueries(9): + with self.assertNumQueries(3): # Prefetch: 3 queries (parts, parameters and parameters_template) fasteners = self.fasteners.prefetch_parts_parameters() # Iterate through all parts and parameters diff --git a/src/backend/InvenTree/stock/models.py b/src/backend/InvenTree/stock/models.py index 5d12cb4032..07fef64c5c 100644 --- a/src/backend/InvenTree/stock/models.py +++ b/src/backend/InvenTree/stock/models.py @@ -100,21 +100,6 @@ class StockLocationType(InvenTree.models.MetadataMixin, models.Model): ) -class StockLocationManager(TreeManager): - """Custom database manager for the StockLocation class. - - StockLocation querysets will automatically select related fields for performance. - """ - - def get_queryset(self): - """Prefetch queryset to optimize db hits. - - - Joins the StockLocationType by default for speedier icon access - """ - # return super().get_queryset().select_related("location_type") - return super().get_queryset() - - class StockLocationReportContext(report.mixins.BaseReportContext): """Report context for the StockLocation model. @@ -151,7 +136,7 @@ class StockLocation( EXTRA_PATH_FIELDS = ['icon'] - objects = StockLocationManager() + objects = TreeManager() class Meta: """Metaclass defines extra model properties.""" diff --git a/src/backend/InvenTree/stock/serializers.py b/src/backend/InvenTree/stock/serializers.py index 9a8111dbc2..f8d76e543a 100644 --- a/src/backend/InvenTree/stock/serializers.py +++ b/src/backend/InvenTree/stock/serializers.py @@ -14,9 +14,9 @@ from drf_spectacular.utils import extend_schema_field from rest_framework import serializers from rest_framework.serializers import ValidationError from sql_util.utils import SubqueryCount, SubquerySum -from taggit.serializers import TagListSerializerField import build.models +import common.filters import company.models import company.serializers as company_serializers import InvenTree.helpers @@ -496,7 +496,6 @@ class StockItemSerializer( 'belongs_to', 'sales_order', 'consumed_by', - 'tags', ).select_related('part') # Annotate the queryset with the total allocated to sales orders @@ -579,10 +578,8 @@ class StockItemSerializer( False, prefetch_fields=[ 'supplier_part__supplier', - 'supplier_part__manufacturer_part__manufacturer', - 'supplier_part__manufacturer_part__tags', 'supplier_part__purchase_order_line_items', - 'supplier_part__tags', + 'supplier_part__manufacturer_part__manufacturer', ], ) @@ -655,7 +652,7 @@ class StockItemSerializer( source='sales_order.reference', read_only=True, allow_null=True ) - tags = TagListSerializerField(required=False) + tags = common.filters.enable_tags_filter() class SerializeStockItemSerializer(serializers.Serializer): @@ -1196,7 +1193,7 @@ class LocationSerializer( level = serializers.IntegerField(read_only=True) - tags = TagListSerializerField(required=False) + tags = common.filters.enable_tags_filter() path = enable_filter( FilterableListField( From 8a614f4501137f0a151efdfa028380bf67b1ac0e Mon Sep 17 00:00:00 2001 From: Matthias Mair Date: Wed, 17 Dec 2025 00:20:58 +0100 Subject: [PATCH 67/76] deps(backend): bump allauth (#11030) * bump allauth * fix api schema generation * bump api --- src/backend/InvenTree/InvenTree/api_version.py | 5 ++++- .../InvenTree/InvenTree/management/commands/schema.py | 6 ++++-- src/backend/requirements.in | 2 +- src/backend/requirements.txt | 5 +++-- 4 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/backend/InvenTree/InvenTree/api_version.py b/src/backend/InvenTree/InvenTree/api_version.py index 358530faec..35d64fcb0d 100644 --- a/src/backend/InvenTree/InvenTree/api_version.py +++ b/src/backend/InvenTree/InvenTree/api_version.py @@ -1,11 +1,14 @@ """InvenTree API version information.""" # InvenTree API version -INVENTREE_API_VERSION = 434 +INVENTREE_API_VERSION = 435 """Increment this API version number whenever there is a significant change to the API that any clients need to know about.""" INVENTREE_API_TEXT = """ +v435 -> 2025-12-16 : https://github.com/inventree/InvenTree/pull/11030 + - Adds token refresh endpoint to auth API + v434 -> 2025-12-16 : https://github.com/inventree/InvenTree/pull/11021 - The "tags" fields (on various API endpoints) is now optional, and disabled by default - To request tags information, add "tags=true" to the API request query parameters diff --git a/src/backend/InvenTree/InvenTree/management/commands/schema.py b/src/backend/InvenTree/InvenTree/management/commands/schema.py index badf5702ad..5f7022411f 100644 --- a/src/backend/InvenTree/InvenTree/management/commands/schema.py +++ b/src/backend/InvenTree/InvenTree/management/commands/schema.py @@ -70,8 +70,10 @@ class Command(spectacular.Command): # Reformat paths for p_name, p_spec in spec['paths'].items(): # strip path name - p_name = p_name.removeprefix(dja_path_prefix).removeprefix( - '/_allauth/browser/v1/' + p_name = ( + p_name.removeprefix(dja_path_prefix) + .removeprefix('/_allauth/browser/v1/') + .removeprefix('/_allauth/app/v1/') ) # fix refs diff --git a/src/backend/requirements.in b/src/backend/requirements.in index 16c3e438cd..0336a282c8 100644 --- a/src/backend/requirements.in +++ b/src/backend/requirements.in @@ -3,7 +3,7 @@ django<6.0 # Django package blessed # CLI for Q Monitor cryptography>=44.0.0 # Core cryptographic functionality django-anymail[amazon_ses,postal] # Email backend for various providers -django-allauth[mfa,socialaccount,saml,openid] # SSO for external providers via OpenID +django-allauth[mfa,socialaccount,saml,openid,headless] # SSO for external providers via OpenID django-cleanup # Automated deletion of old / unused uploaded files django-cors-headers # CORS headers extension for DRF django-dbbackup>=5.0.0 # Backup / restore of database and media files diff --git a/src/backend/requirements.txt b/src/backend/requirements.txt index e012fd8d81..edf82dd762 100644 --- a/src/backend/requirements.txt +++ b/src/backend/requirements.txt @@ -523,8 +523,9 @@ django==5.2.9 \ # djangorestframework # djangorestframework-simplejwt # drf-spectacular -django-allauth[mfa, openid, saml, socialaccount]==65.12.1 \ - --hash=sha256:662666ff2d5c71766f66b1629ac7345c30796813221184e13e11ed7460940c6a +django-allauth[headless, mfa, openid, saml, socialaccount]==65.13.1 \ + --hash=sha256:2887294beedfd108b4b52ebd182e0ed373deaeb927fc5a22f77bbde3174704a6 \ + --hash=sha256:2af0d07812f8c1a8e3732feaabe6a9db5ecf3fad6b45b6a0f7fd825f656c5a15 # via -r src/backend/requirements.in django-anymail[amazon-ses, postal]==13.1 \ --hash=sha256:63e48402ec8258f17640eb73c8c64141f16d2f8ae7d448d0fb1c66e82b7cbcf6 \ From 145f4751c21d717ecdeb4209187e6b1c08de81fe Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 17 Dec 2025 10:34:10 +1100 Subject: [PATCH 68/76] chore(deps): bump filelock from 3.20.0 to 3.20.1 in /src/backend (#11032) * chore(deps): bump filelock from 3.20.0 to 3.20.1 in /src/backend Bumps [filelock](https://github.com/tox-dev/py-filelock) from 3.20.0 to 3.20.1. - [Release notes](https://github.com/tox-dev/py-filelock/releases) - [Changelog](https://github.com/tox-dev/filelock/blob/main/docs/changelog.rst) - [Commits](https://github.com/tox-dev/py-filelock/compare/3.20.0...3.20.1) --- updated-dependencies: - dependency-name: filelock dependency-version: 3.20.1 dependency-type: indirect ... Signed-off-by: dependabot[bot] * fix style --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Matthias Mair --- src/backend/requirements-dev.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/backend/requirements-dev.txt b/src/backend/requirements-dev.txt index 126637a2cb..303e543d8f 100644 --- a/src/backend/requirements-dev.txt +++ b/src/backend/requirements-dev.txt @@ -421,9 +421,9 @@ django-types==0.22.0 \ --hash=sha256:4cecc9eee846e7ff2a398bec9dfe6543e76efb922a7a58c5d6064bcb0e6a3dc5 \ --hash=sha256:ba15c756c7a732e58afd0737e54489f1c5e6f1bd24132e9199c637b1f88b057c # via -r src/backend/requirements-dev.in -filelock==3.20.0 \ - --hash=sha256:339b4732ffda5cd79b13f4e2711a31b0365ce445d95d243bb996273d072546a2 \ - --hash=sha256:711e943b4ec6be42e1d4e6690b48dc175c822967466bb31c0c293f34334c13f4 +filelock==3.20.1 \ + --hash=sha256:15d9e9a67306188a44baa72f569d2bfd803076269365fdea0934385da4dc361a \ + --hash=sha256:b8360948b351b80f420878d8516519a2204b07aefcdcfd24912a5d33127f188c # via virtualenv gprof2dot==2025.4.14 \ --hash=sha256:0742e4c0b4409a5e8777e739388a11e1ed3750be86895655312ea7c20bd0090e \ From 7b181bb5ae9bb42df147a045ad20acaeb15b456b Mon Sep 17 00:00:00 2001 From: Oliver Date: Wed, 17 Dec 2025 20:20:59 +1100 Subject: [PATCH 69/76] [API] Query improvements (#11034) * Improve prefetch fields for API * Cache ContentType queryset for getModelsWithMixin - Called a LOT of times for an options request - Store the list in the session cache - Much faster than redis - and expires after the session is complete * Skip optional prefetch for options requests * Custom implementation of DjangoModelPermission - Cache the queryset against the view - Prevents multiple hits for OPTIONS request - Saves > 100ms on /stock/ options request --- src/backend/InvenTree/InvenTree/cache.py | 21 ++++++++++++++ .../InvenTree/InvenTree/helpers_model.py | 29 +++++++++++++------ src/backend/InvenTree/InvenTree/metadata.py | 6 +++- .../InvenTree/InvenTree/permissions.py | 25 +++++++++++++++- .../InvenTree/InvenTree/serializers.py | 15 ++++++++-- src/backend/InvenTree/InvenTree/settings.py | 2 +- src/backend/InvenTree/company/serializers.py | 6 +++- src/backend/InvenTree/order/api.py | 6 ++-- src/backend/InvenTree/order/serializers.py | 13 +++++++-- 9 files changed, 101 insertions(+), 22 deletions(-) diff --git a/src/backend/InvenTree/InvenTree/cache.py b/src/backend/InvenTree/InvenTree/cache.py index 3d56a11815..00214610cc 100644 --- a/src/backend/InvenTree/InvenTree/cache.py +++ b/src/backend/InvenTree/InvenTree/cache.py @@ -4,6 +4,8 @@ import socket import threading from typing import Any +from django.db.utils import OperationalError, ProgrammingError + import structlog import InvenTree.config @@ -169,3 +171,22 @@ def set_session_cache(key: str, value: Any) -> None: if request_cache is not None: request_cache[key] = value + + +def get_cached_content_types(cache_key: str = 'all_content_types') -> list: + """Return a list of all ContentType objects, using session cache if possible.""" + from django.contrib.contenttypes.models import ContentType + + # Attempt to retrieve a list of ContentType objects from session cache + if content_types := get_session_cache(cache_key): + return content_types + + try: + content_types = list(ContentType.objects.all()) + if len(content_types) > 0: + set_session_cache(cache_key, content_types) + except (OperationalError, ProgrammingError): + # Database is likely not yet ready + content_types = [] + + return content_types diff --git a/src/backend/InvenTree/InvenTree/helpers_model.py b/src/backend/InvenTree/InvenTree/helpers_model.py index 2756b7b33a..5fa5ae3cea 100644 --- a/src/backend/InvenTree/InvenTree/helpers_model.py +++ b/src/backend/InvenTree/InvenTree/helpers_model.py @@ -24,6 +24,11 @@ from common.notifications import ( trigger_notification, ) from common.settings import get_global_setting +from InvenTree.cache import ( + get_cached_content_types, + get_session_cache, + set_session_cache, +) from InvenTree.format import format_money from InvenTree.ready import ignore_ready_warning @@ -270,17 +275,23 @@ def getModelsWithMixin(mixin_class) -> list: Returns: List of models that inherit from the given mixin class """ - from django.contrib.contenttypes.models import ContentType + # First, look in the session cache - to prevent repeated expensive comparisons + cache_key = f'models_with_mixin_{mixin_class.__name__}' - try: - db_models = [ - x.model_class() for x in ContentType.objects.all() if x is not None - ] - except (OperationalError, ProgrammingError): - # Database is likely not yet ready - db_models = [] + if cached_models := get_session_cache(cache_key): + return cached_models - return [x for x in db_models if x is not None and issubclass(x, mixin_class)] + content_types = get_cached_content_types() + + db_models = [x.model_class() for x in content_types if x is not None] + + models_with_mixin = [ + x for x in db_models if x is not None and issubclass(x, mixin_class) + ] + + # Store the result in the session cache + set_session_cache(cache_key, models_with_mixin) + return models_with_mixin def notify_responsible( diff --git a/src/backend/InvenTree/InvenTree/metadata.py b/src/backend/InvenTree/InvenTree/metadata.py index e7fb922d48..c45c20e832 100644 --- a/src/backend/InvenTree/InvenTree/metadata.py +++ b/src/backend/InvenTree/InvenTree/metadata.py @@ -23,7 +23,7 @@ logger = structlog.get_logger('inventree') class InvenTreeMetadata(SimpleMetadata): """Custom metadata class for the DRF API. - This custom metadata class imits the available "actions", + This custom metadata class limits the available "actions", based on the user's role permissions. Thus when a client send an OPTIONS request to an API endpoint, @@ -50,6 +50,10 @@ class InvenTreeMetadata(SimpleMetadata): for method in {'PUT', 'POST', 'GET'} & set(view.allowed_methods): view.request = clone_request(request, method) + + # Mark this request, to prevent expensive prefetching + view.request._metadata_requested = True + try: # Test global permissions if hasattr(view, 'check_permissions'): diff --git a/src/backend/InvenTree/InvenTree/permissions.py b/src/backend/InvenTree/InvenTree/permissions.py index bc48d862ea..bf4335e94c 100644 --- a/src/backend/InvenTree/InvenTree/permissions.py +++ b/src/backend/InvenTree/InvenTree/permissions.py @@ -149,7 +149,7 @@ class InvenTreeRoleScopeMixin(OASTokenMixin): class InvenTreeTokenMatchesOASRequirements(InvenTreeRoleScopeMixin): """Combines InvenTree role-based scope handling with OpenAPI schema token requirements. - Usesd as default permission class. + Used as default permission class. """ def has_permission(self, request, view): @@ -166,6 +166,29 @@ class InvenTreeTokenMatchesOASRequirements(InvenTreeRoleScopeMixin): return True +class ModelPermission(permissions.DjangoModelPermissions): + """Custom ModelPermission implementation which provides cached lookup of queryset. + + This is entirely for optimization purposes. + """ + + def _queryset(self, view): + """Return the queryset associated with this view, with caching. + + This is because in a metadata OPTIONS request, the view is copied multiple times. + We can cache the queryset to avoid repeated calculation. + """ + if getattr(view, '_cached_queryset', None) is not None: + return view._cached_queryset + + queryset = super()._queryset(view) + + if queryset is not None: + view._cached_queryset = queryset + + return queryset + + class RolePermission(InvenTreeRoleScopeMixin, permissions.BasePermission): """Role mixin for API endpoints, allowing us to specify the user "role" which is required for certain operations. diff --git a/src/backend/InvenTree/InvenTree/serializers.py b/src/backend/InvenTree/InvenTree/serializers.py index 6c21d9b2d6..3fc8e04db5 100644 --- a/src/backend/InvenTree/InvenTree/serializers.py +++ b/src/backend/InvenTree/InvenTree/serializers.py @@ -133,6 +133,15 @@ class FilterableSerializerMixin: Returns: The modified queryset with prefetching applied. """ + # If we are inside an OPTIONS request, DO NOT PREFETCH + if request := getattr(self, 'request', None): + if method := getattr(request, 'method', None): + if str(method).lower() == 'options': + return queryset + + if getattr(request, '_metadata_requested', False): + return queryset + # Gather up the set of simple 'prefetch' fields and functions prefetch_fields = set() @@ -797,6 +806,8 @@ class ContentTypeField(serializers.ChoiceField): Args: mixin_class: Optional mixin class to restrict valid content types. """ + from InvenTree.cache import get_cached_content_types + self.mixin_class = mixin_class # Override the 'choices' field, to limit to the appropriate models @@ -811,7 +822,7 @@ class ContentTypeField(serializers.ChoiceField): for model in models ] else: - content_types = ContentType.objects.all() + content_types = get_cached_content_types() kwargs['choices'] = [ (f'{ct.app_label}.{ct.model}', str(ct)) for ct in content_types @@ -828,8 +839,6 @@ class ContentTypeField(serializers.ChoiceField): def to_internal_value(self, data): """Convert string representation back to ContentType instance.""" - from django.contrib.contenttypes.models import ContentType - content_type = None if data in ['', None]: diff --git a/src/backend/InvenTree/InvenTree/settings.py b/src/backend/InvenTree/InvenTree/settings.py index 7becfe63c5..bdb8ababa9 100644 --- a/src/backend/InvenTree/InvenTree/settings.py +++ b/src/backend/InvenTree/InvenTree/settings.py @@ -592,7 +592,7 @@ REST_FRAMEWORK = { 'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination', 'DEFAULT_PERMISSION_CLASSES': [ 'rest_framework.permissions.IsAuthenticated', - 'rest_framework.permissions.DjangoModelPermissions', + 'InvenTree.permissions.ModelPermission', 'InvenTree.permissions.RolePermission', 'InvenTree.permissions.InvenTreeTokenMatchesOASRequirements', ], diff --git a/src/backend/InvenTree/company/serializers.py b/src/backend/InvenTree/company/serializers.py index d68e3973fd..b3c936ae49 100644 --- a/src/backend/InvenTree/company/serializers.py +++ b/src/backend/InvenTree/company/serializers.py @@ -268,7 +268,11 @@ class ManufacturerPartSerializer( source='part', many=False, read_only=True, allow_null=True ), True, - prefetch_fields=['part'], + prefetch_fields=[ + Prefetch( + 'part', queryset=part.models.Part.objects.select_related('pricing_data') + ) + ], ) pretty_name = enable_filter( diff --git a/src/backend/InvenTree/order/api.py b/src/backend/InvenTree/order/api.py index a81e338084..899f2b4411 100644 --- a/src/backend/InvenTree/order/api.py +++ b/src/backend/InvenTree/order/api.py @@ -1501,10 +1501,10 @@ class ReturnOrderMixin(SerializerContextMixin): def get_queryset(self, *args, **kwargs): """Return annotated queryset for this endpoint.""" queryset = super().get_queryset(*args, **kwargs) - - queryset = queryset.prefetch_related('customer', 'created_by') - queryset = serializers.ReturnOrderSerializer.annotate_queryset(queryset) + queryset = queryset.prefetch_related( + 'contact', 'created_by', 'customer', 'responsible' + ) return queryset diff --git a/src/backend/InvenTree/order/serializers.py b/src/backend/InvenTree/order/serializers.py index e8ca521915..33e5b6cf6f 100644 --- a/src/backend/InvenTree/order/serializers.py +++ b/src/backend/InvenTree/order/serializers.py @@ -1298,9 +1298,6 @@ class SalesOrderShipmentSerializer( @staticmethod def annotate_queryset(queryset): """Annotate the queryset with extra information.""" - # Prefetch related objects - queryset = queryset.prefetch_related('order', 'order__customer', 'allocations') - queryset = queryset.annotate(allocated_items=SubqueryCount('allocations')) return queryset @@ -1314,6 +1311,7 @@ class SalesOrderShipmentSerializer( source='checked_by', many=False, read_only=True, allow_null=True ), True, + prefetch_fields=['checked_by'], ) order_detail = enable_filter( @@ -1321,6 +1319,13 @@ class SalesOrderShipmentSerializer( source='order', read_only=True, allow_null=True, many=False ), True, + prefetch_fields=[ + 'order', + 'order__customer', + 'order__created_by', + 'order__responsible', + 'order__project_code', + ], ) customer_detail = enable_filter( @@ -1328,6 +1333,7 @@ class SalesOrderShipmentSerializer( source='order.customer', many=False, read_only=True, allow_null=True ), False, + prefetch_fields=['order__customer'], ) shipment_address_detail = enable_filter( @@ -1335,6 +1341,7 @@ class SalesOrderShipmentSerializer( source='shipment_address', many=False, read_only=True, allow_null=True ), True, + prefetch_fields=['shipment_address'], ) From 00091caf045782edce2ecb41b4977d18467936f9 Mon Sep 17 00:00:00 2001 From: Michael Date: Wed, 17 Dec 2025 23:31:40 +0100 Subject: [PATCH 70/76] change screenshot for plugin install to PUI (#11036) * change screenshot for plugin install to PUI * Correct location of gunicorn config in docs --- .../images/plugin/plugin_install_web.png | Bin 50799 -> 7986 bytes docs/docs/start/bare_prod.md | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/assets/images/plugin/plugin_install_web.png b/docs/docs/assets/images/plugin/plugin_install_web.png index 67ecc3bfd75f835d3405710b1597b707a1e10a02..053c1ce56ef58d4fba6410eb4cfca107d4d88aee 100644 GIT binary patch literal 7986 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 literal 50799 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 VylM>k^H-H`h3Bfz3ZBAz{|^`eQC9!} diff --git a/docs/docs/start/bare_prod.md b/docs/docs/start/bare_prod.md index db9e863788..3f2d405ad9 100644 --- a/docs/docs/start/bare_prod.md +++ b/docs/docs/start/bare_prod.md @@ -38,7 +38,7 @@ First, let's confirm that the gunicorn server is operational. cd /home/InvenTree source ./env/bin/activate -cd src/InvenTree +cd src/src/backend/InvenTree /home/inventree/env/bin/gunicorn -c gunicorn.conf.py InvenTree.wsgi -b 127.0.0.1:8000 ``` From 60ec998d5cee4e26894a776a0a3f00ceec42bd20 Mon Sep 17 00:00:00 2001 From: Oliver Date: Thu, 18 Dec 2025 17:50:58 +1100 Subject: [PATCH 71/76] [bug] BOM exporter (#11038) * [bug] BOM exporter - Ensure sub-items are correctly annotated for multi-level BOM export * Remove debug statements --- .../plugin/builtin/exporter/bom_exporter.py | 23 ++++++++++++++----- 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/src/backend/InvenTree/plugin/builtin/exporter/bom_exporter.py b/src/backend/InvenTree/plugin/builtin/exporter/bom_exporter.py index bb86ea0a1f..fd5efcbaab 100644 --- a/src/backend/InvenTree/plugin/builtin/exporter/bom_exporter.py +++ b/src/backend/InvenTree/plugin/builtin/exporter/bom_exporter.py @@ -9,6 +9,7 @@ import rest_framework.serializers as serializers from InvenTree.helpers import normalize from part.models import BomItem +from part.serializers import BomItemSerializer from plugin import InvenTreePlugin from plugin.mixins import DataExportMixin @@ -76,7 +77,10 @@ class BomExporterPlugin(DataExportMixin, InvenTreePlugin): def supports_export(self, model_class: type, user, *args, **kwargs) -> bool: """This exported only supports the BomItem model.""" - return model_class == BomItem + return ( + model_class == BomItem + and kwargs.get('serializer_class') == BomItemSerializer + ) def update_headers(self, headers, context, **kwargs): """Update headers for the BOM export.""" @@ -149,17 +153,23 @@ class BomExporterPlugin(DataExportMixin, InvenTreePlugin): queryset = queryset.prefetch_related('substitutes') if self.export_supplier_data: - queryset = queryset.prefetch_related('sub_part__supplier_parts') queryset = queryset.prefetch_related( - 'sub_part__supplier_parts__manufacturer_part' + 'sub_part__supplier_parts', + 'sub_part__supplier_parts__supplier', + 'sub_part__supplier_parts__manufacturer_part', + 'sub_part__supplier_parts__manufacturer_part__manufacturer', ) if self.export_manufacturer_data: - queryset = queryset.prefetch_related('sub_part__manufacturer_parts') + queryset = queryset.prefetch_related( + 'sub_part__manufacturer_parts', + 'sub_part__manufacturer_parts__manufacturer', + ) if self.export_parameter_data: - queryset = queryset.prefetch_related('sub_part__parameters_list') - queryset = queryset.prefetch_related('sub_part__parameters_list__template') + queryset = queryset.prefetch_related( + 'sub_part__parameters_list', 'sub_part__parameters_list__template' + ) return queryset @@ -242,6 +252,7 @@ class BomExporterPlugin(DataExportMixin, InvenTreePlugin): ): sub_items = bom_item.sub_part.get_bom_items() sub_items = self.prefetch_queryset(sub_items) + sub_items = BomItemSerializer.annotate_queryset(sub_items) for item in sub_items.all(): self.process_bom_row( From 79c43be4f15fb52181a42755600184a63d211c50 Mon Sep 17 00:00:00 2001 From: Matthias Mair Date: Thu, 18 Dec 2025 22:45:49 +0100 Subject: [PATCH 72/76] feat(backend): add performance tests (#11017) * feat(backend): add performance test ref #11002 * feat(backend): add performance test (#486) * chore(deps): bump the dependencies group across 1 directory with 2 updates (#11003) * chore(deps): bump the dependencies group across 1 directory with 2 updates Bumps the dependencies group with 2 updates in the /src/backend directory: [django-q2](https://github.com/GDay/django-q2) and [sentry-sdk](https://github.com/getsentry/sentry-python). Updates `django-q2` from 1.8.0 to 1.9.0 - [Release notes](https://github.com/GDay/django-q2/releases) - [Changelog](https://github.com/django-q2/django-q2/blob/master/CHANGELOG.md) - [Commits](https://github.com/GDay/django-q2/compare/v1.8.0...v1.9.0) Updates `sentry-sdk` from 2.46.0 to 2.47.0 - [Release notes](https://github.com/getsentry/sentry-python/releases) - [Changelog](https://github.com/getsentry/sentry-python/blob/master/CHANGELOG.md) - [Commits](https://github.com/getsentry/sentry-python/compare/2.46.0...2.47.0) --- updated-dependencies: - dependency-name: django-q2 dependency-version: 1.9.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: sentry-sdk dependency-version: 2.47.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies ... Signed-off-by: dependabot[bot] * fix style --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Matthias Mair * Rearrange python package installs in are metal setup (#11005) * Reorder pip installation steps in bare metal setup * Reorder pip installation steps in bare metal setup * remove unused lines * Fix docs formatting (#11008) * Remove prefetch_related from parametric data filter (#11007) - Not required as we do not process the parameter fields in python * [refactor] Generic status API (#11009) * Fix docs formatting * [refactor] cache custom states - Generic state API endpoint executed query for each state type - We can run a single database query and cache these in memory - Reduces query time by ~50% * [refactor] Build list (#11010) - Prefetch project_code - Annotate parameter data * Improve the documentation installation instructions. (#11011) Co-authored-by: Mitch Davis * [refactor] Improve primary_address annotation for Company API (#11006) * Refactor primary_address annotation - Remove SerializerMethodField - Better cache introspection * Allow address detail to be optional * Refactor address caching * Fix primary_address annotation * Remove "address_count" field - Pointless annotation which is not used anywhere * Update API version * Tweak docs page * Tweak unit tests * feat(backend): add performance test ref #11002 --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Michael Co-authored-by: Oliver Co-authored-by: Mitch Davis Co-authored-by: Mitch Davis * add oidc perm * fix run setup * add gitignore * pin action * enable DB for test * patch test detection * move test argument into tasks * seperate performance testing into own step * add automigration * update test * Increase MAX_QUERY_TIME to 60 seconds * use newer python for better prerformance / measurement options * skip plugin install step * add debug step * add debug stmt * make version import safe * fix command * more debugging * move import * rollback changes * do full install * rollback skip_plugins too * hide version * new debug try * add more debug * try 3.13 * try reinstalling the cffi * reinstall cffi? * reset debug * rollback debug steos * add initial tests --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Michael Co-authored-by: Oliver Co-authored-by: Mitch Davis Co-authored-by: Mitch Davis --- .github/workflows/qc_checks.yaml | 33 ++++++++++++ .gitignore | 3 ++ pyproject.toml | 6 +++ src/backend/InvenTree/InvenTree/ready.py | 2 +- src/backend/InvenTree/InvenTree/settings.py | 2 +- src/backend/InvenTree/InvenTree/unit_test.py | 10 +++- src/backend/InvenTree/InvenTree/version.py | 7 +-- src/backend/InvenTree/part/test_api.py | 15 +++++- src/backend/InvenTree/stock/test_api.py | 15 +++++- src/backend/requirements-dev.in | 2 + src/backend/requirements-dev.txt | 56 ++++++++++++++++++++ tasks.py | 27 +++++++--- 12 files changed, 164 insertions(+), 14 deletions(-) diff --git a/.github/workflows/qc_checks.yaml b/.github/workflows/qc_checks.yaml index be937e7abc..7e87cc1577 100644 --- a/.github/workflows/qc_checks.yaml +++ b/.github/workflows/qc_checks.yaml @@ -377,6 +377,39 @@ jobs: slug: inventree/InvenTree flags: backend + performance: + name: Tests - Performance + runs-on: ubuntu-24.04 + + needs: ["pre-commit", "paths-filter"] + if: needs.paths-filter.outputs.server == 'true' || needs.paths-filter.outputs.force == 'true' + permissions: + contents: read + id-token: write + + env: + INVENTREE_DB_NAME: inventree_unit_test_db.sqlite + INVENTREE_DB_ENGINE: sqlite3 + INVENTREE_PLUGINS_ENABLED: true + INVENTREE_CONSOLE_LOG: false + INVENTREE_AUTO_UPDATE: true + + steps: + - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # pin@v6.0.1 + with: + persist-credentials: false + - name: Environment Setup + uses: ./.github/actions/setup + with: + apt-dependency: gettext poppler-utils + dev-install: true + update: true + - name: Performance Reporting + uses: CodSpeedHQ/action@346a2d8a8d9d38909abd0bc3d23f773110f076ad # pin@v4 + with: + mode: simulation + run: inv dev.test --pytest + postgres: name: Tests - DB [PostgreSQL] runs-on: ubuntu-24.04 diff --git a/.gitignore b/.gitignore index 3ff470669e..b5d907f9e6 100644 --- a/.gitignore +++ b/.gitignore @@ -116,3 +116,6 @@ api.yaml # web frontend (static files) src/backend/InvenTree/web/static InvenTree/web/static + +# performance test results +.codspeed/ diff --git a/pyproject.toml b/pyproject.toml index 3b53f437d2..fa2658abfa 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -133,3 +133,9 @@ sections=["FUTURE","STDLIB","DJANGO","THIRDPARTY","FIRSTPARTY","LOCALFOLDER"] [tool.codespell] ignore-words-list = ["assertIn","SME","intoto","fitH"] + +[tool.pytest] +django_find_project = false +pythonpath = ["src/backend/InvenTree"] +DJANGO_SETTINGS_MODULE = "InvenTree.settings" +python_files = ["test*.py",] diff --git a/src/backend/InvenTree/InvenTree/ready.py b/src/backend/InvenTree/InvenTree/ready.py index 2fe3cf5846..b7fb78ca6b 100644 --- a/src/backend/InvenTree/InvenTree/ready.py +++ b/src/backend/InvenTree/InvenTree/ready.py @@ -30,7 +30,7 @@ def isAppLoaded(app_name: str) -> bool: def isInTestMode(): """Returns True if the database is in testing mode.""" - return 'test' in sys.argv + return 'test' in sys.argv or sys.argv[0].endswith('pytest') def isImportingData(): diff --git a/src/backend/InvenTree/InvenTree/settings.py b/src/backend/InvenTree/InvenTree/settings.py index bdb8ababa9..1945e3c8c4 100644 --- a/src/backend/InvenTree/InvenTree/settings.py +++ b/src/backend/InvenTree/InvenTree/settings.py @@ -53,7 +53,7 @@ INVENTREE_BASE_URL = 'https://inventree.org' INVENTREE_NEWS_URL = f'{INVENTREE_BASE_URL}/news/feed.atom' # Determine if we are running in "test" mode e.g. "manage.py test" -TESTING = 'test' in sys.argv or 'TESTING' in os.environ +TESTING = 'test' in sys.argv or 'TESTING' in os.environ or 'pytest' in sys.argv if TESTING: # Use a weaker password hasher for testing (improves testing speed) diff --git a/src/backend/InvenTree/InvenTree/unit_test.py b/src/backend/InvenTree/InvenTree/unit_test.py index 305bd0c506..5360d9f71d 100644 --- a/src/backend/InvenTree/InvenTree/unit_test.py +++ b/src/backend/InvenTree/InvenTree/unit_test.py @@ -16,7 +16,7 @@ from django.contrib.auth import get_user_model from django.contrib.auth.models import Group, Permission, User from django.db import connections, models from django.http.response import StreamingHttpResponse -from django.test import TestCase +from django.test import TestCase, tag from django.test.utils import CaptureQueriesContext, override_settings from django.urls import reverse @@ -824,3 +824,11 @@ class AdminTestCase(InvenTreeAPITestCase): def in_env_context(envs): """Patch the env to include the given dict.""" return mock.patch.dict(os.environ, envs) + + +@tag('performance_test') +class InvenTreeAPIPerformanceTestCase(InvenTreeAPITestCase): + """Base class for InvenTree API performance tests.""" + + MAX_QUERY_COUNT = 50 + MAX_QUERY_TIME = 60 diff --git a/src/backend/InvenTree/InvenTree/version.py b/src/backend/InvenTree/InvenTree/version.py index da1638a150..387d60c0fb 100644 --- a/src/backend/InvenTree/InvenTree/version.py +++ b/src/backend/InvenTree/InvenTree/version.py @@ -12,9 +12,6 @@ import sys from datetime import datetime as dt from datetime import timedelta as td -import django -from django.conf import settings - from .api_version import INVENTREE_API_TEXT, INVENTREE_API_VERSION # InvenTree software version @@ -230,6 +227,8 @@ def inventreeApiText(versions: int = 10, start_version: int = 0): def inventreeDjangoVersion(): """Returns the version of Django library.""" + import django + return django.get_version() @@ -296,6 +295,8 @@ def inventreePlatform(): def inventreeDatabase(): """Return the InvenTree database backend e.g. 'postgresql'.""" + from django.conf import settings + return settings.DB_ENGINE diff --git a/src/backend/InvenTree/part/test_api.py b/src/backend/InvenTree/part/test_api.py index 6892488a7a..224d0c6ab6 100644 --- a/src/backend/InvenTree/part/test_api.py +++ b/src/backend/InvenTree/part/test_api.py @@ -11,6 +11,7 @@ from django.db import connection from django.test.utils import CaptureQueriesContext from django.urls import reverse +import pytest from PIL import Image from rest_framework.test import APIClient @@ -21,7 +22,7 @@ from build.status_codes import BuildStatus from common.models import InvenTreeSetting, ParameterTemplate from company.models import Company, SupplierPart from InvenTree.config import get_testfolder_dir -from InvenTree.unit_test import InvenTreeAPITestCase +from InvenTree.unit_test import InvenTreeAPIPerformanceTestCase, InvenTreeAPITestCase from order.status_codes import PurchaseOrderStatusGroups from part.models import ( BomItem, @@ -3349,3 +3350,15 @@ class ParameterTests(PartAPITestBase): self.assertIn('export_format', fields) self.assertIn('export_plugin', fields) + + +class PartApiPerformanceTest(PartAPITestBase, InvenTreeAPIPerformanceTestCase): + """Performance tests for the Part API.""" + + @pytest.mark.django_db + @pytest.mark.benchmark + def test_api_part_list(self): + """Test that Part API queries are performant.""" + url = reverse('api-part-list') + response = self.get(url, expected_code=200) + self.assertGreater(len(response.data), 13) diff --git a/src/backend/InvenTree/stock/test_api.py b/src/backend/InvenTree/stock/test_api.py index 49936d9d6c..7b267facb2 100644 --- a/src/backend/InvenTree/stock/test_api.py +++ b/src/backend/InvenTree/stock/test_api.py @@ -9,6 +9,7 @@ from django.contrib.contenttypes.models import ContentType from django.core.exceptions import ValidationError from django.urls import reverse +import pytest from djmoney.money import Money from rest_framework import status @@ -17,7 +18,7 @@ import company.models import part.models from common.models import InvenTreeCustomUserStateModel, InvenTreeSetting from common.settings import set_global_setting -from InvenTree.unit_test import InvenTreeAPITestCase +from InvenTree.unit_test import InvenTreeAPIPerformanceTestCase, InvenTreeAPITestCase from part.models import Part, PartTestTemplate from stock.models import ( StockItem, @@ -2549,3 +2550,15 @@ class StockMetadataAPITest(InvenTreeAPITestCase): 'api-stock-item-metadata': StockItem, }.items(): self.metatester(apikey, model) + + +class StockApiPerformanceTest(StockAPITestCase, InvenTreeAPIPerformanceTestCase): + """Performance tests for the Stock API.""" + + @pytest.mark.django_db + @pytest.mark.benchmark + def test_api_stock_list(self): + """Test that Stock API queries are performant.""" + url = reverse('api-stock-list') + response = self.get(url, expected_code=200) + self.assertGreater(len(response.data), 13) diff --git a/src/backend/requirements-dev.in b/src/backend/requirements-dev.in index 5764b6d019..a149abf7b0 100644 --- a/src/backend/requirements-dev.in +++ b/src/backend/requirements-dev.in @@ -14,3 +14,5 @@ ty # type checking django-types # typing django-stubs # typing requests-mock # Mock requests for unit tests +pytest-codspeed # Performance testing with Codspeed +pytest-django # Pytest support for Django (for benchnmarking) diff --git a/src/backend/requirements-dev.txt b/src/backend/requirements-dev.txt index 303e543d8f..ba69523baf 100644 --- a/src/backend/requirements-dev.txt +++ b/src/backend/requirements-dev.txt @@ -104,6 +104,7 @@ cffi==2.0.0 \ # via # -c src/backend/requirements.txt # cryptography + # pytest-codspeed cfgv==3.5.0 \ --hash=sha256:a8dc6b26ad22ff227d2634a65cb388215ce6cc96bbcc5cfde7641ae87e8dacc0 \ --hash=sha256:d5b1034354820651caa73ede66a6294d6e95c1b00acc5e9b098e917404669132 @@ -439,10 +440,22 @@ idna==3.11 \ # via # -c src/backend/requirements.txt # requests +iniconfig==2.3.0 \ + --hash=sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730 \ + --hash=sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12 + # via pytest isort==7.0.0 \ --hash=sha256:1bcabac8bc3c36c7fb7b98a76c8abb18e0f841a3ba81decac7691008592499c1 \ --hash=sha256:5513527951aadb3ac4292a41a16cbc50dd1642432f5e8c20057d414bdafb4187 # via -r src/backend/requirements-dev.in +markdown-it-py==4.0.0 \ + --hash=sha256:87327c59b172c5011896038353a81343b6754500a08cd7a4973bb48c6d578147 \ + --hash=sha256:cb0a2b4aa34f932c007117b194e945bd74e0ec24133ceb5bac59009cda1cb9f3 + # via rich +mdurl==0.1.2 \ + --hash=sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8 \ + --hash=sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba + # via markdown-it-py nodeenv==1.9.1 \ --hash=sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f \ --hash=sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9 @@ -453,6 +466,7 @@ packaging==25.0 \ # via # -c src/backend/requirements.txt # build + # pytest pdfminer-six==20251107 \ --hash=sha256:5fb0c553799c591777f22c0c72b77fc2522d7d10c70654e25f4c5f1fd996e008 \ --hash=sha256:c09df33e4cbe6b26b2a79248a4ffcccafaa5c5d39c9fff0e6e81567f165b5401 @@ -471,6 +485,10 @@ platformdirs==4.5.0 \ # via # -c src/backend/requirements.txt # virtualenv +pluggy==1.6.0 \ + --hash=sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3 \ + --hash=sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746 + # via pytest pre-commit==4.5.0 \ --hash=sha256:25e2ce09595174d9c97860a95609f9f852c0614ba602de3561e267547f2335e1 \ --hash=sha256:dc5a065e932b19fc1d4c653c6939068fe54325af8e741e74e88db4d28a4dd66b @@ -481,12 +499,46 @@ pycparser==2.23 \ # via # -c src/backend/requirements.txt # cffi +pygments==2.19.2 \ + --hash=sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887 \ + --hash=sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b + # via + # pytest + # rich pyproject-hooks==1.2.0 \ --hash=sha256:1e859bd5c40fae9448642dd871adf459e5e2084186e8d2c2a79a824c970da1f8 \ --hash=sha256:9e5c6bfa8dcc30091c74b0cf803c81fdd29d94f01992a7707bc97babb1141913 # via # build # pip-tools +pytest==9.0.2 \ + --hash=sha256:711ffd45bf766d5264d487b917733b453d917afd2b0ad65223959f59089f875b \ + --hash=sha256:75186651a92bd89611d1d9fc20f0b4345fd827c41ccd5c299a868a05d70edf11 + # via + # pytest-codspeed + # pytest-django +pytest-codspeed==4.2.0 \ + --hash=sha256:04b5d0bc5a1851ba1504d46bf9d7dbb355222a69f2cd440d54295db721b331f7 \ + --hash=sha256:0881a736285f33b9a8894da8fe8e1775aa1a4310226abe5d1f0329228efb680c \ + --hash=sha256:238e17abe8f08d8747fa6c7acff34fefd3c40f17a56a7847ca13dc8d6e8c6009 \ + --hash=sha256:23a0c0fbf8bb4de93a3454fd9e5efcdca164c778aaef0a9da4f233d85cb7f5b8 \ + --hash=sha256:2de87bde9fbc6fd53f0fd21dcf2599c89e0b8948d49f9bad224edce51c47e26b \ + --hash=sha256:309b4227f57fcbb9df21e889ea1ae191d0d1cd8b903b698fdb9ea0461dbf1dfe \ + --hash=sha256:50794dabea6ec90d4288904452051e2febace93e7edf4ca9f2bce8019dd8cd37 \ + --hash=sha256:609828b03972966b75b9b7416fa2570c4a0f6124f67e02d35cd3658e64312a7b \ + --hash=sha256:684fcd9491d810ded653a8d38de4835daa2d001645f4a23942862950664273f8 \ + --hash=sha256:72aab8278452a6d020798b9e4f82780966adb00f80d27a25d1274272c54630d5 \ + --hash=sha256:748411c832147bfc85f805af78a1ab1684f52d08e14aabe22932bbe46c079a5f \ + --hash=sha256:7d4fefbd4ae401e2c60f6be920a0be50eef0c3e4a1f0a1c83962efd45be38b39 \ + --hash=sha256:95aeb2479ca383f6b18e2cc9ebcd3b03ab184980a59a232aea6f370bbf59a1e3 \ + --hash=sha256:a0ebd87f2a99467a1cfd8e83492c4712976e43d353ee0b5f71cbb057f1393aca \ + --hash=sha256:dbbb2d61b85bef8fc7e2193f723f9ac2db388a48259d981bbce96319043e9830 \ + --hash=sha256:e81bbb45c130874ef99aca97929d72682733527a49f84239ba575b5cb843bab0 + # via -r src/backend/requirements-dev.in +pytest-django==4.11.1 \ + --hash=sha256:1b63773f648aa3d8541000c26929c1ea63934be1cfa674c76436966d73fe6a10 \ + --hash=sha256:a949141a1ee103cb0e7a20f1451d355f83f5e4a5d07bdd4dcfdd1fd0ff227991 + # via -r src/backend/requirements-dev.in pyyaml==6.0.3 \ --hash=sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c \ --hash=sha256:0150219816b6a1fa26fb4699fb7daa9caf09eb1999f3b70fb6e786805e80375a \ @@ -574,6 +626,10 @@ requests-mock==1.12.1 \ --hash=sha256:b1e37054004cdd5e56c84454cc7df12b25f90f382159087f4b6915aaeef39563 \ --hash=sha256:e9e12e333b525156e82a3c852f22016b9158220d2f47454de9cae8a77d371401 # via -r src/backend/requirements-dev.in +rich==14.2.0 \ + --hash=sha256:73ff50c7c0c1c77c8243079283f4edb376f0f6442433aecb8ce7e6d0b92d1fe4 \ + --hash=sha256:76bc51fe2e57d2b1be1f96c524b890b816e334ab4c1e45888799bfaab0021edd + # via pytest-codspeed setuptools==80.9.0 \ --hash=sha256:062d34222ad13e0cc312a4c02d73f059e86a4acbfbdea8f8f76b28c99f306922 \ --hash=sha256:f36b47402ecde768dbfafc46e8e4207b4360c654f1f3bb84475f0a28628fb19c diff --git a/tasks.py b/tasks.py index d0d1be5089..5eec350553 100644 --- a/tasks.py +++ b/tasks.py @@ -1284,6 +1284,7 @@ def test_translations(c): 'coverage': 'Run code coverage analysis (requires coverage package)', 'translations': 'Compile translations before running tests', 'keepdb': 'Keep the test database after running tests (default = False)', + 'pytest': 'Use pytest to run tests', } ) def test( @@ -1296,6 +1297,7 @@ def test( coverage=False, translations=False, keepdb=False, + pytest=False, ): """Run unit-tests for InvenTree codebase. @@ -1341,10 +1343,16 @@ def test( else: cmd += ' --exclude-tag migration_test' + cmd += ' --exclude-tag performance_test' + if coverage: # Run tests within coverage environment, and generate report run(c, f'coverage run {manage_py_path()} {cmd}') run(c, 'coverage xml -i') + elif pytest: + # Use pytest to run the tests + migrate(c) + run(c, f'pytest {manage_py_path().parent.parent} --codspeed') else: # Run simple test runner, without coverage manage(c, cmd, pty=pty) @@ -1529,6 +1537,13 @@ def version(c): get_static_dir, ) + def get_value(fnc): + """Helper function to safely get value from function, catching import exceptions.""" + try: + return fnc() + except (ModuleNotFoundError, ImportError): + return wrap_color('ENVIRONMENT ERROR', '91') + # Gather frontend version information _, node, yarn = node_available(versions=True) @@ -1561,17 +1576,17 @@ Invoke Tool {invoke_path} Installation paths: Base {local_dir()} -Config {get_config_file()} -Plugin File {get_plugin_file() or NOT_SPECIFIED} -Media {get_media_dir(error=False) or NOT_SPECIFIED} -Static {get_static_dir(error=False) or NOT_SPECIFIED} -Backup {get_backup_dir(error=False) or NOT_SPECIFIED} +Config {get_value(get_config_file)} +Plugin File {get_value(get_plugin_file) or NOT_SPECIFIED} +Media {get_value(lambda: get_media_dir(error=False)) or NOT_SPECIFIED} +Static {get_value(lambda: get_static_dir(error=False)) or NOT_SPECIFIED} +Backup {get_value(lambda: get_backup_dir(error=False)) or NOT_SPECIFIED} Versions: InvenTree {InvenTreeVersion.inventreeVersion()} API {InvenTreeVersion.inventreeApiVersion()} Python {python_version()} -Django {InvenTreeVersion.inventreeDjangoVersion()} +Django {get_value(InvenTreeVersion.inventreeDjangoVersion)} Node {node if node else NA} Yarn {yarn if yarn else NA} From a2676feeeb759984b608ee9f41c828a54a2f2ab5 Mon Sep 17 00:00:00 2001 From: Michael Date: Sat, 20 Dec 2025 22:35:22 +0100 Subject: [PATCH 73/76] Add more details to plugin installation doc (#11053) * change screenshot for plugin install to PUI * Correct location of gunicorn config in docs * Add more details to plugin installation doc * remove unused file --- .../assets/images/plugin/plugin_install_git.png | Bin 0 -> 12054 bytes .../assets/images/plugin/plugin_install_txt.png | Bin 0 -> 4001 bytes docs/docs/plugins/install.md | 10 +++++++++- 3 files changed, 9 insertions(+), 1 deletion(-) create mode 100644 docs/docs/assets/images/plugin/plugin_install_git.png create mode 100644 docs/docs/assets/images/plugin/plugin_install_txt.png diff --git a/docs/docs/assets/images/plugin/plugin_install_git.png b/docs/docs/assets/images/plugin/plugin_install_git.png new file mode 100644 index 0000000000000000000000000000000000000000..fe66c9a19c7dc8f93f7e995198cf5da15a97489c GIT binary patch literal 12054 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 literal 0 HcmV?d00001 diff --git a/docs/docs/assets/images/plugin/plugin_install_txt.png b/docs/docs/assets/images/plugin/plugin_install_txt.png new file mode 100644 index 0000000000000000000000000000000000000000..306f85eb49c83b36cfc2a029e176bd76563cffbb GIT binary patch literal 4001 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 B%ToXV literal 0 HcmV?d00001 diff --git a/docs/docs/plugins/install.md b/docs/docs/plugins/install.md index f0ca40839e..eedc97ca4a 100644 --- a/docs/docs/plugins/install.md +++ b/docs/docs/plugins/install.md @@ -65,8 +65,16 @@ Admin users can install plugins directly from the web interface, via the "Plugin {{ image("plugin/plugin_install_web.png", "Install plugin via web interface") }} +Enter the package name into the form as shown below. You can add a path and a version. Leave +the version field empty for the latest version. In case the package is on pypi the path can +be omitted. Pip will find it automatically. + +{{ image("plugin/plugin_install_git.png", "Install plugin from git") }} + !!! success "Plugin File" - A plugin installed via the web interface is added to the [plugins.txt](#plugin-installation-file-pip) plugin file. + A plugin installed via the web interface is added to the [plugins.txt](#plugin-installation-file-pip) plugin file as shown below. + +{{ image("plugin/plugin_install_txt.png", "Plugin.txt file") }} #### Local Directory From 36cfd2c1109ff7cafd0e375571e4159400588fc4 Mon Sep 17 00:00:00 2001 From: Mitch Davis Date: Sun, 21 Dec 2025 11:49:50 +1100 Subject: [PATCH 74/76] Improvements to the documentation instructions (#11044) --- docs/README.md | 48 ++++++++++++++++-------------------------------- 1 file changed, 16 insertions(+), 32 deletions(-) diff --git a/docs/README.md b/docs/README.md index 5d51b82029..017cc6bd53 100644 --- a/docs/README.md +++ b/docs/README.md @@ -38,19 +38,13 @@ $ cd src $ pip install --require-hashes -r docs/requirements.txt ``` -## Build Documentation +## Schema generation -Before serving the documentation, you will need to build the API schema files from the source code, so they can be included in the documentation: - -``` -invoke build-docs -``` +Building the documentation requires extracting the API schema from the source code. !!! tip This command is only required when building the documentation for the first time, or when changes have been made to the API schema. -## Serve Local files - ``` $ invoke build-docs ``` @@ -71,41 +65,31 @@ Schema export completed: /home/inventree/src/docs/generated/schema.yml Documentation build complete, but mkdocs not requested ``` -If that worked, you can now generate the HTML format documentation pages: +## Viewing the documentation + +Generate the HTML files from the markdown source files, and start the MkDocs webpage server: ``` -$ mkdocs build -f docs/mkdocs.yml -``` - -## Viewing the generated output - -To view the documentation locally, run the following command to start the MkDocs webpage server: - -``` -$ mkdocs serve -f docs/mkdocs.yml -a localhost:8080 -``` - -Alternatively, you can use the `invoke` command: - -``` -invoke dev.docs-server -``` - -To see all the available options: - -``` -invoke dev.docs-server --help +$ mkdocs serve -f docs/mkdocs.yml ``` You can then point your web browser at http://localhost:8080/ +Alternatively, you can use the `invoke` command: + +``` +$ invoke dev.docs-server +``` + +If you need to, use the `-a` option after `mkdocs` or `invoke` to set the address and port. Run `invoke dev.docs-server --help` for details. + ## Editing the Documentation Files -Once the server is running, it will monitor the documentation files for any changes, and regenerate the HTML pages. +Once the server is running, it will monitor the documentation files for changes, and regenerate the HTML pages as required. Refresh your web browser to see the changes. ### Admonitions -"Admonition" blocks can be added as follow: +"Admonition" blocks can be added to the documentation source as follows: ``` !!! info "This is the admonition block title" This is the admonition block content From 27c4c5b467c84ce19cc2f05b27f174a10e7471ad Mon Sep 17 00:00:00 2001 From: Mitch Davis Date: Sun, 21 Dec 2025 11:52:37 +1100 Subject: [PATCH 75/76] Put the admin user info in one place (#11047) --- src/backend/InvenTree/config_template.yaml | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/backend/InvenTree/config_template.yaml b/src/backend/InvenTree/config_template.yaml index f08d86a84d..a65509f072 100644 --- a/src/backend/InvenTree/config_template.yaml +++ b/src/backend/InvenTree/config_template.yaml @@ -46,6 +46,12 @@ debug_shell: False # Set the admin URL, or use the environment variable INVENTREE_ADMIN_URL #admin_url: 'admin' +# Add new user on first startup by either adding values here or from a file +#admin_user: admin +#admin_email: info@example.com +#admin_password: inventree +#admin_password_file: '/etc/inventree/admin_password.txt' + # Configure the system logging level (or use environment variable INVENTREE_LOG_LEVEL) # Options: DEBUG / INFO / WARNING / ERROR / CRITICAL log_level: WARNING @@ -69,13 +75,6 @@ language: en-us # System time-zone (default is UTC). Reference: https://en.wikipedia.org/wiki/List_of_tz_database_time_zones timezone: UTC - -# Add new user on first startup by either adding values here or from a file -#admin_user: admin -#admin_email: info@example.com -#admin_password: inventree -#admin_password_file: '/etc/inventree/admin_password.txt' - # Email backend configuration # See https://docs.inventree.org/en/stable/settings/email for more information on email configuration # You can either use (1) SMTP, (2) console or (3) anymail backends From 947a3e26a031c12539c0740320512c3774494cc0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 21 Dec 2025 22:31:17 +1100 Subject: [PATCH 76/76] chore(deps): bump the dependencies group across 1 directory with 4 updates (#11051) * chore(deps): bump the dependencies group across 1 directory with 4 updates Bumps the dependencies group with 3 updates in the /src/backend directory: [django](https://github.com/django/django), [django-markdownify](https://github.com/erwinmatijsen/django-markdownify) and [pypdf](https://github.com/py-pdf/pypdf). Updates `django` from 5.2.9 to 6.0 - [Commits](https://github.com/django/django/compare/5.2.9...6.0) Updates `setuptools` from 80.9.0 to - [Release notes](https://github.com/pypa/setuptools/releases) - [Changelog](https://github.com/pypa/setuptools/blob/main/NEWS.rst) - [Commits](https://github.com/pypa/setuptools/commits) Updates `django-markdownify` from 0.9.5 to 0.9.6 - [Commits](https://github.com/erwinmatijsen/django-markdownify/compare/0.9.5...0.9.6) Updates `pypdf` from 6.4.0 to 6.4.1 - [Release notes](https://github.com/py-pdf/pypdf/releases) - [Changelog](https://github.com/py-pdf/pypdf/blob/main/CHANGELOG.md) - [Commits](https://github.com/py-pdf/pypdf/compare/6.4.0...6.4.1) --- updated-dependencies: - dependency-name: django dependency-version: '6.0' dependency-type: direct:production update-type: version-update:semver-major dependency-group: dependencies - dependency-name: setuptools dependency-version: dependency-type: direct:production dependency-group: dependencies - dependency-name: django-markdownify dependency-version: 0.9.6 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: pypdf dependency-version: 6.4.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies ... Signed-off-by: dependabot[bot] * fix style * lower django * Update Django version constraint to <6.0 * fix style --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Matthias Mair --- docs/docs/plugins/install.md | 4 +--- src/backend/requirements.txt | 12 ++++++------ 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/docs/docs/plugins/install.md b/docs/docs/plugins/install.md index eedc97ca4a..3d18d58850 100644 --- a/docs/docs/plugins/install.md +++ b/docs/docs/plugins/install.md @@ -65,9 +65,7 @@ Admin users can install plugins directly from the web interface, via the "Plugin {{ image("plugin/plugin_install_web.png", "Install plugin via web interface") }} -Enter the package name into the form as shown below. You can add a path and a version. Leave -the version field empty for the latest version. In case the package is on pypi the path can -be omitted. Pip will find it automatically. +Enter the package name into the form as shown below. You can add a path and a version. Leave the version field empty for the latest version. In case the package is on pypi the path can be omitted. Pip will find it automatically. {{ image("plugin/plugin_install_git.png", "Install plugin from git") }} diff --git a/src/backend/requirements.txt b/src/backend/requirements.txt index edf82dd762..b7fa2f4d9e 100644 --- a/src/backend/requirements.txt +++ b/src/backend/requirements.txt @@ -574,9 +574,9 @@ django-maintenance-mode==0.22.0 \ --hash=sha256:502f04f845d6996e8add321186b3b9236c3702de7cb0ab14952890af6523b9e5 \ --hash=sha256:a9cf2ba79c9945bd67f98755a6cfd281869d39b3745bbb5d1f571d058657aa85 # via -r src/backend/requirements.in -django-markdownify==0.9.5 \ - --hash=sha256:2c4ae44e386c209453caf5e9ea1b74f64535985d338ad2d5ad5e7089cc94be86 \ - --hash=sha256:34c34eba4a797282a5c5bd97b13cec84d6a4c0673ad47ce1c1d000d74dd8d4ab +django-markdownify==0.9.6 \ + --hash=sha256:9863b2bfa6d159ad1423dc93bf0d6eadc6413776de304049aa9fcfa5edd2ce1c \ + --hash=sha256:edcf47b2026d55a8439049d35c8b54e11066a4856c4fad1060e139cb3d2eee52 # via -r src/backend/requirements.in django-money==3.5.4 \ --hash=sha256:25933ed6177f8dc981114db813c7c5d36c7c89bc4017f2b1b2bb0209b5f68876 \ @@ -1475,9 +1475,9 @@ pynacl==1.6.0 \ --hash=sha256:f46386c24a65383a9081d68e9c2de909b1834ec74ff3013271f1bca9c2d233eb \ --hash=sha256:f4b3824920e206b4f52abd7de621ea7a44fd3cb5c8daceb7c3612345dfc54f2e # via paramiko -pypdf==6.4.0 \ - --hash=sha256:4769d471f8ddc3341193ecc5d6560fa44cf8cd0abfabf21af4e195cc0c224072 \ - --hash=sha256:55ab9837ed97fd7fcc5c131d52fcc2223bc5c6b8a1488bbf7c0e27f1f0023a79 +pypdf==6.4.1 \ + --hash=sha256:1782ee0766f0b77defc305f1eb2bafe738a2ef6313f3f3d2ee85b4542ba7e535 \ + --hash=sha256:36eb0b52730fc3077d2b8d4122751e696d46af9ef9e5383db492df1ab0cc4647 # via -r src/backend/requirements.in pyphen==0.17.2 \ --hash=sha256:3a07fb017cb2341e1d9ff31b8634efb1ae4dc4b130468c7c39dd3d32e7c3affd \