Skip to content

Instantly share code, notes, and snippets.

@faustofjunqueira
Last active October 28, 2019 15:04
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save faustofjunqueira/f94e5307c2f0fac814f42d2a852c0e89 to your computer and use it in GitHub Desktop.
Save faustofjunqueira/f94e5307c2f0fac814f42d2a852c0e89 to your computer and use it in GitHub Desktop.
adicionado ferias
//https://pontoweb.nasajon.com.br/radix/colaborador/ajustes/criar
// TODO, verificar se esta na tela correta!
///////// Util
function addHour(originalHour, minutesToAdd) {
let [hour, minute] = originalHour.split(':');
minute = Number(minute);
hour = Number(hour);
const fullyMinutes = hour*60 + minute + minutesToAdd;
minute = fullyMinutes % 60;
hour = Math.floor(fullyMinutes/60)
return [padZero(hour), padZero(minute)].join(':');
}
function padZero(number) {
if (number < 10) {
return '0' + number;
} else {
return number.toString();
}
}
function randomNumber(max=1, min=0) {
return Math.round(Math.random() * (max-min)) + min;
}
function randomMinute() {
let minute = Math.ceil(Math.random() * 59);
return padZero(minute);
}
///////// Model
class HourWorkTime {
constructor(hour, justify) {
this.hour = hour;
this.justify = justify;
}
toRequestObject() {
return {
marcacao: {
datahora: this.hour
},
justificativa: this.justify
};
}
}
class WorkTime {
constructor(dateTarget) {
this.dateTarget = dateTarget;
this.hours = [];
}
appendHour(hour, justify) {
this.hours.push(new HourWorkTime(hour, justify));
}
toRequestObject() {
const formData = new FormData();
formData.append('datareferencia', this.dateTarget);
formData.append('diaponto[]', 'Atual');
formData.append('diaponto[]', 'Atual');
formData.append('diaponto[]', 'Atual');
formData.append('diaponto[]', 'Atual');
formData.append('form[ajustes][0][marcacao][datahora]', this.hours[0].hour);
formData.append('form[ajustes][0][justificativa]', this.hours[0].justify);
formData.append('form[ajustes][1][marcacao][datahora]', this.hours[1].hour);
formData.append('form[ajustes][1][justificativa]', this.hours[1].justify);
formData.append('form[ajustes][2][marcacao][datahora]', this.hours[2].hour);
formData.append('form[ajustes][2][justificativa]', this.hours[2].justify);
formData.append('form[ajustes][3][marcacao][datahora]', this.hours[3].hour);
formData.append('form[ajustes][3][justificativa]', this.hours[3].justify);
return formData;
}
toString() {
return this.dateTarget;
}
}
///////// API
const urlWorkTime = './ajustes/criar';
function doRequest(request) {
return fetch(request)
.then(response => {
const contentType = response.headers.get('content-type');
return contentType === 'application/json' ? response.json() : response.text();
});
}
function sendWorkTime(workTime) {
const request = new Request(urlWorkTime, {
method: 'POST',
body: workTime.toRequestObject(),
});
return doRequest(request);
}
///////// Service
function createArrayOfRandomEndHours(numberOfDates, array=[]) {
if(!numberOfDates) {
return array;
} else if (numberOfDates <= 1) {
return createArrayOfRandomEndHours(numberOfDates-1, [...array, 0])
} else if (numberOfDates === 2) {
const minuteRandom = Number(randomMinute());
return createArrayOfRandomEndHours(numberOfDates-2, [...array, minuteRandom, minuteRandom * (-1)]);
} else {
const minuteRandom1 = Number(randomMinute()) * (Math.random() > 0.5 ? 1 : -1);
const minuteRandom2 = Number(randomMinute()) * (Math.random() > 0.5 ? 1 : -1);
const minuteRandom3 = 0 - minuteRandom1 - minuteRandom2;
return createArrayOfRandomEndHours(numberOfDates-3, [...array, minuteRandom1, minuteRandom2, minuteRandom3]);
}
}
function distributionExtraHour(extraHour, numberOfDays, extraHourArray=[]) {
const distributionArray = [34, 55, 89, 144, 180];
if(!extraHour) return extraHourArray;
let minPossibleExtraHourInIteration = distributionArray[0];
let maxPossibleExtraHourInIteration = distributionArray[distributionArray.length-1];
if(extraHour < maxPossibleExtraHourInIteration){
return [...extraHourArray, extraHour];
}
const numberOfExtraHour = extraHourArray.length;
if(extraHour){
const factorOfHealthy = maxPossibleExtraHourInIteration*(numberOfDays - numberOfExtraHour - 1);
while( extraHour - minPossibleExtraHourInIteration > factorOfHealthy) {
distributionArray.shift();
minPossibleExtraHourInIteration = distributionArray[0];
}
}
const value = distributionArray[randomNumber(distributionArray.length-1)];
return distributionExtraHour(extraHour-value, numberOfDays, [...extraHourArray, value]);
}
function applyExtraHour(arrayOfRandomEndHour, extraHour) {
const numberOfDays = arrayOfRandomEndHour.length;
const extraHourArray = distributionExtraHour(extraHour, numberOfDays);
const unusedPosition = arrayOfRandomEndHour.reduce((obj,_,i) => ({...obj, [i]: true}), {});
while(extraHourArray.length) {
const value = extraHourArray.pop();
const avalablePosition = Object.keys(unusedPosition);
const indexRandom = avalablePosition[randomNumber(avalablePosition.length-1)];
delete unusedPosition[indexRandom];
arrayOfRandomEndHour[indexRandom] += value;
}
return arrayOfRandomEndHour;
}
function applyEndRandomHour(hour, arrayOfRandomEndHour) {
if(arrayOfRandomEndHour.length){
const minuteToApply = arrayOfRandomEndHour.pop();
return addHour(hour, minuteToApply);
}
return hour;
}
function createWorkTime(arrayOfRandomEndHour) {
return date => {
const workTime = new WorkTime(date);
const minutesInOut = randomMinute();
const minutesLunch = randomMinute();
const enterHour = '09:' + minutesInOut;
const exitHour = applyEndRandomHour('18:' + minutesInOut, arrayOfRandomEndHour);
workTime.appendHour(enterHour, 'Alocado no cliente');
workTime.appendHour('12:' + minutesLunch, 'Almoço saída');
workTime.appendHour('13:' + minutesLunch, 'Almoço retorno');
workTime.appendHour(exitHour, 'Final expediente');
return workTime;
}
}
async function parallelSendDates(workTimeList) {
for (let workTime of workTimeList) {
try {
console.info(`>>> ${workTime.toString()} Enviado com sucesso!`);
await sendWorkTime(workTime);
} catch (e) {
console.error(`>>> ${workTime.toString()} Enviado com erro!`);
console.error(e);
}
}
}
function sendDates(dateList, arrayOfRandomEndHour) {
const workTimeList = dateList.map(createWorkTime(arrayOfRandomEndHour));
const length = dateList.length;
if(length > 3) {
const factor = Math.floor(length/3);
return Promise.all([
parallelSendDates(workTimeList.slice(0, factor)),
parallelSendDates(workTimeList.slice(factor, 2*factor)),
parallelSendDates(workTimeList.slice(2*factor))
])
}
return parallelSendDates(workTimeList)
}
function checkExtraHour(extraHour, numberOfDays) {
return !isNaN(extraHour)
&& extraHour < numberOfDays * 3; // vericando se eh menor que 3 horas por dia
}
function questionAboutExtraHour(arrayOfRandomEndHour) {
const numberOfDays = arrayOfRandomEndHour.length;
if(confirm('Deseja incluir horas extras?')) {
const msgPrompt = `Informe a quantidade de horas extras. Em HORAS!
Ex: 2
para duas horas extras`;
let extraHour;
do{
extraHour = Number(prompt(msgPrompt));
if(!extraHour) break;
}while(!checkExtraHour(extraHour, numberOfDays));
extraHour = extraHour || 0;
if(extraHour) alert(`Será lançado ${extraHour} horas extras`);
extraHour *= 60; // converte em minutos
return extraHour;
}
return 0;
}
///////// View
function getDataFromTable() {
const tableRowsHtml = document.querySelectorAll('table#pendencias-table tbody tr');
const dates = Array.from(tableRowsHtml)
.filter(rowHtml => rowHtml.getElementsByTagName('td')[1])
.filter(rowHtml => rowHtml.getElementsByTagName('td')[1].innerText == 'Ausência de marcação' && rowHtml.getAttribute("data-date"))
.map(rowHtml => rowHtml.getAttribute("data-date"));
return dates;
}
///////// Execution
console.warn(`ATENÇÃO
A execuçao desse algoritmo, eh de unica e restrita responsabilidade do executor!
Não use se não souber o que está fazendo!`);
console.info('============= START PROCESS =============');
const _dl = getDataFromTable()
let arrayOfRandomEndHour = createArrayOfRandomEndHours(_dl.length);
const extraHour = questionAboutExtraHour(arrayOfRandomEndHour);
if(extraHour){
arrayOfRandomEndHour = applyExtraHour(arrayOfRandomEndHour, extraHour)
}
// TODO: Questinoar sobre horas extras
// TODOL aplicar as horas extras no array arrayOfRandomEndHour
if(confirm('Voce deseja executar o lançamento?')){
sendDates(_dl, arrayOfRandomEndHour)
.then(() => console.info('============= END PROCESS ============='))
.catch(() => console.error('============= END PROCESS WITH ERROR =============') || console.error(e))
}else{
window.location.reload();
}
@rennanc
Copy link

