tum 1 year ago
parent
commit
5d23f1954b

+ 66 - 0
app/core/filters.py

1
+import django_filters
2
+from .models import VMasterView, MgMasterView, BelMasterView, EMasterView
3
+
4
+class VMasterViewFilter(django_filters.FilterSet):
5
+    """
6
+    Filter class for VMasterView model.
7
+    """
8
+    # Define filters for fields
9
+    pro1 = django_filters.CharFilter(
10
+        field_name='PRO1', lookup_expr='icontains', label="Code"
11
+    )
12
+    pro2 = django_filters.CharFilter(
13
+        field_name='PRO2', lookup_expr='icontains', label="Lot No"
14
+    )
15
+
16
+    class Meta:
17
+        model = VMasterView
18
+        fields = ['pro1', 'pro2']  # Add other fields to filter as needed
19
+
20
+class MgMasterViewFilter(django_filters.FilterSet):
21
+    """
22
+    Filter class for VMasterView model.
23
+    """
24
+    # Define filters for fields
25
+    pro1 = django_filters.CharFilter(
26
+        field_name='PRO1', lookup_expr='icontains', label="Code"
27
+    )
28
+    pro2 = django_filters.CharFilter(
29
+        field_name='PRO2', lookup_expr='icontains', label="Lot No"
30
+    )
31
+
32
+    class Meta:
33
+        model = MgMasterView
34
+        fields = ['pro1', 'pro2']  # Add other fields to filter as needed
35
+
36
+class BelMasterViewFilter(django_filters.FilterSet):
37
+    """
38
+    Filter class for VMasterView model.
39
+    """
40
+    # Define filters for fields
41
+    pro1 = django_filters.CharFilter(
42
+        field_name='PRO1', lookup_expr='icontains', label="Code"
43
+    )
44
+    pro2 = django_filters.CharFilter(
45
+        field_name='PRO2', lookup_expr='icontains', label="Lot No"
46
+    )
47
+
48
+    class Meta:
49
+        model = BelMasterView
50
+        fields = ['pro1', 'pro2']  # Add other fields to filter as needed
51
+
52
+class EMasterViewFilter(django_filters.FilterSet):
53
+    """
54
+    Filter class for VMasterView model.
55
+    """
56
+    # Define filters for fields
57
+    pro1 = django_filters.CharFilter(
58
+        field_name='PRO1', lookup_expr='icontains', label="Code"
59
+    )
60
+    pro2 = django_filters.CharFilter(
61
+        field_name='PRO2', lookup_expr='icontains', label="Lot No"
62
+    )
63
+
64
+    class Meta:
65
+        model = EMasterView
66
+        fields = ['pro1', 'pro2']  # Add other fields to filter as needed

+ 13 - 0
app/core/utils.py

11
     DeleteView,
11
     DeleteView,
12
 )
12
 )
13
 from django.core.paginator import Paginator
13
 from django.core.paginator import Paginator
14
+from core.models import MgMasterView, VMasterView, BelMasterView, EMasterView
14
 
15
 
15
 class ConfigurableCRUDView:
16
 class ConfigurableCRUDView:
16
     model = None
17
     model = None
212
                 return context
213
                 return context
213
 
214
 
214
         return DeleteViewClass
215
         return DeleteViewClass
216
+
217
+def queryFromMaster(lot_no):
218
+    models = [MgMasterView, VMasterView, BelMasterView, EMasterView]
219
+    value_to_filter = lot_no
220
+
221
+    results = []
222
+
223
+    for model in models:
224
+        queryset = model.objects.filter(PRO2=value_to_filter)
225
+        results.extend(queryset)
226
+    return results
227
+

+ 26 - 1
app/legacy/urls.py

1
 from django.urls import path
1
 from django.urls import path
2
 from .views import DataListView, DataDetailView, DataCreateView, DataUpdateView, DataDeleteView,\
2
 from .views import DataListView, DataDetailView, DataCreateView, DataUpdateView, DataDeleteView,\
3
-DataMsCRUDView, TbFgPressInfoLotListCRUDView, LotSummaryCRUDView
3
+DataMsCRUDView, TbFgPressInfoLotListCRUDView, LotSummaryCRUDView, VMasterViewCRUDView, MgMasterViewCRUDView, BelMasterViewCRUDView, EMasterViewCRUDView
4
 
4
 
5
 app_name = 'legacy'  # Namespace for this app
5
 app_name = 'legacy'  # Namespace for this app
6
 
6
 
