Blame view

app/Utilities/Import.php 2.93 KB
b7c7a5f6   Alexey Boroda   first commit
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
  <?php
  
  namespace App\Utilities;
  
  use Date;
  use Illuminate\Validation\ValidationException;
  
  class Import
  {
  
      public static function createFromFile($import, $slug)
      {
          $success = true;
  
          // Loop through all sheets
          $import->each(function ($sheet) use (&$success, $slug) {
              if (!static::isValidSheetName($sheet, $slug)) {
                  $message = trans('messages.error.import_sheet');
  
                  flash($message)->error()->important();
  
                  return false;
              }
  
              if (!$success = static::createFromSheet($sheet, $slug)) {
                  return false;
              }
          });
  
          return $success;
      }
  
      public static function createFromSheet($sheet, $slug)
      {
          $success = true;
  
          $model = '\App\Models\\' . $slug;
          $request = '\App\Http\Requests\\' . $slug;
  
          if (!class_exists($model) || !class_exists($request)) {
              return false;
          }
  
          // Loop through all rows
          $sheet->each(function ($row, $index) use ($sheet, &$success, $model, $request) {
              $data = static::fixRow($row->toArray());
  
              // Set the line values so that request class could validate
              request()->merge($data);
  
              try {
                  app($request);
  
                  $data['company_id'] = session('company_id');
  
                  $model::create($data);
              } catch (ValidationException $e) {
                  $message = trans('messages.error.import_column', [
                      'message' => $e->validator->errors()->first(),
                      'sheet' => $sheet->getTitle(),
                      'line' => $index + 2,
                  ]);
  
                  flash($message)->error()->important();
  
                  $success = false;
  
                  // Break the import process
                  return false;
              }
  
              // Unset added line values
              foreach ($data as $key => $value) {
                  request()->offsetUnset($key);
              }
          });
  
          return $success;
      }
  
      public static function isValidSheetName($sheet, $slug)
      {
          $t = explode('\\', $slug);
  
          if (empty($t[1])) {
              return false;
          }
  
          if ($sheet->getTitle() != str_plural(snake_case($t[1]))) {
              return false;
          }
  
          return true;
      }
  
      protected static function fixRow($data)
      {
          // Fix the date fields
          $date_fields = ['paid_at', 'due_at', 'billed_at', 'invoiced_at'];
          foreach ($date_fields as $date_field) {
              if (empty($data[$date_field])) {
                  continue;
              }
  
              $new_date = Date::parse($data[$date_field])->format('Y-m-d') . ' ' . Date::now()->format('H:i:s');
  
              $data[$date_field] = $new_date;
          }
  
          // Make enabled field integer
          if (isset($data['enabled'])) {
              $data['enabled'] = (int) $data['enabled'];
          }
  
          return $data;
      }
  }