rennanc commented Mar 27, 2019

//https://pontoweb.nasajon.com.br/radix/colaborador/ajustes/criar

//const ferias = [inicio, final];
//exemplo: 
const ferias = ['25/11/2019', '25/12/2019'];

const regexData = /\d\d\/\d\d\/\d\d\d\d/;
if (ferias) {
    if (!(Array.isArray(ferias) && ferias.length == 2 && regexData.test(ferias[0]) && regexData.test(ferias[1]))) {
        throw new Error('Formato das datas das ferias nao estão corretos');
    }
}



const estouDeFerias = data => {
    if (ferias) {
        if (regexData.test(data)) {
            const dataMin = moment(ferias[0], 'DD/MM/YYYY');
            const dataMax = moment(ferias[1], 'DD/MM/YYYY');
            data = moment(data, 'DD/MM/YYYY');
            return data.isBetween(dataMin, dataMax) || data.isSame(dataMin) || data.isSame(dataMax);
        }
        throw new Error('Array de ferias fora do formato correto');
    }
    return false;
}

function marcacao(hora, justificativa) {
    return {
        marcacao: {
            datahora: hora
        },
        historico: "0718b299-67bd-47b4-ae05-20ad99301b35" //problema no ponto
    };
}

function randomMinute() {
    let minute = Math.ceil(Math.random() * 60);
    if (minute < 10) {
        return '0' + minute;
    } else {
        return minute.toString();
    }
}