7
 datams_crud = DataMsCRUDView()
7
 datams_crud = DataMsCRUDView()
8
 fg_crud = TbFgPressInfoLotListCRUDView()
8
 fg_crud = TbFgPressInfoLotListCRUDView()
9
 ls_crud = LotSummaryCRUDView()
9
 ls_crud = LotSummaryCRUDView()
10
+vm_crud = VMasterViewCRUDView()
11
+mg_crud = MgMasterViewCRUDView()
12
+bel_crud = BelMasterViewCRUDView()
13
+em_crud = EMasterViewCRUDView()
10
 
14
 
11
 
15
 
12
 urlpatterns = [
16
 urlpatterns = [
30
     path('ls/create/', ls_crud.get_create_view().as_view(), name='ls-create'),
34
     path('ls/create/', ls_crud.get_create_view().as_view(), name='ls-create'),
31
     path('ls/<int:pk>/update/', ls_crud.get_update_view().as_view(), name='ls-update'),
35
     path('ls/<int:pk>/update/', ls_crud.get_update_view().as_view(), name='ls-update'),
32
     path('ls/<int:pk>/delete/', ls_crud.get_delete_view().as_view(), name='ls-delete'),
36
     path('ls/<int:pk>/delete/', ls_crud.get_delete_view().as_view(), name='ls-delete'),
37
+    path('vm/', vm_crud.get_list_view().as_view(), name='vm-list'),
38
+    path('vm/create/', vm_crud.get_create_view().as_view(), name='vm-create'),
39
+    path('vm/<int:pk>/update/', vm_crud.get_update_view().as_view(), name='vm-update'),
40
+    path('vm/<int:pk>/delete/', vm_crud.get_delete_view().as_view(), name='vm-delete'),
41
+
42
+    path('mg/', mg_crud.get_list_view().as_view(), name='mg-list'),
43
+    path('mg/create/', mg_crud.get_create_view().as_view(), name='mg-create'),
44
+    path('mg/<int:pk>/update/', mg_crud.get_update_view().as_view(), name='mg-update'),
45
+    path('mg/<int:pk>/delete/', mg_crud.get_delete_view().as_view(), name='mg-delete'),
46
+
47
+    path('bel/', bel_crud.get_list_view().as_view(), name='bel-list'),
48
+    path('bel/create/', bel_crud.get_create_view().as_view(), name='bel-create'),
49
+    path('bel/<int:pk>/update/', bel_crud.get_update_view().as_view(), name='bel-update'),
50
+    path('bel/<int:pk>/delete/', bel_crud.get_delete_view().as_view(), name='bel-delete'),
51
+
52
+    path('em/', em_crud.get_list_view().as_view(), name='em-list'),
53
+    path('em/create/', em_crud.get_create_view().as_view(), name='em-create'),
54
+    path('em/<int:pk>/update/', em_crud.get_update_view().as_view(), name='em-update'),
55
+    path('em/<int:pk>/delete/', em_crud.get_delete_view().as_view(), name='em-delete'),
56
+
57
+
33
 ]
58
 ]

+ 130 - 0
app/legacy/views.py

16
 from django.urls import reverse
16
 from django.urls import reverse
17
 from django.contrib import messages
17
 from django.contrib import messages
18
 from pprint import pprint
18
 from pprint import pprint
19
+from core.models import VMasterView, MgMasterView, BelMasterView, EMasterView
20
+from core.filters import VMasterViewFilter, MgMasterViewFilter, BelMasterViewFilter, EMasterViewFilter
19
 
21
 
20
 from core.utils import ConfigurableCRUDView
22
 from core.utils import ConfigurableCRUDView
21
 
23
 
170
     config_readonly_fields = ["lot_no"]
172
     config_readonly_fields = ["lot_no"]
171
     # config_edit_fields = ["lot_no", "code"]
173
     # config_edit_fields = ["lot_no", "code"]
172
     ordering = ["-created_at", "-id",]
174
     ordering = ["-created_at", "-id",]
