508
+    code_no_mks = models.CharField(max_length=100, null=True, blank=True)
509
+    lot_no = models.CharField(max_length=100, null=True, blank=True)
510
+    drawing = models.ImageField(upload_to='drawings/')
511
+    description = models.TextField(null=True, blank=True)
512
+    created_at = models.DateTimeField(auto_now_add=True)
513
+    updated_at = models.DateTimeField(auto_now=True)
514
+
515
+    created_by = models.ForeignKey(
516
+        User,
517
+        on_delete=models.SET_NULL,
518
+        null=True,
519
+        blank=True, 
520
+    )  # Reference to the user who created the report
521
+    
522
+    def __str__(self):
523
+        return f"{self.code_no} - {self.lot_no}"

+ 14 - 1
app/core/utils.py

@@ -12,6 +12,7 @@ from django.views.generic import (
12 12
 )
13 13
 from django.core.paginator import Paginator
14 14
 from core.models import MgMasterView, VMasterView, BelMasterView, EMasterView
15
+from pprint import pprint
15 16
 
16 17
 class ConfigurableCRUDView:
17 18
     model = None
@@ -44,6 +45,7 @@ class ConfigurableCRUDView:
44 45
         - Respects `config_field_orders` and `config_excludes`.
45 46
         Returns field instances instead of field names.
