aboutsummaryrefslogtreecommitdiff
path: root/src/ee/order/__init__.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/ee/order/__init__.py')
-rw-r--r--src/ee/order/__init__.py88
1 files changed, 88 insertions, 0 deletions
diff --git a/src/ee/order/__init__.py b/src/ee/order/__init__.py
new file mode 100644
index 0000000..7c815b4
--- /dev/null
+++ b/src/ee/order/__init__.py
@@ -0,0 +1,88 @@
+from functools import total_ordering
+from pathlib import Path
+from typing import List, Tuple
+
+from ee.part import PartDb, load_db, save_db
+from ee.xml import bomFile, bom_file_utils
+
+__all__ = ["create_order"]
+
+
+@total_ordering
+class PartInfo(object):
+ def __init__(self, part: bomFile.Part):
+ self.part = part
+ self.id = part.id
+ self.pn = bom_file_utils.find_pn(part)
+ self.available_from: List[Tuple[str, bomFile.Part]] = []
+
+ def __lt__(self, other: "PartInfo"):
+ return self.part.idProp == other.part.idProp
+
+
+def create_order(schematic_dir: Path, out_dir: Path, part_db_dirs: List[Path], fail_on_missing_parts: bool):
+ sch_db = load_db(schematic_dir)
+
+ dbs = [(path.parent.name, load_db(path)) for path in part_db_dirs]
+
+ out_parts = PartDb()
+
+ infos = [PartInfo(sch) for sch in sch_db.iterparts()]
+
+ for info in infos:
+ print("Resolving {}".format(info.id))
+
+ for distributor, db in dbs:
+ for p in db.iterparts(sort=True):
+ if info.pn:
+ p_pn: str = bom_file_utils.find_pn(p)
+
+ if info.pn == p_pn:
+ info.available_from.append((distributor, p))
+
+ for sch_pn_ in bom_file_utils.part_numbers(info.part):
+ sch_pn: bomFile.PartNumber = sch_pn_
+
+ for p_pn_ in bom_file_utils.part_numbers(p):
+ p_pn: bomFile.PartNumber = p_pn_
+
+ if sch_pn.distributorProp == p_pn.distributorProp and sch_pn.value == p_pn.value:
+ if p.idProp not in info.available_from:
+ info.available_from.append((distributor, p))
+
+ for info in infos:
+ print("Resolved {} to {}".format(info.id, info.available_from))
+
+ warnings = []
+ has_missing_parts = False
+ for info in infos:
+ if len(info.available_from) == 0:
+ has_missing_parts = True
+ warnings.append("Could not find {} in any database, part numbers: {}".
+ format(info.id, ", ".join([p.value for p in bom_file_utils.part_numbers(info.part)])))
+
+ for w in sorted(warnings):
+ print(w)
+
+ if has_missing_parts and fail_on_missing_parts:
+ print("has missing parts")
+ return False
+
+ for info in infos:
+ part = bomFile.Part(id=info.part.id,
+ schema_reference=info.part.schema_reference,
+ part_numbers=bomFile.PartNumberList())
+
+ part_numbers = part.part_numbersProp.part_number
+
+ if len(info.available_from) == 0:
+ continue
+
+ distributor, distributor_part = info.available_from[0]
+
+ part_numbers.append(bomFile.PartNumber(value=distributor_part.id, distributor=distributor))
+
+ out_parts.add_entry(part, True)
+
+ print("Saving {} work parts".format(out_parts.size()))
+ save_db(out_dir, out_parts)