175
+
176
+class VMasterViewCRUDView(ConfigurableCRUDView):
177
+    """
178
+    CRUD view for managing VMasterView objects.
179
+    """
180
+    model = VMasterView
181
+    list_template_name = 'legacy/datacrud_list.html'
182
+    detail_template_name = 'legacy/datacrud_detail.html'
183
+    form_template_name = 'legacy/datacrud_form.html'
184
+    confirm_delete_template_name = 'legacy/datacrud_confirm_delete.html'
185
+    filterset_class = VMasterViewFilter  # Replace with the appropriate filter class if needed
186
+
187
+    # Page title and URL mappings
188
+    page_title = "VMaster View"
189
+    list_url_name = 'legacy:vm-list'
190
+    create_url_name = 'legacy:vm-create'
191
+    update_url_name = 'legacy:vm-update'
192
+    delete_url_name = 'legacy:vm-delete'
193
+
194
+    # Configuration for fields
195
+    # config_fields = ["id", "code", "description", "created_at", "updated_at"]
196
+    # config_field_orders = ["id", "code", "description", "created_at", "updated_at"]
197
+    # config_readonly_fields = ["id", "created_at"]
198
+
199
+    # Default ordering
200
+    # ordering = ["-created_at", "-id"]
201
+
202
+class MgMasterViewCRUDView(ConfigurableCRUDView):
203
+    """
204
+    CRUD view for managing MgMasterView objects.
205
+    """
206
+    model = MgMasterView
207
+    list_template_name = 'legacy/datacrud_list.html'
208
+    detail_template_name = 'legacy/datacrud_detail.html'
209
+    form_template_name = 'legacy/datacrud_form.html'
210
+    confirm_delete_template_name = 'legacy/datacrud_confirm_delete.html'
211
+    filterset_class = MgMasterViewFilter  # Replace with the appropriate filter class if needed
212
+
213
+    # Page title and URL mappings
214
+    page_title = "MgMaster View"
215
+    list_url_name = 'legacy:mg-list'
216
+    create_url_name = 'legacy:mg-create'
217
+    update_url_name = 'legacy:mg-update'
218
+    delete_url_name = 'legacy:mg-delete'
219
+
220
+    # Configuration for fields
221
+    # config_fields = [
222
+        # "id", "PRO0", "PRO1", "PRO1C", "PRO2", "PRO5", 
223
+        # "PRO8", "PRO9", "PRO10", "PRO11", "PRO12"
224
+    # ]
225
+    # config_field_orders = [
226
+        # "id", "PRO0", "PRO1", "PRO1C", "PRO2", "PRO5", 
227
+        # "PRO8", "PRO9", "PRO10", "PRO11", "PRO12"
228
+    # ]
229
+    # config_readonly_fields = ["id"]
230
+
231
+    # Default ordering
232
+    # ordering = ["-id", "PRO2"]
233
+
234
+class BelMasterViewCRUDView(ConfigurableCRUDView):
235
+    """
236
+    CRUD view for managing BelMasterView objects.
237
+    """
238
+    model = BelMasterView
239
+    list_template_name = 'legacy/datacrud_list.html'
240
+    detail_template_name = 'legacy/datacrud_detail.html'
241
+    form_template_name = 'legacy/datacrud_form.html'
242
+    confirm_delete_template_name = 'legacy/datacrud_confirm_delete.html'
243
+    filterset_class = BelMasterViewFilter  # Replace with the appropriate filter class if needed
244
+
245
+    # Page title and URL mappings
246
+    page_title = "BelMaster View"
247
+    list_url_name = 'legacy:bel-list'
248
+    create_url_name = 'legacy:bel-create'
249
+    update_url_name = 'legacy:bel-update'
250
+    delete_url_name = 'legacy:bel-delete'
251
+
252
+    # Configuration for fields
253
+    # config_fields = [
254
+        # "id", "PRO0", "PRO1", "PRO1C", "PRO2", "PRO5",
255
+        # "PRO8", "PRO9", "PRO10", "PRO11", "PRO12", "MC11",
256
+        # "MC12", "MC14", "MC15", "MC16", "MC19", "MC20", "MC21"
257
+    # ]
258
+    # config_field_orders = [
259
+        # "id", "PRO0", "PRO1", "PRO1C", "PRO2", "PRO5",
260
+        # "PRO8", "PRO9", "PRO10", "PRO11", "PRO12", "MC11",
261
+        # "MC12", "MC14", "MC15", "MC16", "MC19", "MC20", "MC21"
262
+    # ]
263
+    # config_readonly_fields = ["id"]
264
+
265
+    # Default ordering
266
+    # ordering = ["-id", "PRO2"]
267
+
268
+class EMasterViewCRUDView(ConfigurableCRUDView):
269
+    """
270
+    CRUD view for managing EMasterView objects.
271
+    """
272
+    model = EMasterView
273
+    list_template_name = 'legacy/datacrud_list.html'
274
+    detail_template_name = 'legacy/datacrud_detail.html'
275
+    form_template_name = 'legacy/datacrud_form.html'
276
+    confirm_delete_template_name = 'legacy/datacrud_confirm_delete.html'
277
+    filterset_class = EMasterViewFilter  # Replace with the appropriate filter class
278
+
279
+    # Page title and URL mappings
280
+    page_title = "EMaster View"
281
+    list_url_name = 'legacy:em-list'
282
+    create_url_name = 'legacy:em-create'
283
+    update_url_name = 'legacy:em-update'
284
+    delete_url_name = 'legacy:em-delete'
285
+
286
+    # Configuration for fields
287
+    # config_fields = [
288
+        # "id", "PRO0", "PRO1", "PRO1C", "PRO2", "PRO5",
289
+        # "PRO8", "PRO9", "PRO10", "PRO11", "PRO12", "PRO13",
290
+        # "PRO14", "PRO15", "PRO16", "PRO17", "PRO18", "PRO21",
291
+        # "PRO25", "PRO27"
292
+    # ]
293
+    # config_field_orders = [
294
+        # "id", "PRO0", "PRO1", "PRO1C", "PRO2", "PRO5",
295
+        # "PRO8", "PRO9", "PRO10", "PRO11", "PRO12", "PRO13",
296
+        # "PRO14", "PRO15", "PRO16", "PRO17", "PRO18", "PRO21",
297
+        # "PRO25", "PRO27"
298
+    # ]
299
+    # config_readonly_fields = ["id"]
300
+
301
+    # Default ordering
302
+    # ordering = ["-id", "PRO2"]
173
     
