diff --git a/InvenTree/part/migrations/0091_partstocktake.py b/InvenTree/part/migrations/0091_partstocktake.py new file mode 100644 index 0000000000..c41ecb79f6 --- /dev/null +++ b/InvenTree/part/migrations/0091_partstocktake.py @@ -0,0 +1,27 @@ +# Generated by Django 3.2.16 on 2022-12-16 01:59 + +from django.conf import settings +import django.core.validators +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('part', '0090_auto_20221115_0816'), + ] + + operations = [ + migrations.CreateModel( + name='PartStocktake', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('quantity', models.DecimalField(decimal_places=5, help_text='Total available stock at time of stocktake', max_digits=19, validators=[django.core.validators.MinValueValidator(0)], verbose_name='Quantity')), + ('date', models.DateField(auto_now_add=True, help_text='Date stocktake was performed', verbose_name='Date')), + ('part', models.ForeignKey(help_text='Part for stocktake', on_delete=django.db.models.deletion.CASCADE, related_name='stocktakes', to='part.part', verbose_name='Part')), + ('user', models.ForeignKey(blank=True, help_text='User who performed this stocktake', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='part_stocktakes', to=settings.AUTH_USER_MODEL, verbose_name='User')), + ], + ), + ] diff --git a/InvenTree/part/models.py b/InvenTree/part/models.py index 3407e2ebf6..c56dc8d3de 100644 --- a/InvenTree/part/models.py +++ b/InvenTree/part/models.py @@ -2878,6 +2878,45 @@ class PartPricing(models.Model): ) +class PartStocktake(models.Model): + """Model representing a 'stocktake' entry for a particular Part. + + A 'stocktake' is a representative count of available stock: + - Performed on a given date + - Records quantity of part in stock (across multiple stock items) + - Records user information + """ + + part = models.ForeignKey( + Part, + on_delete=models.CASCADE, + related_name='stocktakes', + verbose_name=_('Part'), + help_text=_('Part for stocktake'), + ) + + quantity = models.DecimalField( + max_digits=19, decimal_places=5, + validators=[MinValueValidator(0)], + verbose_name=_('Quantity'), + help_text=_('Total available stock at time of stocktake'), + ) + + date = models.DateField( + verbose_name=_('Date'), + help_text=_('Date stocktake was performed'), + auto_now_add=True + ) + + user = models.ForeignKey( + User, blank=True, null=True, + on_delete=models.SET_NULL, + related_name='part_stocktakes', + verbose_name=_('User'), + help_text=_('User who performed this stocktake'), + ) + + class PartAttachment(InvenTreeAttachment): """Model for storing file attachments against a Part object."""