Commit aaf01a35 authored by Eric Seigne's avatar Eric Seigne
Browse files

API version 4

parent 803a10a5
<?xml version='1.0' encoding='utf-8'?>
<widget id="fr.caprel.doliscan" version="1.0.10" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0">
<widget id="fr.caprel.doliscan" version="1.0.11" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0">
<name>doliscan</name>
<description>
A simple app for french people looking for a free and self hosting "notes de frais/expenses report" solution.
......@@ -50,7 +50,7 @@
<edit-config file="*-Info.plist" mode="merge" target="NSPhotoLibraryAddUsageDescription">
<string>Please pick a pictures of your invoice / receipt</string>
</edit-config>
<preference name="OverrideUserAgent" value="Mozilla/5.0 OpenNDF/1.0.10 Android" />
<preference name="OverrideUserAgent" value="Mozilla/5.0 OpenNDF/1.0.11 Android" />
<plugin name="cordova-plugin-inappbrowser" spec="^3.0.0" />
<plugin name="cordova-plugin-whitelist" spec="^1.3.4" />
</widget>
......@@ -37,5 +37,6 @@
<script type="text/javascript" src="js/index.min.js"></script>
<script type="text/javascript" src="js/pinch-zoom.js"></script>
<script type="text/javascript" src="js/session-timeout.js"></script>
<script type="text/javascript" src="js/resumable.js"></script>
</html>
......@@ -340,3 +340,13 @@ select::-ms-expand {
position: relative;
z-index: 2;
}
#upload-progress {
height: 25px;
background-color: grey;
}
.progress-bar {
height: 25px;
background-color: dodgerblue;
}
......@@ -196,7 +196,7 @@
var icone = faIcone(data.label, data.type_frais_id);
var texte = ladate + " " + data.label;
if (data.ttc > 0) {
texte += " (" + nbFR.format(data.ttc) + ")";
texte += " (" + nbFR(data.ttc) + ")";
}
var loadthis = "<ons-list-item modifier=\"longdivider\" tappable onclick=\"localStoreData('ldfId','" + data.sid + "');gotoPage('detailsLdf.html', true);\"><div class=\"left\">" + icone + "</div><div class=\"center\">" + texte + "</div></ons-list-item>";
$(loadthis).hide().appendTo($('#contenuNDFS')).fadeIn(1000);
......
......@@ -36,7 +36,7 @@
dataLDF = result;
//Pour forcer la persistance des données ... il faut modifier l'objet...
dataLDF['moyenPaiement'] = result.paiement_slug;
myDebug(dataLDF);
// myDebug(dataLDF);
globalNetworkResponse = Date.now();
var ladate = dateFormatDDMMYYYY(dataLDF.ladate);
......@@ -107,16 +107,21 @@
},
success: function (result, textStatus, request) {
globalNetworkResponse = Date.now();
hideWait();
myDebug("Request DELETE finished (success signal) : " + textStatus + '(' + result.length + ')');
myDebug("Request DELETE status (success signal) : " + request.status);
if (request.status == "200") {
gotoPage('messageDone.html', false);
ons.notification.alert("Document supprimé.", { title: "Terminé" });
gotoPage('details.html', false);
}
else {
gotoPage('messageError.html', false);
ons.notification.alert("Une erreur s'est produite ... re essayez plus tard.", { title: "Erreur" });
gotoPage('details.html', false);
}
},
error: function(result) {
hideWait();
ons.notification.alert("Une erreur s'est produite ... re essayez plus tard.", { title: "Erreur" });
}
});
}
......
......@@ -295,6 +295,7 @@
cordova.plugins.dns.resolve(globalDoliScanDomain, DNSresolveSuccess, DNSresolveFailure);
}
//Authentification sur le serveur
function loginJson() {
let lemail = document.getElementById('email').value;
let lpassword = document.getElementById('password').value;
......@@ -368,11 +369,13 @@
},
error: function (result) {
hideWait();
// myDebug('index.html : erreur 2 ...');
$("#erreurLogin").show();
// setTimeout(function(){ $("#erreurLogin").hide(); }, 5000);
// ons.notification.alert("Erreur d'authentification.<br />Vérifiez votre mot de passe ...");
// myDebug("carouselLogin 6");
myDebug(result.status);
if (result.status == "503") {
ons.notification.alert("Serveur indisponible, veuillez re-essayer plus tard.");
}
else {
$("#erreurLogin").show();
}
carouselLogin();
}
});
......
This diff is collapsed.
......@@ -11,13 +11,13 @@ var globalCurrentPage = ""; // Page courante pour gérer le retour p
var globalCurrentTitle = ""; // Titre de la page courante
var globalDB = null; // Le connecteur vers la base de données SQLite
var globalTenMinuts = 60 * 10 * 1000; // 10 minutes pour l'implementation du keepalive (avant de basculer en full API je pense)
var globalCompatibleWithAPIVersion = 3; // On incrémentera la version de l'API compatible quand on modifie des choses importantes sur le serveur
var globalCompatibleWithAPIVersion = 4; // On incrémentera la version de l'API compatible quand on modifie des choses importantes sur le serveur
var globalDoliScanDomain = ""; // Pour basculer sur un serveur auto-hebergé
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)
// **********************************************************************
//Ne pas toucher, mis à jour automatiquement à partir du config.xml
var globalAppVersion = "1.0.10"; // mis à jour automatiquement à partir du fichier config.xml lors du build android
var globalAppVersion = "1.0.11"; // mis à jour automatiquement à partir du fichier config.xml lors du build android
// **********************************************************************
var dataLDF = "";
......
......@@ -7,43 +7,36 @@
//https://geo.doliscan.fr/api/geo/paris/bordeaux
function distanceAutomatique(depart, arrivee) {
showWait();
/*
headers: {
'X-CSRF-TOKEN': localGetData("api_token")
}
*/
$.ajaxSetup({
timeout: 40000,
});
/*
beforeSend: function (xhr) {
xhr.setRequestHeader('Authorization', 'Bearer ' + localGetData("api_token"));
},
*/
$.ajax({
type: "GET",
timeout: 5000,
url: "https://geo.doliscan.fr/api/geo/" + depart + "/" + arrivee,
success: function (result) {
if (result != 'undefined') {
hideWait();
updateDistanceFromServer(result);
}
else {
hideWait();
ons.notification.alert("Saisie manuelle nécessaire, cette distance n'est pas connue sur nos serveurs", { title: "Erreur" });
}
},
error: function (result) {
// myDebug('updateServerUserFromLocal : erreur 2 ...');
showWait();
$.ajaxSetup({
timeout: 40000,
});
$.ajax({
type: "GET",
timeout: 5000,
url: "https://geo.doliscan.fr/api/geo/" + depart + "/" + arrivee,
beforeSend: function (xhr) {
xhr.setRequestHeader('Authorization', 'Bearer ' + localGetData("api_token"));
},
success: function (result) {
if (result != 'undefined') {
hideWait();
updateDistanceFromServer(result);
}
else {
hideWait();
ons.notification.alert("Saisie manuelle nécessaire, cette distance n'est pas connue sur nos serveurs", { title: "Erreur" });
}
});
}
},
error: function (result) {
// myDebug('updateServerUserFromLocal : erreur 2 ...');
hideWait();
ons.notification.alert("Saisie manuelle nécessaire, cette distance n'est pas connue sur nos serveurs", { title: "Erreur" });
}
});
}
//Actualisation du champ "distance" du formulaire
function updateDistanceFromServer(result) {
$('#distance').val(result.distanceKM);
}
//Actualisation du champ "distance" du formulaire
function updateDistanceFromServer(result) {
$('#distance').val(result.distanceKM);
}
This diff is collapsed.
......@@ -64,7 +64,9 @@ function gotoPage(destination, saveHistory = true) {
}
$('#container').load(destination, function () {
globalCurrentPage = destination;
if (dataLDF != "") {
//Si on est en mode modification de frais dataLDF n'est pas vide...
//on demande donc a completer la page automatiquement
if (dataLDF != "") {
completePageAfterGoto(dataLDF);
}
});
......
......@@ -235,55 +235,6 @@ function createBlob(data, type) {
return r;
}
/* *************************************
* Lecture du fichier temporaire (photo) (en cache) pour le joindre au formulaire
* au passage on essaye d'en faire une sauvegarde dans le repertoire de stockage
* permanent avec un nom explicite YYYYMMJJ-subject-filename.jpeg
*************************************** */
function readFromFile(fileName, formdata, subject) {
// myDebug('readFromFile (1) : ' + fileName);
var pathToFile = window.cordova.file.dataDirectory + fileName;
window.resolveLocalFileSystemURL(fileName, function (fileEntry) {
// myDebug("readFromFile (2): " + JSON.stringify(fileEntry));
fileEntry.file(function (file) {
var reader = new FileReader();
var fileSize = file.size;
// myDebug("readFromFile (3) Size = " + file.size);
reader.onloadend = function (e) {
var fileContent = new Uint8Array(reader.result);
// var fileContent = reader.result;
formdata.append("afile", fileContent);
formdata.append("afilesize", fileSize);
//formdata.append("bfile", blob, file.name);
// myDebug('Taille du fichier image : ' + fileSize);
// myDebug('Fichier image : ' + fileName);
// -------------------------------------------------
//On sauvegarde le Fichier sous un nom qui sera plus facile a gerer par la suite
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() + "-" + subject + "-" + basename(fileName);
var newFileUri = window.cordova.file.dataDirectory;
// myDebug('Sauvegarde de la photo dans (1): ' + newFileUri);
// myDebug('Sauvegarde de la photo dans (2): ' + destFilename);
moveFile(fileName, destFilename);
// -------------------------------------------------
//myDebug('Contenu du fichier : ' + fileContent);
//Appel a la suite de l'upload ici pour ne pas être coincé par la lecture async. de l'image
endSendForm(formdata, destFilename);
};
reader.readAsArrayBuffer(file);
}, errorHandler.bind(null, fileName));
}, errorHandler.bind(null, fileName));
}
function feedObjets(objets) {
if ((typeof objets !== 'undefined') && (objets != null) && (objets != "")) {
for (var i = 0; i < objets.length && i < 15; i++) {
......@@ -305,14 +256,15 @@ function setPageTitle(titre) {
$('#titreDoliScan').replaceWith('<div id="titreDoliScan" class="left" onclick="fn.back();"><i class="zmdi chevron-circle-left"></i> ' + titre + '</div>');
}
//sera appellee lorsque la page sera bien chargee
//sera appellee lorsque la page sera bien chargee pour completer automatiquement le formulaire
//avec les donnees a modifier
function completePageAfterGoto(dataLDF) {
myDebug("completePageAfterGoto ...");
document.getElementById("updateID").value = dataLDF['sid'];
document.getElementById("photoFacturette").value = "UPDATE";
fieldsToValidate = ['nom', 'arrivee', 'depart', 'distance', 'label', 'ladate', 'ttc', 'typeFrais', 'moyenPaiement', 'photoFacturette'];
fieldsToValidate = ['nom', 'arrivee', 'depart', 'distance', 'label', 'ladate', 'ttc', 'typeFrais', 'moyenPaiement', 'photoFacturette', 'tvaVal1', 'tvaVal2', 'tvaVal3', 'tvaVal4'];
for (let i = 0; i < fieldsToValidate.length; i++) {
field = fieldsToValidate[i];
//cas particuliers
......@@ -405,3 +357,41 @@ ons.ready(function () {
});
});
/* *************************************
* on expédie le fichier sur le serveur en utilisant le découpeur de fichier
* resumable.js histoire de proposer une barre de progression et de rendre
* tout ça un peu plus pro
*************************************** */
function pushFileResumeable(fileName, resumable, tmpSrvFileName) {
// myDebug('readFromFile (1) : ' + fileName);
var pathToFile = window.cordova.file.dataDirectory + fileName;
window.resolveLocalFileSystemURL(fileName, function (fileEntry) {
// myDebug("readFromFile (2): " + JSON.stringify(fileEntry));
fileEntry.file(function (file) {
var reader = new FileReader();
var fileSize = file.size;
// myDebug("readFromFile (3) Size = " + file.size);
reader.onloadend = function (e) {
var fileContent = new Uint8Array(reader.result);
var myBlob = new Blob([fileContent], { type: 'image/jpeg' });
myBlob.name = tmpSrvFileName;
resumable.addFile(myBlob);
// -------------------------------------------------
//On sauvegarde le Fichier sous un nom qui sera plus facile a gerer par la suite
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() + "-" + subject + "-" + basename(fileName);
var newFileUri = window.cordova.file.dataDirectory;
moveFile(fileName, destFilename);
// -------------------------------------------------
};
reader.readAsArrayBuffer(file);
}, errorHandler.bind(null, fileName));
}, errorHandler.bind(null, fileName));
}
......@@ -238,3 +238,32 @@ function myUniqueSort(array) {
return index === $.inArray(el, array);
});
}
//Transforme une URI locale en Blob
function dataURItoBlob(dataURI) {
var byteString = atob(dataURI.split(',')[1]);
var mimeString = dataURI.split(",")[0].split(":")[1].split(";")[0];
var ab = new ArrayBuffer(byteString.length);
var ia = new Uint8Array(ab);
for (var i = 0; i < byteString.length; i++) {
ia[i] = byteString.charCodeAt(i);
}
return new Blob([ab], { type: mimeString });
}
function ProgressBar(ele) {
this.thisEle = $(ele);
this.fileAdded = function () {
myDebug("ProgressBar : fileAdded");
(this.thisEle).removeClass('hide').find('.progress-bar').css('width', '0%');
},
this.uploading = function (progress) {
myDebug("ProgressBar : progress..." + progress);
// (this.thisEle).find('.progress-bar').attr('style', "width:" + progress + '%');
$('.progress-bar').attr('style','width:' + progress + '%');
},
this.finish = function () {
myDebug("ProgressBar : finish");
gotoPage("messageDone.html",false);
}
}
......@@ -7,11 +7,11 @@
<div class="column">
<p>Votre document est stocké sur le serveur, vous pouvez revenir au menu principal</p>
</div>
</div>
<div class="row">
<div class="column">
<ons-button modifier="material large" onclick="gotoPage('menu.html', true);" class="menubutton"><i class="zmdi zmdi-home"></i> Menu principal</ons-button>
</div>
<div class="row">
<div class="column">
<ons-button modifier="material large" onclick="gotoPage('menu.html', true);" class="menubutton"><i class="zmdi zmdi-home"></i> Menu principal</ons-button>
</div>
</div>
<script type="text/javascript">
......
Supports Markdown
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