Giter Club home page Giter Club logo

labor-standards-tw's Introduction

labor-standards-tw

台灣勞動基準法的函式庫,可用於計算違法罰款、加班費、特休假、確認班表是否違法等。

Taiwan Labor Standards Act Library for calculating penalty, overtime wages, annual paid leaves & checking shift work schedule is legal or not.

目錄

如何使用

首先可以使用 npm 安裝本函式庫:

npm install g0v/labor-standards-tw --save

安裝後,在 node.js 環境底下可以用 require() 引入函示庫,如在瀏覽器環境,可以用 webpack 後使用 import 語法引入:

// for Node.js
const {Labor, WorkTime} = require('labor-standards-tw')

// for Webpack
import {Labor, WorkTime} from 'labor-standards-tw'

Labor class

Labor 類別是本函式庫的基礎,所有功能都圍繞著這個類別。它可以用來設定一個勞工的就職日、月薪、年齡等條件。

import { Labor, Gender } from 'labor-standards-tw'

// 一個 20 歲的女性勞工於 2017/3/20 就職,月薪為 24000 元
const labor = new Labor()
labor.setGender(Gender.FEMALE)
     .setAge(20)
     .onBoard(new Date(2017, 4, 20))
     .setMonthlySalary(24000)

Labor 類別有兩種類型的 methods,第一種是如上述的一些 setter / getter 可以設定基本資訊,另外一種是依據這些基本資訊計算出更進一步的資訊,第二種類型的 methods 都會回傳 Result 類別

import { Labor, ChildLaborType } from 'labor-standards-tw'

const labor = new Labor().setAge(15)

// 驗證勞工是否為童工身分
let result = labor.validateChildLabor()

// 根據勞動基準法 44 條,此勞工為合法的童工身分
expect(result.value.legal).eq(true)
expect(result.value.type).eq(ChildLaborType.CHILD_LABOR)
let article = result.according[0]
expect(article.lawTitle).eq('勞動基準法')
expect(article.id).eq('44')

// 如果勞工年齡為 14 歲
result = labor.setAge(14).validateChildLabor()

// 非法
expect(result.value.legal).eq(false)

// 身分為非法勞工
expect(result.value.type).eq(ChildLaborType.ILLEGAL)

// 違反勞基法 44 條
article = result.violations[0]
expect(article.lawTitle).eq('勞動基準法')
expect(article.id).eq('44')

// 有三種可能性的罰則
// 1. 罰款 300,000 以下
// 2. 拘役 6 個月以下
// 3. 前面兩者加起來
const penalty = article.penalize()
expect(penalty.article.id).eq('77')
expect(penalty.possibilities.length).eq(3)

更詳細的用法,請參考程式內的 jsdoc 註解,或是 cucumber 的 測試案例

協助開發

本專案使用 node.js v6 LTS,如果你有許多專案使用不同版本的 node.js,推薦你使用 nvm

如何開發

你可以先使用 npm install 安裝所有相依性套件。接著用 npm test 可以執行所有測試。

如果需要除錯,可以使用 Visual Studio Code,在你需要下斷點的地方鍵入 debugger; 跳到除錯的頁籤,並且執行 Debug task。

比如說你想要在 Labor.ts 底下的 retire() 下斷點,就把 debugger 加在第一行如下面程式片段:

retire (date: Date): Result {
  debugger; // 加入在這裡
  const result = new Result()

  const years = moment(date).diff(this._onboard, 'years')
  const retirement = (years >= 15 && this.getAge() >= 55) ||
                      (years >= 25) ||
                      (years >= 10 && this.getAge() >= 60)

  result.value.retirement = retirement
  result.according.push(new Article('勞動基準法', '53'))

  return result
}

執行 Debug task 後,就會停在中斷點,並且可以逐步執行。

Screenshot for debugging

如何貢獻

如果你發現程式碼有錯誤,或任何需要改進的地方,請到 issues 頁面開一個新的 issue。

如果想協助本專案,請到 Github issue 逛逛,看看有沒有還沒解掉的 issues 可以協助。

若要提交你的修改,請送 pull request 到本專案,travis-ci 上面會有基本的語法與 coding style 檢查後,接著經由團隊成員審核後就會將您的變更合併入專案當中。

關於 cucumber 的測試方式,請參考 test.md

相關資訊

授權

本專案依照 MIT 授權 釋出,若需使用請確保您的使用方式符合 MIT 授權。

labor-standards-tw's People

Contributors

appleboy avatar chuck-lee avatar conjuror avatar madeinfree avatar y12studio avatar yurenju avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

labor-standards-tw's Issues

實作 pays.feature 中的「時薪制的薪資計算」場景

目前 pays.feature 裡面有一個尚未實作的場景需要實作如下。

若要協助實作,請先在這個 issue 下面討論你想如何實作,或是可以先推一個 work in progress 的 pull request,然後我們可以基於 pull request 討論,討論後再開始實作比較不會浪費時間。

  @ignore
  場景: 時薪制的薪資計算
    假設 一個時薪制的勞工,基本時薪為 120 元
     在平常日
    而且 工作 8 小時
    而且 計算他的當日薪資時
    那麼 薪資為 960 元

產假薪水計算方式可能有誤

現行法沒有規定一個月等於四週,但有規定一個月等於30天(民法第123條
因此週薪計算不能將月薪除以四,而應該是月薪除以30再乘以7。
因此在test case裡的產假的薪水,週薪是8400而不是9000;所以受僱未滿六個月及滿六個月的合法薪資應該分別為33600及67200。
https://github.com/g0v/labor-standards-tw/blob/master/features/female.feature#L19
https://github.com/g0v/labor-standards-tw/blob/master/features/female.feature#L26

實作 female.feature 內尚未實作的三個場景

目前 female.feature 裡面有三個尚未實作的場景需要實作如下。

若要協助實作,請先在這個 issue 下面討論你想如何實作,或是可以先推一個 work in progress 的 pull request,然後我們可以基於 pull request 討論,討論後再開始實作比較不會浪費時間。

  @ignore
  場景: 檢查產假時的薪資的違法情形
    假如 一女性勞工
    而且 月薪為 36000 元
    而且 在一公司工作 3 個月
     請產假時
    而且 公司發給薪資為 30000 元
    那麼 違反 "勞動基準法" 50 條
    而且 根據勞基法 78 條,罰款 90000 元至 450000 元

  @ignore
  場景: 檢查產假時的薪資的違法情形
    假如 一女性勞工
    而且 月薪為 36000 元
    而且 在一公司工作 7 個月
     請產假時
    而且 公司發給薪資為 40000 元
    那麼 違反 "勞動基準法" 50 條
    而且 根據勞基法 78 條,罰款 90000 元至 450000 元

  @ignore
  場景: 請產假時雇主可要求提出證明文件
    假如 一女性勞工
     請產假時
    那麼 根據勞基法施行細則 26 條,雇主得要求其提出證明文件

實作 paid-leaves.feature 內尚未實作的四個場景

目前 paid-leaves.feature 裡面有四個尚未實作的場景需要實作如下。

若要協助實作,請先在這個 issue 下面討論你想如何實作,或是可以先推一個 work in progress 的 pull request,然後我們可以基於 pull request 討論,討論後再開始實作比較不會浪費時間。

如果認為有場景是不需要實作的也可以討論,比如說 用到職天數計算特休,我也一直在想是不是不需要。

  @ignore
  場景大綱: 用到職天數來計算特休
    假設 一勞工在公司工作了 <days> 計算特休假時
    那麼 根據勞基法 38 條,特休假為 <leaves>例子:
    | days | leaves |
    | 30   | 0      |
    | 210  | 3      |
    | 380  | 7      |
    | 730  | 10     |

  @ignore
  場景: 特休天數不符合勞基法
    假設 一勞工在公司工作了 1 年
     公司給該勞工 4 天特休
    那麼 違反 "勞動基準法" 38 條
    而且 根據勞基法 79 條,罰款為 20000 元至 1500000 元

  @ignore
  場景: 特休時又回來工作
    假設 一勞工的平均時薪為 150 元
     請特休假時
    而且 雇主因故要求勞工該天上班 8 小時
    那麼 根據勞基法 39 條,加給工資為 1500 元

  @ignore
  場景: 公用事業之勞工請了特休假,雇主可以停止你的特休
    假設 一勞工的平均時薪為 150 元
    而且 為公用事業之勞工
     請特休假時
    而且 當地主管機關認有必要時,停止其特休
    而且 上班 8 小時
    那麼 根據勞基法 41 條,合法
    而且 根據勞基法 39 條,加給工資為 1500

2018-01-10 勞基法新修法三讀通過

較完整新聞:
http://www.eventsinfocus.org/news/2199

《勞基法》修法今天(1/10)早上8點44分,正式完成三讀程序,在在野黨委員全數退席的情況下,64名民進黨委員出席,全數同意,三讀通過包括「七休一調整(第36條)」、「每月加班工時上限調整(第32條)」、「休息日工資核實計算(第24條)」、「特休假遞延(第38條)」、「輪班間隔調為8小時(第34條)」,以及最後才出現的「加班費及休息日工資換補休(第32條之1)」,造成勞資之間利益消長的條款;在68席民進黨立委裡,扣除正副院長蘇嘉全與蔡奇昌,最後只有鍾孔炤與林淑芬最後沒有出席投票。

相關條文如下:

第24條

雇主延長勞工工作時間者,其延長工作時間之工資依下列標準加給:

一、延長工作時間在二小時以內者,按平日每小時工資額加給三分之一以上。
二、再延長工作時間在二小時以內者,按平日每小時工資額加給三分之二以上。
三、依第三十二條第四項規定,延長工作時間者,按平日每小時工資額加倍發給。

雇主使勞工於第三十六條所定休息日工作,工作時間在二小時以內者,其工資按平日每小時工資額另再加給一又三分之一以上;工作二小時後再繼續工作者,按平日每小時工資額另再加給一又三分之二以上。

第32條

雇主有使勞工在正常工作時間以外工作之必要者,雇主經工會同意,如事業單位無工會者,經勞資會議同意後,得將工作時間延長之。

前項雇主延長勞工之工作時間連同正常工作時間,一日不得超過十二小時;延長之工作時間,一個月不得超過四十六小時,但雇主經工會同意,如事業單位無工會者,經勞資會議同意後,延長之工作時間,一個月不得超過五十四小時,每三個月不得超過一百三十八小時。

雇主僱用勞工人數在三十人以上,依前項但書規定延長勞工之工作時間者,應報當地主管機關備查。

因天災、事變或突發事件,雇主有使勞工在正常工作時間以外工作之必要者,得將工作時間延長之。但應於延長開始後二十四小時內通知工會;無工會組織者,應報當地主管機關備查。延長之工作時間,雇主應於事後補給勞工以適當之休息。

在坑內工作之勞工,其工作時間不得延長。但以監視為主之工作,或有前項所定之情形者,不在此限。

第32條之1

雇主依第三十二條第一項及第二項規定使勞工延長工作時間,或使勞工於第三十六條所定休息日工作後,依勞工意願選擇補休並經雇主同意者,應依勞工工作之時數計算補休時數。

前項之補休,其補休期限由勞雇雙方協商;補休期限屆期或契約終止未補休之時數,應依延長工作時間或休息日工作當日之工資計算標準發給工資;未發給工資者,依違反第二十四條規定論處。

第34條

勞工工作採輪班制者,其工作班次,每週更換一次。但經勞工同意者不在此限。

依前項更換班次時,至少應有連續十一小時之休息時間。但因工作特性或特殊原因,經**目的事業主管機關商請**主管機關公告者,得變更休息時間不少於連續八小時。

雇主依前項但書規定變更休息時間者,應經工會同意,如事業單位無工會者,經勞資會議同意後,使得為之。雇主僱用勞工人數在三十人以上者,依前項但書規定變更勞工之休息時間者,應報當地主管機關備查。

第36條

勞工每七日中應有二日之休息,其中一日為例假,一日為休息日。

雇主有下列情形之一,不受前項規定之限制:

一、依第三十條第二項規定變更正常工作時間者,勞工每七日中至少應有一日之例假,每二週內之例假及休息日至少應有四日。

二、依第三十條第三項規定變更正常工作時間者,勞工每七日中至少應有一日之例假,每八週內之例假及休息日至少應有十六日。

三、依第三十條之一規定變更正常工作時間者,勞工每二週內至少應有二日之例假,每四週內之例假及休息日至少應有八日。

雇主使勞工於休息日工作之時間,計入第三十二條第二項所定延長工作時間總數。但因天災、事變或突發事件,雇主使勞工於休息日工作之必要者,其工作時數不受第三十二條第二項規定之限制。

經**目的事業主管機關同意,且經**主管機關指定之行業,雇主得將第一項、第二項第一款及第二款所定之例假,於每七日之週期內調整之。

前項所定例假之調整,應經工會同意,如事業單位無工會者,經勞資會議同意後,始得為之。雇主僱用勞工人數在三十人以上,應報當地主管機關備查。

第38條

勞工在同一雇主或事業單位,繼續工作滿一定期間者,應依下列規定給予特別休假:

一、六個月以上一年未滿者,三日。

二、一年以上二年未滿者,七日。

三、二年以上三年未滿者,十日。

四、三年以上五年未滿者,每年十四日。

五、五年以上十年未滿者,每年十五日。

六、十年以上者,每一年加給一日,加至三十日為止。

前項之特別休假期日,由勞工排定之。但雇主基於企業經營上之急迫需求或勞工因個人因素,得與他方協商調整。

雇主應於勞工符合第一項所定之特別休假條件時,告知勞工依前二項規定排定特別休假。

勞工之特別休假,因年度終結或契約終止而未休之日數,雇主應發給工資。但年度終結未休之日數,經勞雇雙方協商遞延至次年度實施者,於次年度終結或契約終止仍未休之日數,雇主應發給工資。

雇主應將勞工每年特別休假之期日及未休之日數所發給之工資數額,記載於第二十三條所定之勞工工資清冊,並每年定期將其內容以書面通知勞工。

勞工依本條主張權利時,雇主如認為其權利不存在,應負舉證責任。


關係文書與審查報告(非最終通過版本):
https://lci.ly.gov.tw/LyLCEW/agenda1/03/pdf/09/04/01/02/LCEWA01_09040102_00008.pdf

三讀通過之條文對照表:
https://drive.google.com/file/d/1z-wVjGW7Yb4JMlJpiMA-Waz84D7Nha5V/view

實作 workhours.feature 中的「休息時間」場景

目前 workhours.feature 裡面有一個尚未實作的場景需要實作如下。

若要協助實作,請先在這個 issue 下面討論你想如何實作,或是可以先推一個 work in progress 的 pull request,然後我們可以基於 pull request 討論,討論後再開始實作比較不會浪費時間。

  @ignore
  場景: 休息時間
    假設 正常工時情況下
     工作 15 小時
    而且 計算休息時間時
    那麼 根據勞基法 35 條
    並且 有 1 小時的休息時間

測試與研究 cucumber.js

這幾天看了 cucumber.js 之前在 slack 有討論要用什麼格式讓一般人也可以 contribute test case,看起來 cucumber 的格式不涉及實作,似乎會比較適合讓較沒程式背景的人參與。

例如目前的其中一條 test case:

descrbe('薪資給付', () => {
  describe('加班費', () => {
    describe('一般加班', () => {
      it('月薪制勞工,平均時薪 150 元,平日工作 10 小時,其加班費為 400');
    });
  });
});

寫成 cucumber 的 feature 會變成這樣:

功能: 薪資給付

  情境: 員工的加班費計算
    假如 一個員工平均時薪 150 元,
    而且 平日工作 10 小時
    那麼 他的加班費為 400 元

這樣我覺得會比較好撰寫,不過還是要問一下不寫程式的人。

Support for JSON-LD data.

輸入參數與返回值支援JSON-LD格式定義的可行性?例如輸入工時表,輸出總工時統計或違法等JSON-LD定義的返回值。

it('月薪制勞工, 工時表(勞基法)', () => {
  let result = std.handle(JsonLdObj);
  expect(result.value).eq(JsonLdResult);
});

舉例 https://github.com/g0v/mydaka/blob/master/test/draft02.json

{
    "@context": "https://g0v.github.io/mydaka/contexts/v1.jsonld",
    "name": "Bob",
    "description": "CompanyA",
    "workingHours": ["Mo,Tu,We,Th 09:00-12:00", "Mo,Tu,We,Th 13:00-17:30"],
    "WorkingHoursSpec": [{
            "@type": "WorkingHoursSpec",
            "validFrom": "2013-12-24",
            "validThrough": "2013-12-25",
            "opens": "09:00",
            "closes": "11:00"
        },
        {
            "@type": "WorkingHoursSpec",
            "validFrom": "2014-01-01",
            "validThrough": "2014-01-01",
            "opens": "12:00",
            "closes": "14:00"
        }
    ]
}

API 設計討論

最近正在補齊一些測試案例,我覺得是時候來討論一下 API 要如何設計了,包含支援 JSON-LD #15 也可以在這邊一併討論。

先來看看一個典型的案例:

https://github.com/g0v/labor-standards-tw/blob/master/features/overtime-pay.feature#L18-L22

  場景: 違法狀況下平日的加班費
    假設 一個月薪制的勞工,平均時薪為 150 元
     在平常日
    並且 工作 13 小時
    而且 計算加班費時

    那麼 根據勞基法 24 條
    而且 他的加班費為 1150 元
    而且 違反勞基法 32 條

這是一個計算加班費的 function,輸入與輸出有:

輸入:

  • 平均時薪 150
  • 平常日(有可能是休息日、例假日)
  • 工作 13 小時

輸出:

  • 加班費
  • 根據哪條法律
  • 違反哪條法律
  • 罰款(這個沒有寫在測試案例裡面,但是應該要有)

所以 API 可以設計成:

overtimePay (hourlySalary, type, hours) {}

使用起來可以是:

const result = std.overtimePay(150, std.TYPE_DAY_REGULAR_DAY, 13)

而回傳值可以是:

{
  "legal": false,
  "value": 1150,
  "according": [ "LSA-24" ],
  "fines": [
    {"min": 20000, "max": 100000, "according": ["LSA-78"]}
  ]
}

其中 value 放通用的回傳值,根據不同 API 可能會有不同型態。比如檢測特定條件是否可以退休時,value 會是 boolean 值。

不過如果套用 JSON-LD 可能還會需要一些 metadata 的欄位如 @context@type。我還沒想得很清楚,如果大家有什麼意見都請提出。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.