@@ -1,31 +0,0 @@ | |||||
# NPM | |||||
node_modules/ | |||||
npm-debug.log | |||||
yarn-error.log | |||||
# connector data files | |||||
.account | |||||
.token.json | |||||
konnector-dev-config.json | |||||
# Build | |||||
build/ | |||||
# OS generated files | |||||
.DS_Store | |||||
.DS_Store? | |||||
._* | |||||
.Spotlight-V100 | |||||
.Trashes | |||||
ehthumbs.db | |||||
Thumbs.db | |||||
desktop.ini | |||||
# Editors / IDEs | |||||
.floo | |||||
.flooignore | |||||
# Default | |||||
# /!\ KEEP THIS SECTION THE LAST ONE | |||||
!.gitkeep |
@@ -1,135 +0,0 @@ | |||||
How to contribute to Cozy <APP_NAME>? | |||||
==================================== | |||||
Thank you for your interest in contributing to Cozy! There are many ways to contribute, and we appreciate all of them. | |||||
Security Issues | |||||
--------------- | |||||
If you discover a security issue, please bring it to our attention right away! Please **DO NOT** file a public issue, instead send your report privately to security AT cozycloud DOT cc. | |||||
Security reports are greatly appreciated and we will publicly thank you for it. We currently do not offer a paid security bounty program, but are not ruling it out in the future. | |||||
Bug Reports | |||||
----------- | |||||
While bugs are unfortunate, they're a reality in software. We can't fix what we don't know about, so please report liberally. If you're not sure if something is a bug or not, feel free to file a bug anyway. | |||||
Opening an issue is as easy as following [this link][issues] and filling out the fields. Here are some things you can write about your bug: | |||||
- A short summary | |||||
- What did you try, step by step? | |||||
- What did you expect? | |||||
- What did happen instead? | |||||
- What is the version of the Cozy <APP_NAME>? | |||||
Pull Requests | |||||
------------- | |||||
Please keep in mind that: | |||||
- Pull-Requests point to the `master` branch | |||||
- You need to cover your code and feature by tests | |||||
- You may add documentation in the `/docs` directory to explain your choices if needed | |||||
- We recommend to use [task lists][checkbox] to explain steps / features in your Pull-Request description | |||||
- you do _not_ need to build app to submit a PR | |||||
- you should update the Transifex source locale file if you modify it for your feature needs (see [Localization section in README][localization]) | |||||
### Workflow | |||||
Pull requests are the primary mechanism we use to change Cozy. GitHub itself has some [great documentation][pr] on using the Pull Request feature. We use the _fork and pull_ model described there. | |||||
#### Step 1: Fork | |||||
Fork the project on GitHub and [check out your copy locally][forking]. | |||||
``` | |||||
$ git clone github.com/<USERNAME_GH>/<SLUG_GH>.git | |||||
$ cd <SLUG_GH> | |||||
$ git remote add fork git://github.com/yourusername/<SLUG_GH>.git | |||||
``` | |||||
#### Step 2: Branch | |||||
Create a branch and start hacking: | |||||
``` | |||||
$ git checkout -b my-branch origin/master | |||||
``` | |||||
#### Step 3: Code | |||||
Well, we think you know how to do that. Just be sure to follow the coding guidelines from the community ([standard JS][stdjs], comment the code, etc). | |||||
#### Step 4: Test | |||||
Don't forget to add tests and be sure they are green: | |||||
``` | |||||
$ cd <SLUG_GH> | |||||
$ npm run test | |||||
``` | |||||
#### Step 5: Commit | |||||
Writing [good commit messages][commitmsg] is important. A commit message should describe what changed and why. | |||||
#### Step 6: Rebase | |||||
Use `git rebase` (_not_ `git merge`) to sync your work from time to time. | |||||
``` | |||||
$ git fetch origin | |||||
$ git rebase origin/master my-branch | |||||
``` | |||||
#### Step 7: Push | |||||
``` | |||||
$ git push -u fork my-branch | |||||
``` | |||||
Go to https://github.com/yourusername/<SLUG_GH> and select your branch. Click the 'Pull Request' button and fill out the form. | |||||
Alternatively, you can use [hub] to open the pull request from your terminal: | |||||
``` | |||||
$ git pull-request -b master -m "My PR message" -o | |||||
``` | |||||
Pull requests are usually reviewed within a few days. If there are comments to address, apply your changes in a separate commit and push that to your branch. Post a comment in the pull request afterwards; GitHub doesn't send out notifications when you add commits. | |||||
Writing documentation | |||||
--------------------- | |||||
Documentation improvements are very welcome. We try to keep a good documentation in the `/docs` folder. But, you know, we are developers, we can forget to document important stuff that look obvious to us. And documentation can always be improved. | |||||
Translations | |||||
------------ | |||||
The Cozy <APP_NAME> is translated on a platform called [Transifex][tx]. [This tutorial][tx-start] can help you to learn how to make your first steps here. If you have any question, don't hesitate to ask us! | |||||
Community | |||||
--------- | |||||
You can help us by making our community even more vibrant. For example, you can write a blog post, take some videos, answer the questions on [the forum][forum], organize new meetups, and speak about what you like in Cozy! | |||||
[issues]: https://github.com/<USERNAME_GH>/<SLUG_GH>/issues/new | |||||
[pr]: https://help.github.com/categories/collaborating-with-issues-and-pull-requests/ | |||||
[forking]: http://blog.campoy.cat/2014/03/github-and-go-forking-pull-requests-and.html | |||||
[stdjs]: http://standardjs.com/ | |||||
[commitmsg]: http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html | |||||
[localization]: https://github.com/<USERNAME_GH>/<SLUG_GH>/blob/master/README.md#localization | |||||
[hub]: https://hub.github.com/ | |||||
[tx]: https://www.transifex.com/cozy/ | |||||
[tx-start]: http://docs.transifex.com/getting-started/translators/ | |||||
[forum]: https://forum.cozy.io/ |
@@ -1,12 +1,4 @@ | |||||
Les sources connecteurs COZY ne pouvant être hébergées que sur GITHUB, le dépôt | |||||
a été déplacé : | |||||
[https://github.com/konnectors/cozy-konnector-enercoop](https://github.com/konnectors/cozy-konnector-enercoop) | |||||
[Cozy][cozy] Enercoop Cozy Konnector | |||||
[Cozy][cozy] <YOUR SUPER NEW KONNECTOR NAME> | |||||
======================================= | ======================================= | ||||
What's Cozy? | What's Cozy? | ||||
@@ -18,7 +10,121 @@ What's Cozy? | |||||
What's this new konnector? | What's this new konnector? | ||||
-------------------------- | -------------------------- | ||||
This konnector collects your Enercoop bills. | |||||
<YOUR DESCRIPTION HERE> | |||||
### Open a Pull-Request | |||||
If you want to work on this konnector and submit code modifications, feel free to open pull-requests! See the [contributing guide][contribute] for more information about how to properly open pull-requests. | |||||
### Cozy-konnector-libs | |||||
This connector uses [cozy-konnector-libs](https://github.com/cozy/cozy-konnector-libs). You can | |||||
find more documentation about it there. | |||||
### Test the connector without an accessible cozy-stack | |||||
If you just want to test this connector without any cozy available. | |||||
You first need an installed [nodejs] (LTS version is fine). | |||||
Just run : | |||||
```sh | |||||
npm install | |||||
npm run standalone | |||||
``` | |||||
The requests to the cozy-stack will be stubbed using the [./fixture.json] file as source of data | |||||
and when cozy-client is asked to create or update data, the data will be output to the console. | |||||
The bills (or any file) will be saved in the . directory. | |||||
### Run the connector linked to a cozy-stack | |||||
If you do not want to have to install the konnector on a cozy v3 to test it, you can register the | |||||
konnector as an OAuth application with the following commands : | |||||
```sh | |||||
npm install | |||||
npm run dev | |||||
``` | |||||
This command will register your konnector as an OAuth application to the cozy-stack. By default, | |||||
the cozy-stack is supposed to be located in http://cozy.tools:8080. If this is not your case, just | |||||
update the COZY_URL field in [./konnector-dev-config-json]. | |||||
After that, your konnector is running but should not work since you did not specify any credentials to | |||||
the target service. You can do this also in [./konnector-dev-config.json] in the "fields" | |||||
attribute. | |||||
Now run `yarn dev` one more time, it should be ok. | |||||
The files are saved in the root directory of your cozy by default. | |||||
### How does the cozy-stack run the connector ? | |||||
The cozy-stack runs the connector in a nsjail container to be sure it does not affect the environment. | |||||
The connector is run by calling npm start with the following envrionment variables : | |||||
- COZY_CREDENTIALS needs to be the result of `cozy-stack instances token-cli <instance name> <scope>` | |||||
- COZY_URL is the full http or https url to your cozy | |||||
- COZY_FIELDS is something like : | |||||
```javascript | |||||
{ | |||||
"data":{ | |||||
"attributes":{ | |||||
"arguments":{ | |||||
"account":"cf31eaef5d899404a7e8c3737c1c2d1f", | |||||
"folder_to_save":"folderPathId", | |||||
"slug":"mykonnector" | |||||
} | |||||
} | |||||
} | |||||
} | |||||
``` | |||||
The "account" field is the id of the record with doctype "io.cozy.accounts" which will be used as | |||||
parameters for your konnector. | |||||
### Build (without Travis) | |||||
To be able to run the connector, the cozy stack needs a connector which is built into only one | |||||
file, without needing to npm install it, this will be a lot faster to install. | |||||
There is a command in package.json to help you to do that : `npm run build` | |||||
This command uses [webpack] to bundle all the code needed by your connector into one file. | |||||
This will generate an index.js file in the build directory and add all files the connector will need. | |||||
You can deploy this build by using the specific script : `npm run deploy` | |||||
This command will commit and push your build in the branch `build` fo your project. | |||||
And your konnector can now be installed using the following url : | |||||
git://github.com/cozy/cozy-konnector-<yourkonnector>.git#build | |||||
### Build using Travis CI | |||||
This project contains a `.travis.yml` config file which allows you to build your connector | |||||
automatically using [Travis-CI][travis]. | |||||
You can follow these steps to enable building using Travis: | |||||
* On your [travis-ci.org][travis] account, find your project name (should be the same than your Github repository) and enable Travis by using the related checkbox. | |||||
* Once enabled, go to this project on Travis by clicking on it and go to the "Settings" menu by using the "More options" menu at the top right. | |||||
* Enable these three options: | |||||
* "Build only if .travis.yml is present" | |||||
* "Build branch updates" (run Travis after each branch update) | |||||
* "Build pull request updates" (run Travis after each Pull Request update) | |||||
* Then, you have to generate a Github token in [your Github account settings](https://github.com/settings/tokens). Here is the [Github blog post about API token](https://github.com/blog/1509-personal-api-tokens). Don't forget to authorize the access to the repo scope like following:  | |||||
* Then, add an environment variable (still in your Travis project settings) named `GITHUB_TOKEN` and use your previous generated Github token as value (We highly recommand you to __keep the checkbox "Display value in build log" to OFF value__ in order to keep your token value hidden in the Travis logs.) | |||||
Now Travis is ready to build your project, it should build it each time your push a commit in your repository or create a pull request. | |||||
> __Note:__ Travis will push your build to your `build` branch ONLY for commits made on your master branch (included PR merge commits). You can see the related Travis statement [here](https://github.com/cozy/cozy-konnector-template/blob/master/.travis.yml#L27). | |||||
### Add your new connector to [Cozy Collect](https://github.com/cozy/cozy-collect) | ### Add your new connector to [Cozy Collect](https://github.com/cozy/cozy-collect) | ||||
@@ -27,9 +133,17 @@ now, if you want to add your new connector to Cozy Collect, you can submit a mes | |||||
in the [collect section](https://forum.cozy.io/c/francais/collect-fr), and we will handle this for | in the [collect section](https://forum.cozy.io/c/francais/collect-fr), and we will handle this for | ||||
you. | you. | ||||
### Standard | |||||
We use [standard] to format the `index.js` file. You can run it with: | |||||
```sh | |||||
npm run lint | |||||
``` | |||||
### Maintainer | ### Maintainer | ||||
The lead maintainers for this konnector is Choj | |||||
The lead maintainers for this konnector is <YOUR NAME> | |||||
### Get in touch | ### Get in touch | ||||
@@ -45,7 +159,7 @@ You can reach the Cozy Community by: | |||||
License | License | ||||
------- | ------- | ||||
Enercoop Cozy Konnector is developed by Choj and distributed under the [AGPL v3 license][agpl-3.0]. | |||||
<YOUR KONNECTOR NAME> is developed by <your name> and distributed under the [AGPL v3 license][agpl-3.0]. | |||||
[cozy]: https://cozy.io "Cozy Cloud" | [cozy]: https://cozy.io "Cozy Cloud" | ||||
[agpl-3.0]: https://www.gnu.org/licenses/agpl-3.0.html | [agpl-3.0]: https://www.gnu.org/licenses/agpl-3.0.html | ||||
@@ -1,96 +0,0 @@ | |||||
const moment = require('moment') | |||||
const {log, BaseKonnector, saveBills, requestFactory} = require('cozy-konnector-libs') | |||||
const baseUrl = 'https://espace-client.enercoop.fr' | |||||
const loginUrl = baseUrl + '/login' | |||||
const billUrl = baseUrl + '/mon-espace/factures/' | |||||
moment.locale('fr') | |||||
let rq = requestFactory({ | |||||
cheerio: true, | |||||
json: false, | |||||
debug: false, | |||||
jar: true | |||||
}) | |||||
module.exports = new BaseKonnector(function fetch (fields) { | |||||
return logIn(fields) | |||||
.then(parsePage) | |||||
.then(entries => saveBills(entries, fields.folderPath, { | |||||
timeout: Date.now() + 60 * 1000, | |||||
identifiers: ['Enercoop'] | |||||
})) | |||||
}) | |||||
// Procedure to login to Enercoop website. | |||||
function logIn (fields) { | |||||
const form = { | |||||
email: fields.login, | |||||
password: fields.password, | |||||
} | |||||
const options = { | |||||
url: loginUrl, | |||||
method: 'POST', | |||||
form: form, | |||||
resolveWithFullResponse: true, | |||||
followAllRedirects: true, | |||||
simple: false | |||||
} | |||||
return rq(options) | |||||
.then(res => { | |||||
const isNot200 = res.statusCode !== 200 | |||||
if (isNot200) { | |||||
log('info', 'Authentification error') | |||||
throw new Error('LOGIN_FAILED') | |||||
} | |||||
const url = `${billUrl}` | |||||
return rq(url) | |||||
.catch(err => { | |||||
console.log(err, 'authentication error details') | |||||
throw new Error('LOGIN_FAILED') | |||||
}) | |||||
}) | |||||
} | |||||
// Parse the fetched DOM page to extract bill data. | |||||
function parsePage ($) { | |||||
const bills = [] | |||||
$('.invoice-line').each(function () { | |||||
//one bill per line = a <li> with 'invoice-id' data-attr | |||||
let billId = $(this).data('invoice-id') | |||||
let amount = $(this).find('.amount').text() | |||||
amount = amount.replace('€','') | |||||
amount = amount.replace(',', '.').trim() | |||||
amount = parseFloat(amount) | |||||
//gets pdf download URL | |||||
let pdfUrl = $(this).find('a > i').data('url') | |||||
pdfUrl = baseUrl + pdfUrl | |||||
//<French month>-YYYY format (Décembre - 2017) | |||||
let billDate = $(this).find('.invoiceDate').text().trim() | |||||
let monthAndYear = billDate.split('-') | |||||
let billYear = monthAndYear[0].trim() | |||||
let billMonth = monthAndYear[1].trim() | |||||
billMonth = moment.months().indexOf(billMonth.toLowerCase()) + 1 | |||||
billMonth = billMonth < 10 ? '0' + billMonth : billMonth | |||||
let date = moment(billYear + billMonth, 'YYYYMM') | |||||
let bill = { | |||||
amount, | |||||
date: date.toDate(), | |||||
vendor: 'Enercoop', | |||||
filename: `${date.format('YYYYMM')}_enercoop.pdf`, | |||||
fileurl: pdfUrl | |||||
} | |||||
bills.push(bill) | |||||
}) | |||||
return bills | |||||
} |
@@ -1,25 +1,32 @@ | |||||
{ | { | ||||
"version": "1.0.0", | "version": "1.0.0", | ||||
"name": "Enercoop Cozy konnector", | |||||
"name": "konnector name", | |||||
"type": "node", | "type": "node", | ||||
"slug": "enercoop", | |||||
"description": "Collects your Enercoop bills", | |||||
"source": "https://gitlab.allella.io/dje/cozy-konnector-enercoop", | |||||
"slug": "konnectorslug", | |||||
"description": "description", | |||||
"source": "git://github.com/cozy/cozy-konnector-thename.git", | |||||
"locales": { | "locales": { | ||||
"fr": { | "fr": { | ||||
"permissions": { | |||||
"books": { | |||||
"description": "Utilisé pour sauvegarder les références de vos livres" | |||||
}, | |||||
"files": { | |||||
"description": "Utilisé pour sauvegarder les couvertures de vos livres" | |||||
}, | |||||
"accounts": { | |||||
"description": "Utilisé pour récupérer les informations de votre compte" | |||||
} | |||||
} | |||||
} | } | ||||
}, | }, | ||||
"permissions": { | "permissions": { | ||||
"bank operations": { | |||||
"description": "Required to link bills to bank operations", | |||||
"type": "io.cozy.bank.operations" | |||||
}, | |||||
"bills": { | |||||
"description": "Required to save bills documents", | |||||
"type": "io.cozy.bills" | |||||
"books": { | |||||
"description": "Required to save books' references", | |||||
"type": "io.cozy.books" | |||||
}, | }, | ||||
"files": { | "files": { | ||||
"description": "Required to save the bills files", | |||||
"description": "Required to save the covers", | |||||
"type": "io.cozy.files" | "type": "io.cozy.files" | ||||
}, | }, | ||||
"accounts": { | "accounts": { | ||||
@@ -29,7 +36,7 @@ | |||||
} | } | ||||
}, | }, | ||||
"developer": { | "developer": { | ||||
"name": "choj", | |||||
"url": "https://gitlab.allella.io/dje/cozy-konnector-enercoop" | |||||
"name": "cozy", | |||||
"url": "cozy.io" | |||||
} | } | ||||
} | } |
@@ -1,13 +1,13 @@ | |||||
{ | { | ||||
"name": "cozy-konnector-enercoop", | |||||
"name": "cozy-konnector-template", | |||||
"version": "1.0.0", | "version": "1.0.0", | ||||
"description": "Collects your Enercoop bills", | |||||
"description": "", | |||||
"repository": { | "repository": { | ||||
"type": "git", | "type": "git", | ||||
"url": "git+https://gitlab.allella.io/dje/cozy-konnector-enercoop.git" | |||||
"url": "git+https://github.com/cozy/cozy-konnector-template.git" | |||||
}, | }, | ||||
"keywords": ["Enercoop", "bills"], | |||||
"author": "Choj", | |||||
"keywords": [], | |||||
"author": "", | |||||
"license": "AGPL-3.0", | "license": "AGPL-3.0", | ||||
"dependencies": { | "dependencies": { | ||||
"cozy-konnector-libs": "^3.0.0" | "cozy-konnector-libs": "^3.0.0" | ||||
@@ -19,7 +19,7 @@ | |||||
"build": "webpack", | "build": "webpack", | ||||
"lint": "standard --fix konnector.js", | "lint": "standard --fix konnector.js", | ||||
"deploy:travis": "git-directory-deploy --username <YOUR_GH_USERNAME> --email <YOUR_EMAIL> --directory build/ --repo=https://$GITHUB_TOKEN@github.com/<USERNAME_GH>/<SLUG_GH>.git", | "deploy:travis": "git-directory-deploy --username <YOUR_GH_USERNAME> --email <YOUR_EMAIL> --directory build/ --repo=https://$GITHUB_TOKEN@github.com/<USERNAME_GH>/<SLUG_GH>.git", | ||||
"deploy": "git-directory-deploy --directory build/ --branch build --repo=https://gitlab.allella.io/dje/cozy-konnector-enercoop.git" | |||||
"deploy": "git-directory-deploy --directory build/ --branch build --repo=https://github.com/cozy/cozy-konnector-template.git" | |||||
}, | }, | ||||
"devDependencies": { | "devDependencies": { | ||||
"copy-webpack-plugin": "^4.0.1", | "copy-webpack-plugin": "^4.0.1", | ||||
@@ -1,19 +0,0 @@ | |||||
var path = require('path') | |||||
const CopyPlugin = require('copy-webpack-plugin') | |||||
module.exports = { | |||||
entry: './index.js', | |||||
target: 'node', | |||||
output: { | |||||
path: path.join(__dirname, 'build'), | |||||
filename: 'konnector.js' | |||||
}, | |||||
plugins: [ | |||||
new CopyPlugin([ | |||||
{ from: 'manifest.konnector' }, | |||||
{ from: 'package.json' }, | |||||
{ from: 'README.md' }, | |||||
{ from: 'LICENSE' } | |||||
]) | |||||
] | |||||
} |