You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

87 lines
2.1 KiB

3 years ago
  1. <?php
  2. namespace App\Http\Controllers;
  3. use Illuminate\Http\Request;
  4. use App\Helper\TransactionCodeHelper;
  5. use DateTime;
  6. class FileUpload extends Controller
  7. {
  8. /**
  9. * Return the csv-upload view on GET request to /
  10. *
  11. * @return \Illuminate\Contracts\View\View|\Illuminate\Contracts\View\Factory
  12. */
  13. public function createForm()
  14. {
  15. return view('csv-upload');
  16. }
  17. /**
  18. * Parse and return the CSV data on POST request to /
  19. *
  20. * @param $request Request
  21. * @return \Illuminate\Http\RedirectResponse
  22. */
  23. public function fileUpload(Request $request)
  24. {
  25. $request->validate([
  26. 'file' => 'required|mimes:csv|max:4098'
  27. ]);
  28. if (!$request->file()) {
  29. return back();
  30. }
  31. $result = [];
  32. $csv_contents = $request->file('file')->getContent();
  33. $rows = str_getcsv($csv_contents, PHP_EOL);
  34. $headers = null;
  35. foreach ($rows as $index => $row) {
  36. $columns = str_getcsv($row, ',');
  37. if ($index === 0) {
  38. $headers = (object) [
  39. 'Date',
  40. 'Transaction Number',
  41. 'Transaction Valid',
  42. 'Customer Number',
  43. 'Reference',
  44. 'Amount',
  45. ];
  46. continue;
  47. }
  48. $date = new DateTime($columns[0] ?? null);
  49. $valid_transaction = TransactionCodeHelper::verifyKey($columns[1]) ? 'Yes' : 'No'; $amount = sprintf(
  50. '$%s',
  51. number_format((float) ((int) $columns[4] / 100) ?? null, 2, '.', ''),
  52. );
  53. $result[$index] = (object) [
  54. $date->format('Y/m/d h:i a'),
  55. $columns[1] ?? null,
  56. $valid_transaction,
  57. $columns[2] ?? null,
  58. $columns[3] ?? null,
  59. $amount,
  60. ];
  61. }
  62. usort($result, function ($a, $b) {
  63. return strtotime($a->{0}) < strtotime($b->{0});
  64. });
  65. $result[0] = $headers;
  66. return back()
  67. ->with('results', (object) $result);
  68. }
  69. }