diff --git a/apps/Frontend/src/assets/data/procedureCodes.json b/apps/Frontend/src/assets/data/procedureCodes.json index 8e57148..912b351 100644 --- a/apps/Frontend/src/assets/data/procedureCodes.json +++ b/apps/Frontend/src/assets/data/procedureCodes.json @@ -1,344 +1,1026 @@ [ - { - "Procedure Code": "D1999", - "Description": "", - "Price": "50" - }, - { - "Procedure Code": "D0120", - "Description": "perio exam", - "Price": "105" - }, - { - "Procedure Code": "D0140", - "Description": "limited exam", - "Price": "90" - }, - { - "Procedure Code": "D0150", - "Description": "comprehensive exam", - "Price": "120" - }, - { - "Procedure Code": "D0210", - "Description": "Fmx.", - "Price": "120" - }, - { - "Procedure Code": "D0220", - "Description": "first PA.", - "Price": "60" - }, - { - "Procedure Code": "D0230", - "Description": "2nd PA.", - "Price": "50" - }, - { - "Procedure Code": "D0330", - "Description": "pano", - "Price": "150" - }, - { - "Procedure Code": "D0272", - "Description": "2 BW", - "Price": "80" - }, - { - "Procedure Code": "D0274", - "Description": "4BW", - "Price": "160" - }, - { - "Procedure Code": "D1110", - "Description": "adult prophy", - "Price": "150" - }, - { - "Procedure Code": "D1120", - "Description": "child prophy", - "Price": "120" - }, - { - "Procedure Code": "D1351", - "Description": "sealant", - "Price": "80" - }, - { - "Procedure Code": "D4341", - "Description": "srp", - "Price": "250" - }, - { - "Procedure Code": "D4910", - "Description": "perio maintains", - "Price": "250" - }, - { - "Procedure Code": "D1208", - "Description": "FL", - "Price": "90" - }, - { - "Procedure Code": "D2330", - "Description": "front composite. 1 s.", - "Price": "180" - }, - { - "Procedure Code": "D2331", - "Description": "2s", - "Price": "220" - }, - { - "Procedure Code": "D2332", - "Description": "3s", - "Price": "280" - }, - { - "Procedure Code": "D2335", - "Description": "4s or more", - "Price": "350" - }, - { - "Procedure Code": "D2391", - "Description": "back. 1s", - "Price": "200" - }, - { - "Procedure Code": "D2392", - "Description": "2s", - "Price": "250" - }, - { - "Procedure Code": "D2393", - "Description": "3s", - "Price": "280" - }, - { - "Procedure Code": "D2394", - "Description": "4s", - "Price": "320" - }, - { - "Procedure Code": "D2140", - "Description": "amalgam, one surface", - "Price": "150" - }, - { - "Procedure Code": "D2150", - "Description": "amalgam, two surface", - "Price": "200" - }, - { - "Procedure Code": "D2750", - "Description": "high noble", - "Price": "1300" - }, - { - "Procedure Code": "D2751", - "Description": "base metal", - "Price": "1200" - }, - { - "Procedure Code": "D2740", - "Description": "crown porcelain", - "Price": "1300" - }, - { - "Procedure Code": "D2954", - "Description": "p/c", - "Price": "450" - }, - { - "Procedure Code": "D7910", - "Description": "suture, small wound up to 5 mm", - "Price": "400" - }, - { - "Procedure Code": "D5110", - "Description": "FU", - "Price": "1200", - "Full Price": "1700" - }, - { - "Procedure Code": "D5120", - "Description": "FL", - "Price": "1700", - "Full Price": "1700" - }, - { - "Procedure Code": "D5211", - "Description": "pu", - "Price": "1300" - }, - { - "Procedure Code": "D5212", - "Description": "pl", - "Price": "1300" - }, - { - "Procedure Code": "D5213", - "Description": "cast pu.", - "Price": "1700" - }, - { - "Procedure Code": "D5214", - "Description": "cast pl", - "Price": "1700" - }, - { - "Procedure Code": "D5510", - "Description": "Repair broken complete denture base (QUAD)", - "Price": "400" - }, - { - "Procedure Code": "D5520", - "Description": "Replace missing or broken teeth - complete denture (each tooth) (TOOTH)", - "Price": "200" - }, - { - "Procedure Code": "D5750", - "Description": "lab reline", - "Price": "600" - }, - { - "Procedure Code": "D5730", - "Description": "chairside reline", - "Price": "500" - }, - { - "Procedure Code": "D2920", - "Description": "re cement crown", - "Price": "120" - }, - { - "Procedure Code": "D2950", - "Description": "core buildup", - "Price": "350" - }, - { - "Procedure Code": "D2955", - "Description": "post renoval", - "Price": "350" - }, - { - "Procedure Code": "D6100", - "Description": "", - "Price": "320" - }, - { - "Procedure Code": "D6110", - "Description": "implant", - "Price": "1600" - }, - { - "Procedure Code": "D6056", - "Description": "pre fab abut", - "Price": "750" - }, - { - "Procedure Code": "D6057", - "Description": "custom abut", - "Price": "800" - }, - { - "Procedure Code": "D6058", - "Description": "porcelain, implant crown, ceramic crown", - "Price": "1400" - }, - { - "Procedure Code": "D6059", - "Description": "", - "Price": "1400" - }, - { - "Procedure Code": "D6242", - "Description": "noble metal. For united", - "Price": "1400" - }, - { - "Procedure Code": "D6245", - "Description": "porcelain, not for united", - "Price": "1400" - }, - { - "Procedure Code": "D0367", - "Description": "", - "Price": "400" - }, - { - "Procedure Code": "D0364", - "Description": "Less than one jaw", - "Price": "350" - }, - { - "Procedure Code": "D0365", - "Description": "Mand", - "Price": "350" - }, - { - "Procedure Code": "D0366", - "Description": "Max", - "Price": "350" - }, - { - "Procedure Code": "D0368", - "Description": "include TMJ", - "Price": "375" - }, - { - "Procedure Code": "D0383", - "Description": "", - "Price": "350" - }, - { - "Procedure Code": "D0380", - "Description": "Less than one jaw", - "Price": "300" - }, - { - "Procedure Code": "D0381", - "Description": "Mand", - "Price": "300" - }, - { - "Procedure Code": "D0382", - "Description": "Max", - "Price": "300" - }, - { - "Procedure Code": "D7950", - "Description": "max", - "Price": "800" - }, - { - "Procedure Code": "D7140", - "Description": "simple ext", - "Price": "150" - }, - { - "Procedure Code": "D7210", - "Description": "surgical ext", - "Price": "280" - }, - { - "Procedure Code": "D7220", - "Description": "soft impacted", - "Price": "380" - }, - { - "Procedure Code": "D7230", - "Description": "partial bony", - "Price": "450" - }, - { - "Procedure Code": "D7240", - "Description": "fully bony", - "Price": "550" - }, - { - "Procedure Code": "D3320", - "Description": "pre M RCT", - "Price": "1050" - } -] \ No newline at end of file + { + "Procedure Code": "D0120", + "Description": "perio exam", + "Price": "105" + }, + { + "Procedure Code": "D0140", + "Description": "limited exam", + "Price": "90" + }, + { + "Procedure Code": "D0150", + "Description": "comprehensive exam", + "Price": "120" + }, + { + "Procedure Code": "D0210", + "Description": "Fmx.", + "Price": "120" + }, + { + "Procedure Code": "D0220", + "Description": "first PA.", + "Price": "60" + }, + { + "Procedure Code": "D0230", + "Description": "2nd PA.", + "Price": "50" + }, + { + "Procedure Code": "D0272", + "Description": "2 BW", + "Price": "80" + }, + { + "Procedure Code": "D0274", + "Description": "4BW", + "Price": "160" + }, + { + "Procedure Code": "D0330", + "Description": "pano", + "Price": "150" + }, + { + "Procedure Code": "D0364", + "Description": "Less than one jaw", + "Price": "350" + }, + { + "Procedure Code": "D0365", + "Description": "Mand", + "Price": "350" + }, + { + "Procedure Code": "D0366", + "Description": "Max", + "Price": "350" + }, + { + "Procedure Code": "D0367", + "Description": "", + "Price": "400" + }, + { + "Procedure Code": "D0368", + "Description": "include TMJ", + "Price": "375" + }, + { + "Procedure Code": "D0380", + "Description": "Less than one jaw", + "Price": "300" + }, + { + "Procedure Code": "D0381", + "Description": "Mand", + "Price": "300" + }, + { + "Procedure Code": "D0382", + "Description": "Max", + "Price": "300" + }, + { + "Procedure Code": "D0383", + "Description": "", + "Price": "350" + }, + { + "Procedure Code": "D1110", + "Description": "adult prophy", + "Price": "150" + }, + { + "Procedure Code": "D1120", + "Description": "child prophy", + "Price": "120" + }, + { + "Procedure Code": "D1208", + "Description": "FL", + "Price": "90" + }, + { + "Procedure Code": "D1351", + "Description": "sealant", + "Price": "80" + }, + { + "Procedure Code": "D1999", + "Description": "", + "Price": "50" + }, + { + "Procedure Code": "D2140", + "Description": "amalgam, one surface", + "Price": "150" + }, + { + "Procedure Code": "D2150", + "Description": "amalgam, two surface", + "Price": "200" + }, + { + "Procedure Code": "D2955", + "Description": "post renoval", + "Price": "350" + }, + { + "Procedure Code": "D4910", + "Description": "perio maintains", + "Price": "250" + }, + { + "Procedure Code": "D5510", + "Description": "Repair broken complete denture base (QUAD)", + "Price": "400" + }, + { + "Procedure Code": "D6056", + "Description": "pre fab abut", + "Price": "750" + }, + { + "Procedure Code": "D6057", + "Description": "custom abut", + "Price": "800" + }, + { + "Procedure Code": "D6058", + "Description": "porcelain, implant crown, ceramic crown", + "Price": "1400" + }, + { + "Procedure Code": "D6059", + "Description": "", + "Price": "1400" + }, + { + "Procedure Code": "D6100", + "Description": "", + "Price": "320" + }, + { + "Procedure Code": "D6110", + "Description": "implant", + "Price": "1600" + }, + { + "Procedure Code": "D6242", + "Description": "noble metal. For united", + "Price": "1400" + }, + { + "Procedure Code": "D6245", + "Description": "porcelain, not for united", + "Price": "1400" + }, + { + "Procedure Code": "D7910", + "Description": "suture, small wound up to 5 mm", + "Price": "400" + }, + { + "Procedure Code": "D7950", + "Description": "max", + "Price": "800" + }, + { + "Procedure Code": "D2160", + "Description": "Amalgam-three surfaces, primary or permanent", + "PriceLTEQ21": "110", + "PriceGT21": "92" + }, + { + "Procedure Code": "D2161", + "Description": "Amalgam-four or more surfaces, primary or permanent", + "PriceLTEQ21": "137", + "PriceGT21": "116" + }, + { + "Procedure Code": "D2330", + "Description": "Resin-based composite – one surface, anterior", + "PriceLTEQ21": "98", + "PriceGT21": "72" + }, + { + "Procedure Code": "D2331", + "Description": "Resin-based composite – two surfaces, anterior", + "PriceLTEQ21": "118", + "PriceGT21": "92" + }, + { + "Procedure Code": "D2332", + "Description": "Resin-based composite – three surfaces, anterior", + "PriceLTEQ21": "147", + "PriceGT21": "116" + }, + { + "Procedure Code": "D2335", + "Description": "Resin-based composite – four or more surfaces or involving incisal angle (anterior)", + "PriceLTEQ21": "188", + "PriceGT21": "146" + }, + { + "Procedure Code": "D2390", + "Description": "Resin-based composite crown, anterior", + "PriceLTEQ21": "133", + "PriceGT21": "NC" + }, + { + "Procedure Code": "D2391", + "Description": "Resin-based composite – one surface, posterior", + "PriceLTEQ21": "99", + "PriceGT21": "62" + }, + { + "Procedure Code": "D2392", + "Description": "Resin-based composite – two surfaces, posterior", + "PriceLTEQ21": "123", + "PriceGT21": "77" + }, + { + "Procedure Code": "D2393", + "Description": "Resin-based composite – three surfaces, posterior", + "PriceLTEQ21": "133", + "PriceGT21": "92" + }, + { + "Procedure Code": "D2394", + "Description": "Resin-based composite – four or more surfaces, posterior", + "PriceLTEQ21": "182", + "PriceGT21": "116" + }, + { + "Procedure Code": "D2710", + "Description": "Crown – resin-based composite (indirect)", + "PriceLTEQ21": "244", + "PriceGT21": "NC" + }, + { + "Procedure Code": "D2740", + "Description": "Crown – porcelain/ceramic", + "PriceLTEQ21": "853", + "PriceGT21": "729" + }, + { + "Procedure Code": "D2750", + "Description": "Crown – porcelain fused to high noble metal", + "PriceLTEQ21": "800", + "PriceGT21": "NC" + }, + { + "Procedure Code": "D2751", + "Description": "Crown – porcelain fused to predominantly base metal", + "PriceLTEQ21": "727", + "PriceGT21": "613" + }, + { + "Procedure Code": "D2752", + "Description": "Crown – porcelain fused to noble metal", + "PriceLTEQ21": "735", + "PriceGT21": "NC" + }, + { + "Procedure Code": "D2790", + "Description": "Crown – full cast high noble metal", + "PriceLTEQ21": "808", + "PriceGT21": "NC" + }, + { + "Procedure Code": "D2910", + "Description": "Re-cement or re-bond inlay, onlay or partial coverage restoration", + "PriceLTEQ21": "69", + "PriceGT21": "57" + }, + { + "Procedure Code": "D2920", + "Description": "Re-cement or re-bond crown", + "PriceLTEQ21": "68", + "PriceGT21": "57" + }, + { + "Procedure Code": "D2929", + "Description": "Prefabricated porcelain/ceramic crown – primary tooth", + "PriceLTEQ21": "224", + "PriceGT21": "NC" + }, + { + "Procedure Code": "D2930", + "Description": "Prefabricated stainless steel crown – primary tooth", + "PriceLTEQ21": "205", + "PriceGT21": "NC" + }, + { + "Procedure Code": "D2931", + "Description": "Prefabricated stainless steel crown – permanent tooth", + "PriceLTEQ21": "199", + "PriceGT21": "171" + }, + { + "Procedure Code": "D2932", + "Description": "Prefabricated resin crown", + "PriceLTEQ21": "224", + "PriceGT21": "NC" + }, + { + "Procedure Code": "D2934", + "Description": "Prefabricated esthetic coated stainless steel crown – primary tooth", + "PriceLTEQ21": "184", + "PriceGT21": "NC" + }, + { + "Procedure Code": "D2950", + "Description": "Core buildup, including any pins when required", + "PriceLTEQ21": "197", + "PriceGT21": "164" + }, + { + "Procedure Code": "D2951", + "Description": "Pin retention – per tooth, in addition to restoration", + "PriceLTEQ21": "31", + "PriceGT21": "27" + }, + { + "Procedure Code": "D2954", + "Description": "Prefabricated post and core in addition to crown", + "PriceLTEQ21": "229", + "PriceGT21": "191" + }, + { + "Procedure Code": "D2980", + "Description": "Crown repair necessitated by restorative material failure", + "PriceLTEQ21": "137", + "PriceGT21": "115" + }, + { + "Procedure Code": "D2999", + "Description": "Unspecified restorative procedure, by report", + "PriceLTEQ21": "IC", + "PriceGT21": "IC" + }, + { + "Procedure Code": "D3120", + "Description": "Pulp cap – indirect (excluding final restoration)", + "PriceLTEQ21": "40", + "PriceGT21": "34" + }, + { + "Procedure Code": "D3220", + "Description": "Therapeutic pulpotomy (excluding final restoration) – removal of pulp coronal to the dentinocemental junction and application of medicament", + "PriceLTEQ21": "106", + "PriceGT21": "NC" + }, + { + "Procedure Code": "D3310", + "Description": "Endodontic therapy, anterior (excluding final restoration)", + "PriceLTEQ21": "544", + "PriceGT21": "544" + }, + { + "Procedure Code": "D3320", + "Description": "Endodontic therapy, premolar tooth (excluding final restoration)", + "PriceLTEQ21": "639", + "PriceGT21": "639" + }, + { + "Procedure Code": "D3330", + "Description": "Endodontic therapy, molar tooth (excluding final restoration)", + "PriceLTEQ21": "829", + "PriceGT21": "829" + }, + { + "Procedure Code": "D3346", + "Description": "Retreatment of previous root canal therapy – anterior", + "PriceLTEQ21": "545", + "PriceGT21": "456" + }, + { + "Procedure Code": "D3347", + "Description": "Retreatment of previous root canal therapy – premolar", + "PriceLTEQ21": "641", + "PriceGT21": "538" + }, + { + "Procedure Code": "D3348", + "Description": "Retreatment of previous root canal therapy – molar", + "PriceLTEQ21": "789", + "PriceGT21": "613" + }, + { + "Procedure Code": "D3410", + "Description": "Apicoectomy – anterior", + "PriceLTEQ21": "471", + "PriceGT21": "407" + }, + { + "Procedure Code": "D3421", + "Description": "Apicoectomy – premolar (first root)", + "PriceLTEQ21": "550", + "PriceGT21": "460" + }, + { + "Procedure Code": "D3425", + "Description": "Apicoectomy – molar (first root)", + "PriceLTEQ21": "639", + "PriceGT21": "598" + }, + { + "Procedure Code": "D3426", + "Description": "Apicoectomy (each additional root)", + "PriceLTEQ21": "264", + "PriceGT21": "230" + }, + { + "Procedure Code": "D4210", + "Description": "Gingivectomy or gingivoplasty - Four or more contiguous teeth or bounded teeth spaces per quadrant", + "PriceLTEQ21": "343", + "PriceGT21": "307" + }, + { + "Procedure Code": "D4211", + "Description": "Gingivectomy or gingivoplasty - one to three contiguous teeth or bounded teeth spaces per quadrant", + "PriceLTEQ21": "133", + "PriceGT21": "111" + }, + { + "Procedure Code": "D4341", + "Description": "Periodontal scaling and root planing - four or more teeth per quadrant", + "PriceLTEQ21": "160", + "PriceGT21": "134" + }, + { + "Procedure Code": "D4342", + "Description": "Periodontal scaling and root planing - one to three teeth, per quadrant", + "PriceLTEQ21": "107", + "PriceGT21": "90" + }, + { + "Procedure Code": "D4346", + "Description": "Scaling in presence of generalized moderate or severe gingival inflammation – full mouth, after oral evaluation", + "PriceLTEQ21": "75", + "PriceGT21": "60" + }, + { + "Procedure Code": "D5110", + "Description": "Complete denture – maxillary", + "PriceLTEQ21": "858", + "PriceGT21": "730" + }, + { + "Procedure Code": "D5120", + "Description": "Complete denture – mandibular", + "PriceLTEQ21": "852", + "PriceGT21": "730" + }, + { + "Procedure Code": "D5130", + "Description": "Immediate denture – maxillary", + "PriceLTEQ21": "935", + "PriceGT21": "NC" + }, + { + "Procedure Code": "D5140", + "Description": "Immediate denture - mandibular", + "PriceLTEQ21": "934", + "PriceGT21": "NC" + }, + { + "Procedure Code": "D5211", + "Description": "Maxillary partial denture - resin base (including retentive/clasping materials, rests and teeth)", + "PriceLTEQ21": "650", + "PriceGT21": "556" + }, + { + "Procedure Code": "D5212", + "Description": "Mandibular partial denture - resin base (including retentive/clasping materials, rests and teeth)", + "PriceLTEQ21": "691", + "PriceGT21": "595" + }, + { + "Procedure Code": "D5213", + "Description": "Maxillary partial denture- cast metal framework with resin denture bases (including retentive/clasping materials, rests and teeth)", + "PriceLTEQ21": "974", + "PriceGT21": "NC" + }, + { + "Procedure Code": "D5214", + "Description": "Mandibular partial denture - cast metal framework with resin denture bases (including retentive/clasping materials, rests and teeth)", + "PriceLTEQ21": "986", + "PriceGT21": "NC" + }, + { + "Procedure Code": "D5225", + "Description": "Maxillary partial denture- flexible base", + "PriceLTEQ21": "974", + "PriceGT21": "NC" + }, + { + "Procedure Code": "D5226", + "Description": "Mandibular partial denture- flexible base", + "PriceLTEQ21": "986", + "PriceGT21": "NC" + }, + { + "Procedure Code": "D5511", + "Description": "Repair broken complete denture base, mandibular", + "PriceLTEQ21": "109", + "PriceGT21": "85" + }, + { + "Procedure Code": "D5512", + "Description": "Repair broken complete denture base, maxillary", + "PriceLTEQ21": "109", + "PriceGT21": "85" + }, + { + "Procedure Code": "D5520", + "Description": "Replace missing or broken teeth - complete denture (each tooth)", + "PriceLTEQ21": "89", + "PriceGT21": "77" + }, + { + "Procedure Code": "D5611", + "Description": "Repair broken resin partial denture base, mandibular", + "PriceLTEQ21": "93", + "PriceGT21": "77" + }, + { + "Procedure Code": "D5612", + "Description": "Repair broken resin partial denture base, maxillary", + "PriceLTEQ21": "93", + "PriceGT21": "77" + }, + { + "Procedure Code": "D5621", + "Description": "Repair broken cast partial denture base, mandibular", + "PriceLTEQ21": "121", + "PriceGT21": "104" + }, + { + "Procedure Code": "D5622", + "Description": "Repair broken cast partial denture base, maxillary", + "PriceLTEQ21": "121", + "PriceGT21": "104" + }, + { + "Procedure Code": "D5630", + "Description": "Repair or replace broken retentive/clasping materials – per tooth", + "PriceLTEQ21": "107", + "PriceGT21": "99" + }, + { + "Procedure Code": "D5640", + "Description": "Replace broken teeth - per tooth", + "PriceLTEQ21": "91", + "PriceGT21": "77" + }, + { + "Procedure Code": "D5650", + "Description": "Add tooth to existing partial denture", + "PriceLTEQ21": "110", + "PriceGT21": "92" + }, + { + "Procedure Code": "D5660", + "Description": "Add clasp to existing partial denture per tooth", + "PriceLTEQ21": "125", + "PriceGT21": "98" + }, + { + "Procedure Code": "D5730", + "Description": "Reline complete maxillary denture (direct)", + "PriceLTEQ21": "188", + "PriceGT21": "158" + }, + { + "Procedure Code": "D5731", + "Description": "Reline lower complete mandibular denture (direct)", + "PriceLTEQ21": "184", + "PriceGT21": "173" + }, + { + "Procedure Code": "D5740", + "Description": "Reline maxillary partial denture(chairside)", + "PriceLTEQ21": "169", + "PriceGT21": "NC" + }, + { + "Procedure Code": "D5741", + "Description": "Reline mandibular partial denture(chairside)", + "PriceLTEQ21": "160", + "PriceGT21": "NC" + }, + { + "Procedure Code": "D5750", + "Description": "Reline complete maxillary denture (indirect)", + "PriceLTEQ21": "255", + "PriceGT21": "214" + }, + { + "Procedure Code": "D5751", + "Description": "Reline complete mandibular denture (indirect)", + "PriceLTEQ21": "256", + "PriceGT21": "215" + }, + { + "Procedure Code": "D5760", + "Description": "Reline maxillary partial denture (laboratory)", + "PriceLTEQ21": "252", + "PriceGT21": "NC" + }, + { + "Procedure Code": "D5761", + "Description": "Reline mandibular partial denture (laboratory)", + "PriceLTEQ21": "252", + "PriceGT21": "NC" + }, + { + "Procedure Code": "D6241", + "Description": "Pontic-porcelain fused metal", + "PriceLTEQ21": "691", + "PriceGT21": "NC" + }, + { + "Procedure Code": "D6751", + "Description": "Retainer crown-porcelain fused to metal", + "PriceLTEQ21": "691", + "PriceGT21": "NC" + }, + { + "Procedure Code": "D6930", + "Description": "Re-cement or re-bond fixed partial denture", + "PriceLTEQ21": "87", + "PriceGT21": "NC" + }, + { + "Procedure Code": "D6980", + "Description": "Fixed partial denture repair", + "PriceLTEQ21": "155", + "PriceGT21": "NC" + }, + { + "Procedure Code": "D6999", + "Description": "Fixed prosthodontic procedure", + "PriceLTEQ21": "IC", + "PriceGT21": "IC" + }, + { + "Procedure Code": "D7111", + "Description": "Extraction, coronal remnants - primary tooth", + "PriceLTEQ21": "80", + "PriceGT21": "75" + }, + { + "Procedure Code": "D7140", + "Description": "Extraction, erupted tooth or exposed root (elevation and/or forceps removal)", + "PriceLTEQ21": "107", + "PriceGT21": "77" + }, + { + "Procedure Code": "D7210", + "Description": "Extraction, erupted tooth requiring removal of bone and/or sectioning of tooth, and including elevation of mucoperiosteal flap if indicated", + "PriceLTEQ21": "179", + "PriceGT21": "149" + }, + { + "Procedure Code": "D7220", + "Description": "Removal of impacted tooth - soft tissue", + "PriceLTEQ21": "223", + "PriceGT21": "191" + }, + { + "Procedure Code": "D7230", + "Description": "Removal of impacted tooth - partially bony", + "PriceLTEQ21": "286", + "PriceGT21": "249" + }, + { + "Procedure Code": "D7240", + "Description": "Removal of impacted tooth - completely bony", + "PriceLTEQ21": "378", + "PriceGT21": "295" + }, + { + "Procedure Code": "D7250", + "Description": "Surgical removal of residual tooth roots (cutting procedure)", + "PriceLTEQ21": "173", + "PriceGT21": "144" + }, + { + "Procedure Code": "D7251", + "Description": "Coronectomy- intentional partial tooth removal, impacted teeth only", + "PriceLTEQ21": "173", + "PriceGT21": "134" + }, + { + "Procedure Code": "D7270", + "Description": "Tooth reimplantation and/or stabilization of accidentally evulsed or displaced tooth", + "PriceLTEQ21": "145", + "PriceGT21": "106" + }, + { + "Procedure Code": "D7280", + "Description": "Surgical access of an unerupted tooth", + "PriceLTEQ21": "452", + "PriceGT21": "NC" + }, + { + "Procedure Code": "D7283", + "Description": "Placement of device to facilitate eruption of impacted tooth", + "PriceLTEQ21": "84", + "PriceGT21": "NC" + }, + { + "Procedure Code": "D7310", + "Description": "Alveoloplasty in conjunction with extractions-four or more teeth or tooth spaces, per quadrant", + "PriceLTEQ21": "163", + "PriceGT21": "142" + }, + { + "Procedure Code": "D7311", + "Description": "Alveoloplasty in conjunction with extractions - one to three teeth or tooth spaces, per quadrant", + "PriceLTEQ21": "146", + "PriceGT21": "128" + }, + { + "Procedure Code": "D7320", + "Description": "Alveoloplasty not in conjunction with extractions- four or more teeth or tooth spaces, per quadrant", + "PriceLTEQ21": "202", + "PriceGT21": "187" + }, + { + "Procedure Code": "D7321", + "Description": "Alveoloplasty not in conjunction with extractions - one to three teeth or tooth spaces, per quadrant", + "PriceLTEQ21": "162", + "PriceGT21": "149" + }, + { + "Procedure Code": "D7340", + "Description": "Vestibuloplasty - ridge extension (second epithelialization)", + "PriceLTEQ21": "796", + "PriceGT21": "747" + }, + { + "Procedure Code": "D7350", + "Description": "Vestibuloplasty - ridge extension (Oral surgeon only)", + "PriceLTEQ21": "1236", + "PriceGT21": "943" + }, + { + "Procedure Code": "D7410", + "Description": "Radical excision - lesion diameter up to 1.25cm", + "PriceLTEQ21": "124", + "PriceGT21": "115" + }, + { + "Procedure Code": "D7411", + "Description": "Excision of benign lesion greater than 1.25 cm", + "PriceLTEQ21": "254", + "PriceGT21": "208" + }, + { + "Procedure Code": "D7450", + "Description": "Removal of benign odontogenic cyst or tumor - lesion diameter up to 1.25 cm", + "PriceLTEQ21": "252", + "PriceGT21": "248" + }, + { + "Procedure Code": "D7451", + "Description": "Removal of benign odontogenic cyst or tumor - lesion diameter greater than 1.25 cm", + "PriceLTEQ21": "343", + "PriceGT21": "288" + }, + { + "Procedure Code": "D7460", + "Description": "Removal of benign nonodontogenic cyst or tumor - lesion diameter up to 1.25 cm", + "PriceLTEQ21": "142", + "PriceGT21": "121" + }, + { + "Procedure Code": "D7461", + "Description": "Removal of benign nonodontogenic cyst or tumor - lesion diameter greater than 1.25 cm", + "PriceLTEQ21": "194", + "PriceGT21": "143" + }, + { + "Procedure Code": "D7471", + "Description": "Removal of lateral exostosis (maxilla or mandible) (Oral surgeon only)", + "PriceLTEQ21": "194", + "PriceGT21": "143" + }, + { + "Procedure Code": "D7472", + "Description": "Removal of torus palatinus (Oral surgeon only)", + "PriceLTEQ21": "194", + "PriceGT21": "143" + }, + { + "Procedure Code": "D7473", + "Description": "Removal of torus mandibularis (Oral surgeon only)", + "PriceLTEQ21": "194", + "PriceGT21": "143" + }, + { + "Procedure Code": "D7961", + "Description": "Buccal/labial frenectomy (frenulectomy)", + "PriceLTEQ21": "353", + "PriceGT21": "107" + }, + { + "Procedure Code": "D7962", + "Description": "Lingual frenectomy (frenulectomy)", + "PriceLTEQ21": "353", + "PriceGT21": "107" + }, + { + "Procedure Code": "D7963", + "Description": "Frenuloplasty", + "PriceLTEQ21": "480", + "PriceGT21": "416" + }, + { + "Procedure Code": "D7970", + "Description": "Excision of hyperplastic tissue - per arch", + "PriceLTEQ21": "334", + "PriceGT21": "246" + }, + { + "Procedure Code": "D7999", + "Description": "Unspecified oral surgery procedure, by report", + "PriceLTEQ21": "IC", + "PriceGT21": "IC" + }, + { + "Procedure Code": "D8010", + "Description": "Limited orthodontic treamtnent of the primary transition (Orthodontist only)", + "PriceLTEQ21": "250", + "PriceGT21": "NC" + }, + { + "Procedure Code": "D8020", + "Description": "Limited orthodontic treatment of the transitional dentition (Orthodontist only)", + "PriceLTEQ21": "250", + "PriceGT21": "NC" + }, + { + "Procedure Code": "D8030", + "Description": "Limited orthodontic treatment of the adolescent dentition (Orthodontist only)", + "PriceLTEQ21": "250", + "PriceGT21": "NC" + }, + { + "Procedure Code": "D8040", + "Description": "Limited orthodontic treatment of the adult dentition (Orthodontist only)", + "PriceLTEQ21": "250", + "PriceGT21": "NC" + }, + { + "Procedure Code": "D8070", + "Description": "Comprehensive orthodontic treatment of the transitional dentition (Orthodontist only)", + "PriceLTEQ21": "1302", + "PriceGT21": "NC" + }, + { + "Procedure Code": "D8080", + "Description": "Comprehensive orthodontic treatment of the adolescent dentition (Orthodontist only)", + "PriceLTEQ21": "1302", + "PriceGT21": "NC" + }, + { + "Procedure Code": "D8090", + "Description": "Comprehensive orthodontic treatment of the adult dentition (Orthodontist only)", + "PriceLTEQ21": "1302", + "PriceGT21": "NC" + }, + { + "Procedure Code": "D8660", + "Description": "Pre-orthodontic treatment examination to monitor growth and development (records fee) (Orthodontist only)", + "PriceLTEQ21": "136", + "PriceGT21": "NC" + }, + { + "Procedure Code": "D8670", + "Description": "Periodic orthodontic treatment visit (Orthodontist only)", + "PriceLTEQ21": "288", + "PriceGT21": "215" + }, + { + "Procedure Code": "D8680", + "Description": "Orthodontic retention (removal of appliances, construction and placement of retainer(s)) (Orthodontist only)", + "PriceLTEQ21": "102", + "PriceGT21": "85" + }, + { + "Procedure Code": "D8703", + "Description": "Replacement of lost or broken retainer- maxillary (Orthodontist only)", + "PriceLTEQ21": "95", + "PriceGT21": "NC" + }, + { + "Procedure Code": "D8704", + "Description": "Replacement of lost or broken retainer- mandibular (Orthodontist only)", + "PriceLTEQ21": "95", + "PriceGT21": "NC" + }, + { + "Procedure Code": "D8999", + "Description": "Unspecified orthodontic procedure, by report (Orthodontist only) I.C I.C** Y Y**", + "PriceLTEQ21": "IC", + "PriceGT21": "IC" + }, + { + "Procedure Code": "D9110", + "Description": "Palliative treatment of dental pain – per visit", + "PriceLTEQ21": "75", + "PriceGT21": "36" + }, + { + "Procedure Code": "D9222", + "Description": "Deep sedation/general anesthesia – first 15 minutes", + "PriceLTEQ21": "109", + "PriceGT21": "90" + }, + { + "Procedure Code": "D9223", + "Description": "Deep sedation/general anesthesia – each additional 15- minute increment", + "PriceLTEQ21": "109", + "PriceGT21": "90" + }, + { + "Procedure Code": "D9230", + "Description": "Analgesia, anxiolysis, inhalation of nitrous oxide", + "PriceLTEQ21": "22", + "PriceGT21": "15" + }, + { + "Procedure Code": "D9248", + "Description": "Nonintravenous conscious sedation", + "PriceLTEQ21": "45", + "PriceGT21": "45" + }, + { + "Procedure Code": "D9310", + "Description": "Consultation- Diagnostic service provided by dentist or physician other than requesting dentist or physician (Specialist only)", + "PriceLTEQ21": "54", + "PriceGT21": "63" + }, + { + "Procedure Code": "D9410", + "Description": "House/extended care facility call, once per facility per day", + "PriceLTEQ21": "36", + "PriceGT21": "39" + }, + { + "Procedure Code": "D9450", + "Description": "Rural add-on encounter payment", + "PriceLTEQ21": "31", + "PriceGT21": "31" + }, + { + "Procedure Code": "D9920", + "Description": "Behavior management, by report", + "PriceLTEQ21": "86", + "PriceGT21": "86" + }, + { + "Procedure Code": "D9930", + "Description": "Treatment of complications (postsurgical) - unusual circumstances, by report", + "PriceLTEQ21": "66", + "PriceGT21": "30" + }, + { + "Procedure Code": "D9941", + "Description": "Fabrication of athletic mouthguard", + "PriceLTEQ21": "85", + "PriceGT21": "NC" + }, + { + "Procedure Code": "D9944", + "Description": "Occlusal guard - hard appliance, full arch", + "PriceLTEQ21": "308", + "PriceGT21": "NC" + }, + { + "Procedure Code": "D9945", + "Description": "Occlusal guard - soft appliance, full arch", + "PriceLTEQ21": "308", + "PriceGT21": "NC" + }, + { + "Procedure Code": "D9946", + "Description": "Occlusal guard - hard appliance, partial arch", + "PriceLTEQ21": "308", + "PriceGT21": "NC" + }, + { + "Procedure Code": "D9999", + "Description": "Unspecified adjunctive procedure, by report", + "PriceLTEQ21": "IC", + "PriceGT21": "IC" + } +] diff --git a/apps/Frontend/src/components/claims/claim-form.tsx b/apps/Frontend/src/components/claims/claim-form.tsx index ad176c7..862b25e 100644 --- a/apps/Frontend/src/components/claims/claim-form.tsx +++ b/apps/Frontend/src/components/claims/claim-form.tsx @@ -10,7 +10,7 @@ import { } from "@/components/ui/select"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Label } from "@/components/ui/label"; -import { X, Calendar as CalendarIcon, HelpCircle } from "lucide-react"; +import { X, Calendar as CalendarIcon, HelpCircle, Trash2 } from "lucide-react"; import { useToast } from "@/hooks/use-toast"; import { Calendar } from "@/components/ui/calendar"; import { @@ -27,7 +27,6 @@ import { TooltipContent, TooltipTrigger, } from "@/components/ui/tooltip"; -import procedureCodes from "../../assets/data/procedureCodes.json"; import { formatLocalDate, parseLocalDate } from "@/utils/dateUtils"; import { Claim, @@ -39,6 +38,12 @@ import { UpdatePatient, } from "@repo/db/types"; import { Decimal } from "decimal.js"; +import { + COMBO_BUTTONS, + mapPricesForForm, + applyComboToForm, + getDescriptionForCode, +} from "@/utils/procedureCombosMapping"; interface ClaimFormData { patientId: number; @@ -252,25 +257,13 @@ export function ClaimForm({ }; // Map Price function - const mapPrices = () => { - const updatedLines = form.serviceLines.map((line) => { - if (line.procedureCode && line.procedureCode.trim() !== "") { - const normalizedCode = line.procedureCode.toUpperCase().trim(); - const procedureInfo = procedureCodes.find( - (p) => p["Procedure Code"].toUpperCase().trim() === normalizedCode - ); - - if (procedureInfo && procedureInfo.Price) { - return { - ...line, - totalBilled: new Decimal(parseFloat(procedureInfo.Price)), - }; - } - } - return line; - }); - - setForm({ ...form, serviceLines: updatedLines }); + const onMapPrice = () => { + setForm((prev) => + mapPricesForForm({ + form: prev, + patientDOB: patient?.dateOfBirth ?? "", + }) + ); }; // FILE UPLOAD ZONE @@ -554,9 +547,13 @@ export function ClaimForm({ -
- Procedure Code - Abbreviation + {/* Header */} +
+
+ + Procedure Code +
+ Info Procedure Date Oral Cavity Area Tooth Number @@ -565,116 +562,128 @@ export function ClaimForm({
{/* Dynamic Rows */} - {form.serviceLines.map((line, i) => ( -
- - updateServiceLine( - i, - "procedureCode", - e.target.value.toUpperCase() - ) - } - /> + {form.serviceLines.map((line, i) => { + const raw = line.procedureCode || ""; + const code = raw.trim(); + const desc = code + ? getDescriptionForCode(code) || "No description available" + : "Enter a procedure code"; -
- - - - - -
- {line.procedureCode && - line.procedureCode.trim() !== "" - ? (() => { - const normalizedCode = line.procedureCode - .toUpperCase() - .trim(); - const procedureInfo = procedureCodes.find( - (p) => - p["Procedure Code"].toUpperCase().trim() === - normalizedCode - ); - return procedureInfo - ? procedureInfo.Description || - "No description available" - : "Enter a valid procedure code"; - })() - : "Enter a procedure code"} -
-
-
-
- - {/* Date Picker */} - - - - - - updateProcedureDate(i, date)} + + + + updateServiceLine( + i, + "procedureCode", + e.target.value.toUpperCase() + ) + } /> - - +
- - updateServiceLine(i, "oralCavityArea", e.target.value) - } - /> - - updateServiceLine(i, "toothNumber", e.target.value) - } - /> - - updateServiceLine(i, "toothSurface", e.target.value) - } - /> - { - updateServiceLine(i, "totalBilled", e.target.value); - }} - onBlur={(e) => { - const val = parseFloat(e.target.value); - const rounded = Math.round(val * 100) / 100; - updateServiceLine( - i, - "totalBilled", - isNaN(rounded) ? 0 : rounded - ); - }} - /> -
- ))} +
+ + + + + +
{desc}
+
+
+
+ + {/* Date Picker */} + + + + + + updateProcedureDate(i, date)} + /> + + + + + updateServiceLine(i, "oralCavityArea", e.target.value) + } + /> + + updateServiceLine(i, "toothNumber", e.target.value) + } + /> + + updateServiceLine(i, "toothSurface", e.target.value) + } + /> + { + updateServiceLine(i, "totalBilled", e.target.value); + }} + onBlur={(e) => { + const val = parseFloat(e.target.value); + const rounded = Math.round(val * 100) / 100; + updateServiceLine( + i, + "totalBilled", + isNaN(rounded) ? 0 : rounded + ); + }} + /> + + ); + })}
- - - - + ))} +
diff --git a/apps/Frontend/src/utils/procedureCombos.ts b/apps/Frontend/src/utils/procedureCombos.ts new file mode 100644 index 0000000..7391b51 --- /dev/null +++ b/apps/Frontend/src/utils/procedureCombos.ts @@ -0,0 +1,37 @@ +export const PROCEDURE_COMBOS: Record< + string, + { id: string; label: string; codes: string[] } +> = { + childRecall: { + id: "childRecall", + label: "Child Recall", + codes: [ + "D0120", + "D1120", + "D0272", + "D1208", + "D2331", + "D0120", + "D1120", + "D0272", + "D1208", + "D2331", + "D0120", + "D1120", + "D0272", + "D1208", + "D2331", + ], + }, + adultProphy: { + id: "adultProphy", + label: "Adult Prophy", + codes: ["D0150", "D1110", "D0274", "D1208"], + }, + bitewingsOnly: { + id: "bitewingsOnly", + label: "Bitewings Only", + codes: ["D0272"], + }, + // add more… +}; diff --git a/apps/Frontend/src/utils/procedureCombosMapping.ts b/apps/Frontend/src/utils/procedureCombosMapping.ts new file mode 100644 index 0000000..b971f44 --- /dev/null +++ b/apps/Frontend/src/utils/procedureCombosMapping.ts @@ -0,0 +1,270 @@ +import { InputServiceLine } from "@repo/db/types"; +import Decimal from "decimal.js"; +import rawCodeTable from "@/assets/data/procedureCodes.json"; +import { PROCEDURE_COMBOS } from "./procedureCombos"; + +/* ----------------------------- Types ----------------------------- */ +export type CodeRow = { + "Procedure Code": string; + Description?: string; + Price?: string | number | null; + PriceLTEQ21?: string | number | null; + PriceGT21?: string | number | null; + [k: string]: unknown; +}; +const CODE_TABLE = rawCodeTable as CodeRow[]; + +export type ClaimFormLike = { + serviceDate: string; // form-level service date + serviceLines: InputServiceLine[]; +}; + +export type ApplyOptions = { + append?: boolean; + startIndex?: number; + lineDate?: string; + clearTrailing?: boolean; + replaceAll?: boolean; +}; +/* ----------------------------- Helpers ----------------------------- */ + +export const COMBO_BUTTONS = Object.values(PROCEDURE_COMBOS).map((c) => ({ + id: c.id, + label: c.label, +})); + +// Build a fast lookup map keyed by normalized code +const normalizeCode = (code: string) => code.replace(/\s+/g, "").toUpperCase(); + +const CODE_MAP: Map = (() => { + const m = new Map(); + for (const r of CODE_TABLE) { + const k = normalizeCode(String(r["Procedure Code"] || "")); + if (k && !m.has(k)) m.set(k, r); + } + return m; +})(); + +// this function is solely for abbrevations feature in claim-form +export function getDescriptionForCode( + code: string | undefined +): string | undefined { + if (!code) return undefined; + const row = CODE_MAP.get(normalizeCode(code)); + return row?.Description; +} + +const isBlankPrice = (v: unknown) => { + if (v == null) return true; + const s = String(v).trim().toUpperCase(); + return s === "" || s === "IC" || s === "NC"; +}; + +const toDecimalOrZero = (v: unknown): Decimal => { + if (isBlankPrice(v)) return new Decimal(0); + const n = typeof v === "string" ? parseFloat(v) : (v as number); + return new Decimal(Number.isFinite(n) ? n : 0); +}; + +// Accepts string or Date, supports MM/DD/YYYY and YYYY-MM-DD +type DateInput = string | Date; + +const parseDate = (d: DateInput): Date => { + if (d instanceof Date) + return new Date(d.getFullYear(), d.getMonth(), d.getDate()); + const s = String(d).trim(); + // MM/DD/YYYY + const mdy = /^(\d{2})\/(\d{2})\/(\d{4})$/; + const m1 = mdy.exec(s); + if (m1) { + const mm = Number(m1[1]); + const dd = Number(m1[2]); + const yyyy = Number(m1[3]); + return new Date(yyyy, mm - 1, dd); + } + // YYYY-MM-DD + const ymd = /^(\d{4})-(\d{2})-(\d{2})$/; + const m2 = ymd.exec(s); + if (m2) { + const yyyy = Number(m2[1]); + const mm = Number(m2[2]); + const dd = Number(m2[3]); + return new Date(yyyy, mm - 1, dd); + } + // Fallback + return new Date(s); +}; + +const ageOnDate = (dob: DateInput, on: DateInput): number => { + const birth = parseDate(dob); + const ref = parseDate(on); + let age = ref.getFullYear() - birth.getFullYear(); + const hadBirthday = + ref.getMonth() > birth.getMonth() || + (ref.getMonth() === birth.getMonth() && ref.getDate() >= birth.getDate()); + if (!hadBirthday) age -= 1; + return age; +}; + +/** + * Price chooser that respects your age rules and IC/NC semantics. + * - If <=21 → PriceLTEQ21 (if present and not IC/NC/blank) else Price. + * - If >21 → PriceGT21 (if present and not IC/NC/blank) else Price. + * - If chosen field is IC/NC/blank → 0 (leave empty). + */ +export function pickPriceForRowByAge(row: CodeRow, age: number): Decimal { + if (age <= 21) { + if (!isBlankPrice(row.PriceLTEQ21)) return toDecimalOrZero(row.PriceLTEQ21); + } else { + if (!isBlankPrice(row.PriceGT21)) return toDecimalOrZero(row.PriceGT21); + } + // Fallback to Price if tiered not available/blank + if (!isBlankPrice(row.Price)) return toDecimalOrZero(row.Price); + return new Decimal(0); +} + +/** + * Gets price for a code using age & code table. + */ +function getPriceForCodeWithAgeFromMap( + map: Map, + code: string, + age: number +): Decimal { + const row = map.get(normalizeCode(code)); + return row ? pickPriceForRowByAge(row, age) : new Decimal(0); +} + +// helper keeping lines empty, +export const makeEmptyLine = (lineDate: string): InputServiceLine => ({ + procedureCode: "", + procedureDate: lineDate, + oralCavityArea: "", + toothNumber: "", + toothSurface: "", + totalBilled: new Decimal(0), + totalAdjusted: new Decimal(0), + totalPaid: new Decimal(0), +}); + +// Ensure the array has at least `min` lines; append blank ones if needed. +const ensureCapacity = ( + lines: (InputServiceLine | undefined)[], + min: number, + lineDate: string +) => { + while (lines.length < min) { + lines.push(makeEmptyLine(lineDate)); + } +}; + +/* ------------------------- Main entry points ------------------------- */ + +/** + * Map prices for ALL existing lines in a form (your "Map Price" button), + * using patient's DOB and the form's serviceDate (or per-line procedureDate). + * Returns a NEW form object (immutable). + */ +export function mapPricesForForm(params: { + form: T; + patientDOB: DateInput; +}): T { + const { form, patientDOB } = params; + return { + ...form, + serviceLines: form.serviceLines.map((ln) => { + const age = ageOnDate(patientDOB, form.serviceDate); + const code = normalizeCode(ln.procedureCode || ""); + if (!code) return { ...ln }; + const price = getPriceForCodeWithAgeFromMap(CODE_MAP, code, age); + return { ...ln, procedureCode: code, totalBilled: price }; + }), + }; +} + +/** + * Apply a preset combo (fills codes & prices) using patientDOB and serviceDate. + * Returns a NEW form object (immutable). + */ +export function applyComboToForm( + form: T, + comboId: keyof typeof PROCEDURE_COMBOS, + patientDOB: DateInput, + options: ApplyOptions = {} +): T { + const preset = PROCEDURE_COMBOS[String(comboId)]; + if (!preset) return form; + + const { + append = true, + startIndex, + lineDate = form.serviceDate, + clearTrailing = false, + replaceAll = false, // NEW + } = options; + + const next: T = { ...form, serviceLines: [...form.serviceLines] }; + + // Replace-all: blank all existing and start from 0 + if (replaceAll) { + for (let i = 0; i < next.serviceLines.length; i++) { + next.serviceLines[i] = makeEmptyLine(lineDate); + } + } + + // determine insertion index + let insertAt = 0; + if (!replaceAll) { + if (append) { + let last = -1; + next.serviceLines.forEach((ln, i) => { + if (ln.procedureCode?.trim()) last = i; + }); + insertAt = Math.max(0, last + 1); + } else if (typeof startIndex === "number") { + insertAt = Math.max( + 0, + Math.min(startIndex, next.serviceLines.length - 1) + ); + } + } // if replaceAll, insertAt stays 0 + + // Make sure we have enough rows for the whole combo + ensureCapacity(next.serviceLines, insertAt + preset.codes.length, lineDate); + + // Age on the specific line date we will set + const age = ageOnDate(patientDOB, lineDate); + + for (let j = 0; j < preset.codes.length; j++) { + const i = insertAt + j; + if (i >= next.serviceLines.length) break; + + const codeRaw = preset.codes[j]; + if (!codeRaw) continue; + const code = normalizeCode(codeRaw); + const price = getPriceForCodeWithAgeFromMap(CODE_MAP, code, age); + + const original = next.serviceLines[i]; + + next.serviceLines[i] = { + ...original, + procedureCode: code, + procedureDate: lineDate, + oralCavityArea: original?.oralCavityArea ?? "", + toothNumber: original?.toothNumber ?? "", + toothSurface: original?.toothSurface ?? "", + totalBilled: price, + totalAdjusted: new Decimal(0), + totalPaid: new Decimal(0), + } as InputServiceLine; + } + + if (replaceAll || clearTrailing) { + const after = insertAt + preset.codes.length; + for (let i = after; i < next.serviceLines.length; i++) { + next.serviceLines[i] = makeEmptyLine(lineDate); + } + } + + return next; +} diff --git a/apps/pdfProcedureCode/MH.pdf b/apps/pdfProcedureCode/MH.pdf new file mode 100644 index 0000000..a4d6334 Binary files /dev/null and b/apps/pdfProcedureCode/MH.pdf differ diff --git a/apps/pdfProcedureCode/compareJson.py b/apps/pdfProcedureCode/compareJson.py new file mode 100644 index 0000000..dedce3f --- /dev/null +++ b/apps/pdfProcedureCode/compareJson.py @@ -0,0 +1,96 @@ +#!/usr/bin/env python3 +""" +Compare a main dental JSON file with one or more other JSON files and +return all records whose 'Procedure Code' is NOT present in the main file. + +- Matching key: 'Procedure Code' (case-insensitive, trimmed). +- Keeps the full record from the other files (including extra fields like 'Full Price'). +- Deduplicates by Procedure Code across the collected "missing" results. + +CONFIG: set MAIN_PATH, OTHER_PATHS, OUT_PATH below. +""" + +import json +from pathlib import Path +from typing import List, Dict, Any + +# ========================= +# CONFIG — EDIT THESE ONLY +# ========================= +MAIN_PATH = "procedureCodesMain.json" # your main JSON (with PriceLTEQ21/PriceGT21) +OTHER_PATHS = [ + "procedureCodesOld.json", # one or more other JSON files to compare against the main + # "other2.json", +] +OUT_PATH = "not_in_main.json" # where to write the results +# ========================= + + +def _load_json_any(path: str) -> List[Dict[str, Any]]: + """ + Load JSON. Accept: + - a list of objects + - a single object (wraps into a list) + """ + with open(path, "r", encoding="utf-8") as f: + data = json.load(f) + if isinstance(data, dict): + return [data] + if isinstance(data, list): + # filter out non-dict items defensively + return [x for x in data if isinstance(x, dict)] + raise ValueError(f"Unsupported JSON top-level type in {path}: {type(data)}") + + +def _norm_code(record: Dict[str, Any]) -> str: + # Normalize the 'Procedure Code' for matching + code = str(record.get("Procedure Code", "")).strip().upper() + # Some PDFs might have stray spaces, tabs, or zero-width chars + code = "".join(ch for ch in code if not ch.isspace()) + return code + + +def collect_main_codes(main_path: str) -> set: + main_items = _load_json_any(main_path) + codes = {_norm_code(rec) for rec in main_items if _norm_code(rec)} + return codes + + +def collect_missing_records(other_paths: List[str], main_codes: set) -> List[Dict[str, Any]]: + missing: Dict[str, Dict[str, Any]] = {} # map normalized code -> record + for p in other_paths: + items = _load_json_any(p) + for rec in items: + code_norm = _norm_code(rec) + if not code_norm: + continue + if code_norm not in main_codes and code_norm not in missing: + # Keep the full original record + missing[code_norm] = rec + # return in a stable, sorted order by code + return [missing[k] for k in sorted(missing.keys())] + + +def main(): + # Validate files exist + if not Path(MAIN_PATH).exists(): + raise FileNotFoundError(f"Main file not found: {MAIN_PATH}") + for p in OTHER_PATHS: + if not Path(p).exists(): + raise FileNotFoundError(f"Other file not found: {p}") + + main_codes = collect_main_codes(MAIN_PATH) + missing_records = collect_missing_records(OTHER_PATHS, main_codes) + + with open(OUT_PATH, "w", encoding="utf-8") as f: + json.dump(missing_records, f, ensure_ascii=False, indent=2) + + print(f"Main codes: {len(main_codes)}") + print(f"Missing from main: {len(missing_records)}") + print(f"Wrote results to {OUT_PATH}") + # Also echo to stdout + print(json.dumps(missing_records, ensure_ascii=False, indent=2)) + + +if __name__ == "__main__": + main() diff --git a/apps/pdfProcedureCode/extract_bypage.py b/apps/pdfProcedureCode/extract_bypage.py new file mode 100644 index 0000000..ab13136 --- /dev/null +++ b/apps/pdfProcedureCode/extract_bypage.py @@ -0,0 +1,183 @@ +import re +import json +from typing import List, Dict +import fitz # PyMuPDF + + +# ========================= +# CONFIG — EDIT THESE ONLY +# ========================= +PDF_PATH = "MH.pdf" # path to your PDF +PAGES = [2] # 0-based page indexes to parse, e.g., [2] for the page you showed +OUT_PATH = "output.json" # where to write JSON +FIRST_PRICE_IS_LTE21 = True # True => first price line is <=21; False => first price is >21 +PRINT_PAGE_TEXT = False # set True if you want to print the raw page text for sanity check +# ========================= + + +# --- patterns --- +code_line_re = re.compile(r"^\s*(D\d{4})\s*$") +# a price token is either '$123', '$1,234.50', '123', '123.45', or 'NC' +price_line_re = re.compile(r"^\s*(?:\$\s*)?(\d{1,3}(?:,\d{3})*(?:\.\d{2})?|\d+(?:\.\d{2})?|NC)\s*$", re.IGNORECASE) +# lines that definitely start a notes block we should ignore once prices are done +note_starters_re = re.compile(r"^(Teeth\b|One of\b|--|—|–|Age limitation:|CR\b)", re.IGNORECASE) + + +def normalize_ws(s: str) -> str: + s = s.replace("\u00a0", " ") + s = re.sub(r"[ \t]+", " ", s) + s = re.sub(r"\s*\n\s*", " ", s) + s = re.sub(r"\s{2,}", " ", s) + return s.strip(" ,.;:-•·\n\t") + + +def clean_money(token: str) -> str: + if token.upper() == "NC": + return "NC" + return token.replace(",", "").lstrip("$").strip() + + +def get_page_lines(pdf_path: str, pages: List[int]) -> List[str]: + doc = fitz.open(pdf_path) + try: + max_idx = len(doc) - 1 + for p in pages: + if p < 0 or p > max_idx: + raise ValueError(f"Invalid page index {p}. Valid range is 0..{max_idx}.") + lines: List[str] = [] + for p in pages: + text = doc.load_page(p).get_text("text") or "" + if PRINT_PAGE_TEXT: + print(f"\n--- RAW PAGE {p} ---\n{text}") + # keep line boundaries; later we parse line-by-line + lines.extend(text.splitlines()) + return lines + finally: + doc.close() + + +def extract_records(lines: List[str]) -> List[Dict[str, str]]: + out: List[Dict[str, str]] = [] + i = 0 + n = len(lines) + + while i < n: + line = lines[i].strip() + + # seek a code line + mcode = code_line_re.match(line) + if not mcode: + i += 1 + continue + + code = mcode.group(1) + i += 1 + + # gather description lines until we encounter price lines + desc_lines: List[str] = [] + # skip blank lines before description + while i < n and not lines[i].strip(): + i += 1 + + # collect description lines (usually 1–3) until first price token + # stop also if we accidentally hit another code (defensive) + j = i + while j < n: + s = lines[j].strip() + if not s: + # blank line inside description — consider description ended if the next is a price + # but we don't advance here; break and let price parsing handle it + break + if code_line_re.match(s): + # next code — no prices found; abandon this broken record + break + if price_line_re.match(s): + # reached price section + break + if note_starters_re.match(s): + # encountered a note before price — treat as end of description; prices may be missing + break + desc_lines.append(s) + j += 1 + + # advance i to where we left off + i = j + + description = normalize_ws(" ".join(desc_lines)) + + # collect up to two price tokens + prices: List[str] = [] + while i < n and len(prices) < 2: + s = lines[i].strip() + if not s: + i += 1 + continue + if code_line_re.match(s): + # new record — stop; this means we never got prices (malformed) + break + mprice = price_line_re.match(s) + if mprice: + prices.append(clean_money(mprice.group(1))) + i += 1 + continue + # if we encounter a note/flags block, skip forward until the next code/blank + if note_starters_re.match(s) or s in {"Y", "NC"}: + # skip this block quickly + i += 1 + # keep skipping subsequent non-empty, non-code lines until a blank or next code + while i < n: + t = lines[i].strip() + if not t or code_line_re.match(t): + break + i += 1 + # now let the outer loop proceed + continue + # unrecognized line: if prices already found, we can break; else skip + if prices: + break + i += 1 + + if len(prices) < 2: + # couldn't find 2 prices reliably; skip this record + continue + + if FIRST_PRICE_IS_LTE21: + price_lte21, price_gt21 = prices[0], prices[1] + else: + price_lte21, price_gt21 = prices[1], prices[0] + + out.append( + { + "Procedure Code": code, + "Description": description, + "PriceLTEQ21": price_lte21, + "PriceGT21": price_gt21, + } + ) + + # after prices, skip forward until next code or blank block end + while i < n: + s = lines[i].strip() + if not s: + i += 1 + break + if code_line_re.match(s): + # next record will pick this up + break + i += 1 + + return out + + +def extract_pdf_to_json(pdf_path: str, pages: List[int], out_path: str) -> List[Dict[str, str]]: + lines = get_page_lines(pdf_path, pages) + data = extract_records(lines) + with open(out_path, "w", encoding="utf-8") as f: + json.dump(data, f, ensure_ascii=False, indent=2) + return data + + +if __name__ == "__main__": + data = extract_pdf_to_json(PDF_PATH, PAGES, OUT_PATH) + print(f"Wrote {len(data)} rows to {OUT_PATH}") + print(json.dumps(data, ensure_ascii=False, indent=2)) diff --git a/apps/pdfProcedureCode/extract_byrange.py b/apps/pdfProcedureCode/extract_byrange.py new file mode 100644 index 0000000..2256799 --- /dev/null +++ b/apps/pdfProcedureCode/extract_byrange.py @@ -0,0 +1,208 @@ +#!/usr/bin/env python3 +""" +MassHealth dental PDF parser (PyMuPDF / fitz) — PAGE RANGE VERSION + +Parses rows like: + +D2160 +Amalgam-three surfaces, +primary or permanent +$110 +$92 +Y +Y +... + +Outputs a single JSON with records from the chosen page range (inclusive). + +Config: +- PDF_PATH: path to the PDF +- PAGE_START, PAGE_END: 1-based page numbers (inclusive) +- FIRST_PRICE_IS_LTE21: True => first price line is <=21; False => first price is >21 +- OUT_PATH: output JSON path +""" + +import re +import json +from typing import List, Dict +import fitz # PyMuPDF + + +# ========================= +# CONFIG — EDIT THESE ONLY +# ========================= +PDF_PATH = "MH.pdf" # path to your PDF +PAGE_START = 1 # 1-based inclusive start page (e.g., 1) +PAGE_END = 12 # 1-based inclusive end page (e.g., 5) +OUT_PATH = "output.json" # single JSON file containing all parsed rows +FIRST_PRICE_IS_LTE21 = True # True => first price line is <=21; False => first price is >21 +PRINT_PAGE_TEXT = False # set True to print raw text for each page +# ========================= + + +# --- patterns --- +code_line_re = re.compile(r"^\s*(D\d{4})\s*$") +# a price token is either '$123', '$1,234.50', '123', '123.45', or 'NC' +price_line_re = re.compile(r"^\s*(?:\$\s*)?(\d{1,3}(?:,\d{3})*(?:\.\d{2})?|\d+(?:\.\d{2})?|NC)\s*$", re.IGNORECASE) +# lines that definitely start a notes block to ignore once prices are done +note_starters_re = re.compile(r"^(Teeth\b|One of\b|--|—|–|Age limitation:|CR\b)", re.IGNORECASE) + + +def normalize_ws(s: str) -> str: + s = s.replace("\u00a0", " ") + s = re.sub(r"[ \t]+", " ", s) + s = re.sub(r"\s*\n\s*", " ", s) + s = re.sub(r"\s{2,}", " ", s) + return s.strip(" ,.;:-•·\n\t") + + +def clean_money(token: str) -> str: + if token.upper() == "NC": + return "NC" + return token.replace(",", "").lstrip("$").strip() + + +def get_page_lines(pdf_path: str, page_start_1b: int, page_end_1b: int) -> List[str]: + if page_start_1b <= 0 or page_end_1b <= 0: + raise ValueError("PAGE_START and PAGE_END must be >= 1 (1-based).") + if page_start_1b > page_end_1b: + raise ValueError("PAGE_START cannot be greater than PAGE_END.") + + doc = fitz.open(pdf_path) + try: + last_idx_0b = len(doc) - 1 + # convert to 0-based inclusive range + start_0b = page_start_1b - 1 + end_0b = page_end_1b - 1 + if start_0b < 0 or end_0b > last_idx_0b: + raise ValueError(f"Page range out of bounds. Valid 1-based range is 1..{last_idx_0b + 1}.") + lines: List[str] = [] + for p in range(start_0b, end_0b + 1): + text = doc.load_page(p).get_text("text") or "" + if PRINT_PAGE_TEXT: + print(f"\n--- RAW PAGE {p} (0-based; shown as {p+1} 1-based) ---\n{text}") + lines.extend(text.splitlines()) + return lines + finally: + doc.close() + + +def extract_records(lines: List[str]) -> List[Dict[str, str]]: + out: List[Dict[str, str]] = [] + i = 0 + n = len(lines) + + while i < n: + line = lines[i].strip() + + # seek a code line + mcode = code_line_re.match(line) + if not mcode: + i += 1 + continue + + code = mcode.group(1) + i += 1 + + # gather description lines until we encounter price lines + desc_lines: List[str] = [] + # skip blank lines before description + while i < n and not lines[i].strip(): + i += 1 + + # collect description lines (usually 1–3) until first price token + # stop also if we accidentally hit another code (defensive) + j = i + while j < n: + s = lines[j].strip() + if not s: + break + if code_line_re.match(s): + # next code — description ended abruptly (malformed) + break + if price_line_re.match(s): + # reached price section + break + if note_starters_re.match(s): + # encountered a note before price — treat as end of description; prices may be missing + break + desc_lines.append(s) + j += 1 + + # advance i to where we left off + i = j + + description = normalize_ws(" ".join(desc_lines)) + + # collect up to two price tokens + prices: List[str] = [] + while i < n and len(prices) < 2: + s = lines[i].strip() + if not s: + i += 1 + continue + if code_line_re.match(s): + # new record — stop; this means we never got prices (malformed) + break + mprice = price_line_re.match(s) + if mprice: + prices.append(clean_money(mprice.group(1))) + i += 1 + continue + # if we encounter a note/flags block, skip forward until a blank or next code + if note_starters_re.match(s) or s in {"Y", "NC"}: + i += 1 + while i < n: + t = lines[i].strip() + if not t or code_line_re.match(t): + break + i += 1 + continue + # unrecognized line: if we already captured some prices, break; else skip + if prices: + break + i += 1 + + if len(prices) < 2: + # couldn't find 2 prices reliably; skip this record + continue + + if FIRST_PRICE_IS_LTE21: + price_lte21, price_gt21 = prices[0], prices[1] + else: + price_lte21, price_gt21 = prices[1], prices[0] + + out.append( + { + "Procedure Code": code, + "Description": description, + "PriceLTEQ21": price_lte21, + "PriceGT21": price_gt21, + } + ) + + # after prices, skip forward until next code or blank block end + while i < n: + s = lines[i].strip() + if not s: + i += 1 + break + if code_line_re.match(s): + break + i += 1 + + return out + + +def extract_pdf_range_to_json(pdf_path: str, page_start_1b: int, page_end_1b: int, out_path: str) -> List[Dict[str, str]]: + lines = get_page_lines(pdf_path, page_start_1b, page_end_1b) + data = extract_records(lines) + with open(out_path, "w", encoding="utf-8") as f: + json.dump(data, f, ensure_ascii=False, indent=2) + return data + + +if __name__ == "__main__": + data = extract_pdf_range_to_json(PDF_PATH, PAGE_START, PAGE_END, OUT_PATH) + print(f"Wrote {len(data)} rows to {OUT_PATH}") + print(json.dumps(data, ensure_ascii=False, indent=2)) diff --git a/apps/pdfProcedureCode/not_in_main.json b/apps/pdfProcedureCode/not_in_main.json new file mode 100644 index 0000000..e762c9d --- /dev/null +++ b/apps/pdfProcedureCode/not_in_main.json @@ -0,0 +1,192 @@ +[ + { + "Procedure Code": "D0120", + "Description": "perio exam", + "Price": "105" + }, + { + "Procedure Code": "D0140", + "Description": "limited exam", + "Price": "90" + }, + { + "Procedure Code": "D0150", + "Description": "comprehensive exam", + "Price": "120" + }, + { + "Procedure Code": "D0210", + "Description": "Fmx.", + "Price": "120" + }, + { + "Procedure Code": "D0220", + "Description": "first PA.", + "Price": "60" + }, + { + "Procedure Code": "D0230", + "Description": "2nd PA.", + "Price": "50" + }, + { + "Procedure Code": "D0272", + "Description": "2 BW", + "Price": "80" + }, + { + "Procedure Code": "D0274", + "Description": "4BW", + "Price": "160" + }, + { + "Procedure Code": "D0330", + "Description": "pano", + "Price": "150" + }, + { + "Procedure Code": "D0364", + "Description": "Less than one jaw", + "Price": "350" + }, + { + "Procedure Code": "D0365", + "Description": "Mand", + "Price": "350" + }, + { + "Procedure Code": "D0366", + "Description": "Max", + "Price": "350" + }, + { + "Procedure Code": "D0367", + "Description": "", + "Price": "400" + }, + { + "Procedure Code": "D0368", + "Description": "include TMJ", + "Price": "375" + }, + { + "Procedure Code": "D0380", + "Description": "Less than one jaw", + "Price": "300" + }, + { + "Procedure Code": "D0381", + "Description": "Mand", + "Price": "300" + }, + { + "Procedure Code": "D0382", + "Description": "Max", + "Price": "300" + }, + { + "Procedure Code": "D0383", + "Description": "", + "Price": "350" + }, + { + "Procedure Code": "D1110", + "Description": "adult prophy", + "Price": "150" + }, + { + "Procedure Code": "D1120", + "Description": "child prophy", + "Price": "120" + }, + { + "Procedure Code": "D1208", + "Description": "FL", + "Price": "90" + }, + { + "Procedure Code": "D1351", + "Description": "sealant", + "Price": "80" + }, + { + "Procedure Code": "D1999", + "Description": "", + "Price": "50" + }, + { + "Procedure Code": "D2140", + "Description": "amalgam, one surface", + "Price": "150" + }, + { + "Procedure Code": "D2150", + "Description": "amalgam, two surface", + "Price": "200" + }, + { + "Procedure Code": "D2955", + "Description": "post renoval", + "Price": "350" + }, + { + "Procedure Code": "D4910", + "Description": "perio maintains", + "Price": "250" + }, + { + "Procedure Code": "D5510", + "Description": "Repair broken complete denture base (QUAD)", + "Price": "400" + }, + { + "Procedure Code": "D6056", + "Description": "pre fab abut", + "Price": "750" + }, + { + "Procedure Code": "D6057", + "Description": "custom abut", + "Price": "800" + }, + { + "Procedure Code": "D6058", + "Description": "porcelain, implant crown, ceramic crown", + "Price": "1400" + }, + { + "Procedure Code": "D6059", + "Description": "", + "Price": "1400" + }, + { + "Procedure Code": "D6100", + "Description": "", + "Price": "320" + }, + { + "Procedure Code": "D6110", + "Description": "implant", + "Price": "1600" + }, + { + "Procedure Code": "D6242", + "Description": "noble metal. For united", + "Price": "1400" + }, + { + "Procedure Code": "D6245", + "Description": "porcelain, not for united", + "Price": "1400" + }, + { + "Procedure Code": "D7910", + "Description": "suture, small wound up to 5 mm", + "Price": "400" + }, + { + "Procedure Code": "D7950", + "Description": "max", + "Price": "800" + } +] \ No newline at end of file diff --git a/apps/pdfProcedureCode/procedureCodes.json b/apps/pdfProcedureCode/procedureCodes.json new file mode 100644 index 0000000..912b351 --- /dev/null +++ b/apps/pdfProcedureCode/procedureCodes.json @@ -0,0 +1,1026 @@ +[ + { + "Procedure Code": "D0120", + "Description": "perio exam", + "Price": "105" + }, + { + "Procedure Code": "D0140", + "Description": "limited exam", + "Price": "90" + }, + { + "Procedure Code": "D0150", + "Description": "comprehensive exam", + "Price": "120" + }, + { + "Procedure Code": "D0210", + "Description": "Fmx.", + "Price": "120" + }, + { + "Procedure Code": "D0220", + "Description": "first PA.", + "Price": "60" + }, + { + "Procedure Code": "D0230", + "Description": "2nd PA.", + "Price": "50" + }, + { + "Procedure Code": "D0272", + "Description": "2 BW", + "Price": "80" + }, + { + "Procedure Code": "D0274", + "Description": "4BW", + "Price": "160" + }, + { + "Procedure Code": "D0330", + "Description": "pano", + "Price": "150" + }, + { + "Procedure Code": "D0364", + "Description": "Less than one jaw", + "Price": "350" + }, + { + "Procedure Code": "D0365", + "Description": "Mand", + "Price": "350" + }, + { + "Procedure Code": "D0366", + "Description": "Max", + "Price": "350" + }, + { + "Procedure Code": "D0367", + "Description": "", + "Price": "400" + }, + { + "Procedure Code": "D0368", + "Description": "include TMJ", + "Price": "375" + }, + { + "Procedure Code": "D0380", + "Description": "Less than one jaw", + "Price": "300" + }, + { + "Procedure Code": "D0381", + "Description": "Mand", + "Price": "300" + }, + { + "Procedure Code": "D0382", + "Description": "Max", + "Price": "300" + }, + { + "Procedure Code": "D0383", + "Description": "", + "Price": "350" + }, + { + "Procedure Code": "D1110", + "Description": "adult prophy", + "Price": "150" + }, + { + "Procedure Code": "D1120", + "Description": "child prophy", + "Price": "120" + }, + { + "Procedure Code": "D1208", + "Description": "FL", + "Price": "90" + }, + { + "Procedure Code": "D1351", + "Description": "sealant", + "Price": "80" + }, + { + "Procedure Code": "D1999", + "Description": "", + "Price": "50" + }, + { + "Procedure Code": "D2140", + "Description": "amalgam, one surface", + "Price": "150" + }, + { + "Procedure Code": "D2150", + "Description": "amalgam, two surface", + "Price": "200" + }, + { + "Procedure Code": "D2955", + "Description": "post renoval", + "Price": "350" + }, + { + "Procedure Code": "D4910", + "Description": "perio maintains", + "Price": "250" + }, + { + "Procedure Code": "D5510", + "Description": "Repair broken complete denture base (QUAD)", + "Price": "400" + }, + { + "Procedure Code": "D6056", + "Description": "pre fab abut", + "Price": "750" + }, + { + "Procedure Code": "D6057", + "Description": "custom abut", + "Price": "800" + }, + { + "Procedure Code": "D6058", + "Description": "porcelain, implant crown, ceramic crown", + "Price": "1400" + }, + { + "Procedure Code": "D6059", + "Description": "", + "Price": "1400" + }, + { + "Procedure Code": "D6100", + "Description": "", + "Price": "320" + }, + { + "Procedure Code": "D6110", + "Description": "implant", + "Price": "1600" + }, + { + "Procedure Code": "D6242", + "Description": "noble metal. For united", + "Price": "1400" + }, + { + "Procedure Code": "D6245", + "Description": "porcelain, not for united", + "Price": "1400" + }, + { + "Procedure Code": "D7910", + "Description": "suture, small wound up to 5 mm", + "Price": "400" + }, + { + "Procedure Code": "D7950", + "Description": "max", + "Price": "800" + }, + { + "Procedure Code": "D2160", + "Description": "Amalgam-three surfaces, primary or permanent", + "PriceLTEQ21": "110", + "PriceGT21": "92" + }, + { + "Procedure Code": "D2161", + "Description": "Amalgam-four or more surfaces, primary or permanent", + "PriceLTEQ21": "137", + "PriceGT21": "116" + }, + { + "Procedure Code": "D2330", + "Description": "Resin-based composite – one surface, anterior", + "PriceLTEQ21": "98", + "PriceGT21": "72" + }, + { + "Procedure Code": "D2331", + "Description": "Resin-based composite – two surfaces, anterior", + "PriceLTEQ21": "118", + "PriceGT21": "92" + }, + { + "Procedure Code": "D2332", + "Description": "Resin-based composite – three surfaces, anterior", + "PriceLTEQ21": "147", + "PriceGT21": "116" + }, + { + "Procedure Code": "D2335", + "Description": "Resin-based composite – four or more surfaces or involving incisal angle (anterior)", + "PriceLTEQ21": "188", + "PriceGT21": "146" + }, + { + "Procedure Code": "D2390", + "Description": "Resin-based composite crown, anterior", + "PriceLTEQ21": "133", + "PriceGT21": "NC" + }, + { + "Procedure Code": "D2391", + "Description": "Resin-based composite – one surface, posterior", + "PriceLTEQ21": "99", + "PriceGT21": "62" + }, + { + "Procedure Code": "D2392", + "Description": "Resin-based composite – two surfaces, posterior", + "PriceLTEQ21": "123", + "PriceGT21": "77" + }, + { + "Procedure Code": "D2393", + "Description": "Resin-based composite – three surfaces, posterior", + "PriceLTEQ21": "133", + "PriceGT21": "92" + }, + { + "Procedure Code": "D2394", + "Description": "Resin-based composite – four or more surfaces, posterior", + "PriceLTEQ21": "182", + "PriceGT21": "116" + }, + { + "Procedure Code": "D2710", + "Description": "Crown – resin-based composite (indirect)", + "PriceLTEQ21": "244", + "PriceGT21": "NC" + }, + { + "Procedure Code": "D2740", + "Description": "Crown – porcelain/ceramic", + "PriceLTEQ21": "853", + "PriceGT21": "729" + }, + { + "Procedure Code": "D2750", + "Description": "Crown – porcelain fused to high noble metal", + "PriceLTEQ21": "800", + "PriceGT21": "NC" + }, + { + "Procedure Code": "D2751", + "Description": "Crown – porcelain fused to predominantly base metal", + "PriceLTEQ21": "727", + "PriceGT21": "613" + }, + { + "Procedure Code": "D2752", + "Description": "Crown – porcelain fused to noble metal", + "PriceLTEQ21": "735", + "PriceGT21": "NC" + }, + { + "Procedure Code": "D2790", + "Description": "Crown – full cast high noble metal", + "PriceLTEQ21": "808", + "PriceGT21": "NC" + }, + { + "Procedure Code": "D2910", + "Description": "Re-cement or re-bond inlay, onlay or partial coverage restoration", + "PriceLTEQ21": "69", + "PriceGT21": "57" + }, + { + "Procedure Code": "D2920", + "Description": "Re-cement or re-bond crown", + "PriceLTEQ21": "68", + "PriceGT21": "57" + }, + { + "Procedure Code": "D2929", + "Description": "Prefabricated porcelain/ceramic crown – primary tooth", + "PriceLTEQ21": "224", + "PriceGT21": "NC" + }, + { + "Procedure Code": "D2930", + "Description": "Prefabricated stainless steel crown – primary tooth", + "PriceLTEQ21": "205", + "PriceGT21": "NC" + }, + { + "Procedure Code": "D2931", + "Description": "Prefabricated stainless steel crown – permanent tooth", + "PriceLTEQ21": "199", + "PriceGT21": "171" + }, + { + "Procedure Code": "D2932", + "Description": "Prefabricated resin crown", + "PriceLTEQ21": "224", + "PriceGT21": "NC" + }, + { + "Procedure Code": "D2934", + "Description": "Prefabricated esthetic coated stainless steel crown – primary tooth", + "PriceLTEQ21": "184", + "PriceGT21": "NC" + }, + { + "Procedure Code": "D2950", + "Description": "Core buildup, including any pins when required", + "PriceLTEQ21": "197", + "PriceGT21": "164" + }, + { + "Procedure Code": "D2951", + "Description": "Pin retention – per tooth, in addition to restoration", + "PriceLTEQ21": "31", + "PriceGT21": "27" + }, + { + "Procedure Code": "D2954", + "Description": "Prefabricated post and core in addition to crown", + "PriceLTEQ21": "229", + "PriceGT21": "191" + }, + { + "Procedure Code": "D2980", + "Description": "Crown repair necessitated by restorative material failure", + "PriceLTEQ21": "137", + "PriceGT21": "115" + }, + { + "Procedure Code": "D2999", + "Description": "Unspecified restorative procedure, by report", + "PriceLTEQ21": "IC", + "PriceGT21": "IC" + }, + { + "Procedure Code": "D3120", + "Description": "Pulp cap – indirect (excluding final restoration)", + "PriceLTEQ21": "40", + "PriceGT21": "34" + }, + { + "Procedure Code": "D3220", + "Description": "Therapeutic pulpotomy (excluding final restoration) – removal of pulp coronal to the dentinocemental junction and application of medicament", + "PriceLTEQ21": "106", + "PriceGT21": "NC" + }, + { + "Procedure Code": "D3310", + "Description": "Endodontic therapy, anterior (excluding final restoration)", + "PriceLTEQ21": "544", + "PriceGT21": "544" + }, + { + "Procedure Code": "D3320", + "Description": "Endodontic therapy, premolar tooth (excluding final restoration)", + "PriceLTEQ21": "639", + "PriceGT21": "639" + }, + { + "Procedure Code": "D3330", + "Description": "Endodontic therapy, molar tooth (excluding final restoration)", + "PriceLTEQ21": "829", + "PriceGT21": "829" + }, + { + "Procedure Code": "D3346", + "Description": "Retreatment of previous root canal therapy – anterior", + "PriceLTEQ21": "545", + "PriceGT21": "456" + }, + { + "Procedure Code": "D3347", + "Description": "Retreatment of previous root canal therapy – premolar", + "PriceLTEQ21": "641", + "PriceGT21": "538" + }, + { + "Procedure Code": "D3348", + "Description": "Retreatment of previous root canal therapy – molar", + "PriceLTEQ21": "789", + "PriceGT21": "613" + }, + { + "Procedure Code": "D3410", + "Description": "Apicoectomy – anterior", + "PriceLTEQ21": "471", + "PriceGT21": "407" + }, + { + "Procedure Code": "D3421", + "Description": "Apicoectomy – premolar (first root)", + "PriceLTEQ21": "550", + "PriceGT21": "460" + }, + { + "Procedure Code": "D3425", + "Description": "Apicoectomy – molar (first root)", + "PriceLTEQ21": "639", + "PriceGT21": "598" + }, + { + "Procedure Code": "D3426", + "Description": "Apicoectomy (each additional root)", + "PriceLTEQ21": "264", + "PriceGT21": "230" + }, + { + "Procedure Code": "D4210", + "Description": "Gingivectomy or gingivoplasty - Four or more contiguous teeth or bounded teeth spaces per quadrant", + "PriceLTEQ21": "343", + "PriceGT21": "307" + }, + { + "Procedure Code": "D4211", + "Description": "Gingivectomy or gingivoplasty - one to three contiguous teeth or bounded teeth spaces per quadrant", + "PriceLTEQ21": "133", + "PriceGT21": "111" + }, + { + "Procedure Code": "D4341", + "Description": "Periodontal scaling and root planing - four or more teeth per quadrant", + "PriceLTEQ21": "160", + "PriceGT21": "134" + }, + { + "Procedure Code": "D4342", + "Description": "Periodontal scaling and root planing - one to three teeth, per quadrant", + "PriceLTEQ21": "107", + "PriceGT21": "90" + }, + { + "Procedure Code": "D4346", + "Description": "Scaling in presence of generalized moderate or severe gingival inflammation – full mouth, after oral evaluation", + "PriceLTEQ21": "75", + "PriceGT21": "60" + }, + { + "Procedure Code": "D5110", + "Description": "Complete denture – maxillary", + "PriceLTEQ21": "858", + "PriceGT21": "730" + }, + { + "Procedure Code": "D5120", + "Description": "Complete denture – mandibular", + "PriceLTEQ21": "852", + "PriceGT21": "730" + }, + { + "Procedure Code": "D5130", + "Description": "Immediate denture – maxillary", + "PriceLTEQ21": "935", + "PriceGT21": "NC" + }, + { + "Procedure Code": "D5140", + "Description": "Immediate denture - mandibular", + "PriceLTEQ21": "934", + "PriceGT21": "NC" + }, + { + "Procedure Code": "D5211", + "Description": "Maxillary partial denture - resin base (including retentive/clasping materials, rests and teeth)", + "PriceLTEQ21": "650", + "PriceGT21": "556" + }, + { + "Procedure Code": "D5212", + "Description": "Mandibular partial denture - resin base (including retentive/clasping materials, rests and teeth)", + "PriceLTEQ21": "691", + "PriceGT21": "595" + }, + { + "Procedure Code": "D5213", + "Description": "Maxillary partial denture- cast metal framework with resin denture bases (including retentive/clasping materials, rests and teeth)", + "PriceLTEQ21": "974", + "PriceGT21": "NC" + }, + { + "Procedure Code": "D5214", + "Description": "Mandibular partial denture - cast metal framework with resin denture bases (including retentive/clasping materials, rests and teeth)", + "PriceLTEQ21": "986", + "PriceGT21": "NC" + }, + { + "Procedure Code": "D5225", + "Description": "Maxillary partial denture- flexible base", + "PriceLTEQ21": "974", + "PriceGT21": "NC" + }, + { + "Procedure Code": "D5226", + "Description": "Mandibular partial denture- flexible base", + "PriceLTEQ21": "986", + "PriceGT21": "NC" + }, + { + "Procedure Code": "D5511", + "Description": "Repair broken complete denture base, mandibular", + "PriceLTEQ21": "109", + "PriceGT21": "85" + }, + { + "Procedure Code": "D5512", + "Description": "Repair broken complete denture base, maxillary", + "PriceLTEQ21": "109", + "PriceGT21": "85" + }, + { + "Procedure Code": "D5520", + "Description": "Replace missing or broken teeth - complete denture (each tooth)", + "PriceLTEQ21": "89", + "PriceGT21": "77" + }, + { + "Procedure Code": "D5611", + "Description": "Repair broken resin partial denture base, mandibular", + "PriceLTEQ21": "93", + "PriceGT21": "77" + }, + { + "Procedure Code": "D5612", + "Description": "Repair broken resin partial denture base, maxillary", + "PriceLTEQ21": "93", + "PriceGT21": "77" + }, + { + "Procedure Code": "D5621", + "Description": "Repair broken cast partial denture base, mandibular", + "PriceLTEQ21": "121", + "PriceGT21": "104" + }, + { + "Procedure Code": "D5622", + "Description": "Repair broken cast partial denture base, maxillary", + "PriceLTEQ21": "121", + "PriceGT21": "104" + }, + { + "Procedure Code": "D5630", + "Description": "Repair or replace broken retentive/clasping materials – per tooth", + "PriceLTEQ21": "107", + "PriceGT21": "99" + }, + { + "Procedure Code": "D5640", + "Description": "Replace broken teeth - per tooth", + "PriceLTEQ21": "91", + "PriceGT21": "77" + }, + { + "Procedure Code": "D5650", + "Description": "Add tooth to existing partial denture", + "PriceLTEQ21": "110", + "PriceGT21": "92" + }, + { + "Procedure Code": "D5660", + "Description": "Add clasp to existing partial denture per tooth", + "PriceLTEQ21": "125", + "PriceGT21": "98" + }, + { + "Procedure Code": "D5730", + "Description": "Reline complete maxillary denture (direct)", + "PriceLTEQ21": "188", + "PriceGT21": "158" + }, + { + "Procedure Code": "D5731", + "Description": "Reline lower complete mandibular denture (direct)", + "PriceLTEQ21": "184", + "PriceGT21": "173" + }, + { + "Procedure Code": "D5740", + "Description": "Reline maxillary partial denture(chairside)", + "PriceLTEQ21": "169", + "PriceGT21": "NC" + }, + { + "Procedure Code": "D5741", + "Description": "Reline mandibular partial denture(chairside)", + "PriceLTEQ21": "160", + "PriceGT21": "NC" + }, + { + "Procedure Code": "D5750", + "Description": "Reline complete maxillary denture (indirect)", + "PriceLTEQ21": "255", + "PriceGT21": "214" + }, + { + "Procedure Code": "D5751", + "Description": "Reline complete mandibular denture (indirect)", + "PriceLTEQ21": "256", + "PriceGT21": "215" + }, + { + "Procedure Code": "D5760", + "Description": "Reline maxillary partial denture (laboratory)", + "PriceLTEQ21": "252", + "PriceGT21": "NC" + }, + { + "Procedure Code": "D5761", + "Description": "Reline mandibular partial denture (laboratory)", + "PriceLTEQ21": "252", + "PriceGT21": "NC" + }, + { + "Procedure Code": "D6241", + "Description": "Pontic-porcelain fused metal", + "PriceLTEQ21": "691", + "PriceGT21": "NC" + }, + { + "Procedure Code": "D6751", + "Description": "Retainer crown-porcelain fused to metal", + "PriceLTEQ21": "691", + "PriceGT21": "NC" + }, + { + "Procedure Code": "D6930", + "Description": "Re-cement or re-bond fixed partial denture", + "PriceLTEQ21": "87", + "PriceGT21": "NC" + }, + { + "Procedure Code": "D6980", + "Description": "Fixed partial denture repair", + "PriceLTEQ21": "155", + "PriceGT21": "NC" + }, + { + "Procedure Code": "D6999", + "Description": "Fixed prosthodontic procedure", + "PriceLTEQ21": "IC", + "PriceGT21": "IC" + }, + { + "Procedure Code": "D7111", + "Description": "Extraction, coronal remnants - primary tooth", + "PriceLTEQ21": "80", + "PriceGT21": "75" + }, + { + "Procedure Code": "D7140", + "Description": "Extraction, erupted tooth or exposed root (elevation and/or forceps removal)", + "PriceLTEQ21": "107", + "PriceGT21": "77" + }, + { + "Procedure Code": "D7210", + "Description": "Extraction, erupted tooth requiring removal of bone and/or sectioning of tooth, and including elevation of mucoperiosteal flap if indicated", + "PriceLTEQ21": "179", + "PriceGT21": "149" + }, + { + "Procedure Code": "D7220", + "Description": "Removal of impacted tooth - soft tissue", + "PriceLTEQ21": "223", + "PriceGT21": "191" + }, + { + "Procedure Code": "D7230", + "Description": "Removal of impacted tooth - partially bony", + "PriceLTEQ21": "286", + "PriceGT21": "249" + }, + { + "Procedure Code": "D7240", + "Description": "Removal of impacted tooth - completely bony", + "PriceLTEQ21": "378", + "PriceGT21": "295" + }, + { + "Procedure Code": "D7250", + "Description": "Surgical removal of residual tooth roots (cutting procedure)", + "PriceLTEQ21": "173", + "PriceGT21": "144" + }, + { + "Procedure Code": "D7251", + "Description": "Coronectomy- intentional partial tooth removal, impacted teeth only", + "PriceLTEQ21": "173", + "PriceGT21": "134" + }, + { + "Procedure Code": "D7270", + "Description": "Tooth reimplantation and/or stabilization of accidentally evulsed or displaced tooth", + "PriceLTEQ21": "145", + "PriceGT21": "106" + }, + { + "Procedure Code": "D7280", + "Description": "Surgical access of an unerupted tooth", + "PriceLTEQ21": "452", + "PriceGT21": "NC" + }, + { + "Procedure Code": "D7283", + "Description": "Placement of device to facilitate eruption of impacted tooth", + "PriceLTEQ21": "84", + "PriceGT21": "NC" + }, + { + "Procedure Code": "D7310", + "Description": "Alveoloplasty in conjunction with extractions-four or more teeth or tooth spaces, per quadrant", + "PriceLTEQ21": "163", + "PriceGT21": "142" + }, + { + "Procedure Code": "D7311", + "Description": "Alveoloplasty in conjunction with extractions - one to three teeth or tooth spaces, per quadrant", + "PriceLTEQ21": "146", + "PriceGT21": "128" + }, + { + "Procedure Code": "D7320", + "Description": "Alveoloplasty not in conjunction with extractions- four or more teeth or tooth spaces, per quadrant", + "PriceLTEQ21": "202", + "PriceGT21": "187" + }, + { + "Procedure Code": "D7321", + "Description": "Alveoloplasty not in conjunction with extractions - one to three teeth or tooth spaces, per quadrant", + "PriceLTEQ21": "162", + "PriceGT21": "149" + }, + { + "Procedure Code": "D7340", + "Description": "Vestibuloplasty - ridge extension (second epithelialization)", + "PriceLTEQ21": "796", + "PriceGT21": "747" + }, + { + "Procedure Code": "D7350", + "Description": "Vestibuloplasty - ridge extension (Oral surgeon only)", + "PriceLTEQ21": "1236", + "PriceGT21": "943" + }, + { + "Procedure Code": "D7410", + "Description": "Radical excision - lesion diameter up to 1.25cm", + "PriceLTEQ21": "124", + "PriceGT21": "115" + }, + { + "Procedure Code": "D7411", + "Description": "Excision of benign lesion greater than 1.25 cm", + "PriceLTEQ21": "254", + "PriceGT21": "208" + }, + { + "Procedure Code": "D7450", + "Description": "Removal of benign odontogenic cyst or tumor - lesion diameter up to 1.25 cm", + "PriceLTEQ21": "252", + "PriceGT21": "248" + }, + { + "Procedure Code": "D7451", + "Description": "Removal of benign odontogenic cyst or tumor - lesion diameter greater than 1.25 cm", + "PriceLTEQ21": "343", + "PriceGT21": "288" + }, + { + "Procedure Code": "D7460", + "Description": "Removal of benign nonodontogenic cyst or tumor - lesion diameter up to 1.25 cm", + "PriceLTEQ21": "142", + "PriceGT21": "121" + }, + { + "Procedure Code": "D7461", + "Description": "Removal of benign nonodontogenic cyst or tumor - lesion diameter greater than 1.25 cm", + "PriceLTEQ21": "194", + "PriceGT21": "143" + }, + { + "Procedure Code": "D7471", + "Description": "Removal of lateral exostosis (maxilla or mandible) (Oral surgeon only)", + "PriceLTEQ21": "194", + "PriceGT21": "143" + }, + { + "Procedure Code": "D7472", + "Description": "Removal of torus palatinus (Oral surgeon only)", + "PriceLTEQ21": "194", + "PriceGT21": "143" + }, + { + "Procedure Code": "D7473", + "Description": "Removal of torus mandibularis (Oral surgeon only)", + "PriceLTEQ21": "194", + "PriceGT21": "143" + }, + { + "Procedure Code": "D7961", + "Description": "Buccal/labial frenectomy (frenulectomy)", + "PriceLTEQ21": "353", + "PriceGT21": "107" + }, + { + "Procedure Code": "D7962", + "Description": "Lingual frenectomy (frenulectomy)", + "PriceLTEQ21": "353", + "PriceGT21": "107" + }, + { + "Procedure Code": "D7963", + "Description": "Frenuloplasty", + "PriceLTEQ21": "480", + "PriceGT21": "416" + }, + { + "Procedure Code": "D7970", + "Description": "Excision of hyperplastic tissue - per arch", + "PriceLTEQ21": "334", + "PriceGT21": "246" + }, + { + "Procedure Code": "D7999", + "Description": "Unspecified oral surgery procedure, by report", + "PriceLTEQ21": "IC", + "PriceGT21": "IC" + }, + { + "Procedure Code": "D8010", + "Description": "Limited orthodontic treamtnent of the primary transition (Orthodontist only)", + "PriceLTEQ21": "250", + "PriceGT21": "NC" + }, + { + "Procedure Code": "D8020", + "Description": "Limited orthodontic treatment of the transitional dentition (Orthodontist only)", + "PriceLTEQ21": "250", + "PriceGT21": "NC" + }, + { + "Procedure Code": "D8030", + "Description": "Limited orthodontic treatment of the adolescent dentition (Orthodontist only)", + "PriceLTEQ21": "250", + "PriceGT21": "NC" + }, + { + "Procedure Code": "D8040", + "Description": "Limited orthodontic treatment of the adult dentition (Orthodontist only)", + "PriceLTEQ21": "250", + "PriceGT21": "NC" + }, + { + "Procedure Code": "D8070", + "Description": "Comprehensive orthodontic treatment of the transitional dentition (Orthodontist only)", + "PriceLTEQ21": "1302", + "PriceGT21": "NC" + }, + { + "Procedure Code": "D8080", + "Description": "Comprehensive orthodontic treatment of the adolescent dentition (Orthodontist only)", + "PriceLTEQ21": "1302", + "PriceGT21": "NC" + }, + { + "Procedure Code": "D8090", + "Description": "Comprehensive orthodontic treatment of the adult dentition (Orthodontist only)", + "PriceLTEQ21": "1302", + "PriceGT21": "NC" + }, + { + "Procedure Code": "D8660", + "Description": "Pre-orthodontic treatment examination to monitor growth and development (records fee) (Orthodontist only)", + "PriceLTEQ21": "136", + "PriceGT21": "NC" + }, + { + "Procedure Code": "D8670", + "Description": "Periodic orthodontic treatment visit (Orthodontist only)", + "PriceLTEQ21": "288", + "PriceGT21": "215" + }, + { + "Procedure Code": "D8680", + "Description": "Orthodontic retention (removal of appliances, construction and placement of retainer(s)) (Orthodontist only)", + "PriceLTEQ21": "102", + "PriceGT21": "85" + }, + { + "Procedure Code": "D8703", + "Description": "Replacement of lost or broken retainer- maxillary (Orthodontist only)", + "PriceLTEQ21": "95", + "PriceGT21": "NC" + }, + { + "Procedure Code": "D8704", + "Description": "Replacement of lost or broken retainer- mandibular (Orthodontist only)", + "PriceLTEQ21": "95", + "PriceGT21": "NC" + }, + { + "Procedure Code": "D8999", + "Description": "Unspecified orthodontic procedure, by report (Orthodontist only) I.C I.C** Y Y**", + "PriceLTEQ21": "IC", + "PriceGT21": "IC" + }, + { + "Procedure Code": "D9110", + "Description": "Palliative treatment of dental pain – per visit", + "PriceLTEQ21": "75", + "PriceGT21": "36" + }, + { + "Procedure Code": "D9222", + "Description": "Deep sedation/general anesthesia – first 15 minutes", + "PriceLTEQ21": "109", + "PriceGT21": "90" + }, + { + "Procedure Code": "D9223", + "Description": "Deep sedation/general anesthesia – each additional 15- minute increment", + "PriceLTEQ21": "109", + "PriceGT21": "90" + }, + { + "Procedure Code": "D9230", + "Description": "Analgesia, anxiolysis, inhalation of nitrous oxide", + "PriceLTEQ21": "22", + "PriceGT21": "15" + }, + { + "Procedure Code": "D9248", + "Description": "Nonintravenous conscious sedation", + "PriceLTEQ21": "45", + "PriceGT21": "45" + }, + { + "Procedure Code": "D9310", + "Description": "Consultation- Diagnostic service provided by dentist or physician other than requesting dentist or physician (Specialist only)", + "PriceLTEQ21": "54", + "PriceGT21": "63" + }, + { + "Procedure Code": "D9410", + "Description": "House/extended care facility call, once per facility per day", + "PriceLTEQ21": "36", + "PriceGT21": "39" + }, + { + "Procedure Code": "D9450", + "Description": "Rural add-on encounter payment", + "PriceLTEQ21": "31", + "PriceGT21": "31" + }, + { + "Procedure Code": "D9920", + "Description": "Behavior management, by report", + "PriceLTEQ21": "86", + "PriceGT21": "86" + }, + { + "Procedure Code": "D9930", + "Description": "Treatment of complications (postsurgical) - unusual circumstances, by report", + "PriceLTEQ21": "66", + "PriceGT21": "30" + }, + { + "Procedure Code": "D9941", + "Description": "Fabrication of athletic mouthguard", + "PriceLTEQ21": "85", + "PriceGT21": "NC" + }, + { + "Procedure Code": "D9944", + "Description": "Occlusal guard - hard appliance, full arch", + "PriceLTEQ21": "308", + "PriceGT21": "NC" + }, + { + "Procedure Code": "D9945", + "Description": "Occlusal guard - soft appliance, full arch", + "PriceLTEQ21": "308", + "PriceGT21": "NC" + }, + { + "Procedure Code": "D9946", + "Description": "Occlusal guard - hard appliance, partial arch", + "PriceLTEQ21": "308", + "PriceGT21": "NC" + }, + { + "Procedure Code": "D9999", + "Description": "Unspecified adjunctive procedure, by report", + "PriceLTEQ21": "IC", + "PriceGT21": "IC" + } +] diff --git a/apps/pdfProcedureCode/procedureCodesOld.json b/apps/pdfProcedureCode/procedureCodesOld.json new file mode 100644 index 0000000..1df028e --- /dev/null +++ b/apps/pdfProcedureCode/procedureCodesOld.json @@ -0,0 +1,344 @@ +[ + { + "Procedure Code": "D1999", + "Description": "", + "Price": "50" + }, + { + "Procedure Code": "D0120", + "Description": "perio exam", + "Price": "105" + }, + { + "Procedure Code": "D0140", + "Description": "limited exam", + "Price": "90" + }, + { + "Procedure Code": "D0150", + "Description": "comprehensive exam", + "Price": "120" + }, + { + "Procedure Code": "D0210", + "Description": "Fmx.", + "Price": "120" + }, + { + "Procedure Code": "D0220", + "Description": "first PA.", + "Price": "60" + }, + { + "Procedure Code": "D0230", + "Description": "2nd PA.", + "Price": "50" + }, + { + "Procedure Code": "D0330", + "Description": "pano", + "Price": "150" + }, + { + "Procedure Code": "D0272", + "Description": "2 BW", + "Price": "80" + }, + { + "Procedure Code": "D0274", + "Description": "4BW", + "Price": "160" + }, + { + "Procedure Code": "D1110", + "Description": "adult prophy", + "Price": "150" + }, + { + "Procedure Code": "D1120", + "Description": "child prophy", + "Price": "120" + }, + { + "Procedure Code": "D1351", + "Description": "sealant", + "Price": "80" + }, + { + "Procedure Code": "D4341", + "Description": "srp", + "Price": "250" + }, + { + "Procedure Code": "D4910", + "Description": "perio maintains", + "Price": "250" + }, + { + "Procedure Code": "D1208", + "Description": "FL", + "Price": "90" + }, + { + "Procedure Code": "D2330", + "Description": "front composite. 1 s.", + "Price": "180" + }, + { + "Procedure Code": "D2331", + "Description": "2s", + "Price": "220" + }, + { + "Procedure Code": "D2332", + "Description": "3s", + "Price": "280" + }, + { + "Procedure Code": "D2335", + "Description": "4s or more", + "Price": "350" + }, + { + "Procedure Code": "D2391", + "Description": "back. 1s", + "Price": "200" + }, + { + "Procedure Code": "D2392", + "Description": "2s", + "Price": "250" + }, + { + "Procedure Code": "D2393", + "Description": "3s", + "Price": "280" + }, + { + "Procedure Code": "D2394", + "Description": "4s", + "Price": "320" + }, + { + "Procedure Code": "D2140", + "Description": "amalgam, one surface", + "Price": "150" + }, + { + "Procedure Code": "D2150", + "Description": "amalgam, two surface", + "Price": "200" + }, + { + "Procedure Code": "D2750", + "Description": "high noble", + "Price": "1300" + }, + { + "Procedure Code": "D2751", + "Description": "base metal", + "Price": "1200" + }, + { + "Procedure Code": "D2740", + "Description": "crown porcelain", + "Price": "1300" + }, + { + "Procedure Code": "D2954", + "Description": "p/c", + "Price": "450" + }, + { + "Procedure Code": "D7910", + "Description": "suture, small wound up to 5 mm", + "Price": "400" + }, + { + "Procedure Code": "D5110", + "Description": "FU", + "Price": "1200", + "Full Price": "1700" + }, + { + "Procedure Code": "D5120", + "Description": "FL", + "Price": "1700", + "Full Price": "1700" + }, + { + "Procedure Code": "D5211", + "Description": "pu", + "Price": "1300" + }, + { + "Procedure Code": "D5212", + "Description": "pl", + "Price": "1300" + }, + { + "Procedure Code": "D5213", + "Description": "cast pu.", + "Price": "1700" + }, + { + "Procedure Code": "D5214", + "Description": "cast pl", + "Price": "1700" + }, + { + "Procedure Code": "D5510", + "Description": "Repair broken complete denture base (QUAD)", + "Price": "400" + }, + { + "Procedure Code": "D5520", + "Description": "Replace missing or broken teeth - complete denture (each tooth) (TOOTH)", + "Price": "200" + }, + { + "Procedure Code": "D5750", + "Description": "lab reline", + "Price": "600" + }, + { + "Procedure Code": "D5730", + "Description": "chairside reline", + "Price": "500" + }, + { + "Procedure Code": "D2920", + "Description": "re cement crown", + "Price": "120" + }, + { + "Procedure Code": "D2950", + "Description": "core buildup", + "Price": "350" + }, + { + "Procedure Code": "D2955", + "Description": "post renoval", + "Price": "350" + }, + { + "Procedure Code": "D6100", + "Description": "", + "Price": "320" + }, + { + "Procedure Code": "D6110", + "Description": "implant", + "Price": "1600" + }, + { + "Procedure Code": "D6056", + "Description": "pre fab abut", + "Price": "750" + }, + { + "Procedure Code": "D6057", + "Description": "custom abut", + "Price": "800" + }, + { + "Procedure Code": "D6058", + "Description": "porcelain, implant crown, ceramic crown", + "Price": "1400" + }, + { + "Procedure Code": "D6059", + "Description": "", + "Price": "1400" + }, + { + "Procedure Code": "D6242", + "Description": "noble metal. For united", + "Price": "1400" + }, + { + "Procedure Code": "D6245", + "Description": "porcelain, not for united", + "Price": "1400" + }, + { + "Procedure Code": "D0367", + "Description": "", + "Price": "400" + }, + { + "Procedure Code": "D0364", + "Description": "Less than one jaw", + "Price": "350" + }, + { + "Procedure Code": "D0365", + "Description": "Mand", + "Price": "350" + }, + { + "Procedure Code": "D0366", + "Description": "Max", + "Price": "350" + }, + { + "Procedure Code": "D0368", + "Description": "include TMJ", + "Price": "375" + }, + { + "Procedure Code": "D0383", + "Description": "", + "Price": "350" + }, + { + "Procedure Code": "D0380", + "Description": "Less than one jaw", + "Price": "300" + }, + { + "Procedure Code": "D0381", + "Description": "Mand", + "Price": "300" + }, + { + "Procedure Code": "D0382", + "Description": "Max", + "Price": "300" + }, + { + "Procedure Code": "D7950", + "Description": "max", + "Price": "800" + }, + { + "Procedure Code": "D7140", + "Description": "simple ext", + "Price": "150" + }, + { + "Procedure Code": "D7210", + "Description": "surgical ext", + "Price": "280" + }, + { + "Procedure Code": "D7220", + "Description": "soft impacted", + "Price": "380" + }, + { + "Procedure Code": "D7230", + "Description": "partial bony", + "Price": "450" + }, + { + "Procedure Code": "D7240", + "Description": "fully bony", + "Price": "550" + }, + { + "Procedure Code": "D3320", + "Description": "pre M RCT", + "Price": "1050" + } +] \ No newline at end of file