Commit 9c816686 authored by Eric Seigne's avatar Eric Seigne
Browse files

version 1.6.11

parent 4788bae8
# 1.6.10
# 1.6.11
- corrige un bug de calcul automatique des distances pour les itinéraires avec étapes
-
- ameliore le système de récupération des tickets justificatifs manquants (lorsqu'un
transfert a échoué).
# 1.6.10
- corrige un bug de sauvegarde de l'immatriculation du véhicule pro
# 1.6.9
- corrige un bug d'accès en écriture en // à IndexedDB sur certains smartphone
......
<?xml version='1.0' encoding='utf-8'?>
<widget id="fr.caprel.doliscan" version="1.6.10" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0">
<widget id="fr.caprel.doliscan" version="1.6.11" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0">
<name>doliscan</name>
<description>DoliSCAN is a tiny app for french people looking for a free and self hosting "notes de frais/expenses report" solution.</description>
<author email="eric.seigne@cap-rel.fr" href="https://cap-rel.fr">Eric Seigne</author>
......@@ -149,5 +149,5 @@
</feature>
</platform>
<plugin name="cordova-plugin-calendar" />
<preference name="OverrideUserAgent" value="Mozilla/5.0 OpenNDF/1.6.10 Android" />
<preference name="OverrideUserAgent" value="Mozilla/5.0 OpenNDF/1.6.11 Android" />
</widget>
......@@ -2,7 +2,7 @@
* (c) Éric Seigne <eric.seigne@cap-rel.fr> - 2019-2020 - GNU AGPLv3
* full source code in src/ subfolder, this file is minifyed
*/
var globalDevMode=true;var globalMyCamera;var globalpictureSource;var globaldestinationType;var globalNetworkResponse=Date.now();var globalCurrentPage="";var globalCurrentTitle="";var globalTenMinuts=60*10*1000;var globalCompatibleWithAPIVersion=4;var globalDoliScanDomain="";var globalLastInsertId="";var globalSyncInProgress=false;var globalPictureFileName="";var globalAppVersion="1.6.10";var dataLDF="";var dataIK="";var globalMyNavigator=undefined;var globalResumable=undefined;var globalProgressBar=undefined;var globalTypeFrais="";var globalVehiculeEd=undefined;var globalSrvKeys=['email','api_token','firstname','name','adresse','cp','ville','pays','send_copy_to','compta_email','compta_ik','compta_peage','compta_hotel','compta_train','compta_carburant','compta_taxi','compta_restauration','compta_divers','compta_compteperso','compta_tvadeductible','official_app_version','official_app_message','mode_simple'];var globalPicturesAvailable=[];function errorHandlerCustomFile(title,message){myDebug('errorHandlerCustomFile : '+title+' -- message follow:');myDebug(message);}
var globalDevMode=false;var globalMyCamera;var globalpictureSource;var globaldestinationType;var globalNetworkResponse=Date.now();var globalCurrentPage="";var globalCurrentTitle="";var globalTenMinuts=60*10*1000;var globalCompatibleWithAPIVersion=4;var globalDoliScanDomain="";var globalLastInsertId="";var globalSyncInProgress=false;var globalPictureFileName="";var globalPicturesAvailable=[];var globalSyncObject=[];var globalAppVersion="1.6.11";var dataLDF="";var dataIK="";var globalMyNavigator=undefined;var globalResumable=undefined;var globalProgressBar=undefined;var globalTypeFrais="";var globalVehiculeEd=undefined;var globalSrvKeys=['email','api_token','firstname','name','adresse','cp','ville','pays','send_copy_to','compta_email','compta_ik','compta_peage','compta_hotel','compta_train','compta_carburant','compta_taxi','compta_restauration','compta_divers','compta_compteperso','compta_tvadeductible','official_app_version','official_app_message','mode_simple'];function errorHandlerCustomFile(title,message){myDebug('errorHandlerCustomFile : '+title+' -- message follow:');myDebug(message);}
function loadCustomCSS(){if((typeof cordova=='undefined')||(cordova===null)||(cordova=="")){return;}
if((typeof cordova.file=='undefined')||(cordova.file===null)||(cordova.file=="")){return;}
if((typeof cordova.file.cacheDirectory=='undefined')||(cordova.file.cacheDirectory===null)||(cordova.file.cacheDirectory=="")){return;}
......@@ -108,9 +108,9 @@ function createIK(titre,ladate,message,arrivee,depart){myDebug("createIK : "+tit
function sendForm(leformName){myDebug("sendForm "+leformName);showWait();$.ajaxSetup({timeout:10000,headers:{'X-CSRF-TOKEN':localGetData("api_token")}});if(document.getElementById('ladate')){myDebug("on a ladate : "+document.getElementById('ladate').value);localStoreData("ladate",document.getElementById('ladate').value);}
var moyenPaiement=null;var els=document.getElementsByName('moyenPaiement');for(var i=0;i<els.length;i++){if(els[i].checked){moyenPaiement=els[i].value;myDebug("on a moyenPaiement : "+moyenPaiement);localStoreData("moyenPaiement",moyenPaiement);break;}}
var leform=document.getElementById(leformName);myDebug("formdata tout neuf");var formdata=new FormData(leform);myDebug(formdata);formdata.append('_token',localGetData("api_token"));if(document.getElementById('updateID').value==0){myDebug("on est pas en update");var hasImage=document.getElementById('smallImage');if(hasImage!==null&&!globalDevMode){var file=document.getElementById('smallImage').getAttribute("src");if(file!=""){myDebug("sendForm fileImage : "+file);let typeFraisObj=document.getElementById(leformName).typeFrais;myDebug("sendForm typeFraisObj: "+typeFraisObj.value);globalTypeFrais="autre";if(typeFraisObj!==null){globalTypeFrais=typeFraisObj.value;}
myDebug("appel de endSendForm ...");endSendForm(formdata,file);}
myDebug("appel de endSendForm ... (ligne 65) fic = "+file);endSendForm(formdata,file);}
else{myDebug('Image introuvable ...');ons.notification.alert("Photo du justificatif introuvable !",{title:"Attention"});hideWait();}}
else{myDebug('pas d image ...');endSendForm(formdata,"");}}
else{myDebug("appel de endSendForm ... pas d'image (fic vide)");endSendForm(formdata,"");}}
else{myDebug("On n'essaye pas de joindre le fichier on est en UPDATE")
endSendFormForUpdate(formdata,leformName);}}
function endSendFormForUpdate(formdata,leformName){formJSON=document.getElementById(leform).serializeJSON();myDebug("endSendFormForUpdate JSON : "+formJSON);dataLDF="";if(ajaxRequestUpdate)
......@@ -118,6 +118,7 @@ ajaxRequestUpdate.abort();var ajaxRequestUpdate=$.ajax({url:localGetData("api_se
else{ons.notification.alert("Le serveur n'est pas accessible. Votre document est enregistré sur votre téléphone, pensez à le synchroniser avec le serveur dès que vous retrouverez une bonne connexion (utilisez le menu synchronisation à ce moment là).",{title:"Réseau lent (1)"}).then(function(){gotoPage("menu.html",true);});}},error:function(request,textStatus,errorThrown){hideWait();myDebug("Request finished (error signal) : "+textStatus);},});}
function endSendForm(formdata,filename){let subject="";myDebug('endSendForm ... avec fic = '+filename+' mais sur ios on utilisera plutot globalPictureFileName = '+globalPictureFileName);if(device!==undefined){if(device.platform=="iOS"){filename=globalPictureFileName;}}
else{myDebug("device is undef !");}
if(filename==""){filename=globalPictureFileName;}
var objectTempToConvertFD={};formdata.forEach((value,key)=>{if(key=="afile"||key=="moyenPaiement"){}
else{if(!Reflect.has(objectTempToConvertFD,key)){objectTempToConvertFD[key]=value;return;}
if(!Array.isArray(objectTempToConvertFD[key])){objectTempToConvertFD[key]=[objectTempToConvertFD[key]];}
......@@ -126,7 +127,7 @@ var formDataInJSON=JSON.stringify(objectTempToConvertFD);if(globalIndexedDB!==nu
else{if(globalSyncInProgress==true){myDebug(" endSendForm on evite de sauvegarder les donnees en BDD avant upload car on est en synchronisation...");}}
myDebug(" endSendForm on se connecte sur "+localGetData("api_server")+"/api/LdeFrais");if(ajaxRequestSendForm){ajaxRequestSendForm.abort();}
if(filename!=""){gotoPage('messageUploadProgress.html',false);}
var ajaxRequestSendForm=$.ajax({url:localGetData("api_server")+"/api/LdeFrais",timeout:10000,type:"POST",data:formdata,processData:false,cache:false,contentType:false,tryCount:3,retryLimit:4,beforeSend:function(xhr){xhr.setRequestHeader('Authorization','Bearer '+localGetData("api_token"));},xhrFields:{withCredentials:true},success:function(result,textStatus,request){hideWait();globalNetworkResponse=Date.now();myDebug("Request finished (success signal) : "+textStatus+(result+'').length);myDebug("Request status (success signal) : "+request.status);myDebug("+++++++++++++++++++++++++++++++++++++++++++++++");myDebug(result.fileName);myDebug("+++++++++++++++++++++++++++++++++++++++++++++++");if(request.status=="201"){let ajaxURL=localGetData("api_server")+"/api/upload";myDebug("Request finished, creation d'un objet resumable");let r=newResumable(ajaxURL,result,filename);}
var ajaxRequestSendForm=$.ajax({url:localGetData("api_server")+"/api/LdeFrais",timeout:10000,type:"POST",data:formdata,processData:false,cache:false,contentType:false,tryCount:3,retryLimit:4,beforeSend:function(xhr){xhr.setRequestHeader('Authorization','Bearer '+localGetData("api_token"));},xhrFields:{withCredentials:true},success:function(result,textStatus,request){hideWait();globalNetworkResponse=Date.now();myDebug("Request finished (success signal) : "+textStatus+(result+'').length);myDebug("Request status (success signal) : "+request.status);myDebug("+++++++++++++++++++++++++++++++++++++++++++++++");myDebug(result.fileName);myDebug("+++++++++++++++++++++++++++++++++++++++++++++++");if(request.status=="201"){let ajaxURL=localGetData("api_server")+"/api/upload";myDebug("Request finished, creation d'un objet resumable pour envoyer le fichier");let r=newResumable(ajaxURL,result,filename);}
else{ons.notification.alert("Erreur de transfert avec le serveur. Votre document est enregistré sur votre téléphone, pensez à le synchroniser avec le serveur dès que vous retrouverez une bonne connexion (utilisez le menu synchronisation à ce moment là).",{title:"Réseau lent (3)"}).then(function(){gotoPage("menu.html",true);});}},error:function(request,textStatus,errorThrown){hideWait();uploadErrorSaveFile(filename);myDebug("Request finished (error signal) : "+textStatus);if(textStatus=='timeout'){myDebug('timeout, try again ...');ons.notification.alert("Erreur de transfert avec le serveur. Votre document est enregistré sur votre téléphone, pensez à le synchroniser avec le serveur dès que vous retrouverez une bonne connexion (utilisez le menu synchronisation à ce moment là).",{title:"Réseau lent (4)"}).then(function(){gotoPage("menu.html",true);});return;}
if(request.status==500){ons.notification.alert("Une erreur serveur est survenue. Votre document est enregistré sur votre téléphone, pensez à le synchroniser avec le serveur un peu plus tard via le menu synchronisation. Si le problème persiste contactez-nous par mail à sav@doliscan.fr.",{title:"Réseau lent (5)"}).then(function(){gotoPage("menu.html",true);});}else{ons.notification.alert("Le serveur n'est pas accessible. Votre document est enregistré sur votre téléphone, pensez à le synchroniser avec le serveur dès que vous retrouverez une bonne connexion (utilisez le menu synchronisation à ce moment là).",{title:"Réseau lent (6)"}).then(function(){gotoPage("menu.html",true);});}}});}
function genericCheckForm(leform=null){myDebug("genericCheckForm "+leform);if(leform==null){myDebug("genericCheckForm leform null");return false;}
......@@ -152,11 +153,11 @@ function newResumable(ajaxURL,result,filename){myDebug("creation de l'objet glob
if(typeof filename===undefined||filename==""){if(globalIndexedDB!==null&&databaseEngine=='IndexedDB'){myDebug("globalLastInsertId : "+globalLastInsertId);if(globalLastInsertId>0){localDeleteLDFtoSync(globalLastInsertId);globalLastInsertId="";}}
gotoPage('messageDone.html',false);return;}
let tChunks=false;if(window.cordova.platformId=="android"){tChunks=true;}
globalResumable=new Resumable({chunkSize:1*512*1024,simultaneousUploads:4,testChunks:tChunks,throttleProgressCallbacks:1,chunkRetryInterval:500,maxChunkRetries:4,xhrTimeout:40000,target:ajaxURL,headers:{ldfFileName:result.fileName,Authorization:'Bearer '+localGetData("api_token"),}});if(typeof globalProgressBar==='undefined'){myDebug("resumable : creation de globalProgressBar ");globalProgressBar=new ProgressBar($('#upload-progress'));}
globalResumable=new Resumable({chunkSize:1*512*1024,simultaneousUploads:2,testChunks:tChunks,throttleProgressCallbacks:1,chunkRetryInterval:500,maxChunkRetries:4,xhrTimeout:40000,target:ajaxURL,headers:{ldfFileName:result.fileName,Authorization:'Bearer '+localGetData("api_token"),}});if(typeof globalProgressBar==='undefined'){myDebug("resumable : creation de globalProgressBar ");globalProgressBar=new ProgressBar($('#upload-progress'));}
globalResumable.on('fileAdded',function(file,event){myDebug("resumable : fileAdded ");globalProgressBar.fileAdded();myDebug("Apres progressBar.fileAdded, on essaye de lancer l'upload");globalResumable.upload();});globalResumable.on('fileSuccess',function(file,message){myDebug("resumable : fileSuccess ");globalProgressBar.finish();if(globalIndexedDB!==null&&databaseEngine=='IndexedDB'){myDebug("globalLastInsertId : "+globalLastInsertId);if(globalLastInsertId>0){localDeleteLDFtoSync(globalLastInsertId);globalLastInsertId="";}}
gotoPage('messageDone.html',false);});globalResumable.on('fileError',function(file,message){myDebug("resumable : fileError on essaye de sauvegarder le fichier en espace permanent ...");uploadErrorSaveFile(filename);ons.notification.alert("Erreur de transfert du fichier, réessayez plus tard depuis le menu Synchronisation. Assurez-vous d'avoir une bonne couverture 4G/Data ou d'utiliser une connexion internet rapide via WiFi.",{title:"Attention"}).then(function(){gotoPage("menu.html",true);});});globalResumable.on('progress',function(){myDebug("resumable : progress "+globalResumable.progress());globalProgressBar.uploading(globalResumable.progress()*100);});globalResumable.on('pause',function(){myDebug("resumable : pause ");});myDebug("resumable : ajout du fichier "+filename);myDebug('pushFileResumeable (1) : '+filename);window.resolveLocalFileSystemURL(filename,function(fileEntry){fileEntry.file(function(file){var reader=new FileReader();var fileSize=file.size;reader.onloadend=function(e){var fileContent=new Uint8Array(reader.result);var myBlob=new Blob([fileContent],{type:'image/jpeg'});myBlob.name=result.fileName;myDebug("pushFileResumeable : addFile sur globalResumable");globalResumable.addFile(myBlob);};reader.readAsArrayBuffer(file);},errorHandlerFileResumeable.bind(null,"Error on FileEntry "+filename));},errorHandlerFileResumeable.bind(null,"Error on resolveLocalFileSystemURL "+filename));}
function uploadErrorSaveFile(filename){if(globalSyncInProgress==false){var today=new Date();var destFilename=today.getFullYear().toString()+('0'+(today.getMonth()+1)).slice(-2)+('0'+today.getDate()).slice(-2)+"_"
+today.getHours().toString()+today.getMinutes().toString()+"-"+globalTypeFrais+"-"+basename(filename);moveFile(filename,destFilename);myDebug('endSendForm ... avec fic permanent sur = '+destFilename);}}
function uploadErrorSaveFile(filename){myDebug('uploadErrorSaveFile, fic = '+filename);if(globalSyncInProgress==false){var today=new Date();var destFilename=today.getFullYear().toString()+('0'+(today.getMonth()+1)).slice(-2)+('0'+today.getDate()).slice(-2)+"_"
+today.getHours().toString()+today.getMinutes().toString()+"-"+globalTypeFrais+"-"+basename(filename);moveFile(filename,destFilename);myDebug('uploadErrorSaveFile, fic permanent sur = '+destFilename);}}
function blinkElement(elem,times,speed){if(times>0||times<0){if($(elem).hasClass("blink"))
$(elem).removeClass("blink");else
$(elem).addClass("blink");}
......@@ -402,12 +403,13 @@ if(localFileName.startsWith("file://")>0){myDebug(" nettoyage de pathToFile (fi
endSendForm(formdata,pathToFile+localFileName);}}
objectStore.get(idToSync).onerror=function(event){myDebug(" get idToSync Error"+JSON.stringify(event));}}
myDebug("end rsyncOne ...");}
function filtreTexte(arr,requete){return arr.filter(function(el){return el.toLowerCase().indexOf(requete.toLowerCase())!==-1;})}
function getListToSync(){showWait();globalSyncInProgress=true;myDebug("start getListToSync");$.ajaxSetup({timeout:10000,headers:{'X-CSRF-TOKEN':localGetData("api_token")}});if(ajaxDownloadListToSync)
ajaxDownloadListToSync.abort();let htmlFTS="";$('#feedToSync').empty();var ajaxDownloadListToSync=$.ajax({type:"GET",timeout:5000,dataType:"json",url:localGetData("api_server")+"/api/ldfImagesMissed",data:{email:localGetData("email"),},beforeSend:function(xhr){xhr.setRequestHeader('Authorization','Bearer '+localGetData("api_token"));},success:function(result){globalNetworkResponse=Date.now();myDebug('ajaxDownloadListToSync : succès ...'+JSON.stringify(result));let id=1;for(var k in result){console.log(k,result[k]);let leFic=filtreTexte(globalPicturesAvailable,result[k].searchFile);if(leFic!=""){searchFile
htmlFTS+="<div style=\"clear:both\">"+id+" du "+result[k].ladate+" ("+result[k].label+", "+nbFR(result[k].ttc)+" ) <br /><div style=\"float:right\"><ons-button modifier=\"material\" onclick=\"rSyncOne("+id+");\">Synchroniser</ons-button> </div></div><hr />\n";id++;}
function rSyncOneNew(idToSync,localFileName){showWait();myDebug("start rSyncOneNew ... pour idToSync = "+idToSync);let data=globalSyncObject[idToSync];globalLastInsertId=idToSync;globalSyncInProgress=true;myDebug("start rSyncOneNew ... pour globalLastInsertId = "+globalLastInsertId);var formdata=new FormData();for(var key in data){formdata.append(key,data[key]);myDebug(" rSyncOneNew data "+key+" = "+data[key]);}
myDebug(" rSyncOneNew localFileName "+localFileName);endSendForm(formdata,localFileName);}
function filtreTexte(arr,requete){myDebug("filtreTexte :"+requete+" dans "+JSON.stringify(arr));return arr.filter(function(el){return el.toLowerCase().indexOf(requete.toLowerCase())!==-1;})}
function getListToSync(){showWait();globalSyncObject=[];globalSyncInProgress=true;myDebug("start getListToSync");$.ajaxSetup({timeout:10000,headers:{'X-CSRF-TOKEN':localGetData("api_token")}});if(ajaxDownloadListToSync)
ajaxDownloadListToSync.abort();let htmlFTS="";$('#feedToSync').empty();var ajaxDownloadListToSync=$.ajax({type:"GET",timeout:5000,dataType:"json",url:localGetData("api_server")+"/api/ldfImagesMissed",data:{email:localGetData("email"),},beforeSend:function(xhr){xhr.setRequestHeader('Authorization','Bearer '+localGetData("api_token"));},success:function(result){globalNetworkResponse=Date.now();myDebug('ajaxDownloadListToSync : succès ...'+JSON.stringify(result));let id=1;for(var k in result){globalSyncObject[k]=result[k];console.log(k,result[k]);let leFic=filtreTexte(globalPicturesAvailable,result[k].searchFile);myDebug("filtreTexte retour :"+leFic);if(leFic!=""){myDebug(' ajout du code HTML pour '+id);htmlFTS+="<div style=\"clear:both\">Justificatif des frais du "+result[k].ladate+" ("+result[k].label+", "+nbFR(result[k].ttc)+" ) <br /><div style=\"float:right\"><ons-button modifier=\"material\" onclick=\"rSyncOneNew("+id+",'"+leFic+"');\">Synchroniser</ons-button> </div></div><hr />\n";id++;}
else{myDebug(' fichier introuvable '+result[k].searchFile);}}
hideWait();$('#feedToSync').append(htmlFTS);},error:function(result){hideWait();myDebug('ajaxDownloadListToSync : error '+result.error);}});myDebug("end getListToSync");}
myDebug("apres le for");hideWait();$('#feedToSync').append(htmlFTS);},error:function(result){hideWait();myDebug('ajaxDownloadListToSync : error '+result.error);}});myDebug("end getListToSync");}
function rmVehicule(storageKey,id){let vehicules=JSON.parse(localGetData(storageKey));vehicules.splice(id,1);if(vehicules.length>0)
localStoreData(storageKey,JSON.stringify(vehicules));else
localStoreData(storageKey,null);}
......
......@@ -2,7 +2,7 @@
* (c) Éric Seigne <eric.seigne@cap-rel.fr> - 2019 - GNU AGPLv3
*/
var globalDevMode = true; // on est en mode dev ou prod ? par defaut oui pour la page d'index
var globalDevMode = false; // on est en mode dev ou prod ? par defaut oui pour la page d'index
var globalMyCamera; // l'appareil photo
var globalpictureSource; // picture source
var globaldestinationType; // sets the format of returned value
......@@ -15,9 +15,11 @@ var globalDoliScanDomain = ""; // Pour basculer sur un serveur auto-heb
var globalLastInsertId = ""; // Avant d'envoyer les données au serveur on les stocke en cache dans la base, ceci est l'id à supprimer si l'upload est ok
var globalSyncInProgress = false; // Pour savoir si on est en phase de synchronisation ou pas (gestion différente du "formulaire" d'upload)
var globalPictureFileName = ""; // Le nom du fichier sans résolution (depuis ios wkbidule app:// ... on garde dans cette variable le path basique pour resumable & sync)
var globalPicturesAvailable = []; // Liste des images disponibles (locales)
var globalSyncObject = []; // Objet qui stocke tout ce qui reste à synchroniser
// **********************************************************************
//Ne pas toucher, mis à jour automatiquement à partir du config.xml
var globalAppVersion = "1.6.10"; // mis à jour automatiquement à partir du fichier config.xml lors du build android
var globalAppVersion = "1.6.11"; // mis à jour automatiquement à partir du fichier config.xml lors du build android
// **********************************************************************
var dataLDF = "";
var dataIK = "";
......@@ -30,5 +32,3 @@ var globalVehiculeEd = undefined; //vehicule a modifier
var globalSrvKeys = ['email', 'api_token', 'firstname', 'name', 'adresse', 'cp', 'ville', 'pays', 'send_copy_to', 'compta_email',
'compta_ik', 'compta_peage', 'compta_hotel', 'compta_train', 'compta_carburant', 'compta_taxi', 'compta_restauration', 'compta_divers',
'compta_compteperso', 'compta_tvadeductible', 'official_app_version', 'official_app_message', 'mode_simple'];
var globalPicturesAvailable = []; //Liste des images disponibles (locales)
var globalSyncObject = []; //objet qui stocke tout ce qu'il reste à synchroniser
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment