Skip to content

Instantly share code, notes, and snippets.

@niutech
Last active February 27, 2025 11:16
Show Gist options
  • Save niutech/8124cbba1c2d505397ea6e936e613e9d to your computer and use it in GitHub Desktop.
Save niutech/8124cbba1c2d505397ea6e936e613e9d to your computer and use it in GitHub Desktop.
Convert net salary to gross salary for contract of employment in Poland in 2025 and request it from LibreOffice Calc
/*
netToGross function as UMD based on Kalkulator finansowy by Łukasz Socha under MIT License.
Usage: netToGross(netAmount = 0, hasTaxFreeAmount = true, workInLivePlace = true, hasTaxRelief = false, isHealthContribution = true, isDisabilityContribution = true, isPensionContribution = true, isSickContribution = true, isFpContribution = true, isFgspContribution = true)
*/
!function(t,n){"object"==typeof exports&&"undefined"!=typeof module?module.exports=n():"function"==typeof define&&define.amd?define(n):(t="undefined"!=typeof globalThis?globalThis:t||self).netToGross=n()}(this,(function(){"use strict";function t(t){return t&&t.__esModule&&Object.prototype.hasOwnProperty.call(t,"default")?t.default:t}var n,o,e,i={},u={},r={},s={};function a(){return o||(o=1,function(t){t.__esModule=!0;var o=(n||(n=1,function(t){var n=s&&s.__assign||function(){return n=Object.assign||function(t){for(var n,o=1,e=arguments.length;o<e;o++)for(var i in n=arguments[o])Object.prototype.hasOwnProperty.call(n,i)&&(t[i]=n[i]);return t},n.apply(this,arguments)};t.__esModule=!0;var o=n({},{ACCIDENT_RATE:1.67,AMOUNT_OF_TAX_THRESHOLD:85528,AVERAGE_SALARY:5504.52,EXPENSES_IF_YOU_WORK_WHERE_YOU_DONT_LIVE:300,EXPENSES_IF_YOU_WORK_WHERE_YOU_LIVE:250,FREE_AMOUNT_OF_TAX:8e3,GROSS_AMOUNT_LIMIT_FOR_AID:85528,LIMIT_BASIC_AMOUNT_FOR_ZUS:157770,LUMP_SUM_UP_TO_AMOUNT:200,MINIMUM_SALARY:2800,PPK:{EMPLOYEE:{DEFAULT_RATE:2,MAXIMUM_RATE:4,MINIMUM_RATE:.5},EMPLOYER:{DEFAULT_RATE:1.5,MAXIMUM_RATE:4,MINIMUM_RATE:1.5}},TAX_RATES:{BELKA_RATE:19,FIRST_RATE:17,LINEAR_RATE:19,SECOND_RATE:32},TAX_RATES_FOR_LAMP_SUM:[{label:"2%",value:2},{label:"3%",value:3},{label:"5,5%",value:5.5},{label:"8,5%",value:8.5},{label:"10%",value:10},{label:"12.5%",value:12.5},{label:"15%",value:15},{label:"17%",value:17},{label:"20%",value:20}],TAX_REDUCING_AMOUNT:43.76,US:{EMPLOYEE:{HEALTH_RATE:7.75},OWNER:{HEALTH_RATE:7.75,LIMIT_OF_DEDUCTION_HEALTH_CONTRIBUTION:8700}},ZUS:{EMPLOYEE:{HEALTH_RATE:9,PENSION_RATE:9.76,RENT_RATE:1.5,SICK_RATE:2.45},EMPLOYER:{FGSP_RATE:.1,FP_RATE:2.45,PENSION_RATE:9.76,RENT_RATE:6.5},OWNER:{BASIS_AMOUNT_FOR_HEALTH:4242.38,BIG_AMOUNT:3155.4,FP_RATE:2.45,HEALTH_RATE:9,HEALTH_RATE_FOR_LINEAR_TAX:0,PENSION_RATE:19.52,RENT_RATE:8,SICK_RATE:2.45,SMALL_AMOUNT:840}},HOLIDAY_RATE:21}),e=n(n({},o),{AMOUNT_OF_TAX_THRESHOLD:12e4,AVERAGE_SALARY:6221.04,FREE_AMOUNT_OF_TAX:3e4,LIMIT_BASIC_AMOUNT_FOR_ZUS:177660,MINIMUM_SALARY:3010,TAX_RATES:{BELKA_RATE:19,FIRST_RATE:12,LINEAR_RATE:19,SECOND_RATE:32},TAX_RATES_FOR_LAMP_SUM:[{label:"2%",value:2},{label:"3%",value:3},{label:"5,5%",value:5.5},{label:"8,5%",value:8.5},{label:"10%",value:10},{label:"12%",value:12},{label:"12.5%",value:12.5},{label:"14%",value:14},{label:"15%",value:15},{label:"17%",value:17}],TAX_REDUCING_AMOUNT:300,US:n(n({},o.US),{EMPLOYEE:n(n({},o.US.EMPLOYEE),{HEALTH_RATE:0}),OWNER:n(n({},o.US.OWNER),{HEALTH_RATE:0})}),ZUS:n(n({},o.ZUS),{OWNER:n(n({},o.ZUS.OWNER),{BIG_AMOUNT:3553.2,HEALTH_RATE_FOR_LINEAR_TAX:4.9,SMALL_AMOUNT:903})}),HOLIDAY_RATE:20.92}),i=n(n({},e),{AVERAGE_SALARY:6965.94,LIMIT_BASIC_AMOUNT_FOR_ZUS:208050,MINIMUM_SALARY:{FISRT_HALF_OF_YEAR:3490,SECOND_HALF_OF_YEAR:3600},US:n(n({},e.US),{OWNER:n(n({},e.US.OWNER),{LIMIT_OF_DEDUCTION_HEALTH_CONTRIBUTION:10200})}),ZUS:n(n({},e.ZUS),{OWNER:n(n({},e.ZUS.OWNER),{BIG_AMOUNT:4161,SMALL_AMOUNT:{FISRT_HALF_OF_YEAR:1047,SECOND_HALF_OF_YEAR:1080},LIMIT_OF_DEDUCTION_HEALTH_CONTRIBUTION:10200})}),HOLIDAY_RATE:20.83});t.default={ACCIDENT_RATE:1.67,AMOUNT_OF_POLSKI_LAD_TAX_THRESHOLD:12e4,AMOUNT_OF_TAX_THRESHOLD:85528,AMOUNT_TYPES:{GROSS:"gross",NET:"net"},APP:{NAME:"Kalkulator finansowy",VERSION:"5.0.0"},AVAILABLE_FORMS_OF_ACCOUNTING_FOR_MARIAGE:{CONTRACT_OF_EMPLOYMENT:"contactOfEmployment",SELF_EMPLOYMENT:"selfEmployment"},AVAILABLE_YEARS:[2021,2022,2023],BASIC_CAPITAL_INTEREST_RATE:13.75,BASIC_LATE_INTEREST_RATE:15.75,CASH_REGISTER_LIMIT:2e4,COLORS:{CASH_REGISTER_LIMIT:"#a31718",CHANGES_LOGS:"#00A7D9",CHART1:"#e32514",CHART2:"#edb113",CHART3:"#ed6d13",CHART4:"#360d13",CHART5:"#BB4985",CHART6:"#a31718",CHART7:"#00A7D9",CHART8:"#70B749",CONTACT:"#00A7D9",CONTRACT_OF_EMPLOYMENT:"#ed6d13",CONTRACT_OF_MANDATE:"#ed6d13",CONTRACT_WORK:"#ed6d13",CURRENCY_CONVERTER:"#BB4985",EXCHANGE_RATES:"#BB4985",INFORMATOR:"#FF8356",INTEREST:"#edb113",INVESTMENT:"#edb113",INVOICE:"#a31718",SELF_EMPLOYMENT:"#a31718",SICK_PAY:"#ed6d13",UNREGISTERED_COMPANY:"#a31718",VAT_LIMIT:"#a31718"},CONTRACT_OF_EMPLOYMENT:{AUTHOR_EXPENSES_RATE:.5,EXPENSES_IF_YOU_WORK_WHERE_YOU_DONT_LIVE:300,EXPENSES_IF_YOU_WORK_WHERE_YOU_LIVE:250},CONTRACT_OF_MANDATE:{AUTHOR_EXPENSES_RATE:.5,EXPENSES_RATE:.2},CONTRACT_WORK:{EXPENSES_20:.2,EXPENSES_50:.5},FREE_AMOUNT_FOR_TAX:43.76,LIMIT_BASIC_AMOUNT_FOR_ZUS:157770,LOCALE_DATE:{days:"Niedziela_Poniedziałek_Wtorek_Środa_Czwartek_Piątek_Sobota".split("_"),daysShort:"niedz._pon._wt._śr._czw._pt._sob.".split("_"),firstDayOfWeek:1,months:"Styczeń_Luty_Marzec_Kwiecień_Maj_Czerwiec_Lipiec_Sierpień_Wrzesień_Październik_Listopad_Grudzień_Cały rok".split("_"),monthsShort:"sty_lut_mar_kwi_maj_cze_lip_sie_wrz_paź_lis_gru".split("_"),wholeYearIndex:12},LUMP_SUM_UP_TO_AMOUNT:200,MINIMUM_SALARY:2800,PARAMS:{2021:o,2022:e,2023:i},POLSKI_LAD_FREE_AMOUNT_FOR_TAX:425,PPK:{EMPLOYEE:{DEFAULT_RATE:2,MAXIMUM_RATE:4,MINIMUM_RATE:.5},EMPLOYER:{DEFAULT_RATE:1.5,MAXIMUM_RATE:4,MINIMUM_RATE:1.5}},TAX_RATES:{BELKA_RATE:19,FIRST_RATE:17,LINEAR_RATE:19,SECOND_RATE:32},TAX_RATES_FOR_LAMP_SUM:[{label:"2%",value:2},{label:"3%",value:3},{label:"5,5%",value:5.5},{label:"8,5%",value:8.5},{label:"10%",value:10},{label:"12.5%",value:12.5},{label:"15%",value:15},{label:"17%",value:17}],TAX_TYPES:{GENERAL:"general",LINEAR:"linear",LUMP_SUM:"lumpSum"},US:{EMPLOYEE:{HEALTH_RATE:7.75,POLSKI_LAD_HEALTH_RATE:0},OWNER:{HEALTH_RATE:7.75,POLSKI_LAD_HEALTH_RATE:0}},VAT_LIMIT:2e5,ZUS:{EMPLOYEE:{HEALTH_RATE:9,PENSION_RATE:9.76,RENT_RATE:1.5,SICK_RATE:2.45},EMPLOYER:{FGSP_RATE:.1,FP_RATE:2.45,PENSION_RATE:9.76,RENT_RATE:6.5},OWNER:{BASIS_AMOUNT_FOR_HEALTH:4242.38,BIG_AMOUNT:3553.2,FP_RATE:2.45,HEALTH_RATE:9,PENSION_RATE:19.52,RENT_RATE:8,SICK_RATE:2.45,SMALL_AMOUNT:903}},MONTH_NAMES:["Styczeń","Luty","Marzec","Kwiecień","Maj","Czerwiec","Lipiec","Sierpień","Wrzesień","Październik","Listopad","Grudzień"],FULL_YEAR:"Cały rok"}}(s)),s);function e(t,n){void 0===n&&(n=0);var o=Math.pow(10,n);return Math.round(t*o)/o}t.default={getDefaultYear:function(){var t=(new Date).getFullYear();return o.default.AVAILABLE_YEARS.includes(t)?t:o.default.AVAILABLE_YEARS[o.default.AVAILABLE_YEARS.length-1]},round:e,sum:function(t,n){return t.reduce((function(t,o){return e(t+o[n],2)}),0)},sumMonthlyResults:function(t){return{basisForRentAndPensionContributions:e(t.map((function(t){return t.basisForRentAndPensionContributions})).reduce((function(t,n){return t+n}),0),2),basisForTax:t.map((function(t){return t.basisForTax})).reduce((function(t,n){return t+n}),0),contributionTotal:e(t.map((function(t){return t.contributionTotal})).reduce((function(t,n){return t+n}),0),2),disabilityContribution:e(t.map((function(t){return t.disabilityContribution})).reduce((function(t,n){return t+n}),0),2),expenses:e(t.map((function(t){return t.expenses})).reduce((function(t,n){return t+n}),0),2),grossAmount:e(t.map((function(t){return t.grossAmount})).reduce((function(t,n){return t+n}),0),2),healthContribution:e(t.map((function(t){return t.healthContribution})).reduce((function(t,n){return t+n}),0),2),netAmount:e(t.map((function(t){return t.netAmount})).reduce((function(t,n){return t+n}),0),2),pensionContribution:e(t.map((function(t){return t.pensionContribution})).reduce((function(t,n){return t+n}),0),2),ppkContribution:e(t.map((function(t){return t.ppkContribution})).reduce((function(t,n){return t+n}),0),2),sickContribution:e(t.map((function(t){return t.sickContribution})).reduce((function(t,n){return t+n}),0),2),taxAmount:t.map((function(t){return t.taxAmount})).reduce((function(t,n){return t+n}),0)}},applyMixins:function(t,n){n.forEach((function(n){Object.getOwnPropertyNames(n.prototype).forEach((function(o){Object.defineProperty(t.prototype,o,Object.getOwnPropertyDescriptor(n.prototype,o)||Object.create(null))}))}))}}}(r)),r}var l,p={},_={};var A,c,E,T={},C={},f={};function b(){return A||(A=1,function(t){t.__esModule=!0,t.useConstants=t.EntrepreneurTaxSystem=t.AmountTypes=void 0;var n,o,e=a();(n=t.AmountTypes||(t.AmountTypes={}))[n.Gross=1]="Gross",n[n.Net=2]="Net",(o=t.EntrepreneurTaxSystem||(t.EntrepreneurTaxSystem={}))[o.TaxScale=1]="TaxScale",o[o.FlatTax=2]="FlatTax",o[o.LumpSumTax=3]="LumpSumTax";t.useConstants=function(){var t,n,o,i={averageWageInLastQuarter:function(t){return void 0===t&&(t=2025),t<=2022?6965.94:t<=2023?7767.85:8549.18},minimumWage:function(t,n){return void 0===t&&(t=2025),void 0===n&&(n=0),t<=2022?3010:t<=2023?n<=5?3490:3600:t<=2024?n<=5?4242:4300:4666},minimumHourlyWage:function(t,n){return void 0===t&&(t=2025),void 0===n&&(n=0),t<=2023?n<=5?22.8:23.5:t<=2024?n<=5?27.7:28.1:30.5},projectedAverageWage:function(){return 8673}},u=(t={rates:{disabilityContribution:.015,healthContribution:.09,pensionContribution:.0976,ppkContribution:{default:.02,min:.005,max:.04},sickContribution:.0245}},n={rates:{accidentCContribution:{default:.0167,min:0,max:.0333},disabilityContribution:.065,fgspContribution:.001,fpContribution:.01,fsContribution:.0145,pensionContribution:.0976,ppkContribution:{default:.015,min:.015,max:.04}}},o={basises:{big:e.default.round(.6*i.projectedAverageWage(),2),small:function(t){return void 0===t&&(t=0),e.default.round(.3*i.minimumWage(2025,t),2)},startRelief:0},rates:{accidentCContribution:n.rates.accidentCContribution,disabilityContribution:t.rates.disabilityContribution+n.rates.disabilityContribution,fgspContribution:n.rates.fgspContribution,fpContribution:n.rates.fpContribution,fsContribution:n.rates.fsContribution,healthContribution:{taxScales:t.rates.healthContribution,flatTax:.049},pensionContribution:t.rates.pensionContribution+n.rates.pensionContribution,sickContribution:t.rates.sickContribution}},{contributionBasisLimit:e.default.round(30*i.projectedAverageWage(),2),employee:t,employer:n,entrepreneur:o});return{incomeTaxConstants:{taxReliefLimit:85528,taxScale:{expenses:{amounts:{workInLivingPlace:250,workOutsideLivingPlace:300},rates:{default:.2,author:.5},withoutExpensesUpTo:200},taxFreeAmount:3e4,taxThreshold:12e4,taxRates:{first:.12,second:.32}},flatTax:{deductibleHealthContributionLimit:11600,taxRate:.19}},wageStats:i,zusConstants:u}}}(f)),f}function R(){if(c)return C;c=1,C.__esModule=!0,C.ZusContribution=void 0;var t=b(),n=function(){function n(){var n=(0,t.useConstants)().zusConstants;this.zusConstants=n}return n.prototype.getContributionBasisWithinLimit=function(t,n){return void 0===n&&(n=0),t<0||n>=this.zusConstants.contributionBasisLimit?0:t+n>this.zusConstants.contributionBasisLimit?this.zusConstants.contributionBasisLimit-n:t},n}();return C.ZusContribution=n,C}var m,d={},h={};var O,S,y={};function I(){if(S)return d;S=1;var t,n=d&&d.__extends||(t=function(n,o){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,n){t.__proto__=n}||function(t,n){for(var o in n)Object.prototype.hasOwnProperty.call(n,o)&&(t[o]=n[o])},t(n,o)},function(n,o){if("function"!=typeof o&&null!==o)throw new TypeError("Class extends value "+String(o)+" is not a constructor or null");function e(){this.constructor=n}t(n,o),n.prototype=null===o?Object.create(o):(e.prototype=o.prototype,new e)});d.__esModule=!0,d.EmployerZusContribution=void 0;var o=function(){if(m)return h;m=1,h.__esModule=!0,h.ZusAccidentContribution=void 0;var t=a(),n=function(){function n(){}return n.prototype.getAccidentContribution=function(n,o){return n<0?0:t.default.round(o*n,2)},n}();return h.ZusAccidentContribution=n,h}(),e=R(),i=function(){if(O)return y;O=1;var t,n=y&&y.__extends||(t=function(n,o){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,n){t.__proto__=n}||function(t,n){for(var o in n)Object.prototype.hasOwnProperty.call(n,o)&&(t[o]=n[o])},t(n,o)},function(n,o){if("function"!=typeof o&&null!==o)throw new TypeError("Class extends value "+String(o)+" is not a constructor or null");function e(){this.constructor=n}t(n,o),n.prototype=null===o?Object.create(o):(e.prototype=o.prototype,new e)});y.__esModule=!0,y.ZusFpContribution=void 0;var o=R(),e=a(),i=function(t){function o(){return null!==t&&t.apply(this,arguments)||this}return n(o,t),o.prototype.getFPContribution=function(t){return t<0?0:e.default.round(this.zusConstants.value.employer.rates.fpContribution*t,2)},o.prototype.getFGSPContribution=function(t){return t<0?0:e.default.round(this.zusConstants.value.employer.rates.fgspContribution*t,2)},o.prototype.getFSContribution=function(t){return t<0?0:e.default.round(this.zusConstants.value.employer.rates.fsContribution*t,2)},o.prototype.getFPandFSPContribution=function(t){return t<0?0:e.default.round((this.zusConstants.value.employer.rates.fpContribution+this.zusConstants.value.employer.rates.fsContribution)*t,2)},o.prototype.getPPKContribution=function(t,n){if(void 0===n&&(n=this.zusConstants.value.employer.rates.ppkContribution.default),t<0)return 0;if(n<this.zusConstants.value.employer.rates.ppkContribution.min||n>this.zusConstants.value.employer.rates.ppkContribution.max)throw new Error("Invalid argument. The PPK rate has to be between 1.5% - 4%");return e.default.round(n*t,2)},o}(o.ZusContribution);return y.ZusFpContribution=i,y}(),u=a(),r=function(t){function o(){return null!==t&&t.apply(this,arguments)||this}return n(o,t),o.prototype.geDisabilityContribution=function(t){return t<=0?0:u.default.round(this.zusConstants.employer.rates.disabilityContribution*t,2)},o.prototype.gePensionContribution=function(t){return t<=0?0:u.default.round(this.zusConstants.employer.rates.pensionContribution*t,2)},o.prototype.getZusContributions=function(t,n,o,e,i,u,r,s){return{pensionContribution:o?this.gePensionContribution(n):0,disabilityContribution:e?this.geDisabilityContribution(n):0,fpContribution:i?this.getFPContribution(t):0,fsContribution:i?this.getFSContribution(t):0,fgspContribution:u?this.getFGSPContribution(t):0,accidentContribution:r?this.getAccidentContribution(t,r):0,ppkContribution:s?this.getPPKContribution(t,s):0}},o}(e.ZusContribution);return d.EmployerZusContribution=r,u.default.applyMixins(r,[i.ZusFpContribution,o.ZusAccidentContribution]),d}var L,x,M,U,N={},v={};function g(){if(x)return N;x=1,N.__esModule=!0,N.TaxScale=void 0;var t=function(){if(L)return v;L=1,v.__esModule=!0,v.HasTaxReliefLimit=void 0;var t=b(),n=a(),o=function(){function o(){}return o.prototype.geRevenueOverTaxReliefLimit=function(o,e,i){var u=(0,t.useConstants)().incomeTaxConstants;return i?e>u.taxReliefLimit?o:e+o>u.taxReliefLimit?n.default.round(e+o-u.taxReliefLimit,2):0:o},o}();return v.HasTaxReliefLimit=o,v}(),n=b(),o=a(),e=function(){function t(){var t=(0,n.useConstants)().incomeTaxConstants;this.incomeTaxConstants=t,this.annualTaxReducingAmount=this.incomeTaxConstants.taxScale.taxFreeAmount*this.incomeTaxConstants.taxScale.taxRates.first}return t.prototype.getAuthorExpenses=function(t,n,e,i){if(!n)return 0;if(t<=0)return 0;var u=this.incomeTaxConstants.taxScale.taxThreshold;if(e&&(u=this.incomeTaxConstants.taxScale.taxThreshold-this.incomeTaxConstants.taxReliefLimit),i>=u)return 0;var r=o.default.round(t*n*this.incomeTaxConstants.taxScale.expenses.rates.author,2);return r+i>u?u-i:r},t.prototype.getIncomeTax=function(t,n,e){var i;return n>this.incomeTaxConstants.taxScale.taxThreshold?i=t*this.incomeTaxConstants.taxScale.taxRates.second:t+n>this.incomeTaxConstants.taxScale.taxThreshold?(i=(this.incomeTaxConstants.taxScale.taxThreshold-n)*this.incomeTaxConstants.taxScale.taxRates.first,i+=(t+n-this.incomeTaxConstants.taxScale.taxThreshold)*this.incomeTaxConstants.taxScale.taxRates.second):i=t*this.incomeTaxConstants.taxScale.taxRates.first,e&&(i-=this.annualTaxReducingAmount/e),i<0?0:o.default.round(i)},t.prototype.getTaxFreeAmount=function(t,n){return void 0===n&&(n=0),t<=0||n>=this.annualTaxReducingAmount?0:t+n>this.annualTaxReducingAmount?this.annualTaxReducingAmount-n:t},t}();return N.TaxScale=e,o.default.applyMixins(e,[t.HasTaxReliefLimit]),N}function P(){if(M)return p;M=1;var t,n=p&&p.__extends||(t=function(n,o){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,n){t.__proto__=n}||function(t,n){for(var o in n)Object.prototype.hasOwnProperty.call(n,o)&&(t[o]=n[o])},t(n,o)},function(n,o){if("function"!=typeof o&&null!==o)throw new TypeError("Class extends value "+String(o)+" is not a constructor or null");function e(){this.constructor=n}t(n,o),n.prototype=null===o?Object.create(o):(e.prototype=o.prototype,new e)});p.__esModule=!0,p.EmployeeCalculator=void 0;var o=function(){if(l)return _;l=1,_.__esModule=!0,_.BasicCalculator=void 0;var t=function(){function t(){}return t.prototype.getInputData=function(){if(void 0===this.inputData)throw Error("The input data is undefined!");return this.inputData},t.prototype.setInputData=function(t){return this.inputData=t,this},t.prototype.getResult=function(){if(void 0===this.result)throw Error("The result is undefined!");return this.result},t}();return _.BasicCalculator=t,_}(),e=function(){if(E)return T;E=1;var t,n=T&&T.__extends||(t=function(n,o){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,n){t.__proto__=n}||function(t,n){for(var o in n)Object.prototype.hasOwnProperty.call(n,o)&&(t[o]=n[o])},t(n,o)},function(n,o){if("function"!=typeof o&&null!==o)throw new TypeError("Class extends value "+String(o)+" is not a constructor or null");function e(){this.constructor=n}t(n,o),n.prototype=null===o?Object.create(o):(e.prototype=o.prototype,new e)});T.__esModule=!0,T.EmployeeZusContribution=void 0;var o=R(),e=a(),i=function(t){function o(){return null!==t&&t.apply(this,arguments)||this}return n(o,t),o.prototype.getHealthContribution=function(t){return t<=0?0:e.default.round(this.zusConstants.employee.rates.healthContribution*t,2)},o.prototype.geDisabilityContribution=function(t){return t<=0?0:e.default.round(this.zusConstants.employee.rates.disabilityContribution*t,2)},o.prototype.gePensionContribution=function(t){return t<=0?0:e.default.round(this.zusConstants.employee.rates.pensionContribution*t,2)},o.prototype.getSickContribution=function(t){return t<=0?0:e.default.round(this.zusConstants.employee.rates.sickContribution*t,2)},o.prototype.getPPKContribution=function(t,n){if(void 0===n&&(n=this.zusConstants.employee.rates.ppkContribution.default),t<=0)return 0;if(n<this.zusConstants.employee.rates.ppkContribution.min||n>this.zusConstants.employee.rates.ppkContribution.max)throw new Error("Invalid argument. The PPK rate has to be between 0.5% - 4%");return e.default.round(n*t,2)},o.prototype.getZusContributions=function(t,n,o,i,u,r,s){var a=o?this.gePensionContribution(n):0,l=i?this.geDisabilityContribution(n):0,p=u?this.getSickContribution(t):0,_=s?this.getPPKContribution(t,s):0,A=e.default.round(a+l+p,2),c=r?this.getHealthContribution(t-A):0;return{pensionContribution:a,disabilityContribution:l,sickContribution:p,ppkContribution:_,healthContribution:c,socialContributions:A,totalContributions:e.default.round(a+l+p+_+c,2)}},o}(o.ZusContribution);return T.EmployeeZusContribution=i,T}(),i=I(),u=g(),r=b(),s=a(),A=function(t){function o(n){void 0===n&&(n=!1);var o=t.call(this)||this;return o.calculateSumUpAmounts=!1,o.sumUpContributionBasis=0,o.sumUpTaxBasis=0,o.sumUpAuthorExpenses=0,o.sumUpGrossAmount=0,o.calculateSumUpAmounts=n,o.employeeZus=new e.EmployeeZusContribution,o.incomeTax=new u.TaxScale,o}return n(o,t),o.prototype.getExpenses=function(t){var n=(0,r.useConstants)().incomeTaxConstants,o=0;if(this.getInputData().grossAmount<=0)return 0;this.getInputData().partOfWorkWithAuthorExpenses<1&&(o=this.getInputData().workInLivePlace?n.taxScale.expenses.amounts.workInLivingPlace:n.taxScale.expenses.amounts.workOutsideLivingPlace);var e=this.incomeTax.getAuthorExpenses(t,this.getInputData().partOfWorkWithAuthorExpenses,this.getInputData().hasTaxRelief,this.sumUpAuthorExpenses);return this.sumUpAuthorExpenses=s.default.round(this.sumUpAuthorExpenses+e,2),o+e},o.prototype.calculate=function(){var t=0,n=this.employeeZus.getContributionBasisWithinLimit(this.getInputData().grossAmount,this.sumUpContributionBasis),o=this.employeeZus.getZusContributions(this.getInputData().grossAmount,n,this.getInputData().isPensionContribution,this.getInputData().isDisabilityContribution,this.getInputData().isSickContribution,this.getInputData().isHealthContribution,this.getInputData().employeePpkContributionRate),e=o.pensionContribution,u=o.disabilityContribution,r=o.sickContribution,a=o.ppkContribution,l=o.healthContribution,p=o.socialContributions;this.getInputData().employerPpkContributionRate&&(t=(new i.EmployerZusContribution).getPPKContribution(this.getInputData().grossAmount,this.getInputData().employerPpkContributionRate));var _=this.incomeTax.geRevenueOverTaxReliefLimit(this.getInputData().grossAmount+t,this.sumUpGrossAmount,this.getInputData().hasTaxRelief),A=this.getExpenses(_-p),c=Math.max(s.default.round(_-p-A,0),0),E=this.incomeTax.getIncomeTax(c,this.sumUpTaxBasis,this.getInputData().partTaxReducingAmount),T=s.default.round(this.getInputData().grossAmount-p-l-a-E,2);return this.sumUpContributionBasis=s.default.round(this.sumUpContributionBasis+n,2),this.sumUpTaxBasis=s.default.round(this.sumUpTaxBasis+c,0),this.sumUpGrossAmount=s.default.round(this.sumUpGrossAmount+this.getInputData().grossAmount,2),this.result={grossAmount:this.getInputData().grossAmount,ppkIncomeFromEmployer:t,healthContribution:l,sickContribution:r,ppkContribution:a,pensionContribution:e,disabilityContribution:u,expenses:A,taxBasis:c,taxAmount:E,netAmount:T},this.calculateSumUpAmounts||(this.sumUpTaxBasis=0,this.sumUpContributionBasis=0,this.sumUpAuthorExpenses=0,this.sumUpGrossAmount=0),this},o.prototype.setSumUpAmounts=function(t){return this.sumUpTaxBasis=t.sumUpTaxBasis,this.sumUpContributionBasis=t.sumUpContributionBasis,this.sumUpAuthorExpenses=t.sumUpAuthorExpenses,this.sumUpGrossAmount=t.sumUpGrossAmount,this},o.prototype.getSumUpAmounts=function(){return{sumUpTaxBasis:this.sumUpTaxBasis,sumUpContributionBasis:this.sumUpContributionBasis,sumUpAuthorExpenses:this.sumUpAuthorExpenses,sumUpGrossAmount:this.sumUpGrossAmount}},o}(o.BasicCalculator);return p.EmployeeCalculator=A,p}return t((U||(U=1,function(t){t.__esModule=!0;var n=function(){if(e)return u;e=1,u.__esModule=!0,u.findGrossAmountUsingNetAmount=void 0;var t=a();return u.findGrossAmountUsingNetAmount=function n(o,e,i,u,r,s,a){void 0===a&&(a=100);for(var l=i;l>=e;l-=a){r.grossAmount=l;var p=o.setSumUpAmounts(s).setInputData(r).calculate().getResult();if(Math.abs(p.netAmount-u)<=5e-4)return t.default.round(p.grossAmount,2);if(Math.abs(p.netAmount-u)<=a)return n(o,p.netAmount-a,p.grossAmount+a,u,r,s,a/2)}return 0},u}(),o=P();t.default=function(t,e,i,u,r,s,a,l,p,_){void 0===t&&(t=0),void 0===e&&(e=!0),void 0===i&&(i=!0),void 0===u&&(u=!1),void 0===r&&(r=!0),void 0===s&&(s=!0),void 0===a&&(a=!0),void 0===l&&(l=!0),void 0===p&&(p=!0),void 0===_&&(_=!0);var A={grossAmount:0,hasTaxRelief:u,partTaxReducingAmount:e?12:0,partOfWorkWithAuthorExpenses:0,workInLivePlace:i,isHealthContribution:r,isDisabilityContribution:s,isPensionContribution:a,isSickContribution:l,isFpContribution:p,isFgspContribution:_,accidentContributionRate:.96,employeePpkContributionRate:0,employerPpkContributionRate:0};return(0,n.findGrossAmountUsingNetAmount)(new o.EmployeeCalculator,.5*t,2*t,t,A,{sumUpTaxBasis:0,sumUpContributionBasis:0,sumUpAuthorExpenses:0,sumUpGrossAmount:0})}}(i)),i))}));
/*
Sample node server to calculate netToGross.
Run: node server.js
Request from LibreOffice Calc: =VALUE(WEBSERVICE("http://localhost:8080/?net=" & A1 & "&wlp=" & B1 & "&tfa=" & C1))
Or create a JavaScript macro
*/
const http = require('http')
const url = require('url')
const netToGross = require('./netToGross.js')
const port = 8080;
//create a server object:
http.createServer(function (req, res) {
console.log(req.method + ' ' + req.url)
const q = url.parse(req.url, true).query;
const netAmount = +(q.net || '').replace(',', '.')
const workInLivePlace = q.wlp === '1'
const hasTaxFreeAmount = q.tfa === '1'
res.end(netAmount > 0 ? netToGross(netAmount, hasTaxFreeAmount, workInLivePlace).toString().replace('.', ',') : 'Error')
}).listen(port)
console.log('Server listening on port ' + port)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment