[{"data":1,"prerenderedAt":659},["ShallowReactive",2],{"/docs/base/jobs-base/server-exports/business":3,"/docs/base/jobs-base/server-exports/business-surround":647,"/docs/base/jobs-base/server-exports/business-implemented-suggestions":658},{"id":4,"title":5,"body":6,"description":638,"extension":639,"head":640,"implementedSuggestions":640,"meta":641,"navigation":243,"path":642,"schemaOrg":640,"seo":643,"sitemap":644,"stem":645,"__hash__":646},"docs/1.docs/base/2.jobs-base/4.server-exports/17.business.md","Business",{"type":7,"value":8,"toc":634},"minimark",[9,26,31,34,98,135,156,326,333,363,404,408,418,478,505,622,630],[10,11,12,21,22,25],"p",{},[13,14,15,16,20],"strong",{},"Server only · ",[17,18,19],"code",{},"sky_jobs_base","."," The global feature and the registered job's relevant ",[17,23,24],{},"businessSettings"," capabilities must be enabled.",[27,28,30],"h2",{"id":29},"authorized-employee-apis","Authorized employee APIs",[10,32,33],{},"Use the authenticated server-handler source, not a player ID supplied by a client payload.",[35,36,37,50],"table",{},[38,39,40],"thead",{},[41,42,43,47],"tr",{},[44,45,46],"th",{},"Export",[44,48,49],{},"Returns",[51,52,53,70,84],"tbody",{},[41,54,55,61],{},[56,57,58],"td",{},[17,59,60],{},"GetBusinessContext(source)",[56,62,63,66,67],{},[17,64,65],{},"{ success = true, data = context }"," or ",[17,68,69],{},"{ success = false, error }",[41,71,72,77],{},[56,73,74],{},[17,75,76],{},"GetBusinessHistory(source, { job, before? })",[56,78,79,66,82],{},[17,80,81],{},"{ success = true, data = { entries, nextCursor? } }",[17,83,69],{},[41,85,86,91],{},[56,87,88],{},[17,89,90],{},"SubmitBusinessAnnouncement(source, { job, kind, message? })",[56,92,93,66,95],{},[17,94,65],{},[17,96,97],{},"{ success = false, error, retryAfter? }",[10,99,100,103,104,107,108,107,111,107,114,117,118,107,121,107,124,107,127,130,131,134],{},[17,101,102],{},"context"," contains ",[17,105,106],{},"job",", ",[17,109,110],{},"label",[17,112,113],{},"color",[17,115,116],{},"imageUrl",", optional ",[17,119,120],{},"open",[17,122,123],{},"canChangeStatus",[17,125,126],{},"canAnnounce",[17,128,129],{},"cooldown"," and ",[17,132,133],{},"maxLength = 240",". Submission checks the current job, configured feature, duty, permissions, validation and employee cooldown.",[10,136,137,140,141,107,143,107,146,107,149,66,152,155],{},[17,138,139],{},"kind"," is ",[17,142,120],{},[17,144,145],{},"closed",[17,147,148],{},"announcement",[17,150,151],{},"promotion",[17,153,154],{},"event",". Opening/closing text can be omitted; the other kinds require text. Text is limited to 240 Unicode characters and 960 bytes. The server derives the image and recipients.",[157,158,164],"pre",{"className":159,"code":160,"filename":161,"language":162,"meta":163,"style":163},"language-lua shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","local context = exports[\"sky_jobs_base\"]:GetBusinessContext(sourceId)\nif not context.success then\n    return context\nend\n\nreturn exports[\"sky_jobs_base\"]:SubmitBusinessAnnouncement(sourceId, {\n    job = context.data.job,\n    kind = \"promotion\",\n    message = \"Two loaves for the price of one.\"\n})\n","inside an existing authorized server callback","lua","",[17,165,166,203,223,232,238,245,267,287,304,320],{"__ignoreMap":163},[167,168,171,175,179,182,185,188,191,193,196,200],"span",{"class":169,"line":170},"line",1,[167,172,174],{"class":173},"sMK4o","local",[167,176,178],{"class":177},"sTEyZ"," context ",[167,180,181],{"class":173},"=",[167,183,184],{"class":177}," exports[",[167,186,187],{"class":173},"\"",[167,189,19],{"class":190},"sfazB",[167,192,187],{"class":173},[167,194,195],{"class":177},"]:",[167,197,199],{"class":198},"s2Zo4","GetBusinessContext",[167,201,202],{"class":177},"(sourceId)\n",[167,204,206,210,213,216,220],{"class":169,"line":205},2,[167,207,209],{"class":208},"s7zQu","if",[167,211,212],{"class":173}," not",[167,214,215],{"class":177}," context.",[167,217,219],{"class":218},"sBMFI","success",[167,221,222],{"class":208}," then\n",[167,224,226,229],{"class":169,"line":225},3,[167,227,228],{"class":208},"    return",[167,230,231],{"class":177}," context\n",[167,233,235],{"class":169,"line":234},4,[167,236,237],{"class":208},"end\n",[167,239,241],{"class":169,"line":240},5,[167,242,244],{"emptyLinePlaceholder":243},true,"\n",[167,246,248,251,253,255,257,259,261,264],{"class":169,"line":247},6,[167,249,250],{"class":208},"return",[167,252,184],{"class":177},[167,254,187],{"class":173},[167,256,19],{"class":190},[167,258,187],{"class":173},[167,260,195],{"class":177},[167,262,263],{"class":198},"SubmitBusinessAnnouncement",[167,265,266],{"class":177},"(sourceId, {\n",[167,268,270,273,275,277,280,282,284],{"class":169,"line":269},7,[167,271,272],{"class":177},"    job ",[167,274,181],{"class":173},[167,276,215],{"class":177},[167,278,279],{"class":218},"data",[167,281,20],{"class":177},[167,283,106],{"class":218},[167,285,286],{"class":177},",\n",[167,288,290,293,295,298,300,302],{"class":169,"line":289},8,[167,291,292],{"class":177},"    kind ",[167,294,181],{"class":173},[167,296,297],{"class":173}," \"",[167,299,151],{"class":190},[167,301,187],{"class":173},[167,303,286],{"class":177},[167,305,307,310,312,314,317],{"class":169,"line":306},9,[167,308,309],{"class":177},"    message ",[167,311,181],{"class":173},[167,313,297],{"class":173},[167,315,316],{"class":190},"Two loaves for the price of one.",[167,318,319],{"class":173},"\"\n",[167,321,323],{"class":169,"line":322},10,[167,324,325],{"class":177},"})\n",[10,327,328,329,332],{},"The callback's ",[17,330,331],{},"sourceId"," must be the authenticated caller. Do not accept another player's ID as an input to this example.",[10,334,335,336,107,339,342,343,107,346,130,349,352,353,356,357,360,361,20],{},"History entries contain ",[17,337,338],{},"id",[17,340,341],{},"timestamp"," (epoch milliseconds), ",[17,344,345],{},"name",[17,347,348],{},"action",[17,350,351],{},"content",". Each page has up to 25 entries. Pass ",[17,354,355],{},"nextCursor"," unchanged as ",[17,358,359],{},"before"," for the next page, together with the same current ",[17,362,106],{},[10,364,365,366,107,369,107,372,130,375,378,379,107,382,107,385,107,388,107,390,107,393,66,396,399,400,403],{},"Access errors include ",[17,367,368],{},"disabled",[17,370,371],{},"not_authorized",[17,373,374],{},"off_duty",[17,376,377],{},"context_changed",". Submission can also return ",[17,380,381],{},"invalid_payload",[17,383,384],{},"invalid_kind",[17,386,387],{},"invalid_message",[17,389,129],{},[17,391,392],{},"busy",[17,394,395],{},"unchanged",[17,397,398],{},"failed",". Cooldown responses include ",[17,401,402],{},"retryAfter"," in seconds.",[27,405,407],{"id":406},"trusted-server-integrations","Trusted server integrations",[10,409,410,411,414,415,417],{},"These exports are for server-controlled automation. They do not authorize an employee through ",[17,412,413],{},"actorId"," and do not apply the employee publishing cooldown. For a player action, use ",[17,416,263],{}," above.",[35,419,420,429],{},[38,421,422],{},[41,423,424,426],{},[44,425,46],{},[44,427,428],{},"Returns / behavior",[51,430,431,448,464],{},[41,432,433,438],{},[56,434,435],{},[17,436,437],{},"GetBusinessState(job)",[56,439,440,443,444,447],{},[17,441,442],{},"{ open, openColor, closedColor, openSprite, closedSprite, closedAlpha }",", or ",[17,445,446],{},"nil"," when unavailable",[41,449,450,455],{},[56,451,452],{},[17,453,454],{},"SetBusinessOpen(job, open, message?, announce?, actorId?)",[56,456,457,66,460,463],{},[17,458,459],{},"true",[17,461,462],{},"false, reason","; changes persisted opening state, blips and history",[41,465,466,471],{},[56,467,468],{},[17,469,470],{},"BroadcastBusinessAnnouncement(job, kind, message?, actorId?)",[56,472,473,66,475,477],{},[17,474,459],{},[17,476,462],{},"; notice/history only, without an opening-state change",[10,479,480,483,484,486,487,490,491,494,495,497,498,130,501,504],{},[17,481,482],{},"announce"," defaults to ",[17,485,459],{},"; ",[17,488,489],{},"false"," makes a status change silent. An unchanged status returns ",[17,492,493],{},"false, \"unchanged\"",". Optional ",[17,496,413],{}," supplies trusted history/admin context, not a permission check. Broadcast additionally supports ",[17,499,500],{},"zone_created",[17,502,503],{},"zone_removed"," for server-controlled zone notifications.",[157,506,509],{"className":159,"code":507,"filename":508,"language":162,"meta":163,"style":163},"local changed, reason = exports[\"sky_jobs_base\"]:SetBusinessOpen(\n    \"bakery\", true, \"Fresh bread is ready!\"\n)\n\nlocal sent, sendReason = exports[\"sky_jobs_base\"]:BroadcastBusinessAnnouncement(\n    \"police\", \"announcement\", \"Road closed at Legion Square.\"\n)\n","server automation in a yielding thread or callback",[17,510,511,536,559,564,568,592,618],{"__ignoreMap":163},[167,512,513,515,518,520,522,524,526,528,530,533],{"class":169,"line":170},[167,514,174],{"class":173},[167,516,517],{"class":177}," changed, reason ",[167,519,181],{"class":173},[167,521,184],{"class":177},[167,523,187],{"class":173},[167,525,19],{"class":190},[167,527,187],{"class":173},[167,529,195],{"class":177},[167,531,532],{"class":198},"SetBusinessOpen",[167,534,535],{"class":177},"(\n",[167,537,538,541,544,546,548,550,552,554,557],{"class":169,"line":205},[167,539,540],{"class":173},"    \"",[167,542,543],{"class":190},"bakery",[167,545,187],{"class":173},[167,547,107],{"class":177},[167,549,459],{"class":173},[167,551,107],{"class":177},[167,553,187],{"class":173},[167,555,556],{"class":190},"Fresh bread is ready!",[167,558,319],{"class":173},[167,560,561],{"class":169,"line":225},[167,562,563],{"class":177},")\n",[167,565,566],{"class":169,"line":234},[167,567,244],{"emptyLinePlaceholder":243},[167,569,570,572,575,577,579,581,583,585,587,590],{"class":169,"line":240},[167,571,174],{"class":173},[167,573,574],{"class":177}," sent, sendReason ",[167,576,181],{"class":173},[167,578,184],{"class":177},[167,580,187],{"class":173},[167,582,19],{"class":190},[167,584,187],{"class":173},[167,586,195],{"class":177},[167,588,589],{"class":198},"BroadcastBusinessAnnouncement",[167,591,535],{"class":177},[167,593,594,596,599,601,603,605,607,609,611,613,616],{"class":169,"line":247},[167,595,540],{"class":173},[167,597,598],{"class":190},"police",[167,600,187],{"class":173},[167,602,107],{"class":177},[167,604,187],{"class":173},[167,606,148],{"class":190},[167,608,187],{"class":173},[167,610,107],{"class":177},[167,612,187],{"class":173},[167,614,615],{"class":190},"Road closed at Legion Square.",[167,617,319],{"class":173},[167,619,620],{"class":169,"line":269},[167,621,563],{"class":177},[10,623,624,625,20],{},"Replace the example jobs with enabled jobs registered on your server. Global/job enablement, input validation, storage and busy-state checks still apply. See the ",[626,627,629],"a",{"href":628},"/docs/base/jobs-base/features/business-and-announcements","feature/setup guide",[631,632,633],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}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 .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);}",{"title":163,"searchDepth":170,"depth":205,"links":635},[636,637],{"id":29,"depth":205,"text":30},{"id":406,"depth":205,"text":407},"Read business state, submit authorized employee announcements or publish from trusted server integrations.","md",null,{},"/docs/base/jobs-base/server-exports/business",{"title":5,"description":638},{"loc":642},"1.docs/base/2.jobs-base/4.server-exports/17.business","46TDvWPym9AmLZhMPu_S-ZahxNZFp1gWyB9IGXCjBCU",[648,653],{"title":649,"path":650,"stem":651,"description":652,"children":-1},"Permissions","/docs/base/jobs-base/server-exports/permissions","1.docs/base/2.jobs-base/4.server-exports/16.permissions","Reference for Permissions in sky_jobs_base.",{"title":654,"path":655,"stem":656,"description":657,"children":-1},"Job Bells","/docs/base/jobs-base/server-exports/job-bells","1.docs/base/2.jobs-base/4.server-exports/18.job-bells","Register and ring bells through the server-side Sky_Jobs library owner.",[],1791814181497]