303
     

+ 43 - 0
app/report/forms.py

1
+from django import forms
2
+
3
+class ExportOptionsForm(forms.Form):
4
+    size_dimension = forms.BooleanField(
5
+        required=False,
6
+        label="Size Dimension",
7
+        widget=forms.CheckboxInput(attrs={"class": "rounded"})
8
+    )
9
+    grade = forms.BooleanField(
10
+        required=False,
11
+        label="Grade",
12
+        widget=forms.CheckboxInput(attrs={"class": "rounded"})
13
+    )
14
+    wb = forms.BooleanField(
15
+        required=False,
16
+        label="WB",
17
+        widget=forms.CheckboxInput(attrs={"class": "rounded"})
18
+    )
19
+    fg_weight = forms.BooleanField(
20
+        required=False,
21
+        label="FG Weight",
22
+        widget=forms.CheckboxInput(attrs={"class": "rounded"})
23
+    )
24
+    centering = forms.BooleanField(
25
+        required=False,
26
+        label="Centering",
27
+        widget=forms.CheckboxInput(attrs={"class": "rounded"})
28
+    )
29
+    ring_test = forms.BooleanField(
30
+        required=False,
31
+        label="Ring Test",
32
+        widget=forms.CheckboxInput(attrs={"class": "rounded"})
33
+    )
34
+    rotate = forms.BooleanField(
35
+        required=False,
36
+        label="Rotate",
37
+        widget=forms.CheckboxInput(attrs={"class": "rounded"})
38
+    )
39
+    final_judge = forms.BooleanField(
40
+        required=False,
41
+        label="Final Judge",
42
+        widget=forms.CheckboxInput(attrs={"class": "rounded"})
43
+    )

+ 68 - 0
app/report/templates/report/coi.html

1
+{% extends 'base.html' %}
2
+{% load tailwind_filters %}
3
+{% block title %}Report Dashboard{% endblock %}
4
+
5
+{% block content %}
6
+<div class="container mx-auto px-4 py-8">
7
+
8
+  <h1 class="text-2xl font-bold text-gray-800">Export Center</h1>
9
+  <form method='post'>
10
+    {% csrf_token %}
11
+    <div class="flex items-center justify-between mb-4">
12
+      <h1 class="text-lg font-bold text-gray-800">TKX Certificate Issue</h1>
13
+      <button class="bg-gray-300 text-gray-700 px-4 py-2 rounded hover:bg-gray-400">
14
+        รายละเอียด CheckedBy|ApproveBy
15
+      </button>
16
+    </div>
17
+    <div class="flex items-center gap-2 mb-4">
18
+      <label for="lot-number" class="text-gray-700 font-medium">Lot No. :</label>
19
+      <input id="lot-number" type="text" class="border border-gray-300 rounded px-4 py-2 focus:outline-blue-500" placeholder="Enter Lot No." name='lot_no'>
20
+      <button class="bg-blue-500 text-white px-4 py-2 rounded hover:bg-blue-600" type="submit" name="search_lot">
21
+        🔍
22
+      </button>
23
+    </div>
24
+    <div class="flex items-center gap-4 mb-4">
25
+      <button class="bg-blue-100 text-blue-700 px-4 py-2 rounded hover:bg-blue-200">
26
+        Option for Export :
27
+      </button>
28
+      <div class="flex items-center space-x-2">
29
+        <label class="flex items-center space-x-1">
30
+          <input type="checkbox" class="rounded" name='exports' value='size_dimension'>
31
+          <span>Size Dimension</span>
32
+        </label>
33
+        <label class="flex items-center space-x-1">
34
+          <input type="checkbox" class="rounded" name='exports' value='grade'>
35
+          <span>Grade</span>
36
+        </label>
37
+        <label class="flex items-center space-x-1">
38
+          <input type="checkbox" class="rounded" name='exports' value='wb'>
39
+          <span>WB</span>
40
+        </label>
41
+        <label class="flex items-center space-x-1">
42
+          <input type="checkbox" class="rounded" name='exports' value='fg_weight'>
43
+          <span>FG Weight</span>
44
+        </label>
45
+        <label class="flex items-center space-x-1">
46
+          <input type="checkbox" class="rounded" name='exports' value='centering'>
47
+          <span>Centering</span>
48
+        </label>
49
+        <label class="flex items-center space-x-1">
50
+          <input type="checkbox" class="rounded" name='exports' value='ring_test'>
51
+          <span>Ring Test</span>
52
+        </label>
53
+        <label class="flex items-center space-x-1">
54
+          <input type="checkbox" class="rounded" name='exports' value='rotate'>
55
+          <span>Rotate</span>
56
+        </label>
57
+        <label class="flex items-center space-x-1">
58
+          <input type="checkbox" class="rounded" name='exports' value='final_judge'>
59
+          <span>Final Judge</span>
60
+        </label>
61
+      </div>
62
+      <button class="bg-blue-500 text-white px-4 py-2 rounded hover:bg-blue-600" type='submit' name='export'>
63
+        Export Excel
64
+      </button>
65
+    </div>
66
+  </form>
67
+</div>
68
+{% endblock %}

+ 43 - 0
app/report/templates/report/report_form.html

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

+ 1 - 0
app/report/urls.py

13
     path('report/create/', report_crud.get_create_view().as_view(), name='report-create'),
13
     path('report/create/', report_crud.get_create_view().as_view(), name='report-create'),
14
     path('report/<int:pk>/update/', report_crud.get_update_view().as_view(), name='report-update'),
14
     path('report/<int:pk>/update/', report_crud.get_update_view().as_view(), name='report-update'),
15
     path('report/<int:pk>/delete/', report_crud.get_delete_view().as_view(), name='report-delete'),
15
     path('report/<int:pk>/delete/', report_crud.get_delete_view().as_view(), name='report-delete'),
16
+    path('coi/', views.coi_view, name='coi-view'),
16
     # path('create/', views.create_report, name='create'),  # Create a new report
17
     # path('create/', views.create_report, name='create'),  # Create a new report
17
     # path('<int:pk>/', views.detail_report, name='detail'),  # View details of a specific report
18
     # path('<int:pk>/', views.detail_report, name='detail'),  # View details of a specific report
18
     # path('<int:pk>/update/', views.update_report, name='update'),  # Update a specific report
19
     # path('<int:pk>/update/', views.update_report, name='update'),  # Update a specific report

+ 14 - 5
app/report/views.py

5
 from core.forms import ReportForm
5
 from core.forms import ReportForm
6
 from core.utils import ConfigurableCRUDView
6
 from core.utils import ConfigurableCRUDView
7
 from .filters import ReportFilter
7
 from .filters import ReportFilter
8
-
9
-
8
+from .forms import ExportOptionsForm
9
+from pprint import pprint
10
 
10
 
11
 def index(request):
11
 def index(request):
12
     reports = Report.objects.all()
12
     reports = Report.objects.all()
40
     model = Report
40
     model = Report
41
     list_template_name = 'legacy/datacrud_list.html'
41
     list_template_name = 'legacy/datacrud_list.html'
42
     detail_template_name = 'legacy/datacrud_detail.html'
42
     detail_template_name = 'legacy/datacrud_detail.html'
43
-    form_template_name = 'legacy/datacrud_form.html'
43
+    form_template_name = 'report/report_form.html'
44
     confirm_delete_template_name = 'legacy/datacrud_confirm_delete.html'
44
     confirm_delete_template_name = 'legacy/datacrud_confirm_delete.html'
45
     filterset_class = ReportFilter
45
     filterset_class = ReportFilter
46
 
46
 
51
     create_url_name = 'report:report-create'
51
     create_url_name = 'report:report-create'
52
     update_url_name = 'report:report-update'
52
     update_url_name = 'report:report-update'
53
     delete_url_name = 'report:report-delete'
53
     delete_url_name = 'report:report-delete'
54
-    config_fields = ["name", "file", "created_by",] 
55
-    config_field_orders = ["id", "name", "created_by", "created_at"]
54
+    config_fields = ["name", "file", "created_by", "created_at"] 
55
+    config_field_orders = ["id", "name", "created_by"]
56
     # config_readonly_fields = ["lot_no"]
56
     # config_readonly_fields = ["lot_no"]
57
     # config_edit_fields = ["lot_no", "code"]
57
     # config_edit_fields = ["lot_no", "code"]
58
     ordering = ["-created_at", "-id",]
58
     ordering = ["-created_at", "-id",]
59
+
60
+def coi_view(request):
61
+    pprint(f"xxxx method = xxx {request.method}")
62
+    if request.method == "POST":
63
+        exports = request.POST.getlist("exports")  # Retrieve the list of selected values
64
+        pprint(f"Selected Export Options: {exports}")
65
+        messages.success(request, "Request Sent")
66
+        return redirect(request.path_info)
67
+    return render(request, 'report/coi.html')

+ 13 - 0
app/templates/base.html

63
         <div class="h-full px-3 pb-4 overflow-y-auto">
63
         <div class="h-full px-3 pb-4 overflow-y-auto">
64
             <ul class="space-y-2">
64
             <ul class="space-y-2">
65
                 <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>
65
                 <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>
66
+                <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>
66
                 <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>
67
                 <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>
67
                  <li>
68
                  <li>
68
                     <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">
69
                     <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">
89
                             <a href="{% url "legacy:ls-list" %}" class="flex items-center w-full p-2 text-gray-900 transition duration-75 rounded-lg pl-11 group hover:bg-gray-100 dark:text-white dark:hover:bg-gray-700">Lot Summary</a>
90
                             <a href="{% url "legacy:ls-list" %}" class="flex items-center w-full p-2 text-gray-900 transition duration-75 rounded-lg pl-11 group hover:bg-gray-100 dark:text-white dark:hover:bg-gray-700">Lot Summary</a>
90
                           </li>
91
                           </li>
91
                           <li>
92
                           <li>
93
+                            <a href="{% url "legacy:vm-list" %}" class="flex items-center w-full p-2 text-gray-900 transition duration-75 rounded-lg pl-11 group hover:bg-gray-100 dark:text-white dark:hover:bg-gray-700">VMaster</a>
94
+                          </li>
95
+                          <li>
96
+                            <a href="{% url "legacy:mg-list" %}" class="flex items-center w-full p-2 text-gray-900 transition duration-75 rounded-lg pl-11 group hover:bg-gray-100 dark:text-white dark:hover:bg-gray-700">MgMaster</a>
97
+                          </li>
98
+                          <li>
99
+                            <a href="{% url "legacy:bel-list" %}" class="flex items-center w-full p-2 text-gray-900 transition duration-75 rounded-lg pl-11 group hover:bg-gray-100 dark:text-white dark:hover:bg-gray-700">BelMaster</a>
100
+                          </li>
101
+                          <li>
102
+                            <a href="{% url "legacy:em-list" %}" class="flex items-center w-full p-2 text-gray-900 transition duration-75 rounded-lg pl-11 group hover:bg-gray-100 dark:text-white dark:hover:bg-gray-700">EMaster</a>
103
+                          </li>
104
+                          <li>
92
                              <a href="#" class="flex items-center w-full p-2 text-gray-900 transition duration-75 rounded-lg pl-11 group hover:bg-gray-100 dark:text-white dark:hover:bg-gray-700">Invoice</a>
105
                              <a href="#" class="flex items-center w-full p-2 text-gray-900 transition duration-75 rounded-lg pl-11 group hover:bg-gray-100 dark:text-white dark:hover:bg-gray-700">Invoice</a>
93
                           </li>
106
                           </li>
94
                     </ul>
107
                     </ul>