[{"data":1,"prerenderedAt":1704},["ShallowReactive",2],{"/docs/base/jobs-base/server-exports/vehicle-registry":3,"/docs/base/jobs-base/server-exports/vehicle-registry-surround":1690,"/docs/base/jobs-base/server-exports/vehicle-registry-implemented-suggestions":1703},{"id":4,"title":5,"body":6,"description":1679,"extension":1680,"head":1681,"implementedSuggestions":1681,"meta":1682,"navigation":1683,"path":1685,"schemaOrg":1681,"seo":1686,"sitemap":1687,"stem":1688,"__hash__":1689},"docs/1.docs/base/2.jobs-base/4.server-exports/4.vehicle-registry.md","Vehicle Registry",{"type":7,"value":8,"toc":1665},"minimark",[9,33,38,41,70,81,85,151,154,161,164,238,244,250,253,538,545,669,676,748,809,815,826,1035,1038,1071,1075,1082,1164,1181,1185,1200,1206,1212,1368,1374,1377,1448,1452,1651,1658,1661],[10,11,12,13,17,18,21,22,28,29,32],"p",{},"Use these integrations to check a vehicle in a garage, show its certificates in another police tablet, or log completed workshop paperwork. The shared registry powers ",[14,15,16],"strong",{},"Sky Mechanic Job"," and ",[14,19,20],{},"Sky Police Job",". All exports and events on this page belong to ",[14,23,24],{},[25,26,27],"code",{},"sky_jobs_base"," and run on the ",[14,30,31],{},"server",".",[34,35,37],"h2",{"id":36},"setup","Setup",[10,39,40],{},"Install a Jobs Base build containing the vehicle registry exports and start it before your integration:",[42,43,49],"pre",{"className":44,"code":45,"filename":46,"language":47,"meta":48,"style":48},"language-lua shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","dependency \"sky_jobs_base\"\n","fxmanifest.lua","lua","",[25,50,51],{"__ignoreMap":48},[52,53,56,60,64,67],"span",{"class":54,"line":55},"line",1,[52,57,59],{"class":58},"s2Zo4","dependency",[52,61,63],{"class":62},"sMK4o"," \"",[52,65,27],{"class":66},"sfazB",[52,68,69],{"class":62},"\"\n",[10,71,72,73,76,77,80],{},"Technical inspection and vehicle registration can each be enabled or disabled in the Mechanic Job Configurator (",[25,74,75],{},"/jobconfig","). Disabling a feature removes its status from query results. If both are disabled, status queries return ",[25,78,79],{},"feature_disabled",". These integrations use the existing registry tables and require no additional SQL migration.",[34,82,84],{"id":83},"server-exports","Server exports",[86,87,88,104],"table",{},[89,90,91],"thead",{},[92,93,94,98,101],"tr",{},[95,96,97],"th",{},"Export",[95,99,100],{},"Arguments",[95,102,103],{},"Use case",[105,106,107,121,136],"tbody",{},[92,108,109,115,118],{},[110,111,112],"td",{},[25,113,114],{},"GetVehicleRegistryFeatures",[110,116,117],{},"None",[110,119,120],{},"Check enabled features and service availability.",[92,122,123,128,133],{},[110,124,125],{},[25,126,127],{},"GetVehicleRegistryStatus",[110,129,130],{},[25,131,132],{},"plate",[110,134,135],{},"Check inspection and registration status without holder details or signatures.",[92,137,138,143,148],{},[110,139,140],{},[25,141,142],{},"GetVehicleRegistryDetail",[110,144,145],{},[25,146,147],{},"source, plate",[110,149,150],{},"Read certificates and signed history for an authorized mechanic or police player.",[10,152,153],{},"Call database-backed queries when a vehicle is selected or used, rather than every frame. The exports yield while waiting for database results; call them from a server thread, event handler, or callback.",[155,156,158],"h3",{"id":157},"getvehicleregistryfeatures",[25,159,160],{},"GetVehicleRegistryFeatures()",[10,162,163],{},"Returns a new snapshot of the current settings and availability. Changing this table does not change the server configuration.",[42,165,168],{"className":44,"code":166,"filename":167,"language":47,"meta":48,"style":48},"local registry = exports[\"sky_jobs_base\"]:GetVehicleRegistryFeatures()\n\n-- registry.available: boolean; the registry has finished initializing successfully\n-- registry.features.kuv: boolean; technical inspection is enabled\n-- registry.features.registration: boolean; vehicle registration is enabled\n-- registry.version: number; changes whenever registry configuration is applied\n-- registry.error: string or nil; reason the service is unavailable\n","server.lua",[25,169,170,200,207,214,220,226,232],{"__ignoreMap":48},[52,171,172,175,179,182,185,188,190,192,195,197],{"class":54,"line":55},[52,173,174],{"class":62},"local",[52,176,178],{"class":177},"sTEyZ"," registry ",[52,180,181],{"class":62},"=",[52,183,184],{"class":177}," exports[",[52,186,187],{"class":62},"\"",[52,189,27],{"class":66},[52,191,187],{"class":62},[52,193,194],{"class":177},"]:",[52,196,114],{"class":58},[52,198,199],{"class":177},"()\n",[52,201,203],{"class":54,"line":202},2,[52,204,206],{"emptyLinePlaceholder":205},true,"\n",[52,208,210],{"class":54,"line":209},3,[52,211,213],{"class":212},"sHwdD","-- registry.available: boolean; the registry has finished initializing successfully\n",[52,215,217],{"class":54,"line":216},4,[52,218,219],{"class":212},"-- registry.features.kuv: boolean; technical inspection is enabled\n",[52,221,223],{"class":54,"line":222},5,[52,224,225],{"class":212},"-- registry.features.registration: boolean; vehicle registration is enabled\n",[52,227,229],{"class":54,"line":228},6,[52,230,231],{"class":212},"-- registry.version: number; changes whenever registry configuration is applied\n",[52,233,235],{"class":54,"line":234},7,[52,236,237],{"class":212},"-- registry.error: string or nil; reason the service is unavailable\n",[10,239,240,243],{},[25,241,242],{},"available = true"," can also mean that both features are deliberately disabled. Read the feature switches before deciding whether your integration should require certificates.",[155,245,247],{"id":246},"getvehicleregistrystatusplate",[25,248,249],{},"GetVehicleRegistryStatus(plate)",[10,251,252],{},"Accepts a string plate. Surrounding whitespace is removed and letters are normalized to uppercase; internal spaces remain part of the plate. The plate must belong to an owned vehicle in the configured framework vehicle database. The vehicle does not need to be spawned or nearby for this read.",[42,254,256],{"className":44,"code":255,"filename":167,"language":47,"meta":48,"style":48},"local result = exports[\"sky_jobs_base\"]:GetVehicleRegistryStatus(\"SKY123\")\nif not result.success then\n    print((\"Vehicle registry query failed: %s\"):format(result.error))\n    return\nend\n\nlocal vehicle = result.data\nlocal inspection_ok = not vehicle.features.kuv\n    or vehicle.kuv.status == \"valid\"\n    or vehicle.kuv.status == \"due_soon\"\nlocal registration_ok = not vehicle.features.registration\n    or vehicle.registration.status == \"registered\"\n\nprint((\"Vehicle %s: inspection=%s, registration=%s\"):format(\n    vehicle.plate, tostring(inspection_ok), tostring(registration_ok)\n))\n",[25,257,258,292,311,341,346,351,355,369,392,418,440,461,484,489,511,533],{"__ignoreMap":48},[52,259,260,262,265,267,269,271,273,275,277,279,282,284,287,289],{"class":54,"line":55},[52,261,174],{"class":62},[52,263,264],{"class":177}," result ",[52,266,181],{"class":62},[52,268,184],{"class":177},[52,270,187],{"class":62},[52,272,27],{"class":66},[52,274,187],{"class":62},[52,276,194],{"class":177},[52,278,127],{"class":58},[52,280,281],{"class":177},"(",[52,283,187],{"class":62},[52,285,286],{"class":66},"SKY123",[52,288,187],{"class":62},[52,290,291],{"class":177},")\n",[52,293,294,298,301,304,308],{"class":54,"line":202},[52,295,297],{"class":296},"s7zQu","if",[52,299,300],{"class":62}," not",[52,302,303],{"class":177}," result.",[52,305,307],{"class":306},"sBMFI","success",[52,309,310],{"class":296}," then\n",[52,312,313,316,319,321,324,326,329,332,335,338],{"class":54,"line":209},[52,314,315],{"class":58},"    print",[52,317,318],{"class":177},"((",[52,320,187],{"class":62},[52,322,323],{"class":66},"Vehicle registry query failed: %s",[52,325,187],{"class":62},[52,327,328],{"class":177},"):",[52,330,331],{"class":58},"format",[52,333,334],{"class":177},"(result.",[52,336,337],{"class":306},"error",[52,339,340],{"class":177},"))\n",[52,342,343],{"class":54,"line":216},[52,344,345],{"class":296},"    return\n",[52,347,348],{"class":54,"line":222},[52,349,350],{"class":296},"end\n",[52,352,353],{"class":54,"line":228},[52,354,206],{"emptyLinePlaceholder":205},[52,356,357,359,362,364,366],{"class":54,"line":234},[52,358,174],{"class":62},[52,360,361],{"class":177}," vehicle ",[52,363,181],{"class":62},[52,365,303],{"class":177},[52,367,368],{"class":306},"data\n",[52,370,372,374,377,379,381,384,387,389],{"class":54,"line":371},8,[52,373,174],{"class":62},[52,375,376],{"class":177}," inspection_ok ",[52,378,181],{"class":62},[52,380,300],{"class":62},[52,382,383],{"class":177}," vehicle.",[52,385,386],{"class":306},"features",[52,388,32],{"class":177},[52,390,391],{"class":306},"kuv\n",[52,393,395,398,400,403,405,408,411,413,416],{"class":54,"line":394},9,[52,396,397],{"class":62},"    or",[52,399,383],{"class":177},[52,401,402],{"class":306},"kuv",[52,404,32],{"class":177},[52,406,407],{"class":306},"status",[52,409,410],{"class":62}," ==",[52,412,63],{"class":62},[52,414,415],{"class":66},"valid",[52,417,69],{"class":62},[52,419,421,423,425,427,429,431,433,435,438],{"class":54,"line":420},10,[52,422,397],{"class":62},[52,424,383],{"class":177},[52,426,402],{"class":306},[52,428,32],{"class":177},[52,430,407],{"class":306},[52,432,410],{"class":62},[52,434,63],{"class":62},[52,436,437],{"class":66},"due_soon",[52,439,69],{"class":62},[52,441,443,445,448,450,452,454,456,458],{"class":54,"line":442},11,[52,444,174],{"class":62},[52,446,447],{"class":177}," registration_ok ",[52,449,181],{"class":62},[52,451,300],{"class":62},[52,453,383],{"class":177},[52,455,386],{"class":306},[52,457,32],{"class":177},[52,459,460],{"class":306},"registration\n",[52,462,464,466,468,471,473,475,477,479,482],{"class":54,"line":463},12,[52,465,397],{"class":62},[52,467,383],{"class":177},[52,469,470],{"class":306},"registration",[52,472,32],{"class":177},[52,474,407],{"class":306},[52,476,410],{"class":62},[52,478,63],{"class":62},[52,480,481],{"class":66},"registered",[52,483,69],{"class":62},[52,485,487],{"class":54,"line":486},13,[52,488,206],{"emptyLinePlaceholder":205},[52,490,492,495,497,499,502,504,506,508],{"class":54,"line":491},14,[52,493,494],{"class":58},"print",[52,496,318],{"class":177},[52,498,187],{"class":62},[52,500,501],{"class":66},"Vehicle %s: inspection=%s, registration=%s",[52,503,187],{"class":62},[52,505,328],{"class":177},[52,507,331],{"class":58},[52,509,510],{"class":177},"(\n",[52,512,514,517,519,522,525,528,530],{"class":54,"line":513},15,[52,515,516],{"class":177},"    vehicle.",[52,518,132],{"class":306},[52,520,521],{"class":177},", ",[52,523,524],{"class":58},"tostring",[52,526,527],{"class":177},"(inspection_ok), ",[52,529,524],{"class":58},[52,531,532],{"class":177},"(registration_ok)\n",[52,534,536],{"class":54,"line":535},16,[52,537,340],{"class":177},[10,539,540,541,544],{},"Successful responses have ",[25,542,543],{},"{ success = true, data = ... }",":",[86,546,547,560],{},[89,548,549],{},[92,550,551,554,557],{},[95,552,553],{},"Field",[95,555,556],{},"Type",[95,558,559],{},"Description",[105,561,562,576,591,609,624,650],{},[92,563,564,568,573],{},[110,565,566],{},[25,567,132],{},[110,569,570],{},[25,571,572],{},"string",[110,574,575],{},"Normalized current plate.",[92,577,578,583,588],{},[110,579,580],{},[25,581,582],{},"vehicleId",[110,584,585],{},[25,586,587],{},"string?",[110,589,590],{},"Stable registry vehicle ID; absent if no registry identity has been assigned yet.",[92,592,593,597,601],{},[110,594,595],{},[25,596,386],{},[110,598,599],{},[25,600,86],{},[110,602,603,604,17,606,608],{},"Independent ",[25,605,402],{},[25,607,470],{}," switches.",[92,610,611,616,621],{},[110,612,613],{},[25,614,615],{},"version",[110,617,618],{},[25,619,620],{},"number",[110,622,623],{},"Registry configuration version used by this query.",[92,625,626,630,635],{},[110,627,628],{},[25,629,402],{},[110,631,632],{},[25,633,634],{},"table?",[110,636,637,638,640,641,521,644,521,647,32],{},"Enabled inspection: ",[25,639,407],{},", optional ",[25,642,643],{},"documentId",[25,645,646],{},"issuedAt",[25,648,649],{},"validUntil",[92,651,652,656,660],{},[110,653,654],{},[25,655,470],{},[110,657,658],{},[25,659,634],{},[110,661,662,663,640,665,521,667,32],{},"Enabled registration: ",[25,664,407],{},[25,666,643],{},[25,668,646],{},[10,670,671,672,675],{},"Times are Unix timestamps in ",[14,673,674],{},"seconds",". Status responses contain no holder names, player identifiers, notes, reports, or signatures. This export is for trusted server resources and does not require a mechanic or police player. An integration that exposes it to clients must authorize its own vehicle access.",[86,677,678,688],{},[89,679,680],{},[92,681,682,685],{},[95,683,684],{},"Inspection status",[95,686,687],{},"Meaning",[105,689,690,700,709,718,728,738],{},[92,691,692,697],{},[110,693,694],{},[25,695,696],{},"missing",[110,698,699],{},"No inspection has been issued.",[92,701,702,706],{},[110,703,704],{},[25,705,415],{},[110,707,708],{},"The inspection is current.",[92,710,711,715],{},[110,712,713],{},[25,714,437],{},[110,716,717],{},"Still valid, within the configured warning period.",[92,719,720,725],{},[110,721,722],{},[25,723,724],{},"expired",[110,726,727],{},"The validity deadline has been reached.",[92,729,730,735],{},[110,731,732],{},[25,733,734],{},"failed",[110,736,737],{},"The latest inspection failed.",[92,739,740,745],{},[110,741,742],{},[25,743,744],{},"revoked",[110,746,747],{},"The current inspection was revoked.",[86,749,750,759],{},[89,751,752],{},[92,753,754,757],{},[95,755,756],{},"Registration status",[95,758,687],{},[105,760,761,771,780,790,800],{},[92,762,763,768],{},[110,764,765],{},[25,766,767],{},"unregistered",[110,769,770],{},"No registration has been issued.",[92,772,773,777],{},[110,774,775],{},[25,776,481],{},[110,778,779],{},"Registered to the current framework owner.",[92,781,782,787],{},[110,783,784],{},[25,785,786],{},"transfer_required",[110,788,789],{},"Ownership changed after registration.",[92,791,792,797],{},[110,793,794],{},[25,795,796],{},"deregistered",[110,798,799],{},"The vehicle was deregistered.",[92,801,802,806],{},[110,803,804],{},[25,805,744],{},[110,807,808],{},"The registration was revoked.",[155,810,812],{"id":811},"getvehicleregistrydetailsource-plate",[25,813,814],{},"GetVehicleRegistryDetail(source, plate)",[10,816,817,818,821,822,825],{},"Reads the same authorized record used by the job tablets, including the latest certificates and up to ",[14,819,820],{},"30"," history entries. ",[25,823,824],{},"source"," is the requesting player's server ID, not a job name or persistent identifier. Pass the actual caller from your server handler.",[42,827,829],{"className":44,"code":828,"filename":167,"language":47,"meta":48,"style":48},"local record = exports[\"sky_jobs_base\"]:GetVehicleRegistryDetail(source, \"SKY123\")\nif not record.success then\n    print((\"Vehicle record unavailable: %s\"):format(record.error))\n    return\nend\n\nfor _, entry in ipairs(record.data.history) do\n    print(entry.kind, entry.occurredAt, entry.documentId)\n    if entry.consent then\n        print(\"Signed by:\", entry.consent.signerName)\n        print(\"Signed at:\", entry.consent.signedAt)\n    end\nend\n",[25,830,831,863,876,900,904,908,912,942,964,977,1002,1026,1031],{"__ignoreMap":48},[52,832,833,835,838,840,842,844,846,848,850,852,855,857,859,861],{"class":54,"line":55},[52,834,174],{"class":62},[52,836,837],{"class":177}," record ",[52,839,181],{"class":62},[52,841,184],{"class":177},[52,843,187],{"class":62},[52,845,27],{"class":66},[52,847,187],{"class":62},[52,849,194],{"class":177},[52,851,142],{"class":58},[52,853,854],{"class":177},"(source, ",[52,856,187],{"class":62},[52,858,286],{"class":66},[52,860,187],{"class":62},[52,862,291],{"class":177},[52,864,865,867,869,872,874],{"class":54,"line":202},[52,866,297],{"class":296},[52,868,300],{"class":62},[52,870,871],{"class":177}," record.",[52,873,307],{"class":306},[52,875,310],{"class":296},[52,877,878,880,882,884,887,889,891,893,896,898],{"class":54,"line":209},[52,879,315],{"class":58},[52,881,318],{"class":177},[52,883,187],{"class":62},[52,885,886],{"class":66},"Vehicle record unavailable: %s",[52,888,187],{"class":62},[52,890,328],{"class":177},[52,892,331],{"class":58},[52,894,895],{"class":177},"(record.",[52,897,337],{"class":306},[52,899,340],{"class":177},[52,901,902],{"class":54,"line":216},[52,903,345],{"class":296},[52,905,906],{"class":54,"line":222},[52,907,350],{"class":296},[52,909,910],{"class":54,"line":228},[52,911,206],{"emptyLinePlaceholder":205},[52,913,914,917,920,923,926,928,931,933,936,939],{"class":54,"line":234},[52,915,916],{"class":296},"for",[52,918,919],{"class":177}," _, entry ",[52,921,922],{"class":296},"in",[52,924,925],{"class":58}," ipairs",[52,927,895],{"class":177},[52,929,930],{"class":306},"data",[52,932,32],{"class":177},[52,934,935],{"class":306},"history",[52,937,938],{"class":177},") ",[52,940,941],{"class":296},"do\n",[52,943,944,946,949,952,955,958,960,962],{"class":54,"line":371},[52,945,315],{"class":58},[52,947,948],{"class":177},"(entry.",[52,950,951],{"class":306},"kind",[52,953,954],{"class":177},", entry.",[52,956,957],{"class":306},"occurredAt",[52,959,954],{"class":177},[52,961,643],{"class":306},[52,963,291],{"class":177},[52,965,966,969,972,975],{"class":54,"line":394},[52,967,968],{"class":296},"    if",[52,970,971],{"class":177}," entry.",[52,973,974],{"class":306},"consent",[52,976,310],{"class":296},[52,978,979,982,984,986,989,991,993,995,997,1000],{"class":54,"line":420},[52,980,981],{"class":58},"        print",[52,983,281],{"class":177},[52,985,187],{"class":62},[52,987,988],{"class":66},"Signed by:",[52,990,187],{"class":62},[52,992,954],{"class":177},[52,994,974],{"class":306},[52,996,32],{"class":177},[52,998,999],{"class":306},"signerName",[52,1001,291],{"class":177},[52,1003,1004,1006,1008,1010,1013,1015,1017,1019,1021,1024],{"class":54,"line":442},[52,1005,981],{"class":58},[52,1007,281],{"class":177},[52,1009,187],{"class":62},[52,1011,1012],{"class":66},"Signed at:",[52,1014,187],{"class":62},[52,1016,954],{"class":177},[52,1018,974],{"class":306},[52,1020,32],{"class":177},[52,1022,1023],{"class":306},"signedAt",[52,1025,291],{"class":177},[52,1027,1028],{"class":54,"line":463},[52,1029,1030],{"class":296},"    end\n",[52,1032,1033],{"class":54,"line":486},[52,1034,350],{"class":296},[10,1036,1037],{},"The server checks current job, duty, active organization and registry read permissions. Ordinary vehicle owners do not receive staff records through this export. Detailed inspection or registration rights also grant read access.",[10,1039,1040,1042,1043,521,1046,521,1049,521,1052,640,1055,17,1058,1060,1061,1063,1064,1067,1068,1070],{},[25,1041,930],{}," contains ",[25,1044,1045],{},"vehicle",[25,1047,1048],{},"context",[25,1050,1051],{},"summary",[25,1053,1054],{},"revision",[25,1056,1057],{},"inspection",[25,1059,470],{},", and ",[25,1062,935],{},". Signed certificates expose their document through ",[25,1065,1066],{},"snapshot.consent","; history entries expose ",[25,1069,974],{},". It includes the original declaration, operation title, plate, fee, verified signer, signing time and drawn signature. Older records can have no consent document. Invoice references in history remain restricted to staff with the relevant mechanic rights.",[155,1072,1074],{"id":1073},"errors","Errors",[10,1076,1077,1078,1081],{},"Status and detail failures return ",[25,1079,1080],{},"{ success = false, error = \"code\" }",". Never treat an unsuccessful query as proof of a valid certificate.",[86,1083,1084,1093],{},[89,1085,1086],{},[92,1087,1088,1091],{},[95,1089,1090],{},"Code",[95,1092,687],{},[105,1094,1095,1105,1115,1124,1134,1144,1154],{},[92,1096,1097,1102],{},[110,1098,1099],{},[25,1100,1101],{},"invalid_plate",[110,1103,1104],{},"Plate is empty, invalid, contains control characters, or exceeds 24 bytes.",[92,1106,1107,1112],{},[110,1108,1109],{},[25,1110,1111],{},"vehicle_not_found",[110,1113,1114],{},"No unique owned vehicle matches the plate.",[92,1116,1117,1121],{},[110,1118,1119],{},[25,1120,79],{},[110,1122,1123],{},"Both inspection and registration are disabled.",[92,1125,1126,1131],{},[110,1127,1128],{},[25,1129,1130],{},"invalid_request",[110,1132,1133],{},"Detail query has an invalid player source.",[92,1135,1136,1141],{},[110,1137,1138],{},[25,1139,1140],{},"not_authorized",[110,1142,1143],{},"Player lacks current registry access.",[92,1145,1146,1151],{},[110,1147,1148],{},[25,1149,1150],{},"configuration_changed",[110,1152,1153],{},"Configuration changed during the database read.",[92,1155,1156,1161],{},[110,1157,1158],{},[25,1159,1160],{},"database_unavailable",[110,1162,1163],{},"A database query failed.",[10,1165,1166,1167,521,1170,1173,1174,1177,1178,1180],{},"Initialization and framework lookup failures also return their existing service error, such as ",[25,1168,1169],{},"migration_required",[25,1171,1172],{},"transaction_driver_required",", or ",[25,1175,1176],{},"registry_unavailable",". Use ",[25,1179,160],{}," to inspect service readiness.",[34,1182,1184],{"id":1183},"server-events","Server events",[10,1186,1187,1188,1191,1192,1195,1196,1199],{},"Both events are ",[14,1189,1190],{},"local server notifications",". Subscribe with ",[25,1193,1194],{},"AddEventHandler",", not ",[25,1197,1198],{},"RegisterNetEvent",". They are emitted after the database transaction succeeds and the shared write lock has been released, so listeners can immediately query the committed record. They do not issue certificates or grant consent.",[155,1201,1203],{"id":1202},"sky_jobs_basevehicleregistryoperationcompleted",[25,1204,1205],{},"sky_jobs_base:vehicleRegistry:operationCompleted",[10,1207,1208,1209,32],{},"Fires once for a newly committed inspection, registration, or deregistration. A failed validation/write, repeated completion request, or invoice retry does not emit another completion event. A failed inspection still produces a completed operation with ",[25,1210,1211],{},"result = \"failed\"",[42,1213,1215],{"className":44,"code":1214,"filename":167,"language":47,"meta":48,"style":48},"AddEventHandler(\"sky_jobs_base:vehicleRegistry:operationCompleted\", function(operation)\n    print((\"%s: %s completed for %s\"):format(\n        operation.operationId, operation.kind, operation.plate\n    ))\n\n    local current = exports[\"sky_jobs_base\"]:GetVehicleRegistryStatus(operation.plate)\n    if current.success then\n        -- Update your integration's vehicle display from current.data.\n        print(\"Registry version:\", current.data.version)\n    end\nend)\n",[25,1216,1217,1242,1261,1279,1284,1288,1317,1328,1333,1357,1361],{"__ignoreMap":48},[52,1218,1219,1221,1223,1225,1227,1229,1231,1234,1236,1240],{"class":54,"line":55},[52,1220,1194],{"class":58},[52,1222,281],{"class":177},[52,1224,187],{"class":62},[52,1226,1205],{"class":66},[52,1228,187],{"class":62},[52,1230,521],{"class":177},[52,1232,1233],{"class":296},"function",[52,1235,281],{"class":62},[52,1237,1239],{"class":1238},"sHdIc","operation",[52,1241,291],{"class":62},[52,1243,1244,1246,1248,1250,1253,1255,1257,1259],{"class":54,"line":202},[52,1245,315],{"class":58},[52,1247,318],{"class":177},[52,1249,187],{"class":62},[52,1251,1252],{"class":66},"%s: %s completed for %s",[52,1254,187],{"class":62},[52,1256,328],{"class":177},[52,1258,331],{"class":58},[52,1260,510],{"class":177},[52,1262,1263,1266,1269,1272,1274,1276],{"class":54,"line":209},[52,1264,1265],{"class":177},"        operation.",[52,1267,1268],{"class":306},"operationId",[52,1270,1271],{"class":177},", operation.",[52,1273,951],{"class":306},[52,1275,1271],{"class":177},[52,1277,1278],{"class":306},"plate\n",[52,1280,1281],{"class":54,"line":216},[52,1282,1283],{"class":177},"    ))\n",[52,1285,1286],{"class":54,"line":222},[52,1287,206],{"emptyLinePlaceholder":205},[52,1289,1290,1293,1296,1298,1300,1302,1304,1306,1308,1310,1313,1315],{"class":54,"line":228},[52,1291,1292],{"class":62},"    local",[52,1294,1295],{"class":177}," current ",[52,1297,181],{"class":62},[52,1299,184],{"class":177},[52,1301,187],{"class":62},[52,1303,27],{"class":66},[52,1305,187],{"class":62},[52,1307,194],{"class":177},[52,1309,127],{"class":58},[52,1311,1312],{"class":177},"(operation.",[52,1314,132],{"class":306},[52,1316,291],{"class":177},[52,1318,1319,1321,1324,1326],{"class":54,"line":234},[52,1320,968],{"class":296},[52,1322,1323],{"class":177}," current.",[52,1325,307],{"class":306},[52,1327,310],{"class":296},[52,1329,1330],{"class":54,"line":371},[52,1331,1332],{"class":212},"        -- Update your integration's vehicle display from current.data.\n",[52,1334,1335,1337,1339,1341,1344,1346,1349,1351,1353,1355],{"class":54,"line":394},[52,1336,981],{"class":58},[52,1338,281],{"class":177},[52,1340,187],{"class":62},[52,1342,1343],{"class":66},"Registry version:",[52,1345,187],{"class":62},[52,1347,1348],{"class":177},", current.",[52,1350,930],{"class":306},[52,1352,32],{"class":177},[52,1354,615],{"class":306},[52,1356,291],{"class":177},[52,1358,1359],{"class":54,"line":420},[52,1360,1030],{"class":296},[52,1362,1363,1366],{"class":54,"line":442},[52,1364,1365],{"class":296},"end",[52,1367,291],{"class":177},[155,1369,1371],{"id":1370},"sky_jobs_basevehicleregistrydocumentrevoked",[25,1372,1373],{},"sky_jobs_base:vehicleRegistry:documentRevoked",[10,1375,1376],{},"Fires after a successful inspection or registration revocation. The existing issuer and revoke permission checks still apply.",[42,1378,1380],{"className":44,"code":1379,"filename":167,"language":47,"meta":48,"style":48},"AddEventHandler(\"sky_jobs_base:vehicleRegistry:documentRevoked\", function(operation)\n    print((\"Certificate %s revoked for %s: %s\"):format(\n        operation.documentId, operation.plate, operation.reason\n    ))\nend)\n",[25,1381,1382,1404,1423,1438,1442],{"__ignoreMap":48},[52,1383,1384,1386,1388,1390,1392,1394,1396,1398,1400,1402],{"class":54,"line":55},[52,1385,1194],{"class":58},[52,1387,281],{"class":177},[52,1389,187],{"class":62},[52,1391,1373],{"class":66},[52,1393,187],{"class":62},[52,1395,521],{"class":177},[52,1397,1233],{"class":296},[52,1399,281],{"class":62},[52,1401,1239],{"class":1238},[52,1403,291],{"class":62},[52,1405,1406,1408,1410,1412,1415,1417,1419,1421],{"class":54,"line":202},[52,1407,315],{"class":58},[52,1409,318],{"class":177},[52,1411,187],{"class":62},[52,1413,1414],{"class":66},"Certificate %s revoked for %s: %s",[52,1416,187],{"class":62},[52,1418,328],{"class":177},[52,1420,331],{"class":58},[52,1422,510],{"class":177},[52,1424,1425,1427,1429,1431,1433,1435],{"class":54,"line":209},[52,1426,1265],{"class":177},[52,1428,643],{"class":306},[52,1430,1271],{"class":177},[52,1432,132],{"class":306},[52,1434,1271],{"class":177},[52,1436,1437],{"class":306},"reason\n",[52,1439,1440],{"class":54,"line":216},[52,1441,1283],{"class":177},[52,1443,1444,1446],{"class":54,"line":222},[52,1445,1365],{"class":296},[52,1447,291],{"class":177},[155,1449,1451],{"id":1450},"event-payload","Event payload",[86,1453,1454,1464],{},[89,1455,1456],{},[92,1457,1458,1460,1462],{},[95,1459,553],{},[95,1461,556],{},[95,1463,559],{},[105,1465,1466,1479,1492,1505,1518,1545,1558,1572,1585,1607,1622,1637],{},[92,1467,1468,1472,1476],{},[110,1469,1470],{},[25,1471,1268],{},[110,1473,1474],{},[25,1475,572],{},[110,1477,1478],{},"Unique history operation ID. Use this to deduplicate external processing.",[92,1480,1481,1485,1489],{},[110,1482,1483],{},[25,1484,643],{},[110,1486,1487],{},[25,1488,572],{},[110,1490,1491],{},"Affected certificate ID. Deregistration refers to the previous registration certificate.",[92,1493,1494,1498,1502],{},[110,1495,1496],{},[25,1497,582],{},[110,1499,1500],{},[25,1501,572],{},[110,1503,1504],{},"Stable registry vehicle ID.",[92,1506,1507,1511,1515],{},[110,1508,1509],{},[25,1510,132],{},[110,1512,1513],{},[25,1514,572],{},[110,1516,1517],{},"Current plate when the operation completed.",[92,1519,1520,1524,1528],{},[110,1521,1522],{},[25,1523,951],{},[110,1525,1526],{},[25,1527,572],{},[110,1529,1530,1531,521,1533,521,1535,1538,1539,521,1542,32],{},"Completion: ",[25,1532,1057],{},[25,1534,470],{},[25,1536,1537],{},"deregistration",". Revocation: ",[25,1540,1541],{},"revoke_inspection",[25,1543,1544],{},"revoke_registration",[92,1546,1547,1551,1555],{},[110,1548,1549],{},[25,1550,824],{},[110,1552,1553],{},[25,1554,620],{},[110,1556,1557],{},"Acting mechanic's server ID at that moment; not a persistent identity.",[92,1559,1560,1565,1569],{},[110,1561,1562],{},[25,1563,1564],{},"actorJob",[110,1566,1567],{},[25,1568,572],{},[110,1570,1571],{},"Issuing workshop job.",[92,1573,1574,1578,1582],{},[110,1575,1576],{},[25,1577,957],{},[110,1579,1580],{},[25,1581,620],{},[110,1583,1584],{},"Unix timestamp in seconds.",[92,1586,1587,1592,1596],{},[110,1588,1589],{},[25,1590,1591],{},"result",[110,1593,1594],{},[25,1595,587],{},[110,1597,1598,1599,521,1602,1173,1605,32],{},"Inspection completion only: ",[25,1600,1601],{},"passed",[25,1603,1604],{},"advisory",[25,1606,734],{},[92,1608,1609,1614,1619],{},[110,1610,1611],{},[25,1612,1613],{},"invoiceId",[110,1615,1616],{},[25,1617,1618],{},"number?",[110,1620,1621],{},"Completion only: created invoice reference, when present.",[92,1623,1624,1629,1634],{},[110,1625,1626],{},[25,1627,1628],{},"billingPending",[110,1630,1631],{},[25,1632,1633],{},"boolean?",[110,1635,1636],{},"Completion only: certificate saved but invoice creation still needs recovery.",[92,1638,1639,1644,1648],{},[110,1640,1641],{},[25,1642,1643],{},"reason",[110,1645,1646],{},[25,1647,587],{},[110,1649,1650],{},"Revocation only: recorded explanation.",[10,1652,1653,1654,1657],{},"These events contain no holder identifiers or signature strokes. A completion confirms saved paperwork, ",[14,1655,1656],{},"not payment"," of its invoice. Process financial actions through the billing integration rather than charging the player again from these events.",[10,1659,1660],{},"Expiry and ownership changes are calculated when a record is queried. There is no automatic expiry/sale event or replay of old events after a resource restart; query the current status when your integration needs a decision.",[1662,1663,1664],"style",{},"html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}",{"title":48,"searchDepth":55,"depth":202,"links":1666},[1667,1668,1674],{"id":36,"depth":202,"text":37},{"id":83,"depth":202,"text":84,"children":1669},[1670,1671,1672,1673],{"id":157,"depth":209,"text":160},{"id":246,"depth":209,"text":249},{"id":811,"depth":209,"text":814},{"id":1073,"depth":209,"text":1074},{"id":1183,"depth":202,"text":1184,"children":1675},[1676,1677,1678],{"id":1202,"depth":209,"text":1205},{"id":1370,"depth":209,"text":1373},{"id":1450,"depth":209,"text":1451},"Read technical inspection and vehicle registration status, access signed records, and receive committed vehicle certificate events.","md",null,{},{"icon":1684},"i-lucide-file-check-2","/docs/base/jobs-base/server-exports/vehicle-registry",{"title":5,"description":1679},{"loc":1685},"1.docs/base/2.jobs-base/4.server-exports/4.vehicle-registry","dN6JXKi0LdB0_wbJO8F0eliPBKWxujvbkdpkSIjR0tE",[1691,1697],{"title":1692,"path":1693,"stem":1694,"description":1695,"icon":1696,"children":-1},"Wholesale Orders","/docs/base/jobs-base/server-exports/wholesale-orders","1.docs/base/2.jobs-base/4.server-exports/3.wholesale-orders","Receive wholesale order events, accept civilian deliveries, update order status, and add items or weapons to station storage.","i-lucide-package-check",{"title":1698,"path":1699,"stem":1700,"children":-1,"description":1701,"icon":1702},"Client Events","/docs/base/jobs-base/client-events","1.docs/base/2.jobs-base/5.client-events","Client-side events provided by sky_jobs_base that other resources can listen to.","i-lucide-radio",[],1789256412451]