summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@iggdrasil.net>2021-04-22 17:50:10 +0200
committerÉtienne Loks <etienne.loks@iggdrasil.net>2021-07-29 11:54:14 +0200
commitf5e7db4f7b3bceb0cdef84f9530e0cddc67beea8 (patch)
tree6b190ee4e81581390540bb14b4e31c1ef29002bb
parent9f19fcb307a6eaca7e88599d2234ae7190b95a6e (diff)
downloadIshtar-f5e7db4f7b3bceb0cdef84f9530e0cddc67beea8.tar.bz2
Ishtar-f5e7db4f7b3bceb0cdef84f9530e0cddc67beea8.zip
File: preventive fields
-rw-r--r--archaeological_files/migrations/0106_auto_20210423_1206.py194
-rw-r--r--archaeological_files/models.py125
2 files changed, 319 insertions, 0 deletions
diff --git a/archaeological_files/migrations/0106_auto_20210423_1206.py b/archaeological_files/migrations/0106_auto_20210423_1206.py
new file mode 100644
index 000000000..5d147781e
--- /dev/null
+++ b/archaeological_files/migrations/0106_auto_20210423_1206.py
@@ -0,0 +1,194 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11.27 on 2021-04-23 12:06
+from __future__ import unicode_literals
+
+import django.core.validators
+from django.db import migrations, models
+import django.db.models.deletion
+import ishtar_common.models_common
+import re
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('archaeological_files', '0105_auto_20201204_1442'),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='EquipmentCost',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('service_provider', models.CharField(default='-', max_length=200, verbose_name='Service provider')),
+ ('flat_rate', models.BooleanField(default=False, verbose_name='Flat rate')),
+ ('daily_cost', models.FloatField(blank=True, null=True, verbose_name='Daily cost')),
+ ('monday', models.BooleanField(default=True, verbose_name='Monday')),
+ ('tuesday', models.BooleanField(default=True, verbose_name='Tuesday')),
+ ('wednesday', models.BooleanField(default=True, verbose_name='Wednesday')),
+ ('thursday', models.BooleanField(default=True, verbose_name='Thursday')),
+ ('friday', models.BooleanField(default=True, verbose_name='Friday')),
+ ],
+ options={
+ 'verbose_name': 'Equipment cost',
+ 'verbose_name_plural': 'Equipment costs',
+ },
+ ),
+ migrations.CreateModel(
+ name='EquipmentType',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('label', models.TextField(verbose_name='Label')),
+ ('txt_idx', models.TextField(help_text='The slug is the standardized version of the name. It contains only lowercase letters, numbers and hyphens. Each slug must be unique.', unique=True, validators=[django.core.validators.RegexValidator(re.compile('^[-a-zA-Z0-9_]+\\Z', 32), "Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens.", 'invalid')], verbose_name='Textual ID')),
+ ('comment', models.TextField(blank=True, default='', verbose_name='Comment')),
+ ('available', models.BooleanField(default=True, verbose_name='Available')),
+ ],
+ options={
+ 'verbose_name': 'Equipment type',
+ 'verbose_name_plural': 'Equipment types',
+ 'ordering': ('label',),
+ },
+ bases=(ishtar_common.models_common.Cached, models.Model),
+ ),
+ migrations.CreateModel(
+ name='GenericEquipmentType',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('label', models.TextField(verbose_name='Label')),
+ ('txt_idx', models.TextField(help_text='The slug is the standardized version of the name. It contains only lowercase letters, numbers and hyphens. Each slug must be unique.', unique=True, validators=[django.core.validators.RegexValidator(re.compile('^[-a-zA-Z0-9_]+\\Z', 32), "Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens.", 'invalid')], verbose_name='Textual ID')),
+ ('comment', models.TextField(blank=True, default='', verbose_name='Comment')),
+ ('available', models.BooleanField(default=True, verbose_name='Available')),
+ ],
+ options={
+ 'verbose_name': 'Generic equipment type',
+ 'verbose_name_plural': 'Generic equipment types',
+ 'ordering': ('label',),
+ },
+ bases=(ishtar_common.models_common.Cached, models.Model),
+ ),
+ migrations.CreateModel(
+ name='Job',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('label', models.TextField(verbose_name='Label')),
+ ('txt_idx', models.TextField(help_text='The slug is the standardized version of the name. It contains only lowercase letters, numbers and hyphens. Each slug must be unique.', unique=True, validators=[django.core.validators.RegexValidator(re.compile('^[-a-zA-Z0-9_]+\\Z', 32), "Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens.", 'invalid')], verbose_name='Textual ID')),
+ ('comment', models.TextField(blank=True, default='', verbose_name='Comment')),
+ ('available', models.BooleanField(default=True, verbose_name='Available')),
+ ('ground_daily_cost', models.FloatField(blank=True, null=True, verbose_name='Ground daily cost')),
+ ('daily_cost', models.FloatField(blank=True, null=True, verbose_name='Daily cost')),
+ ('permanent_contract', models.NullBooleanField(verbose_name='Is a permanent contract')),
+ ('default_daily_need_on_ground', models.FloatField(default=0, verbose_name='Default daily number needed on the ground')),
+ ('default_daily_need', models.FloatField(default=0, verbose_name='Default daily number needed')),
+ ],
+ options={
+ 'verbose_name': 'Job',
+ 'verbose_name_plural': 'Jobs',
+ 'ordering': ('label',),
+ },
+ bases=(ishtar_common.models_common.Cached, models.Model),
+ ),
+ migrations.CreateModel(
+ name='PreventiveFile',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('study_period', models.CharField(blank=True, default='', max_length=200, verbose_name='Study period')),
+ ('start_date', models.DateField(blank=True, null=True, verbose_name='Start date')),
+ ('end_date', models.DateField(blank=True, null=True, verbose_name='End date')),
+ ('ground_start_date', models.DateField(blank=True, null=True, verbose_name='Ground start date')),
+ ('ground_end_date', models.DateField(blank=True, null=True, verbose_name='Ground end date')),
+ ('execution_report_date', models.DateField(blank=True, null=True, verbose_name='Execution report date')),
+ ('linear_meter', models.IntegerField(blank=True, null=True, verbose_name='Linear meter')),
+ ('file', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='archaeological_files.File', verbose_name='File')),
+ ],
+ options={
+ 'verbose_name': 'Preventive file',
+ 'verbose_name_plural': 'Preventive files',
+ },
+ ),
+ migrations.CreateModel(
+ name='PreventiveFileEquipmentCost',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('man_days_planned', models.FloatField(blank=True, null=True, verbose_name='Man-day planned')),
+ ('man_days_worked', models.FloatField(blank=True, null=True, verbose_name='Man-day worked')),
+ ('equipment_cost', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='archaeological_files.EquipmentCost')),
+ ('file', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='archaeological_files.PreventiveFile')),
+ ],
+ options={
+ 'abstract': False,
+ },
+ ),
+ migrations.CreateModel(
+ name='PreventiveFileJob',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('man_days_planned', models.FloatField(blank=True, null=True, verbose_name='Man-day planned')),
+ ('man_days_worked', models.FloatField(blank=True, null=True, verbose_name='Man-day worked')),
+ ('ground_man_days_planned', models.FloatField(blank=True, null=True, verbose_name='Ground man-day planned')),
+ ('ground_man_days_worked', models.FloatField(blank=True, null=True, verbose_name='Ground man-day worked')),
+ ('file', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='archaeological_files.PreventiveFile')),
+ ('job', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='archaeological_files.Job')),
+ ],
+ options={
+ 'abstract': False,
+ },
+ ),
+ migrations.CreateModel(
+ name='PreventiveFileTechnicalServiceCost',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('man_days_planned', models.FloatField(blank=True, null=True, verbose_name='Man-day planned')),
+ ('man_days_worked', models.FloatField(blank=True, null=True, verbose_name='Man-day worked')),
+ ('file', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='archaeological_files.PreventiveFile')),
+ ],
+ options={
+ 'abstract': False,
+ },
+ ),
+ migrations.CreateModel(
+ name='TechnicalService',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('label', models.TextField(verbose_name='Label')),
+ ('txt_idx', models.TextField(help_text='The slug is the standardized version of the name. It contains only lowercase letters, numbers and hyphens. Each slug must be unique.', unique=True, validators=[django.core.validators.RegexValidator(re.compile('^[-a-zA-Z0-9_]+\\Z', 32), "Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens.", 'invalid')], verbose_name='Textual ID')),
+ ('comment', models.TextField(blank=True, default='', verbose_name='Comment')),
+ ('available', models.BooleanField(default=True, verbose_name='Available')),
+ ],
+ options={
+ 'verbose_name': 'Technical service',
+ 'verbose_name_plural': 'Technical services',
+ 'ordering': ('label',),
+ },
+ bases=(ishtar_common.models_common.Cached, models.Model),
+ ),
+ migrations.CreateModel(
+ name='TechnicalServiceCost',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('service_provider', models.CharField(default='-', max_length=200, verbose_name='Service provider')),
+ ('flat_rate', models.BooleanField(default=False, verbose_name='Flat rate')),
+ ('unitary_cost', models.FloatField(blank=True, null=True, verbose_name='Unitary cost')),
+ ('unit', models.CharField(blank=True, choices=[('D', 'Days'), ('M', 'Linear meter')], max_length=1, null=True, verbose_name='Unit')),
+ ('technical_service', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='archaeological_files.TechnicalService', verbose_name='Technical service')),
+ ],
+ options={
+ 'verbose_name': 'Equipment cost',
+ 'verbose_name_plural': 'Equipment costs',
+ },
+ ),
+ migrations.AddField(
+ model_name='preventivefiletechnicalservicecost',
+ name='technical_service_cost',
+ field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='archaeological_files.TechnicalServiceCost'),
+ ),
+ migrations.AddField(
+ model_name='equipmenttype',
+ name='generic_equipment_type',
+ field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='archaeological_files.GenericEquipmentType', verbose_name='Generic type'),
+ ),
+ migrations.AddField(
+ model_name='equipmentcost',
+ name='equipment_type',
+ field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='archaeological_files.EquipmentType', verbose_name='Equipment'),
+ ),
+ ]
diff --git a/archaeological_files/models.py b/archaeological_files/models.py
index 88326d405..db46c1ca7 100644
--- a/archaeological_files/models.py
+++ b/archaeological_files/models.py
@@ -68,6 +68,85 @@ from archaeological_operations.models import (
)
+class Job(GeneralType):
+ ground_daily_cost = models.FloatField(_("Ground daily cost"), blank=True, null=True)
+ daily_cost = models.FloatField(_("Daily cost"), blank=True, null=True)
+ permanent_contract = models.NullBooleanField(
+ _("Is a permanent contract"), blank=True, null=True)
+ default_daily_need_on_ground = models.FloatField(
+ _("Default daily number needed on the ground"), default=0)
+ default_daily_need = models.FloatField(
+ _("Default daily number needed"), default=0)
+
+ class Meta:
+ verbose_name = _("Job")
+ verbose_name_plural = _("Jobs")
+ ordering = ("label",)
+
+
+class GenericEquipmentType(GeneralType):
+ class Meta:
+ verbose_name = _("Generic equipment type")
+ verbose_name_plural = _("Generic equipment types")
+ ordering = ("label",)
+
+
+class EquipmentType(GeneralType):
+ generic_equipment_type = models.ForeignKey(
+ GenericEquipmentType, verbose_name=_("Generic type"))
+
+ class Meta:
+ verbose_name = _("Equipment type")
+ verbose_name_plural = _("Equipment types")
+ ordering = ("label",)
+
+
+class EquipmentCost(models.Model):
+ service_provider = models.CharField(_("Service provider"), max_length=200,
+ default="-")
+ equipment_type = models.ForeignKey(
+ EquipmentType, verbose_name=_("Equipment"))
+ flat_rate = models.BooleanField(_("Flat rate"), default=False)
+ daily_cost = models.FloatField(_("Daily cost"), blank=True, null=True)
+ monday = models.BooleanField(_("Monday"), default=True)
+ tuesday = models.BooleanField(_("Tuesday"), default=True)
+ wednesday = models.BooleanField(_("Wednesday"), default=True)
+ thursday = models.BooleanField(_("Thursday"), default=True)
+ friday = models.BooleanField(_("Friday"), default=True)
+
+ class Meta:
+ verbose_name = _("Equipment cost")
+ verbose_name_plural = _("Equipment costs")
+
+
+class TechnicalService(GeneralType):
+ class Meta:
+ verbose_name = _("Technical service")
+ verbose_name_plural = _("Technical services")
+ ordering = ("label",)
+
+
+TECH_UNITS = (
+ ("D", _("Days")),
+ ("M", _("Linear meter")),
+)
+
+
+class TechnicalServiceCost(models.Model):
+ service_provider = models.CharField(_("Service provider"), max_length=200,
+ default="-")
+ technical_service = models.ForeignKey(
+ TechnicalService, verbose_name=_("Technical service"))
+ flat_rate = models.BooleanField(_("Flat rate"), default=False)
+ unitary_cost = models.FloatField(_("Unitary cost"), blank=True, null=True)
+ unit = models.CharField(_("Unit"), max_length=1, choices=TECH_UNITS,
+ blank=True, null=True)
+
+ class Meta:
+ verbose_name = _("Equipment cost")
+ verbose_name_plural = _("Equipment costs")
+
+
class FileType(GeneralType):
class Meta:
verbose_name = _("Archaeological file type")
@@ -1061,3 +1140,49 @@ class FileDashboard:
.annotate(number=Sum("file__total_surface"))
.order_by("department__label")
)
+
+
+class PreventiveFile(models.Model):
+ file = models.ForeignKey(File, verbose_name=_("File"))
+ study_period = models.CharField(_("Study period"), max_length=200,
+ default="", blank=True)
+ start_date = models.DateField(_("Start date"), blank=True, null=True)
+ end_date = models.DateField(_("End date"), blank=True, null=True)
+ ground_start_date = models.DateField(_("Ground start date"), blank=True, null=True)
+ ground_end_date = models.DateField(_("Ground end date"), blank=True, null=True)
+ execution_report_date = models.DateField(_("Execution report date"), blank=True,
+ null=True)
+ linear_meter = models.IntegerField(_("Linear meter"), blank=True, null=True)
+
+ class Meta:
+ verbose_name = _("Preventive file")
+ verbose_name_plural = _("Preventive files")
+
+
+class ManDays(models.Model):
+ man_days_planned = models.FloatField(
+ _("Man-day planned"), null=True, blank=True)
+ man_days_worked = models.FloatField(
+ _("Man-day worked"), null=True, blank=True)
+
+ class Meta:
+ abstract = True
+
+
+class PreventiveFileJob(ManDays):
+ file = models.ForeignKey(PreventiveFile)
+ job = models.ForeignKey(Job)
+ ground_man_days_planned = models.FloatField(
+ _("Ground man-day planned"), null=True, blank=True)
+ ground_man_days_worked = models.FloatField(
+ _("Ground man-day worked"), null=True, blank=True)
+
+
+class PreventiveFileEquipmentCost(ManDays):
+ file = models.ForeignKey(PreventiveFile)
+ equipment_cost = models.ForeignKey(EquipmentCost)
+
+
+class PreventiveFileTechnicalServiceCost(ManDays):
+ file = models.ForeignKey(PreventiveFile)
+ technical_service_cost = models.ForeignKey(TechnicalServiceCost)