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

version 1.0.10 en approche, modification et suppression d'un frais ok

parent 35159061
<?xml version='1.0' encoding='utf-8'?>
<widget id="fr.caprel.doliscan" version="1.0.9" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0">
<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">
<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.9 Android" />
<preference name="OverrideUserAgent" value="Mozilla/5.0 OpenNDF/1.0.10 Android" />
<plugin name="cordova-plugin-inappbrowser" spec="^3.0.0" />
<plugin name="cordova-plugin-whitelist" spec="^1.3.4" />
</widget>
......@@ -8,10 +8,7 @@
<div class="row">
<div class="column" style="text-align: justify">
<p>Cette application est née en 2018 d'une volontée d'auto-héberger une solution de gestion de notes de frais.</p>
<p>&nbsp;</p>
<p>Nous ne souhaitons pas utiliser des logiciels ou applications dont le code source ne peut-être audité.</p>
<p>Nous ne souhaitons pas qu'un hébergeur utilise nos données à notre insu (volontairement ou involontairement), nous souhaitons donc pouvoir regarder également le code source de l'application côté serveur.</p>
<p>Nous souhaitons pouvoir héberger nous-même nos notes de frais (mais ça n'est peut-être pas possible pour tout le monde car pour celà il faut un serveur ou un hébergement et des compétences techniques).</p>
<p>Pour plus de détails, consultez le site internet <a href="https://doliscan.fr">https://doliscan.fr</a></p>
<pre>
CAP-REL/DoliSCAN - https://cap-rel.fr - https://doliscan.fr
</pre>
......
......@@ -4,7 +4,7 @@
<p>Utilisez vous un véhicule professionnel (Pour la gestion et configuration des achats de carburants) ?</p>
<ons-button modifier="material large" onclick="gotoPage('config-addVehiculePro.html', true);">Oui</ons-button>
<ons-button modifier="material large" onclick="gotoPage('bienvenue-step5.html', true);">Non</ons-button>
<ons-button modifier="material large" onclick="gotoPage('bienvenue-step6.html', true);">Non</ons-button>
</div>
</div>
<script type="text/javascript">
......
......@@ -30,7 +30,7 @@
<script type="text/javascript">
function downloadPDF() {
showWait();
var ficURI = localGetData("api_server") + "/api/ndfsPDF/" + localGetData("ndfId");
var ficURI = localGetData("api_server") + "/api/NdeFraisPDF/" + localGetData("ndfId");
$.ajax({
url: ficURI,
......@@ -102,7 +102,7 @@
function downloadDetailsPDF() {
showWait();
var ficURI = localGetData("api_server") + "/api/ndfsDetailsPDF/" + localGetData("ndfId");
var ficURI = localGetData("api_server") + "/api/NdeFraisDetailsPDF/" + localGetData("ndfId");
$.ajax({
url: ficURI,
......@@ -181,7 +181,7 @@
// $('#contenuNDFS').empty();
showWait();
$.ajax({
url: localGetData("api_server") + "/api/ndfsDetails/" + localGetData("ndfId"),
url: localGetData("api_server") + "/api/NdeFraisDetails/" + localGetData("ndfId"),
timeout: 5000,
type: "GET",
beforeSend: function (xhr) {
......@@ -198,7 +198,7 @@
if (data.ttc > 0) {
texte += " (" + data.ttc + " €)";
}
var loadthis = "<ons-list-item modifier=\"longdivider\" tappable onclick=\"localStoreData('ldfId'," + data.id + ");gotoPage('detailsLdf.html', true);\"><div class=\"left\">" + icone + "</div><div class=\"center\">" + texte + "</div></ons-list-item>";
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);
}
hideWait();
......
......@@ -26,7 +26,7 @@
$('#contenuLDF').empty();
showWait();
$.ajax({
url: localGetData("api_server") + "/api/ldfs/" + localGetData("ldfId"),
url: localGetData("api_server") + "/api/LdeFrais/" + localGetData("ldfId"),
timeout: 5000,
type: "GET",
beforeSend: function (xhr) {
......@@ -41,6 +41,7 @@
var ladate = dateFormatDDMMYYYY(dataLDF.ladate);
var loadthis = "";
//Si il est modifiable il est supprimable ...
if (dataLDF.isUpdatable) {
loadthis = "<input type=\"button\" onclick=\"gotoPage('frais-" + dataLDF.frais_slug + ".html',false);\" value=\"Modifier cet enregistrement\" />";
}
......@@ -48,6 +49,9 @@
loadthis = "<i>Document archivé, non modifiable</i>";
}
loadthis += "<ul><li><b>Date :</b> " + ladate + "</li><li><b>Objet :</b> " + dataLDF.texte + "</li><li><b>Montant :</b> " + dataLDF.montant + "</li></ul>";
if (dataLDF.isUpdatable) {
loadthis += "<input type=\"button\" onclick=\"askDoubleCheckForDelete();\" value=\"SUPPRIMER cet enregistrement\" />";
}
$(loadthis).hide().appendTo($('#contenuLDF')).fadeIn(1000);
//$('#contenuLDFImage').empty();
......@@ -85,7 +89,39 @@
window.location.replace('index.html');
}
});
});
function askDoubleCheckForDelete() {
ons.notification.confirm("Voulez-vous vraiment supprimer ce document ?", {
title: "Vérification", buttonLabels: ['Non', 'Oui, supprimer'],
callback: function (index) {
if (index == 1) {
showWait();
$.ajax({
url: localGetData("api_server") + "/api/LdeFrais/" + localGetData("ldfId"),
timeout: 5000,
type: "DELETE",
beforeSend: function (xhr) {
xhr.setRequestHeader('Authorization', 'Bearer ' + localGetData("api_token"));
},
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);
}
else {
gotoPage('messageError.html', false);
}
}
});
}
}
});
}
});
</script>
......@@ -13,7 +13,7 @@
setPageTitle("Historique");
$.ajax({
url: localGetData("api_server") + "/api/ndfs",
url: localGetData("api_server") + "/api/NdeFrais",
timeout: 5000,
type: "GET",
beforeSend: function (xhr) {
......@@ -40,7 +40,7 @@
montantTxt = " (" + data.montant + " €)";
}
}
var loadthis = "<ons-button modifier=\"material large\" onclick=\"localStoreData('ndfId','" + data.id + "'); localStoreData('ndfLabel','" + data.label + "');gotoPage('details.html', true);\" class=\"menubutton\"" + styleTxt + "><i class=\"fas fa-angle-right\"></i> " + data.label + montantTxt + "</ons-button>";
var loadthis = "<ons-button modifier=\"material large\" onclick=\"localStoreData('ndfId','" + data.sid + "'); localStoreData('ndfLabel','" + data.label + "');gotoPage('details.html', true);\" class=\"menubutton\"" + styleTxt + "><i class=\"fas fa-angle-right\"></i> " + data.label + montantTxt + "</ons-button>";
//var loadthis = "<p>" + data.label + " (" + data.montant + " ) <a href=\"#\" onclick=\">[détails]</a></p>";
$(loadthis).hide().appendTo($('#contenuNDF')).fadeIn(1000);
......
/**
* jQuery serializeObject
* @copyright 2014, macek <paulmacek@gmail.com>
* @link https://github.com/macek/jquery-serialize-object
* @license BSD
* @version 2.5.0
*/
!function(e,i){if("function"==typeof define&&define.amd)define(["exports","jquery"],function(e,r){return i(e,r)});else if("undefined"!=typeof exports){var r=require("jquery");i(exports,r)}else i(e,e.jQuery||e.Zepto||e.ender||e.$)}(this,function(e,i){function r(e,r){function n(e,i,r){return e[i]=r,e}function a(e,i){for(var r,a=e.match(t.key);void 0!==(r=a.pop());)if(t.push.test(r)){var u=s(e.replace(/\[\]$/,""));i=n([],u,i)}else t.fixed.test(r)?i=n([],r,i):t.named.test(r)&&(i=n({},r,i));return i}function s(e){return void 0===h[e]&&(h[e]=0),h[e]++}function u(e){switch(i('[name="'+e.name+'"]',r).attr("type")){case"checkbox":return"on"===e.value?!0:e.value;default:return e.value}}function f(i){if(!t.validate.test(i.name))return this;var r=a(i.name,u(i));return l=e.extend(!0,l,r),this}function d(i){if(!e.isArray(i))throw new Error("formSerializer.addPairs expects an Array");for(var r=0,t=i.length;t>r;r++)this.addPair(i[r]);return this}function o(){return l}function c(){return JSON.stringify(o())}var l={},h={};this.addPair=f,this.addPairs=d,this.serialize=o,this.serializeJSON=c}var t={validate:/^[a-z_][a-z0-9_]*(?:\[(?:\d*|[a-z0-9_]+)\])*$/i,key:/[a-z0-9_]+|(?=\[\])/gi,push:/^$/,fixed:/^\d+$/,named:/^[a-z0-9_]+$/i};return r.patterns=t,r.serializeObject=function(){return new r(i,this).addPairs(this.serializeArray()).serialize()},r.serializeJSON=function(){return new r(i,this).addPairs(this.serializeArray()).serializeJSON()},"undefined"!=typeof i.fn&&(i.fn.serializeObject=r.serializeObject,i.fn.serializeJSON=r.serializeJSON),e.FormSerializer=r,r});
......@@ -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 = 2; // On incrémentera la version de l'API compatible quand on modifie des choses importantes sur le serveur
var globalCompatibleWithAPIVersion = 3; // 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.9"; // mis à jour automatiquement à partir du fichier config.xml lors du build android
var globalAppVersion = "1.0.10"; // mis à jour automatiquement à partir du fichier config.xml lors du build android
// **********************************************************************
var dataLDF = "";
......@@ -194,7 +194,7 @@ function feedToSync(formField) {
let i = 0;
let html = "<ul>";
for (i = 0; i < nbRes; i++) {
let id = rs.rows.item(i).id;
let id = rs.rows.item(i).sid;
let url = rs.rows.item(i).url;
let jsonData = rs.rows.item(i).jsonData;
let localFileName = rs.rows.item(i).localFileName;
......
......@@ -360,7 +360,7 @@ function endSendFormForUpdate(formdata) {
dataLDF = "";
var ajaxRequest = $.ajax({
url: localGetData("api_server") + "/api/ldfs/" + document.getElementById('updateID').value,
url: localGetData("api_server") + "/api/LdeFrais/" + document.getElementById('updateID').value,
timeout: 40000,
type: "PUT",
data: formJSON,
......@@ -438,7 +438,7 @@ function endSendForm(formdata, filename) {
//On sauvegarde dans la base pour pouvoir faire une synchro plus tard si jamais ca a foiré
//Bien entendu on ne fait pas ça si on est en cours de synchronisation :)
if (globalDB != null && globalSyncInProgress == false) {
globalDB.executeSql('INSERT INTO ldfsToSync(url,jsonData,localFileName) VALUES (?,?,?);', [localGetData("api_server") + "/api/ldfs", formDataInJSON, filename],
globalDB.executeSql('INSERT INTO ldfsToSync(url,jsonData,localFileName) VALUES (?,?,?);', [localGetData("api_server") + "/api/LdeFrais", formDataInJSON, filename],
function (results) {
myDebug(' localStoreData SQL INSERT OK for ' + filename);
globalLastInsertId = results.insertId;
......@@ -454,7 +454,7 @@ function endSendForm(formdata, filename) {
}
}
let ajaxURL = localGetData("api_server") + "/api/ldfs";
let ajaxURL = localGetData("api_server") + "/api/LdeFrais";
let ajaxTYPE = "POST";
var ajaxRequest = $.ajax({
......@@ -610,7 +610,7 @@ function gotoPage(destination, saveHistory = true) {
function completePageAfterGoto(dataLDF) {
myDebug("completePageAfterGoto ...");
document.getElementById("updateID").value = dataLDF['id'];
document.getElementById("updateID").value = dataLDF['sid'];
document.getElementById("photoFacturette").value = "UPDATE";
fieldsToValidate = ['nom', 'arrivee', 'depart', 'distance', 'label', 'ladate', 'ttc', 'typeFrais', 'moyenPaiement', 'photoFacturette'];
......@@ -739,7 +739,7 @@ function rSyncOne(idToSync) {
myDebug(" -> SQL SELECT OK: res " + rs.rows.length);
let nbRes = rs.rows.length;
let i = 0;
let id = rs.rows.item(i).id;
let id = rs.rows.item(i).sid;
let url = rs.rows.item(i).url;
let jsonData = rs.rows.item(i).jsonData;
let localFileName = rs.rows.item(i).localFileName;
......
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