[{"data":1,"prerenderedAt":584},["ShallowReactive",2],{"/docs/base/jobs-base/features/combined-jobs":3,"/docs/base/jobs-base/features/combined-jobs-surround":570,"/docs/base/jobs-base/features/combined-jobs-implemented-suggestions":583},{"id":4,"title":5,"body":6,"description":559,"extension":560,"head":561,"implementedSuggestions":561,"meta":562,"navigation":563,"path":565,"schemaOrg":561,"seo":566,"sitemap":567,"stem":568,"__hash__":569},"docs/1.docs/base/2.jobs-base/2.features/3.combined-jobs.md","Combined Jobs",{"type":7,"value":8,"toc":550},"minimark",[9,14,31,34,102,105,109,131,144,167,177,181,188,253,256,266,272,275,279,290,293,296,299,303,306,321,331,402,405,409,419,476,482,495,498,502,509,539,546],[10,11,13],"h2",{"id":12},"one-job-both-services","One job, both services",[15,16,17,18,22,23,26,27,30],"p",{},"A framework job such as ",[19,20,21],"code",{},"firefighter"," can be registered in both ",[19,24,25],{},"sky_firejob"," and\n",[19,28,29],{},"sky_ambulancejob",". Employees keep that job while using both services. Both resources must be\nrunning, and their normal duty, grade, item and feature requirements still apply.",[15,32,33],{},"This guide requires the combined-job update in Jobs Base, Fire and Ambulance. Older versions\ncan overwrite catalogs or hide a group-filtered tablet app when the other resource registers\nthe same job. Changing resource start order does not solve that problem.",[35,36,37,50],"table",{},[38,39,40],"thead",{},[41,42,43,47],"tr",{},[44,45,46],"th",{},"Data",[44,48,49],{},"Ownership",[51,52,53,62,70,78,86,94],"tbody",{},[41,54,55,59],{},[56,57,58],"td",{},"Employees, ranks, permissions, society balance and duty",[56,60,61],{},"One shared framework organization",[41,63,64,67],{},[56,65,66],{},"Organization settings, sharing, Dispatch configuration and Training settings",[56,68,69],{},"The selected primary registration",[41,71,72,75],{},[56,73,74],{},"Hospital shop, vehicle offers, trunk defaults, storage and locker limits",[56,76,77],{},"The hospital creator's Ambulance job definition",[41,79,80,83],{},[56,81,82],{},"Fire-station shop, vehicle offers, trunk defaults, storage and locker limits",[56,84,85],{},"The fire creator's Fire job definition",[41,87,88,91],{},[56,89,90],{},"Purchased vehicles and stored items",[56,92,93],{},"Their existing station IDs",[41,95,96,99],{},[56,97,98],{},"Fire and medical tablet apps / interactions",[56,100,101],{},"All registered job groups, subject to permissions",[15,103,104],{},"Locations belonging to the same creator group and the same configured job use that definition's\ncatalog. This does not add a separate catalog editor for each individual building.",[10,106,108],{"id":107},"_1-register-the-same-technical-job-name","1. Register the same technical job name",[15,110,111,112,115,116,120,121,123,124,127,128,130],{},"In ",[19,113,114],{},"/jobconfig",", open ",[117,118,119],"strong",{},"Fire"," and configure the actual framework job, for example ",[19,122,21],{},".\nThen open ",[117,125,126],{},"Ambulance"," and add or duplicate a medical job entry using exactly ",[19,129,21],{},".\nKeep the vehicle and shop lists appropriate for each resource.",[15,132,133,135,136,139,140,143],{},[19,134,21],{}," is the framework job name in this example. ",[19,137,138],{},"fire"," and ",[19,141,142],{},"ambulance"," are the Sky job\ngroup keys. They do not have to match the framework job name.",[15,145,146,147,150,151,154,155,158,159,162,163,166],{},"Existing entries can be edited directly under ",[117,148,149],{},"General",": change ",[117,152,153],{},"Job name",", ",[117,156,157],{},"Off-duty job","\nor ",[117,160,161],{},"Society account",", then save. The entry keeps its configurator ID, shop, vehicles and other\nsettings. Changing the job name changes which framework job this configuration applies to; it\ndoes not rename a framework job, move employees or transfer stored organization data. Society and\noff-duty values remain as entered and are not automatically derived again for existing entries.\nAssign locations to the desired job separately in the creator. With the configurator disabled,\nuse the same name in both resources' ",[19,164,165],{},"Config.Jobs"," lists instead.",[15,168,169,170,172,173,176],{},"Adding ",[19,171,21],{}," only to a hospital's ",[117,174,175],{},"additional jobs"," grants location access. Registering\nit in Ambulance is what gives it the medical job features.",[10,178,180],{"id":179},"_2-select-the-shared-organization-owner","2. Select the shared organization owner",[15,182,183,184,187],{},"Set the primary group in ",[19,185,186],{},"sky_jobs_base/config/config.lua",":",[189,190,195],"pre",{"className":191,"code":192,"language":193,"meta":194,"style":194},"language-lua shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","Config.PrimaryJobGroups = {\n    [\"firefighter\"] = \"fire\",\n}\n","lua","",[19,196,197,217,247],{"__ignoreMap":194},[198,199,202,206,210,214],"span",{"class":200,"line":201},"line",1,[198,203,205],{"class":204},"sTEyZ","Config.",[198,207,209],{"class":208},"sBMFI","PrimaryJobGroups",[198,211,213],{"class":212},"sMK4o"," =",[198,215,216],{"class":204}," {\n",[198,218,220,223,226,229,231,234,237,240,242,244],{"class":200,"line":219},2,[198,221,222],{"class":204},"    [",[198,224,225],{"class":212},"\"",[198,227,21],{"class":228},"sfazB",[198,230,225],{"class":212},[198,232,233],{"class":204},"] ",[198,235,236],{"class":212},"=",[198,238,239],{"class":212}," \"",[198,241,138],{"class":228},[198,243,225],{"class":212},[198,245,246],{"class":204},",\n",[198,248,250],{"class":200,"line":249},3,[198,251,252],{"class":204},"}\n",[15,254,255],{},"The Fire registration now controls the shared society account, management options, sharing,\nduty settings, and Dispatch/Training job configuration. Configure the combined fleet's Dispatch\nvehicles, channels and statuses in that primary job entry. Edit shared Dispatch reporters there\nas well. The Ambulance registration still supplies its medical features and hospital catalogs.",[15,257,258,259,262,263,265],{},"Choose ",[19,260,261],{},"\"ambulance\""," if the medical registration should own the shared organization settings.\nWithout an explicit selection, the alphabetically first registered group is used; for Fire plus\nAmbulance this is ",[19,264,142],{},". If the primary resource stops, the remaining registration becomes\nprimary until the selected resource returns.",[15,267,268,269,271],{},"This setting belongs to Jobs Base because it selects ownership across resources. It is not a\nper-resource ",[19,270,114],{}," setting. Apply changes during your normal resource/server restart.",[15,273,274],{},"Use the same society account and off-duty job pair in both entries so temporary resource stops\ndo not switch the organization to a different account or duty mapping. For an off-duty pair,\nboth framework jobs and their employee grades must exist.",[10,276,278],{"id":277},"_3-assign-the-locations-and-their-catalogs","3. Assign the locations and their catalogs",[15,280,281,282,285,286,289],{},"Use ",[19,283,284],{},"/firecreator"," for fire stations and ",[19,287,288],{},"/hospitalcreator"," for hospitals. Assign each location\nto the shared job and position its shop, garage, storage and locker points as needed.",[15,291,292],{},"Edit the Fire job's shop and vehicles in the Fire configurator; edit medical supplies and\nambulances in the Ambulance configurator. A fire station then offers Fire items and vehicles,\nwhile the hospital offers the Ambulance list. An empty list stays empty for its own service.",[15,294,295],{},"The same item or vehicle model can exist in both lists at different prices, grades, liveries\nor trunk configurations. Purchases use the server's catalog for the selected location. A client\ncannot purchase a Fire-only catalog entry through a hospital garage or submit a cheaper price.",[15,297,298],{},"Existing vehicles keep their station, plate and catalog IDs. This update does not require SQL\nchanges or deletion of inventories. Custom integrations that use station IDs without creator\ncontext continue to use the primary job's catalog.",[10,300,302],{"id":301},"_4-enable-the-desired-tablet-and-dispatch-mode","4. Enable the desired tablet and dispatch mode",[15,304,305],{},"Both Fire reports and medical apps can be available to the same employee. Check their permissions\nand the corresponding feature switches if an app is missing.",[15,307,308,309,312,313,316,317,320],{},"For the modern Dispatch App, enable ",[19,310,311],{},"Config.Dispatch.enabled"," in Jobs Base and configure access\nfor the actual job in your dispatch setup. Setting this to ",[19,314,315],{},"false"," disables the modern app;\n",[19,318,319],{},"legacyAlertBanner = true"," provides legacy notifications and does not enable that app.",[15,322,111,323,326,327,330],{},[117,324,325],{},"Ambulance → Deathscreen → Dispatch",", set ",[117,328,329],{},"Alerted jobs"," to the actual recipients. Hospital\nadditional-job access does not update this list. To always alert both independent services:",[189,332,334],{"className":191,"code":333,"language":193,"meta":194,"style":194},"-- Ambulance config.lua, when /jobconfig is disabled:\nConfig.DeathScreen.Dispatch.jobs = { \"ambulance\", \"firefighter\" }\nConfig.DeathScreen.Dispatch.fallbackJobs = {}\n",[19,335,336,342,382],{"__ignoreMap":194},[198,337,338],{"class":200,"line":201},[198,339,341],{"class":340},"sHwdD","-- Ambulance config.lua, when /jobconfig is disabled:\n",[198,343,344,346,349,352,355,357,360,362,365,367,369,371,373,375,377,380],{"class":200,"line":219},[198,345,205],{"class":204},[198,347,348],{"class":208},"DeathScreen",[198,350,351],{"class":204},".",[198,353,354],{"class":208},"Dispatch",[198,356,351],{"class":204},[198,358,359],{"class":208},"jobs",[198,361,213],{"class":212},[198,363,364],{"class":204}," { ",[198,366,225],{"class":212},[198,368,142],{"class":228},[198,370,225],{"class":212},[198,372,154],{"class":204},[198,374,225],{"class":212},[198,376,21],{"class":228},[198,378,379],{"class":212},"\" ",[198,381,252],{"class":204},[198,383,384,386,388,390,392,394,397,399],{"class":200,"line":249},[198,385,205],{"class":204},[198,387,348],{"class":208},[198,389,351],{"class":204},[198,391,354],{"class":208},[198,393,351],{"class":204},[198,395,396],{"class":208},"fallbackJobs",[198,398,213],{"class":212},[198,400,401],{"class":204}," {}\n",[15,403,404],{},"Use your framework job names. A group selector is expanded only when it is not also a registered\njob name; exact job names avoid ambiguity.",[10,406,408],{"id":407},"_5-optional-fire-covers-medical-calls-when-no-medic-is-available","5. Optional: Fire covers medical calls when no medic is available",[15,410,411,412,414,415,418],{},"Set ",[117,413,329],{}," to the regular medical job and ",[117,416,417],{},"Fallback jobs"," to the combined Fire job:",[189,420,422],{"className":191,"code":421,"language":193,"meta":194,"style":194},"Config.DeathScreen.Dispatch.jobs = { \"ambulance\" }\nConfig.DeathScreen.Dispatch.fallbackJobs = { \"firefighter\" }\n",[19,423,424,450],{"__ignoreMap":194},[198,425,426,428,430,432,434,436,438,440,442,444,446,448],{"class":200,"line":201},[198,427,205],{"class":204},[198,429,348],{"class":208},[198,431,351],{"class":204},[198,433,354],{"class":208},[198,435,351],{"class":204},[198,437,359],{"class":208},[198,439,213],{"class":212},[198,441,364],{"class":204},[198,443,225],{"class":212},[198,445,142],{"class":228},[198,447,379],{"class":212},[198,449,252],{"class":204},[198,451,452,454,456,458,460,462,464,466,468,470,472,474],{"class":200,"line":219},[198,453,205],{"class":204},[198,455,348],{"class":208},[198,457,351],{"class":204},[198,459,354],{"class":208},[198,461,351],{"class":204},[198,463,396],{"class":208},[198,465,213],{"class":212},[198,467,364],{"class":204},[198,469,225],{"class":212},[198,471,21],{"class":228},[198,473,379],{"class":212},[198,475,252],{"class":204},[15,477,478,479,481],{},"With ",[19,480,114],{}," enabled, save these values there rather than editing the plaintext defaults.\nThe server checks availability when the downed player requests help:",[483,484,485,489,492],"ul",{},[486,487,488],"li",{},"A living, on-duty player in a primary recipient job is available: alert the primary jobs.",[486,490,491],{},"None is available: alert the fallback jobs instead.",[486,493,494],{},"An empty fallback list preserves normal routing, even when no primary recipient is available.",[15,496,497],{},"The requesting patient does not count as an available responder. This is a dispatch-routing\nrule: registering Fire in Ambulance grants medical features continuously. It does not revoke\nFire's treatment permissions when a regular medic logs in, or reroute an already submitted call.\nCustom client dispatch hooks handle their own routing; the default server hook receives the\nselected recipients and can also be customized.",[10,499,501],{"id":500},"verify-the-setup-in-game","Verify the setup in game",[15,503,504,505,508],{},"Use two players: one patient and one living, on-duty responder. A downed employee cannot count\nas their own medic. The medic display also requires the Ambulance job entry's ",[19,506,507],{},"countsAsMedic","\nsetting to be enabled.",[510,511,512,518,521,524,530,533,536],"ol",{},[486,513,514,515,517],{},"Keep ",[19,516,21],{}," assigned and confirm Fire reports and medical features are available.",[486,519,520],{},"Open both shops and garages; compare their different offers, prices and variants.",[486,522,523],{},"Buy, store and retrieve one vehicle at each location; check its equipment and customization.",[486,525,526,527,529],{},"Change only the hospital catalog in ",[19,528,114],{},"; verify that Fire offers remain unchanged.",[486,531,532],{},"Check duty changes and the shared society balance from both locations.",[486,534,535],{},"For fallback dispatch, repeat with a living medic on duty, then off duty, then downed.",[486,537,538],{},"After a normal restart, verify both catalogs and the previously purchased vehicles again.",[15,540,541,542,545],{},"The message ",[117,543,544],{},"no medics available"," alone does not disable the dispatch button. If no alert\narrives, check recipient job names, duty, Dispatch mode/access and any custom dispatch hook.",[547,548,549],"style",{},"html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}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 .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}",{"title":194,"searchDepth":201,"depth":219,"links":551},[552,553,554,555,556,557,558],{"id":12,"depth":219,"text":13},{"id":107,"depth":219,"text":108},{"id":179,"depth":219,"text":180},{"id":277,"depth":219,"text":278},{"id":301,"depth":219,"text":302},{"id":407,"depth":219,"text":408},{"id":500,"depth":219,"text":501},"Use Fire and Ambulance features with one framework job while keeping fire-station and hospital offers separate.","md",null,{},{"icon":564},"i-lucide-combine","/docs/base/jobs-base/features/combined-jobs",{"title":5,"description":559},{"loc":565},"1.docs/base/2.jobs-base/2.features/3.combined-jobs","eDLol8wqIiaWZNN1UTJ6ab4W-4BWPN2PNLCqGEpZ_Hs",[571,577],{"title":572,"path":573,"stem":574,"description":575,"icon":576,"children":-1},"Training & Qualifications","/docs/base/jobs-base/features/training","1.docs/base/2.jobs-base/2.features/2.training","Plan courses, manage sessions, record results, and maintain employee qualifications in the Jobs Base tablet.","i-lucide-graduation-cap",{"title":578,"path":579,"stem":580,"children":-1,"description":581,"icon":582},"Client Exports","/docs/base/jobs-base/client-exports","1.docs/base/2.jobs-base/3.client-exports","Client-side exports provided by sky_jobs_base for radial menu, dispatch, and storage interactions.","i-lucide-monitor",[],1789075897366]