46 47
         """
48
+        pprint("get_fields")
47 49
         model_fields = {f.name: f for f in self.model._meta.get_fields()}
48 50
 
49 51
         # Filter based on `config_fields` configuration
@@ -65,7 +67,6 @@ class ConfigurableCRUDView:
65 67
         # Reorder fields to match the order specified in `config_field_orders`
66 68
         ordered_field_names = set(self.config_field_orders)
67 69
         ordered_fields.sort(key=lambda f: self.config_field_orders.index(f.name) if f.name in ordered_field_names else len(ordered_field_names))
68
-
69 70
         return ordered_fields + remaining_fields
70 71
 
71 72
 
@@ -226,3 +227,15 @@ def queryFromMaster(lot_no):
226 227
         results.extend(queryset)
227 228
     return results
228 229
 
230
+SHEET_NAMES = {
231
+    'hardness_out': 'Hardness Out',
232
+    'hardness_out_in': 'Hardness Out/In', 
233
+    'hardness_both_size': 'Hardness Both Size',
234
+    'dimension': 'Dimension',
235
+    'dimension_app': 'Dimension Appearance',
236
+    'dimension_bal_weight': 'Dimension Balance/Weight',
237
+    'dim_bal_app_hard': 'Dimension Balance/Appearance/Hardness',
238
+    'dim_bal_app_rot_hard': 'Dimension Balance/Appearance/Rotation/Hardness',
239
+    'thickness_8_point': 'Thickness 8 Points',
240
+    'centering': 'Centering',
241
+}

+ 104 - 0
app/legacy/migrations/0003_allproductaverageobminmaxview_and_more.py

@@ -0,0 +1,104 @@
1
+# Generated by Django 4.2 on 2025-05-06 04:36
2
+
3
+from django.db import migrations, models
4
+
5
+
6
+class Migration(migrations.Migration):
7
+
8
+    dependencies = [
9
+        ('legacy', '0002_belmasterview_emasterview_mgmasterview_vmasterview'),
10
+    ]
11
+
12
+    operations = [
13
+        migrations.CreateModel(
14
+            name='AllProductAverageObMinMaxView',
15
+            fields=[
16
+                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
17
+                ('ProductCode', models.CharField(max_length=255, null=True)),
18
+                ('out_min', models.DecimalField(decimal_places=2, max_digits=10, null=True)),
19
+                ('out_max', models.DecimalField(decimal_places=2, max_digits=10, null=True)),
20
+                ('in_min', models.DecimalField(decimal_places=2, max_digits=10, null=True)),
21
+                ('in_max', models.DecimalField(decimal_places=2, max_digits=10, null=True)),
22
+            ],
23
+            options={
24
+                'db_table': 'AllProduct_Average_OB_MIN_MAX_view',
25
+                'managed': False,
26
+            },
27
+        ),
28
+        migrations.CreateModel(
29
+            name='AllProductDimensionForInsProcess',
30
+            fields=[
31
+                ('ProdType', models.CharField(max_length=255, null=True)),
32
+                ('ProductCode', models.CharField(max_length=255, primary_key=True, serialize=False)),
33
+                ('Size_Id', models.CharField(max_length=255, null=True)),
34
+                ('Size_Name', models.CharField(max_length=255, null=True)),
35
+                ('Std', models.DecimalField(decimal_places=2, max_digits=10, null=True)),
36
+                ('TolUn', models.DecimalField(decimal_places=2, max_digits=10, null=True)),
37
+                ('TolUp', models.DecimalField(decimal_places=2, max_digits=10, null=True)),
38
+            ],
39
+            options={
40
+                'db_table': 'AllProduct_Dimension_ForInsProcess',
41
+                'managed': False,
42
+            },
43
+        ),
44
+        migrations.CreateModel(
45
+            name='AllProductPressPositionPressWeight',
46
+            fields=[
47
+                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
48
+                ('ProductCode', models.CharField(max_length=255, null=True)),
49
+                ('Lot_No', models.CharField(max_length=255, null=True)),
50
+                ('PO_Qty', models.DecimalField(decimal_places=2, max_digits=10, null=True)),
51
+                ('UWeight', models.DecimalField(decimal_places=2, max_digits=10, null=True)),
52
+                ('Current_ProNo', models.CharField(max_length=255, null=True)),
53
+                ('Press_Time', models.DecimalField(decimal_places=2, max_digits=10, null=True)),
54
+                ('PressType_1', models.CharField(max_length=255, null=True)),
55
+                ('PressWeight_1', models.DecimalField(decimal_places=2, max_digits=10, null=True)),
56
+                ('PressType_2', models.CharField(max_length=255, null=True)),
57
+                ('PressWeight_2', models.DecimalField(decimal_places=2, max_digits=10, null=True)),
58
+                ('Press_Ton', models.DecimalField(decimal_places=2, max_digits=10, null=True)),
59
+                ('Press_T', models.DecimalField(decimal_places=2, max_digits=10, null=True)),
60
+                ('Press_T_Tol', models.DecimalField(decimal_places=2, max_digits=10, null=True)),
61
+                ('Mold_D', models.DecimalField(decimal_places=2, max_digits=10, null=True)),
62
+                ('Mold_T', models.DecimalField(decimal_places=2, max_digits=10, null=True)),
63
+                ('SegMold_T', models.DecimalField(decimal_places=2, max_digits=10, null=True)),
64
+                ('SegMold_D', models.DecimalField(decimal_places=2, max_digits=10, null=True)),
65
+                ('Center_D', models.DecimalField(decimal_places=2, max_digits=10, null=True)),
66
+                ('Center_T', models.DecimalField(decimal_places=2, max_digits=10, null=True)),
67
+                ('LowerPlate_T', models.DecimalField(decimal_places=2, max_digits=10, null=True)),
68
+                ('StudPlate_T', models.DecimalField(decimal_places=2, max_digits=10, null=True)),
69
+                ('UpperPlate_T', models.DecimalField(decimal_places=2, max_digits=10, null=True)),
70
+                ('PinPlate_T', models.DecimalField(decimal_places=2, max_digits=10, null=True)),
71
+                ('TopConcave_T', models.DecimalField(decimal_places=2, max_digits=10, null=True)),
72
+                ('BottomConcave_T', models.DecimalField(decimal_places=2, max_digits=10, null=True)),
73
+            ],
74
+            options={
75
+                'db_table': 'AllProduct_PressPosition_PressWeight',
76
+                'managed': False,
77
+            },
78
+        ),
79
+        migrations.CreateModel(
80
+            name='RotateBrokenTest',
81
+            fields=[
82
+                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
83
+                ('row_no', models.IntegerField(blank=True, null=True)),
84
+                ('speed_spec', models.FloatField(blank=True, null=True)),
85
+                ('speed_test', models.FloatField(blank=True, null=True)),
86
+                ('speedOk', models.CharField(blank=True, max_length=4, null=True)),
87
+                ('qty', models.IntegerField()),
88
+                ('station_no', models.IntegerField()),
89
+                ('created_at', models.DateTimeField(blank=True, null=True)),
90
+                ('updated_at', models.DateTimeField(blank=True, null=True)),
91
+                ('lot_no', models.CharField(blank=True, max_length=50, null=True)),
92
+                ('machine_id', models.IntegerField(blank=True, null=True)),
93
+                ('code', models.CharField(blank=True, max_length=50, null=True)),
94
+                ('emp_id', models.IntegerField()),
95
+                ('devid', models.CharField(blank=True, max_length=40, null=True)),
96
+                ('mode', models.CharField(blank=True, max_length=10, null=True)),
97
+                ('cal_mode', models.IntegerField(blank=True, null=True)),
98
+            ],
99
+            options={
100
+                'db_table': 'rotate_broken_test',
101
+                'managed': False,
102
+            },
103
+        ),
104
+    ]

+ 2 - 0
app/legacy/templates/legacy/datacrud_list.html

@@ -46,6 +46,8 @@
46 46
                         </a>
47 47
                     {% elif field.name == 'file' and obj.file %}
48 48
                     <a href="{{ obj.file.url }}" target="_blank">View</a>
49
+                    {% elif field.name == 'drawing' and obj.drawing %}
50
+                    <a href="{{ obj.drawing.url }}" target="_blank">View</a>
49 51
                     {% elif field.get_internal_type == "DateTimeField" %}
50 52
                         {{ obj|attr:field.name|date:"d/m/Y H:i" }}
51 53
                     {% else %}

+ 30 - 1
app/report/filters.py

@@ -1,5 +1,5 @@
1 1
 import django_filters
2
-from core.models import Report
2
+from core.models import Report, CustomerTemplateMapping, ProductDrawing
3 3
 
4 4
 class ReportFilter(django_filters.FilterSet):
5 5
     name = django_filters.CharFilter(
@@ -26,3 +26,32 @@ class ReportFilter(django_filters.FilterSet):
26 26
     class Meta:
27 27
         model = Report
28 28
         fields = ['name', 'created_by', 'created_at']
29
+
30
+
31
+class CustomerTemplateFilter(django_filters.FilterSet):
32
+    customer_name = django_filters.CharFilter(
33
+        field_name='customer_name',
34
+        lookup_expr='icontains',
35
+        label='Customer Name'
36
+    )
37
+
38
+    template_names = django_filters.CharFilter(
39
+        method='filter_template_names',
40
+        label='Template Name Contains'
41
+    )
42
+
43
+    class Meta:
44
+        model = CustomerTemplateMapping
45
+        fields = ['customer_name', 'template_names']
46
+
47
+    def filter_template_names(self, queryset, name, value):
48
+        return queryset.filter(template_names__icontains=value)
49
+
50
+class ProductDrawingFilter(django_filters.FilterSet):
51
+    code_no = django_filters.CharFilter(lookup_expr='icontains', label='Code No')
52
+    code_no_mks = django_filters.CharFilter(lookup_expr='icontains', label='Code No (MKS)')
53
+    lot_no = django_filters.CharFilter(lookup_expr='icontains', label='Lot No')
54
+
55
+    class Meta:
56
+        model = ProductDrawing
57
+        fields = ['code_no', 'code_no_mks', 'lot_no',]

+ 42 - 0
app/report/templates/report/customer_template_form.html

@@ -0,0 +1,42 @@
1
+{% extends "base.html" %}
2
+{% load legacy_filters %}
3
+{% load tailwind_filters %}
4
+
5
+{% block title %}
6
+    {% if view.title %}
7
+        {{ view.title }}
8
+    {% else %}
9
+        {{ view|class_name }}
10
+    {% endif %}
11
+{% endblock %}
12
+
13
+{% block content %}
14
+<div class="container mx-auto px-4 py-6">
15
+    <h1 class="text-2xl font-bold mb-6">
16
+        {% if view.title %}
17
+            {{ view.title }}
18
+        {% elif view|class_name == "CreateViewClass" %}
19
+            Create {{ model_verbose_name }}
20
+        {% else %}
21
+            Update {{ model_verbose_name }}
22
+        {% endif %}
23
+    </h1>
24
+
25
+    <!-- Render the Form -->
26
+    <form method="post" enctype="multipart/form-data" >
27
+        {% csrf_token %}
28
+        <div>
29
+          
30
+        {{ form|crispy }}
31
+        </div>
32
+        <div class='mt-4'>
33
+            <button type="submit" class="bg-blue-500 text-white px-4 py-2 rounded hover:bg-blue-600">
34
+                Save
35
+            </button>
36
+            <a href="{% url list_url_name %}" class="bg-gray-300 text-gray-800 px-4 py-2 rounded hover:bg-gray-400">
37
+                Cancel
38
+            </a>
39
+        </div>
40
+    </form>
41
+</div>
42
+{% endblock %}

+ 126 - 0
app/report/templates/report/customer_template_list.html

@@ -0,0 +1,126 @@
1
+{% extends "base.html" %}
2
+{% load legacy_filters %}
3
+{% load tailwind_filters %}
4
+{% block title %}{{ page_title }}{% endblock %}
5
+
6
+{% block content %}
7
+<div class="container mx-auto px-4 py-6">
8
+    <h1 class="text-3xl font-bold text-gray-800 mb-4">{{ page_title }}</h1>
9
+
10
+    <!-- Filter Form -->
11
+    <form method="get" class="flex items-center space-x-4 mb-4">
12
+        {{ filter.form | crispy }}
13
+        <button type="submit" class="bg-blue-500 text-white px-4 py-2 rounded hover:bg-blue-600">Filter</button>
14
+        <a href="?" class="bg-gray-300 text-gray-800 px-4 py-2 rounded hover:bg-gray-400">Reset</a>
15
+    </form>
16
+
17
+    <!-- Create Button -->
18
+    <div class="my-4 flex">
19
+        <p class="text-gray-600 mb-4 mr-auto">
20
+            Total Records: {{ page_obj.paginator.count }}
21
+        </p>
22
+        <a href="{% url create_url %}" class="ml-auto bg-green-500 text-white px-4 py-2 rounded hover:bg-green-600">
23
+            Create New Data
24
+        </a>
25
+    </div>
26
+
27
+    <!-- Data Table -->
28
+    <div class="clear-both bg-white shadow rounded-lg overflow-x-auto">
29
+<table class="w-full border-collapse border border-gray-200">
30
+    <thead>
31
+        <tr class="bg-gray-100 text-left text-sm uppercase">
32
+            {% for field in fields %}
33
+            <th class="border border-gray-200 px-4 py-2 text-left">{% firstof field.verbose_name field.name %} </th>
34
+            {% endfor %}
35
+            <th class="py-2 px-4 border-b">Actions</th>
36
+        </tr>
37
+    </thead>
38
+    <tbody>
39
+        {% for obj in page_obj %}
40
+            <tr class="hover:bg-gray-50">
41
+                {% for field in fields %}
42
+                <td class="border border-gray-200 px-4 py-2">
43
+                    {% if field.name == 'id' %}
44
+                        <a href="{% url update_url obj.pk %}" class="text-blue-500 hover:underline">
45
+                            {{ obj|attr:field.name }}
46
+                        </a>
47
+                    {% elif field.name == 'template_names' %}
48
+
49
+                      {% with template_list=obj|attr:field.name %}
50
+                          {% for t in template_list %}
51
+                              {{ sheet_names | get_item:t }}
52
+                              {% if not forloop.last %}, {% endif %}
53
+                          {% endfor %}
54
+                      {% endwith %}
55
+                    {% elif field.name == 'file' and obj.file %}
56
+                    <a href="{{ obj.file.url }}" target="_blank">View</a>
57
+                    {% elif field.get_internal_type == "DateTimeField" %}
58
+                        {{ obj|attr:field.name|date:"d/m/Y H:i" }}
59
+                    {% else %}
60
+                        {{ obj|attr:field.name | safe_floatformat:2 }}
61
+                    {% endif %}
62
+                </td>
63
+                {% endfor %}
64
+                <td class="py-2 px-4 border-b">
65
+                    <a href="{% url update_url obj.pk %}" 
66
+                       class="bg-blue-500 text-white px-3 py-2 rounded hover:bg-blue-600">Edit</a>
67
+                    <a href="{% url delete_url obj.pk %}" 
68
+                       class="bg-red-500 text-white px-3 py-2 rounded hover:bg-red-600">Delete</a>
69
+                </td>
70
+            </tr>
71
+        {% empty %}
72
+            <tr>
73
+                <td colspan="5" class="py-4 px-4 text-center text-gray-600">No data available.</td>
74
+            </tr>
75
+        {% endfor %}
76
+    </tbody>
77
+</table>
78
+    </div>
79
+
80
+    <!-- Pagination -->
81
+    <div class="mt-6 flex justify-between items-center">
82
+        <div>
83
+            <span class="text-sm text-gray-600">
84
+                Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}
85
+            </span>
86
+        </div>
87
+        <div class="space-x-2">
88
+            {% if page_obj.has_previous %}
89
+                <a href="?{% for key, value in request.GET.items %}{% if key != 'page' %}{{ key }}={{ value|urlencode }}&{% endif %}{% endfor %}page=1" 
90
+                   class="text-blue-500 hover:underline">First</a>
91
+                <a href="?{% for key, value in request.GET.items %}{% if key != 'page' %}{{ key }}={{ value|urlencode }}&{% endif %}{% endfor %}page={{ page_obj.previous_page_number }}" 
92
+                   class="text-blue-500 hover:underline">Previous</a>
93
+            {% endif %}
94
+            {% for page_num in page_obj.paginator.page_range %}
95
+                {% if page_num == page_obj.number %}
96
+                    <span class="font-bold text-gray-700">{{ page_num }}</span>
97
+                {% elif page_num == 1 or page_num == page_obj.paginator.num_pages or page_num >= page_obj.number|add:"-2" and page_num <= page_obj.number|add:"2" %}
98
+                    <a href="?{% for key, value in request.GET.items %}{% if key != 'page' %}{{ key }}={{ value|urlencode }}&{% endif %}{% endfor %}page={{ page_num }}" 
99
+                       class="text-blue-500 hover:underline">{{ page_num }}</a>
100
+                {% elif page_num == page_obj.number|add:-3 or page_num == page_obj.number|add:3 %}
101
+                    <span class="mx-1">...</span>
102
+                {% endif %}
103
+            {% endfor %}
104
+            {% if page_obj.has_next %}
105
+                <a href="?{% for key, value in request.GET.items %}{% if key != 'page' %}{{ key }}={{ value|urlencode }}&{% endif %}{% endfor %}page={{ page_obj.next_page_number }}" 
106
+                   class="text-blue-500 hover:underline">Next</a>
107
+                <a href="?{% for key, value in request.GET.items %}{% if key != 'page' %}{{ key }}={{ value|urlencode }}&{% endif %}{% endfor %}page={{ page_obj.paginator.num_pages }}" 
108
+                   class="text-blue-500 hover:underline">Last</a>
109
+            {% endif %}
110
+        </div>
111
+    </div>
112
+</div>
113
+<style>
114
+/* Remove fixed layout and allow columns to grow dynamically */
115
+table {
116
+    table-layout: auto; /* Default is auto, can be explicitly set */
117
+    width: 100%; /* Ensures table spans available space */
118
+}
119
+
120
+th, td {
121
+    white-space: nowrap; /* Prevents text wrapping */
122
+    text-overflow: ellipsis; /* Adds ellipsis for overflowed content if combined with max-width */
123
+    vertical-align: top; /* Aligns content to the top */
124
+}
125
+</style>
126
+{% endblock %}

+ 12 - 1
app/report/urls.py

@@ -1,8 +1,10 @@
1 1
 from django.urls import path
2 2
 from . import views
3
-from .views import ReportCRUDView
3
+from .views import ReportCRUDView, CustomerTemplateCRUDView, ProductDrawingCRUDView
4 4
 
5 5
 report_crud = ReportCRUDView()
6
+customer_templates_crud = CustomerTemplateCRUDView()
7
+product_drawings_crud = ProductDrawingCRUDView()
6 8
 
7 9
 app_name = "report"  # Use this namespace for reverse URL lookups
8 10
 
@@ -16,6 +18,15 @@ urlpatterns = [
16 18
     path('coi/', views.coi_view, name='coi-view'),
17 19
     path('report/generate/', views.gen_report_view, name='gen_report'),
18 20
 
21
+    path('customer_templates/', customer_templates_crud.get_list_view().as_view(), name='customer_templates-list'),
22
+    path('customer_templates/create/', customer_templates_crud.get_create_view().as_view(), name='customer_templates-create'),
23
+    path('customer_templates/<str:pk>/update/', customer_templates_crud.get_update_view().as_view(), name='customer_templates-update'),
24
+    path('customer_templates/<str:pk>/delete/', customer_templates_crud.get_delete_view().as_view(), name='customer_templates-delete'),
25
+    
26
+    path('product_drawings/', product_drawings_crud.get_list_view().as_view(), name='product_drawings-list'),
27
+    path('product_drawings/create/', product_drawings_crud.get_create_view().as_view(), name='product_drawings-create'),
28
+    path('product_drawings/<str:pk>/update/', product_drawings_crud.get_update_view().as_view(), name='product_drawings-update'),
29
+    path('product_drawings/<str:pk>/delete/', product_drawings_crud.get_delete_view().as_view(), name='product_drawings-delete'),
19 30
     # path('create/', views.create_report, name='create'),  # Create a new report
20 31
     # path('<int:pk>/', views.detail_report, name='detail'),  # View details of a specific report
21 32
     # path('<int:pk>/update/', views.update_report, name='update'),  # Update a specific report

+ 84 - 16
app/report/views.py

@@ -1,10 +1,11 @@
1 1
 from django.shortcuts import render, redirect, get_object_or_404
2 2
 from django.core.paginator import Paginator
3 3
 from django.contrib import messages
4
-from core.models import Report, AllProductDimensionForInsProcess
5
-from core.forms import ReportForm
6
-from core.utils import ConfigurableCRUDView, queryFromMaster
7
-from .filters import ReportFilter
4
+from core.models import Report, AllProductDimensionForInsProcess, CustomerTemplateMapping, \
5
+                ProductDrawing
6
+from core.forms import ReportForm, CustomerTemplateMappingForm, ProductDrawingForm
7
+from core.utils import ConfigurableCRUDView, queryFromMaster, SHEET_NAMES
8
+from .filters import ReportFilter, CustomerTemplateFilter, ProductDrawingFilter
8 9
 from .forms import ExportOptionsForm
9 10
 from pprint import pprint
10 11
 
@@ -24,6 +25,10 @@ from django.conf import settings
24 25
 
25 26
 from itertools import chain
26 27
 
28
+from django_filters.views import FilterView
29
+
30
+from django.views.generic import (
31
+    ListView,)
27 32
 
28 33
 def index(request):
29 34
     reports = Report.objects.all()
@@ -886,18 +891,6 @@ def create_coi_file(lot_no, sheets, user, md):
886 891
     pprint(f"outputfile = {output_file}")
887 892
     return report
888 893
 
889
-SHEET_NAMES = {
890
-    'hardness_out': 'Hardness Out',
891
-    'hardness_out_in': 'Hardness Out/In', 
892
-    'hardness_both_size': 'Hardness Both Size',
893
-    'dimension': 'Dimension',
894
-    'dimension_app': 'Dimension Appearance',
895
-    'dimension_bal_weight': 'Dimension Balance/Weight',
896
-    'dim_bal_app_hard': 'Dimension Balance/Appearance/Hardness',
897
-    'dim_bal_app_rot_hard': 'Dimension Balance/Appearance/Rotation/Hardness',
898
-    'thickness_8_point': 'Thickness 8 Points',
899
-    'centering': 'Centering',
900
-}
901 894
 def get_fields(model):
902 895
     # model_fields = {f.name: f for f in model._meta.get_fields()}
903 896
     # fields = list(model_fields.values())
@@ -1051,3 +1044,78 @@ def gen_report_view(request):
1051 1044
 
1052 1045
 
1053 1046
 
1047
+class CustomerTemplateCRUDView(ConfigurableCRUDView):
1048
+    model = CustomerTemplateMapping
1049
+    list_template_name = 'report/customer_template_list.html'
1050
+    detail_template_name = 'legacy/datacrud_detail.html'
1051
+    form_template_name = 'report/customer_template_form.html'
1052
+    confirm_delete_template_name = 'legacy/datacrud_confirm_delete.html'
1053
+    filterset_class = CustomerTemplateFilter
1054
+
1055
+    page_title = "Customer Template Mapping"
1056
+
1057
+    # URL name mappings
1058
+    list_url_name = 'report:customer_templates-list'
1059
+    create_url_name = 'report:customer_templates-create'
1060
+    update_url_name = 'report:customer_templates-update'
1061
+    delete_url_name = 'report:customer_templates-delete'
1062
+    config_fields = ["id", "customer_name", "template_names", "created_at"] 
1063
+    config_field_orders = ["id", "customer_name", "template_names", "created_at",  "created_by"]
1064
+    # config_readonly_fields = ["lot_no"]
1065
+    config_edit_fields = None
1066
+    ordering = ["-created_at", "-id",]
1067
+    form_class = CustomerTemplateMappingForm
1068
+
1069
+
1070
+    def get_list_view(self):
1071
+        class ListViewClass(FilterView, ListView):
1072
+            model = self.model
1073
+            template_name = self.list_template_name
1074
+            paginate_by = self.paginate_by
1075
+            filterset_class = self.filterset_class
1076
+            ordering = self.ordering
1077
+
1078
+            def get_context_data(inner_self, **kwargs):
1079
+                context = super().get_context_data(**kwargs)
1080
+                fields = self.get_fields()
1081
+                context.update({
1082
+                    'fields': [f for f in fields],
1083
+                    'sheet_names': SHEET_NAMES,
1084
+
1085
+                    # 'fields': [field for field in self.model._meta.get_fields()],
1086
+                    'page_title': self.page_title,
1087
+                    'list_url': self.list_url_name,
1088
+                    'create_url': self.create_url_name,
1089
+                    'update_url': self.update_url_name,
1090
+                    'delete_url': self.delete_url_name,
1091
+                    'bs': self.get_breadcrumbs('list'),
1092
+                })
1093
+                return context
1094
+
1095
+        return ListViewClass
1096
+
1097
+
1098
+
1099
+class ProductDrawingCRUDView(ConfigurableCRUDView):
1100
+    model = ProductDrawing
1101
+    list_template_name = 'legacy/datacrud_list.html'
1102
+    detail_template_name = 'legacy/datacrud_detail.html'
1103
+    form_template_name = 'legacy/datacrud_form.html'
1104
+    confirm_delete_template_name = 'legacy/datacrud_confirm_delete.html'
1105
+    filterset_class = ProductDrawingFilter
1106
+
1107
+    page_title = "Product Drawing"
1108
+
1109
+    # URL name mappings
1110
+    list_url_name = 'report:product_drawings-list'
1111
+    create_url_name = 'report:product_drawings-create'
1112
+    update_url_name = 'report:product_drawings-update'
1113
+    delete_url_name = 'report:product_drawings-delete'
1114
+    config_fields = ["id", "code_no", "code_no_mks", "lot_no", "drawing", "description", "created_at"] 
1115
+    #config_field_orders = ["id", "customer_name", "template_names", "created_at",  "created_by"]
1116
+    # config_readonly_fields = ["lot_no"]
1117
+    config_edit_fields = None
1118
+    ordering = ["-created_at", "-id",]
1119
+    form_class = ProductDrawingForm
1120
+
1121
+

BIN
app/src.zip


+ 18 - 0
app/sysadmin/migrations/0002_alter_userprofile_position.py

@@ -0,0 +1,18 @@
1
+# Generated by Django 4.2 on 2025-05-06 04:36
2
+
3
+from django.db import migrations, models
4
+
5
+
6
+class Migration(migrations.Migration):
7
+
8
+    dependencies = [
9
+        ('sysadmin', '0001_initial'),
10
+    ]
11
+
12
+    operations = [
13
+        migrations.AlterField(
14
+            model_name='userprofile',
15
+            name='position',
16
+            field=models.CharField(blank=True, choices=[('QA_STAFF', 'QA Staff'), ('QA_MANAGER', 'QA. MG.'), ('QA_AST_MANAGER', 'QA. Asst. MG.'), ('QA_ENGINEER', 'QA. Engineer')], max_length=20, null=True),
17
+        ),
18
+    ]

+ 2 - 0
app/templates/base.html

@@ -66,6 +66,8 @@
66 66
                 <li><a href="/dashboard/" class="flex items-center p-2 text-gray-900 rounded-lg hover:bg-gray-100 dark:hover:bg-gray-700 dark:text-white"><span class="ml-3">Dashboard</span></a></li>
67 67
                 <li><a href="{% url "report:coi-view" %}" class="flex items-center p-2 text-gray-900 rounded-lg hover:bg-gray-100 dark:hover:bg-gray-700 dark:text-white"><span class="ml-3">COI</span></a></li>
68 68
                 <li><a href="{% url "report:report-list" %}" class="flex items-center p-2 text-gray-900 rounded-lg hover:bg-gray-100 dark:hover:bg-gray-700 dark:text-white"><span class="ml-3">Reports</span></a></li>
69
+                <li><a href="{% url "report:customer_templates-list" %}" class="flex items-center p-2 text-gray-900 rounded-lg hover:bg-gray-100 dark:hover:bg-gray-700 dark:text-white"><span class="ml-3">Customer Templates</span></a></li>
70
+                <li><a href="{% url "report:product_drawings-list" %}" class="flex items-center p-2 text-gray-900 rounded-lg hover:bg-gray-100 dark:hover:bg-gray-700 dark:text-white"><span class="ml-3">Drawing</span></a></li>
69 71
                  <li>
70 72
                     <button type="button" class="flex items-center w-full p-2 text-base text-gray-900 transition duration-75 rounded-lg group hover:bg-gray-100 dark:text-white dark:hover:bg-gray-700" aria-controls="dropdown-example" data-collapse-toggle="dropdown-example">
71 73
                           <svg class="w-6 h-6 text-gray-800 dark:text-white" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" viewBox="0 0 24 24">

tum/coi - Gogs: Simplico Git Service

Bez popisu

Mockup_Data_for_MgMasterView.csv 16KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. PRO0,PRO1,PRO1C,PRO2,PRO5,PRO8,PRO9,SPEED,AGR1,AGR2,ob_Condition,MC11,MC12,MC14,MI13,MI14,MI15
  2. PRO0_4824,PRO1_8534,TypeB,PRO2_8359,PRO5_3437,PRO8_6438,PRO9_5699,50,Agreement1,Agreement6,Condition3,MC11_8438,MC12_2712,MC14_5794,MI13_5989,MI14_2670,MI15_8053
  3. PRO0_3460,PRO1_5843,TypeA,PRO2_3689,PRO5_7492,PRO8_8794,PRO9_5233,138,Agreement3,Agreement5,Condition1,MC11_4178,MC12_1554,MC14_4784,MI13_9389,MI14_8281,MI15_8343
  4. PRO0_7827,PRO1_6128,TypeB,PRO2_2333,PRO5_7400,PRO8_7433,PRO9_8668,134,Agreement3,Agreement4,Condition2,MC11_2536,MC12_8183,MC14_3855,MI13_7839,MI14_9489,MI15_3788
  5. PRO0_9254,PRO1_2521,TypeA,PRO2_8133,PRO5_1924,PRO8_8826,PRO9_1966,118,Agreement2,Agreement6,Condition2,MC11_4132,MC12_2864,MC14_4143,MI13_3494,MI14_5573,MI15_2330
  6. PRO0_8529,PRO1_9568,TypeC,PRO2_4246,PRO5_5874,PRO8_6338,PRO9_8657,104,Agreement1,Agreement4,Condition1,MC11_3253,MC12_5477,MC14_4984,MI13_2848,MI14_8977,MI15_9625
  7. PRO0_4073,PRO1_1353,TypeB,PRO2_4132,PRO5_5896,PRO8_1763,PRO9_3899,77,Agreement2,Agreement5,Condition3,MC11_5716,MC12_4944,MC14_1901,MI13_1537,MI14_7699,MI15_8750
  8. PRO0_3821,PRO1_1419,TypeB,PRO2_1063,PRO5_6608,PRO8_7811,PRO9_3360,117,Agreement2,Agreement5,Condition2,MC11_7269,MC12_2656,MC14_5828,MI13_1685,MI14_2620,MI15_6786
  9. PRO0_9752,PRO1_4504,TypeB,PRO2_8569,PRO5_6760,PRO8_5274,PRO9_1417,151,Agreement2,Agreement6,Condition2,MC11_4230,MC12_4636,MC14_7819,MI13_8624,MI14_3508,MI15_9401
  10. PRO0_2615,PRO1_7165,TypeA,PRO2_2575,PRO5_3623,PRO8_4381,PRO9_6374,149,Agreement1,Agreement4,Condition2,MC11_8884,MC12_5850,MC14_2918,MI13_4223,MI14_6911,MI15_6359
  11. PRO0_7269,PRO1_9147,TypeB,PRO2_1827,PRO5_4134,PRO8_4403,PRO9_7964,170,Agreement2,Agreement4,Condition1,MC11_5362,MC12_8644,MC14_1927,MI13_3780,MI14_4445,MI15_7780
  12. PRO0_4097,PRO1_7327,TypeB,PRO2_1937,PRO5_8589,PRO8_9580,PRO9_3062,75,Agreement2,Agreement4,Condition3,MC11_5816,MC12_3979,MC14_7717,MI13_7238,MI14_5815,MI15_1572
  13. PRO0_2407,PRO1_3071,TypeB,PRO2_7052,PRO5_4657,PRO8_4328,PRO9_8696,177,Agreement3,Agreement6,Condition3,MC11_7485,MC12_5502,MC14_3649,MI13_3694,MI14_5945,MI15_8496
  14. PRO0_4315,PRO1_2908,TypeC,PRO2_6671,PRO5_9007,PRO8_4400,PRO9_2941,114,Agreement1,Agreement4,Condition1,MC11_5353,MC12_4961,MC14_9893,MI13_7035,MI14_7432,MI15_6481
  15. PRO0_2110,PRO1_2227,TypeC,PRO2_8805,PRO5_1716,PRO8_2207,PRO9_3071,84,Agreement1,Agreement5,Condition3,MC11_6460,MC12_4101,MC14_3995,MI13_6137,MI14_8104,MI15_9838
  16. PRO0_3348,PRO1_8760,TypeB,PRO2_6343,PRO5_8565,PRO8_1173,PRO9_5768,110,Agreement3,Agreement4,Condition3,MC11_8888,MC12_3545,MC14_7155,MI13_7716,MI14_6755,MI15_5129
  17. PRO0_6615,PRO1_9939,TypeB,PRO2_9176,PRO5_6618,PRO8_5098,PRO9_5731,145,Agreement1,Agreement4,Condition2,MC11_3891,MC12_6033,MC14_3865,MI13_7144,MI14_8788,MI15_8588
  18. PRO0_5328,PRO1_7107,TypeC,PRO2_2380,PRO5_6236,PRO8_3497,PRO9_6837,80,Agreement2,Agreement6,Condition3,MC11_4328,MC12_6678,MC14_4563,MI13_3376,MI14_9077,MI15_3076
  19. PRO0_8480,PRO1_8614,TypeC,PRO2_3122,PRO5_5025,PRO8_8649,PRO9_8030,156,Agreement1,Agreement4,Condition2,MC11_7644,MC12_1567,MC14_1196,MI13_5254,MI14_1096,MI15_2069
  20. PRO0_6574,PRO1_9055,TypeB,PRO2_4533,PRO5_7857,PRO8_3738,PRO9_5618,104,Agreement3,Agreement6,Condition1,MC11_1623,MC12_7359,MC14_8406,MI13_4921,MI14_2863,MI15_3100
  21. PRO0_9405,PRO1_4883,TypeA,PRO2_3662,PRO5_1601,PRO8_4250,PRO9_3498,141,Agreement1,Agreement5,Condition1,MC11_8579,MC12_3862,MC14_2203,MI13_5591,MI14_6293,MI15_6772
  22. PRO0_2503,PRO1_2729,TypeC,PRO2_7388,PRO5_5226,PRO8_3177,PRO9_4633,61,Agreement2,Agreement4,Condition3,MC11_3170,MC12_8755,MC14_2944,MI13_1264,MI14_4457,MI15_2423
  23. PRO0_6669,PRO1_8455,TypeA,PRO2_5973,PRO5_6352,PRO8_1809,PRO9_2143,163,Agreement1,Agreement6,Condition3,MC11_2107,MC12_6188,MC14_9614,MI13_7527,MI14_1561,MI15_1156
  24. PRO0_8558,PRO1_4301,TypeB,PRO2_1410,PRO5_1664,PRO8_4179,PRO9_6548,137,Agreement3,Agreement6,Condition1,MC11_6047,MC12_3626,MC14_1607,MI13_2142,MI14_2931,MI15_1759
  25. PRO0_3174,PRO1_5210,TypeA,PRO2_7600,PRO5_4437,PRO8_5110,PRO9_6263,153,Agreement1,Agreement6,Condition1,MC11_6095,MC12_1667,MC14_9001,MI13_1188,MI14_2119,MI15_2452
  26. PRO0_8972,PRO1_3093,TypeC,PRO2_2354,PRO5_3005,PRO8_8554,PRO9_2824,83,Agreement2,Agreement6,Condition2,MC11_7566,MC12_9830,MC14_7855,MI13_4210,MI14_6080,MI15_9994
  27. PRO0_5224,PRO1_2820,TypeC,PRO2_9944,PRO5_8981,PRO8_4783,PRO9_4224,73,Agreement1,Agreement6,Condition3,MC11_2868,MC12_5725,MC14_3060,MI13_6202,MI14_3156,MI15_7034
  28. PRO0_1617,PRO1_9243,TypeC,PRO2_3383,PRO5_1931,PRO8_4682,PRO9_9929,157,Agreement1,Agreement6,Condition3,MC11_5649,MC12_9238,MC14_6644,MI13_5526,MI14_8271,MI15_6507
  29. PRO0_3547,PRO1_2366,TypeB,PRO2_2833,PRO5_1612,PRO8_4398,PRO9_2969,172,Agreement3,Agreement5,Condition1,MC11_6199,MC12_7139,MC14_9719,MI13_3427,MI14_2935,MI15_4135
  30. PRO0_5489,PRO1_6017,TypeC,PRO2_1426,PRO5_6659,PRO8_3050,PRO9_8805,129,Agreement3,Agreement5,Condition3,MC11_3934,MC12_4192,MC14_4692,MI13_7127,MI14_8326,MI15_9939
  31. PRO0_3499,PRO1_9681,TypeA,PRO2_2400,PRO5_8470,PRO8_9024,PRO9_5313,102,Agreement3,Agreement6,Condition3,MC11_7216,MC12_6473,MC14_9827,MI13_6567,MI14_8230,MI15_6642
  32. PRO0_2910,PRO1_1829,TypeB,PRO2_9772,PRO5_1618,PRO8_8020,PRO9_6324,145,Agreement1,Agreement6,Condition3,MC11_8668,MC12_8537,MC14_7732,MI13_1353,MI14_9524,MI15_1701
  33. PRO0_3665,PRO1_9061,TypeC,PRO2_6993,PRO5_4812,PRO8_3933,PRO9_1674,179,Agreement1,Agreement6,Condition2,MC11_3836,MC12_5377,MC14_9289,MI13_4278,MI14_3087,MI15_4433
  34. PRO0_6582,PRO1_6938,TypeA,PRO2_3508,PRO5_5145,PRO8_5732,PRO9_9626,198,Agreement1,Agreement5,Condition1,MC11_3683,MC12_4193,MC14_9518,MI13_4282,MI14_9172,MI15_4102
  35. PRO0_4239,PRO1_5701,TypeA,PRO2_3991,PRO5_4416,PRO8_7764,PRO9_8318,62,Agreement1,Agreement5,Condition1,MC11_6289,MC12_5638,MC14_6606,MI13_4144,MI14_1666,MI15_6499
  36. PRO0_2569,PRO1_4117,TypeC,PRO2_5274,PRO5_5712,PRO8_5723,PRO9_6730,122,Agreement3,Agreement5,Condition2,MC11_6408,MC12_6214,MC14_9538,MI13_4313,MI14_1938,MI15_5230
  37. PRO0_5599,PRO1_8395,TypeC,PRO2_1524,PRO5_5962,PRO8_5274,PRO9_5468,72,Agreement2,Agreement4,Condition2,MC11_2475,MC12_2242,MC14_2653,MI13_7039,MI14_8977,MI15_9085
  38. PRO0_5124,PRO1_7083,TypeA,PRO2_1397,PRO5_6124,PRO8_2176,PRO9_8643,124,Agreement3,Agreement4,Condition3,MC11_5820,MC12_6641,MC14_1415,MI13_7811,MI14_3212,MI15_6598
  39. PRO0_5423,PRO1_6601,TypeB,PRO2_4405,PRO5_1191,PRO8_1169,PRO9_7090,195,Agreement2,Agreement6,Condition3,MC11_6609,MC12_4256,MC14_4307,MI13_6166,MI14_8907,MI15_6445
  40. PRO0_2204,PRO1_5686,TypeC,PRO2_3562,PRO5_1832,PRO8_2235,PRO9_6018,185,Agreement2,Agreement5,Condition3,MC11_2210,MC12_9846,MC14_1459,MI13_2950,MI14_3482,MI15_7508
  41. PRO0_2565,PRO1_2056,TypeA,PRO2_8799,PRO5_6747,PRO8_6811,PRO9_6984,191,Agreement3,Agreement5,Condition3,MC11_2931,MC12_5763,MC14_2856,MI13_8300,MI14_4300,MI15_5223
  42. PRO0_3910,PRO1_8089,TypeA,PRO2_3013,PRO5_2176,PRO8_2292,PRO9_5506,134,Agreement3,Agreement4,Condition3,MC11_3394,MC12_9040,MC14_6078,MI13_2980,MI14_1066,MI15_1281
  43. PRO0_8257,PRO1_3416,TypeB,PRO2_2136,PRO5_6632,PRO8_5882,PRO9_5493,200,Agreement3,Agreement5,Condition1,MC11_4798,MC12_3775,MC14_2969,MI13_3636,MI14_8629,MI15_3827
  44. PRO0_7367,PRO1_4958,TypeB,PRO2_9862,PRO5_8364,PRO8_4393,PRO9_9015,129,Agreement2,Agreement4,Condition1,MC11_2840,MC12_2561,MC14_1216,MI13_8794,MI14_6215,MI15_5212
  45. PRO0_8767,PRO1_1964,TypeA,PRO2_2364,PRO5_8493,PRO8_9396,PRO9_4513,102,Agreement1,Agreement4,Condition3,MC11_3978,MC12_8799,MC14_3756,MI13_2220,MI14_6666,MI15_5507
  46. PRO0_6473,PRO1_1226,TypeB,PRO2_1756,PRO5_7238,PRO8_9374,PRO9_2136,166,Agreement2,Agreement6,Condition2,MC11_3755,MC12_9197,MC14_5474,MI13_6221,MI14_6281,MI15_8210
  47. PRO0_2026,PRO1_4172,TypeA,PRO2_8686,PRO5_7453,PRO8_4993,PRO9_7107,109,Agreement3,Agreement4,Condition1,MC11_3172,MC12_2828,MC14_2307,MI13_1025,MI14_2939,MI15_9370
  48. PRO0_3265,PRO1_1505,TypeC,PRO2_9622,PRO5_3041,PRO8_5734,PRO9_4485,107,Agreement2,Agreement4,Condition1,MC11_2790,MC12_8889,MC14_5023,MI13_3201,MI14_7883,MI15_7193
  49. PRO0_7943,PRO1_8660,TypeA,PRO2_6124,PRO5_3109,PRO8_2036,PRO9_6209,139,Agreement1,Agreement6,Condition2,MC11_4208,MC12_8846,MC14_3460,MI13_9589,MI14_3846,MI15_2763
  50. PRO0_2592,PRO1_6322,TypeC,PRO2_1140,PRO5_7177,PRO8_8201,PRO9_8214,53,Agreement3,Agreement6,Condition1,MC11_9220,MC12_3901,MC14_1276,MI13_7362,MI14_1896,MI15_8327
  51. PRO0_4452,PRO1_1673,TypeC,PRO2_7472,PRO5_5564,PRO8_1946,PRO9_3714,59,Agreement1,Agreement6,Condition3,MC11_6961,MC12_2413,MC14_1673,MI13_2301,MI14_7890,MI15_1341
  52. PRO0_4241,PRO1_8714,TypeA,PRO2_4673,PRO5_8352,PRO8_4335,PRO9_7820,159,Agreement1,Agreement4,Condition3,MC11_4694,MC12_6561,MC14_6489,MI13_8077,MI14_6301,MI15_7950
  53. PRO0_8401,PRO1_6636,TypeB,PRO2_9058,PRO5_8979,PRO8_7718,PRO9_6384,147,Agreement2,Agreement4,Condition2,MC11_3397,MC12_2205,MC14_9527,MI13_3853,MI14_3387,MI15_8296
  54. PRO0_8630,PRO1_9048,TypeB,PRO2_4866,PRO5_5449,PRO8_9044,PRO9_6207,167,Agreement1,Agreement6,Condition3,MC11_7180,MC12_2354,MC14_2232,MI13_7219,MI14_5977,MI15_8035
  55. PRO0_1134,PRO1_5306,TypeC,PRO2_1445,PRO5_5938,PRO8_8529,PRO9_3453,67,Agreement1,Agreement5,Condition3,MC11_2069,MC12_2756,MC14_5707,MI13_7312,MI14_8860,MI15_2786
  56. PRO0_5231,PRO1_9358,TypeB,PRO2_6978,PRO5_1843,PRO8_4053,PRO9_1083,116,Agreement3,Agreement4,Condition1,MC11_6515,MC12_4891,MC14_6564,MI13_8070,MI14_8758,MI15_8701
  57. PRO0_2899,PRO1_1308,TypeB,PRO2_8234,PRO5_5480,PRO8_3748,PRO9_3803,198,Agreement1,Agreement6,Condition1,MC11_8348,MC12_8892,MC14_4453,MI13_8789,MI14_5526,MI15_2026
  58. PRO0_6735,PRO1_1257,TypeC,PRO2_9973,PRO5_2423,PRO8_4946,PRO9_1972,171,Agreement1,Agreement5,Condition2,MC11_2404,MC12_5100,MC14_2774,MI13_9284,MI14_4129,MI15_5883
  59. PRO0_1509,PRO1_1136,TypeA,PRO2_4700,PRO5_9518,PRO8_2581,PRO9_6201,183,Agreement3,Agreement4,Condition2,MC11_2998,MC12_2134,MC14_3125,MI13_7406,MI14_8391,MI15_2544
  60. PRO0_6075,PRO1_6924,TypeB,PRO2_5007,PRO5_8167,PRO8_2971,PRO9_5734,181,Agreement2,Agreement4,Condition2,MC11_8633,MC12_1812,MC14_4706,MI13_8463,MI14_2578,MI15_1186
  61. PRO0_5926,PRO1_6287,TypeC,PRO2_5709,PRO5_4373,PRO8_1624,PRO9_7273,109,Agreement2,Agreement4,Condition3,MC11_9035,MC12_3083,MC14_8519,MI13_8100,MI14_8342,MI15_9707
  62. PRO0_4737,PRO1_2648,TypeA,PRO2_4223,PRO5_8859,PRO8_3291,PRO9_8683,166,Agreement2,Agreement6,Condition2,MC11_6940,MC12_1144,MC14_5174,MI13_5901,MI14_2721,MI15_2026
  63. PRO0_5482,PRO1_3313,TypeC,PRO2_7682,PRO5_1982,PRO8_9980,PRO9_2245,166,Agreement2,Agreement4,Condition3,MC11_8754,MC12_7450,MC14_4335,MI13_1783,MI14_9155,MI15_6106
  64. PRO0_6300,PRO1_1127,TypeB,PRO2_6998,PRO5_4916,PRO8_2466,PRO9_9978,105,Agreement2,Agreement5,Condition2,MC11_1570,MC12_1210,MC14_5015,MI13_6267,MI14_4124,MI15_2652
  65. PRO0_4027,PRO1_9707,TypeB,PRO2_3466,PRO5_7479,PRO8_6445,PRO9_5936,75,Agreement2,Agreement4,Condition1,MC11_4541,MC12_9262,MC14_7475,MI13_9645,MI14_3681,MI15_9672
  66. PRO0_8783,PRO1_4945,TypeC,PRO2_2419,PRO5_4343,PRO8_1454,PRO9_7142,119,Agreement2,Agreement4,Condition3,MC11_7879,MC12_5430,MC14_8919,MI13_8098,MI14_6689,MI15_9302
  67. PRO0_3469,PRO1_8072,TypeC,PRO2_2152,PRO5_4247,PRO8_4707,PRO9_1437,62,Agreement1,Agreement6,Condition2,MC11_2209,MC12_1081,MC14_1291,MI13_8195,MI14_4323,MI15_4540
  68. PRO0_8216,PRO1_9409,TypeB,PRO2_1177,PRO5_1448,PRO8_6093,PRO9_9368,79,Agreement1,Agreement6,Condition2,MC11_1758,MC12_5972,MC14_6041,MI13_8900,MI14_1515,MI15_6744
  69. PRO0_3675,PRO1_1459,TypeB,PRO2_8076,PRO5_9447,PRO8_4144,PRO9_2855,62,Agreement2,Agreement4,Condition3,MC11_3786,MC12_7047,MC14_2871,MI13_8321,MI14_5559,MI15_7472
  70. PRO0_2142,PRO1_9255,TypeB,PRO2_2401,PRO5_6461,PRO8_9833,PRO9_7009,172,Agreement2,Agreement6,Condition3,MC11_9795,MC12_5254,MC14_2975,MI13_6327,MI14_7249,MI15_9598
  71. PRO0_9333,PRO1_2258,TypeB,PRO2_6367,PRO5_9776,PRO8_8754,PRO9_7173,129,Agreement2,Agreement5,Condition1,MC11_4124,MC12_7754,MC14_3162,MI13_7752,MI14_2514,MI15_8077
  72. PRO0_9617,PRO1_8395,TypeA,PRO2_5479,PRO5_3632,PRO8_1407,PRO9_4858,169,Agreement1,Agreement6,Condition1,MC11_4165,MC12_7151,MC14_5143,MI13_6891,MI14_2809,MI15_8037
  73. PRO0_3694,PRO1_7738,TypeA,PRO2_2441,PRO5_6157,PRO8_6475,PRO9_5278,151,Agreement1,Agreement4,Condition3,MC11_4088,MC12_1178,MC14_8186,MI13_6679,MI14_6237,MI15_2049
  74. PRO0_2020,PRO1_4643,TypeA,PRO2_5490,PRO5_8193,PRO8_1986,PRO9_8684,88,Agreement1,Agreement5,Condition2,MC11_3296,MC12_9955,MC14_5897,MI13_7980,MI14_6206,MI15_2070
  75. PRO0_4973,PRO1_5776,TypeB,PRO2_9323,PRO5_5191,PRO8_7753,PRO9_2071,159,Agreement1,Agreement4,Condition1,MC11_8443,MC12_7100,MC14_1733,MI13_2265,MI14_5831,MI15_3210
  76. PRO0_4336,PRO1_9678,TypeA,PRO2_8151,PRO5_8033,PRO8_1154,PRO9_2267,121,Agreement1,Agreement4,Condition1,MC11_2131,MC12_3288,MC14_9107,MI13_8142,MI14_6274,MI15_8154
  77. PRO0_1528,PRO1_5342,TypeB,PRO2_9252,PRO5_2360,PRO8_4877,PRO9_2064,80,Agreement3,Agreement5,Condition1,MC11_2077,MC12_8894,MC14_3494,MI13_9180,MI14_1025,MI15_4072
  78. PRO0_6300,PRO1_7183,TypeA,PRO2_7302,PRO5_5513,PRO8_3582,PRO9_5594,76,Agreement3,Agreement5,Condition1,MC11_7138,MC12_9816,MC14_9240,MI13_5351,MI14_1119,MI15_8637
  79. PRO0_2151,PRO1_4122,TypeB,PRO2_9129,PRO5_7427,PRO8_8840,PRO9_3609,109,Agreement1,Agreement6,Condition2,MC11_1422,MC12_3528,MC14_2122,MI13_3570,MI14_7230,MI15_9646
  80. PRO0_4245,PRO1_8528,TypeB,PRO2_6789,PRO5_8623,PRO8_9452,PRO9_6966,113,Agreement3,Agreement6,Condition2,MC11_1017,MC12_3552,MC14_4751,MI13_5049,MI14_5765,MI15_4231
  81. PRO0_5764,PRO1_2843,TypeB,PRO2_5120,PRO5_5004,PRO8_7381,PRO9_7490,124,Agreement2,Agreement4,Condition3,MC11_1883,MC12_5121,MC14_4398,MI13_3459,MI14_8945,MI15_4705
  82. PRO0_4921,PRO1_6371,TypeA,PRO2_6784,PRO5_1017,PRO8_2328,PRO9_1601,196,Agreement2,Agreement4,Condition2,MC11_5687,MC12_1710,MC14_8682,MI13_9291,MI14_8241,MI15_3499
  83. PRO0_2380,PRO1_2106,TypeB,PRO2_5401,PRO5_5495,PRO8_3651,PRO9_4105,108,Agreement3,Agreement6,Condition1,MC11_1521,MC12_7164,MC14_1640,MI13_4031,MI14_6855,MI15_3763
  84. PRO0_1211,PRO1_6821,TypeC,PRO2_2967,PRO5_2997,PRO8_5869,PRO9_2457,176,Agreement1,Agreement5,Condition1,MC11_8567,MC12_2946,MC14_4276,MI13_7550,MI14_4698,MI15_4557
  85. PRO0_2414,PRO1_9576,TypeC,PRO2_9287,PRO5_5169,PRO8_4426,PRO9_9904,119,Agreement3,Agreement6,Condition3,MC11_3639,MC12_7644,MC14_5310,MI13_1659,MI14_8927,MI15_3495
  86. PRO0_5694,PRO1_6504,TypeA,PRO2_8751,PRO5_1941,PRO8_8557,PRO9_1870,94,Agreement3,Agreement5,Condition3,MC11_5384,MC12_3813,MC14_2592,MI13_7886,MI14_1156,MI15_6120
  87. PRO0_8363,PRO1_7571,TypeC,PRO2_8754,PRO5_3956,PRO8_8330,PRO9_7066,149,Agreement2,Agreement4,Condition2,MC11_2606,MC12_5012,MC14_6621,MI13_8233,MI14_5645,MI15_5503
  88. PRO0_7544,PRO1_7841,TypeB,PRO2_8631,PRO5_2132,PRO8_7907,PRO9_3267,151,Agreement2,Agreement6,Condition1,MC11_2829,MC12_1587,MC14_5440,MI13_7986,MI14_6383,MI15_6948
  89. PRO0_7666,PRO1_2465,TypeA,PRO2_6590,PRO5_9061,PRO8_7567,PRO9_3797,109,Agreement3,Agreement6,Condition1,MC11_7707,MC12_8318,MC14_9171,MI13_1727,MI14_8380,MI15_9535
  90. PRO0_7005,PRO1_1039,TypeB,PRO2_5244,PRO5_4454,PRO8_7167,PRO9_8207,129,Agreement2,Agreement6,Condition2,MC11_7220,MC12_9272,MC14_3221,MI13_4740,MI14_3701,MI15_1803
  91. PRO0_1788,PRO1_1132,TypeC,PRO2_4860,PRO5_7587,PRO8_7321,PRO9_3582,104,Agreement3,Agreement6,Condition3,MC11_2357,MC12_7398,MC14_4572,MI13_3634,MI14_7177,MI15_6038
  92. PRO0_9103,PRO1_9331,TypeA,PRO2_5307,PRO5_4242,PRO8_5884,PRO9_3791,78,Agreement3,Agreement5,Condition2,MC11_7198,MC12_8181,MC14_8304,MI13_5310,MI14_1869,MI15_3117
  93. PRO0_8429,PRO1_6161,TypeB,PRO2_7088,PRO5_2199,PRO8_9796,PRO9_7717,179,Agreement3,Agreement6,Condition2,MC11_3112,MC12_4436,MC14_1479,MI13_4120,MI14_6373,MI15_4325
  94. PRO0_3640,PRO1_2225,TypeB,PRO2_4542,PRO5_3451,PRO8_3038,PRO9_8232,172,Agreement3,Agreement4,Condition3,MC11_3335,MC12_7544,MC14_1195,MI13_2204,MI14_2474,MI15_4854
  95. PRO0_9825,PRO1_5317,TypeA,PRO2_8946,PRO5_9620,PRO8_7632,PRO9_4241,178,Agreement1,Agreement6,Condition3,MC11_8520,MC12_6437,MC14_3675,MI13_6655,MI14_7242,MI15_2745
  96. PRO0_9066,PRO1_8264,TypeA,PRO2_3894,PRO5_8481,PRO8_8164,PRO9_7627,198,Agreement2,Agreement6,Condition1,MC11_6442,MC12_9434,MC14_8531,MI13_9403,MI14_4040,MI15_7726
  97. PRO0_7238,PRO1_2119,TypeA,PRO2_5930,PRO5_4919,PRO8_2625,PRO9_1370,111,Agreement2,Agreement6,Condition3,MC11_9216,MC12_6053,MC14_5955,MI13_4736,MI14_8435,MI15_3695
  98. PRO0_5811,PRO1_2860,TypeC,PRO2_4667,PRO5_9042,PRO8_5713,PRO9_6956,167,Agreement3,Agreement6,Condition2,MC11_4373,MC12_3749,MC14_3226,MI13_4279,MI14_4947,MI15_6048
  99. PRO0_7533,PRO1_5663,TypeC,PRO2_8692,PRO5_1500,PRO8_4779,PRO9_5340,102,Agreement2,Agreement5,Condition1,MC11_4445,MC12_6907,MC14_4803,MI13_7785,MI14_1095,MI15_8641
  100. PRO0_4849,PRO1_6677,TypeC,PRO2_4515,PRO5_7001,PRO8_6283,PRO9_6331,166,Agreement2,Agreement5,Condition3,MC11_9033,MC12_7380,MC14_3984,MI13_3413,MI14_7667,MI15_5939
  101. PRO0_5230,PRO1_3539,TypeC,PRO2_6915,PRO5_8459,PRO8_5646,PRO9_9844,124,Agreement1,Agreement5,Condition3,MC11_8758,MC12_5253,MC14_6327,MI13_4337,MI14_5725,MI15_3585