From b4eeba5e312d934daaaaa456f9fa2288fd36d32b Mon Sep 17 00:00:00 2001 From: Oliver Date: Fri, 6 Feb 2026 10:21:30 +1100 Subject: [PATCH] [enhancement] Stocktake updates (#11257) * Allow part queryset to be passed to 'perform_stocktake' function * Add new options to perform_stocktake * Allow download of part stocktake snapshot data * API endpoint for generating a stocktake entry * Simplify code * Generate report output * Dashboard stocktake widget - Generate stocktake snapshot from the dashboard * Force stocktake entry for part * Add docs * Cleanup docs * Update API version * Improve efficiency of stocktake generation * Error handling * Add simple playwright test * Fix typing --- .../images/part/part_stocktake_manual.png | Bin 0 -> 44255 bytes .../part/stocktake_report_dashboard.png | Bin 0 -> 57454 bytes docs/docs/part/stocktake.md | 46 +++- .../InvenTree/InvenTree/api_version.py | 5 +- src/backend/InvenTree/data_exporter/mixins.py | 7 +- src/backend/InvenTree/part/api.py | 73 ++++++- src/backend/InvenTree/part/serializers.py | 106 +++++++++- src/backend/InvenTree/part/stocktake.py | 196 +++++++++++++++--- src/frontend/lib/enums/ApiEndpoints.tsx | 1 + .../dashboard/DashboardWidgetLibrary.tsx | 14 +- .../widgets/StocktakeDashboardWidget.tsx | 71 +++++++ src/frontend/src/forms/PartForms.tsx | 3 +- .../src/pages/part/PartStockHistoryDetail.tsx | 56 +++-- .../tests/pages/pui_dashboard.spec.ts | 35 +++- 14 files changed, 545 insertions(+), 68 deletions(-) create mode 100644 docs/docs/assets/images/part/part_stocktake_manual.png create mode 100644 docs/docs/assets/images/part/stocktake_report_dashboard.png create mode 100644 src/frontend/src/components/dashboard/widgets/StocktakeDashboardWidget.tsx diff --git a/docs/docs/assets/images/part/part_stocktake_manual.png b/docs/docs/assets/images/part/part_stocktake_manual.png new file mode 100644 index 0000000000000000000000000000000000000000..5d6fa6968372e5417f5f01eadfcee80dcba8dad3 GIT binary patch literal 44255 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 z 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 2026-02-05 : https://github.com/inventree/InvenTree/pull/11257 + - Adds API endpoint for manually generating a stocktake entry + v447 -> 2026-02-02 : https://github.com/inventree/InvenTree/pull/11242 - Adds "sub_part_active" filter to BomItem API endpoint diff --git a/src/backend/InvenTree/data_exporter/mixins.py b/src/backend/InvenTree/data_exporter/mixins.py index 4b373dcf51..f40ee113f2 100644 --- a/src/backend/InvenTree/data_exporter/mixins.py +++ b/src/backend/InvenTree/data_exporter/mixins.py @@ -304,7 +304,7 @@ class DataExportViewMixin: """Export the data in the specified format. Arguments: - export_plugin: The plugin instance to use for exporting the data + export_plugin: The plugin instance to use for exporting the data. If not provided, the default exporter is used export_format: The file format to export the data in export_context: Additional context data to pass to the plugin output: The DataOutput object to write to @@ -312,6 +312,11 @@ class DataExportViewMixin: - By default, uses the provided serializer to generate the data, and return it as a file download. - If a plugin is specified, the plugin can be used to augment or replace the export functionality. """ + if export_plugin is None: + from plugin.registry import registry + + export_plugin = registry.get_plugin('inventree-exporter') + # Get the base serializer class for the view serializer_class = self.get_serializer_class() diff --git a/src/backend/InvenTree/part/api.py b/src/backend/InvenTree/part/api.py index 6a6f3326a1..db8eefd5e6 100644 --- a/src/backend/InvenTree/part/api.py +++ b/src/backend/InvenTree/part/api.py @@ -1204,11 +1204,18 @@ class PartStocktakeFilter(FilterSet): fields = ['part'] -class PartStocktakeList(BulkDeleteMixin, ListCreateAPI): +class PartStocktakeMixin: + """Mixin class for PartStocktake API endpoints.""" + + queryset = PartStocktake.objects.all().prefetch_related('part') + serializer_class = part_serializers.PartStocktakeSerializer + + +class PartStocktakeList( + PartStocktakeMixin, DataExportViewMixin, BulkDeleteMixin, ListCreateAPI +): """API endpoint for listing part stocktake information.""" - queryset = PartStocktake.objects.all() - serializer_class = part_serializers.PartStocktakeSerializer filterset_class = PartStocktakeFilter def get_serializer_context(self): @@ -1226,14 +1233,65 @@ class PartStocktakeList(BulkDeleteMixin, ListCreateAPI): ordering = '-pk' -class PartStocktakeDetail(RetrieveUpdateDestroyAPI): +class PartStocktakeDetail(PartStocktakeMixin, RetrieveUpdateDestroyAPI): """Detail API endpoint for a single PartStocktake instance. Note: Only staff (admin) users can access this endpoint. """ + +class PartStocktakeGenerate(CreateAPI): + """API endpoint for generating a PartStocktake instance.""" + queryset = PartStocktake.objects.all() - serializer_class = part_serializers.PartStocktakeSerializer + serializer_class = part_serializers.PartStocktakeGenerateSerializer + + def post(self, request, *args, **kwargs): + """Perform stocktake generation on POST request.""" + from common.models import DataOutput + from part.stocktake import perform_stocktake + + serializer = self.get_serializer(data=request.data) + serializer.is_valid(raise_exception=True) + + data = serializer.validated_data + + part = data.get('part', None) + category = data.get('category', None) + location = data.get('location', None) + + # Do we want to generate a report? + if data.get('generate_report', True): + report_output = DataOutput.objects.create( + user=request.user, output_type='stocktake' + ) + else: + report_output = None + + # Offload the actual stocktake generation to a background task, as it may take some time to complete + offload_task( + perform_stocktake, + part_id=part.pk if part else None, + category_id=category.pk if category else None, + location_id=location.pk if location else None, + generate_entry=data.get('generate_entry', True), + report_output_id=report_output.pk if report_output else None, + group='stocktake', + ) + + if report_output: + report_output.refresh_from_db() + + result = { + 'category': category, + 'location': location, + 'part': part, + 'output': report_output, + } + + output_serializer = part_serializers.PartStocktakeGenerateSerializer(result) + + return Response(output_serializer.data) class BomFilter(FilterSet): @@ -1604,6 +1662,11 @@ part_api_urls = [ PartStocktakeDetail.as_view(), name='api-part-stocktake-detail', ), + path( + 'generate/', + PartStocktakeGenerate.as_view(), + name='api-part-stocktake-generate', + ), path('', PartStocktakeList.as_view(), name='api-part-stocktake-list'), ]), ), diff --git a/src/backend/InvenTree/part/serializers.py b/src/backend/InvenTree/part/serializers.py index 60ce08275a..17d38dc0f7 100644 --- a/src/backend/InvenTree/part/serializers.py +++ b/src/backend/InvenTree/part/serializers.py @@ -30,6 +30,7 @@ import part.filters as part_filters import part.helpers as part_helpers import stock.models import users.models +from data_exporter.mixins import DataExportSerializerMixin from importer.registry import register_importer from InvenTree.mixins import DataImportExportSerializerMixin from InvenTree.ready import isGeneratingSchema @@ -1187,7 +1188,11 @@ class PartRequirementsSerializer(InvenTree.serializers.InvenTreeModelSerializer) return part.sales_order_allocation_count(include_variants=True, pending=True) -class PartStocktakeSerializer(InvenTree.serializers.InvenTreeModelSerializer): +class PartStocktakeSerializer( + InvenTree.serializers.FilterableSerializerMixin, + DataExportSerializerMixin, + InvenTree.serializers.InvenTreeModelSerializer, +): """Serializer for the PartStocktake model.""" class Meta: @@ -1196,18 +1201,32 @@ class PartStocktakeSerializer(InvenTree.serializers.InvenTreeModelSerializer): model = PartStocktake fields = [ 'pk', - 'date', 'part', + 'part_name', + 'part_ipn', + 'part_description', + 'date', 'item_count', 'quantity', 'cost_min', 'cost_min_currency', 'cost_max', 'cost_max_currency', + # Optional detail fields + 'part_detail', ] read_only_fields = ['date', 'user'] + def __init__(self, *args, **kwargs): + """Custom initialization for PartStocktakeSerializer.""" + exclude_pk = kwargs.pop('exclude_pk', False) + + super().__init__(*args, **kwargs) + + if exclude_pk: + self.fields.pop('pk', None) + quantity = serializers.FloatField() cost_min = InvenTree.serializers.InvenTreeMoneySerializer(allow_null=True) @@ -1216,6 +1235,23 @@ class PartStocktakeSerializer(InvenTree.serializers.InvenTreeModelSerializer): cost_max = InvenTree.serializers.InvenTreeMoneySerializer(allow_null=True) cost_max_currency = InvenTree.serializers.InvenTreeCurrencySerializer() + part_name = serializers.CharField( + source='part.name', read_only=True, label=_('Part Name') + ) + + part_ipn = serializers.CharField( + source='part.IPN', read_only=True, label=_('Part IPN') + ) + + part_description = serializers.CharField( + source='part.description', read_only=True, label=_('Part Description') + ) + + part_detail = enable_filter( + PartBriefSerializer(source='part', read_only=True, many=False, pricing=False), + default_include=False, + ) + def save(self): """Called when this serializer is saved.""" data = self.validated_data @@ -1226,6 +1262,72 @@ class PartStocktakeSerializer(InvenTree.serializers.InvenTreeModelSerializer): return super().save() +class PartStocktakeGenerateSerializer(serializers.Serializer): + """Serializer for generating PartStocktake entries.""" + + class Meta: + """Metaclass options.""" + + fields = [ + 'part', + 'category', + 'location', + 'generate_entry', + 'generate_report', + 'output', + ] + + part = serializers.PrimaryKeyRelatedField( + queryset=Part.objects.all(), + label=_('Part'), + help_text=_( + 'Select a part to generate stocktake information for that part (and any variant parts)' + ), + required=False, + allow_null=True, + ) + + category = serializers.PrimaryKeyRelatedField( + queryset=PartCategory.objects.all(), + label=_('Category'), + help_text=_( + 'Select a category to include all parts within that category (and subcategories)' + ), + required=False, + allow_null=True, + ) + + location = serializers.PrimaryKeyRelatedField( + queryset=stock.models.StockLocation.objects.all(), + label=_('Location'), + help_text=_( + 'Select a location to include all parts with stock in that location (including sub-locations)' + ), + required=False, + allow_null=True, + ) + + generate_entry = serializers.BooleanField( + label=_('Generate Stocktake Entries'), + help_text=_('Save stocktake entries for the selected parts'), + write_only=True, + required=False, + default=False, + ) + + generate_report = serializers.BooleanField( + label=_('Generate Report'), + help_text=_('Generate a stocktake report for the selected parts'), + write_only=True, + required=False, + default=False, + ) + + output = common.serializers.DataOutputSerializer( + read_only=True, many=False, label=_('Output') + ) + + @extend_schema_field( serializers.CharField( help_text=_('Select currency from available options') diff --git a/src/backend/InvenTree/part/stocktake.py b/src/backend/InvenTree/part/stocktake.py index fcdfff40c9..40bc857afd 100644 --- a/src/backend/InvenTree/part/stocktake.py +++ b/src/backend/InvenTree/part/stocktake.py @@ -1,16 +1,48 @@ """Stock history functionality.""" +from typing import Optional + +from django.core.files.base import ContentFile + import structlog +import tablib from djmoney.contrib.exchange.models import convert_money from djmoney.money import Money +import common.models +from InvenTree.helpers import current_date + logger = structlog.get_logger('inventree') -def perform_stocktake() -> None: - """Generate stock history entries for all active parts.""" +def perform_stocktake( + part_id: Optional[int] = None, + category_id: Optional[int] = None, + location_id: Optional[int] = None, + exclude_external: Optional[bool] = None, + generate_entry: bool = True, + report_output_id: Optional[int] = None, +) -> None: + """Capture a snapshot of stock-on-hand and stock value. + + Arguments: + part_id: Optional ID of a part to perform stocktake on. If not provided, all active parts will be processed. + category_id: Optional category ID to use to filter parts + location_id: Optional location ID to use to filter stock items + exclude_external: If True, exclude external stock items from the stocktake + generate_entry: If True, create stocktake entries in the database + report_output_id: Optional ID of a DataOutput object for the stocktake report (e.g. for download) + + The default implementation creates stocktake entries for all active parts, + and writes these stocktake entries to the database. + + Alternatively, the scope of the stocktake can be limited by providing a queryset of parts, + or by providing a category ID or location ID to filter the parts/stock items. + """ import InvenTree.helpers import part.models as part_models + import part.serializers as part_serializers + import stock.models as stock_models from common.currency import currency_code_default from common.settings import get_global_setting @@ -18,36 +50,98 @@ def perform_stocktake() -> None: logger.info('Stocktake functionality is disabled - skipping') return - exclude_external = get_global_setting( - 'STOCKTAKE_EXCLUDE_EXTERNAL', False, cache=False - ) + # If exclude_external is not provided, use global setting + if exclude_external is None: + exclude_external = get_global_setting( + 'STOCKTAKE_EXCLUDE_EXTERNAL', False, cache=False + ) - active_parts = part_models.Part.objects.filter(active=True) + # If a single part is provided, limit to that part + # Otherwise, start with all active parts + if part_id is not None: + try: + part = part_models.Part.objects.get(id=part_id) + parts = part.get_descendants(include_self=True) + except (ValueError, part_models.Part.DoesNotExist): + parts = part_models.Part.objects.all() + else: + parts = part_models.Part.objects.all() + + # Only use active parts + parts = parts.filter(active=True) + + # Prefetch related pricing information + parts = parts.prefetch_related('pricing_data', 'stock_items') + + # Filter part queryset by category, if provided + if category_id is not None: + # Filter parts by category (including subcategories) + try: + category = part_models.PartCategory.objects.get(id=category_id) + parts = parts.filter( + category__in=category.get_descendants(include_self=True) + ) + except (ValueError, part_models.PartCategory.DoesNotExist): + pass + + # Fetch location if provided + if location_id is not None: + try: + location = stock_models.StockLocation.objects.get(id=location_id) + except (ValueError, stock_models.StockLocation.DoesNotExist): + location = None + else: + location = None + + if location is not None: + # Location limited, so we will disable saving of stocktake entries + generate_entry = False # New history entries to be created history_entries = [] - N_BULK_CREATE = 250 - base_currency = currency_code_default() today = InvenTree.helpers.current_date() - logger.info( - 'Creating new stock history entries for %s active parts', active_parts.count() - ) + logger.info('Creating new stock history entries for %s parts', parts.count()) - for part in active_parts: + # Fetch report output object if provided + if report_output_id is not None: + try: + report_output = common.models.DataOutput.objects.get(id=report_output_id) + except (ValueError, common.models.DataOutput.DoesNotExist): + report_output = None + else: + report_output = None + + if report_output: + # Initialize progress on the report output + report_output.total = parts.count() + report_output.progress = 0 + report_output.complete = False + report_output.save() + + for part in parts: # Is there a recent stock history record for this part? - if part_models.PartStocktake.objects.filter( - part=part, date__gte=today - ).exists(): + if ( + generate_entry + and part_models.PartStocktake.objects.filter( + part=part, date__gte=today + ).exists() + ): continue - pricing = part.pricing + try: + pricing = part.pricing_data + except Exception: + pricing = None # Fetch all 'in stock' items for this part stock_items = part.stock_entries( - in_stock=True, include_external=not exclude_external, include_variants=True + location=location, + in_stock=True, + include_external=not exclude_external, + include_variants=True, ) total_cost_min = Money(0, base_currency) @@ -56,23 +150,34 @@ def perform_stocktake() -> None: total_quantity = 0 items_count = 0 + if stock_items.count() == 0: + # No stock items - skip this part if location is specified + if location: + continue + for item in stock_items: # Extract cost information - entry_cost_min = pricing.overall_min or pricing.overall_max - entry_cost_max = pricing.overall_max or pricing.overall_min + entry_cost_min = ( + (pricing.overall_min or pricing.overall_max) if pricing else None + ) + entry_cost_max = ( + (pricing.overall_max or pricing.overall_min) if pricing else None + ) if item.purchase_price is not None: entry_cost_min = item.purchase_price entry_cost_max = item.purchase_price try: - entry_cost_min = ( - convert_money(entry_cost_min, base_currency) * item.quantity - ) - entry_cost_max = ( - convert_money(entry_cost_max, base_currency) * item.quantity - ) + entry_cost_min = entry_cost_min * item.quantity + entry_cost_max = entry_cost_max * item.quantity + + if entry_cost_min.currency != base_currency: + entry_cost_min = convert_money(entry_cost_min, base_currency) + + if entry_cost_max.currency != base_currency: + entry_cost_max = convert_money(entry_cost_max, base_currency) except Exception: entry_cost_min = Money(0, base_currency) entry_cost_max = Money(0, base_currency) @@ -83,6 +188,13 @@ def perform_stocktake() -> None: total_cost_min += entry_cost_min total_cost_max += entry_cost_max + if report_output: + report_output.progress += 1 + + # Update report progress every few items, to avoid excessive database writes + if report_output.progress % 50 == 0: + report_output.save() + # Add a new stocktake entry for this part history_entries.append( part_models.PartStocktake( @@ -94,11 +206,31 @@ def perform_stocktake() -> None: ) ) - # Batch create stock history entries - if len(history_entries) >= N_BULK_CREATE: - part_models.PartStocktake.objects.bulk_create(history_entries) - history_entries = [] - - if len(history_entries) > 0: - # Save any remaining stocktake entries + if generate_entry: + # Bulk-create PartStocktake entries part_models.PartStocktake.objects.bulk_create(history_entries) + + if report_output: + # Save report data, and mark as complete + + today = current_date() + + serializer = part_serializers.PartStocktakeSerializer(exclude_pk=True) + + headers = serializer.generate_headers() + + # Export the data to a file + dataset = tablib.Dataset(headers=list(headers.values())) + + header_keys = list(headers.keys()) + + for entry in history_entries: + entry.date = today + row = serializer.to_representation(entry) + dataset.append([row.get(header, '') for header in header_keys]) + + datafile = dataset.export('csv') + + report_output.mark_complete( + output=ContentFile(datafile, 'stocktake_report.csv') + ) diff --git a/src/frontend/lib/enums/ApiEndpoints.tsx b/src/frontend/lib/enums/ApiEndpoints.tsx index 5c61f4e6ec..8f7d905d36 100644 --- a/src/frontend/lib/enums/ApiEndpoints.tsx +++ b/src/frontend/lib/enums/ApiEndpoints.tsx @@ -120,6 +120,7 @@ export enum ApiEndpoints { part_pricing_internal = 'part/internal-price/', part_pricing_sale = 'part/sale-price/', part_stocktake_list = 'part/stocktake/', + part_stocktake_generate = 'part/stocktake/generate/', category_list = 'part/category/', category_tree = 'part/category/tree/', category_parameter_list = 'part/category/parameters/', diff --git a/src/frontend/src/components/dashboard/DashboardWidgetLibrary.tsx b/src/frontend/src/components/dashboard/DashboardWidgetLibrary.tsx index 7c5268faac..7b2352a18f 100644 --- a/src/frontend/src/components/dashboard/DashboardWidgetLibrary.tsx +++ b/src/frontend/src/components/dashboard/DashboardWidgetLibrary.tsx @@ -9,12 +9,13 @@ import GetStartedWidget from './widgets/GetStartedWidget'; import LanguageSelectDashboardWidget from './widgets/LanguageSelectWidget'; import NewsWidget from './widgets/NewsWidget'; import QueryCountDashboardWidget from './widgets/QueryCountDashboardWidget'; +import StocktakeDashboardWidget from './widgets/StocktakeDashboardWidget'; /** * * @returns A list of built-in dashboard widgets which display the number of results for a particular query */ -export function BuiltinQueryCountWidgets(): DashboardWidgetProps[] { +function BuiltinQueryCountWidgets(): DashboardWidgetProps[] { const user = useUserState.getState(); const globalSettings = useGlobalSettingsState.getState(); @@ -186,7 +187,7 @@ export function BuiltinQueryCountWidgets(): DashboardWidgetProps[] { }); } -export function BuiltinGettingStartedWidgets(): DashboardWidgetProps[] { +function BuiltinGettingStartedWidgets(): DashboardWidgetProps[] { return [ { label: 'gstart', @@ -207,10 +208,14 @@ export function BuiltinGettingStartedWidgets(): DashboardWidgetProps[] { ]; } -export function BuiltinSettingsWidgets(): DashboardWidgetProps[] { +function BuiltinSettingsWidgets(): DashboardWidgetProps[] { return [ColorToggleDashboardWidget(), LanguageSelectDashboardWidget()]; } +function BuiltinActionWidgets(): DashboardWidgetProps[] { + return [StocktakeDashboardWidget()]; +} + /** * * @returns A list of built-in dashboard widgets @@ -219,6 +224,7 @@ export default function DashboardWidgetLibrary(): DashboardWidgetProps[] { return [ ...BuiltinQueryCountWidgets(), ...BuiltinGettingStartedWidgets(), - ...BuiltinSettingsWidgets() + ...BuiltinSettingsWidgets(), + ...BuiltinActionWidgets() ]; } diff --git a/src/frontend/src/components/dashboard/widgets/StocktakeDashboardWidget.tsx b/src/frontend/src/components/dashboard/widgets/StocktakeDashboardWidget.tsx new file mode 100644 index 0000000000..03e94af071 --- /dev/null +++ b/src/frontend/src/components/dashboard/widgets/StocktakeDashboardWidget.tsx @@ -0,0 +1,71 @@ +import { ApiEndpoints, UserRoles, apiUrl } from '@lib/index'; +import { t } from '@lingui/core/macro'; +import { Button, Stack } from '@mantine/core'; +import { IconClipboardList } from '@tabler/icons-react'; +import { useState } from 'react'; +import useDataOutput from '../../../hooks/UseDataOutput'; +import { useCreateApiFormModal } from '../../../hooks/UseForm'; +import { useUserState } from '../../../states/UserState'; +import type { DashboardWidgetProps } from '../DashboardWidget'; + +function StocktakeWidget() { + const [outputId, setOutputId] = useState(undefined); + + useDataOutput({ + title: t`Generating Stocktake Report`, + id: outputId + }); + + const stocktakeForm = useCreateApiFormModal({ + title: t`Generate Stocktake Report`, + url: apiUrl(ApiEndpoints.part_stocktake_generate), + fields: { + part: { + filters: { + active: true + } + }, + category: {}, + location: {}, + generate_entry: { + value: false + }, + generate_report: { + value: true + } + }, + submitText: t`Generate`, + successMessage: null, + onFormSuccess: (response) => { + if (response.output?.pk) { + setOutputId(response.output.pk); + } + } + }); + + return ( + <> + {stocktakeForm.modal} + + + + + ); +} + +export default function StocktakeDashboardWidget(): DashboardWidgetProps { + const user = useUserState(); + + return { + label: 'stk', + title: t`Stocktake`, + description: t`Generate a new stocktake report`, + minHeight: 1, + minWidth: 2, + render: () => , + enabled: user.hasAddRole(UserRoles.part) + }; +} diff --git a/src/frontend/src/forms/PartForms.tsx b/src/frontend/src/forms/PartForms.tsx index e561614e8c..3177663aa9 100644 --- a/src/frontend/src/forms/PartForms.tsx +++ b/src/frontend/src/forms/PartForms.tsx @@ -266,7 +266,6 @@ export function partStocktakeFields(): ApiFormFieldSet { cost_min: {}, cost_min_currency: {}, cost_max: {}, - cost_max_currency: {}, - note: {} + cost_max_currency: {} }; } diff --git a/src/frontend/src/pages/part/PartStockHistoryDetail.tsx b/src/frontend/src/pages/part/PartStockHistoryDetail.tsx index 01fded4056..6ddc9571ef 100644 --- a/src/frontend/src/pages/part/PartStockHistoryDetail.tsx +++ b/src/frontend/src/pages/part/PartStockHistoryDetail.tsx @@ -2,6 +2,7 @@ import { RowDeleteAction, RowEditAction } from '@lib/components/RowActions'; import { ApiEndpoints } from '@lib/enums/ApiEndpoints'; import { UserRoles } from '@lib/enums/Roles'; import { apiUrl } from '@lib/functions/Api'; +import { AddItemButton } from '@lib/index'; import type { TableColumn } from '@lib/types/Tables'; import { t } from '@lingui/core/macro'; import { type ChartTooltipProps, LineChart } from '@mantine/charts'; @@ -18,12 +19,13 @@ import { useCallback, useMemo, useState } from 'react'; import { formatDate, formatPriceRange } from '../../defaults/formatters'; import { partStocktakeFields } from '../../forms/PartForms'; import { + useCreateApiFormModal, useDeleteApiFormModal, useEditApiFormModal } from '../../hooks/UseForm'; import { useTable } from '../../hooks/UseTable'; import { useUserState } from '../../states/UserState'; -import { DecimalColumn } from '../../tables/ColumnRenderers'; +import { DateColumn, DecimalColumn } from '../../tables/ColumnRenderers'; import { InvenTreeTable } from '../../tables/InvenTreeTable'; /* @@ -89,19 +91,38 @@ export default function PartStockHistoryDetail({ table: table }); + const newStocktakeEntry = useCreateApiFormModal({ + title: t`Generate Stocktake Report`, + url: apiUrl(ApiEndpoints.part_stocktake_generate), + fields: { + part: { + value: partId, + disabled: true + }, + generate_entry: { + value: true, + hidden: true + } + }, + submitText: t`Generate`, + successMessage: t`Stocktake report scheduled for generation` + }); + const tableColumns: TableColumn[] = useMemo(() => { return [ - DecimalColumn({ - accessor: 'quantity', - sortable: false, - switchable: false - }), + DateColumn({}), DecimalColumn({ accessor: 'item_count', title: t`Stock Items`, switchable: true, sortable: false }), + DecimalColumn({ + accessor: 'quantity', + title: t`Stock Quantity`, + sortable: false, + switchable: false + }), { accessor: 'cost', title: t`Stock Value`, @@ -111,11 +132,6 @@ export default function PartStockHistoryDetail({ currency: record.cost_min_currency }); } - }, - { - accessor: 'date', - sortable: true, - switchable: false } ]; }, []); @@ -124,7 +140,7 @@ export default function PartStockHistoryDetail({ (record: any) => { return [ RowEditAction({ - hidden: !user.hasChangeRole(UserRoles.part), + hidden: !user.hasChangeRole(UserRoles.part) || !user.isSuperuser(), onClick: () => { setSelectedStocktake(record.pk); editStocktakeEntry.open(); @@ -176,8 +192,20 @@ export default function PartStockHistoryDetail({ return [min_date.valueOf(), max_date.valueOf()]; }, [chartData]); + const tableActions = useMemo(() => { + return [ +