├── LICENSE ├── README.md ├── api ├── .gitignore ├── .prettierconfig ├── README.md ├── app.ts ├── data │ └── expenses.ts ├── package-lock.json ├── package.json ├── receipts │ └── .gitkeep ├── routes │ └── expenses.ts └── tsconfig.json └── package-lock.json /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 Pleo 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Front-end challenge 2 | Implement an expenses list fetching all expenses from the provided API. Allow the user to add notes and upload receipt pictures to each expense. 3 | 4 | See the [API details](https://github.com/pleo-io/frontend-challenge/blob/master/api/README.md) for implementation. 5 | 6 | ## Functional requirements 7 | - User can list expenses 8 | - User can add a comment on an expense 9 | - User can filter on expenses (client side filters) 10 | - User can add a receipt image on an expense 11 | 12 | ## General requirements 13 | A single page application using a modern JS library/framework including: 14 | - A visually pleasing experience, you don’t have to be a designer but you must have put an effort into making this look good 15 | - A "componentized" approach, split your code into small building blocks, showcase your clean architecture skills. 16 | - CSS can be written using PostCSS, SASS, LESS or similar higher-level language 17 | - The use of any libraries or frameworks as long as you can explain to us why you chose them. 18 | - A brief description of your project. How long did it take? Which part was the hardest to implement? What functionalities are you most proud of? 19 | 20 | ## Nice to have 21 | Want to go the extra mile? Here's few suggestion of things we'd like to see (or go crazy and implement what you think will impress us). 22 | - Responsive design 23 | - Implement with a state management library (Redux, Mobx, VueX, ...) 24 | - Implement solution in TypeScript 25 | - Localization: support for multiple languages (English, French, ...) 26 | 27 | ## What we're looking for 28 | - Using high-quality existing libraries or small amounts of custom code. 29 | - Production grade code (clean, maintainable, reusable code) 30 | - Showing your work through your commit history 31 | - Polish and visual creativity 32 | - Pride in craftsmanship 33 | 34 | ## A few last things 👇 35 | - Please note that while you are free to use libraries of your choosing, we encourage you to write at least some your own code. This is your chance to really impress us with your skills. 36 | - You are welcome to make changes to the API code if you think it will improve your solution 37 | -------------------------------------------------------------------------------- /api/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | receipts 3 | -------------------------------------------------------------------------------- /api/.prettierconfig: -------------------------------------------------------------------------------- 1 | printWidth: 100 2 | tabWidth: 2 3 | parser: flow 4 | semi: false 5 | singleQuote: true 6 | trailingComma: none 7 | jsxBracketSameLine: false 8 | arrowParens: always 9 | -------------------------------------------------------------------------------- /api/README.md: -------------------------------------------------------------------------------- 1 | # API 2 | 3 | Note: 4 | 5 | > The API store the changes in memory, restarting the API server will wipe all changes. 6 | 7 | ## Run the API 8 | In the `/api` folder run: 9 | ```sh 10 | npm install 11 | npm start 12 | ``` 13 | 14 | API is now running at `http://localhost:3000` 15 | 16 | ## Expenses API 17 | 18 | ### Listing expenses 19 | 20 | ``` 21 | GET /expenses 22 | ``` 23 | 24 | #### Query parameters: 25 | - `limit`: number of expenses to fetch. 26 | - `offset`: number of expenses to skip, for pagination. 27 | 28 | Example: 29 | 30 | ``` 31 | GET /expenses?limit=25&offset=25 32 | ``` 33 | This query gets the second page of 25 expenses. 34 | 35 | #### Updating an expense 36 | ``` 37 | POST /expenses/:id 38 | ``` 39 | #### Path parameters: 40 | - `id`: The id of the expense to update 41 | 42 | #### Body parameters: 43 | - `comment`: The comment to set on an expense 44 | 45 | 46 | ### Uploading a receipt to an expense 47 | ``` 48 | POST /expenses/:id/receipts 49 | ``` 50 | #### Form parameters: 51 | - `receipt`: The file to add to the expense 52 | -------------------------------------------------------------------------------- /api/app.ts: -------------------------------------------------------------------------------- 1 | import * as express from 'express' 2 | import * as fileUpload from 'express-fileupload' 3 | import * as createError from 'http-errors' 4 | import * as path from 'path' 5 | import * as logger from 'morgan' 6 | 7 | import expensesRouter from './routes/expenses' 8 | 9 | const app = express() 10 | 11 | app.use(function(req, res, next) { 12 | res.header('Access-Control-Allow-Origin', "*") 13 | res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE') 14 | res.header('Access-Control-Allow-Headers', 'Origin, Content-Type') 15 | next() 16 | }) 17 | 18 | app.use(logger('dev')) 19 | app.use(fileUpload({ 20 | limit: { fileSize: Infinity }, 21 | })); 22 | app.use(express.json()) 23 | app.use(express.urlencoded({ extended: false })) 24 | app.use('/receipts', express.static(path.join(__dirname, 'receipts'))) 25 | 26 | app.use('/expenses', expensesRouter) 27 | 28 | app.use(function(req, res, next) { 29 | next(createError(404)) 30 | }) 31 | 32 | app.use(function(err, req, res, next) { 33 | const message = err.message 34 | const error = req.app.get('env') === 'development' ? err : {} 35 | const status = err.status || 500 36 | 37 | res.status(status || 500) 38 | res.send({ 39 | status, 40 | message, 41 | error 42 | }) 43 | }) 44 | 45 | app.listen(3000) 46 | console.log('API running at http://localhost:3000') 47 | -------------------------------------------------------------------------------- /api/data/expenses.ts: -------------------------------------------------------------------------------- 1 | interface Expense { 2 | id: string; 3 | amount: { 4 | value: string, 5 | currency: string 6 | }; 7 | date: string; 8 | merchant: string; 9 | receipts: any[]; 10 | comment: string; 11 | category: string; 12 | user: { 13 | first: string, 14 | last: string, 15 | email: string 16 | }; 17 | } 18 | 19 | export const expenses: Expense[] = [ 20 | { 21 | id: '5b995dff2e3cb74644948a66', 22 | amount: { 23 | value: '2149.29', 24 | currency: 'GBP' 25 | }, 26 | date: '2017-06-21T08:45:09.326Z', 27 | merchant: 'QUONK', 28 | receipts: [], 29 | comment: '', 30 | category: '', 31 | user: { 32 | first: 'Atkins', 33 | last: 'Blackburn', 34 | email: 'atkins.blackburn@pleo.io' 35 | } 36 | }, 37 | { 38 | id: '5b995dffdeec40464bd614bf', 39 | amount: { 40 | value: '731.92', 41 | currency: 'EUR' 42 | }, 43 | date: '2017-05-30T14:12:31.054Z', 44 | merchant: 'WRAPTURE', 45 | receipts: [], 46 | comment: '', 47 | category: '', 48 | user: { 49 | first: 'Barbara', 50 | last: 'Downs', 51 | email: 'barbara.downs@pleo.io' 52 | } 53 | }, 54 | { 55 | id: '5b995dffcc602abb5c700771', 56 | amount: { 57 | value: '603.42', 58 | currency: 'EUR' 59 | }, 60 | date: '2017-06-19T23:01:32.198Z', 61 | merchant: 'SENMAO', 62 | receipts: [], 63 | comment: '', 64 | category: '', 65 | user: { 66 | first: 'Berta', 67 | last: 'Wise', 68 | email: 'berta.wise@pleo.io' 69 | } 70 | }, 71 | { 72 | id: '5b995dffb6be4eed170194ad', 73 | amount: { 74 | value: '2110.74', 75 | currency: 'GBP' 76 | }, 77 | date: '2014-09-16T04:02:29.331Z', 78 | merchant: 'UPDAT', 79 | receipts: [], 80 | comment: '', 81 | category: '', 82 | user: { 83 | first: 'Guadalupe', 84 | last: 'Bolton', 85 | email: 'guadalupe.bolton@pleo.io' 86 | } 87 | }, 88 | { 89 | id: '5b995dffb04fa69737b7bc0a', 90 | amount: { 91 | value: '2905.02', 92 | currency: 'GBP' 93 | }, 94 | date: '2014-04-10T23:16:08.764Z', 95 | merchant: 'ZORROMOP', 96 | receipts: [], 97 | comment: '', 98 | category: '', 99 | user: { 100 | first: 'Irma', 101 | last: 'Jarvis', 102 | email: 'irma.jarvis@pleo.io' 103 | } 104 | }, 105 | { 106 | id: '5b995dff532e0505c6059b83', 107 | amount: { 108 | value: '3950.01', 109 | currency: 'GBP' 110 | }, 111 | date: '2015-03-16T16:51:35.666Z', 112 | merchant: 'POLARAX', 113 | receipts: [], 114 | comment: '', 115 | category: '', 116 | user: { 117 | first: 'Wong', 118 | last: 'Solis', 119 | email: 'wong.solis@pleo.io' 120 | } 121 | }, 122 | { 123 | id: '5b995dff26b34bf970c0f432', 124 | amount: { 125 | value: '3780.84', 126 | currency: 'EUR' 127 | }, 128 | date: '2016-01-03T08:29:14.959Z', 129 | merchant: 'NURPLEX', 130 | receipts: [], 131 | comment: '', 132 | category: '', 133 | user: { 134 | first: 'Mitchell', 135 | last: 'Moody', 136 | email: 'mitchell.moody@pleo.io' 137 | } 138 | }, 139 | { 140 | id: '5b995dffbb46057fa1ba1d9d', 141 | amount: { 142 | value: '2129.48', 143 | currency: 'EUR' 144 | }, 145 | date: '2017-02-23T13:02:20.101Z', 146 | merchant: 'YURTURE', 147 | receipts: [], 148 | comment: '', 149 | category: '', 150 | user: { 151 | first: 'Debora', 152 | last: 'Leach', 153 | email: 'debora.leach@pleo.io' 154 | } 155 | }, 156 | { 157 | id: '5b995dff58a8f58befbe5267', 158 | amount: { 159 | value: '1721.58', 160 | currency: 'DKK' 161 | }, 162 | date: '2016-01-31T18:31:48.972Z', 163 | merchant: 'DUFLEX', 164 | receipts: [], 165 | comment: '', 166 | category: '', 167 | user: { 168 | first: 'Eloise', 169 | last: 'Holcomb', 170 | email: 'eloise.holcomb@pleo.io' 171 | } 172 | }, 173 | { 174 | id: '5b995dff9576dd083d05b4bd', 175 | amount: { 176 | value: '1660.67', 177 | currency: 'GBP' 178 | }, 179 | date: '2017-06-18T10:45:38.038Z', 180 | merchant: 'APPLIDECK', 181 | receipts: [], 182 | comment: '', 183 | category: '', 184 | user: { 185 | first: 'Carissa', 186 | last: 'Hickman', 187 | email: 'carissa.hickman@pleo.io' 188 | } 189 | }, 190 | { 191 | id: '5b995dff32aa95cc0b45feb7', 192 | amount: { 193 | value: '3926.79', 194 | currency: 'DKK' 195 | }, 196 | date: '2018-05-12T12:53:41.495Z', 197 | merchant: 'KRAG', 198 | receipts: [], 199 | comment: '', 200 | category: '', 201 | user: { 202 | first: 'Dominique', 203 | last: 'Hoover', 204 | email: 'dominique.hoover@pleo.io' 205 | } 206 | }, 207 | { 208 | id: '5b995dff399cfe97db167ae9', 209 | amount: { 210 | value: '227.73', 211 | currency: 'DKK' 212 | }, 213 | date: '2017-05-28T06:40:35.365Z', 214 | merchant: 'STELAECOR', 215 | receipts: [], 216 | comment: '', 217 | category: '', 218 | user: { 219 | first: 'Maria', 220 | last: 'Mcknight', 221 | email: 'maria.mcknight@pleo.io' 222 | } 223 | }, 224 | { 225 | id: '5b995dff499a5a7823d7ae3d', 226 | amount: { 227 | value: '1232.26', 228 | currency: 'GBP' 229 | }, 230 | date: '2017-01-19T05:45:23.857Z', 231 | merchant: 'QUIZKA', 232 | receipts: [], 233 | comment: '', 234 | category: '', 235 | user: { 236 | first: 'Ray', 237 | last: 'Mendoza', 238 | email: 'ray.mendoza@pleo.io' 239 | } 240 | }, 241 | { 242 | id: '5b995dff190ecded8b606e26', 243 | amount: { 244 | value: '2042.46', 245 | currency: 'GBP' 246 | }, 247 | date: '2015-08-10T05:48:00.257Z', 248 | merchant: 'MARQET', 249 | receipts: [], 250 | comment: '', 251 | category: '', 252 | user: { 253 | first: 'Bartlett', 254 | last: 'Webb', 255 | email: 'bartlett.webb@pleo.io' 256 | } 257 | }, 258 | { 259 | id: '5b995dff3ab30be854b10fd6', 260 | amount: { 261 | value: '1354.45', 262 | currency: 'EUR' 263 | }, 264 | date: '2017-05-20T04:43:41.788Z', 265 | merchant: 'JUMPSTACK', 266 | receipts: [], 267 | comment: '', 268 | category: '', 269 | user: { 270 | first: 'Bender', 271 | last: 'Stout', 272 | email: 'bender.stout@pleo.io' 273 | } 274 | }, 275 | { 276 | id: '5b995dffca53e0e292a6c7ef', 277 | amount: { 278 | value: '1494.41', 279 | currency: 'GBP' 280 | }, 281 | date: '2017-02-01T04:12:48.146Z', 282 | merchant: 'EMPIRICA', 283 | receipts: [], 284 | comment: '', 285 | category: '', 286 | user: { 287 | first: 'Marshall', 288 | last: 'Sullivan', 289 | email: 'marshall.sullivan@pleo.io' 290 | } 291 | }, 292 | { 293 | id: '5b995dff1f624c2bd862eac3', 294 | amount: { 295 | value: '3912.66', 296 | currency: 'DKK' 297 | }, 298 | date: '2015-04-17T21:26:09.308Z', 299 | merchant: 'JASPER', 300 | receipts: [], 301 | comment: '', 302 | category: '', 303 | user: { 304 | first: 'Brown', 305 | last: 'Medina', 306 | email: 'brown.medina@pleo.io' 307 | } 308 | }, 309 | { 310 | id: '5b995dffebc765e96f98bee1', 311 | amount: { 312 | value: '1335.01', 313 | currency: 'EUR' 314 | }, 315 | date: '2015-06-06T02:57:22.629Z', 316 | merchant: 'DIGIRANG', 317 | receipts: [], 318 | comment: '', 319 | category: '', 320 | user: { 321 | first: 'Butler', 322 | last: 'Maldonado', 323 | email: 'butler.maldonado@pleo.io' 324 | } 325 | }, 326 | { 327 | id: '5b995dff75ffa69322e76673', 328 | amount: { 329 | value: '18.64', 330 | currency: 'EUR' 331 | }, 332 | date: '2017-04-16T16:36:03.758Z', 333 | merchant: 'QUILITY', 334 | receipts: [], 335 | comment: '', 336 | category: '', 337 | user: { 338 | first: 'Sofia', 339 | last: 'Brady', 340 | email: 'sofia.brady@pleo.io' 341 | } 342 | }, 343 | { 344 | id: '5b995dffacab730f639bb6e6', 345 | amount: { 346 | value: '2146.13', 347 | currency: 'EUR' 348 | }, 349 | date: '2015-06-03T12:50:02.352Z', 350 | merchant: 'KNOWLYSIS', 351 | receipts: [], 352 | comment: '', 353 | category: '', 354 | user: { 355 | first: 'Matilda', 356 | last: 'Copeland', 357 | email: 'matilda.copeland@pleo.io' 358 | } 359 | }, 360 | { 361 | id: '5b995dff23124b8752a52039', 362 | amount: { 363 | value: '1729.41', 364 | currency: 'DKK' 365 | }, 366 | date: '2018-04-03T18:30:28.548Z', 367 | merchant: 'DIGIAL', 368 | receipts: [], 369 | comment: '', 370 | category: '', 371 | user: { 372 | first: 'Weaver', 373 | last: 'Vazquez', 374 | email: 'weaver.vazquez@pleo.io' 375 | } 376 | }, 377 | { 378 | id: '5b995dffdcb62d028cbb18c8', 379 | amount: { 380 | value: '3274.68', 381 | currency: 'EUR' 382 | }, 383 | date: '2014-09-06T12:04:20.722Z', 384 | merchant: 'PRISMATIC', 385 | receipts: [], 386 | comment: '', 387 | category: '', 388 | user: { 389 | first: 'Cardenas', 390 | last: 'Hartman', 391 | email: 'cardenas.hartman@pleo.io' 392 | } 393 | }, 394 | { 395 | id: '5b995dff5093d900c850d380', 396 | amount: { 397 | value: '626.64', 398 | currency: 'DKK' 399 | }, 400 | date: '2016-05-26T06:42:24.102Z', 401 | merchant: 'PARLEYNET', 402 | receipts: [], 403 | comment: '', 404 | category: '', 405 | user: { 406 | first: 'Lawrence', 407 | last: 'Allen', 408 | email: 'lawrence.allen@pleo.io' 409 | } 410 | }, 411 | { 412 | id: '5b995dff317f31c1d075e131', 413 | amount: { 414 | value: '198.69', 415 | currency: 'GBP' 416 | }, 417 | date: '2016-06-08T17:37:30.593Z', 418 | merchant: 'KOZGENE', 419 | receipts: [], 420 | comment: '', 421 | category: '', 422 | user: { 423 | first: 'Lila', 424 | last: 'Espinoza', 425 | email: 'lila.espinoza@pleo.io' 426 | } 427 | }, 428 | { 429 | id: '5b995dff74de7f7c48f460f5', 430 | amount: { 431 | value: '1276.81', 432 | currency: 'DKK' 433 | }, 434 | date: '2015-03-11T17:51:53.076Z', 435 | merchant: 'ZILIDIUM', 436 | receipts: [], 437 | comment: '', 438 | category: '', 439 | user: { 440 | first: 'Penny', 441 | last: 'Dejesus', 442 | email: 'penny.dejesus@pleo.io' 443 | } 444 | }, 445 | { 446 | id: '5b995dff3ff3f164a54d17f1', 447 | amount: { 448 | value: '2908.29', 449 | currency: 'GBP' 450 | }, 451 | date: '2015-08-13T04:03:57.388Z', 452 | merchant: 'QUILTIGEN', 453 | receipts: [], 454 | comment: '', 455 | category: '', 456 | user: { 457 | first: 'Small', 458 | last: 'Ochoa', 459 | email: 'small.ochoa@pleo.io' 460 | } 461 | }, 462 | { 463 | id: '5b995dffbfec33f0548b8861', 464 | amount: { 465 | value: '3003.86', 466 | currency: 'DKK' 467 | }, 468 | date: '2015-02-26T13:11:53.943Z', 469 | merchant: 'ZILLACON', 470 | receipts: [], 471 | comment: '', 472 | category: '', 473 | user: { 474 | first: 'Janette', 475 | last: 'Mooney', 476 | email: 'janette.mooney@pleo.io' 477 | } 478 | }, 479 | { 480 | id: '5b995dffc08493ea1bfbb685', 481 | amount: { 482 | value: '482.33', 483 | currency: 'GBP' 484 | }, 485 | date: '2018-01-14T22:38:10.896Z', 486 | merchant: 'MOBILDATA', 487 | receipts: [], 488 | comment: '', 489 | category: '', 490 | user: { 491 | first: 'Selena', 492 | last: 'Mcmillan', 493 | email: 'selena.mcmillan@pleo.io' 494 | } 495 | }, 496 | { 497 | id: '5b995dff6f4c669a1f9d756e', 498 | amount: { 499 | value: '1080.25', 500 | currency: 'DKK' 501 | }, 502 | date: '2014-05-09T09:11:18.600Z', 503 | merchant: 'ZENTURY', 504 | receipts: [], 505 | comment: '', 506 | category: '', 507 | user: { 508 | first: 'Heather', 509 | last: 'Keith', 510 | email: 'heather.keith@pleo.io' 511 | } 512 | }, 513 | { 514 | id: '5b995dffdcc570a391c673b3', 515 | amount: { 516 | value: '1790.19', 517 | currency: 'EUR' 518 | }, 519 | date: '2016-03-01T09:41:41.936Z', 520 | merchant: 'PLASMOSIS', 521 | receipts: [], 522 | comment: '', 523 | category: '', 524 | user: { 525 | first: 'Silvia', 526 | last: 'Wilder', 527 | email: 'silvia.wilder@pleo.io' 528 | } 529 | }, 530 | { 531 | id: '5b995dff2da817e5a4a27ae6', 532 | amount: { 533 | value: '1802.36', 534 | currency: 'DKK' 535 | }, 536 | date: '2017-11-06T07:50:15.471Z', 537 | merchant: 'BEDDER', 538 | receipts: [], 539 | comment: '', 540 | category: '', 541 | user: { 542 | first: 'Gallegos', 543 | last: 'Tanner', 544 | email: 'gallegos.tanner@pleo.io' 545 | } 546 | }, 547 | { 548 | id: '5b995dff9996b92bca3623d0', 549 | amount: { 550 | value: '697.77', 551 | currency: 'EUR' 552 | }, 553 | date: '2017-09-19T05:43:58.317Z', 554 | merchant: 'XIXAN', 555 | receipts: [], 556 | comment: '', 557 | category: '', 558 | user: { 559 | first: 'Downs', 560 | last: 'Savage', 561 | email: 'downs.savage@pleo.io' 562 | } 563 | }, 564 | { 565 | id: '5b995dff8753b58e227a764c', 566 | amount: { 567 | value: '1228.16', 568 | currency: 'GBP' 569 | }, 570 | date: '2018-01-16T04:38:39.682Z', 571 | merchant: 'KIOSK', 572 | receipts: [], 573 | comment: '', 574 | category: '', 575 | user: { 576 | first: 'Spence', 577 | last: 'Ballard', 578 | email: 'spence.ballard@pleo.io' 579 | } 580 | }, 581 | { 582 | id: '5b995dffa004a60eee373ecb', 583 | amount: { 584 | value: '163.85', 585 | currency: 'DKK' 586 | }, 587 | date: '2017-12-08T00:14:14.498Z', 588 | merchant: 'VALREDA', 589 | receipts: [], 590 | comment: '', 591 | category: '', 592 | user: { 593 | first: 'Amelia', 594 | last: 'Hobbs', 595 | email: 'amelia.hobbs@pleo.io' 596 | } 597 | }, 598 | { 599 | id: '5b995dffd2550a12f69efcca', 600 | amount: { 601 | value: '524.13', 602 | currency: 'DKK' 603 | }, 604 | date: '2015-05-07T08:42:49.040Z', 605 | merchant: 'QUILCH', 606 | receipts: [], 607 | comment: '', 608 | category: '', 609 | user: { 610 | first: 'Janis', 611 | last: 'Dyer', 612 | email: 'janis.dyer@pleo.io' 613 | } 614 | }, 615 | { 616 | id: '5b995dffdde8778c8aaddeda', 617 | amount: { 618 | value: '2814.13', 619 | currency: 'DKK' 620 | }, 621 | date: '2014-06-02T22:42:05.643Z', 622 | merchant: 'OCTOCORE', 623 | receipts: [], 624 | comment: '', 625 | category: '', 626 | user: { 627 | first: 'Renee', 628 | last: 'Bridges', 629 | email: 'renee.bridges@pleo.io' 630 | } 631 | }, 632 | { 633 | id: '5b995dff346b8bc2c8674a6a', 634 | amount: { 635 | value: '3943.38', 636 | currency: 'EUR' 637 | }, 638 | date: '2015-05-05T16:36:06.595Z', 639 | merchant: 'AMTAP', 640 | receipts: [], 641 | comment: '', 642 | category: '', 643 | user: { 644 | first: 'Vivian', 645 | last: 'Munoz', 646 | email: 'vivian.munoz@pleo.io' 647 | } 648 | }, 649 | { 650 | id: '5b995dffc0654be40bb56f1e', 651 | amount: { 652 | value: '2431.36', 653 | currency: 'DKK' 654 | }, 655 | date: '2014-08-06T22:47:29.835Z', 656 | merchant: 'BRISTO', 657 | receipts: [], 658 | comment: '', 659 | category: '', 660 | user: { 661 | first: 'Carolina', 662 | last: 'Lopez', 663 | email: 'carolina.lopez@pleo.io' 664 | } 665 | }, 666 | { 667 | id: '5b995dffe9444395941ee495', 668 | amount: { 669 | value: '3803.23', 670 | currency: 'DKK' 671 | }, 672 | date: '2016-03-10T19:40:17.993Z', 673 | merchant: 'AFFLUEX', 674 | receipts: [], 675 | comment: '', 676 | category: '', 677 | user: { 678 | first: 'William', 679 | last: 'Francis', 680 | email: 'william.francis@pleo.io' 681 | } 682 | }, 683 | { 684 | id: '5b995dff44825fc6f30c97d4', 685 | amount: { 686 | value: '3288.48', 687 | currency: 'GBP' 688 | }, 689 | date: '2015-11-06T16:06:52.245Z', 690 | merchant: 'ROCKABYE', 691 | receipts: [], 692 | comment: '', 693 | category: '', 694 | user: { 695 | first: 'Sheryl', 696 | last: 'Hunt', 697 | email: 'sheryl.hunt@pleo.io' 698 | } 699 | }, 700 | { 701 | id: '5b995dffc2aa1a91289082a9', 702 | amount: { 703 | value: '1213.29', 704 | currency: 'DKK' 705 | }, 706 | date: '2017-04-02T23:07:01.968Z', 707 | merchant: 'TERRAGEN', 708 | receipts: [], 709 | comment: '', 710 | category: '', 711 | user: { 712 | first: 'Ronda', 713 | last: 'Nunez', 714 | email: 'ronda.nunez@pleo.io' 715 | } 716 | }, 717 | { 718 | id: '5b995dff8acdb7764003a9a4', 719 | amount: { 720 | value: '2999.51', 721 | currency: 'GBP' 722 | }, 723 | date: '2017-07-13T10:48:59.380Z', 724 | merchant: 'BUZZWORKS', 725 | receipts: [], 726 | comment: '', 727 | category: '', 728 | user: { 729 | first: 'Cathy', 730 | last: 'Mccormick', 731 | email: 'cathy.mccormick@pleo.io' 732 | } 733 | }, 734 | { 735 | id: '5b995dff567ee4021e4bdbae', 736 | amount: { 737 | value: '3860.23', 738 | currency: 'EUR' 739 | }, 740 | date: '2014-10-28T23:36:08.142Z', 741 | merchant: 'TYPHONICA', 742 | receipts: [], 743 | comment: '', 744 | category: '', 745 | user: { 746 | first: 'Fletcher', 747 | last: 'Gaines', 748 | email: 'fletcher.gaines@pleo.io' 749 | } 750 | }, 751 | { 752 | id: '5b995dff32fce1671a025316', 753 | amount: { 754 | value: '704.92', 755 | currency: 'EUR' 756 | }, 757 | date: '2017-06-07T23:16:55.055Z', 758 | merchant: 'RODEMCO', 759 | receipts: [], 760 | comment: '', 761 | category: '', 762 | user: { 763 | first: 'Hawkins', 764 | last: 'Hyde', 765 | email: 'hawkins.hyde@pleo.io' 766 | } 767 | }, 768 | { 769 | id: '5b995dff87024916e382ff9a', 770 | amount: { 771 | value: '900.47', 772 | currency: 'GBP' 773 | }, 774 | date: '2016-12-17T12:59:13.036Z', 775 | merchant: 'ZENSUS', 776 | receipts: [], 777 | comment: '', 778 | category: '', 779 | user: { 780 | first: 'Ellison', 781 | last: 'Gutierrez', 782 | email: 'ellison.gutierrez@pleo.io' 783 | } 784 | }, 785 | { 786 | id: '5b995dff4bfcacbb9bb37a7c', 787 | amount: { 788 | value: '269.65', 789 | currency: 'GBP' 790 | }, 791 | date: '2018-05-15T07:33:37.031Z', 792 | merchant: 'ENTOGROK', 793 | receipts: [], 794 | comment: '', 795 | category: '', 796 | user: { 797 | first: 'Claire', 798 | last: 'Leonard', 799 | email: 'claire.leonard@pleo.io' 800 | } 801 | }, 802 | { 803 | id: '5b995dff09ebef35d7c4785d', 804 | amount: { 805 | value: '1831.06', 806 | currency: 'DKK' 807 | }, 808 | date: '2014-12-24T16:09:08.229Z', 809 | merchant: 'INTERLOO', 810 | receipts: [], 811 | comment: '', 812 | category: '', 813 | user: { 814 | first: 'Thornton', 815 | last: 'Watson', 816 | email: 'thornton.watson@pleo.io' 817 | } 818 | }, 819 | { 820 | id: '5b995dff37b46a294546162d', 821 | amount: { 822 | value: '729.24', 823 | currency: 'EUR' 824 | }, 825 | date: '2014-03-17T02:35:59.394Z', 826 | merchant: 'NITRACYR', 827 | receipts: [], 828 | comment: '', 829 | category: '', 830 | user: { 831 | first: 'Estelle', 832 | last: 'Monroe', 833 | email: 'estelle.monroe@pleo.io' 834 | } 835 | }, 836 | { 837 | id: '5b995dff320f98ae6f5638be', 838 | amount: { 839 | value: '361.41', 840 | currency: 'EUR' 841 | }, 842 | date: '2015-04-17T06:21:20.415Z', 843 | merchant: 'ZILLAR', 844 | receipts: [], 845 | comment: '', 846 | category: '', 847 | user: { 848 | first: 'Kane', 849 | last: 'Gallegos', 850 | email: 'kane.gallegos@pleo.io' 851 | } 852 | }, 853 | { 854 | id: '5b995dfffa1aefad04f332f7', 855 | amount: { 856 | value: '1992.91', 857 | currency: 'GBP' 858 | }, 859 | date: '2017-01-07T15:54:40.908Z', 860 | merchant: 'POLARIUM', 861 | receipts: [], 862 | comment: '', 863 | category: '', 864 | user: { 865 | first: 'Juliet', 866 | last: 'Holloway', 867 | email: 'juliet.holloway@pleo.io' 868 | } 869 | }, 870 | { 871 | id: '5b995dff0ec12c99d0601413', 872 | amount: { 873 | value: '2212.8', 874 | currency: 'GBP' 875 | }, 876 | date: '2017-08-26T15:33:39.268Z', 877 | merchant: 'MANGLO', 878 | receipts: [], 879 | comment: '', 880 | category: '', 881 | user: { 882 | first: 'Tracy', 883 | last: 'Waller', 884 | email: 'tracy.waller@pleo.io' 885 | } 886 | }, 887 | { 888 | id: '5b995dff7497c35e6b9c92bb', 889 | amount: { 890 | value: '528.81', 891 | currency: 'EUR' 892 | }, 893 | date: '2015-08-12T14:16:38.465Z', 894 | merchant: 'JUNIPOOR', 895 | receipts: [], 896 | comment: '', 897 | category: '', 898 | user: { 899 | first: 'Claudine', 900 | last: 'Powell', 901 | email: 'claudine.powell@pleo.io' 902 | } 903 | }, 904 | { 905 | id: '5b995dff9c0f0dfb4a88d1eb', 906 | amount: { 907 | value: '1709.05', 908 | currency: 'GBP' 909 | }, 910 | date: '2018-01-20T13:58:32.329Z', 911 | merchant: 'EXOVENT', 912 | receipts: [], 913 | comment: '', 914 | category: '', 915 | user: { 916 | first: 'Estes', 917 | last: 'Brown', 918 | email: 'estes.brown@pleo.io' 919 | } 920 | }, 921 | { 922 | id: '5b995dffb1a697b52bb733c8', 923 | amount: { 924 | value: '1671.6', 925 | currency: 'EUR' 926 | }, 927 | date: '2015-04-30T22:41:12.145Z', 928 | merchant: 'COMCUBINE', 929 | receipts: [], 930 | comment: '', 931 | category: '', 932 | user: { 933 | first: 'Minnie', 934 | last: 'Ayala', 935 | email: 'minnie.ayala@pleo.io' 936 | } 937 | }, 938 | { 939 | id: '5b995dffac46fc715d1b475c', 940 | amount: { 941 | value: '855.69', 942 | currency: 'GBP' 943 | }, 944 | date: '2017-04-21T05:42:50.785Z', 945 | merchant: 'ILLUMITY', 946 | receipts: [], 947 | comment: '', 948 | category: '', 949 | user: { 950 | first: 'Lourdes', 951 | last: 'Gallagher', 952 | email: 'lourdes.gallagher@pleo.io' 953 | } 954 | }, 955 | { 956 | id: '5b995dff1aa5d585091ca6ec', 957 | amount: { 958 | value: '1349.61', 959 | currency: 'DKK' 960 | }, 961 | date: '2018-01-21T19:11:01.895Z', 962 | merchant: 'GINKLE', 963 | receipts: [], 964 | comment: '', 965 | category: '', 966 | user: { 967 | first: 'Sampson', 968 | last: 'Stephenson', 969 | email: 'sampson.stephenson@pleo.io' 970 | } 971 | }, 972 | { 973 | id: '5b995dffc78ee574202a40fa', 974 | amount: { 975 | value: '1099.85', 976 | currency: 'DKK' 977 | }, 978 | date: '2016-06-26T10:11:28.477Z', 979 | merchant: 'KANGLE', 980 | receipts: [], 981 | comment: '', 982 | category: '', 983 | user: { 984 | first: 'Hinton', 985 | last: 'Cleveland', 986 | email: 'hinton.cleveland@pleo.io' 987 | } 988 | }, 989 | { 990 | id: '5b995dff2fbb6ea60ff6b900', 991 | amount: { 992 | value: '3164.73', 993 | currency: 'DKK' 994 | }, 995 | date: '2015-04-04T04:08:57.928Z', 996 | merchant: 'CORECOM', 997 | receipts: [], 998 | comment: '', 999 | category: '', 1000 | user: { 1001 | first: 'Alexandria', 1002 | last: 'Valencia', 1003 | email: 'alexandria.valencia@pleo.io' 1004 | } 1005 | }, 1006 | { 1007 | id: '5b995dff101b241ca970a172', 1008 | amount: { 1009 | value: '534.13', 1010 | currency: 'EUR' 1011 | }, 1012 | date: '2018-05-26T07:52:07.560Z', 1013 | merchant: 'MULTRON', 1014 | receipts: [], 1015 | comment: '', 1016 | category: '', 1017 | user: { 1018 | first: 'Latoya', 1019 | last: 'Case', 1020 | email: 'latoya.case@pleo.io' 1021 | } 1022 | }, 1023 | { 1024 | id: '5b995dff1b64a0317ee2b982', 1025 | amount: { 1026 | value: '3093.16', 1027 | currency: 'GBP' 1028 | }, 1029 | date: '2018-02-12T09:40:44.742Z', 1030 | merchant: 'GENMOM', 1031 | receipts: [], 1032 | comment: '', 1033 | category: '', 1034 | user: { 1035 | first: 'Virginia', 1036 | last: 'Benjamin', 1037 | email: 'virginia.benjamin@pleo.io' 1038 | } 1039 | }, 1040 | { 1041 | id: '5b995dff0bfee053b4a64638', 1042 | amount: { 1043 | value: '2312.97', 1044 | currency: 'DKK' 1045 | }, 1046 | date: '2017-11-29T00:40:29.337Z', 1047 | merchant: 'COGNICODE', 1048 | receipts: [], 1049 | comment: '', 1050 | category: '', 1051 | user: { 1052 | first: 'Ophelia', 1053 | last: 'Cortez', 1054 | email: 'ophelia.cortez@pleo.io' 1055 | } 1056 | }, 1057 | { 1058 | id: '5b995dff88077169faa2aa42', 1059 | amount: { 1060 | value: '697.28', 1061 | currency: 'GBP' 1062 | }, 1063 | date: '2018-05-16T01:49:45.368Z', 1064 | merchant: 'EXTRAGEN', 1065 | receipts: [], 1066 | comment: '', 1067 | category: '', 1068 | user: { 1069 | first: 'Mckenzie', 1070 | last: 'Cervantes', 1071 | email: 'mckenzie.cervantes@pleo.io' 1072 | } 1073 | }, 1074 | { 1075 | id: '5b995dff5bc6b86420dfa882', 1076 | amount: { 1077 | value: '2736.02', 1078 | currency: 'DKK' 1079 | }, 1080 | date: '2017-01-01T00:38:45.911Z', 1081 | merchant: 'PORTALIS', 1082 | receipts: [], 1083 | comment: '', 1084 | category: '', 1085 | user: { 1086 | first: 'Reyna', 1087 | last: 'Delaney', 1088 | email: 'reyna.delaney@pleo.io' 1089 | } 1090 | }, 1091 | { 1092 | id: '5b995dff3e1615ac593c95bb', 1093 | amount: { 1094 | value: '908.71', 1095 | currency: 'DKK' 1096 | }, 1097 | date: '2014-08-28T07:36:19.956Z', 1098 | merchant: 'INSURETY', 1099 | receipts: [], 1100 | comment: '', 1101 | category: '', 1102 | user: { 1103 | first: 'Villarreal', 1104 | last: 'Mckinney', 1105 | email: 'villarreal.mckinney@pleo.io' 1106 | } 1107 | }, 1108 | { 1109 | id: '5b995dff39d131565c961202', 1110 | amount: { 1111 | value: '1827.39', 1112 | currency: 'DKK' 1113 | }, 1114 | date: '2014-04-11T05:26:48.836Z', 1115 | merchant: 'COMFIRM', 1116 | receipts: [], 1117 | comment: '', 1118 | category: '', 1119 | user: { 1120 | first: 'Harvey', 1121 | last: 'Carlson', 1122 | email: 'harvey.carlson@pleo.io' 1123 | } 1124 | }, 1125 | { 1126 | id: '5b995dffd1b2e155600f389f', 1127 | amount: { 1128 | value: '2204.19', 1129 | currency: 'GBP' 1130 | }, 1131 | date: '2016-10-07T14:48:58.904Z', 1132 | merchant: 'FORTEAN', 1133 | receipts: [], 1134 | comment: '', 1135 | category: '', 1136 | user: { 1137 | first: 'Mays', 1138 | last: 'Sparks', 1139 | email: 'mays.sparks@pleo.io' 1140 | } 1141 | }, 1142 | { 1143 | id: '5b995dff4d8055dcf356f8c1', 1144 | amount: { 1145 | value: '1802.76', 1146 | currency: 'EUR' 1147 | }, 1148 | date: '2016-12-08T03:18:34.821Z', 1149 | merchant: 'CANDECOR', 1150 | receipts: [], 1151 | comment: '', 1152 | category: '', 1153 | user: { 1154 | first: 'Hicks', 1155 | last: 'Murphy', 1156 | email: 'hicks.murphy@pleo.io' 1157 | } 1158 | }, 1159 | { 1160 | id: '5b995dff2a7712e24e0e9bf2', 1161 | amount: { 1162 | value: '3993.94', 1163 | currency: 'GBP' 1164 | }, 1165 | date: '2014-01-20T13:32:50.522Z', 1166 | merchant: 'PHEAST', 1167 | receipts: [], 1168 | comment: '', 1169 | category: '', 1170 | user: { 1171 | first: 'Caldwell', 1172 | last: 'Evans', 1173 | email: 'caldwell.evans@pleo.io' 1174 | } 1175 | }, 1176 | { 1177 | id: '5b995dffe67596fc9ccfe9d1', 1178 | amount: { 1179 | value: '915.18', 1180 | currency: 'EUR' 1181 | }, 1182 | date: '2016-12-18T11:47:08.943Z', 1183 | merchant: 'MEDESIGN', 1184 | receipts: [], 1185 | comment: '', 1186 | category: '', 1187 | user: { 1188 | first: 'Schwartz', 1189 | last: 'Gentry', 1190 | email: 'schwartz.gentry@pleo.io' 1191 | } 1192 | }, 1193 | { 1194 | id: '5b995dff74d5c12e797bf6ff', 1195 | amount: { 1196 | value: '2182.26', 1197 | currency: 'DKK' 1198 | }, 1199 | date: '2014-11-21T19:56:05.315Z', 1200 | merchant: 'BIOLIVE', 1201 | receipts: [], 1202 | comment: '', 1203 | category: '', 1204 | user: { 1205 | first: 'Chris', 1206 | last: 'Pugh', 1207 | email: 'chris.pugh@pleo.io' 1208 | } 1209 | }, 1210 | { 1211 | id: '5b995dffab3173cfef973321', 1212 | amount: { 1213 | value: '1217.01', 1214 | currency: 'DKK' 1215 | }, 1216 | date: '2016-02-11T16:59:59.597Z', 1217 | merchant: 'SULTRAXIN', 1218 | receipts: [], 1219 | comment: '', 1220 | category: '', 1221 | user: { 1222 | first: 'Bernadine', 1223 | last: 'Rodriguez', 1224 | email: 'bernadine.rodriguez@pleo.io' 1225 | } 1226 | }, 1227 | { 1228 | id: '5b995dffff7d85c7bc7d00d0', 1229 | amount: { 1230 | value: '3721.65', 1231 | currency: 'GBP' 1232 | }, 1233 | date: '2016-10-10T18:42:05.035Z', 1234 | merchant: 'GEEKFARM', 1235 | receipts: [], 1236 | comment: '', 1237 | category: '', 1238 | user: { 1239 | first: 'Peterson', 1240 | last: 'Ashley', 1241 | email: 'peterson.ashley@pleo.io' 1242 | } 1243 | }, 1244 | { 1245 | id: '5b995dff2840aaad67864b54', 1246 | amount: { 1247 | value: '2796.12', 1248 | currency: 'EUR' 1249 | }, 1250 | date: '2015-09-02T05:16:19.547Z', 1251 | merchant: 'HYPLEX', 1252 | receipts: [], 1253 | comment: '', 1254 | category: '', 1255 | user: { 1256 | first: 'Justine', 1257 | last: 'Arnold', 1258 | email: 'justine.arnold@pleo.io' 1259 | } 1260 | }, 1261 | { 1262 | id: '5b995dff57d14443f09d6eb2', 1263 | amount: { 1264 | value: '2828.01', 1265 | currency: 'DKK' 1266 | }, 1267 | date: '2016-12-30T17:18:26.228Z', 1268 | merchant: 'TRANSLINK', 1269 | receipts: [], 1270 | comment: '', 1271 | category: '', 1272 | user: { 1273 | first: 'Beth', 1274 | last: 'Landry', 1275 | email: 'beth.landry@pleo.io' 1276 | } 1277 | }, 1278 | { 1279 | id: '5b995dff74b94940dd48f706', 1280 | amount: { 1281 | value: '1830.72', 1282 | currency: 'EUR' 1283 | }, 1284 | date: '2018-02-04T03:47:31.125Z', 1285 | merchant: 'URBANSHEE', 1286 | receipts: [], 1287 | comment: '', 1288 | category: '', 1289 | user: { 1290 | first: 'Pate', 1291 | last: 'Cruz', 1292 | email: 'pate.cruz@pleo.io' 1293 | } 1294 | }, 1295 | { 1296 | id: '5b995dfff954ed909133b14c', 1297 | amount: { 1298 | value: '1825.37', 1299 | currency: 'EUR' 1300 | }, 1301 | date: '2014-12-14T14:01:42.112Z', 1302 | merchant: 'ENERSAVE', 1303 | receipts: [], 1304 | comment: '', 1305 | category: '', 1306 | user: { 1307 | first: 'Mercedes', 1308 | last: 'Simon', 1309 | email: 'mercedes.simon@pleo.io' 1310 | } 1311 | }, 1312 | { 1313 | id: '5b995dff76d51d211c4b3192', 1314 | amount: { 1315 | value: '452.34', 1316 | currency: 'EUR' 1317 | }, 1318 | date: '2017-11-13T15:02:07.329Z', 1319 | merchant: 'ORBIN', 1320 | receipts: [], 1321 | comment: '', 1322 | category: '', 1323 | user: { 1324 | first: 'Angelina', 1325 | last: 'Logan', 1326 | email: 'angelina.logan@pleo.io' 1327 | } 1328 | }, 1329 | { 1330 | id: '5b995dff30420221c7ce2d11', 1331 | amount: { 1332 | value: '3668.15', 1333 | currency: 'EUR' 1334 | }, 1335 | date: '2014-09-08T09:12:38.691Z', 1336 | merchant: 'DIGIGEN', 1337 | receipts: [], 1338 | comment: '', 1339 | category: '', 1340 | user: { 1341 | first: 'Randi', 1342 | last: 'Peck', 1343 | email: 'randi.peck@pleo.io' 1344 | } 1345 | }, 1346 | { 1347 | id: '5b995dffc7ae9623559f0bad', 1348 | amount: { 1349 | value: '3415.36', 1350 | currency: 'GBP' 1351 | }, 1352 | date: '2015-04-07T12:26:15.285Z', 1353 | merchant: 'QABOOS', 1354 | receipts: [], 1355 | comment: '', 1356 | category: '', 1357 | user: { 1358 | first: 'Willis', 1359 | last: 'Davenport', 1360 | email: 'willis.davenport@pleo.io' 1361 | } 1362 | }, 1363 | { 1364 | id: '5b995dff6d8977370559526a', 1365 | amount: { 1366 | value: '454.42', 1367 | currency: 'GBP' 1368 | }, 1369 | date: '2016-07-23T06:52:03.420Z', 1370 | merchant: 'ENAUT', 1371 | receipts: [], 1372 | comment: '', 1373 | category: '', 1374 | user: { 1375 | first: 'Aurelia', 1376 | last: 'Mercer', 1377 | email: 'aurelia.mercer@pleo.io' 1378 | } 1379 | }, 1380 | { 1381 | id: '5b995dffec9cbbc82a7320aa', 1382 | amount: { 1383 | value: '3213.01', 1384 | currency: 'DKK' 1385 | }, 1386 | date: '2017-02-26T16:56:25.194Z', 1387 | merchant: 'OPTICALL', 1388 | receipts: [], 1389 | comment: '', 1390 | category: '', 1391 | user: { 1392 | first: 'Harrison', 1393 | last: 'Crawford', 1394 | email: 'harrison.crawford@pleo.io' 1395 | } 1396 | }, 1397 | { 1398 | id: '5b995dff92941bc708a31fae', 1399 | amount: { 1400 | value: '81.7', 1401 | currency: 'DKK' 1402 | }, 1403 | date: '2017-02-10T04:55:47.858Z', 1404 | merchant: 'FURNAFIX', 1405 | receipts: [], 1406 | comment: '', 1407 | category: '', 1408 | user: { 1409 | first: 'Kelsey', 1410 | last: 'Christensen', 1411 | email: 'kelsey.christensen@pleo.io' 1412 | } 1413 | }, 1414 | { 1415 | id: '5b995dff0c8cfe07d38da664', 1416 | amount: { 1417 | value: '2744.58', 1418 | currency: 'DKK' 1419 | }, 1420 | date: '2016-12-26T15:51:43.997Z', 1421 | merchant: 'ZYTRAC', 1422 | receipts: [], 1423 | comment: '', 1424 | category: '', 1425 | user: { 1426 | first: 'Janine', 1427 | last: 'Terrell', 1428 | email: 'janine.terrell@pleo.io' 1429 | } 1430 | }, 1431 | { 1432 | id: '5b995dffd9b42bc624992100', 1433 | amount: { 1434 | value: '374.94', 1435 | currency: 'DKK' 1436 | }, 1437 | date: '2015-11-28T17:45:36.125Z', 1438 | merchant: 'ISOSTREAM', 1439 | receipts: [], 1440 | comment: '', 1441 | category: '', 1442 | user: { 1443 | first: 'Tucker', 1444 | last: 'Townsend', 1445 | email: 'tucker.townsend@pleo.io' 1446 | } 1447 | }, 1448 | { 1449 | id: '5b995dffefc53f54abc9a565', 1450 | amount: { 1451 | value: '3281.83', 1452 | currency: 'EUR' 1453 | }, 1454 | date: '2014-10-29T02:59:39.775Z', 1455 | merchant: 'TROPOLIS', 1456 | receipts: [], 1457 | comment: '', 1458 | category: '', 1459 | user: { 1460 | first: 'Savannah', 1461 | last: 'Barron', 1462 | email: 'savannah.barron@pleo.io' 1463 | } 1464 | }, 1465 | { 1466 | id: '5b995dffb2ba0d06a3c53f16', 1467 | amount: { 1468 | value: '3520.73', 1469 | currency: 'GBP' 1470 | }, 1471 | date: '2018-05-12T06:51:42.896Z', 1472 | merchant: 'SCHOOLIO', 1473 | receipts: [], 1474 | comment: '', 1475 | category: '', 1476 | user: { 1477 | first: 'Wheeler', 1478 | last: 'Noel', 1479 | email: 'wheeler.noel@pleo.io' 1480 | } 1481 | }, 1482 | { 1483 | id: '5b995dffb8dd77344791ab46', 1484 | amount: { 1485 | value: '1971.15', 1486 | currency: 'EUR' 1487 | }, 1488 | date: '2014-03-11T03:31:08.945Z', 1489 | merchant: 'INVENTURE', 1490 | receipts: [], 1491 | comment: '', 1492 | category: '', 1493 | user: { 1494 | first: 'Bauer', 1495 | last: 'Clark', 1496 | email: 'bauer.clark@pleo.io' 1497 | } 1498 | }, 1499 | { 1500 | id: '5b995dff47e5e1ab9c27bc29', 1501 | amount: { 1502 | value: '971', 1503 | currency: 'EUR' 1504 | }, 1505 | date: '2014-04-01T20:42:58.429Z', 1506 | merchant: 'RADIANTIX', 1507 | receipts: [], 1508 | comment: '', 1509 | category: '', 1510 | user: { 1511 | first: 'Sabrina', 1512 | last: 'Stanton', 1513 | email: 'sabrina.stanton@pleo.io' 1514 | } 1515 | }, 1516 | { 1517 | id: '5b995dff0271fe23be07e42e', 1518 | amount: { 1519 | value: '2473.44', 1520 | currency: 'GBP' 1521 | }, 1522 | date: '2015-03-18T10:31:04.574Z', 1523 | merchant: 'OLYMPIX', 1524 | receipts: [], 1525 | comment: '', 1526 | category: '', 1527 | user: { 1528 | first: 'Kemp', 1529 | last: 'Ramos', 1530 | email: 'kemp.ramos@pleo.io' 1531 | } 1532 | }, 1533 | { 1534 | id: '5b995dff135ac1b89e98a4d9', 1535 | amount: { 1536 | value: '2950.74', 1537 | currency: 'DKK' 1538 | }, 1539 | date: '2014-04-03T15:58:20.355Z', 1540 | merchant: 'NORSUP', 1541 | receipts: [], 1542 | comment: '', 1543 | category: '', 1544 | user: { 1545 | first: 'Mccray', 1546 | last: 'Thomas', 1547 | email: 'mccray.thomas@pleo.io' 1548 | } 1549 | }, 1550 | { 1551 | id: '5b995dffa0864eddc16e2f76', 1552 | amount: { 1553 | value: '166', 1554 | currency: 'GBP' 1555 | }, 1556 | date: '2018-08-12T00:37:46.342Z', 1557 | merchant: 'KONNECT', 1558 | receipts: [], 1559 | comment: '', 1560 | category: '', 1561 | user: { 1562 | first: 'Pam', 1563 | last: 'Noble', 1564 | email: 'pam.noble@pleo.io' 1565 | } 1566 | }, 1567 | { 1568 | id: '5b995dff6085fed110fc3968', 1569 | amount: { 1570 | value: '2286.58', 1571 | currency: 'DKK' 1572 | }, 1573 | date: '2016-07-21T08:58:12.509Z', 1574 | merchant: 'DANJA', 1575 | receipts: [], 1576 | comment: '', 1577 | category: '', 1578 | user: { 1579 | first: 'Ericka', 1580 | last: 'Edwards', 1581 | email: 'ericka.edwards@pleo.io' 1582 | } 1583 | }, 1584 | { 1585 | id: '5b995dff57d1febf66751b52', 1586 | amount: { 1587 | value: '3983.32', 1588 | currency: 'GBP' 1589 | }, 1590 | date: '2014-10-10T10:42:15.999Z', 1591 | merchant: 'IZZBY', 1592 | receipts: [], 1593 | comment: '', 1594 | category: '', 1595 | user: { 1596 | first: 'Baird', 1597 | last: 'Galloway', 1598 | email: 'baird.galloway@pleo.io' 1599 | } 1600 | }, 1601 | { 1602 | id: '5b995dffc68bbfac60b69c77', 1603 | amount: { 1604 | value: '1179.51', 1605 | currency: 'EUR' 1606 | }, 1607 | date: '2015-02-13T13:20:37.677Z', 1608 | merchant: 'ISOPOP', 1609 | receipts: [], 1610 | comment: '', 1611 | category: '', 1612 | user: { 1613 | first: 'Bird', 1614 | last: 'Stewart', 1615 | email: 'bird.stewart@pleo.io' 1616 | } 1617 | }, 1618 | { 1619 | id: '5b99606489042a07a8a1c616', 1620 | amount: { 1621 | value: '346.08', 1622 | currency: 'GBP' 1623 | }, 1624 | date: '2014-09-06T21:33:30.681Z', 1625 | merchant: 'FANGOLD', 1626 | receipts: [], 1627 | comment: '', 1628 | category: '', 1629 | user: { 1630 | first: 'Zamora', 1631 | last: 'Medina', 1632 | email: 'zamora.medina@pleo.io' 1633 | } 1634 | }, 1635 | { 1636 | id: '5b99606449859eb107ca580b', 1637 | amount: { 1638 | value: '1073.23', 1639 | currency: 'DKK' 1640 | }, 1641 | date: '2017-10-21T20:39:52.346Z', 1642 | merchant: 'PROTODYNE', 1643 | receipts: [], 1644 | comment: '', 1645 | category: '', 1646 | user: { 1647 | first: 'Stephanie', 1648 | last: 'Irwin', 1649 | email: 'stephanie.irwin@pleo.io' 1650 | } 1651 | }, 1652 | { 1653 | id: '5b996064b7ef9d7f8ea8b10c', 1654 | amount: { 1655 | value: '1200.69', 1656 | currency: 'EUR' 1657 | }, 1658 | date: '2016-08-21T18:47:23.532Z', 1659 | merchant: 'LUDAK', 1660 | receipts: [], 1661 | comment: '', 1662 | category: '', 1663 | user: { 1664 | first: 'Harvey', 1665 | last: 'Castillo', 1666 | email: 'harvey.castillo@pleo.io' 1667 | } 1668 | }, 1669 | { 1670 | id: '5b9960649f83b9fa9bbb8707', 1671 | amount: { 1672 | value: '3393.58', 1673 | currency: 'EUR' 1674 | }, 1675 | date: '2016-12-06T23:44:04.413Z', 1676 | merchant: 'BESTO', 1677 | receipts: [], 1678 | comment: '', 1679 | category: '', 1680 | user: { 1681 | first: 'Shana', 1682 | last: 'Oliver', 1683 | email: 'shana.oliver@pleo.io' 1684 | } 1685 | }, 1686 | { 1687 | id: '5b9960649f37a3041c65877c', 1688 | amount: { 1689 | value: '412.03', 1690 | currency: 'GBP' 1691 | }, 1692 | date: '2017-05-25T07:59:38.697Z', 1693 | merchant: 'SKYPLEX', 1694 | receipts: [], 1695 | comment: '', 1696 | category: '', 1697 | user: { 1698 | first: 'Rose', 1699 | last: 'Fitzgerald', 1700 | email: 'rose.fitzgerald@pleo.io' 1701 | } 1702 | }, 1703 | { 1704 | id: '5b9960642ac4813bf0049122', 1705 | amount: { 1706 | value: '331.66', 1707 | currency: 'GBP' 1708 | }, 1709 | date: '2016-09-20T05:27:19.994Z', 1710 | merchant: 'WATERBABY', 1711 | receipts: [], 1712 | comment: '', 1713 | category: '', 1714 | user: { 1715 | first: 'Lillie', 1716 | last: 'Emerson', 1717 | email: 'lillie.emerson@pleo.io' 1718 | } 1719 | }, 1720 | { 1721 | id: '5b996064081ecc29f27ccbd5', 1722 | amount: { 1723 | value: '1270.95', 1724 | currency: 'GBP' 1725 | }, 1726 | date: '2014-07-25T13:30:30.323Z', 1727 | merchant: 'GENEKOM', 1728 | receipts: [], 1729 | comment: '', 1730 | category: '', 1731 | user: { 1732 | first: 'Long', 1733 | last: 'Fischer', 1734 | email: 'long.fischer@pleo.io' 1735 | } 1736 | }, 1737 | { 1738 | id: '5b9960642099c5f53cae31f1', 1739 | amount: { 1740 | value: '3447.86', 1741 | currency: 'EUR' 1742 | }, 1743 | date: '2017-12-29T18:28:16.097Z', 1744 | merchant: 'EMTRAK', 1745 | receipts: [], 1746 | comment: '', 1747 | category: '', 1748 | user: { 1749 | first: 'Imogene', 1750 | last: 'Hartman', 1751 | email: 'imogene.hartman@pleo.io' 1752 | } 1753 | }, 1754 | { 1755 | id: '5b996064effb39030c6b8f2d', 1756 | amount: { 1757 | value: '2561.07', 1758 | currency: 'EUR' 1759 | }, 1760 | date: '2016-11-17T04:19:40.235Z', 1761 | merchant: 'BLANET', 1762 | receipts: [], 1763 | comment: '', 1764 | category: '', 1765 | user: { 1766 | first: 'Nancy', 1767 | last: 'Hammond', 1768 | email: 'nancy.hammond@pleo.io' 1769 | } 1770 | }, 1771 | { 1772 | id: '5b99606443ad0c4311f1d02d', 1773 | amount: { 1774 | value: '3022.16', 1775 | currency: 'EUR' 1776 | }, 1777 | date: '2017-08-12T18:38:14.603Z', 1778 | merchant: 'AUSTEX', 1779 | receipts: [], 1780 | comment: '', 1781 | category: '', 1782 | user: { 1783 | first: 'Fay', 1784 | last: 'Lucas', 1785 | email: 'fay.lucas@pleo.io' 1786 | } 1787 | }, 1788 | { 1789 | id: '5b9960647036de0eb5954db1', 1790 | amount: { 1791 | value: '476.98', 1792 | currency: 'DKK' 1793 | }, 1794 | date: '2018-04-29T03:30:46.282Z', 1795 | merchant: 'BILLMED', 1796 | receipts: [], 1797 | comment: '', 1798 | category: '', 1799 | user: { 1800 | first: 'Barry', 1801 | last: 'Gallagher', 1802 | email: 'barry.gallagher@pleo.io' 1803 | } 1804 | }, 1805 | { 1806 | id: '5b996064f5becf9df839e560', 1807 | amount: { 1808 | value: '3.82', 1809 | currency: 'DKK' 1810 | }, 1811 | date: '2018-06-25T09:34:47.477Z', 1812 | merchant: 'MACRONAUT', 1813 | receipts: [], 1814 | comment: '', 1815 | category: '', 1816 | user: { 1817 | first: 'Dena', 1818 | last: 'Warren', 1819 | email: 'dena.warren@pleo.io' 1820 | } 1821 | }, 1822 | { 1823 | id: '5b996064dfd5b783915112f5', 1824 | amount: { 1825 | value: '1854.99', 1826 | currency: 'EUR' 1827 | }, 1828 | date: '2018-09-10T02:11:29.184Z', 1829 | merchant: 'KAGE', 1830 | receipts: [], 1831 | comment: '', 1832 | category: '', 1833 | user: { 1834 | first: 'Vickie', 1835 | last: 'Lee', 1836 | email: 'vickie.lee@pleo.io' 1837 | } 1838 | }, 1839 | { 1840 | id: '5b9960645da95aa5750abaf7', 1841 | amount: { 1842 | value: '906.11', 1843 | currency: 'DKK' 1844 | }, 1845 | date: '2016-09-14T04:06:29.666Z', 1846 | merchant: 'UNEEQ', 1847 | receipts: [], 1848 | comment: '', 1849 | category: '', 1850 | user: { 1851 | first: 'Bianca', 1852 | last: 'Wallace', 1853 | email: 'bianca.wallace@pleo.io' 1854 | } 1855 | }, 1856 | { 1857 | id: '5b9960641b2e4f27938fe595', 1858 | amount: { 1859 | value: '2722.97', 1860 | currency: 'GBP' 1861 | }, 1862 | date: '2016-06-09T13:03:01.608Z', 1863 | merchant: 'CEMENTION', 1864 | receipts: [], 1865 | comment: '', 1866 | category: '', 1867 | user: { 1868 | first: 'Celia', 1869 | last: 'Frazier', 1870 | email: 'celia.frazier@pleo.io' 1871 | } 1872 | }, 1873 | { 1874 | id: '5b996064edfe99f47c2f7d60', 1875 | amount: { 1876 | value: '1871.12', 1877 | currency: 'EUR' 1878 | }, 1879 | date: '2014-06-12T15:23:51.220Z', 1880 | merchant: 'VITRICOMP', 1881 | receipts: [], 1882 | comment: '', 1883 | category: '', 1884 | user: { 1885 | first: 'Waters', 1886 | last: 'Vinson', 1887 | email: 'waters.vinson@pleo.io' 1888 | } 1889 | }, 1890 | { 1891 | id: '5b996064fcfbecff60f617ba', 1892 | amount: { 1893 | value: '11.51', 1894 | currency: 'DKK' 1895 | }, 1896 | date: '2014-09-30T07:13:27.603Z', 1897 | merchant: 'KLUGGER', 1898 | receipts: [], 1899 | comment: '', 1900 | category: '', 1901 | user: { 1902 | first: 'Kathy', 1903 | last: 'Bush', 1904 | email: 'kathy.bush@pleo.io' 1905 | } 1906 | }, 1907 | { 1908 | id: '5b996064ba218563e3ed5935', 1909 | amount: { 1910 | value: '3383.76', 1911 | currency: 'DKK' 1912 | }, 1913 | date: '2018-03-23T08:31:02.663Z', 1914 | merchant: 'ELEMANTRA', 1915 | receipts: [], 1916 | comment: '', 1917 | category: '', 1918 | user: { 1919 | first: 'Frances', 1920 | last: 'Atkins', 1921 | email: 'frances.atkins@pleo.io' 1922 | } 1923 | }, 1924 | { 1925 | id: '5b996064cadeac55736ad99a', 1926 | amount: { 1927 | value: '1637', 1928 | currency: 'DKK' 1929 | }, 1930 | date: '2018-01-16T22:15:16.209Z', 1931 | merchant: 'BRAINCLIP', 1932 | receipts: [], 1933 | comment: '', 1934 | category: '', 1935 | user: { 1936 | first: 'Constance', 1937 | last: 'Hahn', 1938 | email: 'constance.hahn@pleo.io' 1939 | } 1940 | }, 1941 | { 1942 | id: '5b9960641ddc78482ef2fdd9', 1943 | amount: { 1944 | value: '2760.27', 1945 | currency: 'DKK' 1946 | }, 1947 | date: '2016-10-07T06:34:04.760Z', 1948 | merchant: 'XLEEN', 1949 | receipts: [], 1950 | comment: '', 1951 | category: '', 1952 | user: { 1953 | first: 'Annette', 1954 | last: 'Mckay', 1955 | email: 'annette.mckay@pleo.io' 1956 | } 1957 | }, 1958 | { 1959 | id: '5b9960642bcea5a5428e01ad', 1960 | amount: { 1961 | value: '3476.9', 1962 | currency: 'DKK' 1963 | }, 1964 | date: '2017-10-27T19:42:53.734Z', 1965 | merchant: 'EXOSTREAM', 1966 | receipts: [], 1967 | comment: '', 1968 | category: '', 1969 | user: { 1970 | first: 'Tamera', 1971 | last: 'Perkins', 1972 | email: 'tamera.perkins@pleo.io' 1973 | } 1974 | }, 1975 | { 1976 | id: '5b99606406570f80d5e81473', 1977 | amount: { 1978 | value: '486.33', 1979 | currency: 'GBP' 1980 | }, 1981 | date: '2015-02-28T06:03:13.494Z', 1982 | merchant: 'PREMIANT', 1983 | receipts: [], 1984 | comment: '', 1985 | category: '', 1986 | user: { 1987 | first: 'Jewell', 1988 | last: 'Delacruz', 1989 | email: 'jewell.delacruz@pleo.io' 1990 | } 1991 | }, 1992 | { 1993 | id: '5b9960644d90766330ed031a', 1994 | amount: { 1995 | value: '3710.59', 1996 | currency: 'DKK' 1997 | }, 1998 | date: '2014-06-24T10:32:05.799Z', 1999 | merchant: 'GRAINSPOT', 2000 | receipts: [], 2001 | comment: '', 2002 | category: '', 2003 | user: { 2004 | first: 'Burris', 2005 | last: 'Reyes', 2006 | email: 'burris.reyes@pleo.io' 2007 | } 2008 | }, 2009 | { 2010 | id: '5b99606494b58c2188350cc5', 2011 | amount: { 2012 | value: '1419.27', 2013 | currency: 'EUR' 2014 | }, 2015 | date: '2017-01-25T20:31:03.315Z', 2016 | merchant: 'NITRACYR', 2017 | receipts: [], 2018 | comment: '', 2019 | category: '', 2020 | user: { 2021 | first: 'Lynette', 2022 | last: 'Bean', 2023 | email: 'lynette.bean@pleo.io' 2024 | } 2025 | }, 2026 | { 2027 | id: '5b996064f088a7ce968c82a0', 2028 | amount: { 2029 | value: '2721.37', 2030 | currency: 'GBP' 2031 | }, 2032 | date: '2014-12-01T07:26:56.320Z', 2033 | merchant: 'ZILLA', 2034 | receipts: [], 2035 | comment: '', 2036 | category: '', 2037 | user: { 2038 | first: 'Ava', 2039 | last: 'Chandler', 2040 | email: 'ava.chandler@pleo.io' 2041 | } 2042 | }, 2043 | { 2044 | id: '5b9960640ff5db6027b45da4', 2045 | amount: { 2046 | value: '1366.77', 2047 | currency: 'DKK' 2048 | }, 2049 | date: '2015-03-20T16:40:40.322Z', 2050 | merchant: 'OCEANICA', 2051 | receipts: [], 2052 | comment: '', 2053 | category: '', 2054 | user: { 2055 | first: 'Hopkins', 2056 | last: 'Best', 2057 | email: 'hopkins.best@pleo.io' 2058 | } 2059 | }, 2060 | { 2061 | id: '5b996064fa987dbc5f61baae', 2062 | amount: { 2063 | value: '1903.15', 2064 | currency: 'DKK' 2065 | }, 2066 | date: '2016-07-13T22:57:00.908Z', 2067 | merchant: 'ZANYMAX', 2068 | receipts: [], 2069 | comment: '', 2070 | category: '', 2071 | user: { 2072 | first: 'Harrison', 2073 | last: 'Mejia', 2074 | email: 'harrison.mejia@pleo.io' 2075 | } 2076 | }, 2077 | { 2078 | id: '5b996064916599604568aab3', 2079 | amount: { 2080 | value: '1522.25', 2081 | currency: 'DKK' 2082 | }, 2083 | date: '2014-12-15T04:21:05.935Z', 2084 | merchant: 'APPLIDECK', 2085 | receipts: [], 2086 | comment: '', 2087 | category: '', 2088 | user: { 2089 | first: 'Bennett', 2090 | last: 'Mercer', 2091 | email: 'bennett.mercer@pleo.io' 2092 | } 2093 | }, 2094 | { 2095 | id: '5b9960642afed51d57d23b3d', 2096 | amount: { 2097 | value: '3414.94', 2098 | currency: 'EUR' 2099 | }, 2100 | date: '2016-04-11T17:06:55.219Z', 2101 | merchant: 'ESCENTA', 2102 | receipts: [], 2103 | comment: '', 2104 | category: '', 2105 | user: { 2106 | first: 'Shannon', 2107 | last: 'Bradford', 2108 | email: 'shannon.bradford@pleo.io' 2109 | } 2110 | }, 2111 | { 2112 | id: '5b996064c21075e01e9dd5f9', 2113 | amount: { 2114 | value: '3533.92', 2115 | currency: 'GBP' 2116 | }, 2117 | date: '2016-03-17T08:40:04.731Z', 2118 | merchant: 'ENTALITY', 2119 | receipts: [], 2120 | comment: '', 2121 | category: '', 2122 | user: { 2123 | first: 'Peggy', 2124 | last: 'Sawyer', 2125 | email: 'peggy.sawyer@pleo.io' 2126 | } 2127 | }, 2128 | { 2129 | id: '5b99606441d972184bc67343', 2130 | amount: { 2131 | value: '3731.33', 2132 | currency: 'EUR' 2133 | }, 2134 | date: '2016-10-02T04:25:02.732Z', 2135 | merchant: 'QUIZMO', 2136 | receipts: [], 2137 | comment: '', 2138 | category: '', 2139 | user: { 2140 | first: 'Florence', 2141 | last: 'Lane', 2142 | email: 'florence.lane@pleo.io' 2143 | } 2144 | }, 2145 | { 2146 | id: '5b996064aa59333e5bdd82fa', 2147 | amount: { 2148 | value: '1480.57', 2149 | currency: 'DKK' 2150 | }, 2151 | date: '2015-02-06T20:53:59.580Z', 2152 | merchant: 'ZAPHIRE', 2153 | receipts: [], 2154 | comment: '', 2155 | category: '', 2156 | user: { 2157 | first: 'Laurie', 2158 | last: 'Morton', 2159 | email: 'laurie.morton@pleo.io' 2160 | } 2161 | }, 2162 | { 2163 | id: '5b9960646ed57c7140aa0622', 2164 | amount: { 2165 | value: '856.8', 2166 | currency: 'EUR' 2167 | }, 2168 | date: '2015-06-18T04:58:54.185Z', 2169 | merchant: 'DIGIQUE', 2170 | receipts: [], 2171 | comment: '', 2172 | category: '', 2173 | user: { 2174 | first: 'Solis', 2175 | last: 'Rush', 2176 | email: 'solis.rush@pleo.io' 2177 | } 2178 | }, 2179 | { 2180 | id: '5b9960647dc5d879ec9b617b', 2181 | amount: { 2182 | value: '3142.09', 2183 | currency: 'DKK' 2184 | }, 2185 | date: '2017-11-07T13:35:37.130Z', 2186 | merchant: 'ILLUMITY', 2187 | receipts: [], 2188 | comment: '', 2189 | category: '', 2190 | user: { 2191 | first: 'Matilda', 2192 | last: 'Becker', 2193 | email: 'matilda.becker@pleo.io' 2194 | } 2195 | }, 2196 | { 2197 | id: '5b996064763c1f8a580098ad', 2198 | amount: { 2199 | value: '3113.96', 2200 | currency: 'DKK' 2201 | }, 2202 | date: '2015-01-16T02:49:30.529Z', 2203 | merchant: 'EXIAND', 2204 | receipts: [], 2205 | comment: '', 2206 | category: '', 2207 | user: { 2208 | first: 'York', 2209 | last: 'Mcfadden', 2210 | email: 'york.mcfadden@pleo.io' 2211 | } 2212 | }, 2213 | { 2214 | id: '5b9960640d134ccab9d1967e', 2215 | amount: { 2216 | value: '3603.74', 2217 | currency: 'DKK' 2218 | }, 2219 | date: '2015-11-09T17:15:05.094Z', 2220 | merchant: 'STRALOY', 2221 | receipts: [], 2222 | comment: '', 2223 | category: '', 2224 | user: { 2225 | first: 'Ray', 2226 | last: 'Townsend', 2227 | email: 'ray.townsend@pleo.io' 2228 | } 2229 | }, 2230 | { 2231 | id: '5b996064d962a6a7185f5eee', 2232 | amount: { 2233 | value: '3708.14', 2234 | currency: 'GBP' 2235 | }, 2236 | date: '2015-05-24T20:51:39.368Z', 2237 | merchant: 'CENTREXIN', 2238 | receipts: [], 2239 | comment: '', 2240 | category: '', 2241 | user: { 2242 | first: 'Miranda', 2243 | last: 'Obrien', 2244 | email: 'miranda.obrien@pleo.io' 2245 | } 2246 | }, 2247 | { 2248 | id: '5b996064c1202952ee98dc28', 2249 | amount: { 2250 | value: '3169.39', 2251 | currency: 'EUR' 2252 | }, 2253 | date: '2017-04-29T13:47:52.978Z', 2254 | merchant: 'ZEDALIS', 2255 | receipts: [], 2256 | comment: '', 2257 | category: '', 2258 | user: { 2259 | first: 'Etta', 2260 | last: 'Black', 2261 | email: 'etta.black@pleo.io' 2262 | } 2263 | }, 2264 | { 2265 | id: '5b996064934358942b0c9e5d', 2266 | amount: { 2267 | value: '2237.45', 2268 | currency: 'EUR' 2269 | }, 2270 | date: '2014-07-23T00:39:39.190Z', 2271 | merchant: 'EARWAX', 2272 | receipts: [], 2273 | comment: '', 2274 | category: '', 2275 | user: { 2276 | first: 'Elisa', 2277 | last: 'Banks', 2278 | email: 'elisa.banks@pleo.io' 2279 | } 2280 | }, 2281 | { 2282 | id: '5b996064f6b32e425d11a63e', 2283 | amount: { 2284 | value: '2245.18', 2285 | currency: 'GBP' 2286 | }, 2287 | date: '2014-12-10T12:40:14.568Z', 2288 | merchant: 'ICOLOGY', 2289 | receipts: [], 2290 | comment: '', 2291 | category: '', 2292 | user: { 2293 | first: 'Glenn', 2294 | last: 'Hobbs', 2295 | email: 'glenn.hobbs@pleo.io' 2296 | } 2297 | }, 2298 | { 2299 | id: '5b9960644c869161c9a3da24', 2300 | amount: { 2301 | value: '3509.02', 2302 | currency: 'EUR' 2303 | }, 2304 | date: '2016-06-17T18:54:09.352Z', 2305 | merchant: 'WARETEL', 2306 | receipts: [], 2307 | comment: '', 2308 | category: '', 2309 | user: { 2310 | first: 'Bobbie', 2311 | last: 'Bird', 2312 | email: 'bobbie.bird@pleo.io' 2313 | } 2314 | }, 2315 | { 2316 | id: '5b99606422ad258d23e80b33', 2317 | amount: { 2318 | value: '3092.27', 2319 | currency: 'GBP' 2320 | }, 2321 | date: '2017-10-15T23:42:24.772Z', 2322 | merchant: 'COMBOGEN', 2323 | receipts: [], 2324 | comment: '', 2325 | category: '', 2326 | user: { 2327 | first: 'Ross', 2328 | last: 'Drake', 2329 | email: 'ross.drake@pleo.io' 2330 | } 2331 | }, 2332 | { 2333 | id: '5b996064576e4156bd93bdfb', 2334 | amount: { 2335 | value: '1824.98', 2336 | currency: 'EUR' 2337 | }, 2338 | date: '2014-01-08T02:34:44.551Z', 2339 | merchant: 'ISOPLEX', 2340 | receipts: [], 2341 | comment: '', 2342 | category: '', 2343 | user: { 2344 | first: 'Ada', 2345 | last: 'Koch', 2346 | email: 'ada.koch@pleo.io' 2347 | } 2348 | }, 2349 | { 2350 | id: '5b9960644534733913d4bae6', 2351 | amount: { 2352 | value: '2954.36', 2353 | currency: 'EUR' 2354 | }, 2355 | date: '2015-09-07T00:31:28.993Z', 2356 | merchant: 'ACCUFARM', 2357 | receipts: [], 2358 | comment: '', 2359 | category: '', 2360 | user: { 2361 | first: 'Pat', 2362 | last: 'Avery', 2363 | email: 'pat.avery@pleo.io' 2364 | } 2365 | }, 2366 | { 2367 | id: '5b99606492951fe4481be7c6', 2368 | amount: { 2369 | value: '2069.83', 2370 | currency: 'EUR' 2371 | }, 2372 | date: '2018-02-22T16:25:40.540Z', 2373 | merchant: 'EMERGENT', 2374 | receipts: [], 2375 | comment: '', 2376 | category: '', 2377 | user: { 2378 | first: 'Christensen', 2379 | last: 'Trevino', 2380 | email: 'christensen.trevino@pleo.io' 2381 | } 2382 | }, 2383 | { 2384 | id: '5b996064bdf2d533e45a8cf4', 2385 | amount: { 2386 | value: '961.51', 2387 | currency: 'DKK' 2388 | }, 2389 | date: '2017-11-06T09:10:02.038Z', 2390 | merchant: 'PHARMEX', 2391 | receipts: [], 2392 | comment: '', 2393 | category: '', 2394 | user: { 2395 | first: 'Blanchard', 2396 | last: 'Miles', 2397 | email: 'blanchard.miles@pleo.io' 2398 | } 2399 | }, 2400 | { 2401 | id: '5b9960647eb83b6e4179936d', 2402 | amount: { 2403 | value: '3960.71', 2404 | currency: 'GBP' 2405 | }, 2406 | date: '2018-01-14T12:04:38.077Z', 2407 | merchant: 'HOUSEDOWN', 2408 | receipts: [], 2409 | comment: '', 2410 | category: '', 2411 | user: { 2412 | first: 'Marie', 2413 | last: 'Olsen', 2414 | email: 'marie.olsen@pleo.io' 2415 | } 2416 | }, 2417 | { 2418 | id: '5b99606424943baa66041822', 2419 | amount: { 2420 | value: '3419.77', 2421 | currency: 'EUR' 2422 | }, 2423 | date: '2015-07-09T11:12:12.614Z', 2424 | merchant: 'PATHWAYS', 2425 | receipts: [], 2426 | comment: '', 2427 | category: '', 2428 | user: { 2429 | first: 'Maura', 2430 | last: 'Hardy', 2431 | email: 'maura.hardy@pleo.io' 2432 | } 2433 | }, 2434 | { 2435 | id: '5b996064a33a35175c25fea5', 2436 | amount: { 2437 | value: '1927.1', 2438 | currency: 'DKK' 2439 | }, 2440 | date: '2017-05-26T05:28:05.020Z', 2441 | merchant: 'UPDAT', 2442 | receipts: [], 2443 | comment: '', 2444 | category: '', 2445 | user: { 2446 | first: 'Garza', 2447 | last: 'Blake', 2448 | email: 'garza.blake@pleo.io' 2449 | } 2450 | }, 2451 | { 2452 | id: '5b99606429303f3d9656790e', 2453 | amount: { 2454 | value: '1675.47', 2455 | currency: 'DKK' 2456 | }, 2457 | date: '2016-11-14T05:52:18.433Z', 2458 | merchant: 'XYQAG', 2459 | receipts: [], 2460 | comment: '', 2461 | category: '', 2462 | user: { 2463 | first: 'Huffman', 2464 | last: 'Holman', 2465 | email: 'huffman.holman@pleo.io' 2466 | } 2467 | }, 2468 | { 2469 | id: '5b99606409b6b68374e3cf34', 2470 | amount: { 2471 | value: '945.45', 2472 | currency: 'DKK' 2473 | }, 2474 | date: '2015-01-11T15:10:10.911Z', 2475 | merchant: 'NAMEGEN', 2476 | receipts: [], 2477 | comment: '', 2478 | category: '', 2479 | user: { 2480 | first: 'Inez', 2481 | last: 'Harris', 2482 | email: 'inez.harris@pleo.io' 2483 | } 2484 | }, 2485 | { 2486 | id: '5b9960646e91c4a486522c1d', 2487 | amount: { 2488 | value: '1012.11', 2489 | currency: 'EUR' 2490 | }, 2491 | date: '2015-01-09T22:15:03.570Z', 2492 | merchant: 'GOKO', 2493 | receipts: [], 2494 | comment: '', 2495 | category: '', 2496 | user: { 2497 | first: 'Burgess', 2498 | last: 'Bryant', 2499 | email: 'burgess.bryant@pleo.io' 2500 | } 2501 | }, 2502 | { 2503 | id: '5b9960644a9d0f115f6dc645', 2504 | amount: { 2505 | value: '2712.41', 2506 | currency: 'EUR' 2507 | }, 2508 | date: '2014-08-09T01:53:49.152Z', 2509 | merchant: 'STROZEN', 2510 | receipts: [], 2511 | comment: '', 2512 | category: '', 2513 | user: { 2514 | first: 'Murphy', 2515 | last: 'Peterson', 2516 | email: 'murphy.peterson@pleo.io' 2517 | } 2518 | }, 2519 | { 2520 | id: '5b996064a33cd79a446d43e1', 2521 | amount: { 2522 | value: '3990.09', 2523 | currency: 'EUR' 2524 | }, 2525 | date: '2018-01-07T22:01:55.002Z', 2526 | merchant: 'MEDMEX', 2527 | receipts: [], 2528 | comment: '', 2529 | category: '', 2530 | user: { 2531 | first: 'Carr', 2532 | last: 'Haney', 2533 | email: 'carr.haney@pleo.io' 2534 | } 2535 | }, 2536 | { 2537 | id: '5b996064e5c16e3951295d1f', 2538 | amount: { 2539 | value: '2709.65', 2540 | currency: 'EUR' 2541 | }, 2542 | date: '2018-04-16T03:26:43.651Z', 2543 | merchant: 'AQUAFIRE', 2544 | receipts: [], 2545 | comment: '', 2546 | category: '', 2547 | user: { 2548 | first: 'Robin', 2549 | last: 'Rios', 2550 | email: 'robin.rios@pleo.io' 2551 | } 2552 | }, 2553 | { 2554 | id: '5b9960640cb5f68cf0ad5a15', 2555 | amount: { 2556 | value: '2332.17', 2557 | currency: 'EUR' 2558 | }, 2559 | date: '2015-12-13T16:45:32.219Z', 2560 | merchant: 'MARTGO', 2561 | receipts: [], 2562 | comment: '', 2563 | category: '', 2564 | user: { 2565 | first: 'Kelli', 2566 | last: 'Kerr', 2567 | email: 'kelli.kerr@pleo.io' 2568 | } 2569 | }, 2570 | { 2571 | id: '5b99606455fd0dc1e8ddffff', 2572 | amount: { 2573 | value: '2013.21', 2574 | currency: 'DKK' 2575 | }, 2576 | date: '2017-08-09T23:47:08.120Z', 2577 | merchant: 'HANDSHAKE', 2578 | receipts: [], 2579 | comment: '', 2580 | category: '', 2581 | user: { 2582 | first: 'Camacho', 2583 | last: 'Delaney', 2584 | email: 'camacho.delaney@pleo.io' 2585 | } 2586 | }, 2587 | { 2588 | id: '5b99606473fb83d3a01730e8', 2589 | amount: { 2590 | value: '2634.8', 2591 | currency: 'EUR' 2592 | }, 2593 | date: '2014-01-28T01:05:51.811Z', 2594 | merchant: 'UNISURE', 2595 | receipts: [], 2596 | comment: '', 2597 | category: '', 2598 | user: { 2599 | first: 'Coffey', 2600 | last: 'Garcia', 2601 | email: 'coffey.garcia@pleo.io' 2602 | } 2603 | }, 2604 | { 2605 | id: '5b996064ec1922a0ef41c447', 2606 | amount: { 2607 | value: '1674.92', 2608 | currency: 'DKK' 2609 | }, 2610 | date: '2017-07-26T05:01:14.427Z', 2611 | merchant: 'KANGLE', 2612 | receipts: [], 2613 | comment: '', 2614 | category: '', 2615 | user: { 2616 | first: 'Avila', 2617 | last: 'Skinner', 2618 | email: 'avila.skinner@pleo.io' 2619 | } 2620 | }, 2621 | { 2622 | id: '5b9960645f633cb0f4661641', 2623 | amount: { 2624 | value: '3157.33', 2625 | currency: 'EUR' 2626 | }, 2627 | date: '2015-08-24T21:39:19.507Z', 2628 | merchant: 'VELITY', 2629 | receipts: [], 2630 | comment: '', 2631 | category: '', 2632 | user: { 2633 | first: 'Martha', 2634 | last: 'Mills', 2635 | email: 'martha.mills@pleo.io' 2636 | } 2637 | }, 2638 | { 2639 | id: '5b9960640a0189fda5f689c0', 2640 | amount: { 2641 | value: '3965.19', 2642 | currency: 'GBP' 2643 | }, 2644 | date: '2018-03-22T15:33:09.360Z', 2645 | merchant: 'CIPROMOX', 2646 | receipts: [], 2647 | comment: '', 2648 | category: '', 2649 | user: { 2650 | first: 'Mona', 2651 | last: 'Freeman', 2652 | email: 'mona.freeman@pleo.io' 2653 | } 2654 | }, 2655 | { 2656 | id: '5b996064513e849db6e4b47e', 2657 | amount: { 2658 | value: '1691.54', 2659 | currency: 'DKK' 2660 | }, 2661 | date: '2016-08-09T08:58:53.634Z', 2662 | merchant: 'INQUALA', 2663 | receipts: [], 2664 | comment: '', 2665 | category: '', 2666 | user: { 2667 | first: 'Mamie', 2668 | last: 'Christensen', 2669 | email: 'mamie.christensen@pleo.io' 2670 | } 2671 | }, 2672 | { 2673 | id: '5b9960645ee96a3f04e30c31', 2674 | amount: { 2675 | value: '128.5', 2676 | currency: 'GBP' 2677 | }, 2678 | date: '2017-06-01T01:22:24.225Z', 2679 | merchant: 'TERRAGEN', 2680 | receipts: [], 2681 | comment: '', 2682 | category: '', 2683 | user: { 2684 | first: 'Rebekah', 2685 | last: 'Cross', 2686 | email: 'rebekah.cross@pleo.io' 2687 | } 2688 | }, 2689 | { 2690 | id: '5b99606474ab17b7820b3922', 2691 | amount: { 2692 | value: '3222.88', 2693 | currency: 'GBP' 2694 | }, 2695 | date: '2018-08-13T07:11:01.680Z', 2696 | merchant: 'ASSITIA', 2697 | receipts: [], 2698 | comment: '', 2699 | category: '', 2700 | user: { 2701 | first: 'Lowe', 2702 | last: 'Michael', 2703 | email: 'lowe.michael@pleo.io' 2704 | } 2705 | }, 2706 | { 2707 | id: '5b99606419cc4b0bb52d7665', 2708 | amount: { 2709 | value: '1495.94', 2710 | currency: 'GBP' 2711 | }, 2712 | date: '2018-06-17T06:20:18.194Z', 2713 | merchant: 'SURELOGIC', 2714 | receipts: [], 2715 | comment: '', 2716 | category: '', 2717 | user: { 2718 | first: 'Walsh', 2719 | last: 'Hudson', 2720 | email: 'walsh.hudson@pleo.io' 2721 | } 2722 | }, 2723 | { 2724 | id: '5b9960643a6965eb05e0b1f9', 2725 | amount: { 2726 | value: '2099.99', 2727 | currency: 'DKK' 2728 | }, 2729 | date: '2014-01-19T07:15:54.389Z', 2730 | merchant: 'BUZZOPIA', 2731 | receipts: [], 2732 | comment: '', 2733 | category: '', 2734 | user: { 2735 | first: 'Richmond', 2736 | last: 'Sellers', 2737 | email: 'richmond.sellers@pleo.io' 2738 | } 2739 | }, 2740 | { 2741 | id: '5b996064dc44df67c291556f', 2742 | amount: { 2743 | value: '3585.22', 2744 | currency: 'DKK' 2745 | }, 2746 | date: '2014-11-06T17:43:59.554Z', 2747 | merchant: 'INTERGEEK', 2748 | receipts: [], 2749 | comment: '', 2750 | category: '', 2751 | user: { 2752 | first: 'West', 2753 | last: 'Knowles', 2754 | email: 'west.knowles@pleo.io' 2755 | } 2756 | }, 2757 | { 2758 | id: '5b9960641332c1c2d10f3a25', 2759 | amount: { 2760 | value: '1242.09', 2761 | currency: 'DKK' 2762 | }, 2763 | date: '2015-02-25T16:33:29.135Z', 2764 | merchant: 'ZYPLE', 2765 | receipts: [], 2766 | comment: '', 2767 | category: '', 2768 | user: { 2769 | first: 'Mable', 2770 | last: 'White', 2771 | email: 'mable.white@pleo.io' 2772 | } 2773 | }, 2774 | { 2775 | id: '5b996064394da2b1c7c4a872', 2776 | amount: { 2777 | value: '1035.92', 2778 | currency: 'EUR' 2779 | }, 2780 | date: '2015-08-06T22:54:04.486Z', 2781 | merchant: 'QUIZKA', 2782 | receipts: [], 2783 | comment: '', 2784 | category: '', 2785 | user: { 2786 | first: 'Georgette', 2787 | last: 'Marquez', 2788 | email: 'georgette.marquez@pleo.io' 2789 | } 2790 | }, 2791 | { 2792 | id: '5b996064b836e2362d231ddd', 2793 | amount: { 2794 | value: '1128.16', 2795 | currency: 'EUR' 2796 | }, 2797 | date: '2014-04-11T03:18:47.602Z', 2798 | merchant: 'MANTRIX', 2799 | receipts: [], 2800 | comment: '', 2801 | category: '', 2802 | user: { 2803 | first: 'Anita', 2804 | last: 'Yang', 2805 | email: 'anita.yang@pleo.io' 2806 | } 2807 | }, 2808 | { 2809 | id: '5b9960648226c9e124eaeec7', 2810 | amount: { 2811 | value: '3957.97', 2812 | currency: 'GBP' 2813 | }, 2814 | date: '2015-05-09T05:01:08.179Z', 2815 | merchant: 'SCENTY', 2816 | receipts: [], 2817 | comment: '', 2818 | category: '', 2819 | user: { 2820 | first: 'Sanchez', 2821 | last: 'Downs', 2822 | email: 'sanchez.downs@pleo.io' 2823 | } 2824 | }, 2825 | { 2826 | id: '5b99606419de4bdda4d77372', 2827 | amount: { 2828 | value: '3293.15', 2829 | currency: 'DKK' 2830 | }, 2831 | date: '2016-10-14T04:25:28.117Z', 2832 | merchant: 'ENOMEN', 2833 | receipts: [], 2834 | comment: '', 2835 | category: '', 2836 | user: { 2837 | first: 'Palmer', 2838 | last: 'Howard', 2839 | email: 'palmer.howard@pleo.io' 2840 | } 2841 | }, 2842 | { 2843 | id: '5b9960643a396ae62ae89b02', 2844 | amount: { 2845 | value: '1247.4', 2846 | currency: 'DKK' 2847 | }, 2848 | date: '2015-12-02T14:47:19.618Z', 2849 | merchant: 'MAGNAFONE', 2850 | receipts: [], 2851 | comment: '', 2852 | category: '', 2853 | user: { 2854 | first: 'Mccormick', 2855 | last: 'Barber', 2856 | email: 'mccormick.barber@pleo.io' 2857 | } 2858 | }, 2859 | { 2860 | id: '5b996064c78d7194a2e7239e', 2861 | amount: { 2862 | value: '3620.98', 2863 | currency: 'GBP' 2864 | }, 2865 | date: '2018-05-05T14:00:00.439Z', 2866 | merchant: 'XINWARE', 2867 | receipts: [], 2868 | comment: '', 2869 | category: '', 2870 | user: { 2871 | first: 'Flynn', 2872 | last: 'Giles', 2873 | email: 'flynn.giles@pleo.io' 2874 | } 2875 | } 2876 | ] 2877 | -------------------------------------------------------------------------------- /api/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "api", 3 | "version": "0.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@types/body-parser": { 8 | "version": "1.17.0", 9 | "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.17.0.tgz", 10 | "integrity": "sha512-a2+YeUjPkztKJu5aIF2yArYFQQp8d51wZ7DavSHjFuY1mqVgidGyzEQ41JIVNy82fXj8yPgy2vJmfIywgESW6w==", 11 | "dev": true, 12 | "requires": { 13 | "@types/connect": "*", 14 | "@types/node": "*" 15 | } 16 | }, 17 | "@types/connect": { 18 | "version": "3.4.32", 19 | "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.32.tgz", 20 | "integrity": "sha512-4r8qa0quOvh7lGD0pre62CAb1oni1OO6ecJLGCezTmhQ8Fz50Arx9RUszryR8KlgK6avuSXvviL6yWyViQABOg==", 21 | "dev": true, 22 | "requires": { 23 | "@types/node": "*" 24 | } 25 | }, 26 | "@types/express": { 27 | "version": "4.16.1", 28 | "resolved": "https://registry.npmjs.org/@types/express/-/express-4.16.1.tgz", 29 | "integrity": "sha512-V0clmJow23WeyblmACoxbHBu2JKlE5TiIme6Lem14FnPW9gsttyHtk6wq7njcdIWH1njAaFgR8gW09lgY98gQg==", 30 | "dev": true, 31 | "requires": { 32 | "@types/body-parser": "*", 33 | "@types/express-serve-static-core": "*", 34 | "@types/serve-static": "*" 35 | } 36 | }, 37 | "@types/express-fileupload": { 38 | "version": "0.4.0", 39 | "resolved": "https://registry.npmjs.org/@types/express-fileupload/-/express-fileupload-0.4.0.tgz", 40 | "integrity": "sha512-prCi1fzjr8KZQlfttWhr2U7Mia0kb7kCv8YHj78J0Ugpo9o8+k3AS2Kz14DRZ+HbMUaFqJ5BemzakX9P7iLetw==", 41 | "dev": true, 42 | "requires": { 43 | "@types/express": "*" 44 | } 45 | }, 46 | "@types/express-serve-static-core": { 47 | "version": "4.16.1", 48 | "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.16.1.tgz", 49 | "integrity": "sha512-QgbIMRU1EVRry5cIu1ORCQP4flSYqLM1lS5LYyGWfKnFT3E58f0gKto7BR13clBFVrVZ0G0rbLZ1hUpSkgQQOA==", 50 | "dev": true, 51 | "requires": { 52 | "@types/node": "*", 53 | "@types/range-parser": "*" 54 | } 55 | }, 56 | "@types/http-errors": { 57 | "version": "1.6.1", 58 | "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-1.6.1.tgz", 59 | "integrity": "sha512-s+RHKSGc3r0m3YEE2UXomJYrpQaY9cDmNDLU2XvG1/LAZsQ7y8emYkTLfcw/ByDtcsTyRQKwr76Bj4PkN2hfWg==", 60 | "dev": true 61 | }, 62 | "@types/mime": { 63 | "version": "2.0.1", 64 | "resolved": "https://registry.npmjs.org/@types/mime/-/mime-2.0.1.tgz", 65 | "integrity": "sha512-FwI9gX75FgVBJ7ywgnq/P7tw+/o1GUbtP0KzbtusLigAOgIgNISRK0ZPl4qertvXSIE8YbsVJueQ90cDt9YYyw==", 66 | "dev": true 67 | }, 68 | "@types/node": { 69 | "version": "11.11.3", 70 | "resolved": "https://registry.npmjs.org/@types/node/-/node-11.11.3.tgz", 71 | "integrity": "sha512-wp6IOGu1lxsfnrD+5mX6qwSwWuqsdkKKxTN4aQc4wByHAKZJf9/D4KXPQ1POUjEbnCP5LMggB0OEFNY9OTsMqg==", 72 | "dev": true 73 | }, 74 | "@types/range-parser": { 75 | "version": "1.2.3", 76 | "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.3.tgz", 77 | "integrity": "sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA==", 78 | "dev": true 79 | }, 80 | "@types/serve-static": { 81 | "version": "1.13.2", 82 | "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.2.tgz", 83 | "integrity": "sha512-/BZ4QRLpH/bNYgZgwhKEh+5AsboDBcUdlBYgzoLX0fpj3Y2gp6EApyOlM3bK53wQS/OE1SrdSYBAbux2D1528Q==", 84 | "dev": true, 85 | "requires": { 86 | "@types/express-serve-static-core": "*", 87 | "@types/mime": "*" 88 | } 89 | }, 90 | "accepts": { 91 | "version": "1.3.5", 92 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", 93 | "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", 94 | "requires": { 95 | "mime-types": "~2.1.18", 96 | "negotiator": "0.6.1" 97 | } 98 | }, 99 | "array-flatten": { 100 | "version": "1.1.1", 101 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 102 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 103 | }, 104 | "arrify": { 105 | "version": "1.0.1", 106 | "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", 107 | "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", 108 | "dev": true 109 | }, 110 | "basic-auth": { 111 | "version": "2.0.0", 112 | "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.0.tgz", 113 | "integrity": "sha1-AV2z81PgLlY3d1X5YnQuiYHnu7o=", 114 | "requires": { 115 | "safe-buffer": "5.1.1" 116 | } 117 | }, 118 | "body-parser": { 119 | "version": "1.18.3", 120 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", 121 | "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", 122 | "requires": { 123 | "bytes": "3.0.0", 124 | "content-type": "~1.0.4", 125 | "debug": "2.6.9", 126 | "depd": "~1.1.2", 127 | "http-errors": "~1.6.3", 128 | "iconv-lite": "0.4.23", 129 | "on-finished": "~2.3.0", 130 | "qs": "6.5.2", 131 | "raw-body": "2.3.3", 132 | "type-is": "~1.6.16" 133 | } 134 | }, 135 | "buffer-from": { 136 | "version": "1.1.1", 137 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", 138 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", 139 | "dev": true 140 | }, 141 | "busboy": { 142 | "version": "0.2.14", 143 | "resolved": "https://registry.npmjs.org/busboy/-/busboy-0.2.14.tgz", 144 | "integrity": "sha1-bCpiLvz0fFe7vh4qnDetNseSVFM=", 145 | "requires": { 146 | "dicer": "0.2.5", 147 | "readable-stream": "1.1.x" 148 | } 149 | }, 150 | "bytes": { 151 | "version": "3.0.0", 152 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", 153 | "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" 154 | }, 155 | "charenc": { 156 | "version": "0.0.2", 157 | "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", 158 | "integrity": "sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc=" 159 | }, 160 | "content-disposition": { 161 | "version": "0.5.2", 162 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", 163 | "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" 164 | }, 165 | "content-type": { 166 | "version": "1.0.4", 167 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 168 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" 169 | }, 170 | "cookie": { 171 | "version": "0.3.1", 172 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", 173 | "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" 174 | }, 175 | "cookie-signature": { 176 | "version": "1.0.6", 177 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 178 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 179 | }, 180 | "core-util-is": { 181 | "version": "1.0.2", 182 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 183 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 184 | }, 185 | "crypt": { 186 | "version": "0.0.2", 187 | "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", 188 | "integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs=" 189 | }, 190 | "debug": { 191 | "version": "2.6.9", 192 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 193 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 194 | "requires": { 195 | "ms": "2.0.0" 196 | } 197 | }, 198 | "depd": { 199 | "version": "1.1.2", 200 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 201 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" 202 | }, 203 | "destroy": { 204 | "version": "1.0.4", 205 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 206 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 207 | }, 208 | "dicer": { 209 | "version": "0.2.5", 210 | "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.2.5.tgz", 211 | "integrity": "sha1-WZbAhrszIYyBLAkL3cCc0S+stw8=", 212 | "requires": { 213 | "readable-stream": "1.1.x", 214 | "streamsearch": "0.1.2" 215 | } 216 | }, 217 | "diff": { 218 | "version": "3.5.0", 219 | "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", 220 | "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", 221 | "dev": true 222 | }, 223 | "ee-first": { 224 | "version": "1.1.1", 225 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 226 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 227 | }, 228 | "encodeurl": { 229 | "version": "1.0.2", 230 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 231 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" 232 | }, 233 | "escape-html": { 234 | "version": "1.0.3", 235 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 236 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 237 | }, 238 | "etag": { 239 | "version": "1.8.1", 240 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 241 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" 242 | }, 243 | "express": { 244 | "version": "4.16.4", 245 | "resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz", 246 | "integrity": "sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==", 247 | "requires": { 248 | "accepts": "~1.3.5", 249 | "array-flatten": "1.1.1", 250 | "body-parser": "1.18.3", 251 | "content-disposition": "0.5.2", 252 | "content-type": "~1.0.4", 253 | "cookie": "0.3.1", 254 | "cookie-signature": "1.0.6", 255 | "debug": "2.6.9", 256 | "depd": "~1.1.2", 257 | "encodeurl": "~1.0.2", 258 | "escape-html": "~1.0.3", 259 | "etag": "~1.8.1", 260 | "finalhandler": "1.1.1", 261 | "fresh": "0.5.2", 262 | "merge-descriptors": "1.0.1", 263 | "methods": "~1.1.2", 264 | "on-finished": "~2.3.0", 265 | "parseurl": "~1.3.2", 266 | "path-to-regexp": "0.1.7", 267 | "proxy-addr": "~2.0.4", 268 | "qs": "6.5.2", 269 | "range-parser": "~1.2.0", 270 | "safe-buffer": "5.1.2", 271 | "send": "0.16.2", 272 | "serve-static": "1.13.2", 273 | "setprototypeof": "1.1.0", 274 | "statuses": "~1.4.0", 275 | "type-is": "~1.6.16", 276 | "utils-merge": "1.0.1", 277 | "vary": "~1.1.2" 278 | }, 279 | "dependencies": { 280 | "safe-buffer": { 281 | "version": "5.1.2", 282 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 283 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 284 | } 285 | } 286 | }, 287 | "express-fileupload": { 288 | "version": "0.4.0", 289 | "resolved": "https://registry.npmjs.org/express-fileupload/-/express-fileupload-0.4.0.tgz", 290 | "integrity": "sha512-jPv3aCdTIdQrGAUXQ1e1hU0Vnl+0jE9IbzEsI7VRIevQybrUrIMUgvwNwBThnsetandW8+9ICgflAkhKwLUuLw==", 291 | "requires": { 292 | "busboy": "^0.2.14", 293 | "fs-extra": "^4.0.1", 294 | "md5": "^2.2.1", 295 | "streamifier": "^0.1.1" 296 | } 297 | }, 298 | "finalhandler": { 299 | "version": "1.1.1", 300 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", 301 | "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", 302 | "requires": { 303 | "debug": "2.6.9", 304 | "encodeurl": "~1.0.2", 305 | "escape-html": "~1.0.3", 306 | "on-finished": "~2.3.0", 307 | "parseurl": "~1.3.2", 308 | "statuses": "~1.4.0", 309 | "unpipe": "~1.0.0" 310 | } 311 | }, 312 | "forwarded": { 313 | "version": "0.1.2", 314 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", 315 | "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" 316 | }, 317 | "fresh": { 318 | "version": "0.5.2", 319 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 320 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" 321 | }, 322 | "fs-extra": { 323 | "version": "4.0.3", 324 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", 325 | "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", 326 | "requires": { 327 | "graceful-fs": "^4.1.2", 328 | "jsonfile": "^4.0.0", 329 | "universalify": "^0.1.0" 330 | } 331 | }, 332 | "graceful-fs": { 333 | "version": "4.1.11", 334 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", 335 | "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" 336 | }, 337 | "http-errors": { 338 | "version": "1.6.3", 339 | "resolved": "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", 340 | "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", 341 | "requires": { 342 | "depd": "~1.1.2", 343 | "inherits": "2.0.3", 344 | "setprototypeof": "1.1.0", 345 | "statuses": ">= 1.4.0 < 2" 346 | } 347 | }, 348 | "iconv-lite": { 349 | "version": "0.4.23", 350 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", 351 | "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", 352 | "requires": { 353 | "safer-buffer": ">= 2.1.2 < 3" 354 | } 355 | }, 356 | "inherits": { 357 | "version": "2.0.3", 358 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 359 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 360 | }, 361 | "ipaddr.js": { 362 | "version": "1.8.0", 363 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz", 364 | "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=" 365 | }, 366 | "is-buffer": { 367 | "version": "1.1.6", 368 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", 369 | "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" 370 | }, 371 | "isarray": { 372 | "version": "0.0.1", 373 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", 374 | "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" 375 | }, 376 | "jsonfile": { 377 | "version": "4.0.0", 378 | "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", 379 | "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", 380 | "requires": { 381 | "graceful-fs": "^4.1.6" 382 | } 383 | }, 384 | "make-error": { 385 | "version": "1.3.5", 386 | "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz", 387 | "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==", 388 | "dev": true 389 | }, 390 | "md5": { 391 | "version": "2.2.1", 392 | "resolved": "https://registry.npmjs.org/md5/-/md5-2.2.1.tgz", 393 | "integrity": "sha1-U6s41f48iJG6RlMp6iP6wFQBJvk=", 394 | "requires": { 395 | "charenc": "~0.0.1", 396 | "crypt": "~0.0.1", 397 | "is-buffer": "~1.1.1" 398 | } 399 | }, 400 | "media-typer": { 401 | "version": "0.3.0", 402 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 403 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" 404 | }, 405 | "merge-descriptors": { 406 | "version": "1.0.1", 407 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 408 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" 409 | }, 410 | "methods": { 411 | "version": "1.1.2", 412 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 413 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" 414 | }, 415 | "mime": { 416 | "version": "1.4.1", 417 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", 418 | "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" 419 | }, 420 | "mime-db": { 421 | "version": "1.38.0", 422 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.38.0.tgz", 423 | "integrity": "sha512-bqVioMFFzc2awcdJZIzR3HjZFX20QhilVS7hytkKrv7xFAn8bM1gzc/FOX2awLISvWe0PV8ptFKcon+wZ5qYkg==" 424 | }, 425 | "mime-types": { 426 | "version": "2.1.22", 427 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.22.tgz", 428 | "integrity": "sha512-aGl6TZGnhm/li6F7yx82bJiBZwgiEa4Hf6CNr8YO+r5UHr53tSTYZb102zyU50DOWWKeOv0uQLRL0/9EiKWCog==", 429 | "requires": { 430 | "mime-db": "~1.38.0" 431 | } 432 | }, 433 | "minimist": { 434 | "version": "1.2.0", 435 | "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", 436 | "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", 437 | "dev": true 438 | }, 439 | "mkdirp": { 440 | "version": "0.5.1", 441 | "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 442 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 443 | "dev": true, 444 | "requires": { 445 | "minimist": "0.0.8" 446 | }, 447 | "dependencies": { 448 | "minimist": { 449 | "version": "0.0.8", 450 | "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 451 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", 452 | "dev": true 453 | } 454 | } 455 | }, 456 | "morgan": { 457 | "version": "1.9.1", 458 | "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.9.1.tgz", 459 | "integrity": "sha512-HQStPIV4y3afTiCYVxirakhlCfGkI161c76kKFca7Fk1JusM//Qeo1ej2XaMniiNeaZklMVrh3vTtIzpzwbpmA==", 460 | "requires": { 461 | "basic-auth": "~2.0.0", 462 | "debug": "2.6.9", 463 | "depd": "~1.1.2", 464 | "on-finished": "~2.3.0", 465 | "on-headers": "~1.0.1" 466 | } 467 | }, 468 | "ms": { 469 | "version": "2.0.0", 470 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 471 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 472 | }, 473 | "negotiator": { 474 | "version": "0.6.1", 475 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", 476 | "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" 477 | }, 478 | "on-finished": { 479 | "version": "2.3.0", 480 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 481 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 482 | "requires": { 483 | "ee-first": "1.1.1" 484 | } 485 | }, 486 | "on-headers": { 487 | "version": "1.0.1", 488 | "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz", 489 | "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=" 490 | }, 491 | "parseurl": { 492 | "version": "1.3.2", 493 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", 494 | "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" 495 | }, 496 | "path-to-regexp": { 497 | "version": "0.1.7", 498 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 499 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 500 | }, 501 | "prettier": { 502 | "version": "1.14.2", 503 | "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.14.2.tgz", 504 | "integrity": "sha512-McHPg0n1pIke+A/4VcaS2en+pTNjy4xF+Uuq86u/5dyDO59/TtFZtQ708QIRkEZ3qwKz3GVkVa6mpxK/CpB8Rg==", 505 | "dev": true 506 | }, 507 | "proxy-addr": { 508 | "version": "2.0.4", 509 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz", 510 | "integrity": "sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA==", 511 | "requires": { 512 | "forwarded": "~0.1.2", 513 | "ipaddr.js": "1.8.0" 514 | } 515 | }, 516 | "qs": { 517 | "version": "6.5.2", 518 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", 519 | "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" 520 | }, 521 | "range-parser": { 522 | "version": "1.2.0", 523 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", 524 | "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" 525 | }, 526 | "raw-body": { 527 | "version": "2.3.3", 528 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", 529 | "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", 530 | "requires": { 531 | "bytes": "3.0.0", 532 | "http-errors": "1.6.3", 533 | "iconv-lite": "0.4.23", 534 | "unpipe": "1.0.0" 535 | } 536 | }, 537 | "readable-stream": { 538 | "version": "1.1.14", 539 | "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", 540 | "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", 541 | "requires": { 542 | "core-util-is": "~1.0.0", 543 | "inherits": "~2.0.1", 544 | "isarray": "0.0.1", 545 | "string_decoder": "~0.10.x" 546 | } 547 | }, 548 | "safe-buffer": { 549 | "version": "5.1.1", 550 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", 551 | "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" 552 | }, 553 | "safer-buffer": { 554 | "version": "2.1.2", 555 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 556 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 557 | }, 558 | "send": { 559 | "version": "0.16.2", 560 | "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", 561 | "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", 562 | "requires": { 563 | "debug": "2.6.9", 564 | "depd": "~1.1.2", 565 | "destroy": "~1.0.4", 566 | "encodeurl": "~1.0.2", 567 | "escape-html": "~1.0.3", 568 | "etag": "~1.8.1", 569 | "fresh": "0.5.2", 570 | "http-errors": "~1.6.2", 571 | "mime": "1.4.1", 572 | "ms": "2.0.0", 573 | "on-finished": "~2.3.0", 574 | "range-parser": "~1.2.0", 575 | "statuses": "~1.4.0" 576 | } 577 | }, 578 | "serve-static": { 579 | "version": "1.13.2", 580 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", 581 | "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", 582 | "requires": { 583 | "encodeurl": "~1.0.2", 584 | "escape-html": "~1.0.3", 585 | "parseurl": "~1.3.2", 586 | "send": "0.16.2" 587 | } 588 | }, 589 | "setprototypeof": { 590 | "version": "1.1.0", 591 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", 592 | "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" 593 | }, 594 | "source-map": { 595 | "version": "0.6.1", 596 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 597 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 598 | "dev": true 599 | }, 600 | "source-map-support": { 601 | "version": "0.5.9", 602 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.9.tgz", 603 | "integrity": "sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA==", 604 | "dev": true, 605 | "requires": { 606 | "buffer-from": "^1.0.0", 607 | "source-map": "^0.6.0" 608 | } 609 | }, 610 | "statuses": { 611 | "version": "1.4.0", 612 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", 613 | "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" 614 | }, 615 | "streamifier": { 616 | "version": "0.1.1", 617 | "resolved": "https://registry.npmjs.org/streamifier/-/streamifier-0.1.1.tgz", 618 | "integrity": "sha1-l+mNj6TRBdYqJpHR3AfoINuN/E8=" 619 | }, 620 | "streamsearch": { 621 | "version": "0.1.2", 622 | "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz", 623 | "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=" 624 | }, 625 | "string_decoder": { 626 | "version": "0.10.31", 627 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", 628 | "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" 629 | }, 630 | "ts-node": { 631 | "version": "7.0.1", 632 | "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-7.0.1.tgz", 633 | "integrity": "sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==", 634 | "dev": true, 635 | "requires": { 636 | "arrify": "^1.0.0", 637 | "buffer-from": "^1.1.0", 638 | "diff": "^3.1.0", 639 | "make-error": "^1.1.1", 640 | "minimist": "^1.2.0", 641 | "mkdirp": "^0.5.1", 642 | "source-map-support": "^0.5.6", 643 | "yn": "^2.0.0" 644 | } 645 | }, 646 | "type-is": { 647 | "version": "1.6.16", 648 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", 649 | "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", 650 | "requires": { 651 | "media-typer": "0.3.0", 652 | "mime-types": "~2.1.18" 653 | } 654 | }, 655 | "typescript": { 656 | "version": "3.3.3333", 657 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.3.3333.tgz", 658 | "integrity": "sha512-JjSKsAfuHBE/fB2oZ8NxtRTk5iGcg6hkYXMnZ3Wc+b2RSqejEqTaem11mHASMnFilHrax3sLK0GDzcJrekZYLw==", 659 | "dev": true 660 | }, 661 | "universalify": { 662 | "version": "0.1.2", 663 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", 664 | "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" 665 | }, 666 | "unpipe": { 667 | "version": "1.0.0", 668 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 669 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" 670 | }, 671 | "utils-merge": { 672 | "version": "1.0.1", 673 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 674 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" 675 | }, 676 | "vary": { 677 | "version": "1.1.2", 678 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 679 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" 680 | }, 681 | "yn": { 682 | "version": "2.0.0", 683 | "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", 684 | "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=", 685 | "dev": true 686 | } 687 | } 688 | } 689 | -------------------------------------------------------------------------------- /api/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "api", 3 | "version": "0.0.0", 4 | "private": true, 5 | "scripts": { 6 | "start": "ts-node ./app", 7 | "prettier": "prettier --write './**/*.{ts,tsx}' --config ./.prettierconfig" 8 | }, 9 | "dependencies": { 10 | "debug": "~2.6.9", 11 | "express": "^4.16.4", 12 | "express-fileupload": "^0.4.0", 13 | "http-errors": "~1.6.2", 14 | "morgan": "~1.9.0" 15 | }, 16 | "devDependencies": { 17 | "@types/express": "^4.16.1", 18 | "@types/express-fileupload": "^0.4.0", 19 | "@types/http-errors": "^1.6.1", 20 | "prettier": "1.14.2", 21 | "ts-node": "^7.0.1", 22 | "typescript": "^3.3.3333" 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /api/receipts/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pleo-io/frontend-challenge/19c95b89e36fae2e43544720c86c8e5b63f5d726/api/receipts/.gitkeep -------------------------------------------------------------------------------- /api/routes/expenses.ts: -------------------------------------------------------------------------------- 1 | import * as express from 'express' 2 | 3 | import { expenses } from '../data/expenses' 4 | import { UploadedFile } from 'express-fileupload'; 5 | import { dirname } from 'path'; 6 | 7 | const router = express.Router() 8 | 9 | router.get('/', (req, res) => { 10 | const limit = parseInt(req.query.limit) || 25 11 | const offset = parseInt(req.query.offset) || 0 12 | 13 | res.send({ 14 | expenses: expenses 15 | .sort((a, b) => { 16 | const valA = Date.parse(a.date) 17 | const valB = Date.parse(b.date) 18 | 19 | if (valA > valB) { 20 | return -1 21 | } 22 | if (valB > valA) { 23 | return 1 24 | } 25 | return 0 26 | }) 27 | .slice(offset, offset + limit) 28 | .map((expense, index) => { 29 | return { 30 | ...expense, 31 | index: offset + index 32 | } 33 | }), 34 | total: expenses.length 35 | }) 36 | }) 37 | 38 | router.get('/:id', (req, res) => { 39 | const expense = expenses.find((expense) => expense.id === req.params.id) 40 | if (expense) { 41 | res.status(200).send(expense) 42 | } else { 43 | res.status(404).send('The id is not found') 44 | } 45 | }) 46 | 47 | router.post('/:id', (req, res) => { 48 | const expense = expenses.find((expense) => expense.id === req.params.id) 49 | 50 | if (expense) { 51 | expense.comment = req.body.comment || expense.comment 52 | res.status(200).send(expense) 53 | } else { 54 | res.status(404).send('The id is not found') 55 | } 56 | }) 57 | 58 | router.post('/:id/receipts', (req, res) => { 59 | // console.log(JSON.stringify(req)); 60 | if (!req.files) { 61 | return res.status(400).send('No files were uploaded.'); 62 | } 63 | 64 | const id = req.params.id 65 | const expense = expenses.find((expense) => expense.id === id) 66 | 67 | if (expense) { 68 | const receipt = req.files.receipt as UploadedFile 69 | const receiptId = `${id}-${expense.receipts.length}` 70 | receipt.mv(`${process.cwd()}/receipts/${receiptId}`, (err) => { 71 | if (err) { 72 | return res.status(500).send(err); 73 | } 74 | 75 | expense.receipts.push({ 76 | url: `/receipts/${receiptId}` 77 | }) 78 | res.status(200).send(expense) 79 | }) 80 | 81 | } else { 82 | res.status(404).send('The id is not found') 83 | } 84 | }) 85 | 86 | export default router 87 | -------------------------------------------------------------------------------- /api/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "lib": [ 4 | "es2016", 5 | "dom" 6 | ], 7 | "module": "commonjs", 8 | "moduleResolution": "node" 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "lockfileVersion": 1 3 | } 4 | --------------------------------------------------------------------------------