Shioaji Pro
为 agent 交易铺路:交易终端全程由 coding agent 打造,界面 100% 开源、桌面版内置 AI Agent 与全套专业下单面板 — 这个终端就是能力证明。
AI 翻译
尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证Lön med OB-tillägg för butiksanställda med timlön. Ladda upp schemat, se vad månaden ger. OB-regler enligt Detaljhandelsavtalet §8.1. Helt klientsida.
翻译准备中
正在加载完整 README。 以下为已保存的摘录。
A web app for hourly-paid retail workers in Sweden. Upload your schedule, get what the month actually pays — OB (obekväm arbetstid) supplements, tax and net pay, with every hour attributed to the rule that paid for it. Detaljhandelsavtalet §7.3 settles the pay form: a heltidsanställd is always on månadslön, while a deltidsanställd is on timlön by default, moving to månadslön only if their hours are averaged over 11+ weeks or they agree to it.查看完整 README ↗
A web app for hourly-paid retail workers in Sweden. Upload your schedule, get what the month actually pays — OB (obekväm arbetstid) supplements, tax and net pay, with every hour attributed to the rule that paid for it.
Detaljhandelsavtalet §7.3 settles the pay form: a heltidsanställd is always on månadslön, while a deltidsanställd is on timlön by default, moving to månadslön only if their hours are averaged over 11+ weeks or they agree to it.
Someone on a monthly salary already knows roughly what lands in their account. Someone paid by the hour, on a schedule that shifts week to week with OB spread unevenly across it, does not. That second group is who this is for — part-time store staff, which is most of Swedish retail.
.csv/.xlsx export, text pasted from a PDF
or email, or shifts typed in by handEvery employer runs a different scheduling system, and a parser can only be written for a format someone has actually seen. So there are three routes in, and the last one always works:
.csv or .xlsx. Columns are found by their headings, in
Swedish or English. If the headings are unfamiliar the file is not rejected —
the columns are listed with sample values and you point out which is the
date, the start and the end.sjuk or semester becomes that kind of leave;
a semester line needs no times. Dates are parsed strictly, since guessing
day-versus-month would move a whole month onto the wrong weekdays, and
weekday is what decides OB.A date is work or leave, never both: adding one removes the other on that date and says so. Any shift in the list can be marked sick or semester, and back.
Taken verbatim from §8.1 of Detaljhandelsavtalet, 1 April 2025 – 31 March 2027 (Svensk Handel / Handelsanställdas förbund):
| When | Pays |
|---|---|
| måndag–fredag kl. 18.15 – 20.00 | 50 % |
| måndag–fredag efter kl. 20.00 | 70 % |
| lördagar efter kl. 12.00 | 100 % |
| söndagar och helgdagar | 100 % |
Med lördagar jämställs jul-, nyårs- och midsommarafton.
Supplements are paid on top of the base rate: an hour at OB 50% with a base of 177.44 kr/h pays 177.44 + 88.72 kr.
A rule set is a list of tiers (a name and a supplement percentage) and a list of time windows (day types, a start and end time, and the tier they pay). Any hour not covered by a window pays the base rate only. The preset is just the starting point — a different agreement, or a local addition like Coop's extra 05.00–06.00 tier, can be entered by hand.
A window targets day types, which is what makes "söndagar och helgdagar" work. Beyond the seven weekdays there are two more:
Detaljhandelsavtalet sets no minimum or maximum length for a rast — the schedule decides. What it does settle is whether the time is paid:
Arbetstidslagen §15 entitles you to a rast after at most five hours of work, so any shift longer than that with no break in the file is flagged — usually it means the export left the break out.
Leave days sit in the export with their scheduled hours intact, so they have to be told apart from work — and from each other, since each is paid differently. A day counts as leave only when the absence columns cover the whole shift; those columns routinely carry a minute or two on ordinary days, meaning someone arrived late.
Checked against three real Bestseller time exports and the payslips they produced. June and August 2026 match the payslip to the öre on gross, and to the krona on tax and on what was paid out; July is 1,77 kr under on gross, which is the payslip splitting one month over two stores and rounding each half on its own — something the export does not show. Every OB tier is exact. August is the sick month: two separate sick days, two karens periods, 4,16 h of sjuklön to the öre, and two days of approved mertid read from the Godkänd column.
The app rounds the way payroll does — the month's hours per row to two decimals, the rate to the öre, each row to the öre, the payout to whole kronor — because a krona's difference can cross a skattetabell bracket edge and move the tax by fifty.
There is no backend, no account, and no analytics. The schedule is parsed in the browser and the results never leave it.
Agreement periods change. If you are reading this after April 2027, re-check the figures against the current avtal.
Next.js 16 (App Router), React 19, TypeScript, Tailwind CSS 4. Every route is statically prerendered — the app is entirely client-side.
The .xlsx reader is hand-rolled: it walks the zip's central directory and
inflates the entries with the browser's built-in DecompressionStream, so the
app ships no spreadsheet dependency. Persisted state is exposed to React through
useSyncExternalStore, which also picks up changes from other open tabs.
lib/
rules.ts tiers, windows, preset, day classification, validation
holidays.ts svenska helgdagar, incl. Easter-derived dates
calc.ts shift splitting and pay totals
parse.ts csv + xlsx readers, schedule column detection
storage.ts localStorage load/save
store.ts useSyncExternalStore bindings
i18n.ts sv/en strings
time.ts time parsing and formatting
npm install
npm run dev
Then open http://localhost:3000.
e2e/