1
0

beepzone-full-dump.sql 233 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221
  1. /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
  2. /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
  3. /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
  4. /*!50503 SET NAMES utf8mb4 */;
  5. /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
  6. /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
  7. /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
  8. /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
  9. DROP TABLE IF EXISTS `asset_change_log`;
  10. /*!40101 SET @saved_cs_client = @@character_set_client */;
  11. /*!50503 SET character_set_client = utf8mb4 */;
  12. CREATE TABLE `asset_change_log` (
  13. `id` int(11) NOT NULL AUTO_INCREMENT,
  14. `table_name` varchar(50) NOT NULL,
  15. `action` enum('INSERT','UPDATE','DELETE') NOT NULL,
  16. `record_id` int(11) NOT NULL,
  17. `changed_fields` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'Only fields that actually changed' CHECK (json_valid(`changed_fields`)),
  18. `old_values` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL CHECK (json_valid(`old_values`)),
  19. `new_values` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL CHECK (json_valid(`new_values`)),
  20. `changed_at` timestamp NULL DEFAULT current_timestamp(),
  21. `changed_by_id` int(11) DEFAULT NULL,
  22. `changed_by_username` varchar(100) DEFAULT NULL,
  23. PRIMARY KEY (`id`),
  24. KEY `idx_table_action` (`table_name`,`action`),
  25. KEY `idx_timestamp` (`changed_at`),
  26. KEY `idx_record` (`record_id`),
  27. KEY `idx_user` (`changed_by_id`),
  28. CONSTRAINT `asset_change_log_ibfk_1` FOREIGN KEY (`changed_by_id`) REFERENCES `users` (`id`) ON DELETE SET NULL
  29. ) ENGINE=InnoDB AUTO_INCREMENT=241 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci;
  30. /*!40101 SET character_set_client = @saved_cs_client */;
  31. LOCK TABLES `asset_change_log` WRITE;
  32. /*!40000 ALTER TABLE `asset_change_log` DISABLE KEYS */;
  33. INSERT INTO `asset_change_log` VALUES (1,'assets','INSERT',1,'[\"asset_tag\", \"asset_numeric_id\", \"asset_type\", \"name\", \"category_id\", \"manufacturer\", \"model\", \"serial_number\", \"zone_id\", \"status\", \"price\", \"purchase_date\", \"quantity_used\", \"supplier_id\", \"lendable\", \"minimum_role_for_lending\", \"no_scan\", \"created_by\"]',NULL,'{\"asset_tag\": \"DESK-1\", \"asset_numeric_id\": 75650012, \"asset_type\": \"N\", \"name\": \"Desktop Computer 1\", \"category_id\": 2, \"manufacturer\": \"Dell\", \"model\": \"OptiPlex 7090\", \"serial_number\": \"SN-DESK-1\", \"zone_id\": 5, \"status\": \"Good\", \"price\": 899.99, \"purchase_date\": \"2024-01-15\", \"quantity_used\": 0, \"supplier_id\": 1, \"lendable\": 0, \"minimum_role_for_lending\": 1, \"no_scan\": \"No\", \"created_by\": 1}','2025-10-20 11:43:46',1,'admin'),(2,'assets','INSERT',2,'[\"asset_tag\", \"asset_numeric_id\", \"asset_type\", \"name\", \"category_id\", \"manufacturer\", \"model\", \"serial_number\", \"zone_id\", \"status\", \"price\", \"purchase_date\", \"quantity_used\", \"supplier_id\", \"lendable\", \"minimum_role_for_lending\", \"no_scan\", \"created_by\"]',NULL,'{\"asset_tag\": \"DESK-2\", \"asset_numeric_id\": 34081098, \"asset_type\": \"N\", \"name\": \"Desktop Computer 2\", \"category_id\": 2, \"manufacturer\": \"Dell\", \"model\": \"OptiPlex 7090\", \"serial_number\": \"SN-DESK-2\", \"zone_id\": 5, \"status\": \"Good\", \"price\": 899.99, \"purchase_date\": \"2024-01-15\", \"quantity_used\": 0, \"supplier_id\": 1, \"lendable\": 0, \"minimum_role_for_lending\": 1, \"no_scan\": \"No\", \"created_by\": 1}','2025-10-20 11:43:46',1,'admin'),(3,'assets','INSERT',3,'[\"asset_tag\", \"asset_numeric_id\", \"asset_type\", \"name\", \"category_id\", \"manufacturer\", \"model\", \"serial_number\", \"zone_id\", \"status\", \"price\", \"purchase_date\", \"quantity_used\", \"supplier_id\", \"lendable\", \"minimum_role_for_lending\", \"no_scan\", \"created_by\"]',NULL,'{\"asset_tag\": \"DESK-3\", \"asset_numeric_id\": 64139289, \"asset_type\": \"N\", \"name\": \"Desktop Computer 3\", \"category_id\": 2, \"manufacturer\": \"Dell\", \"model\": \"OptiPlex 7090\", \"serial_number\": \"SN-DESK-3\", \"zone_id\": 5, \"status\": \"Good\", \"price\": 899.99, \"purchase_date\": \"2024-01-15\", \"quantity_used\": 0, \"supplier_id\": 1, \"lendable\": 0, \"minimum_role_for_lending\": 1, \"no_scan\": \"No\", \"created_by\": 1}','2025-10-20 11:43:46',1,'admin'),(4,'assets','INSERT',4,'[\"asset_tag\", \"asset_numeric_id\", \"asset_type\", \"name\", \"category_id\", \"manufacturer\", \"model\", \"serial_number\", \"zone_id\", \"status\", \"price\", \"purchase_date\", \"quantity_used\", \"supplier_id\", \"lendable\", \"minimum_role_for_lending\", \"no_scan\", \"created_by\"]',NULL,'{\"asset_tag\": \"DESK-4\", \"asset_numeric_id\": 40933134, \"asset_type\": \"N\", \"name\": \"Desktop Computer 4\", \"category_id\": 2, \"manufacturer\": \"Dell\", \"model\": \"OptiPlex 7090\", \"serial_number\": \"SN-DESK-4\", \"zone_id\": 5, \"status\": \"Good\", \"price\": 899.99, \"purchase_date\": \"2024-01-15\", \"quantity_used\": 0, \"supplier_id\": 1, \"lendable\": 0, \"minimum_role_for_lending\": 1, \"no_scan\": \"No\", \"created_by\": 1}','2025-10-20 11:43:46',1,'admin'),(5,'assets','INSERT',5,'[\"asset_tag\", \"asset_numeric_id\", \"asset_type\", \"name\", \"category_id\", \"manufacturer\", \"model\", \"serial_number\", \"zone_id\", \"status\", \"price\", \"purchase_date\", \"quantity_used\", \"supplier_id\", \"lendable\", \"minimum_role_for_lending\", \"no_scan\", \"created_by\"]',NULL,'{\"asset_tag\": \"DESK-5\", \"asset_numeric_id\": 80850219, \"asset_type\": \"N\", \"name\": \"Desktop Computer 5\", \"category_id\": 2, \"manufacturer\": \"Dell\", \"model\": \"OptiPlex 7090\", \"serial_number\": \"SN-DESK-5\", \"zone_id\": 5, \"status\": \"Good\", \"price\": 899.99, \"purchase_date\": \"2024-01-15\", \"quantity_used\": 0, \"supplier_id\": 1, \"lendable\": 0, \"minimum_role_for_lending\": 1, \"no_scan\": \"No\", \"created_by\": 1}','2025-10-20 11:43:47',1,'admin'),(6,'assets','INSERT',6,'[\"asset_tag\", \"asset_numeric_id\", \"asset_type\", \"name\", \"category_id\", \"manufacturer\", \"model\", \"serial_number\", \"zone_id\", \"status\", \"price\", \"purchase_date\", \"quantity_used\", \"supplier_id\", \"lendable\", \"minimum_role_for_lending\", \"lending_status\", \"no_scan\", \"created_by\"]',NULL,'{\"asset_tag\": \"LAPTOP-1\", \"asset_numeric_id\": 65938365, \"asset_type\": \"B\", \"name\": \"Laptop 1\", \"category_id\": 2, \"manufacturer\": \"HP\", \"model\": \"EliteBook 840\", \"serial_number\": \"SN-LAPTOP-1\", \"zone_id\": 6, \"status\": \"Good\", \"price\": 1299.99, \"purchase_date\": \"2024-02-01\", \"quantity_used\": 0, \"supplier_id\": 1, \"lendable\": 1, \"minimum_role_for_lending\": 25, \"lending_status\": \"Available\", \"no_scan\": \"No\", \"created_by\": 1}','2025-10-20 11:43:47',1,'admin'),(7,'assets','INSERT',7,'[\"asset_tag\", \"asset_numeric_id\", \"asset_type\", \"name\", \"category_id\", \"manufacturer\", \"model\", \"serial_number\", \"zone_id\", \"status\", \"price\", \"purchase_date\", \"quantity_used\", \"supplier_id\", \"lendable\", \"minimum_role_for_lending\", \"lending_status\", \"no_scan\", \"created_by\"]',NULL,'{\"asset_tag\": \"LAPTOP-2\", \"asset_numeric_id\": 90756157, \"asset_type\": \"B\", \"name\": \"Laptop 2\", \"category_id\": 2, \"manufacturer\": \"HP\", \"model\": \"EliteBook 840\", \"serial_number\": \"SN-LAPTOP-2\", \"zone_id\": 6, \"status\": \"Good\", \"price\": 1299.99, \"purchase_date\": \"2024-02-01\", \"quantity_used\": 0, \"supplier_id\": 1, \"lendable\": 1, \"minimum_role_for_lending\": 25, \"lending_status\": \"Available\", \"no_scan\": \"No\", \"created_by\": 1}','2025-10-20 11:43:47',1,'admin'),(8,'assets','INSERT',8,'[\"asset_tag\", \"asset_numeric_id\", \"asset_type\", \"name\", \"category_id\", \"manufacturer\", \"model\", \"serial_number\", \"zone_id\", \"status\", \"price\", \"purchase_date\", \"quantity_used\", \"supplier_id\", \"lendable\", \"minimum_role_for_lending\", \"lending_status\", \"no_scan\", \"created_by\"]',NULL,'{\"asset_tag\": \"LAPTOP-3\", \"asset_numeric_id\": 97073776, \"asset_type\": \"B\", \"name\": \"Laptop 3\", \"category_id\": 2, \"manufacturer\": \"HP\", \"model\": \"EliteBook 840\", \"serial_number\": \"SN-LAPTOP-3\", \"zone_id\": 6, \"status\": \"Good\", \"price\": 1299.99, \"purchase_date\": \"2024-02-01\", \"quantity_used\": 0, \"supplier_id\": 1, \"lendable\": 1, \"minimum_role_for_lending\": 25, \"lending_status\": \"Available\", \"no_scan\": \"No\", \"created_by\": 1}','2025-10-20 11:43:47',1,'admin'),(9,'assets','INSERT',9,'[\"asset_tag\", \"asset_numeric_id\", \"asset_type\", \"name\", \"category_id\", \"manufacturer\", \"model\", \"serial_number\", \"zone_id\", \"status\", \"price\", \"purchase_date\", \"quantity_used\", \"supplier_id\", \"lendable\", \"minimum_role_for_lending\", \"lending_status\", \"no_scan\", \"created_by\"]',NULL,'{\"asset_tag\": \"OSC-001\", \"asset_numeric_id\": 40246871, \"asset_type\": \"L\", \"name\": \"Digital Oscilloscope\", \"category_id\": 3, \"manufacturer\": \"Tektronix\", \"model\": \"TBS2104B\", \"serial_number\": \"SN-OSC-001\", \"zone_id\": 7, \"status\": \"Good\", \"price\": 1899.99, \"purchase_date\": \"2024-01-10\", \"quantity_used\": 0, \"supplier_id\": 2, \"lendable\": 1, \"minimum_role_for_lending\": 50, \"lending_status\": \"Available\", \"no_scan\": \"No\", \"created_by\": 1}','2025-10-20 11:43:48',1,'admin'),(10,'assets','INSERT',10,'[\"asset_tag\", \"asset_numeric_id\", \"asset_type\", \"name\", \"category_id\", \"manufacturer\", \"model\", \"serial_number\", \"zone_id\", \"status\", \"price\", \"purchase_date\", \"quantity_used\", \"supplier_id\", \"lendable\", \"minimum_role_for_lending\", \"lending_status\", \"no_scan\", \"created_by\"]',NULL,'{\"asset_tag\": \"DMM-001\", \"asset_numeric_id\": 96642470, \"asset_type\": \"L\", \"name\": \"Digital Multimeter\", \"category_id\": 3, \"manufacturer\": \"Fluke\", \"model\": \"117\", \"serial_number\": \"SN-DMM-001\", \"zone_id\": 7, \"status\": \"Good\", \"price\": 199.99, \"purchase_date\": \"2024-01-10\", \"quantity_used\": 0, \"supplier_id\": 2, \"lendable\": 1, \"minimum_role_for_lending\": 25, \"lending_status\": \"Available\", \"no_scan\": \"No\", \"created_by\": 1}','2025-10-20 11:43:48',1,'admin'),(11,'assets','INSERT',11,'[\"asset_tag\", \"asset_numeric_id\", \"asset_type\", \"name\", \"category_id\", \"manufacturer\", \"model\", \"serial_number\", \"zone_id\", \"status\", \"price\", \"purchase_date\", \"quantity_available\", \"quantity_total\", \"quantity_used\", \"supplier_id\", \"lendable\", \"minimum_role_for_lending\", \"lending_status\", \"no_scan\", \"created_by\"]',NULL,'{\"asset_tag\": \"CABLE-ETH-001\", \"asset_numeric_id\": 57348031, \"asset_type\": \"C\", \"name\": \"Ethernet Cables (Box of 50)\", \"category_id\": 4, \"manufacturer\": \"Generic\", \"model\": \"Cat6 5ft\", \"serial_number\": \"BATCH-001\", \"zone_id\": 6, \"status\": \"Good\", \"price\": 149.99, \"purchase_date\": \"2024-03-01\", \"quantity_available\": 50, \"quantity_total\": 50, \"quantity_used\": 0, \"supplier_id\": 1, \"lendable\": 1, \"minimum_role_for_lending\": 25, \"lending_status\": \"Available\", \"no_scan\": \"No\", \"created_by\": 1}','2025-10-20 11:43:48',1,'admin'),(12,'assets','UPDATE',6,'[\"lending_status\", \"current_borrower_id\", \"due_date\"]','{\"lending_status\": \"Available\", \"current_borrower_id\": null, \"due_date\": null}','{\"lending_status\": \"Borrowed\", \"current_borrower_id\": 1, \"due_date\": \"2025-10-20\"}','2025-10-20 11:43:51',3,'staff1'),(13,'assets','UPDATE',9,'[\"lending_status\", \"current_borrower_id\", \"due_date\"]','{\"lending_status\": \"Available\", \"current_borrower_id\": null, \"due_date\": null}','{\"lending_status\": \"Borrowed\", \"current_borrower_id\": 3, \"due_date\": \"2025-10-15\"}','2025-10-20 11:43:51',2,'manager1'),(14,'assets','UPDATE',3,'[\"status\"]','{\"status\": \"Good\"}','{\"status\": \"Missing\"}','2025-10-20 11:43:52',1,'admin'),(15,'assets','UPDATE',6,'[\"lending_status\", \"current_borrower_id\", \"due_date\", \"previous_borrower_id\"]','{\"lending_status\": \"Borrowed\", \"current_borrower_id\": 1, \"due_date\": \"2025-10-20\", \"previous_borrower_id\": null}','{\"lending_status\": \"Available\", \"current_borrower_id\": null, \"due_date\": null, \"previous_borrower_id\": 1}','2025-10-20 11:43:54',3,'staff1'),(16,'assets','UPDATE',10,'[\"status\", \"lending_status\"]','{\"status\": \"Good\", \"lending_status\": \"Available\"}','{\"status\": \"Faulty\", \"lending_status\": null}','2025-10-20 11:43:54',3,'staff1'),(17,'assets','UPDATE',10,'[\"status\", \"lending_status\"]','{\"status\": \"Faulty\", \"lending_status\": null}','{\"status\": \"Good\", \"lending_status\": \"Available\"}','2025-10-20 11:43:55',2,'manager1'),(18,'assets','INSERT',12,'[\"asset_tag\", \"asset_numeric_id\", \"asset_type\", \"name\", \"category_id\", \"manufacturer\", \"model\", \"serial_number\", \"zone_id\", \"status\", \"price\", \"quantity_used\", \"lendable\", \"minimum_role_for_lending\", \"lending_status\", \"no_scan\", \"created_by\"]',NULL,'{\"asset_tag\": \"MOUSE-1\", \"asset_numeric_id\": 12309104, \"asset_type\": \"N\", \"name\": \"Wireless Mouse 1\", \"category_id\": 2, \"manufacturer\": \"Logitech\", \"model\": \"MX Master 3\", \"serial_number\": \"SN-MOUSE-1\", \"zone_id\": 6, \"status\": \"Good\", \"price\": 99.99, \"quantity_used\": 0, \"lendable\": 1, \"minimum_role_for_lending\": 1, \"lending_status\": \"Available\", \"no_scan\": \"No\", \"created_by\": 2}','2025-10-20 11:43:57',2,'manager1'),(19,'assets','INSERT',13,'[\"asset_tag\", \"asset_numeric_id\", \"asset_type\", \"name\", \"category_id\", \"manufacturer\", \"model\", \"serial_number\", \"zone_id\", \"status\", \"price\", \"quantity_used\", \"lendable\", \"minimum_role_for_lending\", \"lending_status\", \"no_scan\", \"created_by\"]',NULL,'{\"asset_tag\": \"MOUSE-2\", \"asset_numeric_id\": 56755484, \"asset_type\": \"N\", \"name\": \"Wireless Mouse 2\", \"category_id\": 2, \"manufacturer\": \"Logitech\", \"model\": \"MX Master 3\", \"serial_number\": \"SN-MOUSE-2\", \"zone_id\": 6, \"status\": \"Good\", \"price\": 99.99, \"quantity_used\": 0, \"lendable\": 1, \"minimum_role_for_lending\": 1, \"lending_status\": \"Available\", \"no_scan\": \"No\", \"created_by\": 2}','2025-10-20 11:43:57',2,'manager1'),(20,'assets','INSERT',14,'[\"asset_tag\", \"asset_numeric_id\", \"asset_type\", \"name\", \"category_id\", \"manufacturer\", \"model\", \"serial_number\", \"zone_id\", \"status\", \"price\", \"quantity_used\", \"lendable\", \"minimum_role_for_lending\", \"lending_status\", \"no_scan\", \"created_by\"]',NULL,'{\"asset_tag\": \"MOUSE-3\", \"asset_numeric_id\": 85179628, \"asset_type\": \"N\", \"name\": \"Wireless Mouse 3\", \"category_id\": 2, \"manufacturer\": \"Logitech\", \"model\": \"MX Master 3\", \"serial_number\": \"SN-MOUSE-3\", \"zone_id\": 6, \"status\": \"Good\", \"price\": 99.99, \"quantity_used\": 0, \"lendable\": 1, \"minimum_role_for_lending\": 1, \"lending_status\": \"Available\", \"no_scan\": \"No\", \"created_by\": 2}','2025-10-20 11:43:57',2,'manager1'),(21,'assets','INSERT',15,'[\"asset_tag\", \"asset_numeric_id\", \"asset_type\", \"name\", \"category_id\", \"zone_id\", \"zone_plus\", \"zone_note\", \"status\", \"quantity_used\", \"lendable\", \"minimum_role_for_lending\", \"no_scan\", \"created_by\"]',NULL,'{\"asset_tag\": \"CLARIFY-1\", \"asset_numeric_id\": 26824546, \"asset_type\": \"N\", \"name\": \"Valid Clarify Test\", \"category_id\": 2, \"zone_id\": 5, \"zone_plus\": \"Clarify\", \"zone_note\": \"Needs verification of exact location in lab\", \"status\": \"Good\", \"quantity_used\": 0, \"lendable\": 0, \"minimum_role_for_lending\": 1, \"no_scan\": \"No\", \"created_by\": 2}','2025-10-20 11:43:59',2,'manager1'),(22,'assets','UPDATE',6,'[\"last_audit\", \"last_audit_status\"]','{\"last_audit\": null, \"last_audit_status\": null}','{\"last_audit\": \"2025-10-13\", \"last_audit_status\": \"Good\"}','2025-10-20 11:44:00',2,'manager1'),(23,'assets','UPDATE',7,'[\"last_audit\", \"last_audit_status\"]','{\"last_audit\": null, \"last_audit_status\": null}','{\"last_audit\": \"2025-10-13\", \"last_audit_status\": \"Good\"}','2025-10-20 11:44:00',2,'manager1'),(24,'assets','UPDATE',6,'[\"last_audit\"]','{\"last_audit\": \"2025-10-13\"}','{\"last_audit\": \"2025-10-20\"}','2025-10-20 11:44:03',2,'manager1'),(25,'assets','UPDATE',7,'[\"last_audit\"]','{\"last_audit\": \"2025-10-13\"}','{\"last_audit\": \"2025-10-20\"}','2025-10-20 11:44:04',2,'manager1'),(26,'assets','UPDATE',8,'[\"last_audit\", \"last_audit_status\"]','{\"last_audit\": null, \"last_audit_status\": null}','{\"last_audit\": \"2025-10-20\", \"last_audit_status\": \"Good\"}','2025-10-20 11:44:04',2,'manager1'),(27,'assets','UPDATE',11,'[\"last_audit\", \"last_audit_status\"]','{\"last_audit\": null, \"last_audit_status\": null}','{\"last_audit\": \"2025-10-20\", \"last_audit_status\": \"Good\"}','2025-10-20 11:44:04',2,'manager1'),(28,'assets','UPDATE',12,'[\"last_audit\", \"last_audit_status\"]','{\"last_audit\": null, \"last_audit_status\": null}','{\"last_audit\": \"2025-10-20\", \"last_audit_status\": \"Good\"}','2025-10-20 11:44:05',2,'manager1'),(29,'assets','UPDATE',13,'[\"last_audit\", \"last_audit_status\"]','{\"last_audit\": null, \"last_audit_status\": null}','{\"last_audit\": \"2025-10-20\", \"last_audit_status\": \"Good\"}','2025-10-20 11:44:05',2,'manager1'),(30,'assets','UPDATE',14,'[\"last_audit\", \"last_audit_status\"]','{\"last_audit\": null, \"last_audit_status\": null}','{\"last_audit\": \"2025-10-20\", \"last_audit_status\": \"Good\"}','2025-10-20 11:44:05',2,'manager1'),(31,'assets','UPDATE',10,'[\"last_audit\", \"last_audit_status\"]','{\"last_audit\": null, \"last_audit_status\": null}','{\"last_audit\": \"2025-10-20\", \"last_audit_status\": \"Attention\"}','2025-10-20 11:44:07',2,'manager1'),(32,'assets','UPDATE',10,'[\"status\"]','{\"status\": \"Good\"}','{\"status\": \"Attention\"}','2025-10-20 11:44:07',2,'manager1'),(33,'assets','UPDATE',2,'[\"last_audit\", \"last_audit_status\"]','{\"last_audit\": null, \"last_audit_status\": null}','{\"last_audit\": \"2025-10-20\", \"last_audit_status\": \"Missing\"}','2025-10-20 11:44:09',2,'manager1'),(34,'assets','UPDATE',2,'[\"status\"]','{\"status\": \"Good\"}','{\"status\": \"Missing\"}','2025-10-20 11:44:09',2,'manager1'),(35,'assets','UPDATE',12,'[\"last_audit_status\"]','{\"last_audit_status\": \"Good\"}','{\"last_audit_status\": \"Faulty\"}','2025-10-20 11:44:10',2,'manager1'),(36,'assets','UPDATE',12,'[\"status\"]','{\"status\": \"Good\"}','{\"status\": \"Faulty\"}','2025-10-20 11:44:10',2,'manager1'),(37,'assets','INSERT',16,'[\"asset_tag\", \"asset_numeric_id\", \"asset_type\", \"name\", \"category_id\", \"zone_id\", \"status\", \"quantity_used\", \"lendable\", \"minimum_role_for_lending\", \"no_scan\", \"created_by\"]',NULL,'{\"asset_tag\": \"ROUTER-1\", \"asset_numeric_id\": 49096117, \"asset_type\": \"N\", \"name\": \"Network Router\", \"category_id\": 6, \"zone_id\": 4, \"status\": \"Good\", \"quantity_used\": 0, \"lendable\": 0, \"minimum_role_for_lending\": 1, \"no_scan\": \"No\", \"created_by\": 1}','2025-10-20 11:44:15',1,'admin'),(38,'assets','INSERT',17,'[\"asset_tag\", \"asset_numeric_id\", \"asset_type\", \"name\", \"zone_id\", \"status\", \"expiry_date\", \"quantity_total\", \"quantity_used\", \"lendable\", \"minimum_role_for_lending\", \"no_scan\", \"notes\", \"created_by\"]',NULL,'{\"asset_tag\": \"LIC-OFFICE-365\", \"asset_numeric_id\": 38735916, \"asset_type\": \"L\", \"name\": \"Office 365 Business Premium License\", \"zone_id\": 4, \"status\": \"Good\", \"expiry_date\": \"2026-03-15\", \"quantity_total\": 10, \"quantity_used\": 3, \"lendable\": 0, \"minimum_role_for_lending\": 1, \"no_scan\": \"No\", \"notes\": \"Annual subscription - 10 user licenses\", \"created_by\": 1}','2025-10-20 11:44:16',1,'admin'),(39,'assets','INSERT',18,'[\"asset_tag\", \"asset_numeric_id\", \"asset_type\", \"name\", \"zone_id\", \"status\", \"quantity_total\", \"quantity_used\", \"lendable\", \"minimum_role_for_lending\", \"lending_status\", \"no_scan\", \"notes\", \"created_by\"]',NULL,'{\"asset_tag\": \"CONS-MARKERS\", \"asset_numeric_id\": 79433402, \"asset_type\": \"C\", \"name\": \"Whiteboard Markers Pack\", \"zone_id\": 5, \"status\": \"Good\", \"quantity_total\": 50, \"quantity_used\": 10, \"lendable\": 1, \"minimum_role_for_lending\": 1, \"lending_status\": \"Available\", \"no_scan\": \"No\", \"notes\": \"Box of 50 markers, track deployment to classrooms\", \"created_by\": 1}','2025-10-20 11:44:16',1,'admin'),(40,'assets','UPDATE',18,'[\"quantity_used\"]','{\"quantity_used\": 10}','{\"quantity_used\": 45}','2025-10-20 11:44:17',1,'admin'),(41,'assets','INSERT',19,'[\"asset_tag\", \"asset_numeric_id\", \"asset_type\", \"name\", \"zone_id\", \"zone_plus\", \"zone_note\", \"status\", \"quantity_used\", \"lendable\", \"minimum_role_for_lending\", \"no_scan\", \"created_by\"]',NULL,'{\"asset_tag\": \"FLOAT-PROJECTOR\", \"asset_numeric_id\": 80464972, \"asset_type\": \"N\", \"name\": \"Mobile Projector\", \"zone_id\": 1, \"zone_plus\": \"Floating Global\", \"zone_note\": \"Can be moved between any locations\", \"status\": \"Good\", \"quantity_used\": 0, \"lendable\": 0, \"minimum_role_for_lending\": 1, \"no_scan\": \"No\", \"created_by\": 1}','2025-10-20 11:44:18',1,'admin'),(42,'assets','UPDATE',9,'[\"lending_status\"]','{\"lending_status\": \"Borrowed\"}','{\"lending_status\": \"Overdue\"}','2025-10-20 11:44:36',NULL,NULL),(43,'assets','UPDATE',7,'[\"lending_status\"]','{\"lending_status\": \"Available\"}','{\"lending_status\": \"Overdue\"}','2025-10-20 11:44:36',NULL,NULL),(44,'assets','UPDATE',8,'[\"lending_status\"]','{\"lending_status\": \"Available\"}','{\"lending_status\": \"Stolen\"}','2025-10-20 11:44:36',NULL,NULL),(45,'assets','UPDATE',9,'[\"lending_status\"]','{\"lending_status\": \"Overdue\"}','{\"lending_status\": \"Stolen\"}','2025-10-20 11:46:36',1,'admin'),(46,'assets','UPDATE',9,'[\"lending_status\"]','{\"lending_status\": \"Stolen\"}','{\"lending_status\": \"Overdue\"}','2025-10-20 11:48:36',1,'admin'),(47,'assets','UPDATE',9,'[\"lending_status\"]','{\"lending_status\": \"Overdue\"}','{\"lending_status\": \"Stolen\"}','2025-10-20 11:50:36',1,'admin'),(48,'assets','UPDATE',9,'[\"lending_status\"]','{\"lending_status\": \"Stolen\"}','{\"lending_status\": \"Overdue\"}','2025-10-20 11:52:36',1,'admin'),(49,'assets','UPDATE',9,'[\"lending_status\"]','{\"lending_status\": \"Overdue\"}','{\"lending_status\": \"Stolen\"}','2025-10-20 11:54:36',1,'admin'),(50,'assets','UPDATE',9,'[\"lending_status\"]','{\"lending_status\": \"Stolen\"}','{\"lending_status\": \"Overdue\"}','2025-10-20 11:56:36',1,'admin'),(51,'assets','UPDATE',9,'[\"lending_status\"]','{\"lending_status\": \"Overdue\"}','{\"lending_status\": \"Stolen\"}','2025-10-20 11:58:36',1,'admin'),(52,'assets','UPDATE',9,'[\"lending_status\"]','{\"lending_status\": \"Stolen\"}','{\"lending_status\": \"Overdue\"}','2025-10-20 12:00:36',1,'admin'),(53,'assets','UPDATE',9,'[\"lending_status\"]','{\"lending_status\": \"Overdue\"}','{\"lending_status\": \"Stolen\"}','2025-10-20 12:02:36',1,'admin'),(54,'assets','UPDATE',9,'[\"lending_status\"]','{\"lending_status\": \"Stolen\"}','{\"lending_status\": \"Overdue\"}','2025-10-20 12:04:36',1,'admin'),(55,'assets','UPDATE',9,'[\"lending_status\"]','{\"lending_status\": \"Overdue\"}','{\"lending_status\": \"Stolen\"}','2025-10-20 12:06:54',NULL,NULL),(56,'assets','UPDATE',9,'[\"lending_status\"]','{\"lending_status\": \"Stolen\"}','{\"lending_status\": \"Overdue\"}','2025-10-20 12:08:54',NULL,NULL),(57,'assets','UPDATE',9,'[\"lending_status\"]','{\"lending_status\": \"Overdue\"}','{\"lending_status\": \"Stolen\"}','2025-10-20 12:10:09',NULL,NULL),(58,'assets','UPDATE',9,'[\"lending_status\"]','{\"lending_status\": \"Stolen\"}','{\"lending_status\": \"Overdue\"}','2025-10-20 12:11:33',NULL,NULL),(59,'assets','UPDATE',9,'[\"lending_status\"]','{\"lending_status\": \"Overdue\"}','{\"lending_status\": \"Stolen\"}','2025-10-20 12:13:33',NULL,NULL),(60,'assets','UPDATE',9,'[\"lending_status\"]','{\"lending_status\": \"Stolen\"}','{\"lending_status\": \"Overdue\"}','2025-10-20 12:15:33',1,'admin'),(61,'assets','UPDATE',9,'[\"lending_status\"]','{\"lending_status\": \"Overdue\"}','{\"lending_status\": \"Stolen\"}','2025-10-20 12:17:33',1,'admin'),(62,'assets','UPDATE',9,'[\"lending_status\"]','{\"lending_status\": \"Stolen\"}','{\"lending_status\": \"Overdue\"}','2025-10-20 12:19:33',1,'admin'),(63,'assets','UPDATE',9,'[\"lending_status\"]','{\"lending_status\": \"Overdue\"}','{\"lending_status\": \"Stolen\"}','2025-10-20 12:21:33',1,'admin'),(64,'assets','UPDATE',9,'[\"lending_status\"]','{\"lending_status\": \"Stolen\"}','{\"lending_status\": \"Overdue\"}','2025-10-20 12:23:33',1,'admin'),(65,'assets','UPDATE',9,'[\"lending_status\"]','{\"lending_status\": \"Overdue\"}','{\"lending_status\": \"Stolen\"}','2025-10-20 12:25:33',1,'admin'),(66,'assets','UPDATE',9,'[\"lending_status\"]','{\"lending_status\": \"Stolen\"}','{\"lending_status\": \"Overdue\"}','2025-10-20 12:27:33',1,'admin'),(67,'assets','UPDATE',9,'[\"lending_status\"]','{\"lending_status\": \"Overdue\"}','{\"lending_status\": \"Stolen\"}','2025-10-20 12:29:33',1,'admin'),(68,'assets','INSERT',20,'[\"asset_tag\", \"asset_numeric_id\", \"asset_type\", \"name\", \"category_id\", \"manufacturer\", \"model\", \"zone_id\", \"status\", \"quantity_used\", \"lendable\", \"minimum_role_for_lending\", \"no_scan\", \"created_by\"]',NULL,'{\"asset_tag\": \"test\", \"asset_numeric_id\": 15540884, \"asset_type\": \"N\", \"name\": \"test\", \"category_id\": 1, \"manufacturer\": \"test\", \"model\": \"test\", \"zone_id\": 7, \"status\": \"Good\", \"quantity_used\": 0, \"lendable\": 0, \"minimum_role_for_lending\": 1, \"no_scan\": \"No\", \"created_by\": 1}','2025-10-22 10:36:03',1,'admin'),(69,'assets','UPDATE',20,'[\"name\"]','{\"name\": \"test\"}','{\"name\": \"asdasd\"}','2025-10-22 11:59:03',1,'admin'),(70,'assets','UPDATE',9,'[\"zone_id\"]','{\"zone_id\": 7}','{\"zone_id\": 4}','2025-10-22 12:04:21',1,'admin'),(71,'assets','UPDATE',20,'[\"name\"]','{\"name\": \"asdasd\"}','{\"name\": \"asdasdasd\"}','2025-10-22 12:09:18',1,'admin'),(72,'assets','UPDATE',20,'[\"model\"]','{\"model\": \"test\"}','{\"model\": \"test222\"}','2025-10-22 12:45:46',1,'admin'),(73,'assets','UPDATE',20,'[\"name\"]','{\"name\": \"asdasdasd\"}','{\"name\": \"asdasdasd2222\"}','2025-10-22 12:46:02',1,'admin'),(74,'assets','UPDATE',20,'[\"asset_tag\"]','{\"asset_tag\": \"test\"}','{\"asset_tag\": \"test2\"}','2025-10-22 12:57:24',1,'admin'),(75,'assets','UPDATE',20,'[\"asset_tag\"]','{\"asset_tag\": \"test2\"}','{\"asset_tag\": \"test\"}','2025-10-22 13:01:08',1,'admin'),(76,'assets','UPDATE',20,'[\"asset_tag\"]','{\"asset_tag\": \"test\"}','{\"asset_tag\": \"test1\"}','2025-10-22 13:01:14',1,'admin'),(77,'assets','UPDATE',20,'[\"asset_tag\"]','{\"asset_tag\": \"test1\"}','{\"asset_tag\": \"test2\"}','2025-10-22 13:01:21',1,'admin'),(78,'assets','UPDATE',20,'[\"asset_tag\"]','{\"asset_tag\": \"test2\"}','{\"asset_tag\": \"test3\"}','2025-10-22 13:01:28',1,'admin'),(79,'assets','UPDATE',1,'[\"asset_tag\"]','{\"asset_tag\": \"DESK-1\"}','{\"asset_tag\": \"DESK-12\"}','2025-10-22 13:41:25',1,'admin'),(80,'assets','UPDATE',5,'[\"status\"]','{\"status\": \"Good\"}','{\"status\": \"Retired\"}','2025-10-22 14:34:17',1,'admin'),(81,'assets','UPDATE',5,'[\"category_id\"]','{\"category_id\": 2}','{\"category_id\": 3}','2025-10-22 14:59:45',1,'admin'),(82,'assets','UPDATE',19,'[\"category_id\"]','{\"category_id\": null}','{\"category_id\": 1}','2025-10-22 14:59:52',1,'admin'),(83,'assets','UPDATE',18,'[\"category_id\"]','{\"category_id\": null}','{\"category_id\": 4}','2025-10-22 14:59:59',1,'admin'),(84,'assets','UPDATE',17,'[\"category_id\"]','{\"category_id\": null}','{\"category_id\": 6}','2025-10-22 15:00:05',1,'admin'),(85,'assets','UPDATE',20,'[\"lendable\"]','{\"lendable\": 0}','{\"lendable\": 1}','2025-10-23 08:43:07',1,'admin'),(86,'assets','UPDATE',16,'[\"lendable\"]','{\"lendable\": 0}','{\"lendable\": 1}','2025-10-23 12:38:36',1,'admin'),(87,'assets','UPDATE',6,'[\"lending_status\"]','{\"lending_status\": \"Available\"}','{\"lending_status\": \"Borrowed\"}','2025-10-23 14:10:33',1,'admin'),(88,'assets','UPDATE',12,'[\"lending_status\"]','{\"lending_status\": \"Available\"}','{\"lending_status\": \"Borrowed\"}','2025-10-24 06:51:21',1,'admin'),(89,'assets','UPDATE',13,'[\"lending_status\"]','{\"lending_status\": \"Available\"}','{\"lending_status\": \"Borrowed\"}','2025-10-24 11:59:06',1,'admin'),(92,'assets','UPDATE',6,'[\"lending_status\"]','{\"lending_status\": \"Borrowed\"}','{\"lending_status\": \"Overdue\"}','2025-10-27 09:56:24',NULL,NULL),(93,'assets','UPDATE',12,'[\"lending_status\"]','{\"lending_status\": \"Borrowed\"}','{\"lending_status\": \"Overdue\"}','2025-10-27 09:56:24',NULL,NULL),(94,'assets','UPDATE',9,'[\"lending_status\"]','{\"lending_status\": \"Stolen\"}','{\"lending_status\": \"Available\"}','2025-10-27 10:09:28',1,'admin'),(95,'assets','UPDATE',8,'[\"lending_status\"]','{\"lending_status\": \"Stolen\"}','{\"lending_status\": \"Available\"}','2025-10-27 10:10:04',1,'admin'),(96,'assets','UPDATE',7,'[\"lending_status\"]','{\"lending_status\": \"Overdue\"}','{\"lending_status\": \"Available\"}','2025-10-27 10:15:09',1,'admin'),(97,'assets','UPDATE',1,'[\"lending_status\"]','{\"lending_status\": null}','{\"lending_status\": \"Available\"}','2025-10-27 10:17:22',1,'admin'),(98,'assets','UPDATE',6,'[\"lending_status\"]','{\"lending_status\": \"Overdue\"}','{\"lending_status\": \"Available\"}','2025-10-27 10:46:10',1,'admin'),(99,'assets','UPDATE',13,'[\"lending_status\"]','{\"lending_status\": \"Borrowed\"}','{\"lending_status\": \"Overdue\"}','2025-11-03 14:40:22',NULL,NULL),(100,'assets','UPDATE',8,'[\"lending_status\"]','{\"lending_status\": \"Available\"}','{\"lending_status\": \"Borrowed\"}','2025-11-03 14:44:10',1,'admin'),(101,'assets','UPDATE',12,'[\"lending_status\"]','{\"lending_status\": \"Overdue\"}','{\"lending_status\": \"Stolen\"}','2025-11-09 00:00:06',NULL,NULL),(102,'assets','UPDATE',8,'[\"lending_status\"]','{\"lending_status\": \"Borrowed\"}','{\"lending_status\": \"Overdue\"}','2025-11-11 08:55:56',NULL,NULL),(103,'assets','UPDATE',14,'[\"lending_status\"]','{\"lending_status\": \"Available\"}','{\"lending_status\": \"Borrowed\"}','2025-11-11 09:00:13',1,'admin'),(104,'assets','UPDATE',6,'[\"lending_status\"]','{\"lending_status\": \"Available\"}','{\"lending_status\": \"Borrowed\"}','2025-11-12 10:32:00',1,'admin'),(105,'assets','UPDATE',14,'[\"lending_status\"]','{\"lending_status\": \"Borrowed\"}','{\"lending_status\": \"Overdue\"}','2025-11-13 00:01:11',NULL,NULL),(106,'assets','INSERT',21,'[\"asset_tag\", \"asset_numeric_id\", \"asset_type\", \"name\", \"category_id\", \"manufacturer\", \"model\", \"zone_id\", \"status\", \"price\", \"purchase_date\", \"warranty_until\", \"supplier_id\", \"lending_status\", \"no_scan\", \"created_by\"]',NULL,'{\"asset_tag\": \"TECH-sb-GFLAB-101-01\", \"asset_numeric_id\": 91584504, \"asset_type\": \"N\", \"name\": \"CTouch Smartboard Riva R2\", \"category_id\": 7, \"manufacturer\": \"Cunt Touch\", \"model\": \"Riva R2\", \"zone_id\": 5, \"status\": \"Good\", \"price\": 123123.00, \"purchase_date\": \"2025-11-13\", \"warranty_until\": \"2027-11-13\", \"supplier_id\": 1, \"lending_status\": \"Available\", \"no_scan\": \"No\", \"created_by\": 1}','2025-11-13 13:03:55',1,'admin'),(107,'assets','INSERT',22,'[\"asset_tag\", \"asset_numeric_id\", \"asset_type\", \"name\", \"category_id\", \"manufacturer\", \"model\", \"zone_id\", \"status\", \"price\", \"purchase_date\", \"warranty_until\", \"supplier_id\", \"lending_status\", \"no_scan\", \"created_by\"]',NULL,'{\"asset_tag\": \"PS39-sb-108-01\", \"asset_numeric_id\": 31979434, \"asset_type\": \"N\", \"name\": \"CTouch Smartboard Riva R2\", \"category_id\": 7, \"manufacturer\": \"Cunt Touch\", \"model\": \"Riva R2\", \"zone_id\": 11, \"status\": \"Good\", \"price\": 123123.00, \"purchase_date\": \"2025-11-13\", \"warranty_until\": \"2027-11-13\", \"supplier_id\": 1, \"lending_status\": \"Available\", \"no_scan\": \"No\", \"created_by\": 1}','2025-11-13 13:30:16',1,'admin'),(108,'assets','INSERT',24,'[\"asset_tag\", \"asset_numeric_id\", \"asset_type\", \"name\", \"category_id\", \"manufacturer\", \"model\", \"zone_id\", \"status\", \"price\", \"purchase_date\", \"warranty_until\", \"supplier_id\", \"lending_status\", \"no_scan\", \"created_by\"]',NULL,'{\"asset_tag\": \"PS39-sb-108-02\", \"asset_numeric_id\": 72311629, \"asset_type\": \"N\", \"name\": \"CTouch Smartboard Riva R2\", \"category_id\": 7, \"manufacturer\": \"Cunt Touch\", \"model\": \"Riva R2\", \"zone_id\": 11, \"status\": \"Good\", \"price\": 123123.00, \"purchase_date\": \"2025-11-13\", \"warranty_until\": \"2027-11-13\", \"supplier_id\": 1, \"lending_status\": \"Available\", \"no_scan\": \"No\", \"created_by\": 1}','2025-11-13 13:39:32',1,'admin'),(109,'assets','UPDATE',6,'[\"status\"]','{\"status\": \"Good\"}','{\"status\": \"Retired\"}','2025-11-13 15:18:06',1,'admin'),(110,'assets','UPDATE',6,'[\"lending_status\"]','{\"lending_status\": \"Borrowed\"}','{\"lending_status\": \"Available\"}','2025-11-13 15:21:47',1,'admin'),(111,'assets','DELETE',6,'[\"asset_tag\", \"asset_numeric_id\", \"asset_type\", \"name\", \"category_id\", \"manufacturer\", \"model\", \"serial_number\", \"zone_id\", \"status\", \"last_audit\", \"last_audit_status\", \"price\", \"purchase_date\", \"quantity_used\", \"supplier_id\", \"lendable\", \"minimum_role_for_lending\", \"lending_status\", \"previous_borrower_id\", \"no_scan\", \"created_date\", \"created_by\", \"last_modified_date\", \"last_modified_by\"]','{\"asset_tag\": \"LAPTOP-1\", \"asset_numeric_id\": 65938365, \"asset_type\": \"B\", \"name\": \"Laptop 1\", \"category_id\": 2, \"manufacturer\": \"HP\", \"model\": \"EliteBook 840\", \"serial_number\": \"SN-LAPTOP-1\", \"zone_id\": 6, \"status\": \"Retired\", \"last_audit\": \"2025-10-20\", \"last_audit_status\": \"Good\", \"price\": 1299.99, \"purchase_date\": \"2024-02-01\", \"quantity_used\": 0, \"supplier_id\": 1, \"lendable\": 1, \"minimum_role_for_lending\": 25, \"lending_status\": \"Available\", \"previous_borrower_id\": 1, \"no_scan\": \"No\", \"created_date\": \"2025-10-20 11:43:47\", \"created_by\": 1, \"last_modified_date\": \"2025-11-13 15:21:47\", \"last_modified_by\": 1}',NULL,'2025-11-13 15:21:58',1,'admin'),(112,'assets','DELETE',20,'[\"asset_tag\", \"asset_numeric_id\", \"asset_type\", \"name\", \"category_id\", \"manufacturer\", \"model\", \"zone_id\", \"status\", \"quantity_used\", \"lendable\", \"minimum_role_for_lending\", \"no_scan\", \"created_date\", \"created_by\", \"last_modified_date\", \"last_modified_by\"]','{\"asset_tag\": \"test3\", \"asset_numeric_id\": 15540884, \"asset_type\": \"N\", \"name\": \"asdasdasd2222\", \"category_id\": 1, \"manufacturer\": \"test\", \"model\": \"test222\", \"zone_id\": 7, \"status\": \"Good\", \"quantity_used\": 0, \"lendable\": 1, \"minimum_role_for_lending\": 1, \"no_scan\": \"No\", \"created_date\": \"2025-10-22 10:36:03\", \"created_by\": 1, \"last_modified_date\": \"2025-10-23 08:43:07\", \"last_modified_by\": 1}',NULL,'2025-11-13 15:24:16',1,'admin'),(113,'assets','DELETE',4,'[\"asset_tag\", \"asset_numeric_id\", \"asset_type\", \"name\", \"category_id\", \"manufacturer\", \"model\", \"serial_number\", \"zone_id\", \"status\", \"price\", \"purchase_date\", \"quantity_used\", \"supplier_id\", \"lendable\", \"minimum_role_for_lending\", \"no_scan\", \"created_date\", \"created_by\", \"last_modified_date\"]','{\"asset_tag\": \"DESK-4\", \"asset_numeric_id\": 40933134, \"asset_type\": \"N\", \"name\": \"Desktop Computer 4\", \"category_id\": 2, \"manufacturer\": \"Dell\", \"model\": \"OptiPlex 7090\", \"serial_number\": \"SN-DESK-4\", \"zone_id\": 5, \"status\": \"Good\", \"price\": 899.99, \"purchase_date\": \"2024-01-15\", \"quantity_used\": 0, \"supplier_id\": 1, \"lendable\": 0, \"minimum_role_for_lending\": 1, \"no_scan\": \"No\", \"created_date\": \"2025-10-20 11:43:46\", \"created_by\": 1, \"last_modified_date\": \"2025-10-20 11:43:46\"}',NULL,'2025-11-13 15:24:25',1,'admin'),(114,'assets','DELETE',3,'[\"asset_tag\", \"asset_numeric_id\", \"asset_type\", \"name\", \"category_id\", \"manufacturer\", \"model\", \"serial_number\", \"zone_id\", \"status\", \"price\", \"purchase_date\", \"quantity_used\", \"supplier_id\", \"lendable\", \"minimum_role_for_lending\", \"no_scan\", \"created_date\", \"created_by\", \"last_modified_date\", \"last_modified_by\"]','{\"asset_tag\": \"DESK-3\", \"asset_numeric_id\": 64139289, \"asset_type\": \"N\", \"name\": \"Desktop Computer 3\", \"category_id\": 2, \"manufacturer\": \"Dell\", \"model\": \"OptiPlex 7090\", \"serial_number\": \"SN-DESK-3\", \"zone_id\": 5, \"status\": \"Missing\", \"price\": 899.99, \"purchase_date\": \"2024-01-15\", \"quantity_used\": 0, \"supplier_id\": 1, \"lendable\": 0, \"minimum_role_for_lending\": 1, \"no_scan\": \"No\", \"created_date\": \"2025-10-20 11:43:46\", \"created_by\": 1, \"last_modified_date\": \"2025-10-20 11:43:52\", \"last_modified_by\": 1}',NULL,'2025-11-13 15:24:42',1,'admin'),(115,'assets','DELETE',5,'[\"asset_tag\", \"asset_numeric_id\", \"asset_type\", \"name\", \"category_id\", \"manufacturer\", \"model\", \"serial_number\", \"zone_id\", \"status\", \"price\", \"purchase_date\", \"quantity_used\", \"supplier_id\", \"lendable\", \"minimum_role_for_lending\", \"no_scan\", \"created_date\", \"created_by\", \"last_modified_date\", \"last_modified_by\"]','{\"asset_tag\": \"DESK-5\", \"asset_numeric_id\": 80850219, \"asset_type\": \"N\", \"name\": \"Desktop Computer 5\", \"category_id\": 3, \"manufacturer\": \"Dell\", \"model\": \"OptiPlex 7090\", \"serial_number\": \"SN-DESK-5\", \"zone_id\": 5, \"status\": \"Retired\", \"price\": 899.99, \"purchase_date\": \"2024-01-15\", \"quantity_used\": 0, \"supplier_id\": 1, \"lendable\": 0, \"minimum_role_for_lending\": 1, \"no_scan\": \"No\", \"created_date\": \"2025-10-20 11:43:47\", \"created_by\": 1, \"last_modified_date\": \"2025-10-22 14:59:45\", \"last_modified_by\": 1}',NULL,'2025-11-13 15:24:49',1,'admin'),(116,'assets','DELETE',10,'[\"asset_tag\", \"asset_numeric_id\", \"asset_type\", \"name\", \"category_id\", \"manufacturer\", \"model\", \"serial_number\", \"zone_id\", \"status\", \"last_audit\", \"last_audit_status\", \"price\", \"purchase_date\", \"quantity_used\", \"supplier_id\", \"lendable\", \"minimum_role_for_lending\", \"lending_status\", \"no_scan\", \"created_date\", \"created_by\", \"last_modified_date\", \"last_modified_by\"]','{\"asset_tag\": \"DMM-001\", \"asset_numeric_id\": 96642470, \"asset_type\": \"L\", \"name\": \"Digital Multimeter\", \"category_id\": 3, \"manufacturer\": \"Fluke\", \"model\": \"117\", \"serial_number\": \"SN-DMM-001\", \"zone_id\": 7, \"status\": \"Attention\", \"last_audit\": \"2025-10-20\", \"last_audit_status\": \"Attention\", \"price\": 199.99, \"purchase_date\": \"2024-01-10\", \"quantity_used\": 0, \"supplier_id\": 2, \"lendable\": 1, \"minimum_role_for_lending\": 25, \"lending_status\": \"Available\", \"no_scan\": \"No\", \"created_date\": \"2025-10-20 11:43:48\", \"created_by\": 1, \"last_modified_date\": \"2025-10-20 11:44:07\", \"last_modified_by\": 2}',NULL,'2025-11-13 15:25:01',1,'admin'),(117,'assets','DELETE',2,'[\"asset_tag\", \"asset_numeric_id\", \"asset_type\", \"name\", \"category_id\", \"manufacturer\", \"model\", \"serial_number\", \"zone_id\", \"status\", \"last_audit\", \"last_audit_status\", \"price\", \"purchase_date\", \"quantity_used\", \"supplier_id\", \"lendable\", \"minimum_role_for_lending\", \"no_scan\", \"created_date\", \"created_by\", \"last_modified_date\", \"last_modified_by\"]','{\"asset_tag\": \"DESK-2\", \"asset_numeric_id\": 34081098, \"asset_type\": \"N\", \"name\": \"Desktop Computer 2\", \"category_id\": 2, \"manufacturer\": \"Dell\", \"model\": \"OptiPlex 7090\", \"serial_number\": \"SN-DESK-2\", \"zone_id\": 5, \"status\": \"Missing\", \"last_audit\": \"2025-10-20\", \"last_audit_status\": \"Missing\", \"price\": 899.99, \"purchase_date\": \"2024-01-15\", \"quantity_used\": 0, \"supplier_id\": 1, \"lendable\": 0, \"minimum_role_for_lending\": 1, \"no_scan\": \"No\", \"created_date\": \"2025-10-20 11:43:46\", \"created_by\": 1, \"last_modified_date\": \"2025-10-20 11:44:09\", \"last_modified_by\": 2}',NULL,'2025-11-13 15:25:04',1,'admin'),(118,'assets','DELETE',11,'[\"asset_tag\", \"asset_numeric_id\", \"asset_type\", \"name\", \"category_id\", \"manufacturer\", \"model\", \"serial_number\", \"zone_id\", \"status\", \"last_audit\", \"last_audit_status\", \"price\", \"purchase_date\", \"quantity_available\", \"quantity_total\", \"quantity_used\", \"supplier_id\", \"lendable\", \"minimum_role_for_lending\", \"lending_status\", \"no_scan\", \"created_date\", \"created_by\", \"last_modified_date\", \"last_modified_by\"]','{\"asset_tag\": \"CABLE-ETH-001\", \"asset_numeric_id\": 57348031, \"asset_type\": \"C\", \"name\": \"Ethernet Cables (Box of 50)\", \"category_id\": 4, \"manufacturer\": \"Generic\", \"model\": \"Cat6 5ft\", \"serial_number\": \"BATCH-001\", \"zone_id\": 6, \"status\": \"Good\", \"last_audit\": \"2025-10-20\", \"last_audit_status\": \"Good\", \"price\": 149.99, \"purchase_date\": \"2024-03-01\", \"quantity_available\": 50, \"quantity_total\": 50, \"quantity_used\": 0, \"supplier_id\": 1, \"lendable\": 1, \"minimum_role_for_lending\": 25, \"lending_status\": \"Available\", \"no_scan\": \"No\", \"created_date\": \"2025-10-20 11:43:48\", \"created_by\": 1, \"last_modified_date\": \"2025-10-20 11:44:04\", \"last_modified_by\": 2}',NULL,'2025-11-13 15:25:08',1,'admin'),(119,'assets','DELETE',15,'[\"asset_tag\", \"asset_numeric_id\", \"asset_type\", \"name\", \"category_id\", \"zone_id\", \"zone_plus\", \"zone_note\", \"status\", \"quantity_used\", \"lendable\", \"minimum_role_for_lending\", \"no_scan\", \"created_date\", \"created_by\", \"last_modified_date\"]','{\"asset_tag\": \"CLARIFY-1\", \"asset_numeric_id\": 26824546, \"asset_type\": \"N\", \"name\": \"Valid Clarify Test\", \"category_id\": 2, \"zone_id\": 5, \"zone_plus\": \"Clarify\", \"zone_note\": \"Needs verification of exact location in lab\", \"status\": \"Good\", \"quantity_used\": 0, \"lendable\": 0, \"minimum_role_for_lending\": 1, \"no_scan\": \"No\", \"created_date\": \"2025-10-20 11:43:59\", \"created_by\": 2, \"last_modified_date\": \"2025-10-20 11:43:59\"}',NULL,'2025-11-13 15:25:12',1,'admin'),(120,'assets','DELETE',21,'[\"asset_tag\", \"asset_numeric_id\", \"asset_type\", \"name\", \"category_id\", \"manufacturer\", \"model\", \"zone_id\", \"status\", \"price\", \"purchase_date\", \"warranty_until\", \"supplier_id\", \"lending_status\", \"no_scan\", \"created_date\", \"created_by\", \"last_modified_date\"]','{\"asset_tag\": \"TECH-sb-GFLAB-101-01\", \"asset_numeric_id\": 91584504, \"asset_type\": \"N\", \"name\": \"CTouch Smartboard Riva R2\", \"category_id\": 7, \"manufacturer\": \"Cunt Touch\", \"model\": \"Riva R2\", \"zone_id\": 5, \"status\": \"Good\", \"price\": 123123.00, \"purchase_date\": \"2025-11-13\", \"warranty_until\": \"2027-11-13\", \"supplier_id\": 1, \"lending_status\": \"Available\", \"no_scan\": \"No\", \"created_date\": \"2025-11-13 13:03:55\", \"created_by\": 1, \"last_modified_date\": \"2025-11-13 13:03:55\"}',NULL,'2025-11-13 15:25:16',1,'admin'),(121,'assets','DELETE',24,'[\"asset_tag\", \"asset_numeric_id\", \"asset_type\", \"name\", \"category_id\", \"manufacturer\", \"model\", \"zone_id\", \"status\", \"price\", \"purchase_date\", \"warranty_until\", \"supplier_id\", \"lending_status\", \"no_scan\", \"created_date\", \"created_by\", \"last_modified_date\"]','{\"asset_tag\": \"PS39-sb-108-02\", \"asset_numeric_id\": 72311629, \"asset_type\": \"N\", \"name\": \"CTouch Smartboard Riva R2\", \"category_id\": 7, \"manufacturer\": \"Cunt Touch\", \"model\": \"Riva R2\", \"zone_id\": 11, \"status\": \"Good\", \"price\": 123123.00, \"purchase_date\": \"2025-11-13\", \"warranty_until\": \"2027-11-13\", \"supplier_id\": 1, \"lending_status\": \"Available\", \"no_scan\": \"No\", \"created_date\": \"2025-11-13 13:39:32\", \"created_by\": 1, \"last_modified_date\": \"2025-11-13 13:39:32\"}',NULL,'2025-11-13 15:26:36',1,'admin'),(122,'assets','DELETE',22,'[\"asset_tag\", \"asset_numeric_id\", \"asset_type\", \"name\", \"category_id\", \"manufacturer\", \"model\", \"zone_id\", \"status\", \"price\", \"purchase_date\", \"warranty_until\", \"supplier_id\", \"lending_status\", \"no_scan\", \"created_date\", \"created_by\", \"last_modified_date\"]','{\"asset_tag\": \"PS39-sb-108-01\", \"asset_numeric_id\": 31979434, \"asset_type\": \"N\", \"name\": \"CTouch Smartboard Riva R2\", \"category_id\": 7, \"manufacturer\": \"Cunt Touch\", \"model\": \"Riva R2\", \"zone_id\": 11, \"status\": \"Good\", \"price\": 123123.00, \"purchase_date\": \"2025-11-13\", \"warranty_until\": \"2027-11-13\", \"supplier_id\": 1, \"lending_status\": \"Available\", \"no_scan\": \"No\", \"created_date\": \"2025-11-13 13:30:16\", \"created_by\": 1, \"last_modified_date\": \"2025-11-13 13:30:16\"}',NULL,'2025-11-13 15:26:38',1,'admin'),(123,'assets','INSERT',25,'[\"asset_tag\", \"asset_numeric_id\", \"asset_type\", \"name\", \"category_id\", \"zone_id\", \"status\", \"price\", \"purchase_date\", \"lendable\", \"lending_status\", \"no_scan\", \"created_by\"]',NULL,'{\"asset_tag\": \"cbl-hdmi-001\", \"asset_numeric_id\": 32094651, \"asset_type\": \"N\", \"name\": \"Floating HDMI Cables\", \"category_id\": 9, \"zone_id\": 11, \"status\": \"Good\", \"price\": 20.00, \"purchase_date\": \"2025-11-13\", \"lendable\": 1, \"lending_status\": \"Available\", \"no_scan\": \"Yes\", \"created_by\": 1}','2025-11-13 15:30:09',1,'admin'),(124,'assets','UPDATE',13,'[\"lending_status\", \"previous_borrower_id\"]','{\"lending_status\": \"Overdue\", \"previous_borrower_id\": null}','{\"lending_status\": \"Available\", \"previous_borrower_id\": 5}','2025-11-13 15:53:36',1,'admin'),(125,'assets','UPDATE',8,'[\"lending_status\", \"previous_borrower_id\"]','{\"lending_status\": \"Overdue\", \"previous_borrower_id\": null}','{\"lending_status\": \"Available\", \"previous_borrower_id\": 3}','2025-11-13 15:54:12',1,'admin'),(126,'assets','UPDATE',12,'[\"lending_status\", \"previous_borrower_id\"]','{\"lending_status\": \"Stolen\", \"previous_borrower_id\": null}','{\"lending_status\": \"Available\", \"previous_borrower_id\": 1}','2025-11-13 16:09:31',1,'admin'),(127,'assets','UPDATE',7,'[\"lending_status\", \"current_borrower_id\", \"due_date\"]','{\"lending_status\": \"Available\", \"current_borrower_id\": null, \"due_date\": null}','{\"lending_status\": \"Borrowed\", \"current_borrower_id\": 3, \"due_date\": \"2025-11-19\"}','2025-11-13 16:13:07',1,'admin'),(128,'assets','UPDATE',9,'[\"lending_status\"]','{\"lending_status\": \"Available\"}','{\"lending_status\": \"Borrowed\"}','2025-11-13 16:15:33',NULL,NULL),(129,'assets','UPDATE',7,'[\"lending_status\", \"current_borrower_id\"]','{\"lending_status\": \"Borrowed\", \"current_borrower_id\": 3}','{\"lending_status\": \"Available\", \"current_borrower_id\": null}','2025-11-13 16:19:51',NULL,NULL),(130,'assets','UPDATE',7,'[\"due_date\", \"previous_borrower_id\"]','{\"due_date\": \"2025-11-19\", \"previous_borrower_id\": null}','{\"due_date\": null, \"previous_borrower_id\": 3}','2025-11-13 16:20:17',1,'admin'),(131,'assets','UPDATE',9,'[\"lending_status\", \"current_borrower_id\"]','{\"lending_status\": \"Borrowed\", \"current_borrower_id\": 3}','{\"lending_status\": \"Available\", \"current_borrower_id\": null}','2025-11-13 16:21:02',NULL,NULL),(132,'assets','UPDATE',9,'[\"due_date\"]','{\"due_date\": \"2025-10-15\"}','{\"due_date\": null}','2025-11-13 16:21:10',NULL,NULL),(133,'assets','UPDATE',9,'[\"lending_status\", \"current_borrower_id\", \"due_date\"]','{\"lending_status\": \"Available\", \"current_borrower_id\": null, \"due_date\": null}','{\"lending_status\": \"Borrowed\", \"current_borrower_id\": 3, \"due_date\": \"2025-11-27\"}','2025-11-13 16:21:33',1,'admin'),(134,'assets','UPDATE',9,'[\"asset_type\"]','{\"asset_type\": \"L\"}','{\"asset_type\": \"N\"}','2025-11-13 16:23:28',1,'admin'),(135,'assets','UPDATE',12,'[\"lending_status\", \"current_borrower_id\", \"due_date\"]','{\"lending_status\": \"Available\", \"current_borrower_id\": null, \"due_date\": null}','{\"lending_status\": \"Borrowed\", \"current_borrower_id\": 4, \"due_date\": \"2025-11-27\"}','2025-11-13 16:27:31',1,'admin'),(136,'assets','UPDATE',14,'[\"lending_status\"]','{\"lending_status\": \"Overdue\"}','{\"lending_status\": \"Available\"}','2025-11-13 16:32:16',1,'admin'),(137,'assets','INSERT',26,'[\"asset_tag\", \"asset_numeric_id\", \"asset_type\", \"name\", \"category_id\", \"zone_id\", \"status\", \"price\", \"purchase_date\", \"lendable\", \"lending_status\", \"no_scan\", \"created_by\"]',NULL,'{\"asset_tag\": \"cbl-hdmi-002\", \"asset_numeric_id\": 18368995, \"asset_type\": \"N\", \"name\": \"Floating HDMI Cables\", \"category_id\": 9, \"zone_id\": 11, \"status\": \"Good\", \"price\": 20.00, \"purchase_date\": \"2025-11-13\", \"lendable\": 1, \"lending_status\": \"Available\", \"no_scan\": \"Yes\", \"created_by\": 1}','2025-11-13 18:26:54',1,'admin'),(138,'assets','INSERT',27,'[\"asset_tag\", \"asset_numeric_id\", \"asset_type\", \"name\", \"category_id\", \"zone_id\", \"status\", \"purchase_date\", \"warranty_until\", \"lendable\", \"no_scan\", \"created_by\"]',NULL,'{\"asset_tag\": \"ps39-mon-108-01\", \"asset_numeric_id\": 66843174, \"asset_type\": \"N\", \"name\": \"Generic Monitor\", \"category_id\": 10, \"zone_id\": 11, \"status\": \"Good\", \"purchase_date\": \"2025-11-13\", \"warranty_until\": \"2027-11-13\", \"lendable\": 0, \"no_scan\": \"No\", \"created_by\": 1}','2025-11-13 18:51:25',1,'admin'),(139,'assets','INSERT',28,'[\"asset_tag\", \"asset_numeric_id\", \"asset_type\", \"name\", \"category_id\", \"zone_id\", \"status\", \"purchase_date\", \"warranty_until\", \"lendable\", \"no_scan\", \"created_by\"]',NULL,'{\"asset_tag\": \"ps39-mon-108-02\", \"asset_numeric_id\": 75155874, \"asset_type\": \"N\", \"name\": \"Generic Monitor\", \"category_id\": 10, \"zone_id\": 11, \"status\": \"Good\", \"purchase_date\": \"2025-11-13\", \"warranty_until\": \"2027-11-13\", \"lendable\": 0, \"no_scan\": \"No\", \"created_by\": 1}','2025-11-13 19:09:42',1,'admin'),(140,'assets','INSERT',29,'[\"asset_tag\", \"asset_numeric_id\", \"asset_type\", \"status\", \"quantity_used\", \"lendable\", \"minimum_role_for_lending\", \"no_scan\", \"created_by\"]',NULL,'{\"asset_tag\": \"ps39-mon-108-03\", \"asset_numeric_id\": 95324750, \"asset_type\": \"N\", \"status\": \"Good\", \"quantity_used\": 0, \"lendable\": 0, \"minimum_role_for_lending\": 1, \"no_scan\": \"No\", \"created_by\": 1}','2025-11-13 19:17:12',1,'admin'),(141,'assets','DELETE',29,'[\"asset_tag\", \"asset_numeric_id\", \"asset_type\", \"status\", \"quantity_used\", \"lendable\", \"minimum_role_for_lending\", \"no_scan\", \"created_date\", \"created_by\", \"last_modified_date\"]','{\"asset_tag\": \"ps39-mon-108-03\", \"asset_numeric_id\": 95324750, \"asset_type\": \"N\", \"status\": \"Good\", \"quantity_used\": 0, \"lendable\": 0, \"minimum_role_for_lending\": 1, \"no_scan\": \"No\", \"created_date\": \"2025-11-13 19:17:12\", \"created_by\": 1, \"last_modified_date\": \"2025-11-13 19:17:12\"}',NULL,'2025-11-13 19:19:42',1,'admin'),(142,'assets','INSERT',30,'[\"asset_tag\", \"asset_numeric_id\", \"asset_type\", \"name\", \"category_id\", \"zone_id\", \"status\", \"purchase_date\", \"warranty_until\", \"lendable\", \"no_scan\", \"created_by\"]',NULL,'{\"asset_tag\": \"ps39-mon-108-03\", \"asset_numeric_id\": 79796373, \"asset_type\": \"N\", \"name\": \"Generic Monitor (Copy)\", \"category_id\": 10, \"zone_id\": 11, \"status\": \"Good\", \"purchase_date\": \"2025-11-13\", \"warranty_until\": \"2027-11-13\", \"lendable\": 0, \"no_scan\": \"No\", \"created_by\": 1}','2025-11-13 19:25:07',1,'admin'),(143,'assets','DELETE',30,'[\"asset_tag\", \"asset_numeric_id\", \"asset_type\", \"name\", \"category_id\", \"zone_id\", \"status\", \"purchase_date\", \"warranty_until\", \"lendable\", \"no_scan\", \"created_date\", \"created_by\", \"last_modified_date\"]','{\"asset_tag\": \"ps39-mon-108-03\", \"asset_numeric_id\": 79796373, \"asset_type\": \"N\", \"name\": \"Generic Monitor (Copy)\", \"category_id\": 10, \"zone_id\": 11, \"status\": \"Good\", \"purchase_date\": \"2025-11-13\", \"warranty_until\": \"2027-11-13\", \"lendable\": 0, \"no_scan\": \"No\", \"created_date\": \"2025-11-13 19:25:07\", \"created_by\": 1, \"last_modified_date\": \"2025-11-13 19:25:07\"}',NULL,'2025-11-13 19:25:15',1,'admin'),(144,'assets','INSERT',31,'[\"asset_tag\", \"asset_numeric_id\", \"asset_type\", \"name\", \"category_id\", \"manufacturer\", \"model\", \"zone_id\", \"status\", \"price\", \"purchase_date\", \"warranty_until\", \"supplier_id\", \"lendable\", \"no_scan\", \"created_by\"]',NULL,'{\"asset_tag\": \"ps39-mon-108-03\", \"asset_numeric_id\": 66329180, \"asset_type\": \"N\", \"name\": \"Dell Monitor\", \"category_id\": 10, \"manufacturer\": \"Dell\", \"model\": \"P2723D\", \"zone_id\": 11, \"status\": \"Good\", \"price\": 199.90, \"purchase_date\": \"2025-11-13\", \"warranty_until\": \"2027-11-13\", \"supplier_id\": 1, \"lendable\": 0, \"no_scan\": \"No\", \"created_by\": 1}','2025-11-13 19:26:38',1,'admin'),(145,'assets','INSERT',32,'[\"asset_tag\", \"asset_numeric_id\", \"asset_type\", \"name\", \"category_id\", \"manufacturer\", \"model\", \"zone_id\", \"status\", \"price\", \"purchase_date\", \"warranty_until\", \"supplier_id\", \"lendable\", \"no_scan\", \"created_by\"]',NULL,'{\"asset_tag\": \"ps39-mon-108-04\", \"asset_numeric_id\": 69590527, \"asset_type\": \"N\", \"name\": \"Dell Monitor (Copy)\", \"category_id\": 10, \"manufacturer\": \"Dell\", \"model\": \"P2723D\", \"zone_id\": 11, \"status\": \"Good\", \"price\": 199.90, \"purchase_date\": \"2025-11-13\", \"warranty_until\": \"2027-11-13\", \"supplier_id\": 1, \"lendable\": 0, \"no_scan\": \"No\", \"created_by\": 1}','2025-11-13 19:27:38',1,'admin'),(146,'assets','DELETE',32,'[\"asset_tag\", \"asset_numeric_id\", \"asset_type\", \"name\", \"category_id\", \"manufacturer\", \"model\", \"zone_id\", \"status\", \"price\", \"purchase_date\", \"warranty_until\", \"supplier_id\", \"lendable\", \"no_scan\", \"created_date\", \"created_by\", \"last_modified_date\"]','{\"asset_tag\": \"ps39-mon-108-04\", \"asset_numeric_id\": 69590527, \"asset_type\": \"N\", \"name\": \"Dell Monitor (Copy)\", \"category_id\": 10, \"manufacturer\": \"Dell\", \"model\": \"P2723D\", \"zone_id\": 11, \"status\": \"Good\", \"price\": 199.90, \"purchase_date\": \"2025-11-13\", \"warranty_until\": \"2027-11-13\", \"supplier_id\": 1, \"lendable\": 0, \"no_scan\": \"No\", \"created_date\": \"2025-11-13 19:27:38\", \"created_by\": 1, \"last_modified_date\": \"2025-11-13 19:27:38\"}',NULL,'2025-11-13 19:36:33',1,'admin'),(147,'assets','INSERT',33,'[\"asset_tag\", \"asset_numeric_id\", \"asset_type\", \"name\", \"category_id\", \"manufacturer\", \"model\", \"zone_id\", \"status\", \"price\", \"purchase_date\", \"warranty_until\", \"supplier_id\", \"lendable\", \"no_scan\", \"created_by\"]',NULL,'{\"asset_tag\": \"ps39-mon-108-04\", \"asset_numeric_id\": 82402163, \"asset_type\": \"N\", \"name\": \"Dell Monitor\", \"category_id\": 10, \"manufacturer\": \"Dell\", \"model\": \"P2723D\", \"zone_id\": 11, \"status\": \"Good\", \"price\": 199.90, \"purchase_date\": \"2025-11-13\", \"warranty_until\": \"2027-11-13\", \"supplier_id\": 1, \"lendable\": 0, \"no_scan\": \"No\", \"created_by\": 1}','2025-11-13 19:36:52',1,'admin'),(148,'assets','INSERT',34,'[\"asset_numeric_id\", \"asset_type\", \"status\", \"quantity_used\", \"lendable\", \"minimum_role_for_lending\", \"no_scan\", \"created_by\"]',NULL,'{\"asset_numeric_id\": 29878524, \"asset_type\": \"N\", \"status\": \"Good\", \"quantity_used\": 0, \"lendable\": 0, \"minimum_role_for_lending\": 1, \"no_scan\": \"No\", \"created_by\": 1}','2025-11-13 19:39:23',1,'admin'),(149,'assets','DELETE',34,'[\"asset_numeric_id\", \"asset_type\", \"status\", \"quantity_used\", \"lendable\", \"minimum_role_for_lending\", \"no_scan\", \"created_date\", \"created_by\", \"last_modified_date\"]','{\"asset_numeric_id\": 29878524, \"asset_type\": \"N\", \"status\": \"Good\", \"quantity_used\": 0, \"lendable\": 0, \"minimum_role_for_lending\": 1, \"no_scan\": \"No\", \"created_date\": \"2025-11-13 19:39:23\", \"created_by\": 1, \"last_modified_date\": \"2025-11-13 19:39:23\"}',NULL,'2025-11-13 19:39:30',1,'admin'),(150,'assets','INSERT',35,'[\"asset_tag\", \"asset_numeric_id\", \"asset_type\", \"name\", \"category_id\", \"manufacturer\", \"model\", \"zone_id\", \"status\", \"price\", \"purchase_date\", \"warranty_until\", \"supplier_id\", \"lendable\", \"no_scan\", \"created_by\"]',NULL,'{\"asset_tag\": \"ps39-mon-108-05\", \"asset_numeric_id\": 62556220, \"asset_type\": \"N\", \"name\": \"Dell Monitor\", \"category_id\": 10, \"manufacturer\": \"Dell\", \"model\": \"P2723D\", \"zone_id\": 11, \"status\": \"Good\", \"price\": 199.90, \"purchase_date\": \"2025-11-13\", \"warranty_until\": \"2027-11-13\", \"supplier_id\": 1, \"lendable\": 0, \"no_scan\": \"No\", \"created_by\": 1}','2025-11-13 19:39:42',1,'admin'),(151,'assets','INSERT',36,'[\"asset_tag\", \"asset_numeric_id\", \"asset_type\", \"name\", \"category_id\", \"manufacturer\", \"model\", \"zone_id\", \"status\", \"price\", \"purchase_date\", \"warranty_until\", \"supplier_id\", \"lendable\", \"no_scan\", \"created_by\"]',NULL,'{\"asset_tag\": \"ps39-mon-108-06\", \"asset_numeric_id\": 47928367, \"asset_type\": \"N\", \"name\": \"Dell Monitor\", \"category_id\": 10, \"manufacturer\": \"Dell\", \"model\": \"P2723D\", \"zone_id\": 11, \"status\": \"Good\", \"price\": 199.90, \"purchase_date\": \"2025-11-13\", \"warranty_until\": \"2027-11-13\", \"supplier_id\": 1, \"lendable\": 0, \"no_scan\": \"No\", \"created_by\": 1}','2025-11-13 19:41:10',1,'admin'),(152,'assets','INSERT',37,'[\"asset_tag\", \"asset_numeric_id\", \"asset_type\", \"name\", \"category_id\", \"manufacturer\", \"model\", \"zone_id\", \"status\", \"price\", \"purchase_date\", \"warranty_until\", \"supplier_id\", \"lendable\", \"no_scan\", \"created_by\"]',NULL,'{\"asset_tag\": \"ps39-mon-108-07\", \"asset_numeric_id\": 94709833, \"asset_type\": \"N\", \"name\": \"Dell Monitor\", \"category_id\": 10, \"manufacturer\": \"Dell\", \"model\": \"P2723D\", \"zone_id\": 11, \"status\": \"Good\", \"price\": 199.90, \"purchase_date\": \"2025-11-13\", \"warranty_until\": \"2027-11-13\", \"supplier_id\": 1, \"lendable\": 0, \"no_scan\": \"No\", \"created_by\": 1}','2025-11-13 19:45:14',1,'admin'),(153,'assets','DELETE',37,'[\"asset_tag\", \"asset_numeric_id\", \"asset_type\", \"name\", \"category_id\", \"manufacturer\", \"model\", \"zone_id\", \"status\", \"price\", \"purchase_date\", \"warranty_until\", \"supplier_id\", \"lendable\", \"no_scan\", \"created_date\", \"created_by\", \"last_modified_date\"]','{\"asset_tag\": \"ps39-mon-108-07\", \"asset_numeric_id\": 94709833, \"asset_type\": \"N\", \"name\": \"Dell Monitor\", \"category_id\": 10, \"manufacturer\": \"Dell\", \"model\": \"P2723D\", \"zone_id\": 11, \"status\": \"Good\", \"price\": 199.90, \"purchase_date\": \"2025-11-13\", \"warranty_until\": \"2027-11-13\", \"supplier_id\": 1, \"lendable\": 0, \"no_scan\": \"No\", \"created_date\": \"2025-11-13 19:45:14\", \"created_by\": 1, \"last_modified_date\": \"2025-11-13 19:45:14\"}',NULL,'2025-11-13 19:45:33',1,'admin'),(154,'assets','DELETE',36,'[\"asset_tag\", \"asset_numeric_id\", \"asset_type\", \"name\", \"category_id\", \"manufacturer\", \"model\", \"zone_id\", \"status\", \"price\", \"purchase_date\", \"warranty_until\", \"supplier_id\", \"lendable\", \"no_scan\", \"created_date\", \"created_by\", \"last_modified_date\"]','{\"asset_tag\": \"ps39-mon-108-06\", \"asset_numeric_id\": 47928367, \"asset_type\": \"N\", \"name\": \"Dell Monitor\", \"category_id\": 10, \"manufacturer\": \"Dell\", \"model\": \"P2723D\", \"zone_id\": 11, \"status\": \"Good\", \"price\": 199.90, \"purchase_date\": \"2025-11-13\", \"warranty_until\": \"2027-11-13\", \"supplier_id\": 1, \"lendable\": 0, \"no_scan\": \"No\", \"created_date\": \"2025-11-13 19:41:10\", \"created_by\": 1, \"last_modified_date\": \"2025-11-13 19:41:10\"}',NULL,'2025-11-13 19:45:36',1,'admin'),(155,'assets','DELETE',35,'[\"asset_tag\", \"asset_numeric_id\", \"asset_type\", \"name\", \"category_id\", \"manufacturer\", \"model\", \"zone_id\", \"status\", \"price\", \"purchase_date\", \"warranty_until\", \"supplier_id\", \"lendable\", \"no_scan\", \"created_date\", \"created_by\", \"last_modified_date\"]','{\"asset_tag\": \"ps39-mon-108-05\", \"asset_numeric_id\": 62556220, \"asset_type\": \"N\", \"name\": \"Dell Monitor\", \"category_id\": 10, \"manufacturer\": \"Dell\", \"model\": \"P2723D\", \"zone_id\": 11, \"status\": \"Good\", \"price\": 199.90, \"purchase_date\": \"2025-11-13\", \"warranty_until\": \"2027-11-13\", \"supplier_id\": 1, \"lendable\": 0, \"no_scan\": \"No\", \"created_date\": \"2025-11-13 19:39:42\", \"created_by\": 1, \"last_modified_date\": \"2025-11-13 19:39:42\"}',NULL,'2025-11-13 19:45:38',1,'admin'),(156,'assets','DELETE',33,'[\"asset_tag\", \"asset_numeric_id\", \"asset_type\", \"name\", \"category_id\", \"manufacturer\", \"model\", \"zone_id\", \"status\", \"price\", \"purchase_date\", \"warranty_until\", \"supplier_id\", \"lendable\", \"no_scan\", \"created_date\", \"created_by\", \"last_modified_date\"]','{\"asset_tag\": \"ps39-mon-108-04\", \"asset_numeric_id\": 82402163, \"asset_type\": \"N\", \"name\": \"Dell Monitor\", \"category_id\": 10, \"manufacturer\": \"Dell\", \"model\": \"P2723D\", \"zone_id\": 11, \"status\": \"Good\", \"price\": 199.90, \"purchase_date\": \"2025-11-13\", \"warranty_until\": \"2027-11-13\", \"supplier_id\": 1, \"lendable\": 0, \"no_scan\": \"No\", \"created_date\": \"2025-11-13 19:36:52\", \"created_by\": 1, \"last_modified_date\": \"2025-11-13 19:36:52\"}',NULL,'2025-11-13 19:45:41',1,'admin'),(157,'assets','DELETE',31,'[\"asset_tag\", \"asset_numeric_id\", \"asset_type\", \"name\", \"category_id\", \"manufacturer\", \"model\", \"zone_id\", \"status\", \"price\", \"purchase_date\", \"warranty_until\", \"supplier_id\", \"lendable\", \"no_scan\", \"created_date\", \"created_by\", \"last_modified_date\"]','{\"asset_tag\": \"ps39-mon-108-03\", \"asset_numeric_id\": 66329180, \"asset_type\": \"N\", \"name\": \"Dell Monitor\", \"category_id\": 10, \"manufacturer\": \"Dell\", \"model\": \"P2723D\", \"zone_id\": 11, \"status\": \"Good\", \"price\": 199.90, \"purchase_date\": \"2025-11-13\", \"warranty_until\": \"2027-11-13\", \"supplier_id\": 1, \"lendable\": 0, \"no_scan\": \"No\", \"created_date\": \"2025-11-13 19:26:38\", \"created_by\": 1, \"last_modified_date\": \"2025-11-13 19:26:38\"}',NULL,'2025-11-13 19:45:43',1,'admin'),(158,'assets','DELETE',28,'[\"asset_tag\", \"asset_numeric_id\", \"asset_type\", \"name\", \"category_id\", \"zone_id\", \"status\", \"purchase_date\", \"warranty_until\", \"lendable\", \"no_scan\", \"created_date\", \"created_by\", \"last_modified_date\"]','{\"asset_tag\": \"ps39-mon-108-02\", \"asset_numeric_id\": 75155874, \"asset_type\": \"N\", \"name\": \"Generic Monitor\", \"category_id\": 10, \"zone_id\": 11, \"status\": \"Good\", \"purchase_date\": \"2025-11-13\", \"warranty_until\": \"2027-11-13\", \"lendable\": 0, \"no_scan\": \"No\", \"created_date\": \"2025-11-13 19:09:42\", \"created_by\": 1, \"last_modified_date\": \"2025-11-13 19:09:42\"}',NULL,'2025-11-13 19:45:45',1,'admin'),(159,'assets','DELETE',27,'[\"asset_tag\", \"asset_numeric_id\", \"asset_type\", \"name\", \"category_id\", \"zone_id\", \"status\", \"purchase_date\", \"warranty_until\", \"lendable\", \"no_scan\", \"created_date\", \"created_by\", \"last_modified_date\"]','{\"asset_tag\": \"ps39-mon-108-01\", \"asset_numeric_id\": 66843174, \"asset_type\": \"N\", \"name\": \"Generic Monitor\", \"category_id\": 10, \"zone_id\": 11, \"status\": \"Good\", \"purchase_date\": \"2025-11-13\", \"warranty_until\": \"2027-11-13\", \"lendable\": 0, \"no_scan\": \"No\", \"created_date\": \"2025-11-13 18:51:25\", \"created_by\": 1, \"last_modified_date\": \"2025-11-13 18:51:25\"}',NULL,'2025-11-13 19:45:47',1,'admin'),(160,'assets','INSERT',38,'[\"asset_tag\", \"asset_numeric_id\", \"asset_type\", \"name\", \"category_id\", \"zone_id\", \"status\", \"purchase_date\", \"warranty_until\", \"lendable\", \"no_scan\", \"created_by\"]',NULL,'{\"asset_tag\": \"ps39-mon-108-01\", \"asset_numeric_id\": 51229246, \"asset_type\": \"N\", \"name\": \"Dell Monitor\", \"category_id\": 10, \"zone_id\": 11, \"status\": \"Good\", \"purchase_date\": \"2025-11-13\", \"warranty_until\": \"2027-11-13\", \"lendable\": 0, \"no_scan\": \"No\", \"created_by\": 1}','2025-11-13 19:46:33',1,'admin'),(161,'assets','INSERT',39,'[\"asset_tag\", \"asset_numeric_id\", \"asset_type\", \"name\", \"category_id\", \"model\", \"serial_number\", \"zone_id\", \"status\", \"price\", \"purchase_date\", \"warranty_until\", \"supplier_id\", \"lendable\", \"no_scan\", \"created_by\"]',NULL,'{\"asset_tag\": \"ps39-mon-108-02\", \"asset_numeric_id\": 97355732, \"asset_type\": \"N\", \"name\": \"Dell Monitor\", \"category_id\": 10, \"model\": \"jyiuyiu\", \"serial_number\": \"7657865756\", \"zone_id\": 11, \"status\": \"Good\", \"price\": 21423.00, \"purchase_date\": \"2025-11-13\", \"warranty_until\": \"2027-11-13\", \"supplier_id\": 1, \"lendable\": 0, \"no_scan\": \"No\", \"created_by\": 1}','2025-11-13 19:48:05',1,'admin'),(162,'assets','DELETE',14,'[\"asset_tag\", \"asset_numeric_id\", \"asset_type\", \"name\", \"category_id\", \"manufacturer\", \"model\", \"serial_number\", \"zone_id\", \"status\", \"last_audit\", \"last_audit_status\", \"price\", \"quantity_used\", \"lendable\", \"minimum_role_for_lending\", \"lending_status\", \"no_scan\", \"created_date\", \"created_by\", \"last_modified_date\", \"last_modified_by\"]','{\"asset_tag\": \"MOUSE-3\", \"asset_numeric_id\": 85179628, \"asset_type\": \"N\", \"name\": \"Wireless Mouse 3\", \"category_id\": 2, \"manufacturer\": \"Logitech\", \"model\": \"MX Master 3\", \"serial_number\": \"SN-MOUSE-3\", \"zone_id\": 6, \"status\": \"Good\", \"last_audit\": \"2025-10-20\", \"last_audit_status\": \"Good\", \"price\": 99.99, \"quantity_used\": 0, \"lendable\": 1, \"minimum_role_for_lending\": 1, \"lending_status\": \"Available\", \"no_scan\": \"No\", \"created_date\": \"2025-10-20 11:43:57\", \"created_by\": 2, \"last_modified_date\": \"2025-11-13 16:32:16\", \"last_modified_by\": 1}',NULL,'2025-11-14 15:20:55',1,'admin'),(163,'assets','DELETE',7,'[\"asset_tag\", \"asset_numeric_id\", \"asset_type\", \"name\", \"category_id\", \"manufacturer\", \"model\", \"serial_number\", \"zone_id\", \"status\", \"last_audit\", \"last_audit_status\", \"price\", \"purchase_date\", \"quantity_used\", \"supplier_id\", \"lendable\", \"minimum_role_for_lending\", \"lending_status\", \"previous_borrower_id\", \"no_scan\", \"created_date\", \"created_by\", \"last_modified_date\", \"last_modified_by\"]','{\"asset_tag\": \"LAPTOP-2\", \"asset_numeric_id\": 90756157, \"asset_type\": \"B\", \"name\": \"Laptop 2\", \"category_id\": 2, \"manufacturer\": \"HP\", \"model\": \"EliteBook 840\", \"serial_number\": \"SN-LAPTOP-2\", \"zone_id\": 6, \"status\": \"Good\", \"last_audit\": \"2025-10-20\", \"last_audit_status\": \"Good\", \"price\": 1299.99, \"purchase_date\": \"2024-02-01\", \"quantity_used\": 0, \"supplier_id\": 1, \"lendable\": 1, \"minimum_role_for_lending\": 25, \"lending_status\": \"Available\", \"previous_borrower_id\": 3, \"no_scan\": \"No\", \"created_date\": \"2025-10-20 11:43:47\", \"created_by\": 1, \"last_modified_date\": \"2025-11-13 16:20:17\", \"last_modified_by\": 1}',NULL,'2025-11-14 15:20:59',1,'admin'),(164,'assets','DELETE',8,'[\"asset_tag\", \"asset_numeric_id\", \"asset_type\", \"name\", \"category_id\", \"manufacturer\", \"model\", \"serial_number\", \"zone_id\", \"status\", \"last_audit\", \"last_audit_status\", \"price\", \"purchase_date\", \"quantity_used\", \"supplier_id\", \"lendable\", \"minimum_role_for_lending\", \"lending_status\", \"previous_borrower_id\", \"no_scan\", \"created_date\", \"created_by\", \"last_modified_date\", \"last_modified_by\"]','{\"asset_tag\": \"LAPTOP-3\", \"asset_numeric_id\": 97073776, \"asset_type\": \"B\", \"name\": \"Laptop 3\", \"category_id\": 2, \"manufacturer\": \"HP\", \"model\": \"EliteBook 840\", \"serial_number\": \"SN-LAPTOP-3\", \"zone_id\": 6, \"status\": \"Good\", \"last_audit\": \"2025-10-20\", \"last_audit_status\": \"Good\", \"price\": 1299.99, \"purchase_date\": \"2024-02-01\", \"quantity_used\": 0, \"supplier_id\": 1, \"lendable\": 1, \"minimum_role_for_lending\": 25, \"lending_status\": \"Available\", \"previous_borrower_id\": 3, \"no_scan\": \"No\", \"created_date\": \"2025-10-20 11:43:47\", \"created_by\": 1, \"last_modified_date\": \"2025-11-13 15:54:12\", \"last_modified_by\": 1}',NULL,'2025-11-14 15:21:02',1,'admin'),(165,'assets','DELETE',13,'[\"asset_tag\", \"asset_numeric_id\", \"asset_type\", \"name\", \"category_id\", \"manufacturer\", \"model\", \"serial_number\", \"zone_id\", \"status\", \"last_audit\", \"last_audit_status\", \"price\", \"quantity_used\", \"lendable\", \"minimum_role_for_lending\", \"lending_status\", \"previous_borrower_id\", \"no_scan\", \"created_date\", \"created_by\", \"last_modified_date\", \"last_modified_by\"]','{\"asset_tag\": \"MOUSE-2\", \"asset_numeric_id\": 56755484, \"asset_type\": \"N\", \"name\": \"Wireless Mouse 2\", \"category_id\": 2, \"manufacturer\": \"Logitech\", \"model\": \"MX Master 3\", \"serial_number\": \"SN-MOUSE-2\", \"zone_id\": 6, \"status\": \"Good\", \"last_audit\": \"2025-10-20\", \"last_audit_status\": \"Good\", \"price\": 99.99, \"quantity_used\": 0, \"lendable\": 1, \"minimum_role_for_lending\": 1, \"lending_status\": \"Available\", \"previous_borrower_id\": 5, \"no_scan\": \"No\", \"created_date\": \"2025-10-20 11:43:57\", \"created_by\": 2, \"last_modified_date\": \"2025-11-13 15:53:36\", \"last_modified_by\": 1}',NULL,'2025-11-14 15:21:05',1,'admin'),(166,'assets','UPDATE',12,'[\"lending_status\", \"current_borrower_id\", \"due_date\", \"previous_borrower_id\"]','{\"lending_status\": \"Borrowed\", \"current_borrower_id\": 4, \"due_date\": \"2025-11-27\", \"previous_borrower_id\": 1}','{\"lending_status\": \"Available\", \"current_borrower_id\": null, \"due_date\": null, \"previous_borrower_id\": 4}','2025-11-14 15:21:13',1,'admin'),(167,'assets','UPDATE',9,'[\"lending_status\", \"current_borrower_id\", \"due_date\", \"previous_borrower_id\"]','{\"lending_status\": \"Borrowed\", \"current_borrower_id\": 3, \"due_date\": \"2025-11-27\", \"previous_borrower_id\": null}','{\"lending_status\": \"Available\", \"current_borrower_id\": null, \"due_date\": null, \"previous_borrower_id\": 3}','2025-11-14 15:21:16',1,'admin'),(168,'assets','DELETE',12,'[\"asset_tag\", \"asset_numeric_id\", \"asset_type\", \"name\", \"category_id\", \"manufacturer\", \"model\", \"serial_number\", \"zone_id\", \"status\", \"last_audit\", \"last_audit_status\", \"price\", \"quantity_used\", \"lendable\", \"minimum_role_for_lending\", \"lending_status\", \"previous_borrower_id\", \"no_scan\", \"created_date\", \"created_by\", \"last_modified_date\", \"last_modified_by\"]','{\"asset_tag\": \"MOUSE-1\", \"asset_numeric_id\": 12309104, \"asset_type\": \"N\", \"name\": \"Wireless Mouse 1\", \"category_id\": 2, \"manufacturer\": \"Logitech\", \"model\": \"MX Master 3\", \"serial_number\": \"SN-MOUSE-1\", \"zone_id\": 6, \"status\": \"Faulty\", \"last_audit\": \"2025-10-20\", \"last_audit_status\": \"Faulty\", \"price\": 99.99, \"quantity_used\": 0, \"lendable\": 1, \"minimum_role_for_lending\": 1, \"lending_status\": \"Available\", \"previous_borrower_id\": 4, \"no_scan\": \"No\", \"created_date\": \"2025-10-20 11:43:57\", \"created_by\": 2, \"last_modified_date\": \"2025-11-14 15:21:13\", \"last_modified_by\": 1}',NULL,'2025-11-14 15:21:37',1,'admin'),(169,'assets','DELETE',9,'[\"asset_tag\", \"asset_numeric_id\", \"asset_type\", \"name\", \"category_id\", \"manufacturer\", \"model\", \"serial_number\", \"zone_id\", \"status\", \"price\", \"purchase_date\", \"quantity_used\", \"supplier_id\", \"lendable\", \"minimum_role_for_lending\", \"lending_status\", \"previous_borrower_id\", \"no_scan\", \"created_date\", \"created_by\", \"last_modified_date\", \"last_modified_by\"]','{\"asset_tag\": \"OSC-001\", \"asset_numeric_id\": 40246871, \"asset_type\": \"N\", \"name\": \"Digital Oscilloscope\", \"category_id\": 3, \"manufacturer\": \"Tektronix\", \"model\": \"TBS2104B\", \"serial_number\": \"SN-OSC-001\", \"zone_id\": 4, \"status\": \"Good\", \"price\": 1899.99, \"purchase_date\": \"2024-01-10\", \"quantity_used\": 0, \"supplier_id\": 2, \"lendable\": 1, \"minimum_role_for_lending\": 50, \"lending_status\": \"Available\", \"previous_borrower_id\": 3, \"no_scan\": \"No\", \"created_date\": \"2025-10-20 11:43:48\", \"created_by\": 1, \"last_modified_date\": \"2025-11-14 15:21:16\", \"last_modified_by\": 1}',NULL,'2025-11-14 15:21:37',1,'admin'),(170,'assets','DELETE',1,'[\"asset_tag\", \"asset_numeric_id\", \"asset_type\", \"name\", \"category_id\", \"manufacturer\", \"model\", \"serial_number\", \"zone_id\", \"status\", \"price\", \"purchase_date\", \"quantity_used\", \"supplier_id\", \"lendable\", \"minimum_role_for_lending\", \"lending_status\", \"no_scan\", \"created_date\", \"created_by\", \"last_modified_date\", \"last_modified_by\"]','{\"asset_tag\": \"DESK-12\", \"asset_numeric_id\": 75650012, \"asset_type\": \"N\", \"name\": \"Desktop Computer 1\", \"category_id\": 2, \"manufacturer\": \"Dell\", \"model\": \"OptiPlex 7090\", \"serial_number\": \"SN-DESK-1\", \"zone_id\": 5, \"status\": \"Good\", \"price\": 899.99, \"purchase_date\": \"2024-01-15\", \"quantity_used\": 0, \"supplier_id\": 1, \"lendable\": 0, \"minimum_role_for_lending\": 1, \"lending_status\": \"Available\", \"no_scan\": \"No\", \"created_date\": \"2025-10-20 11:43:46\", \"created_by\": 1, \"last_modified_date\": \"2025-10-27 10:17:22\", \"last_modified_by\": 1}',NULL,'2025-11-14 15:21:53',1,'admin'),(171,'assets','DELETE',19,'[\"asset_tag\", \"asset_numeric_id\", \"asset_type\", \"name\", \"category_id\", \"zone_id\", \"zone_plus\", \"zone_note\", \"status\", \"quantity_used\", \"lendable\", \"minimum_role_for_lending\", \"no_scan\", \"created_date\", \"created_by\", \"last_modified_date\", \"last_modified_by\"]','{\"asset_tag\": \"FLOAT-PROJECTOR\", \"asset_numeric_id\": 80464972, \"asset_type\": \"N\", \"name\": \"Mobile Projector\", \"category_id\": 1, \"zone_id\": 1, \"zone_plus\": \"Floating Global\", \"zone_note\": \"Can be moved between any locations\", \"status\": \"Good\", \"quantity_used\": 0, \"lendable\": 0, \"minimum_role_for_lending\": 1, \"no_scan\": \"No\", \"created_date\": \"2025-10-20 11:44:18\", \"created_by\": 1, \"last_modified_date\": \"2025-10-22 14:59:52\", \"last_modified_by\": 1}',NULL,'2025-11-14 15:21:53',1,'admin'),(172,'assets','DELETE',18,'[\"asset_tag\", \"asset_numeric_id\", \"asset_type\", \"name\", \"category_id\", \"zone_id\", \"status\", \"quantity_total\", \"quantity_used\", \"lendable\", \"minimum_role_for_lending\", \"lending_status\", \"no_scan\", \"notes\", \"created_date\", \"created_by\", \"last_modified_date\", \"last_modified_by\"]','{\"asset_tag\": \"CONS-MARKERS\", \"asset_numeric_id\": 79433402, \"asset_type\": \"C\", \"name\": \"Whiteboard Markers Pack\", \"category_id\": 4, \"zone_id\": 5, \"status\": \"Good\", \"quantity_total\": 50, \"quantity_used\": 45, \"lendable\": 1, \"minimum_role_for_lending\": 1, \"lending_status\": \"Available\", \"no_scan\": \"No\", \"notes\": \"Box of 50 markers, track deployment to classrooms\", \"created_date\": \"2025-10-20 11:44:16\", \"created_by\": 1, \"last_modified_date\": \"2025-10-27 10:11:39\", \"last_modified_by\": 1}',NULL,'2025-11-14 15:21:53',1,'admin'),(173,'assets','DELETE',17,'[\"asset_tag\", \"asset_numeric_id\", \"asset_type\", \"name\", \"category_id\", \"zone_id\", \"status\", \"expiry_date\", \"quantity_total\", \"quantity_used\", \"lendable\", \"minimum_role_for_lending\", \"no_scan\", \"notes\", \"created_date\", \"created_by\", \"last_modified_date\", \"last_modified_by\"]','{\"asset_tag\": \"LIC-OFFICE-365\", \"asset_numeric_id\": 38735916, \"asset_type\": \"L\", \"name\": \"Office 365 Business Premium License\", \"category_id\": 6, \"zone_id\": 4, \"status\": \"Good\", \"expiry_date\": \"2026-03-15\", \"quantity_total\": 10, \"quantity_used\": 3, \"lendable\": 0, \"minimum_role_for_lending\": 1, \"no_scan\": \"No\", \"notes\": \"Annual subscription - 10 user licenses\", \"created_date\": \"2025-10-20 11:44:16\", \"created_by\": 1, \"last_modified_date\": \"2025-10-22 15:00:05\", \"last_modified_by\": 1}',NULL,'2025-11-14 15:21:53',1,'admin'),(174,'assets','DELETE',16,'[\"asset_tag\", \"asset_numeric_id\", \"asset_type\", \"name\", \"category_id\", \"zone_id\", \"status\", \"quantity_used\", \"lendable\", \"minimum_role_for_lending\", \"no_scan\", \"created_date\", \"created_by\", \"last_modified_date\", \"last_modified_by\"]','{\"asset_tag\": \"ROUTER-1\", \"asset_numeric_id\": 49096117, \"asset_type\": \"N\", \"name\": \"Network Router\", \"category_id\": 6, \"zone_id\": 4, \"status\": \"Good\", \"quantity_used\": 0, \"lendable\": 1, \"minimum_role_for_lending\": 1, \"no_scan\": \"No\", \"created_date\": \"2025-10-20 11:44:15\", \"created_by\": 1, \"last_modified_date\": \"2025-10-23 12:38:36\", \"last_modified_by\": 1}',NULL,'2025-11-14 15:21:53',1,'admin'),(175,'assets','UPDATE',25,'[\"lending_status\", \"current_borrower_id\", \"due_date\"]','{\"lending_status\": \"Available\", \"current_borrower_id\": null, \"due_date\": null}','{\"lending_status\": \"Borrowed\", \"current_borrower_id\": 3, \"due_date\": \"2025-11-21\"}','2025-11-14 19:28:38',1,'admin'),(176,'assets','UPDATE',26,'[\"lending_status\", \"current_borrower_id\", \"due_date\"]','{\"lending_status\": \"Available\", \"current_borrower_id\": null, \"due_date\": null}','{\"lending_status\": \"Borrowed\", \"current_borrower_id\": 3, \"due_date\": \"2025-11-21\"}','2025-11-14 21:47:39',1,'admin'),(177,'assets','UPDATE',25,'[\"lending_status\", \"current_borrower_id\", \"due_date\", \"previous_borrower_id\"]','{\"lending_status\": \"Borrowed\", \"current_borrower_id\": 3, \"due_date\": \"2025-11-21\", \"previous_borrower_id\": null}','{\"lending_status\": \"Available\", \"current_borrower_id\": null, \"due_date\": null, \"previous_borrower_id\": 3}','2025-11-14 21:48:14',1,'admin'),(178,'assets','UPDATE',26,'[\"lending_status\", \"current_borrower_id\", \"due_date\", \"previous_borrower_id\"]','{\"lending_status\": \"Borrowed\", \"current_borrower_id\": 3, \"due_date\": \"2025-11-21\", \"previous_borrower_id\": null}','{\"lending_status\": \"Available\", \"current_borrower_id\": null, \"due_date\": null, \"previous_borrower_id\": 3}','2025-11-14 21:49:25',1,'admin'),(179,'assets','UPDATE',25,'[\"lending_status\", \"current_borrower_id\", \"due_date\"]','{\"lending_status\": \"Available\", \"current_borrower_id\": null, \"due_date\": null}','{\"lending_status\": \"Borrowed\", \"current_borrower_id\": 4, \"due_date\": \"2025-11-21\"}','2025-11-14 21:51:07',1,'admin'),(180,'assets','UPDATE',25,'[\"lending_status\", \"current_borrower_id\", \"due_date\", \"previous_borrower_id\"]','{\"lending_status\": \"Borrowed\", \"current_borrower_id\": 4, \"due_date\": \"2025-11-21\", \"previous_borrower_id\": 3}','{\"lending_status\": \"Available\", \"current_borrower_id\": null, \"due_date\": null, \"previous_borrower_id\": 4}','2025-11-14 21:51:11',1,'admin'),(181,'assets','UPDATE',38,'[\"last_audit\", \"last_audit_status\"]','{\"last_audit\": null, \"last_audit_status\": null}','{\"last_audit\": \"2025-11-14\", \"last_audit_status\": \"Good\"}','2025-11-14 22:42:57',1,'admin'),(182,'assets','UPDATE',39,'[\"last_audit\", \"last_audit_status\"]','{\"last_audit\": null, \"last_audit_status\": null}','{\"last_audit\": \"2025-11-14\", \"last_audit_status\": \"Good\"}','2025-11-14 22:42:57',1,'admin'),(183,'assets','UPDATE',25,'[\"last_audit\", \"last_audit_status\"]','{\"last_audit\": null, \"last_audit_status\": null}','{\"last_audit\": \"2025-11-14\", \"last_audit_status\": \"Good\"}','2025-11-14 22:42:57',1,'admin'),(184,'assets','UPDATE',26,'[\"last_audit\", \"last_audit_status\"]','{\"last_audit\": null, \"last_audit_status\": null}','{\"last_audit\": \"2025-11-14\", \"last_audit_status\": \"Good\"}','2025-11-14 22:42:57',1,'admin'),(185,'assets','UPDATE',26,'[\"no_scan\"]','{\"no_scan\": \"Yes\"}','{\"no_scan\": \"Ask\"}','2025-11-14 23:06:14',1,'admin'),(186,'assets','UPDATE',26,'[\"last_audit_status\"]','{\"last_audit_status\": \"Good\"}','{\"last_audit_status\": \"Missing\"}','2025-11-14 23:10:15',1,'admin'),(187,'assets','UPDATE',26,'[\"status\"]','{\"status\": \"Good\"}','{\"status\": \"Missing\"}','2025-11-14 23:10:15',1,'admin'),(188,'assets','UPDATE',26,'[\"status\"]','{\"status\": \"Missing\"}','{\"status\": \"Good\"}','2025-11-14 23:21:14',1,'admin'),(189,'assets','UPDATE',26,'[\"last_audit_status\"]','{\"last_audit_status\": \"Missing\"}','{\"last_audit_status\": \"Good\"}','2025-11-14 23:25:16',1,'admin'),(190,'assets','UPDATE',38,'[\"audit_task_id\"]','{\"audit_task_id\": null}','{\"audit_task_id\": 1}','2025-11-15 01:18:32',1,'admin'),(191,'assets','UPDATE',25,'[\"last_audit\"]','{\"last_audit\": \"2025-11-14\"}','{\"last_audit\": \"2025-11-15\"}','2025-11-15 01:19:04',1,'admin'),(192,'assets','UPDATE',38,'[\"last_audit\"]','{\"last_audit\": \"2025-11-14\"}','{\"last_audit\": \"2025-11-15\"}','2025-11-15 01:29:14',1,'admin'),(193,'assets','UPDATE',39,'[\"last_audit\"]','{\"last_audit\": \"2025-11-14\"}','{\"last_audit\": \"2025-11-15\"}','2025-11-15 01:29:14',1,'admin'),(194,'assets','UPDATE',26,'[\"last_audit\"]','{\"last_audit\": \"2025-11-14\"}','{\"last_audit\": \"2025-11-15\"}','2025-11-15 01:29:14',1,'admin'),(195,'assets','UPDATE',25,'[\"lending_status\", \"current_borrower_id\", \"due_date\"]','{\"lending_status\": \"Available\", \"current_borrower_id\": null, \"due_date\": null}','{\"lending_status\": \"Borrowed\", \"current_borrower_id\": 5, \"due_date\": \"2026-01-01\"}','2025-12-03 15:44:27',1,'admin'),(196,'assets','UPDATE',38,'[\"last_audit\", \"last_audit_status\"]','{\"last_audit\": \"2025-11-15\", \"last_audit_status\": \"Good\"}','{\"last_audit\": \"2025-12-03\", \"last_audit_status\": \"Faulty\"}','2025-12-03 15:55:10',1,'admin'),(197,'assets','UPDATE',38,'[\"status\"]','{\"status\": \"Good\"}','{\"status\": \"Faulty\"}','2025-12-03 15:55:10',1,'admin'),(198,'assets','UPDATE',39,'[\"last_audit\", \"last_audit_status\"]','{\"last_audit\": \"2025-11-15\", \"last_audit_status\": \"Good\"}','{\"last_audit\": \"2025-12-03\", \"last_audit_status\": \"Missing\"}','2025-12-03 15:55:10',1,'admin'),(199,'assets','UPDATE',39,'[\"status\"]','{\"status\": \"Good\"}','{\"status\": \"Missing\"}','2025-12-03 15:55:10',1,'admin'),(200,'assets','UPDATE',25,'[\"last_audit\"]','{\"last_audit\": \"2025-11-15\"}','{\"last_audit\": \"2025-12-03\"}','2025-12-03 15:55:10',1,'admin'),(201,'assets','UPDATE',26,'[\"last_audit\"]','{\"last_audit\": \"2025-11-15\"}','{\"last_audit\": \"2025-12-03\"}','2025-12-03 15:55:10',1,'admin'),(202,'assets','UPDATE',26,'[\"lending_status\", \"current_borrower_id\", \"due_date\"]','{\"lending_status\": \"Available\", \"current_borrower_id\": null, \"due_date\": null}','{\"lending_status\": \"Borrowed\", \"current_borrower_id\": 5, \"due_date\": \"2025-12-11\"}','2025-12-08 10:58:17',1,'admin'),(203,'assets','UPDATE',38,'[\"last_audit\", \"last_audit_status\"]','{\"last_audit\": \"2025-12-03\", \"last_audit_status\": \"Faulty\"}','{\"last_audit\": \"2025-12-08\", \"last_audit_status\": \"Missing\"}','2025-12-08 11:00:50',1,'admin'),(204,'assets','UPDATE',38,'[\"status\"]','{\"status\": \"Faulty\"}','{\"status\": \"Missing\"}','2025-12-08 11:00:50',1,'admin'),(205,'assets','UPDATE',39,'[\"last_audit\", \"last_audit_status\"]','{\"last_audit\": \"2025-12-03\", \"last_audit_status\": \"Missing\"}','{\"last_audit\": \"2025-12-08\", \"last_audit_status\": \"Good\"}','2025-12-08 11:00:50',1,'admin'),(206,'assets','UPDATE',39,'[\"status\"]','{\"status\": \"Missing\"}','{\"status\": \"Good\"}','2025-12-08 11:00:50',1,'admin'),(207,'assets','UPDATE',25,'[\"last_audit\"]','{\"last_audit\": \"2025-12-03\"}','{\"last_audit\": \"2025-12-08\"}','2025-12-08 11:00:50',1,'admin'),(208,'assets','UPDATE',26,'[\"last_audit\"]','{\"last_audit\": \"2025-12-03\"}','{\"last_audit\": \"2025-12-08\"}','2025-12-08 11:00:50',1,'admin'),(209,'assets','UPDATE',38,'[\"last_audit_status\"]','{\"last_audit_status\": \"Missing\"}','{\"last_audit_status\": \"Attention\"}','2025-12-08 11:08:13',1,'admin'),(210,'assets','UPDATE',38,'[\"status\"]','{\"status\": \"Missing\"}','{\"status\": \"Attention\"}','2025-12-08 11:08:13',1,'admin'),(211,'assets','UPDATE',39,'[\"last_audit_status\"]','{\"last_audit_status\": \"Good\"}','{\"last_audit_status\": \"Missing\"}','2025-12-08 11:08:13',1,'admin'),(212,'assets','UPDATE',39,'[\"status\"]','{\"status\": \"Good\"}','{\"status\": \"Missing\"}','2025-12-08 11:08:13',1,'admin'),(213,'assets','UPDATE',26,'[\"last_audit_status\"]','{\"last_audit_status\": \"Good\"}','{\"last_audit_status\": \"Missing\"}','2025-12-08 11:08:13',1,'admin'),(214,'assets','UPDATE',26,'[\"status\"]','{\"status\": \"Good\"}','{\"status\": \"Missing\"}','2025-12-08 11:08:13',1,'admin'),(215,'assets','UPDATE',26,'[\"lending_status\", \"current_borrower_id\", \"due_date\", \"previous_borrower_id\"]','{\"lending_status\": \"Borrowed\", \"current_borrower_id\": 5, \"due_date\": \"2025-12-11\", \"previous_borrower_id\": 3}','{\"lending_status\": \"Available\", \"current_borrower_id\": null, \"due_date\": null, \"previous_borrower_id\": 5}','2025-12-10 14:29:13',1,'admin'),(216,'assets','UPDATE',26,'[\"lending_status\", \"current_borrower_id\"]','{\"lending_status\": \"Available\", \"current_borrower_id\": null}','{\"lending_status\": \"Borrowed\", \"current_borrower_id\": 3}','2025-12-10 16:37:29',1,'admin'),(217,'assets','UPDATE',26,'[\"status\"]','{\"status\": \"Missing\"}','{\"status\": \"Good\"}','2025-12-10 16:40:16',1,'admin'),(218,'assets','UPDATE',26,'[\"lending_status\"]','{\"lending_status\": \"Borrowed\"}','{\"lending_status\": \"Deployed\"}','2025-12-10 16:42:23',1,'admin'),(219,'assets','UPDATE',26,'[\"lending_status\", \"current_borrower_id\", \"previous_borrower_id\"]','{\"lending_status\": \"Deployed\", \"current_borrower_id\": 3, \"previous_borrower_id\": 5}','{\"lending_status\": \"Available\", \"current_borrower_id\": null, \"previous_borrower_id\": 3}','2025-12-10 16:55:09',1,'admin'),(220,'assets','UPDATE',26,'[\"lending_status\", \"current_borrower_id\", \"due_date\"]','{\"lending_status\": \"Available\", \"current_borrower_id\": null, \"due_date\": null}','{\"lending_status\": \"Borrowed\", \"current_borrower_id\": 5, \"due_date\": \"2025-12-14\"}','2025-12-11 17:01:32',1,'admin'),(221,'assets','UPDATE',26,'[\"lending_status\"]','{\"lending_status\": \"Borrowed\"}','{\"lending_status\": \"Overdue\"}','2025-12-21 22:43:22',NULL,NULL),(222,'assets','UPDATE',25,'[\"last_audit\"]','{\"last_audit\": \"2025-12-08\"}','{\"last_audit\": \"2025-12-21\"}','2025-12-21 23:41:41',1,'admin'),(223,'assets','UPDATE',25,'[\"last_audit\"]','{\"last_audit\": \"2025-12-21\"}','{\"last_audit\": \"2025-12-22\"}','2025-12-22 00:45:37',1,'admin'),(224,'assets','UPDATE',39,'[\"status\"]','{\"status\": \"Missing\"}','{\"status\": \"Good\"}','2025-12-22 00:47:32',1,'admin'),(225,'assets','UPDATE',38,'[\"status\"]','{\"status\": \"Attention\"}','{\"status\": \"Good\"}','2025-12-22 00:47:44',1,'admin'),(226,'assets','UPDATE',26,'[\"lending_status\", \"current_borrower_id\", \"due_date\", \"previous_borrower_id\"]','{\"lending_status\": \"Overdue\", \"current_borrower_id\": 5, \"due_date\": \"2025-12-14\", \"previous_borrower_id\": 3}','{\"lending_status\": \"Available\", \"current_borrower_id\": null, \"due_date\": null, \"previous_borrower_id\": 5}','2025-12-22 00:47:55',1,'admin'),(227,'assets','UPDATE',25,'[\"lending_status\", \"current_borrower_id\", \"due_date\", \"previous_borrower_id\"]','{\"lending_status\": \"Borrowed\", \"current_borrower_id\": 5, \"due_date\": \"2026-01-01\", \"previous_borrower_id\": 4}','{\"lending_status\": \"Available\", \"current_borrower_id\": null, \"due_date\": null, \"previous_borrower_id\": 5}','2025-12-22 00:48:00',1,'admin'),(228,'assets','INSERT',40,'[\"asset_tag\", \"asset_numeric_id\", \"asset_type\", \"name\", \"category_id\", \"zone_id\", \"status\", \"purchase_date\", \"warranty_until\", \"lendable\", \"audit_task_id\", \"no_scan\", \"created_by\"]',NULL,'{\"asset_tag\": \"ps39-mon-109-01\", \"asset_numeric_id\": 41112353, \"asset_type\": \"N\", \"name\": \"Dell Monitor\", \"category_id\": 10, \"zone_id\": 13, \"status\": \"Good\", \"purchase_date\": \"2025-11-13\", \"warranty_until\": \"2027-11-13\", \"lendable\": 0, \"audit_task_id\": 1, \"no_scan\": \"No\", \"created_by\": 1}','2025-12-22 00:48:39',1,'admin'),(229,'assets','UPDATE',40,'[\"zone_id\"]','{\"zone_id\": 13}','{\"zone_id\": 11}','2025-12-22 00:50:24',1,'admin'),(230,'assets','UPDATE',40,'[\"zone_id\"]','{\"zone_id\": 11}','{\"zone_id\": 13}','2025-12-22 00:58:22',1,'admin'),(231,'assets','UPDATE',40,'[\"asset_tag\", \"zone_id\"]','{\"asset_tag\": \"ps39-mon-109-01\", \"zone_id\": 13}','{\"asset_tag\": \"ps39-mon-108-03\", \"zone_id\": 11}','2025-12-22 00:59:38',1,'admin'),(232,'assets','UPDATE',38,'[\"last_audit\", \"last_audit_status\"]','{\"last_audit\": \"2025-12-08\", \"last_audit_status\": \"Attention\"}','{\"last_audit\": \"2025-12-22\", \"last_audit_status\": \"Good\"}','2025-12-22 01:00:29',1,'admin'),(233,'assets','UPDATE',39,'[\"last_audit\", \"last_audit_status\"]','{\"last_audit\": \"2025-12-08\", \"last_audit_status\": \"Missing\"}','{\"last_audit\": \"2025-12-22\", \"last_audit_status\": \"Good\"}','2025-12-22 01:00:29',1,'admin'),(234,'assets','UPDATE',26,'[\"last_audit\", \"last_audit_status\"]','{\"last_audit\": \"2025-12-08\", \"last_audit_status\": \"Missing\"}','{\"last_audit\": \"2025-12-22\", \"last_audit_status\": \"Good\"}','2025-12-22 01:00:29',1,'admin'),(235,'assets','UPDATE',40,'[\"last_audit\", \"last_audit_status\"]','{\"last_audit\": null, \"last_audit_status\": null}','{\"last_audit\": \"2025-12-22\", \"last_audit_status\": \"Good\"}','2025-12-22 01:00:29',1,'admin'),(236,'assets','UPDATE',40,'[\"asset_tag\", \"zone_id\"]','{\"asset_tag\": \"ps39-mon-108-03\", \"zone_id\": 11}','{\"asset_tag\": \"ps39-mon-109-01\", \"zone_id\": 13}','2025-12-22 01:09:27',1,'admin'),(237,'assets','UPDATE',40,'[\"asset_tag\"]','{\"asset_tag\": \"ps39-mon-109-01\"}','{\"asset_tag\": \"ps39-mon-109-01_TEMP_1766370124\"}','2025-12-22 02:22:04',1,'admin'),(238,'assets','UPDATE',38,'[\"asset_tag\", \"zone_id\"]','{\"asset_tag\": \"ps39-mon-108-01\", \"zone_id\": 11}','{\"asset_tag\": \"ps39-mon-109-01\", \"zone_id\": 13}','2025-12-22 02:22:04',1,'admin'),(239,'assets','UPDATE',40,'[\"asset_tag\", \"status\"]','{\"asset_tag\": \"ps39-mon-109-01_TEMP_1766370124\", \"status\": \"Good\"}','{\"asset_tag\": \"ps39-mon-108-01\", \"status\": \"Faulty\"}','2025-12-22 02:22:04',1,'admin'),(240,'assets','UPDATE',25,'[\"lending_status\", \"current_borrower_id\", \"due_date\"]','{\"lending_status\": \"Available\", \"current_borrower_id\": null, \"due_date\": null}','{\"lending_status\": \"Borrowed\", \"current_borrower_id\": 3, \"due_date\": \"2026-01-05\"}','2025-12-22 04:07:23',3,'staff1');
  34. /*!40000 ALTER TABLE `asset_change_log` ENABLE KEYS */;
  35. UNLOCK TABLES;
  36. DROP TABLE IF EXISTS `assets`;
  37. /*!40101 SET @saved_cs_client = @@character_set_client */;
  38. /*!50503 SET character_set_client = utf8mb4 */;
  39. CREATE TABLE `assets` (
  40. `id` int(11) NOT NULL AUTO_INCREMENT,
  41. `asset_tag` varchar(200) DEFAULT NULL,
  42. `tag_generation_string` varchar(255) DEFAULT NULL,
  43. `asset_numeric_id` int(11) NOT NULL CHECK (`asset_numeric_id` between 10000000 and 99999999),
  44. `belongs_to_item` int(11) DEFAULT NULL COMMENT 'References asset_numeric_id of parent asset',
  45. `previously_was` int(11) DEFAULT NULL COMMENT 'References asset_numeric_id of the asset this replaced',
  46. `asset_type` enum('N','B','L','C') NOT NULL,
  47. `name` varchar(255) DEFAULT NULL,
  48. `category_id` int(11) DEFAULT NULL,
  49. `manufacturer` varchar(200) DEFAULT NULL,
  50. `model` varchar(200) DEFAULT NULL,
  51. `serial_number` varchar(200) DEFAULT NULL,
  52. `zone_id` int(11) DEFAULT NULL,
  53. `zone_plus` enum('Floating Local','Floating Global','Clarify') DEFAULT NULL,
  54. `zone_note` text DEFAULT NULL,
  55. `status` enum('Good','Attention','Faulty','Missing','Retired','In Repair','In Transit','Expired','Unmanaged') DEFAULT 'Good',
  56. `last_audit` date DEFAULT NULL,
  57. `last_audit_status` varchar(100) DEFAULT NULL,
  58. `price` decimal(12,2) DEFAULT NULL CHECK (`price` is null or `price` >= 0),
  59. `purchase_date` date DEFAULT NULL,
  60. `warranty_until` date DEFAULT NULL,
  61. `expiry_date` date DEFAULT NULL,
  62. `quantity_available` int(11) DEFAULT NULL,
  63. `quantity_total` int(11) DEFAULT NULL,
  64. `quantity_used` int(11) DEFAULT 0,
  65. `supplier_id` int(11) DEFAULT NULL,
  66. `lendable` tinyint(1) DEFAULT 0,
  67. `minimum_role_for_lending` int(11) DEFAULT 1 CHECK (`minimum_role_for_lending` >= 1 and `minimum_role_for_lending` <= 100),
  68. `lending_status` enum('Available','Deployed','Borrowed','Overdue','Illegally Handed Out','Stolen') DEFAULT NULL,
  69. `current_borrower_id` int(11) DEFAULT NULL,
  70. `due_date` date DEFAULT NULL,
  71. `previous_borrower_id` int(11) DEFAULT NULL,
  72. `audit_task_id` int(11) DEFAULT NULL,
  73. `label_template_id` int(11) DEFAULT NULL,
  74. `no_scan` enum('Yes','Ask','No') DEFAULT 'No',
  75. `notes` text DEFAULT NULL,
  76. `additional_fields` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL CHECK (json_valid(`additional_fields`)),
  77. `file_attachment` mediumblob DEFAULT NULL,
  78. `created_date` timestamp NULL DEFAULT current_timestamp(),
  79. `created_by` int(11) DEFAULT NULL,
  80. `last_modified_date` timestamp NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
  81. `last_modified_by` int(11) DEFAULT NULL,
  82. PRIMARY KEY (`id`),
  83. UNIQUE KEY `asset_numeric_id` (`asset_numeric_id`),
  84. UNIQUE KEY `asset_tag` (`asset_tag`),
  85. KEY `supplier_id` (`supplier_id`),
  86. KEY `current_borrower_id` (`current_borrower_id`),
  87. KEY `previous_borrower_id` (`previous_borrower_id`),
  88. KEY `audit_task_id` (`audit_task_id`),
  89. KEY `created_by` (`created_by`),
  90. KEY `last_modified_by` (`last_modified_by`),
  91. KEY `idx_asset_tag` (`asset_tag`),
  92. KEY `idx_asset_numeric` (`asset_numeric_id`),
  93. KEY `idx_type` (`asset_type`),
  94. KEY `idx_status` (`status`),
  95. KEY `idx_zone` (`zone_id`),
  96. KEY `idx_category` (`category_id`),
  97. KEY `idx_lendable` (`lendable`),
  98. KEY `idx_lending_status` (`lending_status`),
  99. KEY `idx_label_template` (`label_template_id`),
  100. KEY `idx_belongs_to` (`belongs_to_item`),
  101. KEY `idx_previously_was` (`previously_was`),
  102. CONSTRAINT `assets_ibfk_1` FOREIGN KEY (`category_id`) REFERENCES `categories` (`id`),
  103. CONSTRAINT `assets_ibfk_2` FOREIGN KEY (`zone_id`) REFERENCES `zones` (`id`),
  104. CONSTRAINT `assets_ibfk_3` FOREIGN KEY (`supplier_id`) REFERENCES `suppliers` (`id`) ON DELETE SET NULL,
  105. CONSTRAINT `assets_ibfk_4` FOREIGN KEY (`current_borrower_id`) REFERENCES `borrowers` (`id`) ON DELETE SET NULL,
  106. CONSTRAINT `assets_ibfk_5` FOREIGN KEY (`previous_borrower_id`) REFERENCES `borrowers` (`id`) ON DELETE SET NULL,
  107. CONSTRAINT `assets_ibfk_6` FOREIGN KEY (`audit_task_id`) REFERENCES `audit_tasks` (`id`) ON DELETE SET NULL,
  108. CONSTRAINT `assets_ibfk_7` FOREIGN KEY (`created_by`) REFERENCES `users` (`id`) ON DELETE SET NULL,
  109. CONSTRAINT `assets_ibfk_8` FOREIGN KEY (`last_modified_by`) REFERENCES `users` (`id`) ON DELETE SET NULL,
  110. CONSTRAINT `fk_asset_label_template` FOREIGN KEY (`label_template_id`) REFERENCES `label_templates` (`id`) ON DELETE SET NULL,
  111. CONSTRAINT `fk_assets_belongs_to` FOREIGN KEY (`belongs_to_item`) REFERENCES `assets` (`asset_numeric_id`) ON DELETE SET NULL,
  112. CONSTRAINT `fk_assets_previously_was` FOREIGN KEY (`previously_was`) REFERENCES `assets` (`asset_numeric_id`) ON DELETE SET NULL
  113. ) ENGINE=InnoDB AUTO_INCREMENT=41 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci;
  114. /*!40101 SET character_set_client = @saved_cs_client */;
  115. LOCK TABLES `assets` WRITE;
  116. /*!40000 ALTER TABLE `assets` DISABLE KEYS */;
  117. INSERT INTO `assets` VALUES (25,'cbl-hdmi-001',NULL,32094651,NULL,NULL,'N','Floating HDMI Cables',9,NULL,NULL,NULL,11,NULL,NULL,'Good','2025-12-22','Good',20.00,'2025-11-13',NULL,NULL,NULL,NULL,NULL,NULL,1,NULL,'Borrowed',3,'2026-01-05',5,NULL,NULL,'Yes',NULL,NULL,NULL,'2025-11-13 15:30:09',1,'2025-12-22 04:07:23',3),(26,'cbl-hdmi-002',NULL,18368995,NULL,NULL,'N','Floating HDMI Cables',9,NULL,NULL,NULL,11,NULL,NULL,'Good','2025-12-22','Good',20.00,'2025-11-13',NULL,NULL,NULL,NULL,NULL,NULL,1,NULL,'Available',NULL,NULL,5,NULL,7,'Ask',NULL,NULL,NULL,'2025-11-13 18:26:54',1,'2025-12-22 01:00:29',1),(38,'ps39-mon-109-01',NULL,51229246,NULL,41112353,'N','Dell Monitor',10,NULL,NULL,NULL,13,NULL,NULL,'Good','2025-12-22','Good',NULL,'2025-11-13','2027-11-13',NULL,NULL,NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,1,7,'No',NULL,NULL,NULL,'2025-11-13 19:46:33',1,'2025-12-22 02:22:04',1),(39,'ps39-mon-108-02',NULL,97355732,NULL,NULL,'N','Dell Monitor',10,NULL,'jyiuyiu','7657865756',11,NULL,NULL,'Good','2025-12-22','Good',21423.00,'2025-11-13','2027-11-13',NULL,NULL,NULL,NULL,1,0,NULL,NULL,NULL,NULL,NULL,NULL,7,'No',NULL,NULL,NULL,'2025-11-13 19:48:05',1,'2025-12-22 01:00:29',1),(40,'ps39-mon-108-01',NULL,41112353,NULL,NULL,'N','Dell Monitor',10,NULL,NULL,NULL,13,NULL,NULL,'Faulty','2025-12-22','Good',NULL,'2025-11-13','2027-11-13',NULL,NULL,NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,1,7,'No',NULL,NULL,NULL,'2025-12-22 00:48:39',1,'2025-12-22 02:22:04',1);
  118. /*!40000 ALTER TABLE `assets` ENABLE KEYS */;
  119. UNLOCK TABLES;
  120. /*!50003 SET @saved_cs_client = @@character_set_client */ ;
  121. /*!50003 SET @saved_cs_results = @@character_set_results */ ;
  122. /*!50003 SET @saved_col_connection = @@collation_connection */ ;
  123. /*!50003 SET character_set_client = utf8mb4 */ ;
  124. /*!50003 SET character_set_results = utf8mb4 */ ;
  125. /*!50003 SET collation_connection = utf8mb4_0900_ai_ci */ ;
  126. /*!50003 SET @saved_sql_mode = @@sql_mode */ ;
  127. /*!50003 SET sql_mode = 'STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' */ ;
  128. DELIMITER ;;
  129. /*!50003 CREATE*/ /*!50017 DEFINER=`root`@`%`*/ /*!50003 TRIGGER assets_before_insert_meta
  130. BEFORE INSERT ON assets
  131. FOR EACH ROW
  132. BEGIN
  133. IF NEW.created_by IS NULL AND @current_user_id IS NOT NULL THEN
  134. SET NEW.created_by = @current_user_id;
  135. END IF;
  136. END */;;
  137. DELIMITER ;
  138. /*!50003 SET sql_mode = @saved_sql_mode */ ;
  139. /*!50003 SET character_set_client = @saved_cs_client */ ;
  140. /*!50003 SET character_set_results = @saved_cs_results */ ;
  141. /*!50003 SET collation_connection = @saved_col_connection */ ;
  142. /*!50003 SET @saved_cs_client = @@character_set_client */ ;
  143. /*!50003 SET @saved_cs_results = @@character_set_results */ ;
  144. /*!50003 SET @saved_col_connection = @@collation_connection */ ;
  145. /*!50003 SET character_set_client = utf8mb4 */ ;
  146. /*!50003 SET character_set_results = utf8mb4 */ ;
  147. /*!50003 SET collation_connection = utf8mb4_0900_ai_ci */ ;
  148. /*!50003 SET @saved_sql_mode = @@sql_mode */ ;
  149. /*!50003 SET sql_mode = 'STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' */ ;
  150. DELIMITER ;;
  151. /*!50003 CREATE*/ /*!50017 DEFINER=`root`@`%`*/ /*!50003 TRIGGER validate_zone_plus_insert
  152. BEFORE INSERT ON assets
  153. FOR EACH ROW
  154. BEGIN
  155. IF NEW.zone_plus = 'Clarify' AND (NEW.zone_note IS NULL OR NEW.zone_note = '') THEN
  156. SIGNAL SQLSTATE '45000'
  157. SET MESSAGE_TEXT = 'zone_note is required when zone_plus is set to Clarify';
  158. END IF;
  159. END */;;
  160. DELIMITER ;
  161. /*!50003 SET sql_mode = @saved_sql_mode */ ;
  162. /*!50003 SET character_set_client = @saved_cs_client */ ;
  163. /*!50003 SET character_set_results = @saved_cs_results */ ;
  164. /*!50003 SET collation_connection = @saved_col_connection */ ;
  165. /*!50003 SET @saved_cs_client = @@character_set_client */ ;
  166. /*!50003 SET @saved_cs_results = @@character_set_results */ ;
  167. /*!50003 SET @saved_col_connection = @@collation_connection */ ;
  168. /*!50003 SET character_set_client = utf8mb4 */ ;
  169. /*!50003 SET character_set_results = utf8mb4 */ ;
  170. /*!50003 SET collation_connection = utf8mb4_0900_ai_ci */ ;
  171. /*!50003 SET @saved_sql_mode = @@sql_mode */ ;
  172. /*!50003 SET sql_mode = 'STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' */ ;
  173. DELIMITER ;;
  174. /*!50003 CREATE*/ /*!50017 DEFINER=`root`@`%`*/ /*!50003 TRIGGER assets_after_insert_log
  175. AFTER INSERT ON assets
  176. FOR EACH ROW
  177. BEGIN
  178. DECLARE username VARCHAR(100);
  179. DECLARE set_fields_array JSON;
  180. DECLARE new_vals JSON;
  181. IF @current_user_id IS NOT NULL THEN
  182. SELECT users.username INTO username FROM users WHERE id = @current_user_id;
  183. END IF;
  184. SET set_fields_array = JSON_ARRAY();
  185. SET new_vals = JSON_OBJECT();
  186. IF NEW.asset_tag IS NOT NULL THEN
  187. SET set_fields_array = JSON_ARRAY_APPEND(set_fields_array, '$', 'asset_tag');
  188. SET new_vals = JSON_SET(new_vals, '$.asset_tag', NEW.asset_tag);
  189. END IF;
  190. IF NEW.asset_numeric_id IS NOT NULL THEN
  191. SET set_fields_array = JSON_ARRAY_APPEND(set_fields_array, '$', 'asset_numeric_id');
  192. SET new_vals = JSON_SET(new_vals, '$.asset_numeric_id', NEW.asset_numeric_id);
  193. END IF;
  194. IF NEW.asset_type IS NOT NULL THEN
  195. SET set_fields_array = JSON_ARRAY_APPEND(set_fields_array, '$', 'asset_type');
  196. SET new_vals = JSON_SET(new_vals, '$.asset_type', NEW.asset_type);
  197. END IF;
  198. IF NEW.name IS NOT NULL THEN
  199. SET set_fields_array = JSON_ARRAY_APPEND(set_fields_array, '$', 'name');
  200. SET new_vals = JSON_SET(new_vals, '$.name', NEW.name);
  201. END IF;
  202. IF NEW.category_id IS NOT NULL THEN
  203. SET set_fields_array = JSON_ARRAY_APPEND(set_fields_array, '$', 'category_id');
  204. SET new_vals = JSON_SET(new_vals, '$.category_id', NEW.category_id);
  205. END IF;
  206. IF NEW.manufacturer IS NOT NULL THEN
  207. SET set_fields_array = JSON_ARRAY_APPEND(set_fields_array, '$', 'manufacturer');
  208. SET new_vals = JSON_SET(new_vals, '$.manufacturer', NEW.manufacturer);
  209. END IF;
  210. IF NEW.model IS NOT NULL THEN
  211. SET set_fields_array = JSON_ARRAY_APPEND(set_fields_array, '$', 'model');
  212. SET new_vals = JSON_SET(new_vals, '$.model', NEW.model);
  213. END IF;
  214. IF NEW.serial_number IS NOT NULL THEN
  215. SET set_fields_array = JSON_ARRAY_APPEND(set_fields_array, '$', 'serial_number');
  216. SET new_vals = JSON_SET(new_vals, '$.serial_number', NEW.serial_number);
  217. END IF;
  218. IF NEW.zone_id IS NOT NULL THEN
  219. SET set_fields_array = JSON_ARRAY_APPEND(set_fields_array, '$', 'zone_id');
  220. SET new_vals = JSON_SET(new_vals, '$.zone_id', NEW.zone_id);
  221. END IF;
  222. IF NEW.zone_plus IS NOT NULL THEN
  223. SET set_fields_array = JSON_ARRAY_APPEND(set_fields_array, '$', 'zone_plus');
  224. SET new_vals = JSON_SET(new_vals, '$.zone_plus', NEW.zone_plus);
  225. END IF;
  226. IF NEW.zone_note IS NOT NULL THEN
  227. SET set_fields_array = JSON_ARRAY_APPEND(set_fields_array, '$', 'zone_note');
  228. SET new_vals = JSON_SET(new_vals, '$.zone_note', NEW.zone_note);
  229. END IF;
  230. IF NEW.status IS NOT NULL THEN
  231. SET set_fields_array = JSON_ARRAY_APPEND(set_fields_array, '$', 'status');
  232. SET new_vals = JSON_SET(new_vals, '$.status', NEW.status);
  233. END IF;
  234. IF NEW.last_audit IS NOT NULL THEN
  235. SET set_fields_array = JSON_ARRAY_APPEND(set_fields_array, '$', 'last_audit');
  236. SET new_vals = JSON_SET(new_vals, '$.last_audit', NEW.last_audit);
  237. END IF;
  238. IF NEW.last_audit_status IS NOT NULL THEN
  239. SET set_fields_array = JSON_ARRAY_APPEND(set_fields_array, '$', 'last_audit_status');
  240. SET new_vals = JSON_SET(new_vals, '$.last_audit_status', NEW.last_audit_status);
  241. END IF;
  242. IF NEW.price IS NOT NULL THEN
  243. SET set_fields_array = JSON_ARRAY_APPEND(set_fields_array, '$', 'price');
  244. SET new_vals = JSON_SET(new_vals, '$.price', NEW.price);
  245. END IF;
  246. IF NEW.purchase_date IS NOT NULL THEN
  247. SET set_fields_array = JSON_ARRAY_APPEND(set_fields_array, '$', 'purchase_date');
  248. SET new_vals = JSON_SET(new_vals, '$.purchase_date', NEW.purchase_date);
  249. END IF;
  250. IF NEW.warranty_until IS NOT NULL THEN
  251. SET set_fields_array = JSON_ARRAY_APPEND(set_fields_array, '$', 'warranty_until');
  252. SET new_vals = JSON_SET(new_vals, '$.warranty_until', NEW.warranty_until);
  253. END IF;
  254. IF NEW.expiry_date IS NOT NULL THEN
  255. SET set_fields_array = JSON_ARRAY_APPEND(set_fields_array, '$', 'expiry_date');
  256. SET new_vals = JSON_SET(new_vals, '$.expiry_date', NEW.expiry_date);
  257. END IF;
  258. IF NEW.quantity_available IS NOT NULL THEN
  259. SET set_fields_array = JSON_ARRAY_APPEND(set_fields_array, '$', 'quantity_available');
  260. SET new_vals = JSON_SET(new_vals, '$.quantity_available', NEW.quantity_available);
  261. END IF;
  262. IF NEW.quantity_total IS NOT NULL THEN
  263. SET set_fields_array = JSON_ARRAY_APPEND(set_fields_array, '$', 'quantity_total');
  264. SET new_vals = JSON_SET(new_vals, '$.quantity_total', NEW.quantity_total);
  265. END IF;
  266. IF NEW.quantity_used IS NOT NULL THEN
  267. SET set_fields_array = JSON_ARRAY_APPEND(set_fields_array, '$', 'quantity_used');
  268. SET new_vals = JSON_SET(new_vals, '$.quantity_used', NEW.quantity_used);
  269. END IF;
  270. IF NEW.supplier_id IS NOT NULL THEN
  271. SET set_fields_array = JSON_ARRAY_APPEND(set_fields_array, '$', 'supplier_id');
  272. SET new_vals = JSON_SET(new_vals, '$.supplier_id', NEW.supplier_id);
  273. END IF;
  274. IF NEW.lendable IS NOT NULL THEN
  275. SET set_fields_array = JSON_ARRAY_APPEND(set_fields_array, '$', 'lendable');
  276. SET new_vals = JSON_SET(new_vals, '$.lendable', NEW.lendable);
  277. END IF;
  278. IF NEW.minimum_role_for_lending IS NOT NULL THEN
  279. SET set_fields_array = JSON_ARRAY_APPEND(set_fields_array, '$', 'minimum_role_for_lending');
  280. SET new_vals = JSON_SET(new_vals, '$.minimum_role_for_lending', NEW.minimum_role_for_lending);
  281. END IF;
  282. IF NEW.lending_status IS NOT NULL THEN
  283. SET set_fields_array = JSON_ARRAY_APPEND(set_fields_array, '$', 'lending_status');
  284. SET new_vals = JSON_SET(new_vals, '$.lending_status', NEW.lending_status);
  285. END IF;
  286. IF NEW.current_borrower_id IS NOT NULL THEN
  287. SET set_fields_array = JSON_ARRAY_APPEND(set_fields_array, '$', 'current_borrower_id');
  288. SET new_vals = JSON_SET(new_vals, '$.current_borrower_id', NEW.current_borrower_id);
  289. END IF;
  290. IF NEW.due_date IS NOT NULL THEN
  291. SET set_fields_array = JSON_ARRAY_APPEND(set_fields_array, '$', 'due_date');
  292. SET new_vals = JSON_SET(new_vals, '$.due_date', NEW.due_date);
  293. END IF;
  294. IF NEW.previous_borrower_id IS NOT NULL THEN
  295. SET set_fields_array = JSON_ARRAY_APPEND(set_fields_array, '$', 'previous_borrower_id');
  296. SET new_vals = JSON_SET(new_vals, '$.previous_borrower_id', NEW.previous_borrower_id);
  297. END IF;
  298. IF NEW.audit_task_id IS NOT NULL THEN
  299. SET set_fields_array = JSON_ARRAY_APPEND(set_fields_array, '$', 'audit_task_id');
  300. SET new_vals = JSON_SET(new_vals, '$.audit_task_id', NEW.audit_task_id);
  301. END IF;
  302. IF NEW.no_scan IS NOT NULL THEN
  303. SET set_fields_array = JSON_ARRAY_APPEND(set_fields_array, '$', 'no_scan');
  304. SET new_vals = JSON_SET(new_vals, '$.no_scan', NEW.no_scan);
  305. END IF;
  306. IF NEW.notes IS NOT NULL THEN
  307. SET set_fields_array = JSON_ARRAY_APPEND(set_fields_array, '$', 'notes');
  308. SET new_vals = JSON_SET(new_vals, '$.notes', NEW.notes);
  309. END IF;
  310. IF NEW.additional_fields IS NOT NULL THEN
  311. SET set_fields_array = JSON_ARRAY_APPEND(set_fields_array, '$', 'additional_fields');
  312. SET new_vals = JSON_SET(new_vals, '$.additional_fields', NEW.additional_fields);
  313. END IF;
  314. IF NEW.created_by IS NOT NULL THEN
  315. SET set_fields_array = JSON_ARRAY_APPEND(set_fields_array, '$', 'created_by');
  316. SET new_vals = JSON_SET(new_vals, '$.created_by', NEW.created_by);
  317. END IF;
  318. INSERT INTO asset_change_log (
  319. table_name, action, record_id, changed_fields, new_values,
  320. changed_by_id, changed_by_username
  321. )
  322. VALUES (
  323. 'assets',
  324. 'INSERT',
  325. NEW.id,
  326. set_fields_array,
  327. new_vals,
  328. @current_user_id,
  329. username
  330. );
  331. END */;;
  332. DELIMITER ;
  333. /*!50003 SET sql_mode = @saved_sql_mode */ ;
  334. /*!50003 SET character_set_client = @saved_cs_client */ ;
  335. /*!50003 SET character_set_results = @saved_cs_results */ ;
  336. /*!50003 SET collation_connection = @saved_col_connection */ ;
  337. /*!50003 SET @saved_cs_client = @@character_set_client */ ;
  338. /*!50003 SET @saved_cs_results = @@character_set_results */ ;
  339. /*!50003 SET @saved_col_connection = @@collation_connection */ ;
  340. /*!50003 SET character_set_client = utf8mb4 */ ;
  341. /*!50003 SET character_set_results = utf8mb4 */ ;
  342. /*!50003 SET collation_connection = utf8mb4_0900_ai_ci */ ;
  343. /*!50003 SET @saved_sql_mode = @@sql_mode */ ;
  344. /*!50003 SET sql_mode = 'STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' */ ;
  345. DELIMITER ;;
  346. /*!50003 CREATE*/ /*!50017 DEFINER=`root`@`%`*/ /*!50003 TRIGGER assets_before_update_meta
  347. BEFORE UPDATE ON assets
  348. FOR EACH ROW
  349. BEGIN
  350. SET NEW.last_modified_date = NOW();
  351. IF @current_user_id IS NOT NULL THEN
  352. SET NEW.last_modified_by = @current_user_id;
  353. END IF;
  354. END */;;
  355. DELIMITER ;
  356. /*!50003 SET sql_mode = @saved_sql_mode */ ;
  357. /*!50003 SET character_set_client = @saved_cs_client */ ;
  358. /*!50003 SET character_set_results = @saved_cs_results */ ;
  359. /*!50003 SET collation_connection = @saved_col_connection */ ;
  360. /*!50003 SET @saved_cs_client = @@character_set_client */ ;
  361. /*!50003 SET @saved_cs_results = @@character_set_results */ ;
  362. /*!50003 SET @saved_col_connection = @@collation_connection */ ;
  363. /*!50003 SET character_set_client = utf8mb4 */ ;
  364. /*!50003 SET character_set_results = utf8mb4 */ ;
  365. /*!50003 SET collation_connection = utf8mb4_0900_ai_ci */ ;
  366. /*!50003 SET @saved_sql_mode = @@sql_mode */ ;
  367. /*!50003 SET sql_mode = 'STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' */ ;
  368. DELIMITER ;;
  369. /*!50003 CREATE*/ /*!50017 DEFINER=`root`@`%`*/ /*!50003 TRIGGER prevent_lend_non_lendable_assets
  370. BEFORE UPDATE ON assets
  371. FOR EACH ROW
  372. BEGIN
  373. IF (NEW.lendable = FALSE OR NEW.lendable IS NULL) AND
  374. NEW.lending_status IN ('Borrowed', 'Deployed', 'Overdue') AND
  375. (OLD.lending_status NOT IN ('Borrowed', 'Deployed', 'Overdue') OR OLD.lending_status IS NULL) THEN
  376. SIGNAL SQLSTATE '45000'
  377. SET MESSAGE_TEXT = 'Cannot lend asset that is marked as non-lendable. Set lendable=TRUE first.';
  378. END IF;
  379. END */;;
  380. DELIMITER ;
  381. /*!50003 SET sql_mode = @saved_sql_mode */ ;
  382. /*!50003 SET character_set_client = @saved_cs_client */ ;
  383. /*!50003 SET character_set_results = @saved_cs_results */ ;
  384. /*!50003 SET collation_connection = @saved_col_connection */ ;
  385. /*!50003 SET @saved_cs_client = @@character_set_client */ ;
  386. /*!50003 SET @saved_cs_results = @@character_set_results */ ;
  387. /*!50003 SET @saved_col_connection = @@collation_connection */ ;
  388. /*!50003 SET character_set_client = utf8mb4 */ ;
  389. /*!50003 SET character_set_results = utf8mb4 */ ;
  390. /*!50003 SET collation_connection = utf8mb4_0900_ai_ci */ ;
  391. /*!50003 SET @saved_sql_mode = @@sql_mode */ ;
  392. /*!50003 SET sql_mode = 'STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' */ ;
  393. DELIMITER ;;
  394. /*!50003 CREATE*/ /*!50017 DEFINER=`root`@`%`*/ /*!50003 TRIGGER validate_zone_plus_update
  395. BEFORE UPDATE ON assets
  396. FOR EACH ROW
  397. BEGIN
  398. IF NEW.zone_plus = 'Clarify' AND (NEW.zone_note IS NULL OR NEW.zone_note = '') THEN
  399. SIGNAL SQLSTATE '45000'
  400. SET MESSAGE_TEXT = 'zone_note is required when zone_plus is set to Clarify';
  401. END IF;
  402. END */;;
  403. DELIMITER ;
  404. /*!50003 SET sql_mode = @saved_sql_mode */ ;
  405. /*!50003 SET character_set_client = @saved_cs_client */ ;
  406. /*!50003 SET character_set_results = @saved_cs_results */ ;
  407. /*!50003 SET collation_connection = @saved_col_connection */ ;
  408. /*!50003 SET @saved_cs_client = @@character_set_client */ ;
  409. /*!50003 SET @saved_cs_results = @@character_set_results */ ;
  410. /*!50003 SET @saved_col_connection = @@collation_connection */ ;
  411. /*!50003 SET character_set_client = utf8mb4 */ ;
  412. /*!50003 SET character_set_results = utf8mb4 */ ;
  413. /*!50003 SET collation_connection = utf8mb4_0900_ai_ci */ ;
  414. /*!50003 SET @saved_sql_mode = @@sql_mode */ ;
  415. /*!50003 SET sql_mode = 'STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' */ ;
  416. DELIMITER ;;
  417. /*!50003 CREATE*/ /*!50017 DEFINER=`root`@`%`*/ /*!50003 TRIGGER assets_after_update_log
  418. AFTER UPDATE ON assets
  419. FOR EACH ROW
  420. BEGIN
  421. DECLARE username VARCHAR(100);
  422. DECLARE changed_fields_array JSON;
  423. DECLARE old_vals JSON;
  424. DECLARE new_vals JSON;
  425. IF @current_user_id IS NOT NULL THEN
  426. SELECT users.username INTO username FROM users WHERE id = @current_user_id;
  427. END IF;
  428. SET changed_fields_array = JSON_ARRAY();
  429. SET old_vals = JSON_OBJECT();
  430. SET new_vals = JSON_OBJECT();
  431. IF OLD.asset_tag <=> NEW.asset_tag IS FALSE THEN
  432. SET changed_fields_array = JSON_ARRAY_APPEND(changed_fields_array, '$', 'asset_tag');
  433. SET old_vals = JSON_SET(old_vals, '$.asset_tag', OLD.asset_tag);
  434. SET new_vals = JSON_SET(new_vals, '$.asset_tag', NEW.asset_tag);
  435. END IF;
  436. IF OLD.asset_numeric_id <=> NEW.asset_numeric_id IS FALSE THEN
  437. SET changed_fields_array = JSON_ARRAY_APPEND(changed_fields_array, '$', 'asset_numeric_id');
  438. SET old_vals = JSON_SET(old_vals, '$.asset_numeric_id', OLD.asset_numeric_id);
  439. SET new_vals = JSON_SET(new_vals, '$.asset_numeric_id', NEW.asset_numeric_id);
  440. END IF;
  441. IF OLD.asset_type <=> NEW.asset_type IS FALSE THEN
  442. SET changed_fields_array = JSON_ARRAY_APPEND(changed_fields_array, '$', 'asset_type');
  443. SET old_vals = JSON_SET(old_vals, '$.asset_type', OLD.asset_type);
  444. SET new_vals = JSON_SET(new_vals, '$.asset_type', NEW.asset_type);
  445. END IF;
  446. IF OLD.name <=> NEW.name IS FALSE THEN
  447. SET changed_fields_array = JSON_ARRAY_APPEND(changed_fields_array, '$', 'name');
  448. SET old_vals = JSON_SET(old_vals, '$.name', OLD.name);
  449. SET new_vals = JSON_SET(new_vals, '$.name', NEW.name);
  450. END IF;
  451. IF OLD.category_id <=> NEW.category_id IS FALSE THEN
  452. SET changed_fields_array = JSON_ARRAY_APPEND(changed_fields_array, '$', 'category_id');
  453. SET old_vals = JSON_SET(old_vals, '$.category_id', OLD.category_id);
  454. SET new_vals = JSON_SET(new_vals, '$.category_id', NEW.category_id);
  455. END IF;
  456. IF OLD.manufacturer <=> NEW.manufacturer IS FALSE THEN
  457. SET changed_fields_array = JSON_ARRAY_APPEND(changed_fields_array, '$', 'manufacturer');
  458. SET old_vals = JSON_SET(old_vals, '$.manufacturer', OLD.manufacturer);
  459. SET new_vals = JSON_SET(new_vals, '$.manufacturer', NEW.manufacturer);
  460. END IF;
  461. IF OLD.model <=> NEW.model IS FALSE THEN
  462. SET changed_fields_array = JSON_ARRAY_APPEND(changed_fields_array, '$', 'model');
  463. SET old_vals = JSON_SET(old_vals, '$.model', OLD.model);
  464. SET new_vals = JSON_SET(new_vals, '$.model', NEW.model);
  465. END IF;
  466. IF OLD.serial_number <=> NEW.serial_number IS FALSE THEN
  467. SET changed_fields_array = JSON_ARRAY_APPEND(changed_fields_array, '$', 'serial_number');
  468. SET old_vals = JSON_SET(old_vals, '$.serial_number', OLD.serial_number);
  469. SET new_vals = JSON_SET(new_vals, '$.serial_number', NEW.serial_number);
  470. END IF;
  471. IF OLD.zone_id <=> NEW.zone_id IS FALSE THEN
  472. SET changed_fields_array = JSON_ARRAY_APPEND(changed_fields_array, '$', 'zone_id');
  473. SET old_vals = JSON_SET(old_vals, '$.zone_id', OLD.zone_id);
  474. SET new_vals = JSON_SET(new_vals, '$.zone_id', NEW.zone_id);
  475. END IF;
  476. IF OLD.zone_plus <=> NEW.zone_plus IS FALSE THEN
  477. SET changed_fields_array = JSON_ARRAY_APPEND(changed_fields_array, '$', 'zone_plus');
  478. SET old_vals = JSON_SET(old_vals, '$.zone_plus', OLD.zone_plus);
  479. SET new_vals = JSON_SET(new_vals, '$.zone_plus', NEW.zone_plus);
  480. END IF;
  481. IF OLD.zone_note <=> NEW.zone_note IS FALSE THEN
  482. SET changed_fields_array = JSON_ARRAY_APPEND(changed_fields_array, '$', 'zone_note');
  483. SET old_vals = JSON_SET(old_vals, '$.zone_note', OLD.zone_note);
  484. SET new_vals = JSON_SET(new_vals, '$.zone_note', NEW.zone_note);
  485. END IF;
  486. IF OLD.status <=> NEW.status IS FALSE THEN
  487. SET changed_fields_array = JSON_ARRAY_APPEND(changed_fields_array, '$', 'status');
  488. SET old_vals = JSON_SET(old_vals, '$.status', OLD.status);
  489. SET new_vals = JSON_SET(new_vals, '$.status', NEW.status);
  490. END IF;
  491. IF OLD.last_audit <=> NEW.last_audit IS FALSE THEN
  492. SET changed_fields_array = JSON_ARRAY_APPEND(changed_fields_array, '$', 'last_audit');
  493. SET old_vals = JSON_SET(old_vals, '$.last_audit', OLD.last_audit);
  494. SET new_vals = JSON_SET(new_vals, '$.last_audit', NEW.last_audit);
  495. END IF;
  496. IF OLD.last_audit_status <=> NEW.last_audit_status IS FALSE THEN
  497. SET changed_fields_array = JSON_ARRAY_APPEND(changed_fields_array, '$', 'last_audit_status');
  498. SET old_vals = JSON_SET(old_vals, '$.last_audit_status', OLD.last_audit_status);
  499. SET new_vals = JSON_SET(new_vals, '$.last_audit_status', NEW.last_audit_status);
  500. END IF;
  501. IF OLD.price <=> NEW.price IS FALSE THEN
  502. SET changed_fields_array = JSON_ARRAY_APPEND(changed_fields_array, '$', 'price');
  503. SET old_vals = JSON_SET(old_vals, '$.price', OLD.price);
  504. SET new_vals = JSON_SET(new_vals, '$.price', NEW.price);
  505. END IF;
  506. IF OLD.purchase_date <=> NEW.purchase_date IS FALSE THEN
  507. SET changed_fields_array = JSON_ARRAY_APPEND(changed_fields_array, '$', 'purchase_date');
  508. SET old_vals = JSON_SET(old_vals, '$.purchase_date', OLD.purchase_date);
  509. SET new_vals = JSON_SET(new_vals, '$.purchase_date', NEW.purchase_date);
  510. END IF;
  511. IF OLD.warranty_until <=> NEW.warranty_until IS FALSE THEN
  512. SET changed_fields_array = JSON_ARRAY_APPEND(changed_fields_array, '$', 'warranty_until');
  513. SET old_vals = JSON_SET(old_vals, '$.warranty_until', OLD.warranty_until);
  514. SET new_vals = JSON_SET(new_vals, '$.warranty_until', NEW.warranty_until);
  515. END IF;
  516. IF OLD.expiry_date <=> NEW.expiry_date IS FALSE THEN
  517. SET changed_fields_array = JSON_ARRAY_APPEND(changed_fields_array, '$', 'expiry_date');
  518. SET old_vals = JSON_SET(old_vals, '$.expiry_date', OLD.expiry_date);
  519. SET new_vals = JSON_SET(new_vals, '$.expiry_date', NEW.expiry_date);
  520. END IF;
  521. IF OLD.quantity_available <=> NEW.quantity_available IS FALSE THEN
  522. SET changed_fields_array = JSON_ARRAY_APPEND(changed_fields_array, '$', 'quantity_available');
  523. SET old_vals = JSON_SET(old_vals, '$.quantity_available', OLD.quantity_available);
  524. SET new_vals = JSON_SET(new_vals, '$.quantity_available', NEW.quantity_available);
  525. END IF;
  526. IF OLD.quantity_total <=> NEW.quantity_total IS FALSE THEN
  527. SET changed_fields_array = JSON_ARRAY_APPEND(changed_fields_array, '$', 'quantity_total');
  528. SET old_vals = JSON_SET(old_vals, '$.quantity_total', OLD.quantity_total);
  529. SET new_vals = JSON_SET(new_vals, '$.quantity_total', NEW.quantity_total);
  530. END IF;
  531. IF OLD.quantity_used <=> NEW.quantity_used IS FALSE THEN
  532. SET changed_fields_array = JSON_ARRAY_APPEND(changed_fields_array, '$', 'quantity_used');
  533. SET old_vals = JSON_SET(old_vals, '$.quantity_used', OLD.quantity_used);
  534. SET new_vals = JSON_SET(new_vals, '$.quantity_used', NEW.quantity_used);
  535. END IF;
  536. IF OLD.supplier_id <=> NEW.supplier_id IS FALSE THEN
  537. SET changed_fields_array = JSON_ARRAY_APPEND(changed_fields_array, '$', 'supplier_id');
  538. SET old_vals = JSON_SET(old_vals, '$.supplier_id', OLD.supplier_id);
  539. SET new_vals = JSON_SET(new_vals, '$.supplier_id', NEW.supplier_id);
  540. END IF;
  541. IF OLD.lendable <=> NEW.lendable IS FALSE THEN
  542. SET changed_fields_array = JSON_ARRAY_APPEND(changed_fields_array, '$', 'lendable');
  543. SET old_vals = JSON_SET(old_vals, '$.lendable', OLD.lendable);
  544. SET new_vals = JSON_SET(new_vals, '$.lendable', NEW.lendable);
  545. END IF;
  546. IF OLD.minimum_role_for_lending <=> NEW.minimum_role_for_lending IS FALSE THEN
  547. SET changed_fields_array = JSON_ARRAY_APPEND(changed_fields_array, '$', 'minimum_role_for_lending');
  548. SET old_vals = JSON_SET(old_vals, '$.minimum_role_for_lending', OLD.minimum_role_for_lending);
  549. SET new_vals = JSON_SET(new_vals, '$.minimum_role_for_lending', NEW.minimum_role_for_lending);
  550. END IF;
  551. IF OLD.lending_status <=> NEW.lending_status IS FALSE THEN
  552. SET changed_fields_array = JSON_ARRAY_APPEND(changed_fields_array, '$', 'lending_status');
  553. SET old_vals = JSON_SET(old_vals, '$.lending_status', OLD.lending_status);
  554. SET new_vals = JSON_SET(new_vals, '$.lending_status', NEW.lending_status);
  555. END IF;
  556. IF OLD.current_borrower_id <=> NEW.current_borrower_id IS FALSE THEN
  557. SET changed_fields_array = JSON_ARRAY_APPEND(changed_fields_array, '$', 'current_borrower_id');
  558. SET old_vals = JSON_SET(old_vals, '$.current_borrower_id', OLD.current_borrower_id);
  559. SET new_vals = JSON_SET(new_vals, '$.current_borrower_id', NEW.current_borrower_id);
  560. END IF;
  561. IF OLD.due_date <=> NEW.due_date IS FALSE THEN
  562. SET changed_fields_array = JSON_ARRAY_APPEND(changed_fields_array, '$', 'due_date');
  563. SET old_vals = JSON_SET(old_vals, '$.due_date', OLD.due_date);
  564. SET new_vals = JSON_SET(new_vals, '$.due_date', NEW.due_date);
  565. END IF;
  566. IF OLD.previous_borrower_id <=> NEW.previous_borrower_id IS FALSE THEN
  567. SET changed_fields_array = JSON_ARRAY_APPEND(changed_fields_array, '$', 'previous_borrower_id');
  568. SET old_vals = JSON_SET(old_vals, '$.previous_borrower_id', OLD.previous_borrower_id);
  569. SET new_vals = JSON_SET(new_vals, '$.previous_borrower_id', NEW.previous_borrower_id);
  570. END IF;
  571. IF OLD.audit_task_id <=> NEW.audit_task_id IS FALSE THEN
  572. SET changed_fields_array = JSON_ARRAY_APPEND(changed_fields_array, '$', 'audit_task_id');
  573. SET old_vals = JSON_SET(old_vals, '$.audit_task_id', OLD.audit_task_id);
  574. SET new_vals = JSON_SET(new_vals, '$.audit_task_id', NEW.audit_task_id);
  575. END IF;
  576. IF OLD.no_scan <=> NEW.no_scan IS FALSE THEN
  577. SET changed_fields_array = JSON_ARRAY_APPEND(changed_fields_array, '$', 'no_scan');
  578. SET old_vals = JSON_SET(old_vals, '$.no_scan', OLD.no_scan);
  579. SET new_vals = JSON_SET(new_vals, '$.no_scan', NEW.no_scan);
  580. END IF;
  581. IF OLD.notes <=> NEW.notes IS FALSE THEN
  582. SET changed_fields_array = JSON_ARRAY_APPEND(changed_fields_array, '$', 'notes');
  583. SET old_vals = JSON_SET(old_vals, '$.notes', OLD.notes);
  584. SET new_vals = JSON_SET(new_vals, '$.notes', NEW.notes);
  585. END IF;
  586. IF OLD.additional_fields <=> NEW.additional_fields IS FALSE THEN
  587. SET changed_fields_array = JSON_ARRAY_APPEND(changed_fields_array, '$', 'additional_fields');
  588. SET old_vals = JSON_SET(old_vals, '$.additional_fields', OLD.additional_fields);
  589. SET new_vals = JSON_SET(new_vals, '$.additional_fields', NEW.additional_fields);
  590. END IF;
  591. IF JSON_LENGTH(changed_fields_array) > 0 THEN
  592. INSERT INTO asset_change_log (
  593. table_name, action, record_id, changed_fields, old_values, new_values,
  594. changed_by_id, changed_by_username
  595. )
  596. VALUES (
  597. 'assets',
  598. 'UPDATE',
  599. NEW.id,
  600. changed_fields_array,
  601. old_vals,
  602. new_vals,
  603. @current_user_id,
  604. username
  605. );
  606. END IF;
  607. END */;;
  608. DELIMITER ;
  609. /*!50003 SET sql_mode = @saved_sql_mode */ ;
  610. /*!50003 SET character_set_client = @saved_cs_client */ ;
  611. /*!50003 SET character_set_results = @saved_cs_results */ ;
  612. /*!50003 SET collation_connection = @saved_col_connection */ ;
  613. /*!50003 SET @saved_cs_client = @@character_set_client */ ;
  614. /*!50003 SET @saved_cs_results = @@character_set_results */ ;
  615. /*!50003 SET @saved_col_connection = @@collation_connection */ ;
  616. /*!50003 SET character_set_client = utf8mb4 */ ;
  617. /*!50003 SET character_set_results = utf8mb4 */ ;
  618. /*!50003 SET collation_connection = utf8mb4_0900_ai_ci */ ;
  619. /*!50003 SET @saved_sql_mode = @@sql_mode */ ;
  620. /*!50003 SET sql_mode = 'STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' */ ;
  621. DELIMITER ;;
  622. /*!50003 CREATE*/ /*!50017 DEFINER=`root`@`%`*/ /*!50003 TRIGGER auto_detect_asset_issues
  623. AFTER UPDATE ON assets
  624. FOR EACH ROW
  625. BEGIN
  626. DECLARE issue_title VARCHAR(255);
  627. DECLARE issue_description TEXT;
  628. DECLARE issue_severity ENUM('Critical', 'High', 'Medium', 'Low');
  629. DECLARE detection_trigger_name VARCHAR(100);
  630. IF (OLD.lending_status IS NULL OR OLD.lending_status != NEW.lending_status)
  631. AND NEW.lending_status IN ('Overdue', 'Illegally Handed Out', 'Stolen') THEN
  632. CASE NEW.lending_status
  633. WHEN 'Overdue' THEN
  634. SET issue_title = CONCAT('Asset Overdue: ', COALESCE(NEW.name, NEW.asset_tag, CAST(NEW.asset_numeric_id AS CHAR)));
  635. SET issue_description = CONCAT('Asset lending status changed to Overdue. Asset: ', NEW.asset_tag,
  636. CASE WHEN NEW.name IS NOT NULL THEN CONCAT(' (', NEW.name, ')') ELSE '' END);
  637. SET issue_severity = 'High';
  638. SET detection_trigger_name = 'LENDING_OVERDUE';
  639. WHEN 'Illegally Handed Out' THEN
  640. SET issue_title = CONCAT('Asset Illegally Handed Out: ', COALESCE(NEW.name, NEW.asset_tag, CAST(NEW.asset_numeric_id AS CHAR)));
  641. SET issue_description = CONCAT('Asset lending status changed to Illegally Handed Out. Asset: ', NEW.asset_tag,
  642. CASE WHEN NEW.name IS NOT NULL THEN CONCAT(' (', NEW.name, ')') ELSE '' END);
  643. SET issue_severity = 'Critical';
  644. SET detection_trigger_name = 'LENDING_ILLEGAL';
  645. WHEN 'Stolen' THEN
  646. SET issue_title = CONCAT('Asset Stolen: ', COALESCE(NEW.name, NEW.asset_tag, CAST(NEW.asset_numeric_id AS CHAR)));
  647. SET issue_description = CONCAT('Asset lending status changed to Stolen (14+ days overdue). Asset: ', NEW.asset_tag,
  648. CASE WHEN NEW.name IS NOT NULL THEN CONCAT(' (', NEW.name, ')') ELSE '' END);
  649. SET issue_severity = 'Critical';
  650. SET detection_trigger_name = 'LENDING_STOLEN';
  651. END CASE;
  652. INSERT INTO issue_tracker (
  653. issue_type, asset_id, title, description, severity, priority, status,
  654. reported_by, auto_detected, detection_trigger, created_date
  655. )
  656. VALUES (
  657. 'Asset Issue', NEW.id, issue_title, issue_description, issue_severity, 'Urgent', 'Open',
  658. COALESCE(@current_user_id, 1), TRUE, detection_trigger_name, NOW()
  659. );
  660. END IF;
  661. IF OLD.status != NEW.status AND NEW.status IN ('Attention', 'Faulty', 'Missing', 'Retired', 'In Repair', 'Expired') THEN
  662. CASE NEW.status
  663. WHEN 'Attention' THEN
  664. SET issue_title = CONCAT('Asset Needs Attention: ', COALESCE(NEW.name, NEW.asset_tag, NEW.asset_numeric_id));
  665. SET issue_description = CONCAT('Asset status changed to Attention. Asset: ', NEW.asset_numeric_id, CASE WHEN NEW.name IS NOT NULL THEN CONCAT(' (', NEW.name, ')') ELSE '' END);
  666. SET issue_severity = 'Medium';
  667. SET detection_trigger_name = 'STATUS_ATTENTION';
  668. WHEN 'Faulty' THEN
  669. SET issue_title = CONCAT('Asset Faulty: ', COALESCE(NEW.name, NEW.asset_tag, NEW.asset_numeric_id));
  670. SET issue_description = CONCAT('Asset status changed to Faulty. Asset: ', NEW.asset_numeric_id, CASE WHEN NEW.name IS NOT NULL THEN CONCAT(' (', NEW.name, ')') ELSE '' END);
  671. SET issue_severity = 'High';
  672. SET detection_trigger_name = 'STATUS_FAULTY';
  673. WHEN 'Missing' THEN
  674. SET issue_title = CONCAT('Asset Missing: ', COALESCE(NEW.name, NEW.asset_tag, NEW.asset_numeric_id));
  675. SET issue_description = CONCAT('Asset status changed to Missing. Asset: ', NEW.asset_numeric_id, CASE WHEN NEW.name IS NOT NULL THEN CONCAT(' (', NEW.name, ')') ELSE '' END);
  676. SET issue_severity = 'Critical';
  677. SET detection_trigger_name = 'STATUS_MISSING';
  678. WHEN 'Retired' THEN
  679. SET issue_title = CONCAT('Asset Retired: ', COALESCE(NEW.name, NEW.asset_tag, NEW.asset_numeric_id));
  680. SET issue_description = CONCAT('Asset status changed to Retired. Asset: ', NEW.asset_numeric_id, CASE WHEN NEW.name IS NOT NULL THEN CONCAT(' (', NEW.name, ')') ELSE '' END);
  681. SET issue_severity = 'Low';
  682. SET detection_trigger_name = 'STATUS_RETIRED';
  683. WHEN 'In Repair' THEN
  684. SET issue_title = CONCAT('Asset In Repair: ', COALESCE(NEW.name, NEW.asset_tag, NEW.asset_numeric_id));
  685. SET issue_description = CONCAT('Asset status changed to In Repair. Asset: ', NEW.asset_numeric_id, CASE WHEN NEW.name IS NOT NULL THEN CONCAT(' (', NEW.name, ')') ELSE '' END);
  686. SET issue_severity = 'Medium';
  687. SET detection_trigger_name = 'STATUS_IN_REPAIR';
  688. WHEN 'Expired' THEN
  689. SET issue_title = CONCAT('Asset Expired: ', COALESCE(NEW.name, NEW.asset_tag, NEW.asset_numeric_id));
  690. SET issue_description = CONCAT('Asset status changed to Expired. Asset: ', NEW.asset_numeric_id, CASE WHEN NEW.name IS NOT NULL THEN CONCAT(' (', NEW.name, ')') ELSE '' END);
  691. SET issue_severity = 'Medium';
  692. SET detection_trigger_name = 'STATUS_EXPIRED';
  693. END CASE;
  694. INSERT INTO issue_tracker (
  695. issue_type, asset_id, title, description, severity, priority, status,
  696. reported_by, auto_detected, detection_trigger, created_date
  697. )
  698. VALUES (
  699. 'Asset Issue', NEW.id, issue_title, issue_description, issue_severity, 'Normal', 'Open',
  700. COALESCE(@current_user_id, 1), TRUE, detection_trigger_name, NOW()
  701. );
  702. END IF;
  703. IF OLD.status != NEW.status AND NEW.status = 'Good' AND OLD.status IN ('Faulty', 'Missing', 'In Repair', 'Expired') THEN
  704. UPDATE issue_tracker
  705. SET status = 'Resolved',
  706. solution = 'Automatically Fixed',
  707. solution_plus = CONCAT('Asset status automatically changed from ', OLD.status, ' to Good'),
  708. resolved_date = NOW(),
  709. resolved_by = COALESCE(@current_user_id, 1)
  710. WHERE asset_id = NEW.id
  711. AND status IN ('Open', 'In Progress')
  712. AND auto_detected = TRUE
  713. AND detection_trigger IN ('STATUS_FAULTY', 'STATUS_MISSING', 'STATUS_IN_REPAIR', 'STATUS_EXPIRED');
  714. END IF;
  715. IF (OLD.lending_status IS NULL OR OLD.lending_status != NEW.lending_status)
  716. AND NEW.lending_status = 'Available'
  717. AND OLD.lending_status IN ('Overdue', 'Illegally Handed Out', 'Stolen') THEN
  718. UPDATE issue_tracker
  719. SET status = 'Resolved',
  720. solution = 'Items Returned',
  721. solution_plus = CONCAT('Asset was returned - lending status changed from ', OLD.lending_status, ' to Available'),
  722. resolved_date = NOW(),
  723. resolved_by = COALESCE(@current_user_id, 1)
  724. WHERE asset_id = NEW.id
  725. AND status IN ('Open', 'In Progress')
  726. AND auto_detected = TRUE
  727. AND detection_trigger IN ('LENDING_OVERDUE', 'LENDING_ILLEGAL', 'LENDING_STOLEN');
  728. END IF;
  729. END */;;
  730. DELIMITER ;
  731. /*!50003 SET sql_mode = @saved_sql_mode */ ;
  732. /*!50003 SET character_set_client = @saved_cs_client */ ;
  733. /*!50003 SET character_set_results = @saved_cs_results */ ;
  734. /*!50003 SET collation_connection = @saved_col_connection */ ;
  735. /*!50003 SET @saved_cs_client = @@character_set_client */ ;
  736. /*!50003 SET @saved_cs_results = @@character_set_results */ ;
  737. /*!50003 SET @saved_col_connection = @@collation_connection */ ;
  738. /*!50003 SET character_set_client = utf8mb4 */ ;
  739. /*!50003 SET character_set_results = utf8mb4 */ ;
  740. /*!50003 SET collation_connection = utf8mb4_0900_ai_ci */ ;
  741. /*!50003 SET @saved_sql_mode = @@sql_mode */ ;
  742. /*!50003 SET sql_mode = 'STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' */ ;
  743. DELIMITER ;;
  744. /*!50003 CREATE*/ /*!50017 DEFINER=`root`@`%`*/ /*!50003 TRIGGER prevent_delete_borrowed_assets
  745. BEFORE DELETE ON assets
  746. FOR EACH ROW
  747. BEGIN
  748. IF OLD.lending_status IN ('Borrowed', 'Deployed', 'Overdue') THEN
  749. SIGNAL SQLSTATE '45000'
  750. SET MESSAGE_TEXT = 'Cannot delete asset that is currently borrowed or deployed, maybe update to retired or unmanaged before';
  751. END IF;
  752. END */;;
  753. DELIMITER ;
  754. /*!50003 SET sql_mode = @saved_sql_mode */ ;
  755. /*!50003 SET character_set_client = @saved_cs_client */ ;
  756. /*!50003 SET character_set_results = @saved_cs_results */ ;
  757. /*!50003 SET collation_connection = @saved_col_connection */ ;
  758. /*!50003 SET @saved_cs_client = @@character_set_client */ ;
  759. /*!50003 SET @saved_cs_results = @@character_set_results */ ;
  760. /*!50003 SET @saved_col_connection = @@collation_connection */ ;
  761. /*!50003 SET character_set_client = utf8mb4 */ ;
  762. /*!50003 SET character_set_results = utf8mb4 */ ;
  763. /*!50003 SET collation_connection = utf8mb4_0900_ai_ci */ ;
  764. /*!50003 SET @saved_sql_mode = @@sql_mode */ ;
  765. /*!50003 SET sql_mode = 'STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' */ ;
  766. DELIMITER ;;
  767. /*!50003 CREATE*/ /*!50017 DEFINER=`root`@`%`*/ /*!50003 TRIGGER assets_after_delete_log
  768. AFTER DELETE ON assets
  769. FOR EACH ROW
  770. BEGIN
  771. DECLARE username VARCHAR(100);
  772. DECLARE deleted_fields_array JSON;
  773. DECLARE old_vals JSON;
  774. IF @current_user_id IS NOT NULL THEN
  775. SELECT users.username INTO username FROM users WHERE id = @current_user_id;
  776. END IF;
  777. SET deleted_fields_array = JSON_ARRAY();
  778. SET old_vals = JSON_OBJECT();
  779. IF OLD.asset_tag IS NOT NULL THEN
  780. SET deleted_fields_array = JSON_ARRAY_APPEND(deleted_fields_array, '$', 'asset_tag');
  781. SET old_vals = JSON_SET(old_vals, '$.asset_tag', OLD.asset_tag);
  782. END IF;
  783. IF OLD.asset_numeric_id IS NOT NULL THEN
  784. SET deleted_fields_array = JSON_ARRAY_APPEND(deleted_fields_array, '$', 'asset_numeric_id');
  785. SET old_vals = JSON_SET(old_vals, '$.asset_numeric_id', OLD.asset_numeric_id);
  786. END IF;
  787. IF OLD.asset_type IS NOT NULL THEN
  788. SET deleted_fields_array = JSON_ARRAY_APPEND(deleted_fields_array, '$', 'asset_type');
  789. SET old_vals = JSON_SET(old_vals, '$.asset_type', OLD.asset_type);
  790. END IF;
  791. IF OLD.name IS NOT NULL THEN
  792. SET deleted_fields_array = JSON_ARRAY_APPEND(deleted_fields_array, '$', 'name');
  793. SET old_vals = JSON_SET(old_vals, '$.name', OLD.name);
  794. END IF;
  795. IF OLD.category_id IS NOT NULL THEN
  796. SET deleted_fields_array = JSON_ARRAY_APPEND(deleted_fields_array, '$', 'category_id');
  797. SET old_vals = JSON_SET(old_vals, '$.category_id', OLD.category_id);
  798. END IF;
  799. IF OLD.manufacturer IS NOT NULL THEN
  800. SET deleted_fields_array = JSON_ARRAY_APPEND(deleted_fields_array, '$', 'manufacturer');
  801. SET old_vals = JSON_SET(old_vals, '$.manufacturer', OLD.manufacturer);
  802. END IF;
  803. IF OLD.model IS NOT NULL THEN
  804. SET deleted_fields_array = JSON_ARRAY_APPEND(deleted_fields_array, '$', 'model');
  805. SET old_vals = JSON_SET(old_vals, '$.model', OLD.model);
  806. END IF;
  807. IF OLD.serial_number IS NOT NULL THEN
  808. SET deleted_fields_array = JSON_ARRAY_APPEND(deleted_fields_array, '$', 'serial_number');
  809. SET old_vals = JSON_SET(old_vals, '$.serial_number', OLD.serial_number);
  810. END IF;
  811. IF OLD.zone_id IS NOT NULL THEN
  812. SET deleted_fields_array = JSON_ARRAY_APPEND(deleted_fields_array, '$', 'zone_id');
  813. SET old_vals = JSON_SET(old_vals, '$.zone_id', OLD.zone_id);
  814. END IF;
  815. IF OLD.zone_plus IS NOT NULL THEN
  816. SET deleted_fields_array = JSON_ARRAY_APPEND(deleted_fields_array, '$', 'zone_plus');
  817. SET old_vals = JSON_SET(old_vals, '$.zone_plus', OLD.zone_plus);
  818. END IF;
  819. IF OLD.zone_note IS NOT NULL THEN
  820. SET deleted_fields_array = JSON_ARRAY_APPEND(deleted_fields_array, '$', 'zone_note');
  821. SET old_vals = JSON_SET(old_vals, '$.zone_note', OLD.zone_note);
  822. END IF;
  823. IF OLD.status IS NOT NULL THEN
  824. SET deleted_fields_array = JSON_ARRAY_APPEND(deleted_fields_array, '$', 'status');
  825. SET old_vals = JSON_SET(old_vals, '$.status', OLD.status);
  826. END IF;
  827. IF OLD.last_audit IS NOT NULL THEN
  828. SET deleted_fields_array = JSON_ARRAY_APPEND(deleted_fields_array, '$', 'last_audit');
  829. SET old_vals = JSON_SET(old_vals, '$.last_audit', OLD.last_audit);
  830. END IF;
  831. IF OLD.last_audit_status IS NOT NULL THEN
  832. SET deleted_fields_array = JSON_ARRAY_APPEND(deleted_fields_array, '$', 'last_audit_status');
  833. SET old_vals = JSON_SET(old_vals, '$.last_audit_status', OLD.last_audit_status);
  834. END IF;
  835. IF OLD.price IS NOT NULL THEN
  836. SET deleted_fields_array = JSON_ARRAY_APPEND(deleted_fields_array, '$', 'price');
  837. SET old_vals = JSON_SET(old_vals, '$.price', OLD.price);
  838. END IF;
  839. IF OLD.purchase_date IS NOT NULL THEN
  840. SET deleted_fields_array = JSON_ARRAY_APPEND(deleted_fields_array, '$', 'purchase_date');
  841. SET old_vals = JSON_SET(old_vals, '$.purchase_date', OLD.purchase_date);
  842. END IF;
  843. IF OLD.warranty_until IS NOT NULL THEN
  844. SET deleted_fields_array = JSON_ARRAY_APPEND(deleted_fields_array, '$', 'warranty_until');
  845. SET old_vals = JSON_SET(old_vals, '$.warranty_until', OLD.warranty_until);
  846. END IF;
  847. IF OLD.expiry_date IS NOT NULL THEN
  848. SET deleted_fields_array = JSON_ARRAY_APPEND(deleted_fields_array, '$', 'expiry_date');
  849. SET old_vals = JSON_SET(old_vals, '$.expiry_date', OLD.expiry_date);
  850. END IF;
  851. IF OLD.quantity_available IS NOT NULL THEN
  852. SET deleted_fields_array = JSON_ARRAY_APPEND(deleted_fields_array, '$', 'quantity_available');
  853. SET old_vals = JSON_SET(old_vals, '$.quantity_available', OLD.quantity_available);
  854. END IF;
  855. IF OLD.quantity_total IS NOT NULL THEN
  856. SET deleted_fields_array = JSON_ARRAY_APPEND(deleted_fields_array, '$', 'quantity_total');
  857. SET old_vals = JSON_SET(old_vals, '$.quantity_total', OLD.quantity_total);
  858. END IF;
  859. IF OLD.quantity_used IS NOT NULL THEN
  860. SET deleted_fields_array = JSON_ARRAY_APPEND(deleted_fields_array, '$', 'quantity_used');
  861. SET old_vals = JSON_SET(old_vals, '$.quantity_used', OLD.quantity_used);
  862. END IF;
  863. IF OLD.supplier_id IS NOT NULL THEN
  864. SET deleted_fields_array = JSON_ARRAY_APPEND(deleted_fields_array, '$', 'supplier_id');
  865. SET old_vals = JSON_SET(old_vals, '$.supplier_id', OLD.supplier_id);
  866. END IF;
  867. IF OLD.lendable IS NOT NULL THEN
  868. SET deleted_fields_array = JSON_ARRAY_APPEND(deleted_fields_array, '$', 'lendable');
  869. SET old_vals = JSON_SET(old_vals, '$.lendable', OLD.lendable);
  870. END IF;
  871. IF OLD.minimum_role_for_lending IS NOT NULL THEN
  872. SET deleted_fields_array = JSON_ARRAY_APPEND(deleted_fields_array, '$', 'minimum_role_for_lending');
  873. SET old_vals = JSON_SET(old_vals, '$.minimum_role_for_lending', OLD.minimum_role_for_lending);
  874. END IF;
  875. IF OLD.lending_status IS NOT NULL THEN
  876. SET deleted_fields_array = JSON_ARRAY_APPEND(deleted_fields_array, '$', 'lending_status');
  877. SET old_vals = JSON_SET(old_vals, '$.lending_status', OLD.lending_status);
  878. END IF;
  879. IF OLD.current_borrower_id IS NOT NULL THEN
  880. SET deleted_fields_array = JSON_ARRAY_APPEND(deleted_fields_array, '$', 'current_borrower_id');
  881. SET old_vals = JSON_SET(old_vals, '$.current_borrower_id', OLD.current_borrower_id);
  882. END IF;
  883. IF OLD.due_date IS NOT NULL THEN
  884. SET deleted_fields_array = JSON_ARRAY_APPEND(deleted_fields_array, '$', 'due_date');
  885. SET old_vals = JSON_SET(old_vals, '$.due_date', OLD.due_date);
  886. END IF;
  887. IF OLD.previous_borrower_id IS NOT NULL THEN
  888. SET deleted_fields_array = JSON_ARRAY_APPEND(deleted_fields_array, '$', 'previous_borrower_id');
  889. SET old_vals = JSON_SET(old_vals, '$.previous_borrower_id', OLD.previous_borrower_id);
  890. END IF;
  891. IF OLD.audit_task_id IS NOT NULL THEN
  892. SET deleted_fields_array = JSON_ARRAY_APPEND(deleted_fields_array, '$', 'audit_task_id');
  893. SET old_vals = JSON_SET(old_vals, '$.audit_task_id', OLD.audit_task_id);
  894. END IF;
  895. IF OLD.no_scan IS NOT NULL THEN
  896. SET deleted_fields_array = JSON_ARRAY_APPEND(deleted_fields_array, '$', 'no_scan');
  897. SET old_vals = JSON_SET(old_vals, '$.no_scan', OLD.no_scan);
  898. END IF;
  899. IF OLD.notes IS NOT NULL THEN
  900. SET deleted_fields_array = JSON_ARRAY_APPEND(deleted_fields_array, '$', 'notes');
  901. SET old_vals = JSON_SET(old_vals, '$.notes', OLD.notes);
  902. END IF;
  903. IF OLD.additional_fields IS NOT NULL THEN
  904. SET deleted_fields_array = JSON_ARRAY_APPEND(deleted_fields_array, '$', 'additional_fields');
  905. SET old_vals = JSON_SET(old_vals, '$.additional_fields', OLD.additional_fields);
  906. END IF;
  907. IF OLD.created_date IS NOT NULL THEN
  908. SET deleted_fields_array = JSON_ARRAY_APPEND(deleted_fields_array, '$', 'created_date');
  909. SET old_vals = JSON_SET(old_vals, '$.created_date', OLD.created_date);
  910. END IF;
  911. IF OLD.created_by IS NOT NULL THEN
  912. SET deleted_fields_array = JSON_ARRAY_APPEND(deleted_fields_array, '$', 'created_by');
  913. SET old_vals = JSON_SET(old_vals, '$.created_by', OLD.created_by);
  914. END IF;
  915. IF OLD.last_modified_date IS NOT NULL THEN
  916. SET deleted_fields_array = JSON_ARRAY_APPEND(deleted_fields_array, '$', 'last_modified_date');
  917. SET old_vals = JSON_SET(old_vals, '$.last_modified_date', OLD.last_modified_date);
  918. END IF;
  919. IF OLD.last_modified_by IS NOT NULL THEN
  920. SET deleted_fields_array = JSON_ARRAY_APPEND(deleted_fields_array, '$', 'last_modified_by');
  921. SET old_vals = JSON_SET(old_vals, '$.last_modified_by', OLD.last_modified_by);
  922. END IF;
  923. INSERT INTO asset_change_log (
  924. table_name, action, record_id, changed_fields, old_values,
  925. changed_by_id, changed_by_username
  926. )
  927. VALUES (
  928. 'assets',
  929. 'DELETE',
  930. OLD.id,
  931. deleted_fields_array,
  932. old_vals,
  933. @current_user_id,
  934. username
  935. );
  936. END */;;
  937. DELIMITER ;
  938. /*!50003 SET sql_mode = @saved_sql_mode */ ;
  939. /*!50003 SET character_set_client = @saved_cs_client */ ;
  940. /*!50003 SET character_set_results = @saved_cs_results */ ;
  941. /*!50003 SET collation_connection = @saved_col_connection */ ;
  942. DROP TABLE IF EXISTS `audit_tasks`;
  943. /*!40101 SET @saved_cs_client = @@character_set_client */;
  944. /*!50503 SET character_set_client = utf8mb4 */;
  945. CREATE TABLE `audit_tasks` (
  946. `id` int(11) NOT NULL AUTO_INCREMENT,
  947. `task_name` varchar(200) NOT NULL,
  948. `json_sequence` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL CHECK (json_valid(`json_sequence`)),
  949. `created_at` timestamp NULL DEFAULT current_timestamp(),
  950. `updated_at` timestamp NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
  951. PRIMARY KEY (`id`)
  952. ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci;
  953. /*!40101 SET character_set_client = @saved_cs_client */;
  954. LOCK TABLES `audit_tasks` WRITE;
  955. /*!40000 ALTER TABLE `audit_tasks` DISABLE KEYS */;
  956. INSERT INTO `audit_tasks` VALUES (1,'Basic Device Check','[{\"actions\":{\"no\":{\"end_audit\":true,\"set_status\":\"Faulty\"},\"yes\":{\"next_step\":2}},\"question\":\"Does the device power on?\",\"step\":1,\"type\":\"yes_no\"},{\"actions\":{\"Damaged\":{\"next_step\":3},\"Good\":{\"end_audit\":true,\"set_status\":\"Good\"}},\"options\":[\"Good\",\"Damaged\"],\"question\":\"Physical condition?\",\"step\":2,\"type\":\"multiple_choice\"},{\"actions\":{\"any\":{\"end_audit\":true,\"set_additional_fields\":{\"damage_notes\":\"{user_input}\"},\"set_status\":\"Attention\"}},\"question\":\"Describe the damage\",\"step\":3,\"type\":\"text_input\"}]','2025-10-20 11:43:38','2025-11-15 01:20:50');
  957. /*!40000 ALTER TABLE `audit_tasks` ENABLE KEYS */;
  958. UNLOCK TABLES;
  959. DROP TABLE IF EXISTS `borrowers`;
  960. /*!40101 SET @saved_cs_client = @@character_set_client */;
  961. /*!50503 SET character_set_client = utf8mb4 */;
  962. CREATE TABLE `borrowers` (
  963. `id` int(11) NOT NULL AUTO_INCREMENT,
  964. `name` varchar(200) NOT NULL,
  965. `email` varchar(255) DEFAULT NULL,
  966. `phone_number` varchar(50) DEFAULT NULL,
  967. `class_name` varchar(100) DEFAULT NULL,
  968. `role` varchar(100) DEFAULT NULL,
  969. `notes` text DEFAULT NULL,
  970. `added_by` int(11) NOT NULL,
  971. `added_date` timestamp NULL DEFAULT current_timestamp(),
  972. `banned` tinyint(1) DEFAULT 0,
  973. `unban_fine` decimal(10,2) DEFAULT 0.00,
  974. `last_unban_by` int(11) DEFAULT NULL,
  975. `last_unban_date` date DEFAULT NULL,
  976. PRIMARY KEY (`id`),
  977. KEY `added_by` (`added_by`),
  978. KEY `last_unban_by` (`last_unban_by`),
  979. KEY `idx_name` (`name`),
  980. KEY `idx_banned` (`banned`),
  981. CONSTRAINT `borrowers_ibfk_1` FOREIGN KEY (`added_by`) REFERENCES `users` (`id`),
  982. CONSTRAINT `borrowers_ibfk_2` FOREIGN KEY (`last_unban_by`) REFERENCES `users` (`id`) ON DELETE SET NULL
  983. ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci;
  984. /*!40101 SET character_set_client = @saved_cs_client */;
  985. LOCK TABLES `borrowers` WRITE;
  986. /*!40000 ALTER TABLE `borrowers` DISABLE KEYS */;
  987. INSERT INTO `borrowers` VALUES (1,'Alice Johnson','alice@school.edu','+1-555-1001','CS-301','Student','NEVER LEND TO AGAIN DOESNT RETURN SHIT !!!',1,'2025-10-20 11:43:45',1,69.00,1,'2025-11-13'),(2,'Bob Smith','bob@school.edu','+1-555-1002','EE-201','Student',NULL,1,'2025-10-20 11:43:45',1,25.00,NULL,NULL),(3,'Carol Teacher','carol@school.edu','+1-555-1003',NULL,'Faculty',NULL,1,'2025-10-20 11:43:45',0,0.00,NULL,NULL),(4,'Forgetful Fred','fred@test.local','+1-555-9999',NULL,'Student',NULL,1,'2025-10-20 11:44:24',0,0.00,NULL,NULL),(5,'Missgeburt Fredie',NULL,NULL,'Hurensohn','Student','Bruh',1,'2025-10-24 06:52:20',0,0.00,1,'2025-12-03');
  988. /*!40000 ALTER TABLE `borrowers` ENABLE KEYS */;
  989. UNLOCK TABLES;
  990. /*!50003 SET @saved_cs_client = @@character_set_client */ ;
  991. /*!50003 SET @saved_cs_results = @@character_set_results */ ;
  992. /*!50003 SET @saved_col_connection = @@collation_connection */ ;
  993. /*!50003 SET character_set_client = utf8mb4 */ ;
  994. /*!50003 SET character_set_results = utf8mb4 */ ;
  995. /*!50003 SET collation_connection = utf8mb4_0900_ai_ci */ ;
  996. /*!50003 SET @saved_sql_mode = @@sql_mode */ ;
  997. /*!50003 SET sql_mode = 'STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' */ ;
  998. DELIMITER ;;
  999. /*!50003 CREATE*/ /*!50017 DEFINER=`root`@`%`*/ /*!50003 TRIGGER borrowers_before_insert_meta
  1000. BEFORE INSERT ON borrowers
  1001. FOR EACH ROW
  1002. BEGIN
  1003. IF NEW.added_by IS NULL AND @current_user_id IS NOT NULL THEN
  1004. SET NEW.added_by = @current_user_id;
  1005. END IF;
  1006. END */;;
  1007. DELIMITER ;
  1008. /*!50003 SET sql_mode = @saved_sql_mode */ ;
  1009. /*!50003 SET character_set_client = @saved_cs_client */ ;
  1010. /*!50003 SET character_set_results = @saved_cs_results */ ;
  1011. /*!50003 SET collation_connection = @saved_col_connection */ ;
  1012. /*!50003 SET @saved_cs_client = @@character_set_client */ ;
  1013. /*!50003 SET @saved_cs_results = @@character_set_results */ ;
  1014. /*!50003 SET @saved_col_connection = @@collation_connection */ ;
  1015. /*!50003 SET character_set_client = utf8mb4 */ ;
  1016. /*!50003 SET character_set_results = utf8mb4 */ ;
  1017. /*!50003 SET collation_connection = utf8mb4_0900_ai_ci */ ;
  1018. /*!50003 SET @saved_sql_mode = @@sql_mode */ ;
  1019. /*!50003 SET sql_mode = 'STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' */ ;
  1020. DELIMITER ;;
  1021. /*!50003 CREATE*/ /*!50017 DEFINER=`root`@`%`*/ /*!50003 TRIGGER borrowers_before_update_meta
  1022. BEFORE UPDATE ON borrowers
  1023. FOR EACH ROW
  1024. BEGIN
  1025. IF OLD.banned = TRUE AND NEW.banned = FALSE THEN
  1026. IF NEW.last_unban_by IS NULL AND @current_user_id IS NOT NULL THEN
  1027. SET NEW.last_unban_by = @current_user_id;
  1028. END IF;
  1029. IF NEW.last_unban_date IS NULL THEN
  1030. SET NEW.last_unban_date = CURDATE();
  1031. END IF;
  1032. END IF;
  1033. END */;;
  1034. DELIMITER ;
  1035. /*!50003 SET sql_mode = @saved_sql_mode */ ;
  1036. /*!50003 SET character_set_client = @saved_cs_client */ ;
  1037. /*!50003 SET character_set_results = @saved_cs_results */ ;
  1038. /*!50003 SET collation_connection = @saved_col_connection */ ;
  1039. /*!50003 SET @saved_cs_client = @@character_set_client */ ;
  1040. /*!50003 SET @saved_cs_results = @@character_set_results */ ;
  1041. /*!50003 SET @saved_col_connection = @@collation_connection */ ;
  1042. /*!50003 SET character_set_client = utf8mb4 */ ;
  1043. /*!50003 SET character_set_results = utf8mb4 */ ;
  1044. /*!50003 SET collation_connection = utf8mb4_0900_ai_ci */ ;
  1045. /*!50003 SET @saved_sql_mode = @@sql_mode */ ;
  1046. /*!50003 SET sql_mode = 'STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' */ ;
  1047. DELIMITER ;;
  1048. /*!50003 CREATE*/ /*!50017 DEFINER=`root`@`%`*/ /*!50003 TRIGGER auto_detect_borrower_issues
  1049. AFTER UPDATE ON borrowers
  1050. FOR EACH ROW
  1051. BEGIN
  1052. DECLARE issue_title VARCHAR(255);
  1053. DECLARE issue_description TEXT;
  1054. IF OLD.banned = FALSE AND NEW.banned = TRUE THEN
  1055. SET issue_title = CONCAT('Borrower Banned: ', NEW.name);
  1056. SET issue_description = CONCAT('Borrower has been banned. Name: ', NEW.name, CASE WHEN NEW.unban_fine > 0 THEN CONCAT(', Unban Fine: $', NEW.unban_fine) ELSE '' END);
  1057. INSERT INTO issue_tracker (
  1058. issue_type, borrower_id, title, description, severity, priority, status,
  1059. reported_by, auto_detected, detection_trigger, created_date
  1060. )
  1061. VALUES (
  1062. 'Borrower Issue', NEW.id, issue_title, issue_description, 'High', 'Normal', 'Open',
  1063. COALESCE(@current_user_id, 1), TRUE, 'BORROWER_BANNED', NOW()
  1064. );
  1065. END IF;
  1066. IF OLD.banned = TRUE AND NEW.banned = FALSE THEN
  1067. UPDATE issue_tracker
  1068. SET status = 'Resolved',
  1069. solution = 'Items Returned',
  1070. solution_plus = CONCAT('Borrower unbanned on ', COALESCE(NEW.last_unban_date, CURDATE()), CASE WHEN NEW.last_unban_by IS NOT NULL THEN CONCAT(' by user ID ', NEW.last_unban_by) ELSE '' END),
  1071. resolved_date = NOW(),
  1072. resolved_by = COALESCE(@current_user_id, NEW.last_unban_by, 1)
  1073. WHERE borrower_id = NEW.id
  1074. AND status IN ('Open', 'In Progress')
  1075. AND auto_detected = TRUE
  1076. AND detection_trigger = 'BORROWER_BANNED';
  1077. END IF;
  1078. END */;;
  1079. DELIMITER ;
  1080. /*!50003 SET sql_mode = @saved_sql_mode */ ;
  1081. /*!50003 SET character_set_client = @saved_cs_client */ ;
  1082. /*!50003 SET character_set_results = @saved_cs_results */ ;
  1083. /*!50003 SET collation_connection = @saved_col_connection */ ;
  1084. DROP TABLE IF EXISTS `categories`;
  1085. /*!40101 SET @saved_cs_client = @@character_set_client */;
  1086. /*!50503 SET character_set_client = utf8mb4 */;
  1087. CREATE TABLE `categories` (
  1088. `id` int(11) NOT NULL AUTO_INCREMENT,
  1089. `category_name` varchar(200) NOT NULL,
  1090. `category_description` text DEFAULT NULL,
  1091. `parent_id` int(11) DEFAULT NULL,
  1092. `category_code` varchar(50) DEFAULT NULL,
  1093. PRIMARY KEY (`id`),
  1094. KEY `idx_parent` (`parent_id`),
  1095. KEY `idx_code` (`category_code`),
  1096. CONSTRAINT `categories_ibfk_1` FOREIGN KEY (`parent_id`) REFERENCES `categories` (`id`)
  1097. ) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci;
  1098. /*!40101 SET character_set_client = @saved_cs_client */;
  1099. LOCK TABLES `categories` WRITE;
  1100. /*!40000 ALTER TABLE `categories` DISABLE KEYS */;
  1101. INSERT INTO `categories` VALUES (7,'Smartboard',NULL,NULL,'sb'),(8,'Adapters',NULL,NULL,'ada'),(9,'Cables',NULL,NULL,'cbl'),(10,'Monitors',NULL,NULL,'mon');
  1102. /*!40000 ALTER TABLE `categories` ENABLE KEYS */;
  1103. UNLOCK TABLES;
  1104. DROP TABLE IF EXISTS `issue_tracker`;
  1105. /*!40101 SET @saved_cs_client = @@character_set_client */;
  1106. /*!50503 SET character_set_client = utf8mb4 */;
  1107. CREATE TABLE `issue_tracker` (
  1108. `id` int(11) NOT NULL AUTO_INCREMENT,
  1109. `issue_type` enum('Asset Issue','Borrower Issue','System Issue','Maintenance','Other') NOT NULL,
  1110. `asset_id` int(11) DEFAULT NULL,
  1111. `borrower_id` int(11) DEFAULT NULL,
  1112. `title` varchar(255) NOT NULL,
  1113. `description` text NOT NULL,
  1114. `severity` enum('Critical','High','Medium','Low') DEFAULT NULL,
  1115. `priority` enum('Urgent','High','Normal','Low') DEFAULT 'Normal',
  1116. `status` enum('Open','In Progress','Resolved','Closed','On Hold') DEFAULT 'Open',
  1117. `solution` enum('Fixed','Replaced','Clarify','No Action Needed','Deferred','Items Returned','Automatically Fixed') DEFAULT NULL,
  1118. `solution_plus` text DEFAULT NULL,
  1119. `replacement_asset_id` int(11) DEFAULT NULL,
  1120. `reported_by` int(11) NOT NULL,
  1121. `assigned_to` int(11) DEFAULT NULL,
  1122. `resolved_by` int(11) DEFAULT NULL,
  1123. `cost` decimal(10,2) DEFAULT NULL,
  1124. `created_date` datetime NOT NULL DEFAULT current_timestamp(),
  1125. `updated_date` datetime DEFAULT current_timestamp() ON UPDATE current_timestamp(),
  1126. `resolved_date` datetime DEFAULT NULL,
  1127. `notes` text DEFAULT NULL,
  1128. `auto_detected` tinyint(1) DEFAULT 0,
  1129. `detection_trigger` varchar(100) DEFAULT NULL,
  1130. PRIMARY KEY (`id`),
  1131. KEY `replacement_asset_id` (`replacement_asset_id`),
  1132. KEY `reported_by` (`reported_by`),
  1133. KEY `assigned_to` (`assigned_to`),
  1134. KEY `resolved_by` (`resolved_by`),
  1135. KEY `idx_issue_type` (`issue_type`),
  1136. KEY `idx_asset` (`asset_id`),
  1137. KEY `idx_borrower` (`borrower_id`),
  1138. KEY `idx_severity` (`severity`),
  1139. KEY `idx_status` (`status`),
  1140. KEY `idx_created_date` (`created_date`),
  1141. KEY `idx_auto_detected` (`auto_detected`),
  1142. CONSTRAINT `issue_tracker_ibfk_1` FOREIGN KEY (`asset_id`) REFERENCES `assets` (`id`) ON DELETE CASCADE,
  1143. CONSTRAINT `issue_tracker_ibfk_2` FOREIGN KEY (`borrower_id`) REFERENCES `borrowers` (`id`) ON DELETE CASCADE,
  1144. CONSTRAINT `issue_tracker_ibfk_3` FOREIGN KEY (`replacement_asset_id`) REFERENCES `assets` (`id`) ON DELETE SET NULL,
  1145. CONSTRAINT `issue_tracker_ibfk_4` FOREIGN KEY (`reported_by`) REFERENCES `users` (`id`),
  1146. CONSTRAINT `issue_tracker_ibfk_5` FOREIGN KEY (`assigned_to`) REFERENCES `users` (`id`) ON DELETE SET NULL,
  1147. CONSTRAINT `issue_tracker_ibfk_6` FOREIGN KEY (`resolved_by`) REFERENCES `users` (`id`) ON DELETE SET NULL
  1148. ) ENGINE=InnoDB AUTO_INCREMENT=57 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci;
  1149. /*!40101 SET character_set_client = @saved_cs_client */;
  1150. LOCK TABLES `issue_tracker` WRITE;
  1151. /*!40000 ALTER TABLE `issue_tracker` DISABLE KEYS */;
  1152. INSERT INTO `issue_tracker` VALUES (4,'Borrower Issue',NULL,2,'Borrower Banned: Bob Smith','Borrower has been banned. Name: Bob Smith, Unban Fine: $25.00','High','Normal','Open',NULL,NULL,NULL,2,NULL,NULL,NULL,'2025-10-20 11:43:55','2025-10-20 11:43:55',NULL,NULL,1,'BORROWER_BANNED'),(5,'System Issue',NULL,NULL,'Audit: Missing Assets in Unknown Zone','Full zone audit completed with 3 missing assets. Expected: 5, Found: 2. Audit ID: 1','High','High','Open',NULL,NULL,NULL,2,NULL,NULL,NULL,'2025-10-20 11:44:01','2025-10-20 11:44:01',NULL,'Physical Audit ID: 1 in zone: 5',1,'AUDIT_MISSING_ASSETS'),(43,'Borrower Issue',NULL,1,'Borrower Banned: Alice Johnson','Borrower has been banned. Name: Alice Johnson, Unban Fine: $1000.00','High','Normal','Resolved','Items Returned','Borrower unbanned on 2025-11-13 by user ID 1',NULL,1,NULL,1,NULL,'2025-11-11 09:19:22','2025-11-13 16:01:00','2025-11-13 16:01:00',NULL,1,'BORROWER_BANNED'),(44,'Borrower Issue',NULL,5,'Borrower Banned: Missgeburt Fredie','Borrower has been banned. Name: Missgeburt Fredie, Unban Fine: $4293847.00','High','Normal','Resolved','Items Returned','Borrower unbanned on 2025-12-03 by user ID 1',NULL,1,NULL,1,NULL,'2025-11-12 10:32:36','2025-12-03 15:41:20','2025-12-03 15:41:20',NULL,1,'BORROWER_BANNED'),(47,'Borrower Issue',NULL,1,'Borrower Banned: Alice Johnson','Borrower has been banned. Name: Alice Johnson, Unban Fine: $69.00','High','Normal','Open',NULL,NULL,NULL,1,NULL,NULL,NULL,'2025-11-13 16:09:28','2025-11-13 16:09:28',NULL,NULL,1,'BORROWER_BANNED'),(48,'Asset Issue',26,NULL,'Asset Missing: Floating HDMI Cables','Asset status changed to Missing. Asset: 18368995 (Floating HDMI Cables)','Critical','Normal','Resolved','Automatically Fixed','Asset status automatically changed from Missing to Good',NULL,1,NULL,1,NULL,'2025-11-14 23:10:15','2025-11-14 23:21:14','2025-11-14 23:21:14',NULL,1,'STATUS_MISSING'),(49,'Asset Issue',38,NULL,'Asset Faulty: Dell Monitor','Asset status changed to Faulty. Asset: 51229246 (Dell Monitor)','High','Normal','Open',NULL,NULL,NULL,1,NULL,NULL,NULL,'2025-12-03 15:55:10','2025-12-03 15:55:10',NULL,NULL,1,'STATUS_FAULTY'),(50,'Asset Issue',39,NULL,'Asset Missing: Dell Monitor','Asset status changed to Missing. Asset: 97355732 (Dell Monitor)','Critical','Normal','Resolved','Automatically Fixed','Asset status automatically changed from Missing to Good',NULL,1,NULL,1,NULL,'2025-12-03 15:55:10','2025-12-08 11:00:50','2025-12-08 11:00:50',NULL,1,'STATUS_MISSING'),(51,'Asset Issue',38,NULL,'Asset Missing: Dell Monitor','Asset status changed to Missing. Asset: 51229246 (Dell Monitor)','Critical','Normal','Open',NULL,NULL,NULL,1,NULL,NULL,NULL,'2025-12-08 11:00:50','2025-12-08 11:00:50',NULL,NULL,1,'STATUS_MISSING'),(52,'Asset Issue',38,NULL,'Asset Needs Attention: Dell Monitor','Asset status changed to Attention. Asset: 51229246 (Dell Monitor)','Medium','Normal','Open',NULL,NULL,NULL,1,NULL,NULL,NULL,'2025-12-08 11:08:13','2025-12-08 11:08:13',NULL,NULL,1,'STATUS_ATTENTION'),(53,'Asset Issue',39,NULL,'Asset Missing: Dell Monitor','Asset status changed to Missing. Asset: 97355732 (Dell Monitor)','Critical','Normal','Resolved','Automatically Fixed','Asset status automatically changed from Missing to Good',NULL,1,NULL,1,NULL,'2025-12-08 11:08:13','2025-12-22 00:47:32','2025-12-22 00:47:32',NULL,1,'STATUS_MISSING'),(54,'Asset Issue',26,NULL,'Asset Missing: Floating HDMI Cables','Asset status changed to Missing. Asset: 18368995 (Floating HDMI Cables)','Critical','Normal','Resolved','Automatically Fixed','Asset status automatically changed from Missing to Good',NULL,1,NULL,1,NULL,'2025-12-08 11:08:13','2025-12-10 16:40:16','2025-12-10 16:40:16',NULL,1,'STATUS_MISSING'),(55,'Asset Issue',26,NULL,'Asset Overdue: Floating HDMI Cables','Asset lending status changed to Overdue. Asset: cbl-hdmi-002 (Floating HDMI Cables)','High','Urgent','Resolved','Items Returned','Asset was returned - lending status changed from Overdue to Available',NULL,1,NULL,1,NULL,'2025-12-21 22:43:22','2025-12-22 00:47:55','2025-12-22 00:47:55',NULL,1,'LENDING_OVERDUE'),(56,'Asset Issue',40,NULL,'Asset Faulty: Dell Monitor','Asset status changed to Faulty. Asset: 41112353 (Dell Monitor)','High','Normal','Open',NULL,NULL,NULL,1,NULL,NULL,NULL,'2025-12-22 02:22:04','2025-12-22 02:22:04',NULL,NULL,1,'STATUS_FAULTY');
  1153. /*!40000 ALTER TABLE `issue_tracker` ENABLE KEYS */;
  1154. UNLOCK TABLES;
  1155. /*!50003 SET @saved_cs_client = @@character_set_client */ ;
  1156. /*!50003 SET @saved_cs_results = @@character_set_results */ ;
  1157. /*!50003 SET @saved_col_connection = @@collation_connection */ ;
  1158. /*!50003 SET character_set_client = utf8mb4 */ ;
  1159. /*!50003 SET character_set_results = utf8mb4 */ ;
  1160. /*!50003 SET collation_connection = utf8mb4_0900_ai_ci */ ;
  1161. /*!50003 SET @saved_sql_mode = @@sql_mode */ ;
  1162. /*!50003 SET sql_mode = 'STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' */ ;
  1163. DELIMITER ;;
  1164. /*!50003 CREATE*/ /*!50017 DEFINER=`root`@`%`*/ /*!50003 TRIGGER issue_tracker_before_insert_meta
  1165. BEFORE INSERT ON issue_tracker
  1166. FOR EACH ROW
  1167. BEGIN
  1168. IF NEW.reported_by IS NULL AND @current_user_id IS NOT NULL THEN
  1169. SET NEW.reported_by = @current_user_id;
  1170. END IF;
  1171. END */;;
  1172. DELIMITER ;
  1173. /*!50003 SET sql_mode = @saved_sql_mode */ ;
  1174. /*!50003 SET character_set_client = @saved_cs_client */ ;
  1175. /*!50003 SET character_set_results = @saved_cs_results */ ;
  1176. /*!50003 SET collation_connection = @saved_col_connection */ ;
  1177. /*!50003 SET @saved_cs_client = @@character_set_client */ ;
  1178. /*!50003 SET @saved_cs_results = @@character_set_results */ ;
  1179. /*!50003 SET @saved_col_connection = @@collation_connection */ ;
  1180. /*!50003 SET character_set_client = utf8mb4 */ ;
  1181. /*!50003 SET character_set_results = utf8mb4 */ ;
  1182. /*!50003 SET collation_connection = utf8mb4_0900_ai_ci */ ;
  1183. /*!50003 SET @saved_sql_mode = @@sql_mode */ ;
  1184. /*!50003 SET sql_mode = 'STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' */ ;
  1185. DELIMITER ;;
  1186. /*!50003 CREATE*/ /*!50017 DEFINER=`root`@`%`*/ /*!50003 TRIGGER validate_issue_tracker_insert
  1187. BEFORE INSERT ON issue_tracker
  1188. FOR EACH ROW
  1189. BEGIN
  1190. IF NEW.solution = 'Clarify' AND (NEW.solution_plus IS NULL OR NEW.solution_plus = '') THEN
  1191. SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'solution_plus is required when solution is set to Clarify';
  1192. END IF;
  1193. IF NEW.solution = 'Replaced' AND NEW.replacement_asset_id IS NULL THEN
  1194. SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'replacement_asset_id is required when solution is set to Replaced';
  1195. END IF;
  1196. IF NEW.issue_type = 'Asset Issue' AND NEW.asset_id IS NULL THEN
  1197. SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'asset_id is required for Asset Issue type';
  1198. END IF;
  1199. IF NEW.issue_type = 'Borrower Issue' AND NEW.borrower_id IS NULL THEN
  1200. SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'borrower_id is required for Borrower Issue type';
  1201. END IF;
  1202. IF NEW.status IN ('Resolved', 'Closed') AND NEW.resolved_date IS NULL THEN
  1203. SET NEW.resolved_date = NOW();
  1204. END IF;
  1205. IF NEW.status IN ('Resolved', 'Closed') AND NEW.resolved_by IS NULL AND @current_user_id IS NOT NULL THEN
  1206. SET NEW.resolved_by = @current_user_id;
  1207. END IF;
  1208. END */;;
  1209. DELIMITER ;
  1210. /*!50003 SET sql_mode = @saved_sql_mode */ ;
  1211. /*!50003 SET character_set_client = @saved_cs_client */ ;
  1212. /*!50003 SET character_set_results = @saved_cs_results */ ;
  1213. /*!50003 SET collation_connection = @saved_col_connection */ ;
  1214. /*!50003 SET @saved_cs_client = @@character_set_client */ ;
  1215. /*!50003 SET @saved_cs_results = @@character_set_results */ ;
  1216. /*!50003 SET @saved_col_connection = @@collation_connection */ ;
  1217. /*!50003 SET character_set_client = utf8mb4 */ ;
  1218. /*!50003 SET character_set_results = utf8mb4 */ ;
  1219. /*!50003 SET collation_connection = utf8mb4_0900_ai_ci */ ;
  1220. /*!50003 SET @saved_sql_mode = @@sql_mode */ ;
  1221. /*!50003 SET sql_mode = 'STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' */ ;
  1222. DELIMITER ;;
  1223. /*!50003 CREATE*/ /*!50017 DEFINER=`root`@`%`*/ /*!50003 TRIGGER issue_tracker_after_insert_log
  1224. AFTER INSERT ON issue_tracker
  1225. FOR EACH ROW
  1226. BEGIN
  1227. DECLARE set_fields JSON DEFAULT JSON_ARRAY();
  1228. DECLARE new_vals JSON DEFAULT JSON_OBJECT();
  1229. IF NEW.issue_type IS NOT NULL THEN
  1230. SET set_fields = JSON_ARRAY_APPEND(set_fields, '$', 'issue_type');
  1231. SET new_vals = JSON_SET(new_vals, '$.issue_type', NEW.issue_type);
  1232. END IF;
  1233. IF NEW.asset_id IS NOT NULL THEN
  1234. SET set_fields = JSON_ARRAY_APPEND(set_fields, '$', 'asset_id');
  1235. SET new_vals = JSON_SET(new_vals, '$.asset_id', NEW.asset_id);
  1236. END IF;
  1237. IF NEW.borrower_id IS NOT NULL THEN
  1238. SET set_fields = JSON_ARRAY_APPEND(set_fields, '$', 'borrower_id');
  1239. SET new_vals = JSON_SET(new_vals, '$.borrower_id', NEW.borrower_id);
  1240. END IF;
  1241. IF NEW.title IS NOT NULL THEN
  1242. SET set_fields = JSON_ARRAY_APPEND(set_fields, '$', 'title');
  1243. SET new_vals = JSON_SET(new_vals, '$.title', NEW.title);
  1244. END IF;
  1245. IF NEW.severity IS NOT NULL THEN
  1246. SET set_fields = JSON_ARRAY_APPEND(set_fields, '$', 'severity');
  1247. SET new_vals = JSON_SET(new_vals, '$.severity', NEW.severity);
  1248. END IF;
  1249. IF NEW.status IS NOT NULL THEN
  1250. SET set_fields = JSON_ARRAY_APPEND(set_fields, '$', 'status');
  1251. SET new_vals = JSON_SET(new_vals, '$.status', NEW.status);
  1252. END IF;
  1253. INSERT INTO issue_tracker_change_log (issue_id, change_type, changed_fields, new_values, changed_by)
  1254. VALUES (NEW.id, 'INSERT', set_fields, new_vals, COALESCE(@current_user_id, NEW.reported_by));
  1255. END */;;
  1256. DELIMITER ;
  1257. /*!50003 SET sql_mode = @saved_sql_mode */ ;
  1258. /*!50003 SET character_set_client = @saved_cs_client */ ;
  1259. /*!50003 SET character_set_results = @saved_cs_results */ ;
  1260. /*!50003 SET collation_connection = @saved_col_connection */ ;
  1261. /*!50003 SET @saved_cs_client = @@character_set_client */ ;
  1262. /*!50003 SET @saved_cs_results = @@character_set_results */ ;
  1263. /*!50003 SET @saved_col_connection = @@collation_connection */ ;
  1264. /*!50003 SET character_set_client = utf8mb4 */ ;
  1265. /*!50003 SET character_set_results = utf8mb4 */ ;
  1266. /*!50003 SET collation_connection = utf8mb4_0900_ai_ci */ ;
  1267. /*!50003 SET @saved_sql_mode = @@sql_mode */ ;
  1268. /*!50003 SET sql_mode = 'STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' */ ;
  1269. DELIMITER ;;
  1270. /*!50003 CREATE*/ /*!50017 DEFINER=`root`@`%`*/ /*!50003 TRIGGER validate_issue_tracker_update
  1271. BEFORE UPDATE ON issue_tracker
  1272. FOR EACH ROW
  1273. BEGIN
  1274. IF NEW.solution = 'Clarify' AND (NEW.solution_plus IS NULL OR NEW.solution_plus = '') THEN
  1275. SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'solution_plus is required when solution is set to Clarify';
  1276. END IF;
  1277. IF NEW.solution = 'Replaced' AND NEW.replacement_asset_id IS NULL THEN
  1278. SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'replacement_asset_id is required when solution is set to Replaced';
  1279. END IF;
  1280. IF OLD.status NOT IN ('Resolved', 'Closed') AND NEW.status IN ('Resolved', 'Closed') THEN
  1281. SET NEW.resolved_date = NOW();
  1282. IF @current_user_id IS NOT NULL THEN
  1283. SET NEW.resolved_by = @current_user_id;
  1284. END IF;
  1285. END IF;
  1286. IF OLD.status IN ('Resolved', 'Closed') AND NEW.status NOT IN ('Resolved', 'Closed') THEN
  1287. SET NEW.resolved_date = NULL;
  1288. SET NEW.resolved_by = NULL;
  1289. END IF;
  1290. END */;;
  1291. DELIMITER ;
  1292. /*!50003 SET sql_mode = @saved_sql_mode */ ;
  1293. /*!50003 SET character_set_client = @saved_cs_client */ ;
  1294. /*!50003 SET character_set_results = @saved_cs_results */ ;
  1295. /*!50003 SET collation_connection = @saved_col_connection */ ;
  1296. /*!50003 SET @saved_cs_client = @@character_set_client */ ;
  1297. /*!50003 SET @saved_cs_results = @@character_set_results */ ;
  1298. /*!50003 SET @saved_col_connection = @@collation_connection */ ;
  1299. /*!50003 SET character_set_client = utf8mb4 */ ;
  1300. /*!50003 SET character_set_results = utf8mb4 */ ;
  1301. /*!50003 SET collation_connection = utf8mb4_0900_ai_ci */ ;
  1302. /*!50003 SET @saved_sql_mode = @@sql_mode */ ;
  1303. /*!50003 SET sql_mode = 'STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' */ ;
  1304. DELIMITER ;;
  1305. /*!50003 CREATE*/ /*!50017 DEFINER=`root`@`%`*/ /*!50003 TRIGGER issue_tracker_after_update_log
  1306. AFTER UPDATE ON issue_tracker
  1307. FOR EACH ROW
  1308. BEGIN
  1309. DECLARE changed_fields JSON DEFAULT JSON_ARRAY();
  1310. DECLARE old_vals JSON DEFAULT JSON_OBJECT();
  1311. DECLARE new_vals JSON DEFAULT JSON_OBJECT();
  1312. IF OLD.status <=> NEW.status IS FALSE THEN
  1313. SET changed_fields = JSON_ARRAY_APPEND(changed_fields, '$', 'status');
  1314. SET old_vals = JSON_SET(old_vals, '$.status', OLD.status);
  1315. SET new_vals = JSON_SET(new_vals, '$.status', NEW.status);
  1316. END IF;
  1317. IF OLD.severity <=> NEW.severity IS FALSE THEN
  1318. SET changed_fields = JSON_ARRAY_APPEND(changed_fields, '$', 'severity');
  1319. SET old_vals = JSON_SET(old_vals, '$.severity', OLD.severity);
  1320. SET new_vals = JSON_SET(new_vals, '$.severity', NEW.severity);
  1321. END IF;
  1322. IF OLD.priority <=> NEW.priority IS FALSE THEN
  1323. SET changed_fields = JSON_ARRAY_APPEND(changed_fields, '$', 'priority');
  1324. SET old_vals = JSON_SET(old_vals, '$.priority', OLD.priority);
  1325. SET new_vals = JSON_SET(new_vals, '$.priority', NEW.priority);
  1326. END IF;
  1327. IF OLD.solution <=> NEW.solution IS FALSE THEN
  1328. SET changed_fields = JSON_ARRAY_APPEND(changed_fields, '$', 'solution');
  1329. SET old_vals = JSON_SET(old_vals, '$.solution', OLD.solution);
  1330. SET new_vals = JSON_SET(new_vals, '$.solution', NEW.solution);
  1331. END IF;
  1332. IF OLD.assigned_to <=> NEW.assigned_to IS FALSE THEN
  1333. SET changed_fields = JSON_ARRAY_APPEND(changed_fields, '$', 'assigned_to');
  1334. SET old_vals = JSON_SET(old_vals, '$.assigned_to', OLD.assigned_to);
  1335. SET new_vals = JSON_SET(new_vals, '$.assigned_to', NEW.assigned_to);
  1336. END IF;
  1337. IF OLD.resolved_by <=> NEW.resolved_by IS FALSE THEN
  1338. SET changed_fields = JSON_ARRAY_APPEND(changed_fields, '$', 'resolved_by');
  1339. SET old_vals = JSON_SET(old_vals, '$.resolved_by', OLD.resolved_by);
  1340. SET new_vals = JSON_SET(new_vals, '$.resolved_by', NEW.resolved_by);
  1341. END IF;
  1342. IF JSON_LENGTH(changed_fields) > 0 THEN
  1343. INSERT INTO issue_tracker_change_log (issue_id, change_type, changed_fields, old_values, new_values, changed_by)
  1344. VALUES (NEW.id, 'UPDATE', changed_fields, old_vals, new_vals, COALESCE(@current_user_id, OLD.reported_by));
  1345. END IF;
  1346. END */;;
  1347. DELIMITER ;
  1348. /*!50003 SET sql_mode = @saved_sql_mode */ ;
  1349. /*!50003 SET character_set_client = @saved_cs_client */ ;
  1350. /*!50003 SET character_set_results = @saved_cs_results */ ;
  1351. /*!50003 SET collation_connection = @saved_col_connection */ ;
  1352. /*!50003 SET @saved_cs_client = @@character_set_client */ ;
  1353. /*!50003 SET @saved_cs_results = @@character_set_results */ ;
  1354. /*!50003 SET @saved_col_connection = @@collation_connection */ ;
  1355. /*!50003 SET character_set_client = utf8mb4 */ ;
  1356. /*!50003 SET character_set_results = utf8mb4 */ ;
  1357. /*!50003 SET collation_connection = utf8mb4_0900_ai_ci */ ;
  1358. /*!50003 SET @saved_sql_mode = @@sql_mode */ ;
  1359. /*!50003 SET sql_mode = 'STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' */ ;
  1360. DELIMITER ;;
  1361. /*!50003 CREATE*/ /*!50017 DEFINER=`root`@`%`*/ /*!50003 TRIGGER issue_tracker_before_delete
  1362. BEFORE DELETE ON issue_tracker
  1363. FOR EACH ROW
  1364. BEGIN
  1365. IF OLD.status NOT IN ('Resolved', 'Closed') THEN
  1366. SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Cannot delete open issues. Please close or resolve the issue first.';
  1367. END IF;
  1368. END */;;
  1369. DELIMITER ;
  1370. /*!50003 SET sql_mode = @saved_sql_mode */ ;
  1371. /*!50003 SET character_set_client = @saved_cs_client */ ;
  1372. /*!50003 SET character_set_results = @saved_cs_results */ ;
  1373. /*!50003 SET collation_connection = @saved_col_connection */ ;
  1374. /*!50003 SET @saved_cs_client = @@character_set_client */ ;
  1375. /*!50003 SET @saved_cs_results = @@character_set_results */ ;
  1376. /*!50003 SET @saved_col_connection = @@collation_connection */ ;
  1377. /*!50003 SET character_set_client = utf8mb4 */ ;
  1378. /*!50003 SET character_set_results = utf8mb4 */ ;
  1379. /*!50003 SET collation_connection = utf8mb4_0900_ai_ci */ ;
  1380. /*!50003 SET @saved_sql_mode = @@sql_mode */ ;
  1381. /*!50003 SET sql_mode = 'STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' */ ;
  1382. DELIMITER ;;
  1383. /*!50003 CREATE*/ /*!50017 DEFINER=`root`@`%`*/ /*!50003 TRIGGER issue_tracker_after_delete_log
  1384. AFTER DELETE ON issue_tracker
  1385. FOR EACH ROW
  1386. BEGIN
  1387. DECLARE deleted_fields JSON DEFAULT JSON_ARRAY();
  1388. DECLARE old_vals JSON DEFAULT JSON_OBJECT();
  1389. IF OLD.issue_type IS NOT NULL THEN
  1390. SET deleted_fields = JSON_ARRAY_APPEND(deleted_fields, '$', 'issue_type');
  1391. SET old_vals = JSON_SET(old_vals, '$.issue_type', OLD.issue_type);
  1392. END IF;
  1393. IF OLD.asset_id IS NOT NULL THEN
  1394. SET deleted_fields = JSON_ARRAY_APPEND(deleted_fields, '$', 'asset_id');
  1395. SET old_vals = JSON_SET(old_vals, '$.asset_id', OLD.asset_id);
  1396. END IF;
  1397. IF OLD.title IS NOT NULL THEN
  1398. SET deleted_fields = JSON_ARRAY_APPEND(deleted_fields, '$', 'title');
  1399. SET old_vals = JSON_SET(old_vals, '$.title', OLD.title);
  1400. END IF;
  1401. IF OLD.status IS NOT NULL THEN
  1402. SET deleted_fields = JSON_ARRAY_APPEND(deleted_fields, '$', 'status');
  1403. SET old_vals = JSON_SET(old_vals, '$.status', OLD.status);
  1404. END IF;
  1405. IF OLD.solution IS NOT NULL THEN
  1406. SET deleted_fields = JSON_ARRAY_APPEND(deleted_fields, '$', 'solution');
  1407. SET old_vals = JSON_SET(old_vals, '$.solution', OLD.solution);
  1408. END IF;
  1409. INSERT INTO issue_tracker_change_log (issue_id, change_type, changed_fields, old_values, changed_by)
  1410. VALUES (OLD.id, 'DELETE', deleted_fields, old_vals, COALESCE(@current_user_id, OLD.reported_by));
  1411. END */;;
  1412. DELIMITER ;
  1413. /*!50003 SET sql_mode = @saved_sql_mode */ ;
  1414. /*!50003 SET character_set_client = @saved_cs_client */ ;
  1415. /*!50003 SET character_set_results = @saved_cs_results */ ;
  1416. /*!50003 SET collation_connection = @saved_col_connection */ ;
  1417. DROP TABLE IF EXISTS `issue_tracker_change_log`;
  1418. /*!40101 SET @saved_cs_client = @@character_set_client */;
  1419. /*!50503 SET character_set_client = utf8mb4 */;
  1420. CREATE TABLE `issue_tracker_change_log` (
  1421. `id` int(11) NOT NULL AUTO_INCREMENT,
  1422. `issue_id` int(11) NOT NULL,
  1423. `change_type` enum('INSERT','UPDATE','DELETE') NOT NULL,
  1424. `changed_fields` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL CHECK (json_valid(`changed_fields`)),
  1425. `old_values` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL CHECK (json_valid(`old_values`)),
  1426. `new_values` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL CHECK (json_valid(`new_values`)),
  1427. `changed_by` int(11) DEFAULT NULL,
  1428. `change_date` timestamp NULL DEFAULT current_timestamp(),
  1429. PRIMARY KEY (`id`),
  1430. KEY `changed_by` (`changed_by`),
  1431. KEY `idx_issue` (`issue_id`),
  1432. KEY `idx_change_type` (`change_type`),
  1433. KEY `idx_change_date` (`change_date`),
  1434. CONSTRAINT `issue_tracker_change_log_ibfk_1` FOREIGN KEY (`issue_id`) REFERENCES `issue_tracker` (`id`) ON DELETE CASCADE,
  1435. CONSTRAINT `issue_tracker_change_log_ibfk_2` FOREIGN KEY (`changed_by`) REFERENCES `users` (`id`) ON DELETE SET NULL
  1436. ) ENGINE=InnoDB AUTO_INCREMENT=98 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci;
  1437. /*!40101 SET character_set_client = @saved_cs_client */;
  1438. LOCK TABLES `issue_tracker_change_log` WRITE;
  1439. /*!40000 ALTER TABLE `issue_tracker_change_log` DISABLE KEYS */;
  1440. INSERT INTO `issue_tracker_change_log` VALUES (6,4,'INSERT','[\"issue_type\", \"borrower_id\", \"title\", \"severity\", \"status\"]',NULL,'{\"issue_type\": \"Borrower Issue\", \"borrower_id\": 2, \"title\": \"Borrower Banned: Bob Smith\", \"severity\": \"High\", \"status\": \"Open\"}',2,'2025-10-20 11:43:55'),(7,5,'INSERT','[\"issue_type\", \"title\", \"severity\", \"status\"]',NULL,'{\"issue_type\": \"System Issue\", \"title\": \"Audit: Missing Assets in Unknown Zone\", \"severity\": \"High\", \"status\": \"Open\"}',2,'2025-10-20 11:44:01'),(72,43,'INSERT','[\"issue_type\", \"borrower_id\", \"title\", \"severity\", \"status\"]',NULL,'{\"issue_type\": \"Borrower Issue\", \"borrower_id\": 1, \"title\": \"Borrower Banned: Alice Johnson\", \"severity\": \"High\", \"status\": \"Open\"}',1,'2025-11-11 09:19:22'),(73,44,'INSERT','[\"issue_type\", \"borrower_id\", \"title\", \"severity\", \"status\"]',NULL,'{\"issue_type\": \"Borrower Issue\", \"borrower_id\": 5, \"title\": \"Borrower Banned: Missgeburt Fredie\", \"severity\": \"High\", \"status\": \"Open\"}',1,'2025-11-12 10:32:36'),(78,43,'UPDATE','[\"status\", \"solution\", \"resolved_by\"]','{\"status\": \"Open\", \"solution\": null, \"resolved_by\": null}','{\"status\": \"Resolved\", \"solution\": \"Items Returned\", \"resolved_by\": 1}',1,'2025-11-13 16:01:00'),(79,47,'INSERT','[\"issue_type\", \"borrower_id\", \"title\", \"severity\", \"status\"]',NULL,'{\"issue_type\": \"Borrower Issue\", \"borrower_id\": 1, \"title\": \"Borrower Banned: Alice Johnson\", \"severity\": \"High\", \"status\": \"Open\"}',1,'2025-11-13 16:09:28'),(83,48,'INSERT','[\"issue_type\", \"asset_id\", \"title\", \"severity\", \"status\"]',NULL,'{\"issue_type\": \"Asset Issue\", \"asset_id\": 26, \"title\": \"Asset Missing: Floating HDMI Cables\", \"severity\": \"Critical\", \"status\": \"Open\"}',1,'2025-11-14 23:10:15'),(84,48,'UPDATE','[\"status\", \"solution\", \"resolved_by\"]','{\"status\": \"Open\", \"solution\": null, \"resolved_by\": null}','{\"status\": \"Resolved\", \"solution\": \"Automatically Fixed\", \"resolved_by\": 1}',1,'2025-11-14 23:21:14'),(85,44,'UPDATE','[\"status\", \"solution\", \"resolved_by\"]','{\"status\": \"Open\", \"solution\": null, \"resolved_by\": null}','{\"status\": \"Resolved\", \"solution\": \"Items Returned\", \"resolved_by\": 1}',1,'2025-12-03 15:41:20'),(86,49,'INSERT','[\"issue_type\", \"asset_id\", \"title\", \"severity\", \"status\"]',NULL,'{\"issue_type\": \"Asset Issue\", \"asset_id\": 38, \"title\": \"Asset Faulty: Dell Monitor\", \"severity\": \"High\", \"status\": \"Open\"}',1,'2025-12-03 15:55:10'),(87,50,'INSERT','[\"issue_type\", \"asset_id\", \"title\", \"severity\", \"status\"]',NULL,'{\"issue_type\": \"Asset Issue\", \"asset_id\": 39, \"title\": \"Asset Missing: Dell Monitor\", \"severity\": \"Critical\", \"status\": \"Open\"}',1,'2025-12-03 15:55:10'),(88,51,'INSERT','[\"issue_type\", \"asset_id\", \"title\", \"severity\", \"status\"]',NULL,'{\"issue_type\": \"Asset Issue\", \"asset_id\": 38, \"title\": \"Asset Missing: Dell Monitor\", \"severity\": \"Critical\", \"status\": \"Open\"}',1,'2025-12-08 11:00:50'),(89,50,'UPDATE','[\"status\", \"solution\", \"resolved_by\"]','{\"status\": \"Open\", \"solution\": null, \"resolved_by\": null}','{\"status\": \"Resolved\", \"solution\": \"Automatically Fixed\", \"resolved_by\": 1}',1,'2025-12-08 11:00:50'),(90,52,'INSERT','[\"issue_type\", \"asset_id\", \"title\", \"severity\", \"status\"]',NULL,'{\"issue_type\": \"Asset Issue\", \"asset_id\": 38, \"title\": \"Asset Needs Attention: Dell Monitor\", \"severity\": \"Medium\", \"status\": \"Open\"}',1,'2025-12-08 11:08:13'),(91,53,'INSERT','[\"issue_type\", \"asset_id\", \"title\", \"severity\", \"status\"]',NULL,'{\"issue_type\": \"Asset Issue\", \"asset_id\": 39, \"title\": \"Asset Missing: Dell Monitor\", \"severity\": \"Critical\", \"status\": \"Open\"}',1,'2025-12-08 11:08:13'),(92,54,'INSERT','[\"issue_type\", \"asset_id\", \"title\", \"severity\", \"status\"]',NULL,'{\"issue_type\": \"Asset Issue\", \"asset_id\": 26, \"title\": \"Asset Missing: Floating HDMI Cables\", \"severity\": \"Critical\", \"status\": \"Open\"}',1,'2025-12-08 11:08:13'),(93,54,'UPDATE','[\"status\", \"solution\", \"resolved_by\"]','{\"status\": \"Open\", \"solution\": null, \"resolved_by\": null}','{\"status\": \"Resolved\", \"solution\": \"Automatically Fixed\", \"resolved_by\": 1}',1,'2025-12-10 16:40:16'),(94,55,'INSERT','[\"issue_type\", \"asset_id\", \"title\", \"severity\", \"status\"]',NULL,'{\"issue_type\": \"Asset Issue\", \"asset_id\": 26, \"title\": \"Asset Overdue: Floating HDMI Cables\", \"severity\": \"High\", \"status\": \"Open\"}',1,'2025-12-21 22:43:22'),(95,53,'UPDATE','[\"status\", \"solution\", \"resolved_by\"]','{\"status\": \"Open\", \"solution\": null, \"resolved_by\": null}','{\"status\": \"Resolved\", \"solution\": \"Automatically Fixed\", \"resolved_by\": 1}',1,'2025-12-22 00:47:32'),(96,55,'UPDATE','[\"status\", \"solution\", \"resolved_by\"]','{\"status\": \"Open\", \"solution\": null, \"resolved_by\": null}','{\"status\": \"Resolved\", \"solution\": \"Items Returned\", \"resolved_by\": 1}',1,'2025-12-22 00:47:55'),(97,56,'INSERT','[\"issue_type\", \"asset_id\", \"title\", \"severity\", \"status\"]',NULL,'{\"issue_type\": \"Asset Issue\", \"asset_id\": 40, \"title\": \"Asset Faulty: Dell Monitor\", \"severity\": \"High\", \"status\": \"Open\"}',1,'2025-12-22 02:22:04');
  1441. /*!40000 ALTER TABLE `issue_tracker_change_log` ENABLE KEYS */;
  1442. UNLOCK TABLES;
  1443. DROP TABLE IF EXISTS `label_templates`;
  1444. /*!40101 SET @saved_cs_client = @@character_set_client */;
  1445. /*!50503 SET character_set_client = utf8mb4 */;
  1446. CREATE TABLE `label_templates` (
  1447. `id` int(11) NOT NULL AUTO_INCREMENT,
  1448. `template_code` varchar(100) NOT NULL COMMENT 'Unique code like "CABLE"',
  1449. `template_name` varchar(200) NOT NULL COMMENT 'Human readable name',
  1450. `layout_json` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT 'Universal label design: SVG graphics, auto-populated field placeholders, styling' CHECK (json_valid(`layout_json`)),
  1451. `created_at` timestamp NULL DEFAULT current_timestamp(),
  1452. `created_by` int(11) DEFAULT NULL,
  1453. `last_modified_at` timestamp NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
  1454. `last_modified_by` int(11) DEFAULT NULL,
  1455. PRIMARY KEY (`id`),
  1456. UNIQUE KEY `template_code` (`template_code`),
  1457. KEY `created_by` (`created_by`),
  1458. KEY `last_modified_by` (`last_modified_by`),
  1459. KEY `idx_template_code` (`template_code`),
  1460. KEY `idx_template_name` (`template_name`),
  1461. CONSTRAINT `label_templates_ibfk_1` FOREIGN KEY (`created_by`) REFERENCES `users` (`id`) ON DELETE SET NULL,
  1462. CONSTRAINT `label_templates_ibfk_2` FOREIGN KEY (`last_modified_by`) REFERENCES `users` (`id`) ON DELETE SET NULL
  1463. ) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci;
  1464. /*!40101 SET character_set_client = @saved_cs_client */;
  1465. LOCK TABLES `label_templates` WRITE;
  1466. /*!40000 ALTER TABLE `label_templates` DISABLE KEYS */;
  1467. INSERT INTO `label_templates` VALUES (5,'DEF','Default-Zonebound-Label','{\"background\":\"#FFFFFF\",\"elements\":[{\"data\":\"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMDAiIGhlaWdodD0iODAiIHZpZXdCb3g9IjAgMCAyMDAgODAiPjxyZWN0IHdpZHRoPSIyMDAiIGhlaWdodD0iODAiIGZpbGw9IiNmZmZmZmYiLz48cmVjdCB4PSIwIiB5PSIwIiB3aWR0aD0iMjAwIiBoZWlnaHQ9IjgwIiByeD0iOCIgcnk9IjgiIGZpbGw9IiMyMjIyMjIiLz48Y2lyY2xlIGN4PSI0MCIgY3k9IjQwIiByPSIyMiIgZmlsbD0iIzAwRDA4NCIvPjxyZWN0IHg9Ijc1IiB5PSIyNSIgd2lkdGg9IjEwMCIgaGVpZ2h0PSIxMCIgZmlsbD0iI2ZmZmZmZiIvPjxyZWN0IHg9Ijc1IiB5PSI0NSIgd2lkdGg9IjcwIiBoZWlnaHQ9IjEwIiBmaWxsPSIjZmZmZmZmIi8+PC9zdmc+\",\"height\":10.0,\"type\":\"svg\",\"width\":18.0,\"x\":4.0,\"y\":3.0},{\"color\":\"#000000\",\"field\":\"BeepZone Demo\",\"fontSize\":12.0,\"maxWidth\":22.0,\"type\":\"text\",\"wrap\":false,\"x\":24.0,\"y\":5.0},{\"color\":\"#000000\",\"field\":\"TAG: {{asset_tag}}\",\"fontSize\":10.0,\"type\":\"text\",\"x\":4.0,\"y\":18.0},{\"color\":\"#000000\",\"field\":\"ZONE: {{zone_code}}\",\"fontSize\":10.0,\"type\":\"text\",\"x\":4.0,\"y\":23.0},{\"field\":\"{{asset_numeric_id}}\",\"showText\":false,\"size\":22.0,\"type\":\"datamatrix\",\"x\":4.0,\"y\":28.0},{\"color\":\"#000000\",\"field\":\"ID: {{asset_numeric_id}}\",\"fontSize\":9.0,\"type\":\"text\",\"x\":28.0,\"y\":29.0},{\"color\":\"#000000\",\"field\":\"{{name}}\",\"fontSize\":9.0,\"maxWidth\":20.0,\"type\":\"text\",\"wrap\":true,\"x\":28.0,\"y\":34.0}]}','2025-11-09 12:02:11',NULL,'2025-11-09 20:56:34',NULL),(6,'ZONE','Zone Sign','{\"background\":\"#F8F9FA\",\"elements\":[{\"fill\":\"#1976D2\",\"height\":12.0,\"type\":\"rect\",\"width\":100.0,\"x\":0.0,\"y\":0.0},{\"color\":\"#FFFFFF\",\"field\":\"ZONE IDENTIFICATION\",\"fontSize\":14.0,\"fontWeight\":\"bold\",\"type\":\"text\",\"x\":5.0,\"y\":2.0},{\"color\":\"#000000\",\"field\":\"{{zone_name}}\",\"fontSize\":16.0,\"fontWeight\":\"bold\",\"maxWidth\":60.0,\"type\":\"text\",\"wrap\":false,\"x\":5.0,\"y\":18.0},{\"color\":\"#666666\",\"field\":\"Zone Code: {{zone_code}}\",\"fontSize\":12.0,\"type\":\"text\",\"x\":5.0,\"y\":25.0},{\"field\":\"ZONE:{{zone_code}}\",\"showText\":false,\"size\":24.0,\"type\":\"qrcode\",\"x\":70.0,\"y\":15.0}],\"space\":{\"height\":40.0,\"width\":100.0}}','2025-11-09 21:08:18',NULL,'2025-11-09 21:08:18',NULL),(7,'DEFIMMO','Default ImmoRSS','{\"background\":\"#FFFFFF\",\"elements\":[{\"data\":\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIGlkPSJiIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNDYuMzggNDQuODYiPjxnIGlkPSJjIj48cGF0aCBkPSJNMTU2LjMsNDNsLS4wMi0zNy4xYy42MS0yLjg0LTUuNS0yLjktNS45OC0zLjM0LTEuNDMtMS4zMiwzLjUxLTEuNTcsMy45NS0xLjYsNS43Ny0uMzcsMTguNjYtLjUxLDIzLjUxLDIuMDksNy41Nyw0LjA2LDcuNDksMTYuNTQtLjMxLDE4LjkyLTEuNDMuNDQtMy43Ni0uNDctMy40OC45OGwxMC40NCwyMC4wNS02LjktLjA0LTEwLjAzLTE4LjI0Yy0xLTEuODEtNC4yLTEuNzItNC40NC40NC0uMzgsMy4zNi0uMTcsOS45Mi0uMTEsMTMuNTgsMCwuNzguNzksNC4yNy4xNiw0LjI3aC02Ljc5Wk0xNzIuMjQsMTkuNTdjLjQyLS4yNC43OC0uNTYsMS4yNS0uOTQsMi44My0yLjMsMy40MS03LjkxLDEuNTktMTEtLjIyLS4zOS0uOTYtMS43LTIuNDgtMi42My0uNDQtLjI3LS45NC0uNDQtMS40Ni0uNS0zLjMyLS40LTYuMDUtLjIzLTYuNzIsMC0uNTkuMjEtMS4wOCwxLjM3LTEuMTgsMS45OC0uMiwxLjIzLS4yLDEzLjExLjE3LDEzLjc4LjQ2LjgzLDcuMDcuMzgsOC4wNi0uMi4yOS0uMTcuMjctLjE5LjQyLS4yOGwuMzUtLjIxWiIvPjxwYXRoIGQ9Ik0yNC4wNyw0MC45OGMwLTIuMDEuOTYtMjEuMTEtMS4yMy0yMy4yNi0uODEtLjc5LTUuMjEtLjIzLTMuOTItMi4xOC4zNy0uNTYsMTAuMTYtMi4yMSwxMC45NS0xLjcyLDEuMzcuODUtLjk0LDEuNjkuMzksMi4wOS41MS4xNSw0Ljg4LTEuNjIsNi40MS0yLjA1LDEuMy0uMzYsNi4wOS0uMjgsNy4zNS4zOCwxLjQ0Ljc1LDIuNDEsMi44LDIuNjcsMi45My41NS4yNSwxLjU4LTIuNCw2LjE0LTMuMjgsMi4xMi0uMzIsNy4wMy0uNzIsOC43MS45Miw0LjU1LDQuNDMsMi40NywyMC40OCwyLjgxLDI3LjEuMDIuMzQtLjAyLS4yMi0uMTMsMS4wOGgtNi4xNnYtMjEuMDFjMC0yLjIyLTMuMDYtNC44LTUuMjEtNC4yNy0yLjc4LjYxLTQuNjgsNC44MS00LjgsNS4xNC0xLjE4LDMuMy0uODIsMTQuODItLjY0LDE4Ljc5LjAyLjQ2LjAyLDEuMjMuMDEsMS4yOC0xLjgyLjAzLTUuMzguMTEtNi40MS4wNnYtMjAuNjljMC0uNC0uNTUtMy44OC0xLjk3LTQuMTktMS41MS0xLjQ2LTQuNjYuNTUtNS43NywxLjgyLTUuMjksNi4wMS0yLjgyLDE1LjY4LTMsMjMuMDZoLTYuMTdzLS4wMy0yLjAxLS4wMy0yLjAxWiIvPjxwYXRoIGQ9Ik0xOTkuNDYsMTUuMzJjMy44OSwzLjE0LDkuNDksNC42LDEyLjkyLDguNDEsMS44NCwyLjA0LDQuMTMsNC4xMiwzLjY1LDkuOTctMS40NSw4LjAyLTExLjA0LDEwLjk3LTE4LjE5LDEwLjU3LTQuNzgtLjQzLTguODQtMS45My05LjE4LTIuMTItLjEtLjA1LjIxLTEuMDguMjEtMS4yLDAtLjE3LjgtMi4zOS45My0yLjQ5LjUzLS40MSw1LjM0LDEuMjIsNi42MywxLjU0LDUuMzYsMS4zMywxMS44NCwxLjE1LDEyLjMtNS43MnMtOC44My05LjQ0LTEzLjItMTIuMzNjLTIuMzQtMS41NS01LjkyLTUuMzctNi41Mi04LjE1LS42Ni0zLjA3Ljk1LTkuMzcsMy44Ny0xMS4xOSwxLjgtMS4xMiw0LjY3LTIuMjMsMTAuMS0yLjMzLDQuMTMuMDUsOC4zOC43Miw5LjAyLDEuMDksMS4wOC42MywxLjIxLDMuNzMuNTcsNC4yMS0xLjAxLjc2LTE1LTUuODgtMTYuMzcsMS45NS0uNzMsNC4xNS40LDUuNDYsMy4yOCw3Ljc5aC0uMDJaIi8+PHBhdGggZD0iTTE0MC4zNCwxMi44OWM5Ljc1LDMuNTcsMTAuNDEsMjUuMDIuODEsMjguNTQtMTUuMjEsNS41Ny0yMS44LTYuNTctMTkuMzEtMjAuMjYuNDYtMS41Ny40Ni0xLjU5Ljg4LTIuNC4zNC0uODMuMzUtLjgzLjgxLTEuNTcuMDItLjA0LjY3LS45OC45OS0xLjI1LDQuMTQtMy41MiwxMC41OC00Ljk4LDE1LjgyLTMuMDZoMFpNMTQwLjk3LDMxLjk1Yy4wOS01LjU1LDEuMDYtMjAuOS04Ljc4LTE3LjE1LTIuOTUsMS4xMi0zLjEsMy4yNC0zLjIzLDMuNjQtLjA5LjEtLjMxLjc5LS4zNywxLjI3LS4xLjE3LS40MSwzLjM2LS40NiwzLjk3LS40MSw1LjczLS4xOSwxNy4zNCw4LjAyLDE2LjIzLDQuMTQtLjU2LDQuMy00Ljk1LDQuODItNy45NloiLz48cGF0aCBkPSJNNi43MSw0M2MtLjIzLS4wOS0uNS0uNDctLjQ1LS43NmwtLjA2LTM1LjcyQzUuMTksMS43OS0xLjI1LDUuNDcuMjEsMS44MS42Ljg0LDEwLjg5LDEuNjQsMTIuMzgsMGMuODEtLjA1LDEuMTcuMzEsMS4xNCwxLjEybC0uMTcsNDEuODdoLTYuNjRaIi8+PHBhdGggZD0iTTc0LjYyLDQwLjk2YzAtMi4wMS45Ni0yMS4xMS0xLjIzLTIzLjI2LS44MS0uNzktNS4yMS0uMjMtMy45Mi0yLjE4LjM3LS41NiwxMC4xNi0yLjIxLDEwLjk1LTEuNzIsMS4zNy44NS0uOTQsMS42OS4zOSwyLjA5LjUxLjE1LDQuODgtMS42Miw2LjQxLTIuMDUsMS4zLS4zNiw2LjA5LS4yOCw3LjM1LjM4LDEuNDQuNzUsMi40MSwyLjgsMi42NywyLjkzLjU1LjI1LDEuNTgtMi40LDYuMTQtMy4yOCwyLjEyLS4zMiw3LjAzLS43Miw4LjcxLjkyLDQuNTUsNC40MywyLjQ3LDIwLjQ4LDIuODEsMjcuMS4wMi4zNC0uMDItLjIyLS4xMywxLjA4aC02LjE2di0yMS4wMWMwLTIuMjItMy4wNi00LjgtNS4yMS00LjI3LTIuNzguNjEtNC42OCw0LjgxLTQuOCw1LjE0LTEuMTgsMy4zLS44MiwxNC44Mi0uNjQsMTguNzkuMDIuNDYuMDIsMS4yMy4wMSwxLjI4LTEuODIuMDMtNS4zOC4xMS02LjQxLjA2di0yMC42OWMwLS40LS41NS0zLjg4LTEuOTctNC4xOS0xLjUxLTEuNDYtNC42Ni41NS01Ljc3LDEuODItNS4yOSw2LjAxLTIuODIsMTUuNjgtMywyMy4wNmgtNi4xN3MtLjAzLTIuMDEtLjAzLTIuMDFaIi8+PHBhdGggZD0iTTIyOS43NSwxNS44OGMzLjg5LDMuMTQsOS40OSw0LjYsMTIuOTIsOC40MSwxLjg0LDIuMDQsNC4xMyw0LjEyLDMuNjUsOS45Ny0xLjQ1LDguMDItMTEuMDQsMTAuOTctMTguMTksMTAuNTctNC43OC0uNDMtOC44NC0xLjkzLTkuMTgtMi4xMi0uMS0uMDUuMjEtMS4wOC4yMS0xLjIsMC0uMTcuOC0yLjM5LjkzLTIuNDkuNTMtLjQxLDUuMzQsMS4yMiw2LjYzLDEuNTQsNS4zNiwxLjMzLDExLjg0LDEuMTUsMTIuMy01Ljcycy04LjgzLTkuNDQtMTMuMi0xMi4zM2MtMi4zNC0xLjU1LTUuOTItNS4zNy02LjUyLTguMTUtLjY2LTMuMDcuOTUtOS4zNywzLjg3LTExLjE5LDEuOC0xLjEyLDQuNjctMi4yMywxMC4xLTIuMzMsNC4xMy4wNSw4LjM4LjcyLDkuMDIsMS4wOSwxLjA4LjYzLDEuMjEsMy43My41Nyw0LjIxLTEuMDEuNzYtMTUtNS44OC0xNi4zNywxLjk1LS43Myw0LjE1LjQsNS40NiwzLjI4LDcuNzloLS4wMloiLz48L2c+PC9zdmc+\",\"height\":20.0,\"type\":\"svg\",\"width\":40.0,\"x\":4.0,\"y\":3.0},{\"color\":\"#000000\",\"field\":\"Inventory\",\"fontSize\":12.0,\"maxWidth\":22.0,\"type\":\"text\",\"wrap\":false,\"x\":48.0,\"y\":5.0},{\"color\":\"#000000\",\"field\":\"TAG: {{asset_tag}}\",\"fontSize\":10.0,\"type\":\"text\",\"x\":4.0,\"y\":18.0},{\"color\":\"#000000\",\"field\":\"ZONE: {{zone_code}}\",\"fontSize\":10.0,\"type\":\"text\",\"x\":4.0,\"y\":23.0},{\"field\":\"{{asset_numeric_id}}\",\"showText\":false,\"size\":22.0,\"type\":\"datamatrix\",\"x\":4.0,\"y\":28.0},{\"color\":\"#000000\",\"field\":\"ID: {{asset_numeric_id}}\",\"fontSize\":9.0,\"type\":\"text\",\"x\":28.0,\"y\":29.0},{\"color\":\"#000000\",\"field\":\"{{name}}\",\"fontSize\":9.0,\"maxWidth\":20.0,\"type\":\"text\",\"wrap\":true,\"x\":28.0,\"y\":34.0}]}','2025-11-13 18:31:09',NULL,'2025-11-13 18:33:43',NULL);
  1468. /*!40000 ALTER TABLE `label_templates` ENABLE KEYS */;
  1469. UNLOCK TABLES;
  1470. DROP TABLE IF EXISTS `lending_history`;
  1471. /*!40101 SET @saved_cs_client = @@character_set_client */;
  1472. /*!50503 SET character_set_client = utf8mb4 */;
  1473. CREATE TABLE `lending_history` (
  1474. `id` int(11) NOT NULL AUTO_INCREMENT,
  1475. `asset_id` int(11) NOT NULL,
  1476. `borrower_id` int(11) NOT NULL,
  1477. `checkout_date` datetime NOT NULL DEFAULT current_timestamp(),
  1478. `due_date` date DEFAULT NULL,
  1479. `return_date` datetime DEFAULT NULL,
  1480. `checked_out_by` int(11) DEFAULT NULL,
  1481. `checked_in_by` int(11) DEFAULT NULL,
  1482. `notes` text DEFAULT NULL,
  1483. PRIMARY KEY (`id`),
  1484. KEY `checked_out_by` (`checked_out_by`),
  1485. KEY `checked_in_by` (`checked_in_by`),
  1486. KEY `idx_asset` (`asset_id`),
  1487. KEY `idx_borrower` (`borrower_id`),
  1488. KEY `idx_checkout_date` (`checkout_date`),
  1489. KEY `idx_return_date` (`return_date`),
  1490. CONSTRAINT `lending_history_ibfk_1` FOREIGN KEY (`asset_id`) REFERENCES `assets` (`id`) ON DELETE CASCADE,
  1491. CONSTRAINT `lending_history_ibfk_2` FOREIGN KEY (`borrower_id`) REFERENCES `borrowers` (`id`),
  1492. CONSTRAINT `lending_history_ibfk_3` FOREIGN KEY (`checked_out_by`) REFERENCES `users` (`id`),
  1493. CONSTRAINT `lending_history_ibfk_4` FOREIGN KEY (`checked_in_by`) REFERENCES `users` (`id`) ON DELETE SET NULL
  1494. ) ENGINE=InnoDB AUTO_INCREMENT=25 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci;
  1495. /*!40101 SET character_set_client = @saved_cs_client */;
  1496. LOCK TABLES `lending_history` WRITE;
  1497. /*!40000 ALTER TABLE `lending_history` DISABLE KEYS */;
  1498. INSERT INTO `lending_history` VALUES (17,25,3,'2025-11-14 20:28:38','2025-11-21','2025-11-14 22:48:14',1,1,NULL),(18,26,3,'2025-11-14 22:47:39','2025-11-21','2025-11-14 22:49:25',1,1,NULL),(19,25,4,'2025-11-14 22:51:07','2025-11-21','2025-11-14 22:51:11',1,1,NULL),(20,25,5,'2025-12-03 16:44:27','2026-01-01','2025-12-22 01:48:00',1,1,'Permanent Lending for Work usage'),(21,26,5,'2025-12-08 11:58:17','2025-12-11','2025-12-10 15:29:13',1,1,'Penis Fotze'),(22,26,3,'2025-12-10 17:37:29',NULL,'2025-12-10 17:55:09',1,1,NULL),(23,26,5,'2025-12-11 19:55:25','2025-12-14','2025-12-22 01:47:55',1,1,NULL),(24,25,3,'2025-12-22 05:07:23','2026-01-05',NULL,3,NULL,NULL);
  1499. /*!40000 ALTER TABLE `lending_history` ENABLE KEYS */;
  1500. UNLOCK TABLES;
  1501. /*!50003 SET @saved_cs_client = @@character_set_client */ ;
  1502. /*!50003 SET @saved_cs_results = @@character_set_results */ ;
  1503. /*!50003 SET @saved_col_connection = @@collation_connection */ ;
  1504. /*!50003 SET character_set_client = utf8mb4 */ ;
  1505. /*!50003 SET character_set_results = utf8mb4 */ ;
  1506. /*!50003 SET collation_connection = utf8mb4_0900_ai_ci */ ;
  1507. /*!50003 SET @saved_sql_mode = @@sql_mode */ ;
  1508. /*!50003 SET sql_mode = 'STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' */ ;
  1509. DELIMITER ;;
  1510. /*!50003 CREATE*/ /*!50017 DEFINER=`root`@`%`*/ /*!50003 TRIGGER lending_history_before_insert_meta
  1511. BEFORE INSERT ON lending_history
  1512. FOR EACH ROW
  1513. BEGIN
  1514. IF NEW.checked_out_by IS NULL AND @current_user_id IS NOT NULL THEN
  1515. SET NEW.checked_out_by = @current_user_id;
  1516. END IF;
  1517. END */;;
  1518. DELIMITER ;
  1519. /*!50003 SET sql_mode = @saved_sql_mode */ ;
  1520. /*!50003 SET character_set_client = @saved_cs_client */ ;
  1521. /*!50003 SET character_set_results = @saved_cs_results */ ;
  1522. /*!50003 SET collation_connection = @saved_col_connection */ ;
  1523. /*!50003 SET @saved_cs_client = @@character_set_client */ ;
  1524. /*!50003 SET @saved_cs_results = @@character_set_results */ ;
  1525. /*!50003 SET @saved_col_connection = @@collation_connection */ ;
  1526. /*!50003 SET character_set_client = utf8mb4 */ ;
  1527. /*!50003 SET character_set_results = utf8mb4 */ ;
  1528. /*!50003 SET collation_connection = utf8mb4_0900_ai_ci */ ;
  1529. /*!50003 SET @saved_sql_mode = @@sql_mode */ ;
  1530. /*!50003 SET sql_mode = 'STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' */ ;
  1531. DELIMITER ;;
  1532. /*!50003 CREATE*/ /*!50017 DEFINER=`root`@`%`*/ /*!50003 TRIGGER lending_history_before_update_meta
  1533. BEFORE UPDATE ON lending_history
  1534. FOR EACH ROW
  1535. BEGIN
  1536. IF OLD.return_date IS NULL AND NEW.return_date IS NOT NULL THEN
  1537. IF NEW.checked_in_by IS NULL AND @current_user_id IS NOT NULL THEN
  1538. SET NEW.checked_in_by = @current_user_id;
  1539. END IF;
  1540. END IF;
  1541. END */;;
  1542. DELIMITER ;
  1543. /*!50003 SET sql_mode = @saved_sql_mode */ ;
  1544. /*!50003 SET character_set_client = @saved_cs_client */ ;
  1545. /*!50003 SET character_set_results = @saved_cs_results */ ;
  1546. /*!50003 SET collation_connection = @saved_col_connection */ ;
  1547. DROP TABLE IF EXISTS `physical_audit_logs`;
  1548. /*!40101 SET @saved_cs_client = @@character_set_client */;
  1549. /*!50503 SET character_set_client = utf8mb4 */;
  1550. CREATE TABLE `physical_audit_logs` (
  1551. `id` int(11) NOT NULL AUTO_INCREMENT,
  1552. `physical_audit_id` int(11) NOT NULL COMMENT 'Reference to the audit session',
  1553. `asset_id` int(11) NOT NULL,
  1554. `audit_date` datetime NOT NULL DEFAULT current_timestamp(),
  1555. `audited_by` int(11) NOT NULL,
  1556. `status_found` enum('Good','Attention','Faulty','Missing','Retired','In Repair','In Transit','Expired','Unmanaged') DEFAULT 'Good',
  1557. `audit_task_id` int(11) DEFAULT NULL COMMENT 'Which audit task was run on this asset',
  1558. `audit_task_responses` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'User responses to the JSON sequence questions' CHECK (json_valid(`audit_task_responses`)),
  1559. `exception_type` enum('wrong-zone','unexpected-asset','damaged','missing-label','other') DEFAULT NULL,
  1560. `exception_details` text DEFAULT NULL COMMENT 'Details about the exception found',
  1561. `found_in_zone_id` int(11) DEFAULT NULL COMMENT 'Which zone the asset was actually found in (if different from expected)',
  1562. `auditor_action` enum('physical-move','virtual-update','no-action') DEFAULT NULL COMMENT 'What the auditor chose to do about wrong-zone assets',
  1563. `notes` text DEFAULT NULL,
  1564. PRIMARY KEY (`id`),
  1565. KEY `audit_task_id` (`audit_task_id`),
  1566. KEY `found_in_zone_id` (`found_in_zone_id`),
  1567. KEY `idx_physical_audit` (`physical_audit_id`),
  1568. KEY `idx_asset` (`asset_id`),
  1569. KEY `idx_audit_date` (`audit_date`),
  1570. KEY `idx_audited_by` (`audited_by`),
  1571. KEY `idx_status_found` (`status_found`),
  1572. KEY `idx_exception_type` (`exception_type`),
  1573. CONSTRAINT `physical_audit_logs_ibfk_1` FOREIGN KEY (`physical_audit_id`) REFERENCES `physical_audits` (`id`) ON DELETE CASCADE,
  1574. CONSTRAINT `physical_audit_logs_ibfk_2` FOREIGN KEY (`asset_id`) REFERENCES `assets` (`id`) ON DELETE CASCADE,
  1575. CONSTRAINT `physical_audit_logs_ibfk_3` FOREIGN KEY (`audited_by`) REFERENCES `users` (`id`),
  1576. CONSTRAINT `physical_audit_logs_ibfk_4` FOREIGN KEY (`audit_task_id`) REFERENCES `audit_tasks` (`id`) ON DELETE SET NULL,
  1577. CONSTRAINT `physical_audit_logs_ibfk_5` FOREIGN KEY (`found_in_zone_id`) REFERENCES `zones` (`id`) ON DELETE SET NULL
  1578. ) ENGINE=InnoDB AUTO_INCREMENT=74 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci;
  1579. /*!40101 SET character_set_client = @saved_cs_client */;
  1580. LOCK TABLES `physical_audit_logs` WRITE;
  1581. /*!40000 ALTER TABLE `physical_audit_logs` DISABLE KEYS */;
  1582. INSERT INTO `physical_audit_logs` VALUES (14,7,38,'2025-11-14 22:42:57',1,'Good',NULL,NULL,NULL,NULL,11,NULL,NULL),(15,7,39,'2025-11-14 22:42:57',1,'Good',NULL,NULL,NULL,NULL,11,NULL,NULL),(16,7,25,'2025-11-14 22:42:57',1,'Good',NULL,NULL,NULL,NULL,11,NULL,NULL),(17,7,26,'2025-11-14 22:42:57',1,'Good',NULL,NULL,NULL,NULL,11,NULL,NULL),(18,9,38,'2025-11-14 22:57:48',1,'Good',NULL,NULL,NULL,NULL,11,NULL,NULL),(19,9,25,'2025-11-14 22:57:48',1,'Good',NULL,NULL,NULL,NULL,11,NULL,NULL),(20,9,26,'2025-11-14 22:57:48',1,'Good',NULL,NULL,NULL,NULL,11,NULL,NULL),(21,10,38,'2025-11-14 23:08:21',1,'Good',NULL,NULL,NULL,NULL,11,NULL,NULL),(22,10,39,'2025-11-14 23:08:21',1,'Good',NULL,NULL,NULL,NULL,11,NULL,NULL),(23,10,25,'2025-11-14 23:08:21',1,'Good',NULL,NULL,NULL,NULL,11,NULL,NULL),(24,10,26,'2025-11-14 23:08:21',1,'Good',NULL,NULL,NULL,NULL,11,NULL,NULL),(25,12,38,'2025-11-14 23:10:15',1,'Good',NULL,NULL,NULL,NULL,11,NULL,NULL),(26,12,39,'2025-11-14 23:10:15',1,'Good',NULL,NULL,NULL,NULL,11,NULL,NULL),(27,12,25,'2025-11-14 23:10:15',1,'Good',NULL,NULL,NULL,NULL,11,NULL,NULL),(28,12,26,'2025-11-14 23:10:15',1,'Missing',NULL,NULL,'other','Marked missing during audit',11,NULL,NULL),(29,13,38,'2025-11-14 23:19:06',1,'Good',NULL,NULL,NULL,NULL,11,NULL,NULL),(30,13,39,'2025-11-14 23:19:06',1,'Good',NULL,NULL,NULL,NULL,11,NULL,NULL),(31,13,25,'2025-11-14 23:19:06',1,'Good',NULL,NULL,NULL,NULL,11,NULL,NULL),(32,13,26,'2025-11-14 23:19:06',1,'Missing',NULL,NULL,NULL,NULL,11,NULL,NULL),(33,14,38,'2025-11-14 23:25:16',1,'Good',NULL,NULL,NULL,NULL,11,NULL,NULL),(34,14,39,'2025-11-14 23:25:16',1,'Good',NULL,NULL,NULL,NULL,11,NULL,NULL),(35,14,25,'2025-11-14 23:25:16',1,'Good',NULL,NULL,NULL,NULL,11,NULL,NULL),(36,14,26,'2025-11-14 23:25:16',1,'Good',NULL,NULL,NULL,NULL,11,NULL,NULL),(37,15,38,'2025-11-14 23:29:06',1,'Good',NULL,NULL,NULL,NULL,11,NULL,NULL),(38,15,39,'2025-11-14 23:29:06',1,'Good',NULL,NULL,NULL,NULL,11,NULL,NULL),(39,15,25,'2025-11-14 23:29:06',1,'Good',NULL,NULL,NULL,NULL,11,NULL,NULL),(40,15,26,'2025-11-14 23:29:06',1,'Good',NULL,NULL,NULL,NULL,11,NULL,NULL),(41,16,38,'2025-11-14 23:31:01',1,'Good',NULL,NULL,NULL,NULL,11,NULL,NULL),(42,16,39,'2025-11-14 23:31:01',1,'Good',NULL,NULL,NULL,NULL,11,NULL,NULL),(43,16,25,'2025-11-14 23:31:01',1,'Good',NULL,NULL,NULL,NULL,11,NULL,NULL),(44,16,26,'2025-11-14 23:31:01',1,'Good',NULL,NULL,NULL,NULL,11,NULL,NULL),(45,17,25,'2025-11-15 01:19:04',1,'Good',NULL,NULL,NULL,NULL,11,NULL,NULL),(46,18,38,'2025-11-15 01:29:14',1,'Good',1,'{\"responses\":[{\"answer\":\"Yes\",\"question\":\"Does the device power on?\",\"step\":1},{\"answer\":\"Good\",\"question\":\"Physical condition?\",\"step\":2}]}',NULL,NULL,11,NULL,NULL),(47,18,39,'2025-11-15 01:29:14',1,'Good',NULL,NULL,NULL,NULL,11,NULL,NULL),(48,18,25,'2025-11-15 01:29:14',1,'Good',NULL,NULL,NULL,NULL,11,NULL,NULL),(49,18,26,'2025-11-15 01:29:14',1,'Good',NULL,NULL,NULL,NULL,11,NULL,NULL),(50,19,25,'2025-11-15 04:03:42',1,'Good',NULL,NULL,NULL,NULL,11,NULL,NULL),(51,20,25,'2025-11-15 04:04:23',1,'Good',NULL,NULL,NULL,NULL,11,NULL,NULL),(52,21,25,'2025-11-15 04:05:11',1,'Good',NULL,NULL,NULL,NULL,11,NULL,NULL),(53,22,25,'2025-11-15 04:07:13',1,'Good',NULL,NULL,NULL,NULL,11,NULL,NULL),(54,23,38,'2025-12-03 15:55:10',1,'Faulty',1,'{\"responses\":[{\"answer\":\"No\",\"question\":\"Does the device power on?\",\"step\":1}]}',NULL,NULL,11,NULL,NULL),(55,23,39,'2025-12-03 15:55:10',1,'Missing',NULL,NULL,'other','Marked missing during audit',11,NULL,NULL),(56,23,25,'2025-12-03 15:55:10',1,'Good',NULL,NULL,NULL,NULL,11,NULL,NULL),(57,23,26,'2025-12-03 15:55:10',1,'Good',NULL,NULL,NULL,NULL,11,NULL,NULL),(58,24,38,'2025-12-08 11:00:50',1,'Missing',1,NULL,'other','Marked missing during audit',11,NULL,NULL),(59,24,39,'2025-12-08 11:00:50',1,'Good',NULL,NULL,NULL,NULL,11,NULL,NULL),(60,24,25,'2025-12-08 11:00:50',1,'Good',NULL,NULL,NULL,NULL,11,NULL,NULL),(61,24,26,'2025-12-08 11:00:50',1,'Good',NULL,NULL,NULL,NULL,11,NULL,NULL),(62,25,38,'2025-12-08 11:08:13',1,'Attention',1,'{\"additional_fields\":{\"damage_notes\":\"penis\"},\"responses\":[{\"answer\":\"Yes\",\"question\":\"Does the device power on?\",\"step\":1},{\"answer\":\"Damaged\",\"question\":\"Physical condition?\",\"step\":2},{\"answer\":\"penis\",\"question\":\"Describe the damage\",\"step\":3}]}',NULL,NULL,11,NULL,NULL),(63,25,39,'2025-12-08 11:08:13',1,'Missing',NULL,NULL,'other','Marked missing during audit',11,NULL,NULL),(64,25,25,'2025-12-08 11:08:13',1,'Good',NULL,NULL,NULL,NULL,11,NULL,NULL),(65,25,26,'2025-12-08 11:08:13',1,'Missing',NULL,NULL,'other','Marked missing during audit',11,NULL,NULL),(66,27,25,'2025-12-21 23:41:41',1,'Good',NULL,NULL,NULL,NULL,11,NULL,NULL),(67,29,25,'2025-12-22 00:45:37',1,'Good',NULL,NULL,NULL,NULL,11,NULL,NULL),(68,30,38,'2025-12-22 01:00:29',1,'Good',1,NULL,NULL,NULL,11,NULL,NULL),(69,30,39,'2025-12-22 01:00:29',1,'Good',NULL,NULL,NULL,NULL,11,NULL,NULL),(70,30,25,'2025-12-22 01:00:29',1,'Good',NULL,NULL,NULL,NULL,11,NULL,NULL),(71,30,26,'2025-12-22 01:00:29',1,'Good',NULL,NULL,NULL,NULL,11,NULL,NULL),(72,30,40,'2025-12-22 01:00:29',1,'Good',1,NULL,NULL,NULL,11,NULL,NULL),(73,31,40,'2025-12-22 01:09:30',1,'Good',1,NULL,NULL,NULL,13,NULL,NULL);
  1583. /*!40000 ALTER TABLE `physical_audit_logs` ENABLE KEYS */;
  1584. UNLOCK TABLES;
  1585. /*!50003 SET @saved_cs_client = @@character_set_client */ ;
  1586. /*!50003 SET @saved_cs_results = @@character_set_results */ ;
  1587. /*!50003 SET @saved_col_connection = @@collation_connection */ ;
  1588. /*!50003 SET character_set_client = utf8mb4 */ ;
  1589. /*!50003 SET character_set_results = utf8mb4 */ ;
  1590. /*!50003 SET collation_connection = utf8mb4_0900_ai_ci */ ;
  1591. /*!50003 SET @saved_sql_mode = @@sql_mode */ ;
  1592. /*!50003 SET sql_mode = 'STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' */ ;
  1593. DELIMITER ;;
  1594. /*!50003 CREATE*/ /*!50017 DEFINER=`root`@`%`*/ /*!50003 TRIGGER physical_audit_logs_before_insert_meta
  1595. BEFORE INSERT ON physical_audit_logs
  1596. FOR EACH ROW
  1597. BEGIN
  1598. IF NEW.audited_by IS NULL OR NEW.audited_by = 0 THEN
  1599. SET NEW.audited_by = COALESCE(@current_user_id, 1);
  1600. END IF;
  1601. END */;;
  1602. DELIMITER ;
  1603. /*!50003 SET sql_mode = @saved_sql_mode */ ;
  1604. /*!50003 SET character_set_client = @saved_cs_client */ ;
  1605. /*!50003 SET character_set_results = @saved_cs_results */ ;
  1606. /*!50003 SET collation_connection = @saved_col_connection */ ;
  1607. /*!50003 SET @saved_cs_client = @@character_set_client */ ;
  1608. /*!50003 SET @saved_cs_results = @@character_set_results */ ;
  1609. /*!50003 SET @saved_col_connection = @@collation_connection */ ;
  1610. /*!50003 SET character_set_client = utf8mb4 */ ;
  1611. /*!50003 SET character_set_results = utf8mb4 */ ;
  1612. /*!50003 SET collation_connection = utf8mb4_0900_ai_ci */ ;
  1613. /*!50003 SET @saved_sql_mode = @@sql_mode */ ;
  1614. /*!50003 SET sql_mode = 'STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' */ ;
  1615. DELIMITER ;;
  1616. /*!50003 CREATE*/ /*!50017 DEFINER=`root`@`%`*/ /*!50003 TRIGGER update_assets_found
  1617. AFTER INSERT ON physical_audit_logs
  1618. FOR EACH ROW
  1619. BEGIN
  1620. UPDATE physical_audits
  1621. SET assets_found = assets_found + 1
  1622. WHERE id = NEW.physical_audit_id;
  1623. END */;;
  1624. DELIMITER ;
  1625. /*!50003 SET sql_mode = @saved_sql_mode */ ;
  1626. /*!50003 SET character_set_client = @saved_cs_client */ ;
  1627. /*!50003 SET character_set_results = @saved_cs_results */ ;
  1628. /*!50003 SET collation_connection = @saved_col_connection */ ;
  1629. /*!50003 SET @saved_cs_client = @@character_set_client */ ;
  1630. /*!50003 SET @saved_cs_results = @@character_set_results */ ;
  1631. /*!50003 SET @saved_col_connection = @@collation_connection */ ;
  1632. /*!50003 SET character_set_client = utf8mb4 */ ;
  1633. /*!50003 SET character_set_results = utf8mb4 */ ;
  1634. /*!50003 SET collation_connection = utf8mb4_0900_ai_ci */ ;
  1635. /*!50003 SET @saved_sql_mode = @@sql_mode */ ;
  1636. /*!50003 SET sql_mode = 'STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' */ ;
  1637. DELIMITER ;;
  1638. /*!50003 CREATE*/ /*!50017 DEFINER=`root`@`%`*/ /*!50003 TRIGGER update_asset_from_audit
  1639. AFTER INSERT ON physical_audit_logs
  1640. FOR EACH ROW
  1641. BEGIN
  1642. DECLARE current_status VARCHAR(100);
  1643. UPDATE assets
  1644. SET last_audit = DATE(NEW.audit_date),
  1645. last_audit_status = NEW.status_found
  1646. WHERE id = NEW.asset_id;
  1647. SELECT status INTO current_status FROM assets WHERE id = NEW.asset_id LIMIT 1;
  1648. IF NEW.status_found != current_status THEN
  1649. UPDATE assets
  1650. SET status = NEW.status_found
  1651. WHERE id = NEW.asset_id;
  1652. END IF;
  1653. END */;;
  1654. DELIMITER ;
  1655. /*!50003 SET sql_mode = @saved_sql_mode */ ;
  1656. /*!50003 SET character_set_client = @saved_cs_client */ ;
  1657. /*!50003 SET character_set_results = @saved_cs_results */ ;
  1658. /*!50003 SET collation_connection = @saved_col_connection */ ;
  1659. DROP TABLE IF EXISTS `physical_audits`;
  1660. /*!40101 SET @saved_cs_client = @@character_set_client */;
  1661. /*!50503 SET character_set_client = utf8mb4 */;
  1662. CREATE TABLE `physical_audits` (
  1663. `id` int(11) NOT NULL AUTO_INCREMENT,
  1664. `audit_type` enum('full-zone','spot-check') NOT NULL,
  1665. `zone_id` int(11) DEFAULT NULL COMMENT 'Zone being audited (NULL for spot-check audits)',
  1666. `audit_name` varchar(255) DEFAULT NULL COMMENT 'Custom name for the audit session',
  1667. `started_by` int(11) NOT NULL,
  1668. `started_at` datetime NOT NULL DEFAULT current_timestamp(),
  1669. `completed_at` datetime DEFAULT NULL,
  1670. `status` enum('in-progress','all-good','timeout','attention','cancelled') DEFAULT 'in-progress',
  1671. `timeout_minutes` int(11) DEFAULT NULL COMMENT 'Timeout setting used for this audit',
  1672. `issues_found` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'Array of issues: missing_assets, moved_assets, damaged_assets, etc.' CHECK (json_valid(`issues_found`)),
  1673. `assets_expected` int(11) DEFAULT NULL COMMENT 'Total assets expected to be found in zone',
  1674. `assets_found` int(11) DEFAULT 0 COMMENT 'Total assets actually found and scanned',
  1675. `notes` text DEFAULT NULL,
  1676. `cancelled_reason` text DEFAULT NULL,
  1677. PRIMARY KEY (`id`),
  1678. KEY `idx_audit_type` (`audit_type`),
  1679. KEY `idx_zone` (`zone_id`),
  1680. KEY `idx_status` (`status`),
  1681. KEY `idx_started_at` (`started_at`),
  1682. KEY `idx_started_by` (`started_by`),
  1683. CONSTRAINT `physical_audits_ibfk_1` FOREIGN KEY (`zone_id`) REFERENCES `zones` (`id`),
  1684. CONSTRAINT `physical_audits_ibfk_2` FOREIGN KEY (`started_by`) REFERENCES `users` (`id`)
  1685. ) ENGINE=InnoDB AUTO_INCREMENT=33 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci;
  1686. /*!40101 SET character_set_client = @saved_cs_client */;
  1687. LOCK TABLES `physical_audits` WRITE;
  1688. /*!40000 ALTER TABLE `physical_audits` DISABLE KEYS */;
  1689. INSERT INTO `physical_audits` VALUES (3,'spot-check',NULL,NULL,2,'2025-10-20 11:44:07','2025-10-13 18:35:00','attention',NULL,NULL,NULL,1,NULL,NULL),(4,'spot-check',NULL,NULL,2,'2025-10-20 11:44:09','2025-10-13 18:40:00','attention',NULL,NULL,NULL,1,NULL,NULL),(5,'spot-check',NULL,NULL,2,'2025-10-20 11:44:10','2025-10-13 19:00:00','attention',NULL,NULL,NULL,1,NULL,NULL),(6,'spot-check',NULL,NULL,2,'2025-10-20 11:44:11','2025-10-13 19:05:00','all-good',NULL,NULL,NULL,1,NULL,NULL),(7,'full-zone',11,'Zone Buero IT und so Audit',1,'2025-11-14 22:42:27','2025-11-14 22:42:56','all-good',60,NULL,4,6,NULL,NULL),(8,'spot-check',NULL,'Spot Check 2025-11-14 22:44',1,'2025-11-14 22:44:13','2025-11-14 22:44:39','attention',NULL,'{\"exceptions\":[{\"asset_id\":38,\"asset_tag\":\"ps39-mon-108-01\",\"details\":null,\"name\":\"Dell Monitor\",\"type\":\"spot-check\"}],\"unexpected_assets\":[{\"asset_id\":38,\"asset_tag\":\"ps39-mon-108-01\",\"name\":\"Dell Monitor\",\"status\":\"Good\"}]}',0,0,NULL,NULL),(9,'full-zone',11,'Zone Buero IT und so Audit',1,'2025-11-14 22:57:14','2025-11-14 22:57:47','cancelled',60,NULL,4,4,NULL,'Audit cancelled for zone Buero IT und so at 2025-11-14 22:57:47'),(10,'full-zone',11,'Zone Buero IT und so Audit',1,'2025-11-14 23:06:24','2025-11-14 23:08:21','all-good',60,NULL,4,7,NULL,NULL),(11,'spot-check',NULL,'Spot Check 2025-11-14 23:08',1,'2025-11-14 23:08:59','2025-11-14 23:09:04','cancelled',NULL,NULL,0,0,NULL,'Spot check cancelled at 2025-11-14 23:09:04'),(12,'full-zone',11,'Zone Buero IT und so Audit',1,'2025-11-14 23:09:25','2025-11-14 23:10:15','attention',60,'{\"exceptions\":[{\"asset_id\":26,\"asset_tag\":\"cbl-hdmi-002\",\"details\":\"Marked missing during audit\",\"name\":\"Floating HDMI Cables\",\"type\":\"other\"}],\"missing_assets\":[{\"asset_id\":26,\"asset_tag\":\"cbl-hdmi-002\",\"name\":\"Floating HDMI Cables\"}]}',4,6,NULL,NULL),(13,'full-zone',11,'Zone Buero IT und so Audit',1,'2025-11-14 23:18:39','2025-11-14 23:19:06','all-good',60,NULL,3,6,NULL,NULL),(14,'full-zone',11,'Zone Buero IT und so Audit',1,'2025-11-14 23:24:56','2025-11-14 23:25:16','all-good',60,NULL,4,6,NULL,NULL),(15,'full-zone',11,'Zone Buero IT und so Audit',1,'2025-11-14 23:28:48','2025-11-14 23:29:06','all-good',60,NULL,4,6,NULL,NULL),(16,'full-zone',11,'Zone Buero IT und so Audit',1,'2025-11-14 23:30:47','2025-11-14 23:31:01','all-good',60,NULL,4,6,NULL,NULL),(17,'full-zone',11,'Zone Buero IT und so Audit',1,'2025-11-15 01:18:44','2025-11-15 01:19:04','cancelled',60,NULL,4,1,NULL,'Audit cancelled for zone Buero IT und so at 2025-11-15 01:19:04'),(18,'full-zone',11,'Zone Buero IT und so Audit',1,'2025-11-15 01:28:49','2025-11-15 01:29:14','all-good',60,NULL,4,6,NULL,NULL),(19,'full-zone',11,'Zone Buero IT und so Audit',1,'2025-11-15 12:23:36','2025-11-15 12:24:35','cancelled',60,NULL,4,1,NULL,'Audit cancelled for zone Buero IT und so at 2025-11-15 12:24:35'),(20,'full-zone',11,'Zone Buero IT und so Audit',1,'2025-11-15 12:25:00','2025-11-15 12:25:16','cancelled',60,NULL,4,1,NULL,'Audit cancelled for zone Buero IT und so at 2025-11-15 12:25:16'),(21,'full-zone',11,'Zone Buero IT und so Audit',1,'2025-11-15 12:25:49','2025-11-15 12:26:04','cancelled',60,NULL,4,1,NULL,'Audit cancelled for zone Buero IT und so at 2025-11-15 12:26:04'),(22,'full-zone',11,'Zone Buero IT und so Audit',1,'2025-11-15 12:27:57','2025-11-15 12:28:06','cancelled',60,NULL,4,1,NULL,'Audit cancelled for zone Buero IT und so at 2025-11-15 12:28:06'),(23,'full-zone',11,'Zone Buero IT und so Audit',1,'2025-12-03 15:54:18','2025-12-03 15:55:10','attention',60,'{\"attention_assets\":[{\"asset_id\":38,\"asset_tag\":\"ps39-mon-108-01\",\"name\":\"Dell Monitor\",\"status\":\"Faulty\"}],\"exceptions\":[{\"asset_id\":39,\"asset_tag\":\"ps39-mon-108-02\",\"details\":\"Marked missing during audit\",\"name\":\"Dell Monitor\",\"type\":\"other\"}],\"missing_assets\":[{\"asset_id\":39,\"asset_tag\":\"ps39-mon-108-02\",\"name\":\"Dell Monitor\"}]}',4,5,NULL,NULL),(24,'full-zone',11,'Zone Buero IT und so Audit',1,'2025-12-08 10:58:41','2025-12-08 11:00:50','attention',60,'{\"exceptions\":[{\"asset_id\":38,\"asset_tag\":\"ps39-mon-108-01\",\"details\":\"Marked missing during audit\",\"name\":\"Dell Monitor\",\"type\":\"other\"}],\"missing_assets\":[{\"asset_id\":38,\"asset_tag\":\"ps39-mon-108-01\",\"name\":\"Dell Monitor\"}]}',3,5,NULL,NULL),(25,'full-zone',11,'Zone Buero IT und so Audit',1,'2025-12-08 11:07:50','2025-12-08 11:08:13','attention',60,'{\"attention_assets\":[{\"asset_id\":38,\"asset_tag\":\"ps39-mon-108-01\",\"name\":\"Dell Monitor\",\"status\":\"Attention\"}],\"exceptions\":[{\"asset_id\":39,\"asset_tag\":\"ps39-mon-108-02\",\"details\":\"Marked missing during audit\",\"name\":\"Dell Monitor\",\"type\":\"other\"},{\"asset_id\":26,\"asset_tag\":\"cbl-hdmi-002\",\"details\":\"Marked missing during audit\",\"name\":\"Floating HDMI Cables\",\"type\":\"other\"}],\"missing_assets\":[{\"asset_id\":39,\"asset_tag\":\"ps39-mon-108-02\",\"name\":\"Dell Monitor\"}]}',3,5,NULL,NULL),(26,'spot-check',NULL,'Spot Check 2025-12-21 23:39',1,'2025-12-21 23:39:49','2025-12-21 23:39:52','cancelled',NULL,NULL,0,0,NULL,'Spot check cancelled at 2025-12-21 23:39:52'),(27,'full-zone',11,'Zone Buero IT und so Audit',1,'2025-12-21 23:41:04','2025-12-21 23:41:41','cancelled',60,NULL,3,1,NULL,'Audit cancelled for zone Buero IT und so at 2025-12-21 23:41:41'),(28,'full-zone',9,'Zone Plattenstrasse 39 Audit',1,'2025-12-22 00:31:39','2025-12-22 00:31:43','cancelled',120,NULL,0,0,NULL,'Audit cancelled for zone Plattenstrasse 39 at 2025-12-22 00:31:43'),(29,'full-zone',11,'Zone Buero IT und so Audit',1,'2025-12-22 00:45:34','2025-12-22 00:45:37','cancelled',60,NULL,3,1,NULL,'Audit cancelled for zone Buero IT und so at 2025-12-22 00:45:37'),(30,'full-zone',11,'Zone Buero IT und so Audit',1,'2025-12-22 00:58:32','2025-12-22 01:00:29','all-good',60,NULL,5,8,NULL,NULL),(31,'full-zone',13,'Zone Server Raum Audit',1,'2025-12-22 01:09:02','2025-12-22 01:09:30','all-good',60,NULL,1,2,NULL,NULL),(32,'full-zone',12,'Zone Ausleihschrank Audit',1,'2025-12-22 01:25:26','2025-12-22 01:25:33','cancelled',60,NULL,0,0,NULL,'Audit cancelled for zone Ausleihschrank at 2025-12-22 01:25:33');
  1690. /*!40000 ALTER TABLE `physical_audits` ENABLE KEYS */;
  1691. UNLOCK TABLES;
  1692. /*!50003 SET @saved_cs_client = @@character_set_client */ ;
  1693. /*!50003 SET @saved_cs_results = @@character_set_results */ ;
  1694. /*!50003 SET @saved_col_connection = @@collation_connection */ ;
  1695. /*!50003 SET character_set_client = utf8mb4 */ ;
  1696. /*!50003 SET character_set_results = utf8mb4 */ ;
  1697. /*!50003 SET collation_connection = utf8mb4_0900_ai_ci */ ;
  1698. /*!50003 SET @saved_sql_mode = @@sql_mode */ ;
  1699. /*!50003 SET sql_mode = 'STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' */ ;
  1700. DELIMITER ;;
  1701. /*!50003 CREATE*/ /*!50017 DEFINER=`root`@`%`*/ /*!50003 TRIGGER calculate_assets_expected
  1702. BEFORE INSERT ON physical_audits
  1703. FOR EACH ROW
  1704. BEGIN
  1705. DECLARE expected_count INT DEFAULT 0;
  1706. DECLARE v_timeout INT;
  1707. IF NEW.audit_type = 'full-zone' AND NEW.zone_id IS NOT NULL THEN
  1708. SELECT COUNT(*) INTO expected_count
  1709. FROM assets
  1710. WHERE zone_id = NEW.zone_id
  1711. AND status NOT IN ('Missing', 'Retired');
  1712. SET NEW.assets_expected = expected_count;
  1713. END IF;
  1714. IF NEW.timeout_minutes IS NULL AND NEW.zone_id IS NOT NULL THEN
  1715. SELECT audit_timeout_minutes INTO v_timeout
  1716. FROM zones
  1717. WHERE id = NEW.zone_id
  1718. LIMIT 1;
  1719. IF v_timeout IS NOT NULL THEN
  1720. SET NEW.timeout_minutes = v_timeout;
  1721. END IF;
  1722. END IF;
  1723. END */;;
  1724. DELIMITER ;
  1725. /*!50003 SET sql_mode = @saved_sql_mode */ ;
  1726. /*!50003 SET character_set_client = @saved_cs_client */ ;
  1727. /*!50003 SET character_set_results = @saved_cs_results */ ;
  1728. /*!50003 SET collation_connection = @saved_col_connection */ ;
  1729. /*!50003 SET @saved_cs_client = @@character_set_client */ ;
  1730. /*!50003 SET @saved_cs_results = @@character_set_results */ ;
  1731. /*!50003 SET @saved_col_connection = @@collation_connection */ ;
  1732. /*!50003 SET character_set_client = utf8mb4 */ ;
  1733. /*!50003 SET character_set_results = utf8mb4 */ ;
  1734. /*!50003 SET collation_connection = utf8mb4_0900_ai_ci */ ;
  1735. /*!50003 SET @saved_sql_mode = @@sql_mode */ ;
  1736. /*!50003 SET sql_mode = 'STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' */ ;
  1737. DELIMITER ;;
  1738. /*!50003 CREATE*/ /*!50017 DEFINER=`root`@`%`*/ /*!50003 TRIGGER auto_detect_audit_issues
  1739. AFTER UPDATE ON physical_audits
  1740. FOR EACH ROW
  1741. BEGIN
  1742. DECLARE missing_count INT DEFAULT 0;
  1743. DECLARE zone_name VARCHAR(200);
  1744. IF OLD.status = 'in-progress' AND NEW.status IN ('all-good', 'attention', 'timeout') THEN
  1745. IF NEW.zone_id IS NOT NULL THEN
  1746. SELECT zone_name INTO zone_name FROM zones WHERE id = NEW.zone_id;
  1747. END IF;
  1748. IF NEW.audit_type = 'full-zone' AND NEW.assets_expected IS NOT NULL THEN
  1749. SET missing_count = GREATEST(0, NEW.assets_expected - NEW.assets_found);
  1750. END IF;
  1751. IF missing_count > 0 THEN
  1752. INSERT INTO issue_tracker (
  1753. issue_type, title, description, severity, priority, status,
  1754. reported_by, auto_detected, detection_trigger, created_date, notes
  1755. )
  1756. VALUES (
  1757. 'System Issue',
  1758. CONCAT('Audit: Missing Assets in ', COALESCE(zone_name, 'Unknown Zone')),
  1759. CONCAT('Full zone audit completed with ', missing_count, ' missing assets. Expected: ', NEW.assets_expected, ', Found: ', NEW.assets_found, '. Audit ID: ', NEW.id),
  1760. CASE WHEN missing_count >= 5 THEN 'Critical' WHEN missing_count >= 2 THEN 'High' ELSE 'Medium' END,
  1761. 'High', 'Open',
  1762. NEW.started_by, TRUE, 'AUDIT_MISSING_ASSETS', NOW(),
  1763. CONCAT('Physical Audit ID: ', NEW.id, ' in zone: ', COALESCE(zone_name, NEW.zone_id))
  1764. );
  1765. END IF;
  1766. END IF;
  1767. END */;;
  1768. DELIMITER ;
  1769. /*!50003 SET sql_mode = @saved_sql_mode */ ;
  1770. /*!50003 SET character_set_client = @saved_cs_client */ ;
  1771. /*!50003 SET character_set_results = @saved_cs_results */ ;
  1772. /*!50003 SET collation_connection = @saved_col_connection */ ;
  1773. DROP TABLE IF EXISTS `print_history`;
  1774. /*!40101 SET @saved_cs_client = @@character_set_client */;
  1775. /*!50503 SET character_set_client = utf8mb4 */;
  1776. CREATE TABLE `print_history` (
  1777. `id` int(11) NOT NULL AUTO_INCREMENT,
  1778. `entity_type` enum('Asset','Template','Borrower','Zone','Report','Custom') NOT NULL,
  1779. `entity_id` int(11) DEFAULT NULL COMMENT 'ID of the asset/template/borrower/zone (NULL for reports)',
  1780. `label_template_id` int(11) DEFAULT NULL,
  1781. `printer_id` int(11) DEFAULT NULL,
  1782. `quantity` int(11) DEFAULT 1,
  1783. `print_status` enum('Success','Failed','Cancelled','Queued') NOT NULL,
  1784. `error_message` text DEFAULT NULL,
  1785. `rendered_data` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'The actual data that was sent to printer (for debugging)' CHECK (json_valid(`rendered_data`)),
  1786. `printed_at` timestamp NULL DEFAULT current_timestamp(),
  1787. `printed_by` int(11) DEFAULT NULL,
  1788. PRIMARY KEY (`id`),
  1789. KEY `label_template_id` (`label_template_id`),
  1790. KEY `idx_entity` (`entity_type`,`entity_id`),
  1791. KEY `idx_printed_at` (`printed_at`),
  1792. KEY `idx_printed_by` (`printed_by`),
  1793. KEY `idx_printer` (`printer_id`),
  1794. KEY `idx_status` (`print_status`),
  1795. CONSTRAINT `print_history_ibfk_1` FOREIGN KEY (`label_template_id`) REFERENCES `label_templates` (`id`) ON DELETE SET NULL,
  1796. CONSTRAINT `print_history_ibfk_2` FOREIGN KEY (`printer_id`) REFERENCES `printer_settings` (`id`) ON DELETE SET NULL,
  1797. CONSTRAINT `print_history_ibfk_3` FOREIGN KEY (`printed_by`) REFERENCES `users` (`id`) ON DELETE SET NULL
  1798. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci;
  1799. /*!40101 SET character_set_client = @saved_cs_client */;
  1800. LOCK TABLES `print_history` WRITE;
  1801. /*!40000 ALTER TABLE `print_history` DISABLE KEYS */;
  1802. /*!40000 ALTER TABLE `print_history` ENABLE KEYS */;
  1803. UNLOCK TABLES;
  1804. DROP TABLE IF EXISTS `printer_settings`;
  1805. /*!40101 SET @saved_cs_client = @@character_set_client */;
  1806. /*!50503 SET character_set_client = utf8mb4 */;
  1807. CREATE TABLE `printer_settings` (
  1808. `id` int(11) NOT NULL AUTO_INCREMENT,
  1809. `printer_name` varchar(200) NOT NULL,
  1810. `description` text DEFAULT NULL,
  1811. `log` tinyint(1) DEFAULT 1 COMMENT 'Log all print jobs to this printer',
  1812. `can_be_used_for_reports` tinyint(1) DEFAULT 0 COMMENT 'Can this printer be used for printing reports',
  1813. `min_powerlevel_to_use` int(11) NOT NULL DEFAULT 75 COMMENT 'Minimum role power level required to use this printer',
  1814. `printer_plugin` enum('Ptouch','Brother','Zebra','System','PDF','Network','Custom') NOT NULL COMMENT 'Which printer plugin the client should send printer_settings to',
  1815. `printer_settings` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT 'Printer-specific settings: connection, paper size, DPI, margins, etc.' CHECK (json_valid(`printer_settings`)),
  1816. `created_at` timestamp NULL DEFAULT current_timestamp(),
  1817. `created_by` int(11) DEFAULT NULL,
  1818. `last_modified_at` timestamp NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
  1819. `last_modified_by` int(11) DEFAULT NULL,
  1820. PRIMARY KEY (`id`),
  1821. KEY `created_by` (`created_by`),
  1822. KEY `last_modified_by` (`last_modified_by`),
  1823. KEY `idx_printer_name` (`printer_name`),
  1824. KEY `idx_printer_plugin` (`printer_plugin`),
  1825. KEY `idx_min_powerlevel` (`min_powerlevel_to_use`),
  1826. KEY `idx_can_reports` (`can_be_used_for_reports`),
  1827. CONSTRAINT `printer_settings_ibfk_1` FOREIGN KEY (`created_by`) REFERENCES `users` (`id`) ON DELETE SET NULL,
  1828. CONSTRAINT `printer_settings_ibfk_2` FOREIGN KEY (`last_modified_by`) REFERENCES `users` (`id`) ON DELETE SET NULL,
  1829. CONSTRAINT `CONSTRAINT_1` CHECK (`min_powerlevel_to_use` >= 1 and `min_powerlevel_to_use` <= 100)
  1830. ) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci;
  1831. /*!40101 SET character_set_client = @saved_cs_client */;
  1832. LOCK TABLES `printer_settings` WRITE;
  1833. /*!40000 ALTER TABLE `printer_settings` DISABLE KEYS */;
  1834. INSERT INTO `printer_settings` VALUES (1,'PDF Export','Export labels as PDF files for manual printing',1,1,1,'PDF','{\n \"output_path\": \"/tmp/beepzone_labels/\",\n \"paper_size\": \"A4\",\n \"dpi\": 300,\n \"color_mode\": \"color\",\n \"auto_open\": false,\n \"filename_pattern\": \"label_{{entity_type}}_{{entity_id}}_{{timestamp}}.pdf\"\n}','2025-11-07 17:35:20',NULL,'2025-11-07 17:35:20',NULL),(2,'Brother P-Touch Label Printer','Standard Brother label printer',1,0,25,'Ptouch','{\n \"connection_type\": \"USB\",\n \"device_path\": \"/dev/usb/lp0\",\n \"tape_widths\": [\"6mm\", \"9mm\", \"12mm\", \"18mm\", \"24mm\"],\n \"default_tape_width\": \"12mm\",\n \"print_quality\": \"normal\",\n \"auto_cut\": true\n}','2025-11-07 17:35:20',NULL,'2025-11-07 17:35:20',NULL),(4,'System_ZQ510_2x3inch','Zebra ZQ510 Hooked Up via USB to Computer',0,0,75,'System','{\"auto_scale\":false,\"center\":\"both\",\"center_disabled\":true,\"color\":false,\"copies\":1,\"custom_height_mm\":76.2,\"custom_width_mm\":50.8,\"duplex\":false,\"margins\":{\"bottom\":5.0,\"left\":5.0,\"right\":5.0,\"top\":5.0},\"orientation\":\"landscape\",\"paper_size\":\"Custom\",\"printer_name\":\"ZQ510\",\"quality\":\"high\",\"scale\":1.0,\"show_dialog_if_unfound\":true}','2025-11-09 12:01:22',NULL,'2025-12-11 11:39:06',NULL),(5,'Laser Printer at home','Thierrys laser printer at home lol',0,1,75,'System','{\"auto_scale\":false,\"center\":\"both\",\"center_disabled\":true,\"color\":true,\"compatibility_mode\":true,\"copies\":1,\"custom_height_mm\":null,\"custom_width_mm\":null,\"duplex\":false,\"margins\":{\"bottom\":20.0,\"left\":20.0,\"right\":20.0,\"top\":20.0},\"orientation\":\"landscape\",\"paper_size\":\"A4\",\"printer_name\":\"ps450-print-105-01\",\"quality\":\"high\",\"scale\":1.0,\"show_dialog_if_unfound\":true}','2025-11-09 20:22:24',NULL,'2025-12-11 12:47:11',NULL),(6,'System_TD-4550D-4xXinch','Brother TD-4550D Printer Hooked up via USB',0,0,75,'System','{\"auto_scale\":false,\"center\":\"both\",\"center_disabled\":false,\"color\":false,\"copies\":1,\"custom_height_mm\":50,\"custom_width_mm\":103,\"duplex\":false,\"margins\":{\"bottom\":5.0,\"left\":5.0,\"right\":5.0,\"top\":5.0},\"orientation\":\"portrait\",\"paper_size\":\"Custom\",\"printer_name\":\"Brother TD-4550DNWB\",\"quality\":\"high\",\"scale\":1.0,\"show_dialog_if_unfound\":true}','2025-12-11 10:14:21',NULL,'2025-12-11 11:25:09',NULL),(7,'System_TD-4550D-Landscapetest','Brother TD-4550D Printer Hooked up via USB but using Extremle Large Landscape Labels',0,0,75,'System','{\"auto_scale\":false,\"center\":\"both\",\"center_disabled\":false,\"color\":false,\"copies\":1,\"custom_height_mm\":200,\"custom_width_mm\":103,\"duplex\":false,\"margins\":{\"bottom\":5.0,\"left\":5.0,\"right\":5.0,\"top\":5.0},\"orientation\":\"landscape\",\"paper_size\":\"Custom\",\"printer_name\":\"Brother TD-4550DNWB\",\"quality\":\"high\",\"scale\":1.0,\"show_dialog_if_unfound\":true}','2025-12-11 10:57:20',NULL,'2025-12-11 11:35:52',NULL),(8,'System_ZQ510_2x3-Portraittest','Zebra ZQ510 Hooked Up via USB to Computer',0,0,75,'System','{\"auto_scale\":false,\"center\":\"both\",\"center_disabled\":true,\"color\":false,\"copies\":1,\"custom_height_mm\":76.2,\"custom_width_mm\":50.8,\"duplex\":false,\"margins\":{\"bottom\":5.0,\"left\":5.0,\"right\":5.0,\"top\":5.0},\"orientation\":\"portrait\",\"paper_size\":\"Custom\",\"printer_name\":\"ZQ510\",\"quality\":\"high\",\"scale\":1.0,\"show_dialog_if_unfound\":true}','2025-12-11 11:54:23',NULL,'2025-12-11 11:54:23',NULL);
  1835. /*!40000 ALTER TABLE `printer_settings` ENABLE KEYS */;
  1836. UNLOCK TABLES;
  1837. DROP TABLE IF EXISTS `roles`;
  1838. /*!40101 SET @saved_cs_client = @@character_set_client */;
  1839. /*!50503 SET character_set_client = utf8mb4 */;
  1840. CREATE TABLE `roles` (
  1841. `id` int(11) NOT NULL AUTO_INCREMENT,
  1842. `name` varchar(100) NOT NULL,
  1843. `power` int(11) NOT NULL CHECK (`power` >= 1 and `power` <= 100),
  1844. `created_at` timestamp NULL DEFAULT current_timestamp(),
  1845. PRIMARY KEY (`id`),
  1846. UNIQUE KEY `name` (`name`)
  1847. ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci;
  1848. /*!40101 SET character_set_client = @saved_cs_client */;
  1849. LOCK TABLES `roles` WRITE;
  1850. /*!40000 ALTER TABLE `roles` DISABLE KEYS */;
  1851. INSERT INTO `roles` VALUES (1,'Administrator',100,'2025-10-20 11:43:38'),(2,'Manager',75,'2025-10-20 11:43:38'),(3,'Staff',50,'2025-10-20 11:43:38'),(4,'User',25,'2025-10-20 11:43:38');
  1852. /*!40000 ALTER TABLE `roles` ENABLE KEYS */;
  1853. UNLOCK TABLES;
  1854. DROP TABLE IF EXISTS `suppliers`;
  1855. /*!40101 SET @saved_cs_client = @@character_set_client */;
  1856. /*!50503 SET character_set_client = utf8mb4 */;
  1857. CREATE TABLE `suppliers` (
  1858. `id` int(11) NOT NULL AUTO_INCREMENT,
  1859. `name` varchar(200) NOT NULL,
  1860. `contact` varchar(200) DEFAULT NULL,
  1861. `email` varchar(255) DEFAULT NULL,
  1862. `phone` varchar(50) DEFAULT NULL,
  1863. `website` varchar(255) DEFAULT NULL,
  1864. `notes` text DEFAULT NULL,
  1865. `created_at` timestamp NULL DEFAULT current_timestamp(),
  1866. PRIMARY KEY (`id`)
  1867. ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci;
  1868. /*!40101 SET character_set_client = @saved_cs_client */;
  1869. LOCK TABLES `suppliers` WRITE;
  1870. /*!40000 ALTER TABLE `suppliers` DISABLE KEYS */;
  1871. INSERT INTO `suppliers` VALUES (1,'TechSupply Co','Sales Team','sales@techsupply.com','+1-555-0100',NULL,NULL,'2025-10-20 11:43:44'),(3,'Digitect',NULL,'support@digitec.ch',NULL,'https://digitec.ch/',NULL,'2025-11-14 21:31:48');
  1872. /*!40000 ALTER TABLE `suppliers` ENABLE KEYS */;
  1873. UNLOCK TABLES;
  1874. DROP TABLE IF EXISTS `templates`;
  1875. /*!40101 SET @saved_cs_client = @@character_set_client */;
  1876. /*!50503 SET character_set_client = utf8mb4 */;
  1877. CREATE TABLE `templates` (
  1878. `id` int(11) NOT NULL AUTO_INCREMENT,
  1879. `template_code` varchar(50) DEFAULT NULL,
  1880. `asset_tag_generation_string` varchar(500) DEFAULT NULL,
  1881. `description` text DEFAULT NULL,
  1882. `active` tinyint(1) DEFAULT 1,
  1883. `asset_type` enum('N','B','L','C') DEFAULT NULL,
  1884. `name` varchar(255) DEFAULT NULL,
  1885. `category_id` int(11) DEFAULT NULL,
  1886. `manufacturer` varchar(200) DEFAULT NULL,
  1887. `model` varchar(200) DEFAULT NULL,
  1888. `zone_id` int(11) DEFAULT NULL,
  1889. `zone_plus` enum('Floating Local','Floating Global','Clarify') DEFAULT NULL,
  1890. `zone_note` text DEFAULT NULL,
  1891. `status` enum('Good','Attention','Faulty','Missing','Retired','In Repair','In Transit','Expired','Unmanaged') DEFAULT NULL,
  1892. `price` decimal(12,2) DEFAULT NULL CHECK (`price` is null or `price` >= 0),
  1893. `purchase_date` date DEFAULT NULL COMMENT 'Default purchase date for assets created from this template',
  1894. `purchase_date_now` tinyint(1) DEFAULT 0 COMMENT 'Auto-set purchase date to current date when creating assets',
  1895. `warranty_until` date DEFAULT NULL,
  1896. `warranty_auto` tinyint(1) DEFAULT 0 COMMENT 'Auto-calculate warranty_until from purchase_date',
  1897. `warranty_auto_amount` int(11) DEFAULT NULL COMMENT 'Number of days/years for warranty calculation',
  1898. `warranty_auto_unit` enum('days','years') DEFAULT 'years' COMMENT 'Unit for warranty auto-calculation',
  1899. `expiry_date` date DEFAULT NULL,
  1900. `expiry_auto` tinyint(1) DEFAULT 0 COMMENT 'Auto-calculate expiry_date from purchase_date',
  1901. `expiry_auto_amount` int(11) DEFAULT NULL COMMENT 'Number of days/years for expiry calculation',
  1902. `expiry_auto_unit` enum('days','years') DEFAULT 'years' COMMENT 'Unit for expiry auto-calculation',
  1903. `quantity_total` int(11) DEFAULT NULL,
  1904. `quantity_used` int(11) DEFAULT NULL,
  1905. `supplier_id` int(11) DEFAULT NULL,
  1906. `lendable` tinyint(1) DEFAULT NULL,
  1907. `lending_status` enum('Available','Borrowed','Overdue','Deployed','Illegally Handed Out','Stolen') DEFAULT 'Available' COMMENT 'Default lending status for assets created from this template',
  1908. `minimum_role_for_lending` int(11) DEFAULT NULL,
  1909. `audit_task_id` int(11) DEFAULT NULL,
  1910. `label_template_id` int(11) DEFAULT NULL,
  1911. `no_scan` enum('Yes','Ask','No') DEFAULT NULL,
  1912. `notes` text DEFAULT NULL,
  1913. `additional_fields` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL CHECK (json_valid(`additional_fields`)),
  1914. `created_at` timestamp NULL DEFAULT current_timestamp(),
  1915. PRIMARY KEY (`id`),
  1916. UNIQUE KEY `template_code` (`template_code`),
  1917. KEY `category_id` (`category_id`),
  1918. KEY `zone_id` (`zone_id`),
  1919. KEY `supplier_id` (`supplier_id`),
  1920. KEY `audit_task_id` (`audit_task_id`),
  1921. KEY `idx_template_code` (`template_code`),
  1922. KEY `idx_label_template` (`label_template_id`),
  1923. KEY `idx_asset_tag_generation` (`asset_tag_generation_string`),
  1924. CONSTRAINT `fk_template_label_template` FOREIGN KEY (`label_template_id`) REFERENCES `label_templates` (`id`) ON DELETE SET NULL,
  1925. CONSTRAINT `templates_ibfk_1` FOREIGN KEY (`category_id`) REFERENCES `categories` (`id`) ON DELETE SET NULL,
  1926. CONSTRAINT `templates_ibfk_2` FOREIGN KEY (`zone_id`) REFERENCES `zones` (`id`) ON DELETE SET NULL,
  1927. CONSTRAINT `templates_ibfk_3` FOREIGN KEY (`supplier_id`) REFERENCES `suppliers` (`id`) ON DELETE SET NULL,
  1928. CONSTRAINT `templates_ibfk_4` FOREIGN KEY (`audit_task_id`) REFERENCES `audit_tasks` (`id`) ON DELETE SET NULL
  1929. ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci;
  1930. /*!40101 SET character_set_client = @saved_cs_client */;
  1931. LOCK TABLES `templates` WRITE;
  1932. /*!40000 ALTER TABLE `templates` DISABLE KEYS */;
  1933. INSERT INTO `templates` VALUES (1,'TEST',NULL,NULL,1,'N','Test',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,NULL,0,NULL,'years',NULL,0,NULL,'years',NULL,NULL,NULL,NULL,'Available',NULL,NULL,NULL,'No',NULL,NULL,'2025-11-10 00:54:59'),(2,'CTSBRR2','{BUILDINGCODE}-{CATEGORYCODE}-{FLOORCODE}{ROOMCODE}-{ZONEASC}','Cunt',1,'N','CTouch Smartboard Riva R2',7,'Cunt Touch','Riva R2',NULL,NULL,NULL,'Good',123123.00,NULL,1,NULL,1,2,'years',NULL,0,NULL,'years',NULL,NULL,1,NULL,'Available',NULL,NULL,5,'No',NULL,NULL,'2025-11-10 00:56:35'),(3,'hdmi','{CATEGORYCODE}-hdmi-{GLOBALASC}','Regular HDMI Cable 1-3 Meters',1,'N','Lendable HDMI Cable',9,NULL,NULL,11,NULL,NULL,'Good',20.00,NULL,1,NULL,0,NULL,'years',NULL,0,NULL,'years',NULL,NULL,NULL,1,'Available',NULL,NULL,5,'Yes',NULL,NULL,'2025-11-13 15:29:34'),(4,'mon','{BUILDINGCODE}-{CATEGORYCODE}-{FLOORCODE}{ROOMCODE}-{ZONEASC}','Generic Monitor',1,'N','Generic Monitor',10,NULL,NULL,NULL,NULL,NULL,'Good',NULL,NULL,1,NULL,1,2,'years',NULL,0,NULL,'years',NULL,NULL,NULL,0,NULL,NULL,NULL,7,'No',NULL,NULL,'2025-11-13 18:39:13');
  1934. /*!40000 ALTER TABLE `templates` ENABLE KEYS */;
  1935. UNLOCK TABLES;
  1936. DROP TABLE IF EXISTS `users`;
  1937. /*!40101 SET @saved_cs_client = @@character_set_client */;
  1938. /*!50503 SET character_set_client = utf8mb4 */;
  1939. CREATE TABLE `users` (
  1940. `id` int(11) NOT NULL AUTO_INCREMENT,
  1941. `name` varchar(200) NOT NULL,
  1942. `username` varchar(100) NOT NULL,
  1943. `password` varchar(255) NOT NULL,
  1944. `pin_code` varchar(8) DEFAULT NULL,
  1945. `login_string` varchar(255) DEFAULT NULL,
  1946. `role_id` int(11) NOT NULL,
  1947. `email` varchar(255) DEFAULT NULL,
  1948. `phone` varchar(50) DEFAULT NULL,
  1949. `notes` text DEFAULT NULL,
  1950. `active` tinyint(1) DEFAULT 1,
  1951. `last_login_date` datetime DEFAULT NULL,
  1952. `created_date` timestamp NULL DEFAULT current_timestamp(),
  1953. `password_reset_token` varchar(255) DEFAULT NULL,
  1954. `password_reset_expiry` datetime DEFAULT NULL,
  1955. `preferences` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'User personalization settings: common (all clients) + client-specific (web, mobile, desktop)' CHECK (json_valid(`preferences`)),
  1956. PRIMARY KEY (`id`),
  1957. UNIQUE KEY `username` (`username`),
  1958. KEY `role_id` (`role_id`),
  1959. KEY `idx_username` (`username`),
  1960. KEY `idx_login_string` (`login_string`),
  1961. CONSTRAINT `users_ibfk_1` FOREIGN KEY (`role_id`) REFERENCES `roles` (`id`)
  1962. ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci;
  1963. /*!40101 SET character_set_client = @saved_cs_client */;
  1964. LOCK TABLES `users` WRITE;
  1965. /*!40000 ALTER TABLE `users` DISABLE KEYS */;
  1966. INSERT INTO `users` VALUES (1,'Adminier','admin','$2a$12$gZiN2xX8ZdkmlInWIw/CM.OC76XnepAQLCHghCx9hKYSgdZdkxDjW',NULL,NULL,1,'admin@beepzone.local',NULL,NULL,1,'2025-12-22 03:41:42','2025-10-20 11:43:38',NULL,NULL,NULL),(2,'Sarah Manager','manager1','$2a$12$gZiN2xX8ZdkmlInWIw/CM.OC76XnepAQLCHghCx9hKYSgdZdkxDjW','1234','RFID_MGR_001',2,'manager@test.local',NULL,NULL,1,'2025-10-20 11:44:12','2025-10-20 11:43:39',NULL,NULL,NULL),(3,'John Staff','staff1','$2a$12$gZiN2xX8ZdkmlInWIw/CM.OC76XnepAQLCHghCx9hKYSgdZdkxDjW','5678','RFID_STAFF_001',3,'staff@test.local',NULL,NULL,1,'2025-12-22 04:02:57','2025-10-20 11:43:40',NULL,NULL,'{\"common\":{\"language\":\"fr\"},\"web\":{\"theme\":\"light\"}}'),(4,'Emily Student','student1','$2a$12$gZiN2xX8ZdkmlInWIw/CM.OC76XnepAQLCHghCx9hKYSgdZdkxDjW','9999','RFID_STUDENT_001',4,'student@test.local',NULL,NULL,1,'2025-12-22 03:42:33','2025-10-20 11:43:41',NULL,NULL,NULL);
  1967. /*!40000 ALTER TABLE `users` ENABLE KEYS */;
  1968. UNLOCK TABLES;
  1969. DROP TABLE IF EXISTS `zones`;
  1970. /*!40101 SET @saved_cs_client = @@character_set_client */;
  1971. /*!50503 SET character_set_client = utf8mb4 */;
  1972. CREATE TABLE `zones` (
  1973. `id` int(11) NOT NULL AUTO_INCREMENT,
  1974. `zone_name` varchar(200) NOT NULL,
  1975. `zone_notes` text DEFAULT NULL,
  1976. `zone_type` enum('Building','Floor','Room','Storage Area') NOT NULL,
  1977. `zone_code` varchar(50) DEFAULT NULL,
  1978. `mini_code` varchar(50) DEFAULT NULL,
  1979. `parent_id` int(11) DEFAULT NULL,
  1980. `include_in_parent` tinyint(1) DEFAULT 1,
  1981. `audit_timeout_minutes` int(11) DEFAULT 60 COMMENT 'Audit timeout in minutes for this zone',
  1982. PRIMARY KEY (`id`),
  1983. KEY `idx_parent` (`parent_id`),
  1984. KEY `idx_type` (`zone_type`),
  1985. CONSTRAINT `zones_ibfk_1` FOREIGN KEY (`parent_id`) REFERENCES `zones` (`id`)
  1986. ) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci;
  1987. /*!40101 SET character_set_client = @saved_cs_client */;
  1988. LOCK TABLES `zones` WRITE;
  1989. /*!40000 ALTER TABLE `zones` DISABLE KEYS */;
  1990. INSERT INTO `zones` VALUES (9,'Plattenstrasse 39',NULL,'Building','ps39','ps39',NULL,0,120),(10,'1st Floor',NULL,'Floor','PS39-1','1',9,1,60),(11,'Buero IT und so ',NULL,'Room','PS39-108','08',10,0,60),(12,'Ausleihschrank',NULL,'Storage Area','PS39-108AS','AS',11,1,60),(13,'Server Raum',NULL,'Room','ps39-109','09',10,1,60);
  1991. /*!40000 ALTER TABLE `zones` ENABLE KEYS */;
  1992. UNLOCK TABLES;
  1993. --
  1994. -- WARNING: can't read the INFORMATION_SCHEMA.libraries table. It's most probably an old server 12.1.2-MariaDB-ubu2404.
  1995. --
  1996. /*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
  1997. /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
  1998. /*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
  1999. /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
  2000. /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
  2001. /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
  2002. /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;