Completed
Push — master ( cebd6a...4982e0 )
by Simon
01:36
created

PartialSubmissionJob   A

Complexity

Total Complexity 4

Size/Duplication

Total Lines 35
Duplicated Lines 0 %

Coupling/Cohesion

Components 0
Dependencies 4

Importance

Changes 2
Bugs 0 Features 0
Metric Value
wmc 4
c 2
b 0
f 0
lcom 0
cbo 4
dl 0
loc 35
rs 10
1
<?php
2
3
namespace Firesphere\PartialUserforms\Jobs;
4
5
use DNADesign\ElementalUserForms\Model\ElementForm;
6
use Firesphere\PartialUserforms\Models\PartialFieldSubmission;
7
use Firesphere\PartialUserforms\Models\PartialFormSubmission;
8
use SilverStripe\Control\Email\Email;
9
use SilverStripe\Core\Config\Config;
10
use SilverStripe\Core\Injector\Injector;
11
use SilverStripe\Dev\Debug;
12
use SilverStripe\ORM\ArrayList;
13
use SilverStripe\ORM\DataList;
14
use SilverStripe\ORM\FieldType\DBDatetime;
15
use SilverStripe\SiteConfig\SiteConfig;
16
use SilverStripe\UserForms\Model\Submission\SubmittedForm;
17
use SilverStripe\UserForms\Model\UserDefinedForm;
18
use Symbiote\QueuedJobs\Services\AbstractQueuedJob;
19
20
class PartialSubmissionJob extends AbstractQueuedJob
21
{
22
23
    /**
24
     * The generated CSV files
25
     * @var array
26
     */
27
    protected $files = [];
28
    
29
    protected $this->config;
0 ignored issues
show
Bug introduced by
This code did not parse for me. Apparently, there is an error somewhere around this line:

Syntax error, unexpected T_OBJECT_OPERATOR, expecting ',' or ';'
Loading history...
30
31
    /**
32
     * @return string
33
     */
34
    public function getTitle()
35
    {
36
        return _t(__CLASS__ . '.Title', 'Export partial submissions to Email');
37
    }
38
39
    /**
40
     * Do some processing yourself!
41
     */
42
    public function process()
43
    {
44
        $this->config = SiteConfig::current_site_config();
45
        /** @var DataList|PartialFormSubmission[] $exportForms */
46
        $allSubmissions = PartialFormSubmission::get()->filter(['IsSend' => false]);
47
        /** @var ArrayList|UserDefinedForm[]|ElementForm[] $parents */
48
        $userDefinedForms = ArrayList::create();
49
        $this->getParents($allSubmissions, $userDefinedForms);
50
51
52
        foreach ($userDefinedForms as $form) {
53
            $fileName = _t(__CLASS__ . '.Export', 'Export of ') .
54
                $form->Title . ' - ' .
55
                DBDatetime::now()->Format(DBDatetime::ISO_DATETIME);
56
            $file = '/tmp/'.$fileName . '.csv';
57
            $this->files[] = $file;
58
            $this->buildCSV($file, $form);
59
        }
60
61
        /** @var Email $mail */
62
        $mail = Email::create();
63
64
        $mail->setSubject('Partial form submissions of ' . DBDatetime::now()->Format(DBDatetime::ISO_DATETIME));
65
        foreach ($this->files as $file) {
66
            $mail->addAttachment($file);
67
        }
68
        $mail->setTo($this->config->SendMailTo);
69
        $mail->setFrom('[email protected]');
70
        $mail->send();
71
72
        $this->isComplete = true;
73
    }
74
75
    /**
76
     * @param $file
77
     * @param $form
78
     */
79
    protected function buildCSV($file, $form)
80
    {
81
        $resource = fopen($file, 'w+');
82
        /** @var PartialFormSubmission $submissions */
83
        $submissions = PartialFormSubmission::get()->filter(['UserDefinedFormID' => $form->ID]);
84
        $headerFields = $form
85
            ->Fields()
86
            ->exclude(['Name:PartialMatch' => 'EditableFormStep'])
87
            ->column('Title');
88
        fputcsv($resource, $headerFields);
89
90
        if ($submissions->count()) {
91
            $this->processSubmissions($form, $submissions, $resource);
92
        }
93
        fclose($resource);
94
    }
95
96
    /**
97
     * @param $form
98
     * @param $submissions
99
     * @param $submitted
100
     * @param $resource
101
     */
102
    protected function processSubmissions($form, $submissions, $resource)
103
    {
104
        $editableFields = $form->Fields()->map('Name', 'Title')->toArray();
105
        $submitted = [];
106
        $fieldMap = [];
107
        foreach ($submissions as $submission) {
108
            $values = $submission->PartialFields()->map('Name', 'Value')->toArray();
109
            $i = 0;
110
            foreach ($editableFields as $field => $title) {
111
                $submitted[] = '';
112
                $fieldMap[$i]['Name'] = $field;
113
                $fieldMap[$i]['Title'] = $title;
114
                $fieldMap[$i]['ParentClass'] = UserDefinedForm::class;
115
                $fieldMap[$i]['Parent'] = '=>' . UserDefinedForm::class . '.form1';
116
                if (isset($values[$field])) {
117
                    $submitted[] = $values[$field];
118
                }
119
                $i++;
120
            }
121
            fputcsv($resource, $submitted);
122
            $submission->IsSend = true;
123
            $submission->write();
124
        }
125
    }
126
    
127
    public function afterComplete()
128
    {
129
        parent::afterComplete();
130
        if ($this->config->CleanupAfterSend) {
131
            /** @var DataList|PartialFormSubmission[] $forms */
132
            $forms = PartialFormSubmission::get()->filter(['IsSend' => true]);
133
            foreach ($forms as $form) {
134
                /** @var DataList|PartialFieldSubmission[] $fields */
135
                $fields = PartialFieldSubmission::get()->filter(['ID' => $form->PartialFields()->column('ID')]);
136
                $fields->removeAll();
137
                $form->delete();
138
                $form->destroy();
139
            }
140
        }
141
    }/**
142
 * @param $allSubmissions
143
 * @param $userDefinedForms
144
 */protected function getParents($allSubmissions, &$userDefinedForms)
145
{
146
    /** @var PartialFormSubmission $submission */
147
    foreach ($allSubmissions as $submission) {
148
        // Due to having to support Elemental ElementForm, we need to manually get the parent
149
        // It's a bit a pickle, but it works
150
        $parentClass = $submission->ParentClass;
151
        $parent = $parentClass::get()->byID($submission->UserDefinedFormID);
152
        if ($parent &&
153
            $parent->ExportPartialSubmissions &&
154
            !$userDefinedForms->find('ID', $parent->ID)
155
        ) {
156
            $userDefinedForms->push($parent);
157
        }
158
        $submission->destroy();
159
    }
160
}
161
}
162