From ebf907c9d5442efc262354b9d614a798792597df Mon Sep 17 00:00:00 2001 From: Westech Admin Date: Tue, 19 May 2026 16:33:17 +0000 Subject: [PATCH] Fix eBay HTML parser for post-2024 s-card layout, fix source field values --- .../api/__pycache__/__init__.cpython-312.pyc | Bin 166 -> 213 bytes .../__pycache__/ebay_pricing.cpython-312.pyc | Bin 0 -> 23796 bytes .../api/__pycache__/sales.cpython-312.pyc | Bin 0 -> 3856 bytes westech_r2/api/ebay_pricing.py | 22 ++++++++++++++---- westech_r2/fixtures/client_script.json | 4 ++-- 5 files changed, 20 insertions(+), 6 deletions(-) create mode 100644 westech_r2/api/__pycache__/ebay_pricing.cpython-312.pyc create mode 100644 westech_r2/api/__pycache__/sales.cpython-312.pyc diff --git a/westech_r2/api/__pycache__/__init__.cpython-312.pyc b/westech_r2/api/__pycache__/__init__.cpython-312.pyc index 02f0bc7a08670ebfbcd9cc71f44a0287fb18ac83..5dd511c12dc20ef002d5ef27e2e760fef46128f5 100644 GIT binary patch delta 134 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%0AMFnr2oBx*2lXK}YTc9SJUJ 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 Zgwog6gkNWU4j!Od*H58sLh>7s^ 0) {\n frm.set_value('assigned_price', Math.round(base_price * 100) / 100);\n frm.set_value('pricing_status', 'Priced');\n frm.set_value('pricing_source', price_source);\n } else {\n frm.set_value('assigned_price', null);\n frm.set_value('pricing_status', 'Needs Pricing');\n }\n }\n });\n}\n", + "script": "frappe.ui.form.on('Serial No', {\n grade: function(frm) {\n calculate_recommended_price(frm);\n },\n cpu_test: function(frm) {\n check_hardware_failures(frm);\n },\n ram_test: function(frm) {\n check_hardware_failures(frm);\n },\n refresh: function(frm) {\n // Label change via JS (since fixture label updates need migrate)\n var price_field = frm.get_field('assigned_price');\n if (price_field && price_field.$wrapper) {\n price_field.$wrapper.find('.control-label').text('Recommended Price');\n }\n check_hardware_failures(frm);\n }\n});\n\nfunction check_hardware_failures(frm) {\n var cpu_fail = frm.doc.cpu_test === 'Fail';\n var ram_fail = frm.doc.ram_test === 'Fail';\n \n if (cpu_fail || ram_fail) {\n // Force Flagged grade and dismantle routing (but allow reviewer override)\n if (!frm.doc.grade || frm.doc.grade !== 'Flagged') {\n frm.set_value('grade', 'Flagged');\n }\n frm.set_value('assigned_price', null);\n frm.set_value('pricing_status', 'Dismantle');\n \n var reason = [];\n if (cpu_fail) reason.push('CPU test failed');\n if (ram_fail) reason.push('RAM test failed');\n \n // Show warning banner instead of locking the field\n frm.set_intro(\n ' Hardware Failure: ' + \n reason.join(', ') + ' \u2014 routed to Dismantle. Change tests to Pass to re-enable pricing.',\n 'red'\n );\n } else {\n // Clear the warning banner\n frm.clear_intro();\n // If grade was Flagged but tests now pass, let user manually change grade\n }\n}\n\nfunction calculate_recommended_price(frm) {\n var grade = frm.doc.grade;\n \n // Flagged = no price, show FLAGGED text\n if (!grade || grade === 'Flagged') {\n frm.set_value('assigned_price', null);\n frm.set_value('pricing_status', grade === 'Flagged' ? 'Flagged' : 'Needs Pricing');\n return;\n }\n \n // Need item reference to get market prices\n if (!frm.doc.item_code) {\n return;\n }\n \n frappe.call({\n method: 'frappe.client.get',\n args: {\n doctype: 'Item',\n name: frm.doc.item_code\n },\n callback: function(r) {\n if (!r.message) return;\n var item = r.message;\n var base_price = 0;\n var price_source = '';\n \n switch(grade) {\n case 'High':\n base_price = item.market_high || item.base_market_price || 0;\n price_source = 'market_high';\n break;\n case 'Med':\n base_price = item.market_median || item.base_market_price || 0;\n price_source = 'market_median';\n break;\n case 'Low':\n base_price = item.market_low || item.base_market_price || 0;\n price_source = 'market_low';\n break;\n }\n \n if (base_price > 0) {\n frm.set_value('assigned_price', Math.round(base_price * 100) / 100);\n frm.set_value('pricing_status', 'Priced');\n frm.set_value('pricing_source', price_source);\n } else {\n frm.set_value('assigned_price', null);\n frm.set_value('pricing_status', 'Needs Pricing');\n }\n }\n });\n}\n", "view": "Form" }, {