Commit 4eec4046 authored by Eric Seigne's avatar Eric Seigne
Browse files

ajout d'agenda-ik pour faire la connexion entre l'agenda et les ik

parent d6fd9ed4
<?xml version='1.0' encoding='utf-8'?>
<widget id="fr.caprel.doliscan" version="1.2.3" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0">
<widget id="fr.caprel.doliscan" version="1.4.0" 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>
......@@ -47,6 +47,9 @@
<splash src="res/screen/android/splash-port-mdpi.png" density="port-mdpi" />
<splash src="res/screen/android/splash-port-xhdpi.png" density="port-xhdpi" />
<splash src="res/screen/android/splash-port-xxhdpi.png" density="port-xxhdpi" />
<feature name="Calendar">
<param name="android-package" value="nl.xservices.plugins.Calendar" />
</feature>
</platform>
<platform name="ios">
......@@ -137,7 +140,10 @@
<string>Please pick a pictures of your invoice / receipt</string>
</edit-config>
<feature name="Calendar">
<param name="ios-package" value="Calendar" />
</feature>
</platform>
<preference name="OverrideUserAgent" value="Mozilla/5.0 OpenNDF/1.2.3 Android" />
<plugin name="cordova-plugin-calendar" />
<preference name="OverrideUserAgent" value="Mozilla/5.0 OpenNDF/1.4.0 Android" />
</widget>
......@@ -12,10 +12,10 @@
"dependencies": {
"cordova": "^10.0.0",
"cordova-plugin-dns": "^1.0.2",
"jquery": "^3.4.1",
"jquery": "^3.5.1",
"jquery-ajax-native": "",
"jquery-validation": "^1.19.1",
"onsenui": "^2.10.10"
"jquery-validation": "^1.19.2",
"onsenui": "^2.11.1"
},
"cordova": {
"plugins": {
......@@ -33,18 +33,29 @@
"cordova-plugin-whitelist": {},
"cordova-sqlite-storage": {},
"cordova-plugin-decimal-keyboard-wkwebview": {},
"@globules-io/cordova-plugin-ios-xhr": {}
"@globules-io/cordova-plugin-ios-xhr": {},
"cordova-plugin-calendar": {
"CALENDAR_USAGE_DESCRIPTION": "This app uses your calendar to get #ik data and import it into DoliSCAN",
"CONTACTS_USAGE_DESCRIPTION": " "
},
"cordova-plugin-androidx-adapter": {},
"cordova-plugin-decimal-keyboard": {},
"cordova-plugin-image-cropper": {}
},
"platforms": [
"ios"
"android"
]
},
"devDependencies": {
"@globules-io/cordova-plugin-ios-xhr": "git+https://github.com/globules-io/cordova-plugin-ios-xhr.git",
"cordova-ios": "^6.1.1",
"cordova-android": "^9.0.0",
"cordova-plugin-androidx-adapter": "^1.1.3",
"cordova-plugin-calendar": "^5.1.5",
"cordova-plugin-crop": "^0.4.0",
"cordova-plugin-decimal-keyboard": "^1.0.0",
"cordova-plugin-decimal-keyboard-wkwebview": "^1.0.4",
"cordova-plugin-file": "^6.0.2",
"cordova-plugin-image-cropper": "git+https://github.com/Riyaz0001/cordova-plugin-image-cropper.git",
"cordova-plugin-network-information": "^2.0.2"
}
}
\ No newline at end of file
}
<ons-page id="ONSAgendaIK">
<ons-toolbar modifier="material">
<div id="titreDoliScan" class="left" onclick="gotoPage('menu.html',false);">
Doliscan
</div>
<div id="home" class="left" onclick="gotoPage('menu.html',false);">
<i class="fas fa-home"></i>
</div>
<div id="menuHautDroite" class="right">
<ons-toolbar-button onclick="fn.open()">
<ons-icon icon="md-menu"></ons-icon>
</ons-toolbar-button>
</div>
</ons-toolbar>
<div id="container">
<form id="leform" name="leform">
<h4>Agenda -> IK</h4>
<ons-row>
<ons-col>
<p>Zone de dev pour récupérer automatiquement les rdv de l'agenda et les transformer en IK</p>
<div class="feedVehicules" id='feedVehiculesPerso'></div>
<ons-list style="clear: both;">
<input required name="depart" id="depart" type="text" placeholder="Ville de départ">
<ons-list-item id="listeDepart" expandable data-role="listview" data-filter="true" data-filter-reveal="true" data-input="#label">
Favoris...
</ons-list-item>
</ons-list>
<label for="ladateStart">Date début</label>
<ons-input name="ladateStart" id="ladateStart" type="date"></ons-input>
<label for="ladateEnd">Date fin</label>
<ons-input name="ladateEnd" id="ladateEnd" type="date"></ons-input>
&nbsp;
<ons-button modifier="material large" onclick="feedToAgendaIK('#feedToAgendaIK',ladateStart.value,ladateEnd.value);">Valider</ons-button>
<div id='feedToAgendaIK'></div>
</ons-col>
</ons-row>
</form>
<!-- <ons-row>
<ons-col>
<ons-button modifier="material large" onclick="rSyncOne(2);">Lancer la synchronisation</ons-button>
</div>
</div> -->
</div>
<script>
// function rSyncDeleteConfirm(id) {
// ons.notification.confirm("Voulez-vous vraiment supprimer ce document ?", {
// title: "Vérification", buttonLabels: ['Non', 'Oui, supprimer'],
// callback: function (index) {
// if (index == 1) {
// rSyncDelete(id);
// }
// }
// });
// }
</script>
</ons-page>
......@@ -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 globalDB=null;var globalTenMinuts=60*10*1000;var globalCompatibleWithAPIVersion=4;var globalDoliScanDomain="";var globalLastInsertId="";var globalSyncInProgress=false;var globalPictureFileName="";var globalAppVersion="1.2.3";var dataLDF="";var globalResumable=undefined;var globalProgressBar=undefined;var globalTypeFrais="";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 readFromFile(fileName,formdata,subject){var pathToFile=cordova.file.documentsDirectory+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);formdata.append("afile",fileContent);formdata.append("afilesize",fileSize);var today=new Date();var destFilename=today.getFullYear().toString()+('0'+(today.getMonth()+1)).slice(-2)+('0'+today.getDate()).slice(-2)+"_"
var globalDevMode=true;var globalMyCamera;var globalpictureSource;var globaldestinationType;var globalNetworkResponse=Date.now();var globalCurrentPage="";var globalCurrentTitle="";var globalDB=null;var globalTenMinuts=60*10*1000;var globalCompatibleWithAPIVersion=4;var globalDoliScanDomain="";var globalLastInsertId="";var globalSyncInProgress=false;var globalPictureFileName="";var globalAppVersion="1.4.0";var dataLDF="";var globalResumable=undefined;var globalProgressBar=undefined;var globalTypeFrais="";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 readFromFile(fileName,formdata,subject){var pathToFile=cordova.file.documentsDirectory+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);formdata.append("afile",fileContent);formdata.append("afilesize",fileSize);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=cordova.file.documentsDirectory;moveFile(fileName,destFilename);endSendForm(formdata,destFilename);};reader.readAsArrayBuffer(file);},errorHandler.bind(null,fileName));},errorHandler.bind(null,fileName));}
function distanceAutomatique(depart,arrivee){showWait();$.ajaxSetup({timeout:5000,});$.ajax({type:"GET",timeout:5000,url:"https://geo.doliscan.fr/api/geo/"+depart+"/"+arrivee,beforeSend:function(xhr){xhr.setRequestHeader('Authorization','Bearer '+localGetData("api_token"));},xhrFields:{withCredentials:true},success:function(result){if(result!=undefined){hideWait();updateDistanceFromServer(result);}
else{hideWait();ons.notification.alert("Saisie manuelle nécessaire, cet itinéraire n'est pas connue sur nos serveurs",{title:"Erreur"});}},error:function(result){hideWait();ons.notification.alert("Saisie manuelle nécessaire, cet itinéraire n'est pas connue sur nos serveurs",{title:"Erreur"});}});}
......@@ -20,6 +20,20 @@ function feedToSync(formField){let htmlFTS="";$(formField).empty();if(globalDB!=
$(formField).append(htmlFTS);},function(){});});}
return htmlFTS;}
function feedDoliscanInfos(){let htmlInfos="";myDebug("feedDoliscanInfos");$("#feedDoliscanInfos").empty();myDebug("feedDoliscanInfos empty ok -> feed with html now");htmlInfos+="<p>";htmlInfos+="Compte "+localGetData("email")+"<br />";htmlInfos+="Serveur "+localGetData("name_server")+"<br />";htmlInfos+="Version "+globalAppVersion+"<br />";htmlInfos+="</p>";$("#feedDoliscanInfos").append(htmlInfos);myDebug("feedDoliscanInfos append: "+htmlInfos);myDebug("feedDoliscanInfos append, hide and show ok");return htmlInfos;}
function feedToAgendaIK(formField,dateStart,dateEnd){let htmlFTS="";myDebug("feedToAgendaIK pour "+formField);$(formField).empty();window.plugins.calendar.hasReadWritePermission(function(result){if(result==false){window.plugins.calendar.requestReadWritePermission();}})
var title=null;var loc=null;var notes=null;var startDate=new Date(dateStart);var endDate=new Date(dateEnd);window.plugins.calendar.findEvent(title,loc,notes,startDate,endDate,onSuccessAgendaIK,onErrorAgendaIK);myDebug("end feedToAgendaIK ..."+htmlFTS);}
function onSuccessAgendaIK(events){var formField='#feedToAgendaIK';var html="";$(formField).empty();ons.notification.alert("Récupération des rdv OK, patientez quelques secondes ...",{title:"Agenda"});if(events.length==0){html+="<h2>Aucun rdv sur cette période</h2>";return;}
for(var i=0;i<events.length;i++){if(events[i].title.includes("#ik")||(typeof events[i].location!='undefined')){let titre=events[i].title.replace('#ik','');let startDate=events[i].startDate;let msg="";let loc="";html+="<h2>"+titre+"</h2>";html+="<ul><li>Date : "+startDate+"</li>";if(events[i].message){msg=events[i].message;html+="<li>Détails: "+msg+"</li>";}
if(events[i].location){loc=events[i].location;html+="<li>Lieu : "+loc+"</li>";}
html+="</ul>";html+="<ons-button modifier='material large' onclick="+'"'+"createIK("
+"'"+titre+"',"
+"'"+startDate+"',"
+"'"+msg+"',"
+"'"+loc+"'"
+");"+'"'+" class='menubutton'><i class='zmdi zmdi-car'></i> Créer la fiche d'IK</ons-button>";}}
$(formField).append(html);}
function onErrorAgendaIK(msg){ons.notification.alert("Erreur d'accès à l'agenda"+JSON.stringify(msg),{title:"Erreur"});}
function createIK(titre,ladate,message,arrivee){ons.notification.alert('Create IK à faire pour : '+titre,{title:"TODO"});}
function sendForm(){myDebug("sendForm ");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 formdata=new FormData($("#leform")[0]);formdata.append('_token',localGetData("api_token"));if(document.getElementById('updateID').value==0){var hasImage=document.getElementById('smallImage');if(hasImage!==null){var file=document.getElementById('smallImage').getAttribute("src");if(file!=""){let typeFraisObj=document.getElementById('leform').typeFrais;globalTypeFrais="autre";if(typeFraisObj!==null){globalTypeFrais=typeFraisObj.value;}
......@@ -50,6 +64,8 @@ else{if(localGetData('moyenPaiement')){$('#moyenPaiement-'+localGetData('moyenPa
if(document.getElementById('ladate')){let today=new Date();$('#ladate').val(today.toDateInputValue());}
if(document.getElementById('feedVehiculesPerso')){$("#feedVehiculesPerso").append(feedVehicules("vehicules"));}
if(document.getElementById('feedVehiculesPro')){$("#feedVehiculesPro").append(feedVehicules("vehiculesPro"));}
if(document.getElementById('ladateStart')){var date=new Date();let jour=new Date(date.getFullYear(),date.getMonth(),1);$('#ladateStart').val(jour.toDateInputValue());}
if(document.getElementById('ladateEnd')){var date=new Date();let jour=new Date(date.getFullYear(),date.getMonth()+1,0);$('#ladateEnd').val(jour.toDateInputValue());}
if(device.platform=="iOS"){$('input[type="number"]').attr('pattern','[0-9]*');$('input[type="number"]').attr('decimal','true');$('input[type="number"]').prop('type','text');}}
function newResumable(ajaxURL,result,filename){myDebug("creation de l'objet globalResumable pour "+filename+" a envoyer vers "+ajaxURL);if(typeof globalProgressBar!='undefined'){globalResumable.cancel();}
if(typeof filename===undefined||filename==""){if(globalDB!==null){myDebug("globalLastInsertId : "+globalLastInsertId);if(globalLastInsertId>0){myDebug(" ldfsToSync SQL DELETE FROM ldfsToSync WHERE ID="+globalLastInsertId);globalDB.executeSql('DELETE FROM ldfsToSync WHERE ID=?;',[globalLastInsertId]);myDebug(" ldfsToSync SQL DELETE FROM ... : ok");globalLastInsertId="";}}
......@@ -184,6 +200,7 @@ for(let key of configKeys){if(localGetData(key)!==null){if($('#'+key)[0].type=="
else{$('#'+key).append(localGetData(key));}}}
setPageTitle("Mon compte");return;}
if(event.target.matches('#ONSSync')){feedToSync("#feedToSync");setPageTitle("Synchronisation");return;}
if(event.target.matches('#ONSAgendaIK')){setPageTitle("Agenda -> IK");}
if(event.target.matches('#ONSFraisCarburant')){objets=JSON.parse(localGetData("objetsCarburant"));vProTest=localGetData("vehiculesPro");if(vProTest==null){ons.notification.alert("Si vous voulez saisir des notes de carburant ajoutez un véhicule professionnel dans le menu Configuration.",{title:"Attention"});gotoPage("menu.html",true)}
setPageTitle("Carburant");}
if(event.target.matches('#ONSFraisDivers')){objets=JSON.parse(localGetData("objetsDivers"));setPageTitle("Divers");}
......
......@@ -2,7 +2,7 @@
* (c) Éric Seigne <eric.seigne@cap-rel.fr> - 2019 - GNU AGPLv3
*/
var globalDevMode = false; // on est en mode dev ou prod ? par defaut oui pour la page d'index
var globalDevMode = true; // 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
......@@ -18,7 +18,7 @@ var globalSyncInProgress = false; // Pour savoir si on est en phase de syn
var globalPictureFileName = ""; // Le nom du fichier sans résolution (depuis ios wkbidule app:// ... on garde dans cette variable le path basique pour resumable & sync)
// **********************************************************************
//Ne pas toucher, mis à jour automatiquement à partir du config.xml
var globalAppVersion = "1.2.3"; // mis à jour automatiquement à partir du fichier config.xml lors du build android
var globalAppVersion = "1.4.0"; // mis à jour automatiquement à partir du fichier config.xml lors du build android
// **********************************************************************
var dataLDF = "";
var globalResumable = undefined;
......
......@@ -147,3 +147,82 @@ function feedDoliscanInfos() {
return htmlInfos;
}
//Liste des rdv de l'agenda qu'on peut transformer automatiquement en IK
function feedToAgendaIK(formField, dateStart, dateEnd) {
let htmlFTS = "";
myDebug("feedToAgendaIK pour " + formField);
$(formField).empty();
window.plugins.calendar.hasReadWritePermission(
function (result) {
if (result == false) {
window.plugins.calendar.requestReadWritePermission();
}
}
)
var title = null;
var loc = null;
var notes = null;
var startDate = new Date(dateStart); //"December 10, 2018 00:00:00"
var endDate = new Date(dateEnd);
// alert('Calendar search: ' + dateStart + " (" + startDate + ") - " + dateEnd + " (" + endDate + ")");
window.plugins.calendar.findEvent(title, loc, notes, startDate, endDate, onSuccessAgendaIK, onErrorAgendaIK);
myDebug("end feedToAgendaIK ..." + htmlFTS);
}
function onSuccessAgendaIK(events) {
var formField = '#feedToAgendaIK';
var html = "";
$(formField).empty();
ons.notification.alert("Récupération des rdv OK, patientez quelques secondes ...", { title: "Agenda" });
if (events.length == 0) {
// TODO
html += "<h2>Aucun rdv sur cette période</h2>";
return;
}
// Find events
for (var i = 0; i < events.length; i++) {
//Si on a le hashtag #ik ... ou qu'on a un emplacement géographique de déterminé
if (events[i].title.includes("#ik") || (typeof events[i].location != 'undefined')) {
let titre = events[i].title.replace('#ik', '');
let startDate = events[i].startDate;
let msg = "";
let loc = "";
html += "<h2>" + titre + "</h2>";
html += "<ul><li>Date : " + startDate + "</li>";
if (events[i].message) {
msg = events[i].message;
html += "<li>Détails: " + msg + "</li>";
}
if (events[i].location) {
loc = events[i].location;
html += "<li>Lieu : " + loc + "</li>";
}
html += "</ul>";
//html += "<div id='ajouterFrais-" + i + "' onclick='createIK(" + events[i] + ")'>Créer une fiche d'IK</div>";
html += "<ons-button modifier='material large' onclick=" + '"' + "createIK("
+ "'" + titre + "',"
+ "'" + startDate + "',"
+ "'" + msg + "',"
+ "'" + loc + "'"
+ ");" + '"' + " class='menubutton'><i class='zmdi zmdi-car'></i> Créer la fiche d'IK</ons-button>";
}
}
$(formField).append(html);
// alert('Calendar success: ' + JSON.stringify(events));
}
function onErrorAgendaIK(msg) {
// alert('Calendar error: ' + JSON.stringify(msg));
ons.notification.alert("Erreur d'accès à l'agenda" + JSON.stringify(msg), { title: "Erreur" });
}
function createIK(titre, ladate, message, arrivee) {
//Il manque depart
ons.notification.alert('Create IK à faire pour : ' + titre, { title: "TODO" });
}
......@@ -384,6 +384,22 @@ function initialiseForm() {
$("#feedVehiculesPro").append(feedVehicules("vehiculesPro"));
}
//Si on a un objet "ladateStart" on essaye de lui attribuer par défaut la date du 1er jour du mois en cours
if (document.getElementById('ladateStart')) {
var date = new Date();
let jour = new Date(date.getFullYear(), date.getMonth(), 1);
$('#ladateStart').val(jour.toDateInputValue());
// alert("on initialise la date start a " + jour);
}
//Si on a un objet "ladateEnd" on essaye de lui attribuer par défaut la date du 1er jour du mois en cours
if (document.getElementById('ladateEnd')) {
var date = new Date();
let jour = new Date(date.getFullYear(), date.getMonth() + 1, 0);
$('#ladateEnd').val(jour.toDateInputValue());
}
//Sur iPhone on transforme les champs de type input=number pour avoir le clavier special
//issu du plugin cordova-plugin-decimal-keyboard
if (device.platform == "iOS") {
......
......@@ -912,7 +912,7 @@ document.addEventListener('show', function (event) {
return;
}
// ------------- sycnronisation
// ------------- synchronisation
if (event.target.matches('#ONSSync')) {
feedToSync("#feedToSync");
// if (document.getElementById('feedToSync')) {
......@@ -922,6 +922,17 @@ document.addEventListener('show', function (event) {
return;
}
// ------------- recuperation de donnees sur l'agenda
if (event.target.matches('#ONSAgendaIK')) {
// feedToAgendaIK("#feedToAgendaIK");
// if (document.getElementById('feedToAgendaIK')) {
// $("#feedToAgendaIK").append(feedToAgendaIK("feedToAgendaIK"));
// }
setPageTitle("Agenda -> IK");
//pas de return on a besoin du initialiseform
//return;
}
// ============================== les frais
// ----------- carburant
......
......@@ -12,6 +12,9 @@
<ons-list-item onclick="gotoPage('sync.html', true);" tappable>
Synchronisation
</ons-list-item>
<ons-list-item onclick="gotoPage('agenda-ik.html', true);" tappable>
Agenda-IK
</ons-list-item>
<ons-list-item onclick="gotoPage('moncompte.html', true);" tappable>
Mon compte
</ons-list-item>
......
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