<ul><li><strong>module.controller.php</strong>: Fixed <code>getModuleById()</code> — image_path was only set when ALL 3 images existed (triple file_exists nest). Now sets image_path once first image is confirmed, so modules with 1-2 images render correctly in edit modal.</li><li><strong>module.controller.php</strong>: Fixed <code>getRevision()</code> — was always overwriting date with <code>date("now")</code> instead of formatting the stored DB date. Revision edit form now shows the correct original date.</li><li><strong>modules_tabs.php</strong>: Fixed logic error at line 1041 — <code>str != "" || str != null</code> is always TRUE (|| bug). Changed to <code>&amp;&amp;</code> so module keyword multiselect populates correctly.</li><li><strong>modules_tabs.php</strong>: Fixed duplicate <code>onclick=""</code> attributes on Update/Delete revision buttons — empty onclick was overriding the real handler, making revision edit/delete buttons non-functional.</li><li><strong>modules_tabs.php</strong>: Added missing <code>error:</code> callback on image upload AJAX — swal was stuck open on network failure.</li><li><strong>modules_tabs.php</strong>: Added missing <code>error:</code> callback on save revision AJAX — swal was stuck open on failure.</li><li><strong>modules_tabs.php</strong>: Added null guard on <code>val.image_path</code> in <code>loadModuleShopView()</code> — null.length threw TypeError crashing shop view render.</li><li><strong>modules_tabs.php</strong>: Added null guard on <code>val.module_monthly_cost</code> before <code>.replace()</code> — null.replace() threw TypeError.</li><li><strong>ajax.php</strong>: Cleaned up <code></code> — removed always-true isset() wrapper, clarified variable initialization.</li></ul>