Advertisement
TheTintin

Untitled

Mar 2nd, 2021
832
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import DateFormat from 'dateformat'
  2. import OriginMoment from 'moment'
  3. import { extendMoment } from 'moment-range'
  4. const Moment = extendMoment(OriginMoment)
  5.  
  6. import { CHECK_LEAVES_DAY, DATES_FORMAT } from 'Constants/others'
  7.  
  8. // Keep start before end
  9. const orderStartEnd = callback => (start, end) => start.isBefore(end) ? callback(start, end) : callback(end, start)
  10.  
  11. // Check if date is Saturday or Sunday
  12. const isSaturday = date => date.day() === 6
  13. const isSunday = date => date.day() === 0
  14. const isWeekendDay = date => isSaturday(date) || isSunday(date)
  15.  
  16. // Core function of getYearPublicHolidays
  17. const MemoizegetYearPublicHolidays = year => {
  18.     // Some obscure code
  19.     let G = year % 19
  20.     let C = Math.floor(year / 100)
  21.     let H = (C - Math.floor(C / 4) - Math.floor((8 * C + 13) / 25) + 19 * G + 15) % 30
  22.     let I = H - Math.floor(H / 28) * (1 - Math.floor(H / 28) * Math.floor(29 / (H + 1)) * Math.floor((21 - G) / 11))
  23.     let J = (year * 1 + Math.floor(year / 4) + I + 2 - C + Math.floor(C / 4)) % 7
  24.     let L = I - J
  25.     let EasterMonth = 3 + Math.floor((L + 40) / 44)
  26.     let EasterDay = L + 28 - 31 * Math.floor(EasterMonth / 4)
  27.     let EasterSunday = Moment(`${EasterDay}/${EasterMonth}/${year}`, DATES_FORMAT) // Dimanche de Pâques
  28.  
  29.     const holidays = [
  30.         Moment(`01/01/${year}`, DATES_FORMAT), // Jour de l'an
  31.         EasterSunday.clone().add(1, 'day'), // Lundi de Pâques
  32.         Moment(`01/05/${year}`, DATES_FORMAT), // Fête du travail
  33.         Moment(`08/05/${year}`, DATES_FORMAT), // Victoire 1945
  34.         EasterSunday.clone().add(39, 'day'), // Jeudi de l'ascension
  35.         EasterSunday.clone().add(50, 'day'), // Lundi de Pentecôte
  36.         Moment(`14/07/${year}`, DATES_FORMAT), // Fête nationale
  37.         Moment(`15/08/${year}`, DATES_FORMAT), // Assomption
  38.         Moment(`01/11/${year}`, DATES_FORMAT), // Toussaint
  39.         Moment(`11/11/${year}`, DATES_FORMAT), // Armistice
  40.         Moment(`25/12/${year}`, DATES_FORMAT) // Noël
  41.     ]
  42.  
  43.     return holidays.filter(date => !isWeekendDay(date))
  44. }
  45.  
  46. // Store public holiday per year for memoization
  47. const publicHolidaysPerYear = {}
  48.  
  49. // [Memoized] Determine public holiday in a year (Public days who are week-end day are removed)
  50. export const getYearPublicHolidays = year => {
  51.     if (!publicHolidaysPerYear[year]) {
  52.         publicHolidaysPerYear[year] = MemoizegetYearPublicHolidays(year)
  53.     }
  54.  
  55.     return publicHolidaysPerYear[year]
  56. }
  57.  
  58. export const getPublicHolidaysInPeriod = orderStartEnd((start, end) => {
  59.     let holidays = []
  60.     // Loop on years
  61.     for (let year = start.year(); year <= end.year(); year++) {
  62.         // If start or end year
  63.         if (year === start.year() || year === end.year()) {
  64.             holidays = holidays.concat(
  65.                 getYearPublicHolidays(year)
  66.                     .filter(date => date.isSameOrAfter(start) && date.isSameOrBefore(end))
  67.             )
  68.         } else {
  69.             holidays = holidays.concat(getYearPublicHolidays(year))
  70.         }
  71.     }
  72.  
  73.     return holidays
  74. })
  75.  
  76. export const countPublicHolidaysInPeriod = orderStartEnd((start, end) => {
  77.     let count = 0
  78.  
  79.     // Loop on years
  80.     for (let year = start.year(); year <= end.year(); year++) {
  81.         // If start or end year
  82.         if (year === start.year() || year === end.year()) {
  83.             count += getYearPublicHolidays(year)
  84.                 .filter(date => date.isSameOrAfter(start) && date.isSameOrBefore(end))
  85.                 .length
  86.         } else {
  87.             count += getYearPublicHolidays(year).length
  88.         }
  89.     }
  90.  
  91.     return count
  92. })
  93.  
  94. export const countWeekendDaysInPeriod = orderStartEnd((start, end) => {
  95.     // start and end are the same day
  96.     if (start.clone().startOf('day').isSame(end.clone().startOf('day'))) {
  97.         return isWeekendDay(start) ? 1 : 0
  98.     }
  99.  
  100.     // start and end are in the same week
  101.     if (start.week() === end.week() && Moment.range(start, end).diff('weeks') === 0) {
  102.         let count = 0
  103.         if (isSunday(start))
  104.             count++
  105.         if (isSaturday(end))
  106.             count++
  107.         return count
  108.     }
  109.  
  110.     // start and end are in different weeks
  111.     let count = 0
  112.     let startWeek = start.clone().startOf('week')
  113.     let endWeek = end.clone().startOf('week')
  114.  
  115.     // Loop on weeks
  116.     for (let date = startWeek.clone(); date.isSameOrBefore(endWeek); date.add(1, 'weeks')) {
  117.         if (date.isSame(startWeek)) {
  118.             count += isSunday(start) ? 2 : 1
  119.         } else if (date.isSame(endWeek)) {
  120.             count += isSaturday(end) ? 2 : 1
  121.         } else {
  122.             count += 2
  123.         }
  124.     }
  125.  
  126.     return count
  127. })
  128.  
  129. // Count worked days in a period (Don't count public holidays and weekend)
  130. export const countWorkedDaysInPeriod = orderStartEnd((start, end) => {
  131.     return Moment.range(start, end).diff('days') + 1 -
  132.         countPublicHolidaysInPeriod(start, end) -
  133.         countWeekendDaysInPeriod(start, end)
  134. })
  135.  
  136. // Calculate worked days in a year (memoized)
  137. const memoizeCountWorkedDaysInYear = {}
  138. export const countWorkedDaysInYear = year => {
  139.     if (!memoizeCountWorkedDaysInYear[year]) {
  140.         memoizeCountWorkedDaysInYear[year] = countWorkedDaysInPeriod(
  141.             Moment(`01/01/${year}`, 'DD/MM/YYYY'),
  142.             Moment(`31/12/${year}`, 'DD/MM/YYYY')
  143.         )
  144.     }
  145.  
  146.     return memoizeCountWorkedDaysInYear[year]
  147. }
  148.  
  149. export const getLastStartMonth = date => date.clone().startOf('month')
  150.  
  151. export const getNextStartMonth = date => date.clone().add(1, 'month').startOf('month')
  152.  
  153. export const getLastJanuary1st = date => date.clone().startOf('year')
  154.  
  155. export const getNextJanuary1st = date => date.clone().add(1, 'years').startOf('year')
  156.  
  157. export const getLastJune1st = date => {
  158.     // June 1st of date's year
  159.     let june1st = date.clone().date(1).month(5).startOf('day')
  160.     if (date.isBefore(june1st)) {
  161.         june1st.subtract(1, 'years')
  162.     }
  163.     return june1st
  164. }
  165.  
  166. export const getNextJune1st = date => {
  167.     // June 1st of date's year
  168.     let june1st = date.clone().date(1).month(5).startOf('day')
  169.     if (date.isAfter(june1st)) {
  170.         june1st.add(1, 'years')
  171.     }
  172.     return june1st
  173. }
  174.  
  175. export const getLastCheckDay = date => {
  176.     // Check day of date's month
  177.     let checkDay = date.clone().date(CHECK_LEAVES_DAY).startOf('day')
  178.     if (date.isBefore(checkDay)) {
  179.         checkDay.subtract(1, 'months')
  180.     }
  181.     return checkDay
  182. }
  183.  
  184. export const getNextCheckDay = date => {
  185.     // Check day of date's month
  186.     let checkDay = date.clone().date(CHECK_LEAVES_DAY).startOf('day')
  187.     if (date.isAfter(checkDay)) {
  188.         checkDay.add(1, 'months')
  189.     }
  190.     return checkDay
  191. }
  192.  
  193.  
  194.  
  195.  
  196.  
  197.  
  198.  
  199.  
  200.  
  201.  
  202.  
  203. // ----------------------------------------------------------------------------
  204.  
  205. export function JFYear(an) {
  206.     var df = 'yyyy-mm-dd'
  207.     var JourAn = Moment(DateFormat(new Date(an, '00', '01'), df))
  208.     var FeteTravail = Moment(DateFormat(new Date(an, '04', '01'), df))
  209.     var Victoire1945 = Moment(DateFormat(new Date(an, '04', '08'), df))
  210.     var FeteNationale = Moment(DateFormat(new Date(an, '06', '14'), df))
  211.     var Assomption = Moment(DateFormat(new Date(an, '07', '15'), df))
  212.     var Toussaint = Moment(DateFormat(new Date(an, '10', '01'), df))
  213.     var Armistice = Moment(DateFormat(new Date(an, '10', '11'), df))
  214.     var Noel = Moment(DateFormat(new Date(an, '11', '25'), df))
  215.     //**var SaintEtienne = new Date(an, '11', '26');**//
  216.  
  217.     var G = an % 19
  218.     var C = Math.floor(an / 100)
  219.     var H = (C - Math.floor(C / 4) - Math.floor((8 * C + 13) / 25) + 19 * G + 15) % 30
  220.     var I = H - Math.floor(H / 28) * (1 - Math.floor(H / 28) * Math.floor(29 / (H + 1)) * Math.floor((21 - G) / 11))
  221.     var J = (an * 1 + Math.floor(an / 4) + I + 2 - C + Math.floor(C / 4)) % 7
  222.     var L = I - J
  223.     var MoisPaques = 3 + Math.floor((L + 40) / 44)
  224.     var JourPaques = L + 28 - 31 * Math.floor(MoisPaques / 4)
  225.     var Paques = Moment(DateFormat(new Date(an, MoisPaques - 1, JourPaques), df))
  226.     //**var VendrediSaint = new Date(an, MoisPaques-1, JourPaques-2);**//
  227.     var LundiPaques = Moment(DateFormat(new Date(an, MoisPaques - 1, JourPaques + 1), df))
  228.     var Ascension = Moment(DateFormat(new Date(an, MoisPaques - 1, JourPaques + 39), df))
  229.     var Pentecote = Moment(DateFormat(new Date(an, MoisPaques - 1, JourPaques + 49), df))
  230.     var LundiPentecote = Moment(DateFormat(new Date(an, MoisPaques - 1, JourPaques + 50), df))
  231.  
  232.     //**SaintEtienne et Vendredi Saint sont des fêtes exclusivement**//
  233.     //**alscacienne. On les ignore dans notre cas.**//
  234.     var res = [JourAn, Paques, LundiPaques, FeteTravail, Victoire1945, Ascension, Pentecote, LundiPentecote, FeteNationale, Assomption, Toussaint, Armistice, Noel]
  235.     return (res)
  236. }
  237.  
  238.  
  239. //******************************************************************************************************************************//
  240. //************************              Renvoie les jours feriers existants entre 2 date                 ***********************//
  241. //******************************************************************************************************************************//
  242.  
  243. export function JoursFeries(start, end) {
  244.     var a1 = JFYear(start.year())
  245.     var a2 = JFYear(end.year())
  246.     var a = a1.concat(a2)
  247.     var b = a.slice(0)
  248.     a.forEach(function (fer) {
  249.         if ((start > fer) || (end < fer)) {
  250.             var index = b.indexOf(fer)
  251.             b.splice(index, 1)
  252.         }
  253.     })
  254.     return (b)
  255. }
  256.  
  257. //******************************************************************************************************************************//
  258. //************************         Fonction diff entre 2 jours renvoi le nbr de jours ecoulées           ***********************//
  259. //******************************************************************************************************************************//
  260.  
  261. export function isFerier(day, start, end) {
  262.     var res = (JoursFeries(start, end))
  263.     var estunJF = false
  264.     res.forEach(function (fer) {
  265.         if (day.isSame(fer)) {              // Si je retrouve un jour férié
  266.             //console.log('comparaison de : ', day, 'et de : ' ,fer)
  267.             estunJF = true
  268.             //console.log('JF détécté : ', day)
  269.             //console.log('')
  270.         }
  271.     })
  272.     return (estunJF)
  273. }
  274.  
  275. //******************************************************************************************************************************//
  276. //************************        Donne les intervalles de jours ouvrées pour une demande de congé       ***********************//
  277. //******************************************************************************************************************************//
  278.  
  279. export function demandeConge(dayA, dayB) {
  280.     // Jamais utilisé !
  281.     //var res = (JoursFeries(dayA, dayB))
  282.  
  283.     // Declaration des variables
  284.     var day = dayA.clone()
  285.     var fin = dayB.add(1, 'days')
  286.     var v = []
  287.     var premierJour = true
  288.     var buffer = 0
  289.     var flag = false
  290.  
  291.     while (!(day.isSame(fin))) {            // tant que je ne depasse pas le jour de fin des congés
  292.         //console.log('Nous sommes le ', day)
  293.         //console.log('premierJour = ', premierJour, 'flag = ', flag)
  294.         if (isFerier(day, dayA, dayB) || day.day() === 6 || day.day() === 0) {
  295.             //console.log('c est un jour F ou un WE ', day)
  296.             flag = true
  297.             buffer = buffer + 1
  298.  
  299.             if ((buffer === 1) && (!premierJour)) {
  300.                 //console.log('ce n est pas le premier jour de demande de conge mais c un premier JF donc on push J-1', day)
  301.                 var d = day.clone()
  302.                 v.push(d.subtract(1, 'days'))
  303.             }
  304.  
  305.             if (premierJour && day.day === 0){
  306.                 //console.log('c est le premier jour et c est un dimanche ', day)
  307.                 premierJour = false
  308.                 flag = true
  309.             }
  310.  
  311.             if (buffer > 1){
  312.                 //console.log('encore un JF ou un WE', day)
  313.                 premierJour = false
  314.             }
  315.         }
  316.  
  317.         else {
  318.             let d
  319.             buffer = 0
  320.  
  321.             if (premierJour) {
  322.                 //console.log('Premier Jour Ouvré on push', day)
  323.                 d = day.clone()
  324.                 v.push(d)
  325.                 premierJour = false
  326.                 flag = false
  327.             }
  328.             else {
  329.                 if (flag) {
  330.                     //console.log('un Jour Ouvré qui suit un JF ou WE', day)
  331.                     d = day.clone()
  332.                     v.push(d)
  333.                     flag = false
  334.                 }
  335.             }
  336.         }
  337.         day.add(1, 'days')
  338.     }
  339.     dayB.subtract(1, 'days')
  340.     if (!(isFerier(dayB, dayA, dayB) || dayB.day() === 6 || dayB.day() === 0)) {
  341.         v.push(dayB)
  342.     }
  343.  
  344.     var answer = []
  345.     var s, e
  346.     for (var i = 0; i < v.length; i++) {
  347.         s = v[i]
  348.         e = v[i + 1]
  349.         answer.push(Moment.range(s, e))
  350.         i++
  351.     }
  352.  
  353.     return (answer)
  354. }
  355.  
  356.  
  357.  
  358. export function nbrJours(start, end, midstart, midend){
  359.     var array = demandeConge(start, end)
  360.     var sum = 0
  361.     //console.log(array)
  362.  
  363.     array.forEach (function(range){
  364.         sum += (range.valueOf() / 86400000) + 1
  365.     })
  366.  
  367.     sum *= 2
  368.  
  369.     if (midstart && sum>0 && !((isFerier(start, start, end) || (start.day() === 6) || (start.day() === 0))))
  370.         sum = sum - 1
  371.     if (midend && sum>0 && !((isFerier(end, start, end) || (end.day() === 6) || (end.day() === 0))))
  372.         sum = sum - 1
  373.     return (sum)
  374. }
  375.  
  376. //******************************************************************************************************************************//
  377. //************************                                Donne le nombre de jours ouvrés par afn                          ***********************//
  378. //******************************************************************************************************************************//
  379.  
  380. export function howManyOuvres(year) {
  381.     let ouvres = 0
  382.     let moment = Moment(year + '-01-01')
  383.     let day = moment.clone()
  384.  
  385.     while (day.year() == year){
  386.         if (( (isFerier(day, Moment(year + '-01-01'), Moment(year + '-12-31'))) || (day.day() === 0) || (day.day() === 6))){
  387.             // console.log('Jours non travaillé : ', day.format('YYYY-MM-DD'))
  388.         }
  389.         else {
  390.             ouvres ++
  391.         }
  392.         day.add(1, 'days')
  393.     }
  394.     return (ouvres)
  395. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement