| @@ -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? | |||
| @@ -18,7 +10,121 @@ What's Cozy? | |||
| 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) | |||
| @@ -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 | |||
| you. | |||
| ### Standard | |||
| We use [standard] to format the `index.js` file. You can run it with: | |||
| ```sh | |||
| npm run lint | |||
| ``` | |||
| ### Maintainer | |||
| The lead maintainers for this konnector is Choj | |||
| The lead maintainers for this konnector is <YOUR NAME> | |||
| ### Get in touch | |||
| @@ -45,7 +159,7 @@ You can reach the Cozy Community by: | |||
| 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" | |||
| [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", | |||
| "name": "Enercoop Cozy konnector", | |||
| "name": "konnector name", | |||
| "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": { | |||
| "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": { | |||
| "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": { | |||
| "description": "Required to save the bills files", | |||
| "description": "Required to save the covers", | |||
| "type": "io.cozy.files" | |||
| }, | |||
| "accounts": { | |||
| @@ -29,7 +36,7 @@ | |||
| } | |||
| }, | |||
| "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", | |||
| "description": "Collects your Enercoop bills", | |||
| "description": "", | |||
| "repository": { | |||
| "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", | |||
| "dependencies": { | |||
| "cozy-konnector-libs": "^3.0.0" | |||
| @@ -19,7 +19,7 @@ | |||
| "build": "webpack", | |||
| "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": "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": { | |||
| "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' } | |||
| ]) | |||
| ] | |||
| } | |||