boq-api / utils /rules.py
gabcares's picture
Upload 80 files
72fdabd verified
Raw
History Blame Contribute Delete
7.55 kB
from typing import Dict
# --------------------------------------------------------------------------------------------
# QS FALLBACK RULES (HEURISTICS)
# These are regex-based rules that map certain keywords or patterns in the description
# to specific categories. They are applied in a top-to-bottom manner, meaning that
# more specific rules (e.g., for specialist ICT, AV & race track systems) are evaluated
# before more generic rules (e.g., for preliminaries, schedules & dayworks).
# This allows for a more accurate categorization of descriptions that may not have
# been correctly classified by the QSSelecticCaliberatedModel, especially for those
# that contain specific terms related to certain systems or components.
# Evaluated Top-to-Bottom. Specific systems > Sub-components > Generic Schedules.
# --------------------------------------------------------------------------------------------
QS_FALLBACK_RULES: Dict[str, str] = {
# ==========================================
# 1. SPECIALIST ICT, AV & RACE TRACK SYSTEMS
# ==========================================
r"(?i)\bvideo\s*walls?\b|\bgiant\s*screens?\b": "AV Equipment",
r"(?i)\bstartlight\s*system\b|\bpublic\s*address\b": "AV Equipment",
r"(?i)\bdigital\s*light\s*flag\b|\bsmart\s*marshalling\b": "AV Equipment",
r"(?i)\bpit\s*warning\s*system\b|\btime\s*keeping\b": "AV Equipment",
r"(?i)\bmarshal\s*communication\b|\bbroadband\s*antenna\b": "AV Equipment",
r"(?i)\bdmx(\s*control)?\s*system\b": "Lighting control panel",
r"(?i)\btechnical\s*furniture'?s?\b": "Furniture and furnishings",
# ==========================================
# 2. FIRE, SECURITY & AUTOMATION (ELV)
# ==========================================
r"(?i)\bfire\s*alarm\s*control\s*panel\b": "Fire alarm control panel",
r"(?i)\bfire\s*alarm\s*system.*equipment\b": "Fire alarm control panel",
r"(?i)\bfire\s*alarm\s*system\b": "Addressable fire alarm accessories",
r"(?i)\baccess\s*control\s*system\b": "Access control panel",
r"(?i)\bsecurity\s*system\b|\bfault\s*indication\s*system\b": "Alarm panel",
r"(?i)\bpublic\s*cctv\b|\bvideo\s*surveillance\b": "CCTV Camera",
r"(?i)\bbms\b|\bbuilding\s*management\s*system\b": "BMS",
# ==========================================
# 3. SAFETY BARRIERS, FENCES & GUARDRAILS
# ==========================================
r"(?i)\bfia\s*concrete\s*block\s*wall\b": "Concrete - precast",
r"(?i)\btecpro\s*barrier\b|\bsafer\s*barrier\b": "Hoarding and site fence",
r"(?i)\bguardrails?\b|\bfia\s*fence\b|\bspectator\s*fence\b": "Hoarding and site fence",
r"(?i)\btemporary\s*fence\b|\bheras\s*fence\b|\bgap\s*fence\b": "Hoarding and site fence",
r"(?i)\bboundary\s*fence\b|\bpipwall\s*gate\b|\bfence\s*wall\s*gate\b": "Hoarding and site fence",
r"(?i)\bdouble\s*swing\s*gate\b|\bwalls,\s*fences,\s*gates\b": "Hoarding and site fence",
r"(?i)\bwindows\s*on\s*fences\b": "Hoarding and site fence",
# ==========================================
# 4. MEP - ELECTRICAL & POWER
# ==========================================
r"(?i)\bmedium\s*voltage\s*distribution\b": "Transformer",
r"(?i)\buninterruptible\s*power\s*supply\b|\bups\b": "UPS",
r"(?i)\bdiesel\s*generator\b|\bemergency\s*power\s*generators?\b": "Generator",
r"(?i)\bactive\s*harmonic\s*filter\b": "Power factor correction equipment",
r"(?i)\bmotor\s*control\s*centers?\b": "Motor control center",
r"(?i)\bdistribution\s*boards?\b": "Distribution boards",
r"(?i)\bswitchgears?\b|\bswitchboards?\b|\bpanelboards?\b": "Distribution boards",
r"(?i)\bearthing\s*and\s*bonding\b|\bearthing\s*supply\b": "Earthing system",
r"(?i)\bdata\s*network\b|\bnetwork\s*racks?\b": "Network cabling infrastructure",
# ==========================================
# 5. MEP - CABLING & PIPING
# ==========================================
r"(?i)\bfp200\b|fire\s*rated\s*cables?": "Cabling - Copper Cable",
r"(?i)\bgi\s*conduits?\b": "Cabling - Copper Conduit",
r"(?i)\bmulticore.*cables?\b|\bcontrol\s*cables?\b": "Cabling - Copper Cable",
r"(?i)\bcables?\s*from\s*.*to\b": "Cabling - Copper Cable",
r"(?i)\bxlpe/pvc/cu\b|\bcu/xlpe/swa/pvc\b|\bcables?\b": "Cabling - Copper Cable",
r"(?i)\bfiber\s*optic\b|\bfibre\s*backbone\b": "Cabling - Fibre Optic",
r"(?i)upvc\s*pipes?": "Pipework - uPVC",
r"(?i)pvc\s*pipes?": "Pipework - PVC",
r"(?i)hdpe\s*pipes?": "Pipework - HDPE",
r"(?i)pre-insulated\s*chilled\s*water\s*pipes?": "Pipework - Thermal",
r"(?i)\bflexible\s*ducts?\b": "Duct - Flexible duct",
# ==========================================
# 6. EXTERNAL WORKS, IRRIGATION & LANDSCAPING
# ==========================================
r"(?i)\bsoil\s*clik\s*moisture\s*sensor\b": "Irrigation sundries",
r"(?i)\birrigation\s*field\s*controller\b": "Irrigation system",
r"(?i)\bpoly\s*subsurface\s*drip\s*line\b|\btree\s*irrigation\b": "Irrigation system",
r"(?i)\bsecondary\s*irrigation.*valves\b|\bsecondary\s*irrigation.*others\b": "Irrigation sundries",
r"(?i)\bsecondary\s*irrigation\b": "Irrigation system",
r"(?i)\bsubbase\b|\bcrushed\s*aggregate\b": "Crushed aggregate , granular subbase",
r"(?i)\bsubgrade\b": "Excavation",
r"(?i)\bpvc\s*pondliner\b|\bpolyethylene\s*sheets?\b": "Waterproofing",
r"(?i)\bgeotextile\b": "Geotextile",
r"(?i)\bgravel\s*filter\b": "Gravel",
r"(?i)\bplanting\s*soil\b|\bto\s*planting\s*areas\b": "Plant mix , sweet soil",
r"(?i)\btrees\b": "Trees",
r"(?i)\bshrubs\b|\bherbaceous\b|\bgroundcovers?\b": "Shrubs and ground covers",
r"(?i)\bsite\s*furnishings?\b|\bseat\s*benches\b|\bplanter\s*benches\b": "Furniture and furnishings",
# ==========================================
# 7. STRUCTURAL, CIVIL & FINISHES
# ==========================================
r"(?i)\btrack\s*lighting\b|\blighting\s*poles?\b|\bfloodlight\b": "Light fixtures",
r"(?i)\bmilos\s*m760\b|\btruss\s*structure\b": "Structural steel",
r"(?i)column\s*foundations?|mass\s*concrete.*bases?": "Concrete - In situ",
r"(?i)\bbase\s*plate.*holding\s*down\b": "Concrete - In situ",
r"(?i)\bin-situ\s*concrete\s*paving\b|\bin-situ\s*concrete\b": "Concrete - In situ",
r"(?i)\bconcrete\s*ancillaries.*formworks?\b": "Formwork",
r"(?i)\bwire\s*mesh\b": "Reinforcement - mesh",
r"(?i)\banti-carbonation\b|\bcladding\s*finishes\b|\btextured\s*paint\b": "Wall finishes",
r"(?i)\bwhite\s*acrylic\s*paint\b": "Road marking",
r"(?i)\bskirting\b": "Skirting",
r"(?i)\bacoustic.*ceiling\b": "Acoustic ceiling tile",
r"(?i)\binterior\s*concrete\s*ceilings\b": "Ceilings and bulkheads - paint finish only",
r"(?i)\bsignage\b|\bwayfinding\b|\btraffic\s*sign\s*boards?\b|\bdistance\s*sign\s*board\b": "Signage and wayfinding",
# ==========================================
# 8. PRELIMINARIES, SCHEDULES & DAYWORKS (Catch-Alls)
# ==========================================
r"(?i)^\s*labour": "Dayworks - Labour",
r"(?i)^\s*plant": "Dayworks - Plant & Equipment",
r"(?i)^\s*materials?": "Dayworks - Material",
r"(?i)\bsundry\s*items\b": "Dayworks",
r"(?i)\bbuilder'?s\s*work\b": "Dayworks",
r"(?i)\bsoft\s*landscaping.*\bmaintenance\b": "Dayworks",
r"(?i)\bsubcontractor'?s\s*adjustments\b|\bvalue\s*adding\b|\badditional\s*items\b": "Dayworks",
}