function ajuste(dateReference) {
    let ajuste_lista = [];
    let diaponto = ['Atual', 'Atual', 'Atual', 'Atual'];
    let minutesInOut = randomMinute();
    let minutesLunch = randomMinute();
    ajuste_lista.push(marcacao('09:' + minutesInOut, 'Alocado no cliente'));
    ajuste_lista.push(marcacao('12:' + minutesLunch, 'Almoço saída'));
    ajuste_lista.push(marcacao('13:' + minutesLunch, 'Almoço retorno'));
    ajuste_lista.push(marcacao('18:' + minutesInOut, 'Final expediente'));



    return {
        datareferencia: dateReference,
        diaponto: diaponto,
        form: {
            ajustes: ajuste_lista
        }
    };
}

function send(url, date) {
    return jQuery.post(url, ajuste(date)).success(function(data) {
        console.info('sucesso!', data);
    }).error(function(data) {
        console.error('error', data);
    });
}

// function makeurl(data) {
//     let url = './ajustes/';

//     let splitted = data.split('/');
//     let mapped = splitted.map((x) => parseInt(x));

//     return url + mapped.reverse().join('/')
// }


function envioCoordenado(dates, fnfinal) {

    let url = './ajustes/criar';

    if (!dates.length) {
        if (fnfinal) {
            fnfinal();
        }
        return;
    }

    let date = dates.pop();
    if (!estouDeFerias(date)) {
        send(url, date).success((d) => {
            console.log('sucesso ' + date, d);
            envioCoordenado(dates, fnfinal);
        }).error((d) => console.error('error ' + date, d));
    } else {
        envioCoordenado(dates, fnfinal);
    }
}


var jq = document.createElement('script');
jq.src = "https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js";
document.getElementsByTagName('head')[0].appendChild(jq);
var momentElement = document.createElement('script');
momentElement.src = "https://momentjs.com/downloads/moment.js";
document.getElementsByTagName('head')[0].appendChild(momentElement);
// ... give time for script to load, then type (or see below for non wait option)

console.log("============ATENÇÃO============");
console.log("Esse script deve ser usado unicamente para fins acadêmicos");

setTimeout(function() {
    jQuery.noConflict();
    console.info('============= START PROCESS =============');
    let datas = [];
    jQuery('table#pendencias-table').find("tr").each(function() {
        var date = jQuery(this).attr('data-date')
        if (date)
            datas.push(date);
    });
    envioCoordenado(datas, () => console.info('============= END PROCESS ============='));
}, 1000);

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment