diff --git a/inventory_tools/hooks.py b/inventory_tools/hooks.py
index 1d0d119..457ab7c 100644
--- a/inventory_tools/hooks.py
+++ b/inventory_tools/hooks.py
@@ -51,6 +51,7 @@
"Stock Entry": "public/js/custom/stock_entry_custom.js",
"Work Order": "public/js/custom/work_order_custom.js",
"Workstation": "public/js/custom/workstation_custom.js",
+ "Plant Floor": "public/js/custom/plant_floor_custom.js",
}
# doctype_list_js = {"doctype" : "public/js/doctype_list.js"}
# doctype_tree_js = {"doctype" : "public/js/doctype_tree.js"}
diff --git a/inventory_tools/inventory_tools/custom/plant_floor.json b/inventory_tools/inventory_tools/custom/plant_floor.json
new file mode 100644
index 0000000..09ec2cb
--- /dev/null
+++ b/inventory_tools/inventory_tools/custom/plant_floor.json
@@ -0,0 +1,324 @@
+{
+ "custom_fields": [
+ {
+ "_assign": null,
+ "_comments": null,
+ "_liked_by": null,
+ "_user_tags": null,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "collapsible_depends_on": null,
+ "columns": 0,
+ "creation": "2024-07-04 15:38:09.698991",
+ "default": null,
+ "depends_on": null,
+ "description": null,
+ "docstatus": 0,
+ "dt": "Plant Floor",
+ "fetch_from": null,
+ "fetch_if_empty": 0,
+ "fieldname": "section_break_yy0ja",
+ "fieldtype": "Section Break",
+ "hidden": 0,
+ "hide_border": 0,
+ "hide_days": 0,
+ "hide_seconds": 0,
+ "idx": 8,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_global_search": 0,
+ "in_list_view": 0,
+ "in_preview": 0,
+ "in_standard_filter": 0,
+ "insert_after": "diagram",
+ "is_system_generated": 0,
+ "is_virtual": 0,
+ "label": "",
+ "length": 0,
+ "link_filters": null,
+ "mandatory_depends_on": null,
+ "modified": "2024-07-04 16:46:27.224882",
+ "modified_by": "Administrator",
+ "module": "Inventory Tools",
+ "name": "Plant Floor-section_break_yy0ja",
+ "no_copy": 0,
+ "non_negative": 0,
+ "options": null,
+ "owner": "Administrator",
+ "permlevel": 0,
+ "precision": "",
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "print_width": null,
+ "read_only": 0,
+ "read_only_depends_on": null,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "show_dashboard": 0,
+ "sort_options": 0,
+ "translatable": 0,
+ "unique": 0,
+ "width": null
+ },
+ {
+ "_assign": null,
+ "_comments": null,
+ "_liked_by": null,
+ "_user_tags": null,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "collapsible_depends_on": null,
+ "columns": 0,
+ "creation": "2024-07-04 16:45:52.906546",
+ "default": null,
+ "depends_on": null,
+ "description": null,
+ "docstatus": 0,
+ "dt": "Plant Floor",
+ "fetch_from": null,
+ "fetch_if_empty": 0,
+ "fieldname": "diagram",
+ "fieldtype": "JSON",
+ "hidden": 1,
+ "hide_border": 0,
+ "hide_days": 0,
+ "hide_seconds": 0,
+ "idx": 7,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_global_search": 0,
+ "in_list_view": 0,
+ "in_preview": 0,
+ "in_standard_filter": 0,
+ "insert_after": "floor_layout",
+ "is_system_generated": 0,
+ "is_virtual": 0,
+ "label": "",
+ "length": 0,
+ "link_filters": null,
+ "mandatory_depends_on": null,
+ "modified": "2024-07-04 16:46:27.219134",
+ "modified_by": "Administrator",
+ "module": "Inventory Tools",
+ "name": "Plant Floor-diagram",
+ "no_copy": 0,
+ "non_negative": 0,
+ "options": null,
+ "owner": "Administrator",
+ "permlevel": 0,
+ "precision": "",
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "print_width": null,
+ "read_only": 0,
+ "read_only_depends_on": null,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "show_dashboard": 0,
+ "sort_options": 0,
+ "translatable": 0,
+ "unique": 0,
+ "width": null
+ },
+ {
+ "_assign": null,
+ "_comments": null,
+ "_liked_by": null,
+ "_user_tags": null,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "collapsible_depends_on": null,
+ "columns": 0,
+ "creation": "2024-07-04 15:51:11.272444",
+ "default": null,
+ "depends_on": null,
+ "description": null,
+ "docstatus": 0,
+ "dt": "Plant Floor",
+ "fetch_from": null,
+ "fetch_if_empty": 0,
+ "fieldname": "plant_floor_layout",
+ "fieldtype": "Attach Image",
+ "hidden": 0,
+ "hide_border": 0,
+ "hide_days": 0,
+ "hide_seconds": 0,
+ "idx": 14,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_global_search": 0,
+ "in_list_view": 0,
+ "in_preview": 0,
+ "in_standard_filter": 0,
+ "insert_after": "warehouse",
+ "is_system_generated": 0,
+ "is_virtual": 0,
+ "label": "Plant Floor Layout",
+ "length": 0,
+ "link_filters": null,
+ "mandatory_depends_on": null,
+ "modified": "2024-07-04 15:51:50.272626",
+ "modified_by": "Administrator",
+ "module": "Inventory Tools",
+ "name": "Plant Floor-plant_floor_layout",
+ "no_copy": 0,
+ "non_negative": 0,
+ "options": null,
+ "owner": "Administrator",
+ "permlevel": 0,
+ "precision": "",
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "print_width": null,
+ "read_only": 0,
+ "read_only_depends_on": null,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "show_dashboard": 0,
+ "sort_options": 0,
+ "translatable": 0,
+ "unique": 0,
+ "width": null
+ },
+ {
+ "_assign": null,
+ "_comments": null,
+ "_liked_by": null,
+ "_user_tags": null,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "collapsible_depends_on": null,
+ "columns": 0,
+ "creation": "2024-07-04 15:51:11.180943",
+ "default": null,
+ "depends_on": null,
+ "description": null,
+ "docstatus": 0,
+ "dt": "Plant Floor",
+ "fetch_from": null,
+ "fetch_if_empty": 0,
+ "fieldname": "column_break_qdykt",
+ "fieldtype": "Column Break",
+ "hidden": 0,
+ "hide_border": 0,
+ "hide_days": 0,
+ "hide_seconds": 0,
+ "idx": 12,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_global_search": 0,
+ "in_list_view": 0,
+ "in_preview": 0,
+ "in_standard_filter": 0,
+ "insert_after": "company",
+ "is_system_generated": 0,
+ "is_virtual": 0,
+ "label": "",
+ "length": 0,
+ "link_filters": null,
+ "mandatory_depends_on": null,
+ "modified": "2024-07-04 15:51:41.140452",
+ "modified_by": "Administrator",
+ "module": "Inventory Tools",
+ "name": "Plant Floor-column_break_qdykt",
+ "no_copy": 0,
+ "non_negative": 0,
+ "options": null,
+ "owner": "Administrator",
+ "permlevel": 0,
+ "precision": "",
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "print_width": null,
+ "read_only": 0,
+ "read_only_depends_on": null,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "show_dashboard": 0,
+ "sort_options": 0,
+ "translatable": 0,
+ "unique": 0,
+ "width": null
+ },
+ {
+ "_assign": null,
+ "_comments": null,
+ "_liked_by": null,
+ "_user_tags": null,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "collapsible_depends_on": null,
+ "columns": 0,
+ "creation": "2024-07-04 15:38:09.606160",
+ "default": null,
+ "depends_on": null,
+ "description": null,
+ "docstatus": 0,
+ "dt": "Plant Floor",
+ "fetch_from": null,
+ "fetch_if_empty": 0,
+ "fieldname": "floor_layout",
+ "fieldtype": "HTML",
+ "hidden": 0,
+ "hide_border": 0,
+ "hide_days": 0,
+ "hide_seconds": 0,
+ "idx": 6,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_global_search": 0,
+ "in_list_view": 0,
+ "in_preview": 0,
+ "in_standard_filter": 0,
+ "insert_after": "details_tab",
+ "is_system_generated": 0,
+ "is_virtual": 0,
+ "label": "",
+ "length": 0,
+ "link_filters": null,
+ "mandatory_depends_on": null,
+ "modified": "2024-07-04 15:38:49.339415",
+ "modified_by": "Administrator",
+ "module": "Inventory Tools",
+ "name": "Plant Floor-floor_layout",
+ "no_copy": 0,
+ "non_negative": 0,
+ "options": null,
+ "owner": "Administrator",
+ "permlevel": 0,
+ "precision": "",
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "print_width": null,
+ "read_only": 0,
+ "read_only_depends_on": null,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "show_dashboard": 0,
+ "sort_options": 0,
+ "translatable": 0,
+ "unique": 0,
+ "width": null
+ }
+ ],
+ "custom_perms": [],
+ "doctype": "Plant Floor",
+ "links": [],
+ "property_setters": [],
+ "sync_on_migrate": 1
+}
diff --git a/inventory_tools/public/js/custom/plant_floor_custom.js b/inventory_tools/public/js/custom/plant_floor_custom.js
new file mode 100644
index 0000000..07eb6f8
--- /dev/null
+++ b/inventory_tools/public/js/custom/plant_floor_custom.js
@@ -0,0 +1,8 @@
+frappe.ui.form.on('Plant Floor', {
+ onload_post_render: frm => {
+ inventory_tools.mount(frm)
+ },
+ refresh: frm => {
+ frm.page.wrapper.find('.layout-side-section').hide()
+ },
+})
diff --git a/inventory_tools/public/js/inventory_tools.js b/inventory_tools/public/js/inventory_tools.js
new file mode 100644
index 0000000..f527c67
--- /dev/null
+++ b/inventory_tools/public/js/inventory_tools.js
@@ -0,0 +1,10 @@
+import PlantFloor from './plant_floor/PlantFloor.vue'
+import { createApp } from 'vue'
+
+frappe.provide('inventory_tools')
+
+inventory_tools.mount = frm => {
+ $(frm.fields_dict['floor_layout'].wrapper).html($("
").get(0))
+ frm.plant_floor_layout = createApp(PlantFloor)
+ frm.plant_floor_layout.mount('#plant-floor-layout')
+}
diff --git a/inventory_tools/public/js/plant_floor/PlantFloor.vue b/inventory_tools/public/js/plant_floor/PlantFloor.vue
new file mode 100644
index 0000000..5580318
--- /dev/null
+++ b/inventory_tools/public/js/plant_floor/PlantFloor.vue
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+
diff --git a/inventory_tools/public/js/vite.config.js b/inventory_tools/public/js/vite.config.js
index ad94684..5f979d1 100644
--- a/inventory_tools/public/js/vite.config.js
+++ b/inventory_tools/public/js/vite.config.js
@@ -10,12 +10,13 @@ export default defineConfig({
plugins: [vue()],
build: {
lib: {
- entry: path.resolve(__dirname, './faceted_search/faceted_search.js'),
- name: 'inventory_tools',
+ entry: path.resolve(__dirname, './inventory_tools.js'),
+ name: 'check_run',
fileName: format => `inventory_tools.js`, // creates module only output
},
outDir: './inventory_tools/public/dist/js',
- target: 'esnext',
+ root: './',
+ target: 'es2015',
emptyOutDir: false,
minify: false,
},
diff --git a/inventory_tools/tests/conftest.py b/inventory_tools/tests/conftest.py
index 0dadb82..0145fc1 100644
--- a/inventory_tools/tests/conftest.py
+++ b/inventory_tools/tests/conftest.py
@@ -1,45 +1,45 @@
-# Copyright (c) 2024, AgriTheory and contributors
-# For license information, please see license.txt
-
-import json
-from pathlib import Path
-from unittest.mock import MagicMock
-
-import frappe
-import pytest
-from frappe.utils import get_bench_path
-
-
-def _get_logger(*args, **kwargs):
- from frappe.utils.logger import get_logger
-
- return get_logger(
- module=None,
- with_more_info=False,
- allow_site=True,
- filter=None,
- max_size=100_000,
- file_count=20,
- stream_only=True,
- )
-
-
-@pytest.fixture(scope="module")
-def monkeymodule():
- with pytest.MonkeyPatch.context() as mp:
- yield mp
-
-
-@pytest.fixture(scope="session", autouse=True)
-def db_instance():
- frappe.logger = _get_logger
-
- currentsite = "test_site"
- sites = Path(get_bench_path()) / "sites"
- if (sites / "common_site_config.json").is_file():
- currentsite = json.loads((sites / "common_site_config.json").read_text()).get("default_site")
-
- frappe.init(site=currentsite, sites_path=sites)
- frappe.connect()
- frappe.db.commit = MagicMock()
- yield frappe.db
+# Copyright (c) 2024, AgriTheory and contributors
+# For license information, please see license.txt
+
+import json
+from pathlib import Path
+from unittest.mock import MagicMock
+
+import frappe
+import pytest
+from frappe.utils import get_bench_path
+
+
+def _get_logger(*args, **kwargs):
+ from frappe.utils.logger import get_logger
+
+ return get_logger(
+ module=None,
+ with_more_info=False,
+ allow_site=True,
+ filter=None,
+ max_size=100_000,
+ file_count=20,
+ stream_only=True,
+ )
+
+
+@pytest.fixture(scope="module")
+def monkeymodule():
+ with pytest.MonkeyPatch.context() as mp:
+ yield mp
+
+
+@pytest.fixture(scope="session", autouse=True)
+def db_instance():
+ frappe.logger = _get_logger
+
+ currentsite = "test_site"
+ sites = Path(get_bench_path()) / "sites"
+ if (sites / "common_site_config.json").is_file():
+ currentsite = json.loads((sites / "common_site_config.json").read_text()).get("default_site")
+
+ frappe.init(site=currentsite, sites_path=sites)
+ frappe.connect()
+ frappe.db.commit = MagicMock()
+ yield frappe.db
diff --git a/inventory_tools/tests/fixtures.py b/inventory_tools/tests/fixtures.py
index 8d4f7da..ffc2a4e 100644
--- a/inventory_tools/tests/fixtures.py
+++ b/inventory_tools/tests/fixtures.py
@@ -1,1180 +1,1180 @@
-# Copyright (c) 2024, AgriTheory and contributors
-# For license information, please see license.txt
-
-suppliers = [
- (
- "Freedom Provisions",
- None,
- None,
- None,
- "Net 30",
- {
- "address_line1": "16 Margrave",
- "city": "Carlisle",
- "state": "NH",
- "country": "United States",
- "pincode": "57173",
- },
- ),
- (
- "Unity Bakery Supply",
- None,
- None,
- None,
- "Net 30",
- {
- "address_line1": "34 Pinar St",
- "city": "Unity",
- "state": "RI",
- "country": "United States",
- "pincode": "34291",
- },
- ),
- (
- "Chelsea Fruit Co",
- None,
- None,
- None,
- "Net 30",
- {
- "address_line1": "67C Sweeny Street",
- "city": "Chelsea",
- "state": "MA",
- "country": "United States",
- "pincode": "89077",
- },
- ),
- (
- "Credible Contract Baking",
- None,
- None,
- None,
- "Net 30",
- {
- "address_line1": "4 Crumb Circle",
- "city": "Belmont",
- "state": "MA",
- "country": "United States",
- "pincode": "89074",
- },
- ),
- (
- "Southern Fruit Supply",
- None,
- None,
- None,
- "Net 30",
- {
- "address_line1": "10001 Pineapple Way",
- "city": "Largo",
- "state": "TX",
- "country": "United States",
- "pincode": "89574",
- },
- ),
-]
-
-workstations = [
- ("Mix Pie Crust Station", "20"),
- ("Roll Pie Crust Station", "20"),
- ("Make Pie Filling Station", "20"),
- ("Cooling Station", "100"),
- ("Box Pie Station", "100"),
- ("Baking Station", "20"),
- ("Assemble Pie Station", "20"),
- ("Mix Pie Filling Station", "20"),
- ("Packaging Station", "2"),
- ("Food Prep Table 2", "10"),
- ("Food Prep Table 1", "5"),
- ("Range Station", "20"),
- ("Cooling Racks Station", "80"),
- ("Refrigerator Station", "200"),
- ("Oven Station", "20"),
- ("Mixer Station", "10"),
-]
-
-operations = [
- (
- "Gather Pie Crust Ingredients",
- "Food Prep Table 2",
- "5",
- """- Remove flour, salt, and a pie tins from store room
- - Remove butter and ice water from refrigerator
- - Place ingredients at workstation
- - Measure amounts for batch size into mixing bowl""",
- ["Food Prep Table 1"],
- ),
- (
- "Gather Pie Filling Ingredients",
- "Food Prep Table 1",
- "5",
- """- Remove fruit and butter from refrigerator
- - Remove sugar and cornstarch
- - Get water from sink
- - Measure ingredients and place in pot, excluding 1/4 of fruit and butter""",
- ["Food Prep Table 2"],
- ),
- (
- "Assemble Pie Op",
- "Food Prep Table 2",
- "5",
- """- Use fresh pie filling or remove from refrigerator
- - Remove rolled pie crusts from refrigerator
- - Fill bottom crust with filling
- - Create decorative cut out for top crust
- - Layer top crust over bottom crust / filling and create a crimped seal""",
- ["Food Prep Table 1", "Assemble Pie Station"],
- ),
- (
- "Cook Pie Filling Operation",
- "Range Station",
- "5",
- """- Bring ingredients to simmer and cook for 15 minutes
- - Remove from heat and mix in remaining 1/4 berries and butter
- - Store in refrigerator if not using immediately""",
- ),
- (
- "Mix Dough Op",
- "Mixer Station",
- "5",
- """- Combine flour, butter, salt, and ice water in mixer
- - Pulse for 30 seconds
- - Divide into equal-sized portions, one portion for each pie crust being made
- - Put in refrigerator""",
- ["Mix Pie Crust Station", "Mix Pie Filling Station"],
- ),
- ("Box Pie Op", "Packaging Station", "5", "- Place pie into box for sale"),
- (
- "Roll Pie Crust Op",
- "Food Prep Table 2",
- "5",
- """- Remove chilled pie crust portions from refrigerator
- - Separate each portion into two (one for bottom crust, one for top)
- - Flour board and roll out each portion into a circle
- - Place bottom crust into pie tin, then layer a piece of parchment paper, followed by the top crust""",
- ["Food Prep Table 1", "Roll Pie Crust Station"],
- ),
- ("Divide Dough Op", "Food Prep Table 2", "1", "Divide Dough Op", ["Food Prep Table 1"]),
- (
- "Bake Op",
- "Oven Station",
- "1",
- """- Place assembled pies into oven
- - Bake at 375F for 50 minutes
- - Remove from oven""",
- ["Baking Station"],
- ),
- (
- "Chill Pie Crust Op",
- "Refrigerator Station",
- "1",
- "- Chill pie crust for at least 30 minutes",
- ["Cooling Station", "Cooling Racks Station"],
- ),
- (
- "Cool Pie Op",
- "Cooling Racks Station",
- "1",
- "Cool baked pies for at least 30 minutes before boxing",
- ["Cooling Station", "Refrigerator Station"],
- ),
- (
- "Assemble Pocket Op",
- "Food Prep Table 1",
- "5",
- """- Fold 3 poppers into dough pocket""",
- ),
- (
- "Assemble Popper Op",
- "Food Prep Table 1",
- "5",
- """- Top dough bite with fruit""",
- ),
- (
- "Assemble Combination Product",
- "Food Prep Table 1",
- "5",
- """- Tower: package one pie and one pocket, and one popper
- - Pocketful of Bay: package one pocket with two poppers""",
- ),
-]
-
-items = [
- {
- "item_code": "Ambrosia Pie",
- "item_group": "Baked Goods",
- "uom": "Nos",
- "weight_per_unit": 7.5,
- "weight_uom": "Pound",
- "item_price": 11.00,
- "default_warehouse": "Refrigerated Display - APC",
- "description": "Ambrosia Pie is the marquee product of Ambrosia Pie Company. A filling of heavenly cloudberries pair perfectly with the tart hairless rambutan, finished with drizzles of tayberry nectar. It's a feast fit for Mt Olympus!
",
- },
- {
- "item_code": "Double Plum Pie",
- "uom": "Nos",
- "weight_per_unit": 8,
- "weight_uom": "Pound",
- "item_group": "Baked Goods",
- "item_price": 10.50,
- "default_warehouse": "Refrigerated Display - APC",
- "description": "Double the fun and double the flavor with our Double Plum Pie! We combine damson and cocoplums in a daring tropical-meets-temperate filling. Forbidden fruit never tasted this good.
",
- },
- {
- "item_code": "Gooseberry Pie",
- "uom": "Nos",
- "weight_per_unit": 8.5,
- "weight_uom": "Pound",
- "item_group": "Baked Goods",
- "item_price": 12.00,
- "default_warehouse": "Refrigerated Display - APC",
- "description": "Our delicious take on the traditional gooseberry pie that tastes like the holidays. This classic pie is best shared with the ones you love.
",
- },
- {
- "item_code": "Kaduka Key Lime Pie",
- "item_group": "Baked Goods",
- "uom": "Nos",
- "weight_per_unit": 9,
- "weight_uom": "Pound",
- "item_price": 11.50,
- "default_warehouse": "Refrigerated Display - APC",
- "description": "Take your tastebuds on an adventure with this whimsical twist on the classic Key Lime pie. Made with kaduka limes and the exotic limequat, this seasonal pie is sure to satisfy even the most weary culinary explorer. Grab it when you can - it's only available April through September.
",
- },
- {
- "item_code": "Tower of Bay-bel",
- "uom": "Nos",
- "item_group": "Baked Goods",
- "item_price": 20.00,
- "default_warehouse": "Refrigerated Display - APC",
- "description": "Reach for the stars with this epic all-things-bayberry dessert that stacks a Bayberry Pocket on top of our Bayberry Pie.
",
- },
- {
- "item_code": "Pocketful of Bay",
- "uom": "Nos",
- "item_group": "Baked Goods",
- "item_price": 12.00,
- "default_warehouse": "Refrigerated Display - APC",
- "description": "Try this delightful combination of a Bayberry Pocket and two additional Bayberry Poppers.
",
- },
- {
- "item_code": "Bayberry Pie",
- "uom": "Nos",
- "item_group": "Sub Assemblies",
- # "item_price": 11.00, # can a finished good be included as sub-assembly for another good?
- "default_warehouse": "Refrigerated Display - APC",
- "description": "This pie features the sweet and scrumptious bayberry and is sure to be a crowd-pleaser.
",
- },
- {
- "item_code": "Bayberry Pocket",
- "uom": "Nos",
- "item_group": "Sub Assemblies",
- # "item_price": 8.00,
- "default_warehouse": "Refrigerated Display - APC",
- "description": "Need a little more than one popper? The Bayberry Pocket is a tasty dough pocket stuffed with several Bayberry Poppers.
",
- },
- {
- "item_code": "Bayberry Popper",
- "uom": "Nos",
- "item_group": "Sub Assemblies",
- # "item_price": 3.00,
- "default_warehouse": "Refrigerated Display - APC",
- "description": "Part cookie, part tart, these bite-sized treats will bring a little sweetness to your day.
",
- },
- {
- "item_code": "Ambrosia Pie Filling",
- "uom": "Cup",
- "item_group": "Sub Assemblies",
- "default_warehouse": "Refrigerator - APC",
- "description": "Ambrosia Pie Filling",
- },
- {
- "item_code": "Double Plum Pie Filling",
- "uom": "Cup",
- "item_group": "Sub Assemblies",
- "default_warehouse": "Refrigerator - APC",
- "description": "Double Plum Pie Filling",
- },
- {
- "item_code": "Gooseberry Pie Filling",
- "uom": "Cup",
- "description": "Gooseberry Pie Filling",
- "item_group": "Sub Assemblies",
- "default_warehouse": "Refrigerator - APC",
- },
- {
- "item_code": "Bayberry Pie Filling",
- "uom": "Cup",
- "description": "Bayberry Pie Filling",
- "item_group": "Sub Assemblies",
- "default_warehouse": "Refrigerator - APC",
- },
- {
- "item_code": "Kaduka Key Lime Pie Filling",
- "item_group": "Sub Assemblies",
- "default_warehouse": "Refrigerator - APC",
- "uom": "Cup",
- "description": "Kaduka Key Lime Pie Filling",
- },
- {
- "item_code": "Pie Crust",
- "uom": "Nos",
- "description": "Pie Crust",
- "item_group": "Sub Assemblies",
- "default_warehouse": "Refrigerator - APC",
- "is_sub_contracted_item": 1,
- "item_price": 2.00,
- "default_supplier": "",
- "supplier": "",
- "valuation_rate": 3.0196,
- "uom_conversion_detail": {"Hour": 20},
- },
- {
- "item_code": "Pie Crust Service per Crust",
- "uom": "Nos",
- "description": "Subcontracted pie crust manufacturing service. Item price is per crust.",
- "item_group": "Sub Assemblies",
- "default_warehouse": "Credible Contract Baking - APC",
- "is_sub_contracted_item": 1,
- "is_stock_item": 0,
- "item_price": 2.00,
- "default_supplier": "Credible Contract Baking",
- "supplier": "Credible Contract Baking",
- },
- {
- "item_code": "Pie Crust Service per Hour",
- "uom": "Hour",
- "description": "Subcontracted pie crust manufacturing service. Item price is per hour.",
- "item_group": "Sub Assemblies",
- "default_warehouse": "Credible Contract Baking - APC",
- "is_sub_contracted_item": 1,
- "is_stock_item": 0,
- "item_price": 40.00, # Assumes 5 crusts takes 15 mins (excluding chilling time), or 20 crusts/hour at rate of $2.00/crust
- "default_supplier": "Credible Contract Baking",
- "supplier": "Credible Contract Baking",
- },
- {
- "item_code": "Cloudberry",
- "uom": "Pound",
- "weight_uom": "Pound",
- "weight_per_unit": 1,
- "description": "Cloudberry",
- "item_group": "Ingredients",
- "item_price": 0.65,
- "default_warehouse": "Refrigerator - APC",
- "supplier": ["Chelsea Fruit Co", "Southern Fruit Supply"],
- },
- {
- "item_code": "Cocoplum",
- "uom": "Pound",
- "weight_uom": "Pound",
- "weight_per_unit": 1,
- "description": "Cocoplum",
- "item_group": "Ingredients",
- "item_price": 0.35,
- "default_warehouse": "Refrigerator - APC",
- "supplier": ["Chelsea Fruit Co", "Southern Fruit Supply"],
- },
- {
- "item_code": "Damson Plum",
- "uom": "Pound",
- "weight_uom": "Pound",
- "weight_per_unit": 1,
- "description": "Damson Plum",
- "item_group": "Ingredients",
- "item_price": 0.85,
- "default_warehouse": "Refrigerator - APC",
- "supplier": ["Chelsea Fruit Co", "Southern Fruit Supply"],
- },
- {
- "item_code": "Gooseberry",
- "uom": "Pound",
- "weight_uom": "Pound",
- "weight_per_unit": 1,
- "description": "Gooseberry",
- "item_group": "Ingredients",
- "item_price": 0.99,
- "default_warehouse": "Refrigerator - APC",
- "supplier": ["Chelsea Fruit Co", "Southern Fruit Supply"],
- },
- {
- "item_code": "Hairless Rambutan",
- "uom": "Pound",
- "weight_uom": "Pound",
- "weight_per_unit": 1,
- "description": "Hairless Rambutan",
- "item_price": 0.50,
- "item_group": "Ingredients",
- "default_warehouse": "Storeroom - APC",
- "supplier": ["Chelsea Fruit Co", "Southern Fruit Supply"],
- },
- {
- "item_code": "Kaduka Lime",
- "uom": "Pound",
- "weight_uom": "Pound",
- "weight_per_unit": 1,
- "description": "Kaduka Lime",
- "item_group": "Ingredients",
- "item_price": 0.89,
- "default_warehouse": "Refrigerator - APC",
- "supplier": ["Chelsea Fruit Co", "Southern Fruit Supply"],
- },
- {
- "item_code": "Limequat",
- "uom": "Pound",
- "weight_uom": "Pound",
- "weight_per_unit": 1,
- "description": "Limequat",
- "item_group": "Ingredients",
- "item_price": 0.75,
- "default_warehouse": "Refrigerator - APC",
- "supplier": ["Chelsea Fruit Co", "Southern Fruit Supply"],
- },
- {
- "item_code": "Tayberry",
- "uom": "Pound",
- "weight_uom": "Pound",
- "weight_per_unit": 1,
- "description": "Tayberry",
- "item_group": "Ingredients",
- "item_price": 0.85,
- "default_warehouse": "Refrigerator - APC",
- "supplier": ["Chelsea Fruit Co", "Southern Fruit Supply"],
- },
- {
- "item_code": "Bayberry",
- "uom": "Pound",
- "weight_uom": "Pound",
- "weight_per_unit": 1,
- "description": "Bayberry",
- "item_group": "Ingredients",
- "item_price": 0.45,
- "default_warehouse": "Refrigerator - APC",
- "supplier": ["Chelsea Fruit Co", "Southern Fruit Supply"],
- },
- {
- "item_code": "Butter",
- "uom": "Pound",
- "weight_uom": "Pound",
- "weight_per_unit": 1,
- "description": "Butter",
- "item_group": "Ingredients",
- "item_price": 4.5,
- "default_warehouse": "Refrigerator - APC",
- "supplier": [
- "Freedom Provisions",
- "Chelsea Fruit Co",
- ],
- },
- {
- "item_code": "Cornstarch",
- "uom": "Pound",
- "weight_uom": "Pound",
- "weight_per_unit": 1,
- "description": "Cornstarch",
- "item_group": "Ingredients",
- "item_price": 0.52,
- "default_warehouse": "Storeroom - APC",
- "supplier": "Freedom Provisions",
- },
- {
- "item_code": "Ice Water",
- "uom": "Cup",
- "weight_uom": "Pound",
- "weight_per_unit": 0.52,
- "description": "Ice Water - necessary for pie crusts",
- "item_group": "Ingredients",
- "item_price": 0.01,
- "default_warehouse": "Refrigerator - APC",
- "available_in_house": 1,
- "opening_qty": 50,
- },
- {
- "item_code": "Flour",
- "uom": "Pound",
- "weight_uom": "Pound",
- "weight_per_unit": 1,
- "description": "Flour",
- "item_group": "Ingredients",
- "item_price": 0.66,
- "default_warehouse": "Storeroom - APC",
- "supplier": "Freedom Provisions",
- },
- {
- "item_code": "Pie Box",
- "uom": "Nos",
- "description": "Pie Box",
- "item_group": "Bakery Supplies",
- "item_price": 0.4,
- "default_warehouse": "Storeroom - APC",
- "supplier": ["Freedom Provisions", "Unity Bakery Supply"],
- },
- {
- "item_code": "Pie Tin",
- "uom": "Nos",
- "description": "Pie Tin",
- "item_price": 0.18,
- "item_group": "Bakery Supplies",
- "default_warehouse": "Storeroom - APC",
- "supplier": ["Freedom Provisions", "Unity Bakery Supply"],
- },
- {
- "item_code": "Parchment Paper",
- "uom": "Nos",
- "description": "Parchment Paper",
- "item_group": "Bakery Supplies",
- "item_price": 0.02,
- "default_warehouse": "Storeroom - APC",
- "supplier": ["Freedom Provisions", "Unity Bakery Supply"],
- "uom_conversion_detail": {"Box": 100},
- },
- {
- "item_code": "Salt",
- "uom": "Pound",
- "weight_uom": "Pound",
- "weight_per_unit": 1,
- "description": "Salt",
- "item_group": "Ingredients",
- "item_price": 0.36,
- "default_warehouse": "Storeroom - APC",
- "supplier": "Freedom Provisions",
- },
- {
- "item_code": "Sugar",
- "uom": "Pound",
- "weight_uom": "Pound",
- "weight_per_unit": 1,
- "description": "Sugar",
- "item_group": "Ingredients",
- "item_price": 0.60,
- "default_warehouse": "Storeroom - APC",
- "supplier": "Freedom Provisions",
- },
- {
- "item_code": "Water",
- "uom": "Cup",
- "weight_uom": "Pound",
- "weight_per_unit": 0.52,
- "item_price": 0.05,
- "description": "Water",
- "item_group": "Ingredients",
- "default_warehouse": "Kitchen - APC",
- "available_in_house": 1,
- "opening_qty": 50,
- },
-]
-
-boms = [
- {
- "item": "Tower of Bay-bel",
- "quantity": 5.0,
- "uom": "Nos",
- "items": [
- {"item_code": "Bayberry Pie", "qty": 5.0, "qty_consumed_per_unit": 1.0, "uom": "Nos"},
- {"item_code": "Bayberry Pocket", "qty": 5.0, "qty_consumed_per_unit": 1.0, "uom": "Nos"},
- ],
- "operations": [
- {
- "batch_size": 5,
- "operation": "Assemble Combination Product",
- "time_in_mins": 2.0,
- "workstation": "Food Prep Table 1",
- },
- ],
- },
- {
- "item": "Pocketful of Bay",
- "quantity": 5.0,
- "uom": "Nos",
- "items": [
- {"item_code": "Bayberry Pocket", "qty": 5.0, "qty_consumed_per_unit": 1.0, "uom": "Nos"},
- {"item_code": "Bayberry Popper", "qty": 10.0, "qty_consumed_per_unit": 2.0, "uom": "Nos"},
- {"item_code": "Pie Box", "qty": 5.0, "qty_consumed_per_unit": 1.0, "uom": "Nos"},
- ],
- "operations": [
- {
- "batch_size": 5,
- "operation": "Assemble Combination Product",
- "time_in_mins": 2.0,
- "workstation": "Food Prep Table 1",
- },
- ],
- },
- {
- "item": "Bayberry Pocket",
- "quantity": 5.0,
- "uom": "Nos",
- "items": [
- {"item_code": "Flour", "qty": 1.5, "qty_consumed_per_unit": 0.3, "uom": "Pound"},
- {"item_code": "Butter", "qty": 0.75, "qty_consumed_per_unit": 0.15, "uom": "Pound"},
- {"item_code": "Sugar", "qty": 0.1, "qty_consumed_per_unit": 0.02, "uom": "Pound"},
- {"item_code": "Bayberry Popper", "qty": 15.0, "qty_consumed_per_unit": 3.0, "uom": "Nos"},
- ],
- "operations": [
- {
- "batch_size": 5,
- "operation": "Mix Dough Op",
- "time_in_mins": 5.0,
- "workstation": "Mixer Station",
- },
- {
- "batch_size": 5,
- "operation": "Assemble Pocket Op",
- "time_in_mins": 2.0,
- "workstation": "Food Prep Table 1",
- },
- ],
- },
- {
- "item": "Bayberry Popper",
- "quantity": 5.0,
- "uom": "Nos",
- "items": [
- {"item_code": "Flour", "qty": 0.5, "qty_consumed_per_unit": 0.1, "uom": "Pound"},
- {"item_code": "Butter", "qty": 0.25, "qty_consumed_per_unit": 0.05, "uom": "Pound"},
- {"item_code": "Sugar", "qty": 0.05, "qty_consumed_per_unit": 0.01, "uom": "Pound"},
- {"item_code": "Bayberry", "qty": 1.0, "qty_consumed_per_unit": 0.2, "uom": "Pound"},
- ],
- "operations": [
- {
- "batch_size": 5,
- "operation": "Mix Dough Op",
- "time_in_mins": 5.0,
- "workstation": "Mixer Station",
- },
- {
- "batch_size": 5,
- "operation": "Assemble Popper Op",
- "time_in_mins": 1.0,
- "workstation": "Food Prep Table 1",
- },
- ],
- },
- {
- "item": "Bayberry Pie",
- "quantity": 5.0,
- "uom": "Nos",
- "items": [
- {"item_code": "Pie Crust", "qty": 5.0, "qty_consumed_per_unit": 1.0, "uom": "Nos"},
- {
- "item_code": "Bayberry Pie Filling",
- "qty": 20.0,
- "qty_consumed_per_unit": 4.0,
- "uom": "Cup",
- },
- {"item_code": "Pie Box", "qty": 5.0, "qty_consumed_per_unit": 1.0, "uom": "Nos"},
- ],
- "operations": [
- {
- "batch_size": 5,
- "operation": "Assemble Pie Op",
- "time_in_mins": 10.0,
- "workstation": "Food Prep Table 2",
- },
- {"batch_size": 1, "operation": "Bake Op", "time_in_mins": 50.0, "workstation": "Oven Station"},
- {
- "batch_size": 1,
- "operation": "Cool Pie Op",
- "time_in_mins": 30.0,
- "workstation": "Cooling Racks Station",
- },
- {
- "batch_size": 5,
- "operation": "Box Pie Op",
- "time_in_mins": 5.0,
- "workstation": "Packaging Station",
- },
- ],
- },
- {
- "item": "Double Plum Pie",
- "quantity": 5.0,
- "uom": "Nos",
- "items": [
- {"item_code": "Pie Crust", "qty": 5.0, "qty_consumed_per_unit": 1.0, "uom": "Nos"},
- {
- "item_code": "Double Plum Pie Filling",
- "qty": 20.0,
- "qty_consumed_per_unit": 4.0,
- "uom": "Cup",
- },
- {"item_code": "Pie Box", "qty": 5.0, "qty_consumed_per_unit": 1.0, "uom": "Nos"},
- ],
- "operations": [
- {
- "batch_size": 5,
- "operation": "Assemble Pie Op",
- "time_in_mins": 10.0,
- "workstation": "Food Prep Table 2",
- },
- {"batch_size": 1, "operation": "Bake Op", "time_in_mins": 50.0, "workstation": "Oven Station"},
- {
- "batch_size": 1,
- "operation": "Cool Pie Op",
- "time_in_mins": 30.0,
- "workstation": "Cooling Racks Station",
- },
- {
- "batch_size": 5,
- "operation": "Box Pie Op",
- "time_in_mins": 5.0,
- "workstation": "Packaging Station",
- },
- ],
- },
- {
- "item": "Kaduka Key Lime Pie",
- "quantity": 5.0,
- "uom": "Nos",
- "items": [
- {"item_code": "Pie Crust", "qty": 5.0, "qty_consumed_per_unit": 1.0, "uom": "Nos"},
- {
- "item_code": "Kaduka Key Lime Pie Filling",
- "qty": 20.0,
- "qty_consumed_per_unit": 4.0,
- "uom": "Cup",
- },
- {"item_code": "Pie Box", "qty": 5.0, "qty_consumed_per_unit": 1.0, "uom": "Nos"},
- ],
- "operations": [
- {
- "batch_size": 5,
- "operation": "Assemble Pie Op",
- "time_in_mins": 10.0,
- "workstation": "Food Prep Table 2",
- },
- {"batch_size": 1, "operation": "Bake Op", "time_in_mins": 50.0, "workstation": "Oven Station"},
- {
- "batch_size": 1,
- "operation": "Cool Pie Op",
- "time_in_mins": 30.0,
- "workstation": "Cooling Racks Station",
- },
- {
- "batch_size": 5,
- "operation": "Box Pie Op",
- "time_in_mins": 5.0,
- "workstation": "Packaging Station",
- },
- ],
- },
- {
- "item": "Gooseberry Pie",
- "quantity": 5.0,
- "uom": "Nos",
- "items": [
- {"item_code": "Pie Crust", "qty": 5.0, "qty_consumed_per_unit": 1.0, "uom": "Nos"},
- {
- "item_code": "Gooseberry Pie Filling",
- "qty": 20.0,
- "qty_consumed_per_unit": 4.0,
- "uom": "Cup",
- },
- {"item_code": "Pie Box", "qty": 5.0, "qty_consumed_per_unit": 1.0, "uom": "Nos"},
- ],
- "operations": [
- {
- "batch_size": 5,
- "operation": "Assemble Pie Op",
- "time_in_mins": 10.0,
- "workstation": "Food Prep Table 2",
- },
- {"batch_size": 1, "operation": "Bake Op", "time_in_mins": 50.0, "workstation": "Oven Station"},
- {
- "batch_size": 1,
- "operation": "Cool Pie Op",
- "time_in_mins": 30.0,
- "workstation": "Cooling Racks Station",
- },
- {
- "batch_size": 5,
- "operation": "Box Pie Op",
- "time_in_mins": 5.0,
- "workstation": "Packaging Station",
- },
- ],
- },
- {
- "item": "Ambrosia Pie",
- "quantity": 5.0,
- "uom": "Nos",
- "overproduction_percentage_for_work_order": 100,
- "items": [
- {"item_code": "Pie Crust", "qty": 5.0, "qty_consumed_per_unit": 1.0, "uom": "Nos"},
- {"item_code": "Ambrosia Pie Filling", "qty": 20.0, "qty_consumed_per_unit": 4.0, "uom": "Cup"},
- {"item_code": "Pie Box", "qty": 5.0, "qty_consumed_per_unit": 1.0, "uom": "Nos"},
- ],
- "operations": [
- {
- "batch_size": 5,
- "operation": "Assemble Pie Op",
- "time_in_mins": 10.0,
- "workstation": "Food Prep Table 2",
- },
- {"batch_size": 1, "operation": "Bake Op", "time_in_mins": 50.0, "workstation": "Oven Station"},
- {
- "batch_size": 1,
- "operation": "Cool Pie Op",
- "time_in_mins": 30.0,
- "workstation": "Cooling Racks Station",
- },
- {
- "batch_size": 5,
- "operation": "Box Pie Op",
- "time_in_mins": 5.0,
- "workstation": "Packaging Station",
- },
- ],
- },
- {
- "item": "Bayberry Pie Filling",
- "quantity": 20.0,
- "uom": "Cup",
- "items": [
- {"item_code": "Sugar", "qty": 0.5, "qty_consumed_per_unit": 0.025, "uom": "Pound"},
- {"item_code": "Cornstarch", "qty": 0.1, "qty_consumed_per_unit": 0.005, "uom": "Pound"},
- {"item_code": "Water", "qty": 1.25, "qty_consumed_per_unit": 0.0625, "uom": "Cup"},
- {"item_code": "Butter", "qty": 0.313, "qty_consumed_per_unit": 0.01565, "uom": "Pound"},
- {"item_code": "Bayberry", "qty": 15.0, "qty_consumed_per_unit": 0.05025, "uom": "Pound"},
- ],
- "operations": [
- {
- "batch_size": 5,
- "operation": "Gather Pie Filling Ingredients",
- "time_in_mins": 5.0,
- "workstation": "Food Prep Table 1",
- },
- {
- "batch_size": 5,
- "operation": "Cook Pie Filling Operation",
- "time_in_mins": 15.0,
- "workstation": "Range Station",
- },
- ],
- },
- {
- "item": "Double Plum Pie Filling",
- "quantity": 20.0,
- "uom": "Cup",
- "items": [
- {"item_code": "Sugar", "qty": 0.5, "qty_consumed_per_unit": 0.025, "uom": "Pound"},
- {"item_code": "Cornstarch", "qty": 0.1, "qty_consumed_per_unit": 0.005, "uom": "Pound"},
- {"item_code": "Water", "qty": 1.25, "qty_consumed_per_unit": 0.0625, "uom": "Cup"},
- {"item_code": "Butter", "qty": 0.313, "qty_consumed_per_unit": 0.01565, "uom": "Pound"},
- {"item_code": "Cocoplum", "qty": 7.5, "qty_consumed_per_unit": 0.02515, "uom": "Pound"},
- {"item_code": "Damson Plum", "qty": 7.5, "qty_consumed_per_unit": 0.02515, "uom": "Pound"},
- ],
- "operations": [
- {
- "batch_size": 5,
- "operation": "Gather Pie Filling Ingredients",
- "time_in_mins": 5.0,
- "workstation": "Food Prep Table 1",
- },
- {
- "batch_size": 5,
- "operation": "Cook Pie Filling Operation",
- "time_in_mins": 15.0,
- "workstation": "Range Station",
- },
- ],
- },
- {
- "item": "Kaduka Key Lime Pie Filling",
- "quantity": 20.0,
- "uom": "Cup",
- "items": [
- {"item_code": "Sugar", "qty": 0.5, "qty_consumed_per_unit": 0.025, "uom": "Pound"},
- {"item_code": "Cornstarch", "qty": 0.1, "qty_consumed_per_unit": 0.005, "uom": "Pound"},
- {"item_code": "Water", "qty": 1.25, "qty_consumed_per_unit": 0.0625, "uom": "Cup"},
- {"item_code": "Butter", "qty": 0.313, "qty_consumed_per_unit": 0.01565, "uom": "Pound"},
- {"item_code": "Kaduka Lime", "qty": 10.0, "qty_consumed_per_unit": 0.0335, "uom": "Pound"},
- {"item_code": "Limequat", "qty": 5.0, "qty_consumed_per_unit": 0.01675, "uom": "Pound"},
- ],
- "operations": [
- {
- "batch_size": 5,
- "operation": "Gather Pie Filling Ingredients",
- "time_in_mins": 5.0,
- "workstation": "Food Prep Table 1",
- },
- {
- "batch_size": 5,
- "operation": "Cook Pie Filling Operation",
- "time_in_mins": 15.0,
- "workstation": "Range Station",
- },
- ],
- },
- {
- "item": "Gooseberry Pie Filling",
- "quantity": 20.0,
- "uom": "Cup",
- "items": [
- {"item_code": "Sugar", "qty": 0.5, "qty_consumed_per_unit": 0.025, "uom": "Pound"},
- {"item_code": "Cornstarch", "qty": 0.1, "qty_consumed_per_unit": 0.005, "uom": "Pound"},
- {"item_code": "Water", "qty": 1.25, "qty_consumed_per_unit": 0.0625, "uom": "Cup"},
- {"item_code": "Butter", "qty": 0.313, "qty_consumed_per_unit": 0.01565, "uom": "Pound"},
- {"item_code": "Gooseberry", "qty": 15.0, "qty_consumed_per_unit": 0.05025, "uom": "Pound"},
- ],
- "operations": [
- {
- "batch_size": 5,
- "operation": "Gather Pie Filling Ingredients",
- "time_in_mins": 5.0,
- "workstation": "Food Prep Table 1",
- },
- {
- "batch_size": 5,
- "operation": "Cook Pie Filling Operation",
- "time_in_mins": 15.0,
- "workstation": "Range Station",
- },
- ],
- },
- {
- "item": "Ambrosia Pie Filling",
- "quantity": 20.0,
- "uom": "Cup",
- "items": [
- {"item_code": "Sugar", "qty": 0.5, "qty_consumed_per_unit": 0.025, "uom": "Pound"},
- {"item_code": "Cornstarch", "qty": 0.1, "qty_consumed_per_unit": 0.005, "uom": "Pound"},
- {"item_code": "Butter", "qty": 0.313, "qty_consumed_per_unit": 0.01565, "uom": "Pound"},
- {
- "item_code": "Hairless Rambutan",
- "qty": 5.0,
- "qty_consumed_per_unit": 0.01675,
- "uom": "Pound",
- },
- {"item_code": "Tayberry", "qty": 2.5, "qty_consumed_per_unit": 0.0084, "uom": "Pound"},
- {"item_code": "Cloudberry", "qty": 7.5, "qty_consumed_per_unit": 0.02515, "uom": "Pound"},
- {"item_code": "Water", "qty": 1.25, "qty_consumed_per_unit": 0.0625, "uom": "Cup"},
- ],
- "operations": [
- {
- "batch_size": 5,
- "operation": "Gather Pie Filling Ingredients",
- "time_in_mins": 5.0,
- "workstation": "Food Prep Table 1",
- },
- {
- "batch_size": 5,
- "operation": "Cook Pie Filling Operation",
- "time_in_mins": 15.0,
- "workstation": "Range Station",
- },
- ],
- },
- {
- "item": "Pie Crust", # Subcontracted BOM
- "quantity": 5.0,
- "uom": "Nos",
- "is_default": 0,
- "is_subcontracted": 1,
- "with_operations": 0,
- "items": [
- {"item_code": "Flour", "qty": 4.25, "qty_consumed_per_unit": 0.85, "uom": "Pound"},
- {"item_code": "Butter", "qty": 2.5, "qty_consumed_per_unit": 0.5, "uom": "Pound"},
- # {"item_code": "Ice Water", "qty": 2.5, "qty_consumed_per_unit": 0.5, "uom": "Cup"},
- {"item_code": "Salt", "qty": 0.05, "qty_consumed_per_unit": 0.01, "uom": "Pound"},
- {"item_code": "Parchment Paper", "qty": 5.0, "qty_consumed_per_unit": 1.0, "uom": "Nos"},
- {"item_code": "Pie Tin", "qty": 5.0, "qty_consumed_per_unit": 1.0, "uom": "Nos"},
- ],
- "operations": [], # Subcontracted item -> operations done by supplier
- },
- {
- "item": "Pie Crust", # In-house BOM
- "quantity": 5.0,
- "uom": "Nos",
- "items": [
- {"item_code": "Flour", "qty": 4.25, "qty_consumed_per_unit": 0.85, "uom": "Pound"},
- {"item_code": "Butter", "qty": 2.5, "qty_consumed_per_unit": 0.5, "uom": "Pound"},
- {"item_code": "Ice Water", "qty": 2.5, "qty_consumed_per_unit": 0.5, "uom": "Cup"},
- {"item_code": "Salt", "qty": 0.05, "qty_consumed_per_unit": 0.01, "uom": "Pound"},
- {"item_code": "Parchment Paper", "qty": 5.0, "qty_consumed_per_unit": 1.0, "uom": "Nos"},
- {"item_code": "Pie Tin", "qty": 5.0, "qty_consumed_per_unit": 1.0, "uom": "Nos"},
- ],
- "operations": [
- {
- "batch_size": 5,
- "operation": "Gather Pie Crust Ingredients",
- "time_in_mins": 5.0,
- "workstation": "Food Prep Table 2",
- },
- {
- "batch_size": 5,
- "operation": "Mix Dough Op",
- "time_in_mins": 5.0,
- "workstation": "Mixer Station",
- },
- {
- "batch_size": 1,
- "operation": "Divide Dough Op",
- "time_in_mins": 2.0,
- "workstation": "Food Prep Table 2",
- },
- {
- "batch_size": 1,
- "operation": "Chill Pie Crust Op",
- "time_in_mins": 30.0,
- "workstation": "Refrigerator Station",
- },
- {
- "batch_size": 5,
- "operation": "Roll Pie Crust Op",
- "time_in_mins": 10.0,
- "workstation": "Food Prep Table 2",
- },
- ],
- },
-]
-
-customers = [
- "Almacs Food Group",
- "Beans and Dreams Roasters",
- "Cafe 27 Cafeteria",
- "Capital Grille Restaurant Group",
- "Downtown Deli",
- "Draws Groceries",
- "Grab n Go Bodega",
- "Grand North Station Baking Co",
- "Happy Basket Food Distribution Group",
- "Jitter Cafe",
- "Longwoods Sandwich Shop",
- "Midtown Munchies Inc",
- "My Way Cup Coffee",
- "Nom Nom Cafe",
- "Round the World Donut Shop",
- "Sand Street Deli",
- "Starfood Cafe",
- "Terrywood Terminal Bakery Inc",
- "TransAmerica Bank Cafeteria",
- "Whole Harvest Grocery Group",
-]
-
-specifications = [
- {
- "dt": "Item",
- "name": "Items",
- "apply_on": "",
- "enabled": 1,
- "attributes": [
- {
- "attribute_name": "Color",
- "applied_on": "Item",
- "component": "FacetedSearchColorPicker",
- },
- {
- "attribute_name": "Weight",
- "applied_on": "Item",
- "field": "weight_per_unit",
- "numeric_values": 1,
- "component": "FacetedSearchNumericRange",
- },
- {
- "attribute_name": "Brand",
- "applied_on": "Item",
- "field": "brand",
- "component": "AttributeFilter",
- },
- ],
- },
- {
- "dt": "Item Group",
- "name": "Baked Goods",
- "apply_on": "Baked Goods",
- "enabled": 1,
- "attributes": [
- {
- "attribute_name": "Price",
- "applied_on": "Item",
- "numeric_values": 1,
- "component": "FacetedSearchNumericRange",
- },
- {"attribute_name": "Fruits", "applied_on": "Item", "component": "AttributeFilter"},
- {
- "attribute_name": "Shelf Life",
- "applied_on": "Item",
- "field": "shelf_life_in_days",
- "numeric_values": 1,
- "component": "FacetedSearchNumericRange",
- },
- {
- "attribute_name": "EOL",
- "applied_on": "Item",
- "field": "end_of_life",
- "date_values": 1,
- "component": "FacetedSearchDateRange",
- },
- ],
- },
-]
-
-
-attributes = {
- "Ambrosia Pie": {
- "Fruits": ["Hairless Rambutan", "Cloudberry", "Tayberry"],
- "Price": 11.00,
- "Color": ["Blue", "Red"],
- "Brand": "Chelsea Fruit Co",
- },
- "Double Plum Pie": {
- "Fruits": ["Cocoplum", "Damson Plum"],
- "Price": 10.50,
- "Color": ["Purple"],
- "Brand": "Chelsea Fruit Co",
- },
- "Gooseberry Pie": {
- "Fruits": "Gooseberry",
- "Price": 12.00,
- "Color": ["Yellow"],
- "Brand": "Chelsea Fruit Co",
- },
- "Kaduka Key Lime Pie": {
- "Fruits": ["Kaduka Lime", "Limequat"],
- "Price": 11.50,
- "Color": ["Green", "Yellow"],
- "Brand": "Chelsea Fruit Co",
- },
- "Tayberry": {
- "Color": ["Red"],
- },
- "Limequat": {
- "Color": ["Yellow", "Green"],
- },
- "Kaduka Lime": {
- "Color": ["Green"],
- },
- "Hairless Rambutan": {
- "Color": ["Red"],
- },
- "Gooseberry": {
- "Color": ["Yellow"],
- },
- "Damson Plum": {
- "Color": ["Purple"],
- },
- "Cocoplum": {
- "Color": ["Purple", "Black"],
- },
- "Bayberry": {
- "Color": ["Red", "Green", "Blue"],
- },
- "Sugar": {
- "Color": ["White"],
- },
- "Salt": {
- "Color": ["White"],
- },
- "Flour": {
- "Color": ["White"],
- },
- "Cornstarch": {
- "Color": ["White"],
- },
- "Butter": {
- "Color": ["Yellow"],
- },
- "Cloudberry": {
- "Color": ["Yellow", "Red"],
- },
-}
+# Copyright (c) 2024, AgriTheory and contributors
+# For license information, please see license.txt
+
+suppliers = [
+ (
+ "Freedom Provisions",
+ None,
+ None,
+ None,
+ "Net 30",
+ {
+ "address_line1": "16 Margrave",
+ "city": "Carlisle",
+ "state": "NH",
+ "country": "United States",
+ "pincode": "57173",
+ },
+ ),
+ (
+ "Unity Bakery Supply",
+ None,
+ None,
+ None,
+ "Net 30",
+ {
+ "address_line1": "34 Pinar St",
+ "city": "Unity",
+ "state": "RI",
+ "country": "United States",
+ "pincode": "34291",
+ },
+ ),
+ (
+ "Chelsea Fruit Co",
+ None,
+ None,
+ None,
+ "Net 30",
+ {
+ "address_line1": "67C Sweeny Street",
+ "city": "Chelsea",
+ "state": "MA",
+ "country": "United States",
+ "pincode": "89077",
+ },
+ ),
+ (
+ "Credible Contract Baking",
+ None,
+ None,
+ None,
+ "Net 30",
+ {
+ "address_line1": "4 Crumb Circle",
+ "city": "Belmont",
+ "state": "MA",
+ "country": "United States",
+ "pincode": "89074",
+ },
+ ),
+ (
+ "Southern Fruit Supply",
+ None,
+ None,
+ None,
+ "Net 30",
+ {
+ "address_line1": "10001 Pineapple Way",
+ "city": "Largo",
+ "state": "TX",
+ "country": "United States",
+ "pincode": "89574",
+ },
+ ),
+]
+
+workstations = [
+ ("Mix Pie Crust Station", "20", "mixer.png", "mixer.png"),
+ ("Roll Pie Crust Station", "20", "rolling.png", "rolling.png"),
+ ("Make Pie Filling Station", "20", "table.png", "table.png"),
+ ("Cooling Station", "100", "rack.png", "rack.png"),
+ ("Box Pie Station", "100", "box.png", "box.png"),
+ ("Baking Station", "20", "oven.png", "oven.png"),
+ ("Assemble Pie Station", "20", "table.png", "table.png"),
+ ("Mix Pie Filling Station", "20", "mixer.png", "mixer.png"),
+ ("Packaging Station", "2", "box.png", "box.png"),
+ ("Food Prep Table 2", "10", "table.png", "table.png"),
+ ("Food Prep Table 1", "5", "table.png", "table.png"),
+ ("Range Station", "20", "range.png", "range.png"),
+ ("Cooling Racks Station", "80", "rack.png", "rack.png"),
+ ("Refrigerator Station", "200", "fridge.png", "fridge.png"),
+ ("Oven Station", "20", "oven.png", "oven.png"),
+ ("Mixer Station", "10", "mixer.png", "mixer.png"),
+]
+
+operations = [
+ (
+ "Gather Pie Crust Ingredients",
+ "Food Prep Table 2",
+ "5",
+ """- Remove flour, salt, and a pie tins from store room
+ - Remove butter and ice water from refrigerator
+ - Place ingredients at workstation
+ - Measure amounts for batch size into mixing bowl""",
+ ["Food Prep Table 1"],
+ ),
+ (
+ "Gather Pie Filling Ingredients",
+ "Food Prep Table 1",
+ "5",
+ """- Remove fruit and butter from refrigerator
+ - Remove sugar and cornstarch
+ - Get water from sink
+ - Measure ingredients and place in pot, excluding 1/4 of fruit and butter""",
+ ["Food Prep Table 2"],
+ ),
+ (
+ "Assemble Pie Op",
+ "Food Prep Table 2",
+ "5",
+ """- Use fresh pie filling or remove from refrigerator
+ - Remove rolled pie crusts from refrigerator
+ - Fill bottom crust with filling
+ - Create decorative cut out for top crust
+ - Layer top crust over bottom crust / filling and create a crimped seal""",
+ ["Food Prep Table 1", "Assemble Pie Station"],
+ ),
+ (
+ "Cook Pie Filling Operation",
+ "Range Station",
+ "5",
+ """- Bring ingredients to simmer and cook for 15 minutes
+ - Remove from heat and mix in remaining 1/4 berries and butter
+ - Store in refrigerator if not using immediately""",
+ ),
+ (
+ "Mix Dough Op",
+ "Mixer Station",
+ "5",
+ """- Combine flour, butter, salt, and ice water in mixer
+ - Pulse for 30 seconds
+ - Divide into equal-sized portions, one portion for each pie crust being made
+ - Put in refrigerator""",
+ ["Mix Pie Crust Station", "Mix Pie Filling Station"],
+ ),
+ ("Box Pie Op", "Packaging Station", "5", "- Place pie into box for sale"),
+ (
+ "Roll Pie Crust Op",
+ "Food Prep Table 2",
+ "5",
+ """- Remove chilled pie crust portions from refrigerator
+ - Separate each portion into two (one for bottom crust, one for top)
+ - Flour board and roll out each portion into a circle
+ - Place bottom crust into pie tin, then layer a piece of parchment paper, followed by the top crust""",
+ ["Food Prep Table 1", "Roll Pie Crust Station"],
+ ),
+ ("Divide Dough Op", "Food Prep Table 2", "1", "Divide Dough Op", ["Food Prep Table 1"]),
+ (
+ "Bake Op",
+ "Oven Station",
+ "1",
+ """- Place assembled pies into oven
+ - Bake at 375F for 50 minutes
+ - Remove from oven""",
+ ["Baking Station"],
+ ),
+ (
+ "Chill Pie Crust Op",
+ "Refrigerator Station",
+ "1",
+ "- Chill pie crust for at least 30 minutes",
+ ["Cooling Station", "Cooling Racks Station"],
+ ),
+ (
+ "Cool Pie Op",
+ "Cooling Racks Station",
+ "1",
+ "Cool baked pies for at least 30 minutes before boxing",
+ ["Cooling Station", "Refrigerator Station"],
+ ),
+ (
+ "Assemble Pocket Op",
+ "Food Prep Table 1",
+ "5",
+ """- Fold 3 poppers into dough pocket""",
+ ),
+ (
+ "Assemble Popper Op",
+ "Food Prep Table 1",
+ "5",
+ """- Top dough bite with fruit""",
+ ),
+ (
+ "Assemble Combination Product",
+ "Food Prep Table 1",
+ "5",
+ """- Tower: package one pie and one pocket, and one popper
+ - Pocketful of Bay: package one pocket with two poppers""",
+ ),
+]
+
+items = [
+ {
+ "item_code": "Ambrosia Pie",
+ "item_group": "Baked Goods",
+ "uom": "Nos",
+ "weight_per_unit": 7.5,
+ "weight_uom": "Pound",
+ "item_price": 11.00,
+ "default_warehouse": "Refrigerated Display - APC",
+ "description": "Ambrosia Pie is the marquee product of Ambrosia Pie Company. A filling of heavenly cloudberries pair perfectly with the tart hairless rambutan, finished with drizzles of tayberry nectar. It's a feast fit for Mt Olympus!
",
+ },
+ {
+ "item_code": "Double Plum Pie",
+ "uom": "Nos",
+ "weight_per_unit": 8,
+ "weight_uom": "Pound",
+ "item_group": "Baked Goods",
+ "item_price": 10.50,
+ "default_warehouse": "Refrigerated Display - APC",
+ "description": "Double the fun and double the flavor with our Double Plum Pie! We combine damson and cocoplums in a daring tropical-meets-temperate filling. Forbidden fruit never tasted this good.
",
+ },
+ {
+ "item_code": "Gooseberry Pie",
+ "uom": "Nos",
+ "weight_per_unit": 8.5,
+ "weight_uom": "Pound",
+ "item_group": "Baked Goods",
+ "item_price": 12.00,
+ "default_warehouse": "Refrigerated Display - APC",
+ "description": "Our delicious take on the traditional gooseberry pie that tastes like the holidays. This classic pie is best shared with the ones you love.
",
+ },
+ {
+ "item_code": "Kaduka Key Lime Pie",
+ "item_group": "Baked Goods",
+ "uom": "Nos",
+ "weight_per_unit": 9,
+ "weight_uom": "Pound",
+ "item_price": 11.50,
+ "default_warehouse": "Refrigerated Display - APC",
+ "description": "Take your tastebuds on an adventure with this whimsical twist on the classic Key Lime pie. Made with kaduka limes and the exotic limequat, this seasonal pie is sure to satisfy even the most weary culinary explorer. Grab it when you can - it's only available April through September.
",
+ },
+ {
+ "item_code": "Tower of Bay-bel",
+ "uom": "Nos",
+ "item_group": "Baked Goods",
+ "item_price": 20.00,
+ "default_warehouse": "Refrigerated Display - APC",
+ "description": "Reach for the stars with this epic all-things-bayberry dessert that stacks a Bayberry Pocket on top of our Bayberry Pie.
",
+ },
+ {
+ "item_code": "Pocketful of Bay",
+ "uom": "Nos",
+ "item_group": "Baked Goods",
+ "item_price": 12.00,
+ "default_warehouse": "Refrigerated Display - APC",
+ "description": "Try this delightful combination of a Bayberry Pocket and two additional Bayberry Poppers.
",
+ },
+ {
+ "item_code": "Bayberry Pie",
+ "uom": "Nos",
+ "item_group": "Sub Assemblies",
+ # "item_price": 11.00, # can a finished good be included as sub-assembly for another good?
+ "default_warehouse": "Refrigerated Display - APC",
+ "description": "This pie features the sweet and scrumptious bayberry and is sure to be a crowd-pleaser.
",
+ },
+ {
+ "item_code": "Bayberry Pocket",
+ "uom": "Nos",
+ "item_group": "Sub Assemblies",
+ # "item_price": 8.00,
+ "default_warehouse": "Refrigerated Display - APC",
+ "description": "Need a little more than one popper? The Bayberry Pocket is a tasty dough pocket stuffed with several Bayberry Poppers.
",
+ },
+ {
+ "item_code": "Bayberry Popper",
+ "uom": "Nos",
+ "item_group": "Sub Assemblies",
+ # "item_price": 3.00,
+ "default_warehouse": "Refrigerated Display - APC",
+ "description": "Part cookie, part tart, these bite-sized treats will bring a little sweetness to your day.
",
+ },
+ {
+ "item_code": "Ambrosia Pie Filling",
+ "uom": "Cup",
+ "item_group": "Sub Assemblies",
+ "default_warehouse": "Refrigerator - APC",
+ "description": "Ambrosia Pie Filling",
+ },
+ {
+ "item_code": "Double Plum Pie Filling",
+ "uom": "Cup",
+ "item_group": "Sub Assemblies",
+ "default_warehouse": "Refrigerator - APC",
+ "description": "Double Plum Pie Filling",
+ },
+ {
+ "item_code": "Gooseberry Pie Filling",
+ "uom": "Cup",
+ "description": "Gooseberry Pie Filling",
+ "item_group": "Sub Assemblies",
+ "default_warehouse": "Refrigerator - APC",
+ },
+ {
+ "item_code": "Bayberry Pie Filling",
+ "uom": "Cup",
+ "description": "Bayberry Pie Filling",
+ "item_group": "Sub Assemblies",
+ "default_warehouse": "Refrigerator - APC",
+ },
+ {
+ "item_code": "Kaduka Key Lime Pie Filling",
+ "item_group": "Sub Assemblies",
+ "default_warehouse": "Refrigerator - APC",
+ "uom": "Cup",
+ "description": "Kaduka Key Lime Pie Filling",
+ },
+ {
+ "item_code": "Pie Crust",
+ "uom": "Nos",
+ "description": "Pie Crust",
+ "item_group": "Sub Assemblies",
+ "default_warehouse": "Refrigerator - APC",
+ "is_sub_contracted_item": 1,
+ "item_price": 2.00,
+ "default_supplier": "",
+ "supplier": "",
+ "valuation_rate": 3.0196,
+ "uom_conversion_detail": {"Hour": 20},
+ },
+ {
+ "item_code": "Pie Crust Service per Crust",
+ "uom": "Nos",
+ "description": "Subcontracted pie crust manufacturing service. Item price is per crust.",
+ "item_group": "Sub Assemblies",
+ "default_warehouse": "Credible Contract Baking - APC",
+ "is_sub_contracted_item": 1,
+ "is_stock_item": 0,
+ "item_price": 2.00,
+ "default_supplier": "Credible Contract Baking",
+ "supplier": "Credible Contract Baking",
+ },
+ {
+ "item_code": "Pie Crust Service per Hour",
+ "uom": "Hour",
+ "description": "Subcontracted pie crust manufacturing service. Item price is per hour.",
+ "item_group": "Sub Assemblies",
+ "default_warehouse": "Credible Contract Baking - APC",
+ "is_sub_contracted_item": 1,
+ "is_stock_item": 0,
+ "item_price": 40.00, # Assumes 5 crusts takes 15 mins (excluding chilling time), or 20 crusts/hour at rate of $2.00/crust
+ "default_supplier": "Credible Contract Baking",
+ "supplier": "Credible Contract Baking",
+ },
+ {
+ "item_code": "Cloudberry",
+ "uom": "Pound",
+ "weight_uom": "Pound",
+ "weight_per_unit": 1,
+ "description": "Cloudberry",
+ "item_group": "Ingredients",
+ "item_price": 0.65,
+ "default_warehouse": "Refrigerator - APC",
+ "supplier": ["Chelsea Fruit Co", "Southern Fruit Supply"],
+ },
+ {
+ "item_code": "Cocoplum",
+ "uom": "Pound",
+ "weight_uom": "Pound",
+ "weight_per_unit": 1,
+ "description": "Cocoplum",
+ "item_group": "Ingredients",
+ "item_price": 0.35,
+ "default_warehouse": "Refrigerator - APC",
+ "supplier": ["Chelsea Fruit Co", "Southern Fruit Supply"],
+ },
+ {
+ "item_code": "Damson Plum",
+ "uom": "Pound",
+ "weight_uom": "Pound",
+ "weight_per_unit": 1,
+ "description": "Damson Plum",
+ "item_group": "Ingredients",
+ "item_price": 0.85,
+ "default_warehouse": "Refrigerator - APC",
+ "supplier": ["Chelsea Fruit Co", "Southern Fruit Supply"],
+ },
+ {
+ "item_code": "Gooseberry",
+ "uom": "Pound",
+ "weight_uom": "Pound",
+ "weight_per_unit": 1,
+ "description": "Gooseberry",
+ "item_group": "Ingredients",
+ "item_price": 0.99,
+ "default_warehouse": "Refrigerator - APC",
+ "supplier": ["Chelsea Fruit Co", "Southern Fruit Supply"],
+ },
+ {
+ "item_code": "Hairless Rambutan",
+ "uom": "Pound",
+ "weight_uom": "Pound",
+ "weight_per_unit": 1,
+ "description": "Hairless Rambutan",
+ "item_price": 0.50,
+ "item_group": "Ingredients",
+ "default_warehouse": "Storeroom - APC",
+ "supplier": ["Chelsea Fruit Co", "Southern Fruit Supply"],
+ },
+ {
+ "item_code": "Kaduka Lime",
+ "uom": "Pound",
+ "weight_uom": "Pound",
+ "weight_per_unit": 1,
+ "description": "Kaduka Lime",
+ "item_group": "Ingredients",
+ "item_price": 0.89,
+ "default_warehouse": "Refrigerator - APC",
+ "supplier": ["Chelsea Fruit Co", "Southern Fruit Supply"],
+ },
+ {
+ "item_code": "Limequat",
+ "uom": "Pound",
+ "weight_uom": "Pound",
+ "weight_per_unit": 1,
+ "description": "Limequat",
+ "item_group": "Ingredients",
+ "item_price": 0.75,
+ "default_warehouse": "Refrigerator - APC",
+ "supplier": ["Chelsea Fruit Co", "Southern Fruit Supply"],
+ },
+ {
+ "item_code": "Tayberry",
+ "uom": "Pound",
+ "weight_uom": "Pound",
+ "weight_per_unit": 1,
+ "description": "Tayberry",
+ "item_group": "Ingredients",
+ "item_price": 0.85,
+ "default_warehouse": "Refrigerator - APC",
+ "supplier": ["Chelsea Fruit Co", "Southern Fruit Supply"],
+ },
+ {
+ "item_code": "Bayberry",
+ "uom": "Pound",
+ "weight_uom": "Pound",
+ "weight_per_unit": 1,
+ "description": "Bayberry",
+ "item_group": "Ingredients",
+ "item_price": 0.45,
+ "default_warehouse": "Refrigerator - APC",
+ "supplier": ["Chelsea Fruit Co", "Southern Fruit Supply"],
+ },
+ {
+ "item_code": "Butter",
+ "uom": "Pound",
+ "weight_uom": "Pound",
+ "weight_per_unit": 1,
+ "description": "Butter",
+ "item_group": "Ingredients",
+ "item_price": 4.5,
+ "default_warehouse": "Refrigerator - APC",
+ "supplier": [
+ "Freedom Provisions",
+ "Chelsea Fruit Co",
+ ],
+ },
+ {
+ "item_code": "Cornstarch",
+ "uom": "Pound",
+ "weight_uom": "Pound",
+ "weight_per_unit": 1,
+ "description": "Cornstarch",
+ "item_group": "Ingredients",
+ "item_price": 0.52,
+ "default_warehouse": "Storeroom - APC",
+ "supplier": "Freedom Provisions",
+ },
+ {
+ "item_code": "Ice Water",
+ "uom": "Cup",
+ "weight_uom": "Pound",
+ "weight_per_unit": 0.52,
+ "description": "Ice Water - necessary for pie crusts",
+ "item_group": "Ingredients",
+ "item_price": 0.01,
+ "default_warehouse": "Refrigerator - APC",
+ "available_in_house": 1,
+ "opening_qty": 50,
+ },
+ {
+ "item_code": "Flour",
+ "uom": "Pound",
+ "weight_uom": "Pound",
+ "weight_per_unit": 1,
+ "description": "Flour",
+ "item_group": "Ingredients",
+ "item_price": 0.66,
+ "default_warehouse": "Storeroom - APC",
+ "supplier": "Freedom Provisions",
+ },
+ {
+ "item_code": "Pie Box",
+ "uom": "Nos",
+ "description": "Pie Box",
+ "item_group": "Bakery Supplies",
+ "item_price": 0.4,
+ "default_warehouse": "Storeroom - APC",
+ "supplier": ["Freedom Provisions", "Unity Bakery Supply"],
+ },
+ {
+ "item_code": "Pie Tin",
+ "uom": "Nos",
+ "description": "Pie Tin",
+ "item_price": 0.18,
+ "item_group": "Bakery Supplies",
+ "default_warehouse": "Storeroom - APC",
+ "supplier": ["Freedom Provisions", "Unity Bakery Supply"],
+ },
+ {
+ "item_code": "Parchment Paper",
+ "uom": "Nos",
+ "description": "Parchment Paper",
+ "item_group": "Bakery Supplies",
+ "item_price": 0.02,
+ "default_warehouse": "Storeroom - APC",
+ "supplier": ["Freedom Provisions", "Unity Bakery Supply"],
+ "uom_conversion_detail": {"Box": 100},
+ },
+ {
+ "item_code": "Salt",
+ "uom": "Pound",
+ "weight_uom": "Pound",
+ "weight_per_unit": 1,
+ "description": "Salt",
+ "item_group": "Ingredients",
+ "item_price": 0.36,
+ "default_warehouse": "Storeroom - APC",
+ "supplier": "Freedom Provisions",
+ },
+ {
+ "item_code": "Sugar",
+ "uom": "Pound",
+ "weight_uom": "Pound",
+ "weight_per_unit": 1,
+ "description": "Sugar",
+ "item_group": "Ingredients",
+ "item_price": 0.60,
+ "default_warehouse": "Storeroom - APC",
+ "supplier": "Freedom Provisions",
+ },
+ {
+ "item_code": "Water",
+ "uom": "Cup",
+ "weight_uom": "Pound",
+ "weight_per_unit": 0.52,
+ "item_price": 0.05,
+ "description": "Water",
+ "item_group": "Ingredients",
+ "default_warehouse": "Kitchen - APC",
+ "available_in_house": 1,
+ "opening_qty": 50,
+ },
+]
+
+boms = [
+ {
+ "item": "Tower of Bay-bel",
+ "quantity": 5.0,
+ "uom": "Nos",
+ "items": [
+ {"item_code": "Bayberry Pie", "qty": 5.0, "qty_consumed_per_unit": 1.0, "uom": "Nos"},
+ {"item_code": "Bayberry Pocket", "qty": 5.0, "qty_consumed_per_unit": 1.0, "uom": "Nos"},
+ ],
+ "operations": [
+ {
+ "batch_size": 5,
+ "operation": "Assemble Combination Product",
+ "time_in_mins": 2.0,
+ "workstation": "Food Prep Table 1",
+ },
+ ],
+ },
+ {
+ "item": "Pocketful of Bay",
+ "quantity": 5.0,
+ "uom": "Nos",
+ "items": [
+ {"item_code": "Bayberry Pocket", "qty": 5.0, "qty_consumed_per_unit": 1.0, "uom": "Nos"},
+ {"item_code": "Bayberry Popper", "qty": 10.0, "qty_consumed_per_unit": 2.0, "uom": "Nos"},
+ {"item_code": "Pie Box", "qty": 5.0, "qty_consumed_per_unit": 1.0, "uom": "Nos"},
+ ],
+ "operations": [
+ {
+ "batch_size": 5,
+ "operation": "Assemble Combination Product",
+ "time_in_mins": 2.0,
+ "workstation": "Food Prep Table 1",
+ },
+ ],
+ },
+ {
+ "item": "Bayberry Pocket",
+ "quantity": 5.0,
+ "uom": "Nos",
+ "items": [
+ {"item_code": "Flour", "qty": 1.5, "qty_consumed_per_unit": 0.3, "uom": "Pound"},
+ {"item_code": "Butter", "qty": 0.75, "qty_consumed_per_unit": 0.15, "uom": "Pound"},
+ {"item_code": "Sugar", "qty": 0.1, "qty_consumed_per_unit": 0.02, "uom": "Pound"},
+ {"item_code": "Bayberry Popper", "qty": 15.0, "qty_consumed_per_unit": 3.0, "uom": "Nos"},
+ ],
+ "operations": [
+ {
+ "batch_size": 5,
+ "operation": "Mix Dough Op",
+ "time_in_mins": 5.0,
+ "workstation": "Mixer Station",
+ },
+ {
+ "batch_size": 5,
+ "operation": "Assemble Pocket Op",
+ "time_in_mins": 2.0,
+ "workstation": "Food Prep Table 1",
+ },
+ ],
+ },
+ {
+ "item": "Bayberry Popper",
+ "quantity": 5.0,
+ "uom": "Nos",
+ "items": [
+ {"item_code": "Flour", "qty": 0.5, "qty_consumed_per_unit": 0.1, "uom": "Pound"},
+ {"item_code": "Butter", "qty": 0.25, "qty_consumed_per_unit": 0.05, "uom": "Pound"},
+ {"item_code": "Sugar", "qty": 0.05, "qty_consumed_per_unit": 0.01, "uom": "Pound"},
+ {"item_code": "Bayberry", "qty": 1.0, "qty_consumed_per_unit": 0.2, "uom": "Pound"},
+ ],
+ "operations": [
+ {
+ "batch_size": 5,
+ "operation": "Mix Dough Op",
+ "time_in_mins": 5.0,
+ "workstation": "Mixer Station",
+ },
+ {
+ "batch_size": 5,
+ "operation": "Assemble Popper Op",
+ "time_in_mins": 1.0,
+ "workstation": "Food Prep Table 1",
+ },
+ ],
+ },
+ {
+ "item": "Bayberry Pie",
+ "quantity": 5.0,
+ "uom": "Nos",
+ "items": [
+ {"item_code": "Pie Crust", "qty": 5.0, "qty_consumed_per_unit": 1.0, "uom": "Nos"},
+ {
+ "item_code": "Bayberry Pie Filling",
+ "qty": 20.0,
+ "qty_consumed_per_unit": 4.0,
+ "uom": "Cup",
+ },
+ {"item_code": "Pie Box", "qty": 5.0, "qty_consumed_per_unit": 1.0, "uom": "Nos"},
+ ],
+ "operations": [
+ {
+ "batch_size": 5,
+ "operation": "Assemble Pie Op",
+ "time_in_mins": 10.0,
+ "workstation": "Food Prep Table 2",
+ },
+ {"batch_size": 1, "operation": "Bake Op", "time_in_mins": 50.0, "workstation": "Oven Station"},
+ {
+ "batch_size": 1,
+ "operation": "Cool Pie Op",
+ "time_in_mins": 30.0,
+ "workstation": "Cooling Racks Station",
+ },
+ {
+ "batch_size": 5,
+ "operation": "Box Pie Op",
+ "time_in_mins": 5.0,
+ "workstation": "Packaging Station",
+ },
+ ],
+ },
+ {
+ "item": "Double Plum Pie",
+ "quantity": 5.0,
+ "uom": "Nos",
+ "items": [
+ {"item_code": "Pie Crust", "qty": 5.0, "qty_consumed_per_unit": 1.0, "uom": "Nos"},
+ {
+ "item_code": "Double Plum Pie Filling",
+ "qty": 20.0,
+ "qty_consumed_per_unit": 4.0,
+ "uom": "Cup",
+ },
+ {"item_code": "Pie Box", "qty": 5.0, "qty_consumed_per_unit": 1.0, "uom": "Nos"},
+ ],
+ "operations": [
+ {
+ "batch_size": 5,
+ "operation": "Assemble Pie Op",
+ "time_in_mins": 10.0,
+ "workstation": "Food Prep Table 2",
+ },
+ {"batch_size": 1, "operation": "Bake Op", "time_in_mins": 50.0, "workstation": "Oven Station"},
+ {
+ "batch_size": 1,
+ "operation": "Cool Pie Op",
+ "time_in_mins": 30.0,
+ "workstation": "Cooling Racks Station",
+ },
+ {
+ "batch_size": 5,
+ "operation": "Box Pie Op",
+ "time_in_mins": 5.0,
+ "workstation": "Packaging Station",
+ },
+ ],
+ },
+ {
+ "item": "Kaduka Key Lime Pie",
+ "quantity": 5.0,
+ "uom": "Nos",
+ "items": [
+ {"item_code": "Pie Crust", "qty": 5.0, "qty_consumed_per_unit": 1.0, "uom": "Nos"},
+ {
+ "item_code": "Kaduka Key Lime Pie Filling",
+ "qty": 20.0,
+ "qty_consumed_per_unit": 4.0,
+ "uom": "Cup",
+ },
+ {"item_code": "Pie Box", "qty": 5.0, "qty_consumed_per_unit": 1.0, "uom": "Nos"},
+ ],
+ "operations": [
+ {
+ "batch_size": 5,
+ "operation": "Assemble Pie Op",
+ "time_in_mins": 10.0,
+ "workstation": "Food Prep Table 2",
+ },
+ {"batch_size": 1, "operation": "Bake Op", "time_in_mins": 50.0, "workstation": "Oven Station"},
+ {
+ "batch_size": 1,
+ "operation": "Cool Pie Op",
+ "time_in_mins": 30.0,
+ "workstation": "Cooling Racks Station",
+ },
+ {
+ "batch_size": 5,
+ "operation": "Box Pie Op",
+ "time_in_mins": 5.0,
+ "workstation": "Packaging Station",
+ },
+ ],
+ },
+ {
+ "item": "Gooseberry Pie",
+ "quantity": 5.0,
+ "uom": "Nos",
+ "items": [
+ {"item_code": "Pie Crust", "qty": 5.0, "qty_consumed_per_unit": 1.0, "uom": "Nos"},
+ {
+ "item_code": "Gooseberry Pie Filling",
+ "qty": 20.0,
+ "qty_consumed_per_unit": 4.0,
+ "uom": "Cup",
+ },
+ {"item_code": "Pie Box", "qty": 5.0, "qty_consumed_per_unit": 1.0, "uom": "Nos"},
+ ],
+ "operations": [
+ {
+ "batch_size": 5,
+ "operation": "Assemble Pie Op",
+ "time_in_mins": 10.0,
+ "workstation": "Food Prep Table 2",
+ },
+ {"batch_size": 1, "operation": "Bake Op", "time_in_mins": 50.0, "workstation": "Oven Station"},
+ {
+ "batch_size": 1,
+ "operation": "Cool Pie Op",
+ "time_in_mins": 30.0,
+ "workstation": "Cooling Racks Station",
+ },
+ {
+ "batch_size": 5,
+ "operation": "Box Pie Op",
+ "time_in_mins": 5.0,
+ "workstation": "Packaging Station",
+ },
+ ],
+ },
+ {
+ "item": "Ambrosia Pie",
+ "quantity": 5.0,
+ "uom": "Nos",
+ "overproduction_percentage_for_work_order": 100,
+ "items": [
+ {"item_code": "Pie Crust", "qty": 5.0, "qty_consumed_per_unit": 1.0, "uom": "Nos"},
+ {"item_code": "Ambrosia Pie Filling", "qty": 20.0, "qty_consumed_per_unit": 4.0, "uom": "Cup"},
+ {"item_code": "Pie Box", "qty": 5.0, "qty_consumed_per_unit": 1.0, "uom": "Nos"},
+ ],
+ "operations": [
+ {
+ "batch_size": 5,
+ "operation": "Assemble Pie Op",
+ "time_in_mins": 10.0,
+ "workstation": "Food Prep Table 2",
+ },
+ {"batch_size": 1, "operation": "Bake Op", "time_in_mins": 50.0, "workstation": "Oven Station"},
+ {
+ "batch_size": 1,
+ "operation": "Cool Pie Op",
+ "time_in_mins": 30.0,
+ "workstation": "Cooling Racks Station",
+ },
+ {
+ "batch_size": 5,
+ "operation": "Box Pie Op",
+ "time_in_mins": 5.0,
+ "workstation": "Packaging Station",
+ },
+ ],
+ },
+ {
+ "item": "Bayberry Pie Filling",
+ "quantity": 20.0,
+ "uom": "Cup",
+ "items": [
+ {"item_code": "Sugar", "qty": 0.5, "qty_consumed_per_unit": 0.025, "uom": "Pound"},
+ {"item_code": "Cornstarch", "qty": 0.1, "qty_consumed_per_unit": 0.005, "uom": "Pound"},
+ {"item_code": "Water", "qty": 1.25, "qty_consumed_per_unit": 0.0625, "uom": "Cup"},
+ {"item_code": "Butter", "qty": 0.313, "qty_consumed_per_unit": 0.01565, "uom": "Pound"},
+ {"item_code": "Bayberry", "qty": 15.0, "qty_consumed_per_unit": 0.05025, "uom": "Pound"},
+ ],
+ "operations": [
+ {
+ "batch_size": 5,
+ "operation": "Gather Pie Filling Ingredients",
+ "time_in_mins": 5.0,
+ "workstation": "Food Prep Table 1",
+ },
+ {
+ "batch_size": 5,
+ "operation": "Cook Pie Filling Operation",
+ "time_in_mins": 15.0,
+ "workstation": "Range Station",
+ },
+ ],
+ },
+ {
+ "item": "Double Plum Pie Filling",
+ "quantity": 20.0,
+ "uom": "Cup",
+ "items": [
+ {"item_code": "Sugar", "qty": 0.5, "qty_consumed_per_unit": 0.025, "uom": "Pound"},
+ {"item_code": "Cornstarch", "qty": 0.1, "qty_consumed_per_unit": 0.005, "uom": "Pound"},
+ {"item_code": "Water", "qty": 1.25, "qty_consumed_per_unit": 0.0625, "uom": "Cup"},
+ {"item_code": "Butter", "qty": 0.313, "qty_consumed_per_unit": 0.01565, "uom": "Pound"},
+ {"item_code": "Cocoplum", "qty": 7.5, "qty_consumed_per_unit": 0.02515, "uom": "Pound"},
+ {"item_code": "Damson Plum", "qty": 7.5, "qty_consumed_per_unit": 0.02515, "uom": "Pound"},
+ ],
+ "operations": [
+ {
+ "batch_size": 5,
+ "operation": "Gather Pie Filling Ingredients",
+ "time_in_mins": 5.0,
+ "workstation": "Food Prep Table 1",
+ },
+ {
+ "batch_size": 5,
+ "operation": "Cook Pie Filling Operation",
+ "time_in_mins": 15.0,
+ "workstation": "Range Station",
+ },
+ ],
+ },
+ {
+ "item": "Kaduka Key Lime Pie Filling",
+ "quantity": 20.0,
+ "uom": "Cup",
+ "items": [
+ {"item_code": "Sugar", "qty": 0.5, "qty_consumed_per_unit": 0.025, "uom": "Pound"},
+ {"item_code": "Cornstarch", "qty": 0.1, "qty_consumed_per_unit": 0.005, "uom": "Pound"},
+ {"item_code": "Water", "qty": 1.25, "qty_consumed_per_unit": 0.0625, "uom": "Cup"},
+ {"item_code": "Butter", "qty": 0.313, "qty_consumed_per_unit": 0.01565, "uom": "Pound"},
+ {"item_code": "Kaduka Lime", "qty": 10.0, "qty_consumed_per_unit": 0.0335, "uom": "Pound"},
+ {"item_code": "Limequat", "qty": 5.0, "qty_consumed_per_unit": 0.01675, "uom": "Pound"},
+ ],
+ "operations": [
+ {
+ "batch_size": 5,
+ "operation": "Gather Pie Filling Ingredients",
+ "time_in_mins": 5.0,
+ "workstation": "Food Prep Table 1",
+ },
+ {
+ "batch_size": 5,
+ "operation": "Cook Pie Filling Operation",
+ "time_in_mins": 15.0,
+ "workstation": "Range Station",
+ },
+ ],
+ },
+ {
+ "item": "Gooseberry Pie Filling",
+ "quantity": 20.0,
+ "uom": "Cup",
+ "items": [
+ {"item_code": "Sugar", "qty": 0.5, "qty_consumed_per_unit": 0.025, "uom": "Pound"},
+ {"item_code": "Cornstarch", "qty": 0.1, "qty_consumed_per_unit": 0.005, "uom": "Pound"},
+ {"item_code": "Water", "qty": 1.25, "qty_consumed_per_unit": 0.0625, "uom": "Cup"},
+ {"item_code": "Butter", "qty": 0.313, "qty_consumed_per_unit": 0.01565, "uom": "Pound"},
+ {"item_code": "Gooseberry", "qty": 15.0, "qty_consumed_per_unit": 0.05025, "uom": "Pound"},
+ ],
+ "operations": [
+ {
+ "batch_size": 5,
+ "operation": "Gather Pie Filling Ingredients",
+ "time_in_mins": 5.0,
+ "workstation": "Food Prep Table 1",
+ },
+ {
+ "batch_size": 5,
+ "operation": "Cook Pie Filling Operation",
+ "time_in_mins": 15.0,
+ "workstation": "Range Station",
+ },
+ ],
+ },
+ {
+ "item": "Ambrosia Pie Filling",
+ "quantity": 20.0,
+ "uom": "Cup",
+ "items": [
+ {"item_code": "Sugar", "qty": 0.5, "qty_consumed_per_unit": 0.025, "uom": "Pound"},
+ {"item_code": "Cornstarch", "qty": 0.1, "qty_consumed_per_unit": 0.005, "uom": "Pound"},
+ {"item_code": "Butter", "qty": 0.313, "qty_consumed_per_unit": 0.01565, "uom": "Pound"},
+ {
+ "item_code": "Hairless Rambutan",
+ "qty": 5.0,
+ "qty_consumed_per_unit": 0.01675,
+ "uom": "Pound",
+ },
+ {"item_code": "Tayberry", "qty": 2.5, "qty_consumed_per_unit": 0.0084, "uom": "Pound"},
+ {"item_code": "Cloudberry", "qty": 7.5, "qty_consumed_per_unit": 0.02515, "uom": "Pound"},
+ {"item_code": "Water", "qty": 1.25, "qty_consumed_per_unit": 0.0625, "uom": "Cup"},
+ ],
+ "operations": [
+ {
+ "batch_size": 5,
+ "operation": "Gather Pie Filling Ingredients",
+ "time_in_mins": 5.0,
+ "workstation": "Food Prep Table 1",
+ },
+ {
+ "batch_size": 5,
+ "operation": "Cook Pie Filling Operation",
+ "time_in_mins": 15.0,
+ "workstation": "Range Station",
+ },
+ ],
+ },
+ {
+ "item": "Pie Crust", # Subcontracted BOM
+ "quantity": 5.0,
+ "uom": "Nos",
+ "is_default": 0,
+ "is_subcontracted": 1,
+ "with_operations": 0,
+ "items": [
+ {"item_code": "Flour", "qty": 4.25, "qty_consumed_per_unit": 0.85, "uom": "Pound"},
+ {"item_code": "Butter", "qty": 2.5, "qty_consumed_per_unit": 0.5, "uom": "Pound"},
+ # {"item_code": "Ice Water", "qty": 2.5, "qty_consumed_per_unit": 0.5, "uom": "Cup"},
+ {"item_code": "Salt", "qty": 0.05, "qty_consumed_per_unit": 0.01, "uom": "Pound"},
+ {"item_code": "Parchment Paper", "qty": 5.0, "qty_consumed_per_unit": 1.0, "uom": "Nos"},
+ {"item_code": "Pie Tin", "qty": 5.0, "qty_consumed_per_unit": 1.0, "uom": "Nos"},
+ ],
+ "operations": [], # Subcontracted item -> operations done by supplier
+ },
+ {
+ "item": "Pie Crust", # In-house BOM
+ "quantity": 5.0,
+ "uom": "Nos",
+ "items": [
+ {"item_code": "Flour", "qty": 4.25, "qty_consumed_per_unit": 0.85, "uom": "Pound"},
+ {"item_code": "Butter", "qty": 2.5, "qty_consumed_per_unit": 0.5, "uom": "Pound"},
+ {"item_code": "Ice Water", "qty": 2.5, "qty_consumed_per_unit": 0.5, "uom": "Cup"},
+ {"item_code": "Salt", "qty": 0.05, "qty_consumed_per_unit": 0.01, "uom": "Pound"},
+ {"item_code": "Parchment Paper", "qty": 5.0, "qty_consumed_per_unit": 1.0, "uom": "Nos"},
+ {"item_code": "Pie Tin", "qty": 5.0, "qty_consumed_per_unit": 1.0, "uom": "Nos"},
+ ],
+ "operations": [
+ {
+ "batch_size": 5,
+ "operation": "Gather Pie Crust Ingredients",
+ "time_in_mins": 5.0,
+ "workstation": "Food Prep Table 2",
+ },
+ {
+ "batch_size": 5,
+ "operation": "Mix Dough Op",
+ "time_in_mins": 5.0,
+ "workstation": "Mixer Station",
+ },
+ {
+ "batch_size": 1,
+ "operation": "Divide Dough Op",
+ "time_in_mins": 2.0,
+ "workstation": "Food Prep Table 2",
+ },
+ {
+ "batch_size": 1,
+ "operation": "Chill Pie Crust Op",
+ "time_in_mins": 30.0,
+ "workstation": "Refrigerator Station",
+ },
+ {
+ "batch_size": 5,
+ "operation": "Roll Pie Crust Op",
+ "time_in_mins": 10.0,
+ "workstation": "Food Prep Table 2",
+ },
+ ],
+ },
+]
+
+customers = [
+ "Almacs Food Group",
+ "Beans and Dreams Roasters",
+ "Cafe 27 Cafeteria",
+ "Capital Grille Restaurant Group",
+ "Downtown Deli",
+ "Draws Groceries",
+ "Grab n Go Bodega",
+ "Grand North Station Baking Co",
+ "Happy Basket Food Distribution Group",
+ "Jitter Cafe",
+ "Longwoods Sandwich Shop",
+ "Midtown Munchies Inc",
+ "My Way Cup Coffee",
+ "Nom Nom Cafe",
+ "Round the World Donut Shop",
+ "Sand Street Deli",
+ "Starfood Cafe",
+ "Terrywood Terminal Bakery Inc",
+ "TransAmerica Bank Cafeteria",
+ "Whole Harvest Grocery Group",
+]
+
+specifications = [
+ {
+ "dt": "Item",
+ "name": "Items",
+ "apply_on": "",
+ "enabled": 1,
+ "attributes": [
+ {
+ "attribute_name": "Color",
+ "applied_on": "Item",
+ "component": "FacetedSearchColorPicker",
+ },
+ {
+ "attribute_name": "Weight",
+ "applied_on": "Item",
+ "field": "weight_per_unit",
+ "numeric_values": 1,
+ "component": "FacetedSearchNumericRange",
+ },
+ {
+ "attribute_name": "Brand",
+ "applied_on": "Item",
+ "field": "brand",
+ "component": "AttributeFilter",
+ },
+ ],
+ },
+ {
+ "dt": "Item Group",
+ "name": "Baked Goods",
+ "apply_on": "Baked Goods",
+ "enabled": 1,
+ "attributes": [
+ {
+ "attribute_name": "Price",
+ "applied_on": "Item",
+ "numeric_values": 1,
+ "component": "FacetedSearchNumericRange",
+ },
+ {"attribute_name": "Fruits", "applied_on": "Item", "component": "AttributeFilter"},
+ {
+ "attribute_name": "Shelf Life",
+ "applied_on": "Item",
+ "field": "shelf_life_in_days",
+ "numeric_values": 1,
+ "component": "FacetedSearchNumericRange",
+ },
+ {
+ "attribute_name": "EOL",
+ "applied_on": "Item",
+ "field": "end_of_life",
+ "date_values": 1,
+ "component": "FacetedSearchDateRange",
+ },
+ ],
+ },
+]
+
+
+attributes = {
+ "Ambrosia Pie": {
+ "Fruits": ["Hairless Rambutan", "Cloudberry", "Tayberry"],
+ "Price": 11.00,
+ "Color": ["Blue", "Red"],
+ "Brand": "Chelsea Fruit Co",
+ },
+ "Double Plum Pie": {
+ "Fruits": ["Cocoplum", "Damson Plum"],
+ "Price": 10.50,
+ "Color": ["Purple"],
+ "Brand": "Chelsea Fruit Co",
+ },
+ "Gooseberry Pie": {
+ "Fruits": "Gooseberry",
+ "Price": 12.00,
+ "Color": ["Yellow"],
+ "Brand": "Chelsea Fruit Co",
+ },
+ "Kaduka Key Lime Pie": {
+ "Fruits": ["Kaduka Lime", "Limequat"],
+ "Price": 11.50,
+ "Color": ["Green", "Yellow"],
+ "Brand": "Chelsea Fruit Co",
+ },
+ "Tayberry": {
+ "Color": ["Red"],
+ },
+ "Limequat": {
+ "Color": ["Yellow", "Green"],
+ },
+ "Kaduka Lime": {
+ "Color": ["Green"],
+ },
+ "Hairless Rambutan": {
+ "Color": ["Red"],
+ },
+ "Gooseberry": {
+ "Color": ["Yellow"],
+ },
+ "Damson Plum": {
+ "Color": ["Purple"],
+ },
+ "Cocoplum": {
+ "Color": ["Purple", "Black"],
+ },
+ "Bayberry": {
+ "Color": ["Red", "Green", "Blue"],
+ },
+ "Sugar": {
+ "Color": ["White"],
+ },
+ "Salt": {
+ "Color": ["White"],
+ },
+ "Flour": {
+ "Color": ["White"],
+ },
+ "Cornstarch": {
+ "Color": ["White"],
+ },
+ "Butter": {
+ "Color": ["Yellow"],
+ },
+ "Cloudberry": {
+ "Color": ["Yellow", "Red"],
+ },
+}
diff --git a/inventory_tools/tests/fixtures/box.png b/inventory_tools/tests/fixtures/box.png
new file mode 100644
index 0000000..c353aac
Binary files /dev/null and b/inventory_tools/tests/fixtures/box.png differ
diff --git a/inventory_tools/tests/fixtures/floor_plan.png b/inventory_tools/tests/fixtures/floor_plan.png
new file mode 100644
index 0000000..3712b77
Binary files /dev/null and b/inventory_tools/tests/fixtures/floor_plan.png differ
diff --git a/inventory_tools/tests/fixtures/fridge.png b/inventory_tools/tests/fixtures/fridge.png
new file mode 100644
index 0000000..762e797
Binary files /dev/null and b/inventory_tools/tests/fixtures/fridge.png differ
diff --git a/inventory_tools/tests/fixtures/mixer.png b/inventory_tools/tests/fixtures/mixer.png
new file mode 100644
index 0000000..32ee5b6
Binary files /dev/null and b/inventory_tools/tests/fixtures/mixer.png differ
diff --git a/inventory_tools/tests/fixtures/oven.png b/inventory_tools/tests/fixtures/oven.png
new file mode 100644
index 0000000..9c598c0
Binary files /dev/null and b/inventory_tools/tests/fixtures/oven.png differ
diff --git a/inventory_tools/tests/fixtures/rack.png b/inventory_tools/tests/fixtures/rack.png
new file mode 100644
index 0000000..a7a2b96
Binary files /dev/null and b/inventory_tools/tests/fixtures/rack.png differ
diff --git a/inventory_tools/tests/fixtures/range.png b/inventory_tools/tests/fixtures/range.png
new file mode 100644
index 0000000..63d2055
Binary files /dev/null and b/inventory_tools/tests/fixtures/range.png differ
diff --git a/inventory_tools/tests/fixtures/rolling.png b/inventory_tools/tests/fixtures/rolling.png
new file mode 100644
index 0000000..0fdc758
Binary files /dev/null and b/inventory_tools/tests/fixtures/rolling.png differ
diff --git a/inventory_tools/tests/fixtures/table.png b/inventory_tools/tests/fixtures/table.png
new file mode 100644
index 0000000..50cf09d
Binary files /dev/null and b/inventory_tools/tests/fixtures/table.png differ
diff --git a/inventory_tools/tests/setup.py b/inventory_tools/tests/setup.py
index 6059abe..750bfb4 100644
--- a/inventory_tools/tests/setup.py
+++ b/inventory_tools/tests/setup.py
@@ -1,838 +1,862 @@
-# Copyright (c) 2024, AgriTheory and contributors
-# For license information, please see license.txt
-
-import datetime
-
-import frappe
-from erpnext.manufacturing.doctype.production_plan.production_plan import (
- get_items_for_material_requests,
-)
-from erpnext.setup.utils import set_defaults_for_tests
-from frappe.desk.page.setup_wizard.setup_wizard import setup_complete
-from frappe.utils.data import add_months, flt, getdate, nowdate, get_datetime
-from webshop.webshop.doctype.website_item.website_item import make_website_item
-
-from inventory_tools.tests.fixtures import (
- boms,
- customers,
- items,
- operations,
- specifications,
- suppliers,
- workstations,
-)
-
-
-def before_test():
- frappe.clear_cache()
- setup_complete(
- {
- "currency": "USD",
- "full_name": "Administrator",
- "company_name": "Ambrosia Pie Company",
- "timezone": "America/New_York",
- "company_abbr": "APC",
- "domains": ["Distribution"],
- "country": "United States",
- "fy_start_date": getdate().replace(month=1, day=1).isoformat(),
- "fy_end_date": getdate().replace(month=12, day=31).isoformat(),
- "language": "english",
- "company_tagline": "Ambrosia Pie Company",
- "email": "support@agritheory.dev",
- "password": "admin",
- "chart_of_accounts": "Standard with Numbers",
- "bank_account": "Primary Checking",
- }
- )
- set_defaults_for_tests()
- for modu in frappe.get_all("Module Onboarding"):
- frappe.db.set_value("Module Onboarding", modu, "is_complete", 1)
- frappe.set_value("Website Settings", "Website Settings", "home_page", "login")
- frappe.db.commit()
- create_test_data()
-
-
-def create_test_data():
- settings = frappe._dict(
- {
- "day": getdate().replace(month=1, day=1),
- "company": "Ambrosia Pie Company",
- "company_account": frappe.get_value(
- "Account",
- {
- "account_type": "Bank",
- "company": frappe.defaults.get_defaults().get("company"),
- "is_group": 0,
- },
- ),
- }
- )
- company_address = frappe.new_doc("Address")
- company_address.title = settings.company
- company_address.address_type = "Office"
- company_address.address_line1 = "67C Sweeny Street"
- company_address.city = "Chelsea"
- company_address.state = "MA"
- company_address.pincode = "89077"
- company_address.is_your_company_address = 1
- company_address.append("links", {"link_doctype": "Company", "link_name": settings.company})
- company_address.save()
- cfc = frappe.new_doc("Company")
- cfc.company_name = "Chelsea Fruit Co"
- cfc.default_currency = "USD"
- cfc.create_chart_of_accounts_based_on = "Existing Company"
- cfc.existing_company = settings.company
- cfc.abbr = "CFC"
- cfc.save()
-
- frappe.db.set_single_value("Stock Settings", "valuation_method", "Moving Average")
- frappe.db.set_single_value("Stock Settings", "default_warehouse", "")
- create_warehouses(settings)
- setup_manufacturing_settings(settings)
- create_workstations()
- create_operations()
- create_item_groups(settings)
- create_price_lists(settings)
- create_suppliers(settings)
- create_customers(settings)
- create_items(settings)
- create_boms(settings)
- prod_plan_from_doc = "Sales Order"
- if prod_plan_from_doc == "Sales Order":
- create_sales_order(settings)
- else:
- create_material_request(settings)
- create_production_plan(settings, prod_plan_from_doc)
- create_fruit_material_request(settings)
- create_quotations(settings)
- create_specifications(settings)
-
-
-def create_suppliers(settings):
- if not frappe.db.exists("Supplier Group", "Bakery"):
- bsg = frappe.new_doc("Supplier Group")
- bsg.supplier_group_name = "Bakery"
- bsg.parent_supplier_group = "All Supplier Groups"
- bsg.save()
-
- addresses = frappe._dict({})
- for supplier in suppliers:
- biz = frappe.new_doc("Supplier")
- biz.supplier_name = supplier[0]
- biz.supplier_group = "Bakery"
- biz.country = "United States"
- biz.supplier_default_mode_of_payment = supplier[2]
- if biz.supplier_default_mode_of_payment == "ACH/EFT":
- biz.bank = "Local Bank"
- biz.bank_account = "123456789"
- biz.currency = "USD"
- if biz.supplier_name == "Credible Contract Baking":
- biz.append(
- "subcontracting_defaults",
- {
- "company": settings.company,
- "wip_warehouse": "Credible Contract Baking - APC",
- "return_warehouse": "Baked Goods - APC",
- },
- )
- biz.default_price_list = "Bakery Buying"
- biz.save()
-
- existing_address = frappe.get_value("Address", {"address_line1": supplier[5]["address_line1"]})
- if not existing_address:
- addr = frappe.new_doc("Address")
- addr.address_title = f"{supplier[0]} - {supplier[5]['city']}"
- addr.address_type = "Billing"
- addr.address_line1 = supplier[5]["address_line1"]
- addr.city = supplier[5]["city"]
- addr.state = supplier[5]["state"]
- addr.country = supplier[5]["country"]
- addr.pincode = supplier[5]["pincode"]
- else:
- addr = frappe.get_doc("Address", existing_address)
- addr.append("links", {"link_doctype": "Supplier", "link_name": supplier[0]})
- addr.save()
-
-
-def create_customers(settings):
- for customer_name in customers:
- customer = frappe.new_doc("Customer")
- customer.customer_name = customer_name
- customer.customer_group = "Commercial"
- customer.customer_type = "Company"
- customer.territory = "United States"
- customer.save()
-
-
-def setup_manufacturing_settings(settings):
- mfg_settings = frappe.get_doc("Manufacturing Settings", "Manufacturing Settings")
- mfg_settings.material_consumption = 1
- mfg_settings.default_wip_warehouse = "Kitchen - APC"
- mfg_settings.default_fg_warehouse = "Refrigerated Display - APC"
- mfg_settings.overproduction_percentage_for_work_order = 5.00
- mfg_settings.job_card_excess_transfer = 1
- mfg_settings.save()
-
- if not frappe.db.exists(
- "Account", {"account_name": "Work In Progress", "company": settings.company}
- ):
- wip = frappe.new_doc("Account")
- wip.account_name = "Work in Progress"
- wip.parent_account = "1400 - Stock Assets - APC"
- wip.account_number = "1420"
- wip.company = settings.company
- wip.currency = "USD"
- wip.report_type = "Balance Sheet"
- wip.root_type = "Asset"
- wip.save()
-
- frappe.set_value("Warehouse", "Kitchen - APC", "account", wip.name)
- frappe.set_value(
- "Inventory Tools Settings", settings.company, "enable_work_order_subcontracting", 1
- )
- frappe.set_value("Inventory Tools Settings", settings.company, "create_purchase_orders", 0)
- frappe.set_value("Inventory Tools Settings", settings.company, "enforce_uoms", 1)
- frappe.set_value(
- "Inventory Tools Settings", settings.company, "allow_alternative_workstations", 1
- )
- frappe.set_value("Inventory Tools Settings", settings.company, "create_purchase_orders", 0)
- frappe.set_value(
- "Inventory Tools Settings", settings.company, "overproduction_percentage_for_work_order", 50
- )
- frappe.set_value("Inventory Tools Settings", settings.company, "show_on_website", 1)
- frappe.set_value("Inventory Tools Settings", settings.company, "show_in_listview", 1)
-
-
-def create_workstations():
- for ws in workstations:
- if frappe.db.exists("Workstation", ws[0]):
- continue
- work = frappe.new_doc("Workstation")
- work.workstation_name = ws[0]
- work.production_capacity = ws[1]
- work.save()
-
-
-def create_operations():
- for op in operations:
- if frappe.db.exists("Operation", op[0]):
- continue
- oper = frappe.new_doc("Operation")
- oper.name = op[0]
- oper.workstation = op[1]
- oper.batch_size = op[2]
- oper.description = op[3]
- if len(op) == 5:
- for aw in op[4]:
- oper.append(
- "alternative_workstations",
- {
- "workstation": aw,
- },
- )
- oper.save()
-
-
-def create_item_groups(settings):
- for ig_name in (
- "Baked Goods",
- "Bakery Supplies",
- "Ingredients",
- "Bakery Equipment",
- "Sub Assemblies",
- ):
- if frappe.db.exists("Item Group", ig_name):
- continue
- ig = frappe.new_doc("Item Group")
- ig.item_group_name = ig_name
- ig.parent_item_group = "All Item Groups"
- ig.save()
-
- if not frappe.db.exists("Brand", "Ambrosia Pie Co"):
- brand = frappe.new_doc("Brand")
- brand.brand = "Ambrosia Pie Co"
- brand.save()
-
-
-def create_price_lists(settings):
- if not frappe.db.exists("Price List", "Bakery Buying"):
- pl = frappe.new_doc("Price List")
- pl.price_list_name = "Bakery Buying"
- pl.currency = "USD"
- pl.buying = 1
- pl.append("countries", {"country": "United States"})
- pl.save()
-
- if not frappe.db.exists("Price List", "Bakery Wholesale"):
- pl = frappe.new_doc("Price List")
- pl.price_list_name = "Bakery Wholesale"
- pl.currency = "USD"
- pl.selling = 1
- pl.append("countries", {"country": "United States"})
- pl.save()
-
- if not frappe.db.exists("Pricing Rule", "Bakery Retail"):
- pr = frappe.new_doc("Pricing Rule")
- pr.title = "Bakery Retail"
- pr.selling = 1
- pr.apply_on = "Item Group"
- pr.company = settings.company
- pr.margin_type = "Percentage"
- pr.margin_rate_or_amount = 2.00
- pr.valid_from = settings.day
- pr.for_price_list = "Bakery Wholesale"
- pr.currency = "USD"
- pr.append("item_groups", {"item_group": "Baked Goods"})
- pr.save()
-
-
-def create_items(settings):
- for item in items:
- if frappe.db.exists("Item", item.get("item_code")):
- continue
- i = frappe.new_doc("Item")
- i.item_code = i.item_name = item.get("item_code")
- i.item_group = item.get("item_group")
- i.stock_uom = item.get("uom")
- i.description = item.get("description")
- i.is_stock_item = 0 if item.get("is_stock_item") == 0 else 1
- i.include_item_in_manufacturing = 1
- i.valuation_rate = item.get("valuation_rate") or 0
- i.is_sub_contracted_item = item.get("is_sub_contracted_item") or 0
- i.default_warehouse = settings.get("warehouse")
- i.weight_uom = item.get("weight_uom") if i.is_stock_item else None
- i.weight_per_unit = item.get("weight_per_unit")
- i.default_material_request_type = (
- "Purchase"
- if item.get("item_group") in ("Bakery Supplies", "Ingredients")
- or item.get("is_sub_contracted_item")
- else "Manufacture"
- )
- i.valuation_method = "Moving Average"
- if item.get("uom_conversion_detail"):
- for uom, cf in item.get("uom_conversion_detail").items():
- i.append("uoms", {"uom": uom, "conversion_factor": cf})
- i.is_purchase_item = (
- 1
- if item.get("item_group") in ("Bakery Supplies", "Ingredients")
- or item.get("is_sub_contracted_item")
- else 0
- )
- i.is_sales_item = 1 if item.get("item_group") == "Baked Goods" else 0
- i.sales_uom = "Nos" if i.is_sales_item else None
- i.shelf_life_in_days = 7 if i.is_sales_item else None
- i.brand = "Ambrosia Pie Co" if i.is_sales_item else None
- i.append(
- "item_defaults",
- {
- "company": settings.company,
- "default_warehouse": item.get("default_warehouse"),
- "default_supplier": item.get("default_supplier"),
- "requires_rfq": True if item.get("item_code") == "Cloudberry" else False,
- },
- )
- if i.is_purchase_item and item.get("supplier"):
- if isinstance(item.get("supplier"), list):
- [i.append("supplier_items", {"supplier": s}) for s in item.get("supplier")]
- else:
- i.append("supplier_items", {"supplier": item.get("supplier")})
- i.save()
- if item.get("item_price"):
- ip = frappe.new_doc("Item Price")
- ip.item_code = i.item_code
- ip.uom = i.stock_uom
- ip.price_list = "Bakery Wholesale" if i.is_sales_item else "Bakery Buying"
- ip.buying = 1
- ip.valid_from = "2018-1-1"
- ip.price_list_rate = item.get("item_price")
- ip.save()
- if item.get("available_in_house"):
- se = frappe.new_doc("Stock Entry")
- se.posting_date = settings.day
- se.set_posting_time = 1
- se.stock_entry_type = "Material Receipt"
- se.append(
- "items",
- {
- "item_code": item.get("item_code"),
- "t_warehouse": item.get("default_warehouse"),
- "qty": item.get("opening_qty"),
- "uom": item.get("uom"),
- "stock_uom": item.get("uom"),
- "conversion_factor": 1,
- "basic_rate": item.get("item_price"),
- "expense_account": "1910 - Temporary Opening - APC",
- },
- )
- se.save()
- se.submit()
- if i.is_sales_item:
- website_item = make_website_item(i, True)
- website_item = frappe.get_doc("Website Item", website_item[0])
- website_item.route = f"products/{frappe.scrub(i.name)}"
- website_item.save()
-
-
-def create_warehouses(settings):
- inventory_tools_settings = frappe.get_doc("Inventory Tools Settings", settings.company)
- inventory_tools_settings.enable_work_order_subcontracting = 1
- inventory_tools_settings.create_purchase_orders = 0
- inventory_tools_settings.update_warehouse_path = 1
- inventory_tools_settings.save()
-
- warehouses = [item.get("default_warehouse") for item in items]
- root_wh = frappe.get_value("Warehouse", {"company": settings.company, "is_group": 1})
- if frappe.db.exists("Warehouse", "Stores - APC"):
- frappe.rename_doc("Warehouse", "Stores - APC", "Storeroom - APC", force=True)
- if frappe.db.exists("Warehouse", "Finished Goods - APC"):
- frappe.rename_doc("Warehouse", "Finished Goods - APC", "Baked Goods - APC", force=True)
- frappe.set_value("Warehouse", "Baked Goods - APC", "is_group", 1)
- for wh in frappe.get_all("Warehouse", {"company": settings.company}, ["name", "is_group"]):
- if wh.name not in warehouses and not wh.is_group:
- frappe.delete_doc("Warehouse", wh.name)
- for item in items:
- if frappe.db.exists("Warehouse", item.get("default_warehouse")):
- continue
- wh = frappe.new_doc("Warehouse")
- wh.warehouse_name = item.get("default_warehouse").split(" - ")[0]
- wh.parent_warehouse = root_wh
- wh.company = settings.company
- wh.save()
-
- wh = frappe.new_doc("Warehouse")
- wh.warehouse_name = "Bakery Display"
- wh.parent_warehouse = "Baked Goods - APC"
- wh.company = settings.company
- wh.save()
-
- wh = frappe.get_doc("Warehouse", "Refrigerated Display - APC")
- wh.parent_warehouse = "Baked Goods - APC"
- wh.save()
-
-
-def create_boms(settings):
- for bom in boms[::-1]: # reversed
- if frappe.db.exists("BOM", {"item": bom.get("item")}) and bom.get("item") != "Pie Crust":
- continue
- b = frappe.new_doc("BOM")
- b.item = bom.get("item")
- b.quantity = bom.get("quantity")
- b.uom = bom.get("uom")
- b.company = settings.company
- b.is_default = 0 if bom.get("is_default") == 0 else 1
- b.is_subcontracted = bom.get("is_subcontracted") or 0
- b.overproduction_percentage_for_work_order = bom.get(
- "overproduction_percentage_for_work_order", None
- )
- b.rm_cost_as_per = "Price List"
- b.buying_price_list = "Bakery Buying"
- b.currency = "USD"
- b.with_operations = 0 if bom.get("with_operations") == 0 else 1
- for item in bom.get("items"):
- b.append("items", {**item, "stock_uom": item.get("uom")})
- b.items[-1].bom_no = frappe.get_value("BOM", {"item": item.get("item_code")})
- for operation in bom.get("operations"):
- b.append("operations", {**operation, "hour_rate": 15.00})
- b.save()
- b.submit()
-
-
-def create_sales_order(settings):
- so = frappe.new_doc("Sales Order")
- so.transaction_date = settings.day
- so.customer = customers[0]
- so.order_type = "Sales"
- so.currency = "USD"
- so.selling_price_list = "Bakery Wholesale"
- so.append(
- "items",
- {
- "item_code": "Ambrosia Pie",
- "delivery_date": so.transaction_date,
- "qty": 30,
- "warehouse": "Refrigerated Display - APC",
- },
- )
- so.append(
- "items",
- {
- "item_code": "Double Plum Pie",
- "delivery_date": so.transaction_date,
- "qty": 30,
- "warehouse": "Refrigerated Display - APC",
- },
- )
- so.append(
- "items",
- {
- "item_code": "Gooseberry Pie",
- "delivery_date": so.transaction_date,
- "qty": 10,
- "warehouse": "Refrigerated Display - APC",
- },
- )
- so.append(
- "items",
- {
- "item_code": "Kaduka Key Lime Pie",
- "delivery_date": so.transaction_date,
- "qty": 10,
- "warehouse": "Refrigerated Display - APC",
- },
- )
- so.append(
- "items",
- {
- "item_code": "Pocketful of Bay",
- "delivery_date": so.transaction_date,
- "qty": 10,
- "warehouse": "Refrigerated Display - APC",
- },
- )
- so.append(
- "items",
- {
- "item_code": "Tower of Bay-bel",
- "delivery_date": so.transaction_date,
- "qty": 20,
- "warehouse": "Refrigerated Display - APC",
- },
- )
- so.save()
- so.submit()
-
-
-def create_material_request(settings):
- mr = frappe.new_doc("Material Request")
- mr.material_request_type = "Manufacture"
- mr.schedule_date = mr.transaction_date = settings.day
- mr.title = "Pies"
- mr.company = settings.company
- mr.append(
- "items",
- {
- "item_code": "Ambrosia Pie",
- "schedule_date": mr.schedule_date,
- "qty": 40,
- "warehouse": "Refrigerated Display - APC",
- },
- )
- mr.append(
- "items",
- {
- "item_code": "Double Plum Pie",
- "schedule_date": mr.schedule_date,
- "qty": 40,
- "warehouse": "Refrigerated Display - APC",
- },
- )
- mr.append(
- "items",
- {
- "item_code": "Gooseberry Pie",
- "schedule_date": mr.schedule_date,
- "qty": 10,
- "warehouse": "Refrigerated Display - APC",
- },
- )
- mr.append(
- "items",
- {
- "item_code": "Kaduka Key Lime Pie",
- "schedule_date": mr.schedule_date,
- "qty": 10,
- "warehouse": "Refrigerated Display - APC",
- },
- )
- mr.append(
- "items",
- {
- "item_code": "Pocketful of Bay",
- "delivery_date": mr.schedule_date,
- "qty": 10,
- "warehouse": "Refrigerated Display - APC",
- },
- )
- mr.append(
- "items",
- {
- "item_code": "Tower of Bay-bel",
- "delivery_date": mr.schedule_date,
- "qty": 20,
- "warehouse": "Refrigerated Display - APC",
- },
- )
- mr.save()
- mr.submit()
- mr = frappe.new_doc("Material Request")
- mr.material_request_type = "Purchase"
- mr.schedule_date = mr.transaction_date = settings.day
- mr.title = "Boxes"
- mr.company = settings.company
-
-
-def create_production_plan(settings, prod_plan_from_doc):
- pp = frappe.new_doc("Production Plan")
- pp.posting_date = settings.day
- pp.company = settings.company
- pp.combine_sub_items = 1
- if prod_plan_from_doc == "Sales Order":
- pp.get_items_from = "Sales Order"
- pp.append(
- "sales_orders",
- {
- "sales_order": frappe.get_last_doc("Sales Order").name,
- },
- )
- pp.get_items()
- else:
- pp.get_items_from = "Material Request"
- pp.append(
- "material_requests",
- {
- "material_request": frappe.get_last_doc("Material Request").name,
- },
- )
- pp.get_mr_items()
- for item in pp.po_items:
- item.planned_start_date = settings.day
- pp.get_sub_assembly_items()
- for item in pp.sub_assembly_items:
- item.schedule_date = settings.day
- if item.production_item == "Pie Crust":
- idx = item.idx
- item.type_of_manufacturing = "Subcontract"
- item.supplier = "Credible Contract Baking"
- item.qty = 50
- pp.append("sub_assembly_items", pp.sub_assembly_items[idx - 1].as_dict())
- pp.sub_assembly_items[-1].name = None
- pp.sub_assembly_items[-1].type_of_manufacturing = "In House"
- pp.sub_assembly_items[-1].bom_no = "BOM-Pie Crust-001"
- pp.sub_assembly_items[-1].supplier = None
- pp.for_warehouse = "Storeroom - APC"
- raw_materials = get_items_for_material_requests(
- pp.as_dict(), warehouses=None, get_parent_warehouse_data=None
- )
- for row in raw_materials:
- pp.append(
- "mr_items",
- {
- **row,
- "warehouse": frappe.get_value(
- "Item Default", {"parent": row.get("item_code")}, "default_warehouse"
- ),
- },
- )
- pp.save()
- pp.submit()
-
- pp.make_material_request()
- mr = frappe.get_last_doc("Material Request")
- mr.schedule_date = mr.transaction_date = settings.day
- mr.company = settings.company
- mr.save()
- mr.submit()
-
- pp.make_work_order()
- wos = frappe.get_all("Work Order", {"production_plan": pp.name})
- for wo in wos:
- wo = frappe.get_doc("Work Order", wo)
- wo.wip_warehouse = "Kitchen - APC"
- wo.save()
- wo.submit()
- job_cards = frappe.get_all("Job Card", {"work_order": wo.name})
- start_time = get_datetime()
- for job_card in job_cards:
- job_card = frappe.get_doc("Job Card", job_card)
- batch_size, total_operation_time = frappe.get_value(
- "Operation", job_card.operation, ["batch_size", "total_operation_time"]
- )
- time_in_mins = (total_operation_time / batch_size) * wo.qty
- job_card.append(
- "time_logs",
- {
- "completed_qty": wo.qty,
- "from_time": start_time,
- "to_time": start_time + datetime.timedelta(minutes=time_in_mins),
- "time_in_mins": time_in_mins,
- },
- )
-
-
-def create_fruit_material_request(settings):
- fruits = [
- "Bayberry",
- "Cocoplum",
- "Damson Plum",
- "Gooseberry",
- "Hairless Rambutan",
- "Kaduka Lime",
- "Limequat",
- "Tayberry",
- ]
-
- for fruit in fruits:
- i = frappe.get_doc("Item", fruit)
- i.append(
- "item_defaults",
- {
- "company": "Chelsea Fruit Co",
- "default_warehouse": "Stores - CFC",
- "default_supplier": "Southern Fruit Supply",
- },
- )
- i.save()
- ip = frappe.copy_doc(frappe.get_doc("Item Price", {"item_code": fruit}))
- ip.price_list = "Standard Buying"
- ip.price_list_rate = flt(ip.price_list_rate * 0.75, 2)
- ip.save()
-
- mr = frappe.new_doc("Material Request")
- mr.company = "Chelsea Fruit Co"
- mr.transaction_date = settings.day
- mr.schedule_date = getdate()
- mr.purpose = "Purchase"
- for f in fruits:
- mr.append(
- "items",
- {
- "item_code": f,
- "qty": 100,
- "schedule_date": mr.schedule_date,
- "warehouse": "Stores - CFC",
- "uom": "Pound",
- },
- )
- mr.save()
- mr.submit()
-
-
-def create_quotations(settings):
- quotation = frappe.new_doc("Quotation")
-
- items = ["Ambrosia Pie", "Gooseberry Pie", "Double Plum Pie"]
- for item in items:
- i = frappe.get_doc("Item", item)
- i.append(
- "item_defaults",
- {
- "company": "Chelsea Fruit Co",
- "default_warehouse": "Finished Goods - CFC",
- },
- )
- i.save()
-
- values = {
- "quotation_to": "Customer",
- "order_type": "Sales",
- "party_name": "Almacs Food Group",
- "selling_price_list": "Bakery Wholesale",
- "currency": "USD",
- "conversion_rate": 1,
- "transaction_date": nowdate(),
- "valid_till": add_months(nowdate(), 1),
- "items": [{"item_code": "Ambrosia Pie", "qty": 1}, {"item_code": "Gooseberry Pie", "qty": 5}],
- "company": settings.company,
- }
- quotation.update(values)
- quotation.save()
- quotation.submit()
-
- quotation = frappe.new_doc("Quotation")
- values = {
- "quotation_to": "Customer",
- "order_type": "Sales",
- "party_name": "Almacs Food Group",
- "selling_price_list": "Bakery Wholesale",
- "currency": "USD",
- "conversion_rate": 1,
- "transaction_date": nowdate(),
- "valid_till": add_months(nowdate(), 1),
- "items": [{"item_code": "Ambrosia Pie", "qty": 1}, {"item_code": "Gooseberry Pie", "qty": 5}],
- "company": settings.company,
- }
- quotation.update(values)
- quotation.save()
- quotation.submit()
-
- quotation = frappe.new_doc("Quotation")
- values = {
- "quotation_to": "Customer",
- "order_type": "Sales",
- "party_name": "Downtown Deli",
- "selling_price_list": "Bakery Wholesale",
- "currency": "USD",
- "conversion_rate": 1,
- "transaction_date": nowdate(),
- "valid_till": add_months(nowdate(), 1),
- "items": [{"item_code": "Ambrosia Pie", "qty": 2}, {"item_code": "Double Plum Pie", "qty": 1}],
- "company": settings.company,
- }
- quotation.update(values)
- quotation.save()
- quotation.submit()
-
- quotation = frappe.new_doc("Quotation")
- values = {
- "quotation_to": "Customer",
- "order_type": "Sales",
- "party_name": "Almacs Food Group",
- "selling_price_list": "Bakery Wholesale",
- "currency": "USD",
- "conversion_rate": 1,
- "transaction_date": nowdate(),
- "valid_till": add_months(nowdate(), 1),
- "items": [{"item_code": "Ambrosia Pie", "qty": 5}, {"item_code": "Double Plum Pie", "qty": 10}],
- "company": "Chelsea Fruit Co",
- }
- quotation.update(values)
- quotation.save()
- quotation.submit()
-
-
-def create_specifications(settings=None):
- for c in (
- ("Red", "#E24C4C"),
- ("Blue", "#2490EF"),
- ("Purple", "#8684FF"),
- ("Green", "#8CCF54"),
- ("Yellow", "#FFFF00"),
- ("White", "#EEEEEE"),
- ("Black", "#111111"),
- ):
- if not frappe.db.exists("Color", c[0]):
- color = frappe.new_doc("Color")
- color.name = c[0]
- color.color = c[1]
- color.save()
-
- for spec in specifications:
- if frappe.db.exists("Specification", spec.get("name")):
- s = frappe.get_doc("Specification", spec.get("name"))
- else:
- s = frappe.new_doc("Specification")
- s.name = spec.get("name")
- s.dt = spec.get("dt")
- s.apply_on = spec.get("apply_on")
- s.enabled = spec.get("enabled")
- for at in spec.get("attributes"):
- s.append("attributes", at)
- s.save()
-
-
-def create_demo_specification_values():
- """
- run this if you need to manually create data for demoing faceted search
- bench execute 'inventory_tools.tests.setup.create_demo_specification_values'
- """
- from inventory_tools.tests.test_faceted_search import (
- test_values_updated_on_item_save,
- test_generate_values,
- test_generate_values_on_overlapping_items,
- test_manual_attribute_addition,
- )
-
- test_values_updated_on_item_save()
- test_generate_values()
- test_generate_values_on_overlapping_items()
- test_manual_attribute_addition()
+# Copyright (c) 2024, AgriTheory and contributors
+# For license information, please see license.txt
+
+import datetime
+import shutil
+import frappe
+from pathlib import Path
+from erpnext.manufacturing.doctype.production_plan.production_plan import (
+ get_items_for_material_requests,
+)
+from erpnext.setup.utils import set_defaults_for_tests
+from frappe.desk.page.setup_wizard.setup_wizard import setup_complete
+from frappe.utils.data import add_months, flt, getdate, nowdate, get_datetime
+from webshop.webshop.doctype.website_item.website_item import make_website_item
+
+from inventory_tools.tests.fixtures import (
+ boms,
+ customers,
+ items,
+ operations,
+ specifications,
+ suppliers,
+ workstations,
+)
+
+
+def before_test():
+ frappe.clear_cache()
+ setup_complete(
+ {
+ "currency": "USD",
+ "full_name": "Administrator",
+ "company_name": "Ambrosia Pie Company",
+ "timezone": "America/New_York",
+ "company_abbr": "APC",
+ "domains": ["Distribution"],
+ "country": "United States",
+ "fy_start_date": getdate().replace(month=1, day=1).isoformat(),
+ "fy_end_date": getdate().replace(month=12, day=31).isoformat(),
+ "language": "english",
+ "company_tagline": "Ambrosia Pie Company",
+ "email": "support@agritheory.dev",
+ "password": "admin",
+ "chart_of_accounts": "Standard with Numbers",
+ "bank_account": "Primary Checking",
+ }
+ )
+ set_defaults_for_tests()
+ for modu in frappe.get_all("Module Onboarding"):
+ frappe.db.set_value("Module Onboarding", modu, "is_complete", 1)
+ frappe.set_value("Website Settings", "Website Settings", "home_page", "login")
+ frappe.db.commit()
+ create_test_data()
+
+
+def create_test_data():
+ settings = frappe._dict(
+ {
+ "day": getdate().replace(month=1, day=1),
+ "company": "Ambrosia Pie Company",
+ "company_account": frappe.get_value(
+ "Account",
+ {
+ "account_type": "Bank",
+ "company": frappe.defaults.get_defaults().get("company"),
+ "is_group": 0,
+ },
+ ),
+ }
+ )
+ company_address = frappe.new_doc("Address")
+ company_address.title = settings.company
+ company_address.address_type = "Office"
+ company_address.address_line1 = "67C Sweeny Street"
+ company_address.city = "Chelsea"
+ company_address.state = "MA"
+ company_address.pincode = "89077"
+ company_address.is_your_company_address = 1
+ company_address.append("links", {"link_doctype": "Company", "link_name": settings.company})
+ company_address.save()
+ cfc = frappe.new_doc("Company")
+ cfc.company_name = "Chelsea Fruit Co"
+ cfc.default_currency = "USD"
+ cfc.create_chart_of_accounts_based_on = "Existing Company"
+ cfc.existing_company = settings.company
+ cfc.abbr = "CFC"
+ cfc.save()
+
+ frappe.db.set_single_value("Stock Settings", "valuation_method", "Moving Average")
+ frappe.db.set_single_value("Stock Settings", "default_warehouse", "")
+ create_warehouses(settings)
+ setup_manufacturing_settings(settings)
+ create_workstations(settings)
+ create_operations()
+ create_item_groups(settings)
+ create_price_lists(settings)
+ create_suppliers(settings)
+ create_customers(settings)
+ create_items(settings)
+ create_boms(settings)
+ prod_plan_from_doc = "Sales Order"
+ if prod_plan_from_doc == "Sales Order":
+ create_sales_order(settings)
+ else:
+ create_material_request(settings)
+ create_production_plan(settings, prod_plan_from_doc)
+ create_fruit_material_request(settings)
+ create_quotations(settings)
+ create_specifications(settings)
+
+
+def create_suppliers(settings):
+ if not frappe.db.exists("Supplier Group", "Bakery"):
+ bsg = frappe.new_doc("Supplier Group")
+ bsg.supplier_group_name = "Bakery"
+ bsg.parent_supplier_group = "All Supplier Groups"
+ bsg.save()
+
+ addresses = frappe._dict({})
+ for supplier in suppliers:
+ biz = frappe.new_doc("Supplier")
+ biz.supplier_name = supplier[0]
+ biz.supplier_group = "Bakery"
+ biz.country = "United States"
+ biz.supplier_default_mode_of_payment = supplier[2]
+ if biz.supplier_default_mode_of_payment == "ACH/EFT":
+ biz.bank = "Local Bank"
+ biz.bank_account = "123456789"
+ biz.currency = "USD"
+ if biz.supplier_name == "Credible Contract Baking":
+ biz.append(
+ "subcontracting_defaults",
+ {
+ "company": settings.company,
+ "wip_warehouse": "Credible Contract Baking - APC",
+ "return_warehouse": "Baked Goods - APC",
+ },
+ )
+ biz.default_price_list = "Bakery Buying"
+ biz.save()
+
+ existing_address = frappe.get_value("Address", {"address_line1": supplier[5]["address_line1"]})
+ if not existing_address:
+ addr = frappe.new_doc("Address")
+ addr.address_title = f"{supplier[0]} - {supplier[5]['city']}"
+ addr.address_type = "Billing"
+ addr.address_line1 = supplier[5]["address_line1"]
+ addr.city = supplier[5]["city"]
+ addr.state = supplier[5]["state"]
+ addr.country = supplier[5]["country"]
+ addr.pincode = supplier[5]["pincode"]
+ else:
+ addr = frappe.get_doc("Address", existing_address)
+ addr.append("links", {"link_doctype": "Supplier", "link_name": supplier[0]})
+ addr.save()
+
+
+def create_customers(settings):
+ for customer_name in customers:
+ customer = frappe.new_doc("Customer")
+ customer.customer_name = customer_name
+ customer.customer_group = "Commercial"
+ customer.customer_type = "Company"
+ customer.territory = "United States"
+ customer.save()
+
+
+def setup_manufacturing_settings(settings):
+ mfg_settings = frappe.get_doc("Manufacturing Settings", "Manufacturing Settings")
+ mfg_settings.material_consumption = 1
+ mfg_settings.default_wip_warehouse = "Kitchen - APC"
+ mfg_settings.default_fg_warehouse = "Refrigerated Display - APC"
+ mfg_settings.overproduction_percentage_for_work_order = 5.00
+ mfg_settings.job_card_excess_transfer = 1
+ mfg_settings.save()
+
+ if not frappe.db.exists(
+ "Account", {"account_name": "Work In Progress", "company": settings.company}
+ ):
+ wip = frappe.new_doc("Account")
+ wip.account_name = "Work in Progress"
+ wip.parent_account = "1400 - Stock Assets - APC"
+ wip.account_number = "1420"
+ wip.company = settings.company
+ wip.currency = "USD"
+ wip.report_type = "Balance Sheet"
+ wip.root_type = "Asset"
+ wip.save()
+
+ frappe.set_value("Warehouse", "Kitchen - APC", "account", wip.name)
+ frappe.set_value(
+ "Inventory Tools Settings", settings.company, "enable_work_order_subcontracting", 1
+ )
+ frappe.set_value("Inventory Tools Settings", settings.company, "create_purchase_orders", 0)
+ frappe.set_value("Inventory Tools Settings", settings.company, "enforce_uoms", 1)
+ frappe.set_value(
+ "Inventory Tools Settings", settings.company, "allow_alternative_workstations", 1
+ )
+ frappe.set_value("Inventory Tools Settings", settings.company, "create_purchase_orders", 0)
+ frappe.set_value(
+ "Inventory Tools Settings", settings.company, "overproduction_percentage_for_work_order", 50
+ )
+ frappe.set_value("Inventory Tools Settings", settings.company, "show_on_website", 1)
+ frappe.set_value("Inventory Tools Settings", settings.company, "show_in_listview", 1)
+
+
+def create_workstations(settings):
+ fixtures_dir = (
+ Path(frappe.get_site_path()).resolve().parent.parent
+ / "apps"
+ / "inventory_tools"
+ / "inventory_tools"
+ / "tests"
+ / "fixtures"
+ )
+ if not frappe.db.exists("Plant Floor", "Kitchen"):
+ public_file_path = Path(frappe.get_site_path("public", "files", "floor_plan.png"))
+ shutil.copy((fixtures_dir / "floor_plan.png").resolve(), public_file_path.resolve())
+ pf = frappe.new_doc("Plant Floor")
+ pf.floor_name = "Kitchen"
+ pf.company = settings.company
+ pf.warehouse = "Kitchen - APC"
+ pf.plant_floor_layout = "/files/floor_plan.png"
+ pf.save()
+ for ws in workstations:
+ if frappe.db.exists("Workstation", ws[0]):
+ continue
+ public_file_path = Path(frappe.get_site_path("public", "files", ws[2]))
+ shutil.copy((fixtures_dir / ws[2]).resolve(), public_file_path.resolve())
+ shutil.copy((fixtures_dir / ws[3]).resolve(), public_file_path.resolve())
+ work = frappe.new_doc("Workstation")
+ work.workstation_name = ws[0]
+ work.production_capacity = ws[1]
+ work.plant_floor = "Kitchen"
+ work.off_status_image = f"/files/{ws[2]}"
+ work.on_status_image = f"/files/{ws[3]}"
+ work.save()
+
+
+def create_operations():
+ for op in operations:
+ if frappe.db.exists("Operation", op[0]):
+ continue
+ oper = frappe.new_doc("Operation")
+ oper.name = op[0]
+ oper.workstation = op[1]
+ oper.batch_size = op[2]
+ oper.description = op[3]
+ if len(op) == 5:
+ for aw in op[4]:
+ oper.append(
+ "alternative_workstations",
+ {
+ "workstation": aw,
+ },
+ )
+ oper.save()
+
+
+def create_item_groups(settings):
+ for ig_name in (
+ "Baked Goods",
+ "Bakery Supplies",
+ "Ingredients",
+ "Bakery Equipment",
+ "Sub Assemblies",
+ ):
+ if frappe.db.exists("Item Group", ig_name):
+ continue
+ ig = frappe.new_doc("Item Group")
+ ig.item_group_name = ig_name
+ ig.parent_item_group = "All Item Groups"
+ ig.save()
+
+ if not frappe.db.exists("Brand", "Ambrosia Pie Co"):
+ brand = frappe.new_doc("Brand")
+ brand.brand = "Ambrosia Pie Co"
+ brand.save()
+
+
+def create_price_lists(settings):
+ if not frappe.db.exists("Price List", "Bakery Buying"):
+ pl = frappe.new_doc("Price List")
+ pl.price_list_name = "Bakery Buying"
+ pl.currency = "USD"
+ pl.buying = 1
+ pl.append("countries", {"country": "United States"})
+ pl.save()
+
+ if not frappe.db.exists("Price List", "Bakery Wholesale"):
+ pl = frappe.new_doc("Price List")
+ pl.price_list_name = "Bakery Wholesale"
+ pl.currency = "USD"
+ pl.selling = 1
+ pl.append("countries", {"country": "United States"})
+ pl.save()
+
+ if not frappe.db.exists("Pricing Rule", "Bakery Retail"):
+ pr = frappe.new_doc("Pricing Rule")
+ pr.title = "Bakery Retail"
+ pr.selling = 1
+ pr.apply_on = "Item Group"
+ pr.company = settings.company
+ pr.margin_type = "Percentage"
+ pr.margin_rate_or_amount = 2.00
+ pr.valid_from = settings.day
+ pr.for_price_list = "Bakery Wholesale"
+ pr.currency = "USD"
+ pr.append("item_groups", {"item_group": "Baked Goods"})
+ pr.save()
+
+
+def create_items(settings):
+ for item in items:
+ if frappe.db.exists("Item", item.get("item_code")):
+ continue
+ i = frappe.new_doc("Item")
+ i.item_code = i.item_name = item.get("item_code")
+ i.item_group = item.get("item_group")
+ i.stock_uom = item.get("uom")
+ i.description = item.get("description")
+ i.is_stock_item = 0 if item.get("is_stock_item") == 0 else 1
+ i.include_item_in_manufacturing = 1
+ i.valuation_rate = item.get("valuation_rate") or 0
+ i.is_sub_contracted_item = item.get("is_sub_contracted_item") or 0
+ i.default_warehouse = settings.get("warehouse")
+ i.weight_uom = item.get("weight_uom") if i.is_stock_item else None
+ i.weight_per_unit = item.get("weight_per_unit")
+ i.default_material_request_type = (
+ "Purchase"
+ if item.get("item_group") in ("Bakery Supplies", "Ingredients")
+ or item.get("is_sub_contracted_item")
+ else "Manufacture"
+ )
+ i.valuation_method = "Moving Average"
+ if item.get("uom_conversion_detail"):
+ for uom, cf in item.get("uom_conversion_detail").items():
+ i.append("uoms", {"uom": uom, "conversion_factor": cf})
+ i.is_purchase_item = (
+ 1
+ if item.get("item_group") in ("Bakery Supplies", "Ingredients")
+ or item.get("is_sub_contracted_item")
+ else 0
+ )
+ i.is_sales_item = 1 if item.get("item_group") == "Baked Goods" else 0
+ i.sales_uom = "Nos" if i.is_sales_item else None
+ i.shelf_life_in_days = 7 if i.is_sales_item else None
+ i.brand = "Ambrosia Pie Co" if i.is_sales_item else None
+ i.append(
+ "item_defaults",
+ {
+ "company": settings.company,
+ "default_warehouse": item.get("default_warehouse"),
+ "default_supplier": item.get("default_supplier"),
+ "requires_rfq": True if item.get("item_code") == "Cloudberry" else False,
+ },
+ )
+ if i.is_purchase_item and item.get("supplier"):
+ if isinstance(item.get("supplier"), list):
+ [i.append("supplier_items", {"supplier": s}) for s in item.get("supplier")]
+ else:
+ i.append("supplier_items", {"supplier": item.get("supplier")})
+ i.save()
+ if item.get("item_price"):
+ ip = frappe.new_doc("Item Price")
+ ip.item_code = i.item_code
+ ip.uom = i.stock_uom
+ ip.price_list = "Bakery Wholesale" if i.is_sales_item else "Bakery Buying"
+ ip.buying = 1
+ ip.valid_from = "2018-1-1"
+ ip.price_list_rate = item.get("item_price")
+ ip.save()
+ if item.get("available_in_house"):
+ se = frappe.new_doc("Stock Entry")
+ se.posting_date = settings.day
+ se.set_posting_time = 1
+ se.stock_entry_type = "Material Receipt"
+ se.append(
+ "items",
+ {
+ "item_code": item.get("item_code"),
+ "t_warehouse": item.get("default_warehouse"),
+ "qty": item.get("opening_qty"),
+ "uom": item.get("uom"),
+ "stock_uom": item.get("uom"),
+ "conversion_factor": 1,
+ "basic_rate": item.get("item_price"),
+ "expense_account": "1910 - Temporary Opening - APC",
+ },
+ )
+ se.save()
+ se.submit()
+ if i.is_sales_item:
+ website_item = make_website_item(i, True)
+ website_item = frappe.get_doc("Website Item", website_item[0])
+ website_item.route = f"products/{frappe.scrub(i.name)}"
+ website_item.save()
+
+
+def create_warehouses(settings):
+ inventory_tools_settings = frappe.get_doc("Inventory Tools Settings", settings.company)
+ inventory_tools_settings.enable_work_order_subcontracting = 1
+ inventory_tools_settings.create_purchase_orders = 0
+ inventory_tools_settings.update_warehouse_path = 1
+ inventory_tools_settings.save()
+
+ warehouses = [item.get("default_warehouse") for item in items]
+ root_wh = frappe.get_value("Warehouse", {"company": settings.company, "is_group": 1})
+ if frappe.db.exists("Warehouse", "Stores - APC"):
+ frappe.rename_doc("Warehouse", "Stores - APC", "Storeroom - APC", force=True)
+ if frappe.db.exists("Warehouse", "Finished Goods - APC"):
+ frappe.rename_doc("Warehouse", "Finished Goods - APC", "Baked Goods - APC", force=True)
+ frappe.set_value("Warehouse", "Baked Goods - APC", "is_group", 1)
+ for wh in frappe.get_all("Warehouse", {"company": settings.company}, ["name", "is_group"]):
+ if wh.name not in warehouses and not wh.is_group:
+ frappe.delete_doc("Warehouse", wh.name)
+ for item in items:
+ if frappe.db.exists("Warehouse", item.get("default_warehouse")):
+ continue
+ wh = frappe.new_doc("Warehouse")
+ wh.warehouse_name = item.get("default_warehouse").split(" - ")[0]
+ wh.parent_warehouse = root_wh
+ wh.company = settings.company
+ wh.save()
+
+ wh = frappe.new_doc("Warehouse")
+ wh.warehouse_name = "Bakery Display"
+ wh.parent_warehouse = "Baked Goods - APC"
+ wh.company = settings.company
+ wh.save()
+
+ wh = frappe.get_doc("Warehouse", "Refrigerated Display - APC")
+ wh.parent_warehouse = "Baked Goods - APC"
+ wh.save()
+
+
+def create_boms(settings):
+ for bom in boms[::-1]: # reversed
+ if frappe.db.exists("BOM", {"item": bom.get("item")}) and bom.get("item") != "Pie Crust":
+ continue
+ b = frappe.new_doc("BOM")
+ b.item = bom.get("item")
+ b.quantity = bom.get("quantity")
+ b.uom = bom.get("uom")
+ b.company = settings.company
+ b.is_default = 0 if bom.get("is_default") == 0 else 1
+ b.is_subcontracted = bom.get("is_subcontracted") or 0
+ b.overproduction_percentage_for_work_order = bom.get(
+ "overproduction_percentage_for_work_order", None
+ )
+ b.rm_cost_as_per = "Price List"
+ b.buying_price_list = "Bakery Buying"
+ b.currency = "USD"
+ b.with_operations = 0 if bom.get("with_operations") == 0 else 1
+ for item in bom.get("items"):
+ b.append("items", {**item, "stock_uom": item.get("uom")})
+ b.items[-1].bom_no = frappe.get_value("BOM", {"item": item.get("item_code")})
+ for operation in bom.get("operations"):
+ b.append("operations", {**operation, "hour_rate": 15.00})
+ b.save()
+ b.submit()
+
+
+def create_sales_order(settings):
+ so = frappe.new_doc("Sales Order")
+ so.transaction_date = settings.day
+ so.customer = customers[0]
+ so.order_type = "Sales"
+ so.currency = "USD"
+ so.selling_price_list = "Bakery Wholesale"
+ so.append(
+ "items",
+ {
+ "item_code": "Ambrosia Pie",
+ "delivery_date": so.transaction_date,
+ "qty": 30,
+ "warehouse": "Refrigerated Display - APC",
+ },
+ )
+ so.append(
+ "items",
+ {
+ "item_code": "Double Plum Pie",
+ "delivery_date": so.transaction_date,
+ "qty": 30,
+ "warehouse": "Refrigerated Display - APC",
+ },
+ )
+ so.append(
+ "items",
+ {
+ "item_code": "Gooseberry Pie",
+ "delivery_date": so.transaction_date,
+ "qty": 10,
+ "warehouse": "Refrigerated Display - APC",
+ },
+ )
+ so.append(
+ "items",
+ {
+ "item_code": "Kaduka Key Lime Pie",
+ "delivery_date": so.transaction_date,
+ "qty": 10,
+ "warehouse": "Refrigerated Display - APC",
+ },
+ )
+ so.append(
+ "items",
+ {
+ "item_code": "Pocketful of Bay",
+ "delivery_date": so.transaction_date,
+ "qty": 10,
+ "warehouse": "Refrigerated Display - APC",
+ },
+ )
+ so.append(
+ "items",
+ {
+ "item_code": "Tower of Bay-bel",
+ "delivery_date": so.transaction_date,
+ "qty": 20,
+ "warehouse": "Refrigerated Display - APC",
+ },
+ )
+ so.save()
+ so.submit()
+
+
+def create_material_request(settings):
+ mr = frappe.new_doc("Material Request")
+ mr.material_request_type = "Manufacture"
+ mr.schedule_date = mr.transaction_date = settings.day
+ mr.title = "Pies"
+ mr.company = settings.company
+ mr.append(
+ "items",
+ {
+ "item_code": "Ambrosia Pie",
+ "schedule_date": mr.schedule_date,
+ "qty": 40,
+ "warehouse": "Refrigerated Display - APC",
+ },
+ )
+ mr.append(
+ "items",
+ {
+ "item_code": "Double Plum Pie",
+ "schedule_date": mr.schedule_date,
+ "qty": 40,
+ "warehouse": "Refrigerated Display - APC",
+ },
+ )
+ mr.append(
+ "items",
+ {
+ "item_code": "Gooseberry Pie",
+ "schedule_date": mr.schedule_date,
+ "qty": 10,
+ "warehouse": "Refrigerated Display - APC",
+ },
+ )
+ mr.append(
+ "items",
+ {
+ "item_code": "Kaduka Key Lime Pie",
+ "schedule_date": mr.schedule_date,
+ "qty": 10,
+ "warehouse": "Refrigerated Display - APC",
+ },
+ )
+ mr.append(
+ "items",
+ {
+ "item_code": "Pocketful of Bay",
+ "delivery_date": mr.schedule_date,
+ "qty": 10,
+ "warehouse": "Refrigerated Display - APC",
+ },
+ )
+ mr.append(
+ "items",
+ {
+ "item_code": "Tower of Bay-bel",
+ "delivery_date": mr.schedule_date,
+ "qty": 20,
+ "warehouse": "Refrigerated Display - APC",
+ },
+ )
+ mr.save()
+ mr.submit()
+ mr = frappe.new_doc("Material Request")
+ mr.material_request_type = "Purchase"
+ mr.schedule_date = mr.transaction_date = settings.day
+ mr.title = "Boxes"
+ mr.company = settings.company
+
+
+def create_production_plan(settings, prod_plan_from_doc):
+ pp = frappe.new_doc("Production Plan")
+ pp.posting_date = settings.day
+ pp.company = settings.company
+ pp.combine_sub_items = 1
+ if prod_plan_from_doc == "Sales Order":
+ pp.get_items_from = "Sales Order"
+ pp.append(
+ "sales_orders",
+ {
+ "sales_order": frappe.get_last_doc("Sales Order").name,
+ },
+ )
+ pp.get_items()
+ else:
+ pp.get_items_from = "Material Request"
+ pp.append(
+ "material_requests",
+ {
+ "material_request": frappe.get_last_doc("Material Request").name,
+ },
+ )
+ pp.get_mr_items()
+ for item in pp.po_items:
+ item.planned_start_date = settings.day
+ pp.get_sub_assembly_items()
+ for item in pp.sub_assembly_items:
+ item.schedule_date = settings.day
+ if item.production_item == "Pie Crust":
+ idx = item.idx
+ item.type_of_manufacturing = "Subcontract"
+ item.supplier = "Credible Contract Baking"
+ item.qty = 50
+ pp.append("sub_assembly_items", pp.sub_assembly_items[idx - 1].as_dict())
+ pp.sub_assembly_items[-1].name = None
+ pp.sub_assembly_items[-1].type_of_manufacturing = "In House"
+ pp.sub_assembly_items[-1].bom_no = "BOM-Pie Crust-001"
+ pp.sub_assembly_items[-1].supplier = None
+ pp.for_warehouse = "Storeroom - APC"
+ raw_materials = get_items_for_material_requests(
+ pp.as_dict(), warehouses=None, get_parent_warehouse_data=None
+ )
+ for row in raw_materials:
+ pp.append(
+ "mr_items",
+ {
+ **row,
+ "warehouse": frappe.get_value(
+ "Item Default", {"parent": row.get("item_code")}, "default_warehouse"
+ ),
+ },
+ )
+ pp.save()
+ pp.submit()
+
+ pp.make_material_request()
+ mr = frappe.get_last_doc("Material Request")
+ mr.schedule_date = mr.transaction_date = settings.day
+ mr.company = settings.company
+ mr.save()
+ mr.submit()
+
+ pp.make_work_order()
+ wos = frappe.get_all("Work Order", {"production_plan": pp.name})
+ for wo in wos:
+ wo = frappe.get_doc("Work Order", wo)
+ wo.wip_warehouse = "Kitchen - APC"
+ wo.save()
+ wo.submit()
+ job_cards = frappe.get_all("Job Card", {"work_order": wo.name})
+ start_time = get_datetime()
+ for job_card in job_cards:
+ job_card = frappe.get_doc("Job Card", job_card)
+ batch_size, total_operation_time = frappe.get_value(
+ "Operation", job_card.operation, ["batch_size", "total_operation_time"]
+ )
+ time_in_mins = (total_operation_time / batch_size) * wo.qty
+ job_card.append(
+ "time_logs",
+ {
+ "completed_qty": wo.qty,
+ "from_time": start_time,
+ "to_time": start_time + datetime.timedelta(minutes=time_in_mins),
+ "time_in_mins": time_in_mins,
+ },
+ )
+
+
+def create_fruit_material_request(settings):
+ fruits = [
+ "Bayberry",
+ "Cocoplum",
+ "Damson Plum",
+ "Gooseberry",
+ "Hairless Rambutan",
+ "Kaduka Lime",
+ "Limequat",
+ "Tayberry",
+ ]
+
+ for fruit in fruits:
+ i = frappe.get_doc("Item", fruit)
+ i.append(
+ "item_defaults",
+ {
+ "company": "Chelsea Fruit Co",
+ "default_warehouse": "Stores - CFC",
+ "default_supplier": "Southern Fruit Supply",
+ },
+ )
+ i.save()
+ ip = frappe.copy_doc(frappe.get_doc("Item Price", {"item_code": fruit}))
+ ip.price_list = "Standard Buying"
+ ip.price_list_rate = flt(ip.price_list_rate * 0.75, 2)
+ ip.save()
+
+ mr = frappe.new_doc("Material Request")
+ mr.company = "Chelsea Fruit Co"
+ mr.transaction_date = settings.day
+ mr.schedule_date = getdate()
+ mr.purpose = "Purchase"
+ for f in fruits:
+ mr.append(
+ "items",
+ {
+ "item_code": f,
+ "qty": 100,
+ "schedule_date": mr.schedule_date,
+ "warehouse": "Stores - CFC",
+ "uom": "Pound",
+ },
+ )
+ mr.save()
+ mr.submit()
+
+
+def create_quotations(settings):
+ quotation = frappe.new_doc("Quotation")
+
+ items = ["Ambrosia Pie", "Gooseberry Pie", "Double Plum Pie"]
+ for item in items:
+ i = frappe.get_doc("Item", item)
+ i.append(
+ "item_defaults",
+ {
+ "company": "Chelsea Fruit Co",
+ "default_warehouse": "Finished Goods - CFC",
+ },
+ )
+ i.save()
+
+ values = {
+ "quotation_to": "Customer",
+ "order_type": "Sales",
+ "party_name": "Almacs Food Group",
+ "selling_price_list": "Bakery Wholesale",
+ "currency": "USD",
+ "conversion_rate": 1,
+ "transaction_date": nowdate(),
+ "valid_till": add_months(nowdate(), 1),
+ "items": [{"item_code": "Ambrosia Pie", "qty": 1}, {"item_code": "Gooseberry Pie", "qty": 5}],
+ "company": settings.company,
+ }
+ quotation.update(values)
+ quotation.save()
+ quotation.submit()
+
+ quotation = frappe.new_doc("Quotation")
+ values = {
+ "quotation_to": "Customer",
+ "order_type": "Sales",
+ "party_name": "Almacs Food Group",
+ "selling_price_list": "Bakery Wholesale",
+ "currency": "USD",
+ "conversion_rate": 1,
+ "transaction_date": nowdate(),
+ "valid_till": add_months(nowdate(), 1),
+ "items": [{"item_code": "Ambrosia Pie", "qty": 1}, {"item_code": "Gooseberry Pie", "qty": 5}],
+ "company": settings.company,
+ }
+ quotation.update(values)
+ quotation.save()
+ quotation.submit()
+
+ quotation = frappe.new_doc("Quotation")
+ values = {
+ "quotation_to": "Customer",
+ "order_type": "Sales",
+ "party_name": "Downtown Deli",
+ "selling_price_list": "Bakery Wholesale",
+ "currency": "USD",
+ "conversion_rate": 1,
+ "transaction_date": nowdate(),
+ "valid_till": add_months(nowdate(), 1),
+ "items": [{"item_code": "Ambrosia Pie", "qty": 2}, {"item_code": "Double Plum Pie", "qty": 1}],
+ "company": settings.company,
+ }
+ quotation.update(values)
+ quotation.save()
+ quotation.submit()
+
+ quotation = frappe.new_doc("Quotation")
+ values = {
+ "quotation_to": "Customer",
+ "order_type": "Sales",
+ "party_name": "Almacs Food Group",
+ "selling_price_list": "Bakery Wholesale",
+ "currency": "USD",
+ "conversion_rate": 1,
+ "transaction_date": nowdate(),
+ "valid_till": add_months(nowdate(), 1),
+ "items": [{"item_code": "Ambrosia Pie", "qty": 5}, {"item_code": "Double Plum Pie", "qty": 10}],
+ "company": "Chelsea Fruit Co",
+ }
+ quotation.update(values)
+ quotation.save()
+ quotation.submit()
+
+
+def create_specifications(settings=None):
+ for c in (
+ ("Red", "#E24C4C"),
+ ("Blue", "#2490EF"),
+ ("Purple", "#8684FF"),
+ ("Green", "#8CCF54"),
+ ("Yellow", "#FFFF00"),
+ ("White", "#EEEEEE"),
+ ("Black", "#111111"),
+ ):
+ if not frappe.db.exists("Color", c[0]):
+ color = frappe.new_doc("Color")
+ color.name = c[0]
+ color.color = c[1]
+ color.save()
+
+ for spec in specifications:
+ if frappe.db.exists("Specification", spec.get("name")):
+ s = frappe.get_doc("Specification", spec.get("name"))
+ else:
+ s = frappe.new_doc("Specification")
+ s.name = spec.get("name")
+ s.dt = spec.get("dt")
+ s.apply_on = spec.get("apply_on")
+ s.enabled = spec.get("enabled")
+ for at in spec.get("attributes"):
+ s.append("attributes", at)
+ s.save()
+
+
+def create_demo_specification_values():
+ """
+ run this if you need to manually create data for demoing faceted search
+ bench execute 'inventory_tools.tests.setup.create_demo_specification_values'
+ """
+ from inventory_tools.tests.test_faceted_search import (
+ test_values_updated_on_item_save,
+ test_generate_values,
+ test_generate_values_on_overlapping_items,
+ test_manual_attribute_addition,
+ )
+
+ test_values_updated_on_item_save()
+ test_generate_values()
+ test_generate_values_on_overlapping_items()
+ test_manual_attribute_addition()
diff --git a/package.json b/package.json
index b0370d7..7e3a857 100644
--- a/package.json
+++ b/package.json
@@ -1,24 +1,28 @@
{
"name": "inventory_tools",
- "private": true,
- "license": "MIT",
+ "dependencies": {
+ "@vitejs/plugin-vue": "^4.0.0",
+ "@vueuse/core": "^10.11.0",
+ "fabric": "^6.0.1",
+ "vite": "^4.0.2",
+ "vue": "^3.3.10"
+ },
+ "devDependencies": {},
"repository": {
"type": "git",
"url": "https://github.com/agritheory/inventory_tools.git"
},
+ "publishConfig": {
+ "access": "restricted"
+ },
+ "private": true,
+ "release": {
+ "branches": [
+ "version-14"
+ ]
+ },
"scripts": {
"build": "vite build --config=./inventory_tools/public/js/vite.config.js",
"dev": "vite build --watch --config=./inventory_tools/public/js/vite.config.js"
- },
- "dependencies": {
- "@vueuse/core": "^10.11.0",
- "vue": "^3.4.35"
- },
- "devDependencies": {
- "@vitejs/plugin-vue": "^5.1.2",
- "vite": "^5.3.5"
- },
- "publishConfig": {
- "access": "restricted"
}
}
diff --git a/yarn.lock b/yarn.lock
index 151c9af..0b8ecf1 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -3,304 +3,234 @@
"@babel/parser@^7.24.7":
- version "7.24.8"
- resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.8.tgz#58a4dbbcad7eb1d48930524a3fd93d93e9084c6f"
- integrity sha512-WzfbgXOkGzZiXXCqk43kKwZjzwx4oulxZi3nq2TYL9mOjQv6kYwul9mz6ID36njuL7Xkp6nJEfok848Zj10j/w==
-
-"@esbuild/aix-ppc64@0.21.5":
- version "0.21.5"
- resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz#c7184a326533fcdf1b8ee0733e21c713b975575f"
- integrity sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==
-
-"@esbuild/android-arm64@0.21.5":
- version "0.21.5"
- resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz#09d9b4357780da9ea3a7dfb833a1f1ff439b4052"
- integrity sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==
-
-"@esbuild/android-arm@0.21.5":
- version "0.21.5"
- resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.21.5.tgz#9b04384fb771926dfa6d7ad04324ecb2ab9b2e28"
- integrity sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==
-
-"@esbuild/android-x64@0.21.5":
- version "0.21.5"
- resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.21.5.tgz#29918ec2db754cedcb6c1b04de8cd6547af6461e"
- integrity sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==
-
-"@esbuild/darwin-arm64@0.21.5":
- version "0.21.5"
- resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz#e495b539660e51690f3928af50a76fb0a6ccff2a"
- integrity sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==
-
-"@esbuild/darwin-x64@0.21.5":
- version "0.21.5"
- resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz#c13838fa57372839abdddc91d71542ceea2e1e22"
- integrity sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==
-
-"@esbuild/freebsd-arm64@0.21.5":
- version "0.21.5"
- resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz#646b989aa20bf89fd071dd5dbfad69a3542e550e"
- integrity sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==
-
-"@esbuild/freebsd-x64@0.21.5":
- version "0.21.5"
- resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz#aa615cfc80af954d3458906e38ca22c18cf5c261"
- integrity sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==
-
-"@esbuild/linux-arm64@0.21.5":
- version "0.21.5"
- resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz#70ac6fa14f5cb7e1f7f887bcffb680ad09922b5b"
- integrity sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==
-
-"@esbuild/linux-arm@0.21.5":
- version "0.21.5"
- resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz#fc6fd11a8aca56c1f6f3894f2bea0479f8f626b9"
- integrity sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==
-
-"@esbuild/linux-ia32@0.21.5":
- version "0.21.5"
- resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz#3271f53b3f93e3d093d518d1649d6d68d346ede2"
- integrity sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==
-
-"@esbuild/linux-loong64@0.21.5":
- version "0.21.5"
- resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz#ed62e04238c57026aea831c5a130b73c0f9f26df"
- integrity sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==
-
-"@esbuild/linux-mips64el@0.21.5":
- version "0.21.5"
- resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz#e79b8eb48bf3b106fadec1ac8240fb97b4e64cbe"
- integrity sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==
-
-"@esbuild/linux-ppc64@0.21.5":
- version "0.21.5"
- resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz#5f2203860a143b9919d383ef7573521fb154c3e4"
- integrity sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==
-
-"@esbuild/linux-riscv64@0.21.5":
- version "0.21.5"
- resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz#07bcafd99322d5af62f618cb9e6a9b7f4bb825dc"
- integrity sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==
-
-"@esbuild/linux-s390x@0.21.5":
- version "0.21.5"
- resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz#b7ccf686751d6a3e44b8627ababc8be3ef62d8de"
- integrity sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==
-
-"@esbuild/linux-x64@0.21.5":
- version "0.21.5"
- resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz#6d8f0c768e070e64309af8004bb94e68ab2bb3b0"
- integrity sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==
-
-"@esbuild/netbsd-x64@0.21.5":
- version "0.21.5"
- resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz#bbe430f60d378ecb88decb219c602667387a6047"
- integrity sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==
-
-"@esbuild/openbsd-x64@0.21.5":
- version "0.21.5"
- resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz#99d1cf2937279560d2104821f5ccce220cb2af70"
- integrity sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==
-
-"@esbuild/sunos-x64@0.21.5":
- version "0.21.5"
- resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz#08741512c10d529566baba837b4fe052c8f3487b"
- integrity sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==
-
-"@esbuild/win32-arm64@0.21.5":
- version "0.21.5"
- resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz#675b7385398411240735016144ab2e99a60fc75d"
- integrity sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==
-
-"@esbuild/win32-ia32@0.21.5":
- version "0.21.5"
- resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz#1bfc3ce98aa6ca9a0969e4d2af72144c59c1193b"
- integrity sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==
-
-"@esbuild/win32-x64@0.21.5":
- version "0.21.5"
- resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz#acad351d582d157bb145535db2a6ff53dd514b5c"
- integrity sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.7.tgz#9a5226f92f0c5c8ead550b750f5608e766c8ce85"
+ integrity sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==
+
+"@esbuild/android-arm64@0.18.20":
+ version "0.18.20"
+ resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz#984b4f9c8d0377443cc2dfcef266d02244593622"
+ integrity sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==
+
+"@esbuild/android-arm@0.18.20":
+ version "0.18.20"
+ resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.18.20.tgz#fedb265bc3a589c84cc11f810804f234947c3682"
+ integrity sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==
+
+"@esbuild/android-x64@0.18.20":
+ version "0.18.20"
+ resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.18.20.tgz#35cf419c4cfc8babe8893d296cd990e9e9f756f2"
+ integrity sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==
+
+"@esbuild/darwin-arm64@0.18.20":
+ version "0.18.20"
+ resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz#08172cbeccf95fbc383399a7f39cfbddaeb0d7c1"
+ integrity sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==
+
+"@esbuild/darwin-x64@0.18.20":
+ version "0.18.20"
+ resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz#d70d5790d8bf475556b67d0f8b7c5bdff053d85d"
+ integrity sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==
+
+"@esbuild/freebsd-arm64@0.18.20":
+ version "0.18.20"
+ resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz#98755cd12707f93f210e2494d6a4b51b96977f54"
+ integrity sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==
+
+"@esbuild/freebsd-x64@0.18.20":
+ version "0.18.20"
+ resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz#c1eb2bff03915f87c29cece4c1a7fa1f423b066e"
+ integrity sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==
+
+"@esbuild/linux-arm64@0.18.20":
+ version "0.18.20"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz#bad4238bd8f4fc25b5a021280c770ab5fc3a02a0"
+ integrity sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==
+
+"@esbuild/linux-arm@0.18.20":
+ version "0.18.20"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz#3e617c61f33508a27150ee417543c8ab5acc73b0"
+ integrity sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==
+
+"@esbuild/linux-ia32@0.18.20":
+ version "0.18.20"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz#699391cccba9aee6019b7f9892eb99219f1570a7"
+ integrity sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==
+
+"@esbuild/linux-loong64@0.18.20":
+ version "0.18.20"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz#e6fccb7aac178dd2ffb9860465ac89d7f23b977d"
+ integrity sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==
+
+"@esbuild/linux-mips64el@0.18.20":
+ version "0.18.20"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz#eeff3a937de9c2310de30622a957ad1bd9183231"
+ integrity sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==
+
+"@esbuild/linux-ppc64@0.18.20":
+ version "0.18.20"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz#2f7156bde20b01527993e6881435ad79ba9599fb"
+ integrity sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==
+
+"@esbuild/linux-riscv64@0.18.20":
+ version "0.18.20"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz#6628389f210123d8b4743045af8caa7d4ddfc7a6"
+ integrity sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==
+
+"@esbuild/linux-s390x@0.18.20":
+ version "0.18.20"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz#255e81fb289b101026131858ab99fba63dcf0071"
+ integrity sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==
+
+"@esbuild/linux-x64@0.18.20":
+ version "0.18.20"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz#c7690b3417af318a9b6f96df3031a8865176d338"
+ integrity sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==
+
+"@esbuild/netbsd-x64@0.18.20":
+ version "0.18.20"
+ resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz#30e8cd8a3dded63975e2df2438ca109601ebe0d1"
+ integrity sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==
+
+"@esbuild/openbsd-x64@0.18.20":
+ version "0.18.20"
+ resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz#7812af31b205055874c8082ea9cf9ab0da6217ae"
+ integrity sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==
+
+"@esbuild/sunos-x64@0.18.20":
+ version "0.18.20"
+ resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz#d5c275c3b4e73c9b0ecd38d1ca62c020f887ab9d"
+ integrity sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==
+
+"@esbuild/win32-arm64@0.18.20":
+ version "0.18.20"
+ resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz#73bc7f5a9f8a77805f357fab97f290d0e4820ac9"
+ integrity sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==
+
+"@esbuild/win32-ia32@0.18.20":
+ version "0.18.20"
+ resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz#ec93cbf0ef1085cc12e71e0d661d20569ff42102"
+ integrity sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==
+
+"@esbuild/win32-x64@0.18.20":
+ version "0.18.20"
+ resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz#786c5f41f043b07afb1af37683d7c33668858f6d"
+ integrity sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==
"@jridgewell/sourcemap-codec@^1.4.15":
- version "1.5.0"
- resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a"
- integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==
-
-"@rollup/rollup-android-arm-eabi@4.20.0":
- version "4.20.0"
- resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.20.0.tgz#c3f5660f67030c493a981ac1d34ee9dfe1d8ec0f"
- integrity sha512-TSpWzflCc4VGAUJZlPpgAJE1+V60MePDQnBd7PPkpuEmOy8i87aL6tinFGKBFKuEDikYpig72QzdT3QPYIi+oA==
-
-"@rollup/rollup-android-arm64@4.20.0":
- version "4.20.0"
- resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.20.0.tgz#64161f0b67050023a3859e723570af54a82cff5c"
- integrity sha512-u00Ro/nok7oGzVuh/FMYfNoGqxU5CPWz1mxV85S2w9LxHR8OoMQBuSk+3BKVIDYgkpeOET5yXkx90OYFc+ytpQ==
-
-"@rollup/rollup-darwin-arm64@4.20.0":
- version "4.20.0"
- resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.20.0.tgz#25f3d57b1da433097cfebc89341b355901615763"
- integrity sha512-uFVfvzvsdGtlSLuL0ZlvPJvl6ZmrH4CBwLGEFPe7hUmf7htGAN+aXo43R/V6LATyxlKVC/m6UsLb7jbG+LG39Q==
-
-"@rollup/rollup-darwin-x64@4.20.0":
- version "4.20.0"
- resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.20.0.tgz#d8ddaffb636cc2f59222c50316e27771e48966df"
- integrity sha512-xbrMDdlev53vNXexEa6l0LffojxhqDTBeL+VUxuuIXys4x6xyvbKq5XqTXBCEUA8ty8iEJblHvFaWRJTk/icAQ==
-
-"@rollup/rollup-linux-arm-gnueabihf@4.20.0":
- version "4.20.0"
- resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.20.0.tgz#41bd4fcffa20fb84f3dbac6c5071638f46151885"
- integrity sha512-jMYvxZwGmoHFBTbr12Xc6wOdc2xA5tF5F2q6t7Rcfab68TT0n+r7dgawD4qhPEvasDsVpQi+MgDzj2faOLsZjA==
-
-"@rollup/rollup-linux-arm-musleabihf@4.20.0":
- version "4.20.0"
- resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.20.0.tgz#842077c5113a747eb5686f19f2f18c33ecc0acc8"
- integrity sha512-1asSTl4HKuIHIB1GcdFHNNZhxAYEdqML/MW4QmPS4G0ivbEcBr1JKlFLKsIRqjSwOBkdItn3/ZDlyvZ/N6KPlw==
-
-"@rollup/rollup-linux-arm64-gnu@4.20.0":
- version "4.20.0"
- resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.20.0.tgz#65d1d5b6778848f55b7823958044bf3e8737e5b7"
- integrity sha512-COBb8Bkx56KldOYJfMf6wKeYJrtJ9vEgBRAOkfw6Ens0tnmzPqvlpjZiLgkhg6cA3DGzCmLmmd319pmHvKWWlQ==
-
-"@rollup/rollup-linux-arm64-musl@4.20.0":
- version "4.20.0"
- resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.20.0.tgz#50eef7d6e24d0fe3332200bb666cad2be8afcf86"
- integrity sha512-+it+mBSyMslVQa8wSPvBx53fYuZK/oLTu5RJoXogjk6x7Q7sz1GNRsXWjn6SwyJm8E/oMjNVwPhmNdIjwP135Q==
-
-"@rollup/rollup-linux-powerpc64le-gnu@4.20.0":
- version "4.20.0"
- resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.20.0.tgz#8837e858f53c84607f05ad0602943e96d104c6b4"
- integrity sha512-yAMvqhPfGKsAxHN8I4+jE0CpLWD8cv4z7CK7BMmhjDuz606Q2tFKkWRY8bHR9JQXYcoLfopo5TTqzxgPUjUMfw==
-
-"@rollup/rollup-linux-riscv64-gnu@4.20.0":
- version "4.20.0"
- resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.20.0.tgz#c894ade2300caa447757ddf45787cca246e816a4"
- integrity sha512-qmuxFpfmi/2SUkAw95TtNq/w/I7Gpjurx609OOOV7U4vhvUhBcftcmXwl3rqAek+ADBwSjIC4IVNLiszoj3dPA==
-
-"@rollup/rollup-linux-s390x-gnu@4.20.0":
- version "4.20.0"
- resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.20.0.tgz#5841e5390d4c82dd5cdf7b2c95a830e3c2f47dd3"
- integrity sha512-I0BtGXddHSHjV1mqTNkgUZLnS3WtsqebAXv11D5BZE/gfw5KoyXSAXVqyJximQXNvNzUo4GKlCK/dIwXlz+jlg==
-
-"@rollup/rollup-linux-x64-gnu@4.20.0":
- version "4.20.0"
- resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.20.0.tgz#cc1f26398bf777807a99226dc13f47eb0f6c720d"
- integrity sha512-y+eoL2I3iphUg9tN9GB6ku1FA8kOfmF4oUEWhztDJ4KXJy1agk/9+pejOuZkNFhRwHAOxMsBPLbXPd6mJiCwew==
-
-"@rollup/rollup-linux-x64-musl@4.20.0":
- version "4.20.0"
- resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.20.0.tgz#1507465d9056e0502a590d4c1a00b4d7b1fda370"
- integrity sha512-hM3nhW40kBNYUkZb/r9k2FKK+/MnKglX7UYd4ZUy5DJs8/sMsIbqWK2piZtVGE3kcXVNj3B2IrUYROJMMCikNg==
-
-"@rollup/rollup-win32-arm64-msvc@4.20.0":
- version "4.20.0"
- resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.20.0.tgz#86a221f01a2c248104dd0defb4da119f2a73642e"
- integrity sha512-psegMvP+Ik/Bg7QRJbv8w8PAytPA7Uo8fpFjXyCRHWm6Nt42L+JtoqH8eDQ5hRP7/XW2UiIriy1Z46jf0Oa1kA==
-
-"@rollup/rollup-win32-ia32-msvc@4.20.0":
- version "4.20.0"
- resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.20.0.tgz#8bc8f77e02760aa664694b4286d6fbea7f1331c5"
- integrity sha512-GabekH3w4lgAJpVxkk7hUzUf2hICSQO0a/BLFA11/RMxQT92MabKAqyubzDZmMOC/hcJNlc+rrypzNzYl4Dx7A==
-
-"@rollup/rollup-win32-x64-msvc@4.20.0":
- version "4.20.0"
- resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.20.0.tgz#601fffee719a1e8447f908aca97864eec23b2784"
- integrity sha512-aJ1EJSuTdGnM6qbVC4B5DSmozPTqIag9fSzXRNNo+humQLG89XpPgdt16Ia56ORD7s+H8Pmyx44uczDQ0yDzpg==
-
-"@types/estree@1.0.5":
- version "1.0.5"
- resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4"
- integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==
+ version "1.4.15"
+ resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32"
+ integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==
+
+"@mapbox/node-pre-gyp@^1.0.0":
+ version "1.0.11"
+ resolved "https://registry.yarnpkg.com/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz#417db42b7f5323d79e93b34a6d7a2a12c0df43fa"
+ integrity sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==
+ dependencies:
+ detect-libc "^2.0.0"
+ https-proxy-agent "^5.0.0"
+ make-dir "^3.1.0"
+ node-fetch "^2.6.7"
+ nopt "^5.0.0"
+ npmlog "^5.0.1"
+ rimraf "^3.0.2"
+ semver "^7.3.5"
+ tar "^6.1.11"
+
+"@tootallnate/once@2":
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf"
+ integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==
"@types/web-bluetooth@^0.0.20":
version "0.0.20"
resolved "https://registry.yarnpkg.com/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz#f066abfcd1cbe66267cdbbf0de010d8a41b41597"
integrity sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==
-"@vitejs/plugin-vue@^5.1.2":
- version "5.1.2"
- resolved "https://registry.yarnpkg.com/@vitejs/plugin-vue/-/plugin-vue-5.1.2.tgz#f11091e0130eca6c1ca8cfb85ee71ea53b255d31"
- integrity sha512-nY9IwH12qeiJqumTCLJLE7IiNx7HZ39cbHaysEUd+Myvbz9KAqd2yq+U01Kab1R/H1BmiyM2ShTYlNH32Fzo3A==
+"@vitejs/plugin-vue@^4.0.0":
+ version "4.6.2"
+ resolved "https://registry.yarnpkg.com/@vitejs/plugin-vue/-/plugin-vue-4.6.2.tgz#057d2ded94c4e71b94e9814f92dcd9306317aa46"
+ integrity sha512-kqf7SGFoG+80aZG6Pf+gsZIVvGSCKE98JbiWqcCV9cThtg91Jav0yvYFC9Zb+jKetNGF6ZKeoaxgZfND21fWKw==
-"@vue/compiler-core@3.4.35":
- version "3.4.35"
- resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.4.35.tgz#421922a75ecabf1aabc6b7a2ce98b5acb2fc2d65"
- integrity sha512-gKp0zGoLnMYtw4uS/SJRRO7rsVggLjvot3mcctlMXunYNsX+aRJDqqw/lV5/gHK91nvaAAlWFgdVl020AW1Prg==
+"@vue/compiler-core@3.4.31":
+ version "3.4.31"
+ resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.4.31.tgz#b51a76f1b30e9b5eba0553264dff0f171aedb7c6"
+ integrity sha512-skOiodXWTV3DxfDhB4rOf3OGalpITLlgCeOwb+Y9GJpfQ8ErigdBUHomBzvG78JoVE8MJoQsb+qhZiHfKeNeEg==
dependencies:
"@babel/parser" "^7.24.7"
- "@vue/shared" "3.4.35"
+ "@vue/shared" "3.4.31"
entities "^4.5.0"
estree-walker "^2.0.2"
source-map-js "^1.2.0"
-"@vue/compiler-dom@3.4.35":
- version "3.4.35"
- resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.4.35.tgz#cd0881f1b4ed655cd96367bce4845f87023a5a2d"
- integrity sha512-pWIZRL76/oE/VMhdv/ovZfmuooEni6JPG1BFe7oLk5DZRo/ImydXijoZl/4kh2406boRQ7lxTYzbZEEXEhj9NQ==
+"@vue/compiler-dom@3.4.31":
+ version "3.4.31"
+ resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.4.31.tgz#30961ca847f5d6ad18ffa26236c219f61b195f6b"
+ integrity sha512-wK424WMXsG1IGMyDGyLqB+TbmEBFM78hIsOJ9QwUVLGrcSk0ak6zYty7Pj8ftm7nEtdU/DGQxAXp0/lM/2cEpQ==
dependencies:
- "@vue/compiler-core" "3.4.35"
- "@vue/shared" "3.4.35"
+ "@vue/compiler-core" "3.4.31"
+ "@vue/shared" "3.4.31"
-"@vue/compiler-sfc@3.4.35":
- version "3.4.35"
- resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.4.35.tgz#16f87dd3bdab64cef14d3a6fcf53f8673e404071"
- integrity sha512-xacnRS/h/FCsjsMfxBkzjoNxyxEyKyZfBch/P4vkLRvYJwe5ChXmZZrj8Dsed/752H2Q3JE8kYu9Uyha9J6PgA==
+"@vue/compiler-sfc@3.4.31":
+ version "3.4.31"
+ resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.4.31.tgz#cc6bfccda17df8268cc5440842277f61623c591f"
+ integrity sha512-einJxqEw8IIJxzmnxmJBuK2usI+lJonl53foq+9etB2HAzlPjAS/wa7r0uUpXw5ByX3/0uswVSrjNb17vJm1kQ==
dependencies:
"@babel/parser" "^7.24.7"
- "@vue/compiler-core" "3.4.35"
- "@vue/compiler-dom" "3.4.35"
- "@vue/compiler-ssr" "3.4.35"
- "@vue/shared" "3.4.35"
+ "@vue/compiler-core" "3.4.31"
+ "@vue/compiler-dom" "3.4.31"
+ "@vue/compiler-ssr" "3.4.31"
+ "@vue/shared" "3.4.31"
estree-walker "^2.0.2"
magic-string "^0.30.10"
- postcss "^8.4.40"
+ postcss "^8.4.38"
source-map-js "^1.2.0"
-"@vue/compiler-ssr@3.4.35":
- version "3.4.35"
- resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.4.35.tgz#0774c9a0afed74d71615209904b38f3fa9711adb"
- integrity sha512-7iynB+0KB1AAJKk/biENTV5cRGHRdbdaD7Mx3nWcm1W8bVD6QmnH3B4AHhQQ1qZHhqFwzEzMwiytXm3PX1e60A==
+"@vue/compiler-ssr@3.4.31":
+ version "3.4.31"
+ resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.4.31.tgz#f62ffecdf15bacb883d0099780cf9a1e3654bfc4"
+ integrity sha512-RtefmITAje3fJ8FSg1gwgDhdKhZVntIVbwupdyZDSifZTRMiWxWehAOTCc8/KZDnBOcYQ4/9VWxsTbd3wT0hAA==
dependencies:
- "@vue/compiler-dom" "3.4.35"
- "@vue/shared" "3.4.35"
+ "@vue/compiler-dom" "3.4.31"
+ "@vue/shared" "3.4.31"
-"@vue/reactivity@3.4.35":
- version "3.4.35"
- resolved "https://registry.yarnpkg.com/@vue/reactivity/-/reactivity-3.4.35.tgz#dfbb4f5371da1290ac86e3313d0e9a68bb0ab38d"
- integrity sha512-Ggtz7ZZHakriKioveJtPlStYardwQH6VCs9V13/4qjHSQb/teE30LVJNrbBVs4+aoYGtTQKJbTe4CWGxVZrvEw==
+"@vue/reactivity@3.4.31":
+ version "3.4.31"
+ resolved "https://registry.yarnpkg.com/@vue/reactivity/-/reactivity-3.4.31.tgz#eda80e90c4f9d7659efe1f5ed99c2dfdc9e93d77"
+ integrity sha512-VGkTani8SOoVkZNds1PfJ/T1SlAIOf8E58PGAhIOUDYPC4GAmFA2u/E14TDAFcf3vVDKunc4QqCe/SHr8xC65Q==
dependencies:
- "@vue/shared" "3.4.35"
+ "@vue/shared" "3.4.31"
-"@vue/runtime-core@3.4.35":
- version "3.4.35"
- resolved "https://registry.yarnpkg.com/@vue/runtime-core/-/runtime-core-3.4.35.tgz#c036013a7b1bbe0d14a6b76eb4355dae6690d2e6"
- integrity sha512-D+BAjFoWwT5wtITpSxwqfWZiBClhBbR+bm0VQlWYFOadUUXFo+5wbe9ErXhLvwguPiLZdEF13QAWi2vP3ZD5tA==
+"@vue/runtime-core@3.4.31":
+ version "3.4.31"
+ resolved "https://registry.yarnpkg.com/@vue/runtime-core/-/runtime-core-3.4.31.tgz#ad3a41ad76385c0429e3e4dbefb81918494e10cf"
+ integrity sha512-LDkztxeUPazxG/p8c5JDDKPfkCDBkkiNLVNf7XZIUnJ+66GVGkP+TIh34+8LtPisZ+HMWl2zqhIw0xN5MwU1cw==
dependencies:
- "@vue/reactivity" "3.4.35"
- "@vue/shared" "3.4.35"
+ "@vue/reactivity" "3.4.31"
+ "@vue/shared" "3.4.31"
-"@vue/runtime-dom@3.4.35":
- version "3.4.35"
- resolved "https://registry.yarnpkg.com/@vue/runtime-dom/-/runtime-dom-3.4.35.tgz#74254c7c327163d692e1d7d2b6d9e92463744e90"
- integrity sha512-yGOlbos+MVhlS5NWBF2HDNgblG8e2MY3+GigHEyR/dREAluvI5tuUUgie3/9XeqhPE4LF0i2wjlduh5thnfOqw==
+"@vue/runtime-dom@3.4.31":
+ version "3.4.31"
+ resolved "https://registry.yarnpkg.com/@vue/runtime-dom/-/runtime-dom-3.4.31.tgz#bae7ad844f944af33699c73581bc36125bab96ce"
+ integrity sha512-2Auws3mB7+lHhTFCg8E9ZWopA6Q6L455EcU7bzcQ4x6Dn4cCPuqj6S2oBZgN2a8vJRS/LSYYxwFFq2Hlx3Fsaw==
dependencies:
- "@vue/reactivity" "3.4.35"
- "@vue/runtime-core" "3.4.35"
- "@vue/shared" "3.4.35"
+ "@vue/reactivity" "3.4.31"
+ "@vue/runtime-core" "3.4.31"
+ "@vue/shared" "3.4.31"
csstype "^3.1.3"
-"@vue/server-renderer@3.4.35":
- version "3.4.35"
- resolved "https://registry.yarnpkg.com/@vue/server-renderer/-/server-renderer-3.4.35.tgz#188e94e82d8e729ba7b40dd91d10678b85f77c6b"
- integrity sha512-iZ0e/u9mRE4T8tNhlo0tbA+gzVkgv8r5BX6s1kRbOZqfpq14qoIvCZ5gIgraOmYkMYrSEZgkkojFPr+Nyq/Mnw==
+"@vue/server-renderer@3.4.31":
+ version "3.4.31"
+ resolved "https://registry.yarnpkg.com/@vue/server-renderer/-/server-renderer-3.4.31.tgz#bbe990f793c36d62d05bdbbaf142511d53e159fd"
+ integrity sha512-D5BLbdvrlR9PE3by9GaUp1gQXlCNadIZytMIb8H2h3FMWJd4oUfkUTEH2wAr3qxoRz25uxbTcbqd3WKlm9EHQA==
dependencies:
- "@vue/compiler-ssr" "3.4.35"
- "@vue/shared" "3.4.35"
+ "@vue/compiler-ssr" "3.4.31"
+ "@vue/shared" "3.4.31"
-"@vue/shared@3.4.35":
- version "3.4.35"
- resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.4.35.tgz#5432f4b1c79e763fcf78cc830faf59ff01248968"
- integrity sha512-hvuhBYYDe+b1G8KHxsQ0diDqDMA8D9laxWZhNAjE83VZb5UDaXl9Xnz7cGdDSyiHM90qqI/CyGMcpBpiDy6VVQ==
+"@vue/shared@3.4.31":
+ version "3.4.31"
+ resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.4.31.tgz#af9981f57def2c3f080c14bf219314fc0dc808a0"
+ integrity sha512-Yp3wtJk//8cO4NItOPpi3QkLExAr/aLBGZMmTtW9WpdwBCJpRM6zj9WgWktXAl8IDIozwNMByT45JP3tO3ACWA==
"@vueuse/core@^10.11.0":
version "10.11.0"
@@ -324,55 +254,411 @@
dependencies:
vue-demi ">=0.14.8"
+abab@^2.0.6:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291"
+ integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==
+
+abbrev@1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
+ integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==
+
+acorn-globals@^7.0.0:
+ version "7.0.1"
+ resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-7.0.1.tgz#0dbf05c44fa7c94332914c02066d5beff62c40c3"
+ integrity sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==
+ dependencies:
+ acorn "^8.1.0"
+ acorn-walk "^8.0.2"
+
+acorn-walk@^8.0.2:
+ version "8.3.3"
+ resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.3.tgz#9caeac29eefaa0c41e3d4c65137de4d6f34df43e"
+ integrity sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==
+ dependencies:
+ acorn "^8.11.0"
+
+acorn@^8.1.0, acorn@^8.11.0, acorn@^8.8.1:
+ version "8.12.1"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.12.1.tgz#71616bdccbe25e27a54439e0046e89ca76df2248"
+ integrity sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==
+
+agent-base@6:
+ version "6.0.2"
+ resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77"
+ integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==
+ dependencies:
+ debug "4"
+
+ansi-regex@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304"
+ integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==
+
+"aproba@^1.0.3 || ^2.0.0":
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc"
+ integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==
+
+are-we-there-yet@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz#372e0e7bd279d8e94c653aaa1f67200884bf3e1c"
+ integrity sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==
+ dependencies:
+ delegates "^1.0.0"
+ readable-stream "^3.6.0"
+
+asynckit@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
+ integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==
+
+balanced-match@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
+ integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
+
+brace-expansion@^1.1.7:
+ version "1.1.11"
+ resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
+ integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==
+ dependencies:
+ balanced-match "^1.0.0"
+ concat-map "0.0.1"
+
+canvas@^2.11.2:
+ version "2.11.2"
+ resolved "https://registry.yarnpkg.com/canvas/-/canvas-2.11.2.tgz#553d87b1e0228c7ac0fc72887c3adbac4abbd860"
+ integrity sha512-ItanGBMrmRV7Py2Z+Xhs7cT+FNt5K0vPL4p9EZ/UX/Mu7hFbkxSjKF2KVtPwX7UYWp7dRKnrTvReflgrItJbdw==
+ dependencies:
+ "@mapbox/node-pre-gyp" "^1.0.0"
+ nan "^2.17.0"
+ simple-get "^3.0.3"
+
+chownr@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece"
+ integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==
+
+color-support@^1.1.2:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2"
+ integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==
+
+combined-stream@^1.0.8:
+ version "1.0.8"
+ resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
+ integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==
+ dependencies:
+ delayed-stream "~1.0.0"
+
+concat-map@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
+ integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==
+
+console-control-strings@^1.0.0, console-control-strings@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e"
+ integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==
+
+cssom@^0.5.0:
+ version "0.5.0"
+ resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.5.0.tgz#d254fa92cd8b6fbd83811b9fbaed34663cc17c36"
+ integrity sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==
+
+cssom@~0.3.6:
+ version "0.3.8"
+ resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a"
+ integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==
+
+cssstyle@^2.3.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852"
+ integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==
+ dependencies:
+ cssom "~0.3.6"
+
csstype@^3.1.3:
version "3.1.3"
resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81"
integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==
-entities@^4.5.0:
+data-urls@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-3.0.2.tgz#9cf24a477ae22bcef5cd5f6f0bfbc1d2d3be9143"
+ integrity sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==
+ dependencies:
+ abab "^2.0.6"
+ whatwg-mimetype "^3.0.0"
+ whatwg-url "^11.0.0"
+
+debug@4:
+ version "4.3.5"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.5.tgz#e83444eceb9fedd4a1da56d671ae2446a01a6e1e"
+ integrity sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==
+ dependencies:
+ ms "2.1.2"
+
+decimal.js@^10.4.2:
+ version "10.4.3"
+ resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23"
+ integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==
+
+decompress-response@^4.2.0:
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-4.2.1.tgz#414023cc7a302da25ce2ec82d0d5238ccafd8986"
+ integrity sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==
+ dependencies:
+ mimic-response "^2.0.0"
+
+delayed-stream@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
+ integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==
+
+delegates@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a"
+ integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==
+
+detect-libc@^2.0.0:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.3.tgz#f0cd503b40f9939b894697d19ad50895e30cf700"
+ integrity sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==
+
+domexception@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/domexception/-/domexception-4.0.0.tgz#4ad1be56ccadc86fc76d033353999a8037d03673"
+ integrity sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==
+ dependencies:
+ webidl-conversions "^7.0.0"
+
+emoji-regex@^8.0.0:
+ version "8.0.0"
+ resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
+ integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
+
+entities@^4.4.0, entities@^4.5.0:
version "4.5.0"
resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48"
integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==
-esbuild@^0.21.3:
- version "0.21.5"
- resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.21.5.tgz#9ca301b120922959b766360d8ac830da0d02997d"
- integrity sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==
+
+esbuild@^0.18.10:
+ version "0.18.20"
+ resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.18.20.tgz#4709f5a34801b43b799ab7d6d82f7284a9b7a7a6"
+ integrity sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==
+ optionalDependencies:
+ "@esbuild/android-arm" "0.18.20"
+ "@esbuild/android-arm64" "0.18.20"
+ "@esbuild/android-x64" "0.18.20"
+ "@esbuild/darwin-arm64" "0.18.20"
+ "@esbuild/darwin-x64" "0.18.20"
+ "@esbuild/freebsd-arm64" "0.18.20"
+ "@esbuild/freebsd-x64" "0.18.20"
+ "@esbuild/linux-arm" "0.18.20"
+ "@esbuild/linux-arm64" "0.18.20"
+ "@esbuild/linux-ia32" "0.18.20"
+ "@esbuild/linux-loong64" "0.18.20"
+ "@esbuild/linux-mips64el" "0.18.20"
+ "@esbuild/linux-ppc64" "0.18.20"
+ "@esbuild/linux-riscv64" "0.18.20"
+ "@esbuild/linux-s390x" "0.18.20"
+ "@esbuild/linux-x64" "0.18.20"
+ "@esbuild/netbsd-x64" "0.18.20"
+ "@esbuild/openbsd-x64" "0.18.20"
+ "@esbuild/sunos-x64" "0.18.20"
+ "@esbuild/win32-arm64" "0.18.20"
+ "@esbuild/win32-ia32" "0.18.20"
+ "@esbuild/win32-x64" "0.18.20"
+
+escodegen@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.1.0.tgz#ba93bbb7a43986d29d6041f99f5262da773e2e17"
+ integrity sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==
+ dependencies:
+ esprima "^4.0.1"
+ estraverse "^5.2.0"
+ esutils "^2.0.2"
optionalDependencies:
- "@esbuild/aix-ppc64" "0.21.5"
- "@esbuild/android-arm" "0.21.5"
- "@esbuild/android-arm64" "0.21.5"
- "@esbuild/android-x64" "0.21.5"
- "@esbuild/darwin-arm64" "0.21.5"
- "@esbuild/darwin-x64" "0.21.5"
- "@esbuild/freebsd-arm64" "0.21.5"
- "@esbuild/freebsd-x64" "0.21.5"
- "@esbuild/linux-arm" "0.21.5"
- "@esbuild/linux-arm64" "0.21.5"
- "@esbuild/linux-ia32" "0.21.5"
- "@esbuild/linux-loong64" "0.21.5"
- "@esbuild/linux-mips64el" "0.21.5"
- "@esbuild/linux-ppc64" "0.21.5"
- "@esbuild/linux-riscv64" "0.21.5"
- "@esbuild/linux-s390x" "0.21.5"
- "@esbuild/linux-x64" "0.21.5"
- "@esbuild/netbsd-x64" "0.21.5"
- "@esbuild/openbsd-x64" "0.21.5"
- "@esbuild/sunos-x64" "0.21.5"
- "@esbuild/win32-arm64" "0.21.5"
- "@esbuild/win32-ia32" "0.21.5"
- "@esbuild/win32-x64" "0.21.5"
+ source-map "~0.6.1"
+
+esprima@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
+ integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
+
+estraverse@^5.2.0:
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123"
+ integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==
estree-walker@^2.0.2:
version "2.0.2"
resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac"
integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==
-fsevents@~2.3.2, fsevents@~2.3.3:
+
+esutils@^2.0.2:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
+ integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
+
+fabric@^6.0.1:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/fabric/-/fabric-6.0.1.tgz#eedef2369acee984fc316faa1d5b57b86fb7c0d4"
+ integrity sha512-7usFV1vbPEi3YSNtmbcLQECd+O+lxcTQA5oxpxtjN8c6dzbCnfE/hPdCOaleAXnteB1j2xEn4WnauPTe8v1tpA==
+ optionalDependencies:
+ canvas "^2.11.2"
+ jsdom "^20.0.1"
+
+form-data@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452"
+ integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==
+ dependencies:
+ asynckit "^0.4.0"
+ combined-stream "^1.0.8"
+ mime-types "^2.1.12"
+
+fs-minipass@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb"
+ integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==
+ dependencies:
+ minipass "^3.0.0"
+
+fs.realpath@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
+ integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==
+
+fsevents@~2.3.2:
version "2.3.3"
resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6"
integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==
+
+gauge@^3.0.0:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/gauge/-/gauge-3.0.2.tgz#03bf4441c044383908bcfa0656ad91803259b395"
+ integrity sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==
+ dependencies:
+ aproba "^1.0.3 || ^2.0.0"
+ color-support "^1.1.2"
+ console-control-strings "^1.0.0"
+ has-unicode "^2.0.1"
+ object-assign "^4.1.1"
+ signal-exit "^3.0.0"
+ string-width "^4.2.3"
+ strip-ansi "^6.0.1"
+ wide-align "^1.1.2"
+
+glob@^7.1.3:
+ version "7.2.3"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b"
+ integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==
+ dependencies:
+ fs.realpath "^1.0.0"
+ inflight "^1.0.4"
+ inherits "2"
+ minimatch "^3.1.1"
+ once "^1.3.0"
+ path-is-absolute "^1.0.0"
+
+has-unicode@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9"
+ integrity sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==
+
+html-encoding-sniffer@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz#2cb1a8cf0db52414776e5b2a7a04d5dd98158de9"
+ integrity sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==
+ dependencies:
+ whatwg-encoding "^2.0.0"
+
+http-proxy-agent@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz#5129800203520d434f142bc78ff3c170800f2b43"
+ integrity sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==
+ dependencies:
+ "@tootallnate/once" "2"
+ agent-base "6"
+ debug "4"
+
+https-proxy-agent@^5.0.0, https-proxy-agent@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6"
+ integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==
+ dependencies:
+ agent-base "6"
+ debug "4"
+
+iconv-lite@0.6.3:
+ version "0.6.3"
+ resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501"
+ integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==
+ dependencies:
+ safer-buffer ">= 2.1.2 < 3.0.0"
+
+inflight@^1.0.4:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
+ integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==
+ dependencies:
+ once "^1.3.0"
+ wrappy "1"
+
+inherits@2, inherits@^2.0.3:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
+ integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
+
+is-fullwidth-code-point@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d"
+ integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
+
+is-potential-custom-element-name@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5"
+ integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==
+
+jsdom@^20.0.1:
+ version "20.0.3"
+ resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-20.0.3.tgz#886a41ba1d4726f67a8858028c99489fed6ad4db"
+ integrity sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==
+ dependencies:
+ abab "^2.0.6"
+ acorn "^8.8.1"
+ acorn-globals "^7.0.0"
+ cssom "^0.5.0"
+ cssstyle "^2.3.0"
+ data-urls "^3.0.2"
+ decimal.js "^10.4.2"
+ domexception "^4.0.0"
+ escodegen "^2.0.0"
+ form-data "^4.0.0"
+ html-encoding-sniffer "^3.0.0"
+ http-proxy-agent "^5.0.0"
+ https-proxy-agent "^5.0.1"
+ is-potential-custom-element-name "^1.0.1"
+ nwsapi "^2.2.2"
+ parse5 "^7.1.1"
+ saxes "^6.0.0"
+ symbol-tree "^3.2.4"
+ tough-cookie "^4.1.2"
+ w3c-xmlserializer "^4.0.0"
+ webidl-conversions "^7.0.0"
+ whatwg-encoding "^2.0.0"
+ whatwg-mimetype "^3.0.0"
+ whatwg-url "^11.0.0"
+ ws "^8.11.0"
+ xml-name-validator "^4.0.0"
+
magic-string@^0.30.10:
version "0.30.10"
resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.10.tgz#123d9c41a0cb5640c892b041d4cfb3bd0aa4b39e"
@@ -380,78 +666,428 @@ magic-string@^0.30.10:
dependencies:
"@jridgewell/sourcemap-codec" "^1.4.15"
+make-dir@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f"
+ integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==
+ dependencies:
+ semver "^6.0.0"
+
+mime-db@1.52.0:
+ version "1.52.0"
+ resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70"
+ integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==
+
+mime-types@^2.1.12:
+ version "2.1.35"
+ resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a"
+ integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==
+ dependencies:
+ mime-db "1.52.0"
+
+mimic-response@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-2.1.0.tgz#d13763d35f613d09ec37ebb30bac0469c0ee8f43"
+ integrity sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==
+
+minimatch@^3.1.1:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b"
+ integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==
+ dependencies:
+ brace-expansion "^1.1.7"
+
+minipass@^3.0.0:
+ version "3.3.6"
+ resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a"
+ integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==
+ dependencies:
+ yallist "^4.0.0"
+
+minipass@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d"
+ integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==
+
+minizlib@^2.1.1:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931"
+ integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==
+ dependencies:
+ minipass "^3.0.0"
+ yallist "^4.0.0"
+
+mkdirp@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e"
+ integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==
+
+ms@2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
+ integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
+
+nan@^2.17.0:
+ version "2.20.0"
+ resolved "https://registry.yarnpkg.com/nan/-/nan-2.20.0.tgz#08c5ea813dd54ed16e5bd6505bf42af4f7838ca3"
+ integrity sha512-bk3gXBZDGILuuo/6sKtr0DQmSThYHLtNCdSdXk9YkxD/jK6X2vmCyyXBBxyqZ4XcnzTyYEAThfX3DCEnLf6igw==
+
nanoid@^3.3.7:
version "3.3.7"
resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8"
integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==
+node-fetch@^2.6.7:
+ version "2.7.0"
+ resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d"
+ integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==
+ dependencies:
+ whatwg-url "^5.0.0"
+
+nopt@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/nopt/-/nopt-5.0.0.tgz#530942bb58a512fccafe53fe210f13a25355dc88"
+ integrity sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==
+ dependencies:
+ abbrev "1"
+
+npmlog@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-5.0.1.tgz#f06678e80e29419ad67ab964e0fa69959c1eb8b0"
+ integrity sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==
+ dependencies:
+ are-we-there-yet "^2.0.0"
+ console-control-strings "^1.1.0"
+ gauge "^3.0.0"
+ set-blocking "^2.0.0"
+
+nwsapi@^2.2.2:
+ version "2.2.10"
+ resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.10.tgz#0b77a68e21a0b483db70b11fad055906e867cda8"
+ integrity sha512-QK0sRs7MKv0tKe1+5uZIQk/C8XGza4DAnztJG8iD+TpJIORARrCxczA738awHrZoHeTjSSoHqao2teO0dC/gFQ==
+
+object-assign@^4.1.1:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
+ integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==
+
+once@^1.3.0, once@^1.3.1:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
+ integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==
+ dependencies:
+ wrappy "1"
+
+parse5@^7.1.1:
+ version "7.1.2"
+ resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.1.2.tgz#0736bebbfd77793823240a23b7fc5e010b7f8e32"
+ integrity sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==
+ dependencies:
+ entities "^4.4.0"
+
+path-is-absolute@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
+ integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==
+
picocolors@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.1.tgz#a8ad579b571952f0e5d25892de5445bcfe25aaa1"
integrity sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==
-postcss@^8.4.39, postcss@^8.4.40:
- version "8.4.40"
- resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.40.tgz#eb81f2a4dd7668ed869a6db25999e02e9ad909d8"
- integrity sha512-YF2kKIUzAofPMpfH6hOi2cGnv/HrUlfucspc7pDyvv7kGdqXrfj8SCl/t8owkEgKEuu8ZcRjSOxFxVLqwChZ2Q==
+postcss@^8.4.27, postcss@^8.4.38:
+ version "8.4.39"
+ resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.39.tgz#aa3c94998b61d3a9c259efa51db4b392e1bde0e3"
+ integrity sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==
dependencies:
nanoid "^3.3.7"
picocolors "^1.0.1"
source-map-js "^1.2.0"
-rollup@^4.13.0:
- version "4.20.0"
- resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.20.0.tgz#f9d602161d29e178f0bf1d9f35f0a26f83939492"
- integrity sha512-6rbWBChcnSGzIlXeIdNIZTopKYad8ZG8ajhl78lGRLsI2rX8IkaotQhVas2Ma+GPxJav19wrSzvRvuiv0YKzWw==
+psl@^1.1.33:
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7"
+ integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==
+
+punycode@^2.1.1:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5"
+ integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==
+
+querystringify@^2.1.1:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6"
+ integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==
+
+readable-stream@^3.6.0:
+ version "3.6.2"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967"
+ integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==
dependencies:
- "@types/estree" "1.0.5"
+ inherits "^2.0.3"
+ string_decoder "^1.1.1"
+ util-deprecate "^1.0.1"
+
+requires-port@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff"
+ integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==
+
+rimraf@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a"
+ integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==
+ dependencies:
+ glob "^7.1.3"
+
+rollup@^3.27.1:
+ version "3.29.4"
+ resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.29.4.tgz#4d70c0f9834146df8705bfb69a9a19c9e1109981"
+ integrity sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==
optionalDependencies:
- "@rollup/rollup-android-arm-eabi" "4.20.0"
- "@rollup/rollup-android-arm64" "4.20.0"
- "@rollup/rollup-darwin-arm64" "4.20.0"
- "@rollup/rollup-darwin-x64" "4.20.0"
- "@rollup/rollup-linux-arm-gnueabihf" "4.20.0"
- "@rollup/rollup-linux-arm-musleabihf" "4.20.0"
- "@rollup/rollup-linux-arm64-gnu" "4.20.0"
- "@rollup/rollup-linux-arm64-musl" "4.20.0"
- "@rollup/rollup-linux-powerpc64le-gnu" "4.20.0"
- "@rollup/rollup-linux-riscv64-gnu" "4.20.0"
- "@rollup/rollup-linux-s390x-gnu" "4.20.0"
- "@rollup/rollup-linux-x64-gnu" "4.20.0"
- "@rollup/rollup-linux-x64-musl" "4.20.0"
- "@rollup/rollup-win32-arm64-msvc" "4.20.0"
- "@rollup/rollup-win32-ia32-msvc" "4.20.0"
- "@rollup/rollup-win32-x64-msvc" "4.20.0"
fsevents "~2.3.2"
+safe-buffer@~5.2.0:
+ version "5.2.1"
+ resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
+ integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
+
+"safer-buffer@>= 2.1.2 < 3.0.0":
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
+ integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
+
+saxes@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/saxes/-/saxes-6.0.0.tgz#fe5b4a4768df4f14a201b1ba6a65c1f3d9988cc5"
+ integrity sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==
+ dependencies:
+ xmlchars "^2.2.0"
+
+semver@^6.0.0:
+ version "6.3.1"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4"
+ integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==
+
+semver@^7.3.5:
+ version "7.6.2"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.2.tgz#1e3b34759f896e8f14d6134732ce798aeb0c6e13"
+ integrity sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==
+
+set-blocking@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
+ integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==
+
+signal-exit@^3.0.0:
+ version "3.0.7"
+ resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9"
+ integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==
+
+simple-concat@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f"
+ integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==
+
+simple-get@^3.0.3:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-3.1.1.tgz#cc7ba77cfbe761036fbfce3d021af25fc5584d55"
+ integrity sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==
+ dependencies:
+ decompress-response "^4.2.0"
+ once "^1.3.1"
+ simple-concat "^1.0.0"
+
source-map-js@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af"
integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==
-vite@^5.3.5:
- version "5.3.5"
- resolved "https://registry.yarnpkg.com/vite/-/vite-5.3.5.tgz#b847f846fb2b6cb6f6f4ed50a830186138cb83d8"
- integrity sha512-MdjglKR6AQXQb9JGiS7Rc2wC6uMjcm7Go/NHNO63EwiJXfuk9PgqiP/n5IDJCziMkfw9n4Ubp7lttNwz+8ZVKA==
+source-map@~0.6.1:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
+ integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
+
+"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.2.3:
+ version "4.2.3"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
+ integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
+ dependencies:
+ emoji-regex "^8.0.0"
+ is-fullwidth-code-point "^3.0.0"
+ strip-ansi "^6.0.1"
+
+string_decoder@^1.1.1:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e"
+ integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==
+ dependencies:
+ safe-buffer "~5.2.0"
+
+strip-ansi@^6.0.1:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
+ integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
+ dependencies:
+ ansi-regex "^5.0.1"
+
+symbol-tree@^3.2.4:
+ version "3.2.4"
+ resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2"
+ integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==
+
+tar@^6.1.11:
+ version "6.2.1"
+ resolved "https://registry.yarnpkg.com/tar/-/tar-6.2.1.tgz#717549c541bc3c2af15751bea94b1dd068d4b03a"
+ integrity sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==
+ dependencies:
+ chownr "^2.0.0"
+ fs-minipass "^2.0.0"
+ minipass "^5.0.0"
+ minizlib "^2.1.1"
+ mkdirp "^1.0.3"
+ yallist "^4.0.0"
+
+tough-cookie@^4.1.2:
+ version "4.1.4"
+ resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.4.tgz#945f1461b45b5a8c76821c33ea49c3ac192c1b36"
+ integrity sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==
dependencies:
- esbuild "^0.21.3"
- postcss "^8.4.39"
- rollup "^4.13.0"
+ psl "^1.1.33"
+ punycode "^2.1.1"
+ universalify "^0.2.0"
+ url-parse "^1.5.3"
+
+tr46@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/tr46/-/tr46-3.0.0.tgz#555c4e297a950617e8eeddef633c87d4d9d6cbf9"
+ integrity sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==
+ dependencies:
+ punycode "^2.1.1"
+
+tr46@~0.0.3:
+ version "0.0.3"
+ resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a"
+ integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==
+
+universalify@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0"
+ integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==
+
+url-parse@^1.5.3:
+ version "1.5.10"
+ resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1"
+ integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==
+ dependencies:
+ querystringify "^2.1.1"
+ requires-port "^1.0.0"
+
+util-deprecate@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
+ integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==
+
+vite@^4.0.2:
+ version "4.5.3"
+ resolved "https://registry.yarnpkg.com/vite/-/vite-4.5.3.tgz#d88a4529ea58bae97294c7e2e6f0eab39a50fb1a"
+ integrity sha512-kQL23kMeX92v3ph7IauVkXkikdDRsYMGTVl5KY2E9OY4ONLvkHf04MDTbnfo6NKxZiDLWzVpP5oTa8hQD8U3dg==
+ dependencies:
+ esbuild "^0.18.10"
+ postcss "^8.4.27"
+ rollup "^3.27.1"
optionalDependencies:
- fsevents "~2.3.3"
+ fsevents "~2.3.2"
vue-demi@>=0.14.8:
- version "0.14.10"
- resolved "https://registry.yarnpkg.com/vue-demi/-/vue-demi-0.14.10.tgz#afc78de3d6f9e11bf78c55e8510ee12814522f04"
- integrity sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==
-
-vue@^3.4.35:
- version "3.4.35"
- resolved "https://registry.yarnpkg.com/vue/-/vue-3.4.35.tgz#9ad23525919eece40153fdf8675d07ddd879eb33"
- integrity sha512-+fl/GLmI4GPileHftVlCdB7fUL4aziPcqTudpTGXCT8s+iZWuOCeNEB5haX6Uz2IpRrbEXOgIFbe+XciCuGbNQ==
- dependencies:
- "@vue/compiler-dom" "3.4.35"
- "@vue/compiler-sfc" "3.4.35"
- "@vue/runtime-dom" "3.4.35"
- "@vue/server-renderer" "3.4.35"
- "@vue/shared" "3.4.35"
+ version "0.14.8"
+ resolved "https://registry.yarnpkg.com/vue-demi/-/vue-demi-0.14.8.tgz#00335e9317b45e4a68d3528aaf58e0cec3d5640a"
+ integrity sha512-Uuqnk9YE9SsWeReYqK2alDI5YzciATE0r2SkA6iMAtuXvNTMNACJLJEXNXaEy94ECuBe4Sk6RzRU80kjdbIo1Q==
+
+vue@^3.3.10:
+ version "3.4.31"
+ resolved "https://registry.yarnpkg.com/vue/-/vue-3.4.31.tgz#83a3c4dab8302b0e974b0d4b92a2f6a6378ae797"
+ integrity sha512-njqRrOy7W3YLAlVqSKpBebtZpDVg21FPoaq1I7f/+qqBThK9ChAIjkRWgeP6Eat+8C+iia4P3OYqpATP21BCoQ==
+ dependencies:
+ "@vue/compiler-dom" "3.4.31"
+ "@vue/compiler-sfc" "3.4.31"
+ "@vue/runtime-dom" "3.4.31"
+ "@vue/server-renderer" "3.4.31"
+ "@vue/shared" "3.4.31"
+
+w3c-xmlserializer@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz#aebdc84920d806222936e3cdce408e32488a3073"
+ integrity sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==
+ dependencies:
+ xml-name-validator "^4.0.0"
+
+webidl-conversions@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871"
+ integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==
+
+webidl-conversions@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a"
+ integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==
+
+whatwg-encoding@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz#e7635f597fd87020858626805a2729fa7698ac53"
+ integrity sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==
+ dependencies:
+ iconv-lite "0.6.3"
+
+whatwg-mimetype@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz#5fa1a7623867ff1af6ca3dc72ad6b8a4208beba7"
+ integrity sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==
+
+whatwg-url@^11.0.0:
+ version "11.0.0"
+ resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-11.0.0.tgz#0a849eebb5faf2119b901bb76fd795c2848d4018"
+ integrity sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==
+ dependencies:
+ tr46 "^3.0.0"
+ webidl-conversions "^7.0.0"
+
+whatwg-url@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d"
+ integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==
+ dependencies:
+ tr46 "~0.0.3"
+ webidl-conversions "^3.0.0"
+
+wide-align@^1.1.2:
+ version "1.1.5"
+ resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3"
+ integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==
+ dependencies:
+ string-width "^1.0.2 || 2 || 3 || 4"
+
+wrappy@1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
+ integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==
+
+ws@^8.11.0:
+ version "8.18.0"
+ resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.0.tgz#0d7505a6eafe2b0e712d232b42279f53bc289bbc"
+ integrity sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==
+
+xml-name-validator@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz#79a006e2e63149a8600f15430f0a4725d1524835"
+ integrity sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==
+
+xmlchars@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb"
+ integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==
+
+yallist@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
+ integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
\ No newline at end of file