Completed
Push — master ( 4982e0...9aaf8b )
by Simon
01:46
created

PartialSubmissionJob::getTitle()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 4
rs 10
cc 1
eloc 2
nc 1
nop 0
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\ORM\ArrayList;
10
use SilverStripe\ORM\DataList;
11
use SilverStripe\ORM\FieldType\DBDatetime;
12
use SilverStripe\SiteConfig\SiteConfig;
13
use SilverStripe\UserForms\Model\UserDefinedForm;
14
use Symbiote\QueuedJobs\Services\AbstractQueuedJob;
15
16
class PartialSubmissionJob extends AbstractQueuedJob
17
{
18
19
    /**
20
     * The generated CSV files
21
     * @var array
22
     */
23
    protected $files = [];
24
25
    protected $config;
26
27
    /**
28
     * @return string
29
     */
30
    public function getTitle()
31
    {
32
        return _t(__CLASS__ . '.Title', 'Export partial submissions to Email');
33
    }
34
35
    /**
36
     * Do some processing yourself!
37
     */
38
    public function process()
39
    {
40
        $this->config = SiteConfig::current_site_config();
41
        /** @var DataList|PartialFormSubmission[] $exportForms */
42
        $allSubmissions = PartialFormSubmission::get()->filter(['IsSend' => false]);
43
        /** @var ArrayList|UserDefinedForm[]|ElementForm[] $parents */
44
        $userDefinedForms = ArrayList::create();
45
        $this->getParents($allSubmissions, $userDefinedForms);
46
47
48
        foreach ($userDefinedForms as $form) {
49
            $fileName = _t(__CLASS__ . '.Export', 'Export of ') .
50
                $form->Title . ' - ' .
51
                DBDatetime::now()->Format(DBDatetime::ISO_DATETIME);
52
            $file = '/tmp/' . $fileName . '.csv';
53
            $this->files[] = $file;
54
            $this->buildCSV($file, $form);
55
        }
56
57
        /** @var Email $mail */
58
        $mail = Email::create();
59
60
        $mail->setSubject('Partial form submissions of ' . DBDatetime::now()->Format(DBDatetime::ISO_DATETIME));
61
        foreach ($this->files as $file) {
62
            $mail->addAttachment($file);
63
        }
64
        $mail->setTo($this->config->SendMailTo);
65
        $mail->setFrom('[email protected]');
66
        $mail->send();
67
68
        $this->isComplete = true;
69
    }
70
71
    /**
72
     * @param $file
73
     * @param $form
74
     */
75
    protected function buildCSV($file, $form)
76
    {
77
        $resource = fopen($file, 'w+');
78
        /** @var PartialFormSubmission $submissions */
79
        $submissions = PartialFormSubmission::get()->filter(['UserDefinedFormID' => $form->ID]);
80
        $headerFields = $form
81
            ->Fields()
82
            ->exclude(['Name:PartialMatch' => 'EditableFormStep'])
83
            ->column('Title');
84
        fputcsv($resource, $headerFields);
85
86
        if ($submissions->count()) {
0 ignored issues
show
Documentation Bug introduced by
The method count does not exist on object<Firesphere\Partia...\PartialFormSubmission>? Since you implemented __call, maybe consider adding a @method annotation.

If you implement __call and you know which methods are available, you can improve IDE auto-completion and static analysis by adding a @method annotation to the class.

This is often the case, when __call is implemented by a parent class and only the child class knows which methods exist:

class ParentClass {
    private $data = array();

    public function __call($method, array $args) {
        if (0 === strpos($method, 'get')) {
            return $this->data[strtolower(substr($method, 3))];
        }

        throw new \LogicException(sprintf('Unsupported method: %s', $method));
    }
}

/**
 * If this class knows which fields exist, you can specify the methods here:
 *
 * @method string getName()
 */
class SomeClass extends ParentClass { }
Loading history...
87
            $this->processSubmissions($form, $submissions, $resource);
88
        }
89
        fclose($resource);
90
    }
91
92
    /**
93
     * @param $form
94
     * @param $submissions
95
     * @param $submitted
96
     * @param $resource
97
     */
98
    protected function processSubmissions($form, $submissions, $resource)
99
    {
100
        $editableFields = $form->Fields()->map('Name', 'Title')->toArray();
101
        $submitted = [];
102
        $fieldMap = [];
103
        foreach ($submissions as $submission) {
104
            $values = $submission->PartialFields()->map('Name', 'Value')->toArray();
105
            $i = 0;
106
            foreach ($editableFields as $field => $title) {
107
                $submitted[] = '';
108
                $fieldMap[$i]['Name'] = $field;
109
                $fieldMap[$i]['Title'] = $title;
110
                $fieldMap[$i]['ParentClass'] = UserDefinedForm::class;
111
                $fieldMap[$i]['Parent'] = '=>' . UserDefinedForm::class . '.form1';
112
                if (isset($values[$field])) {
113
                    $submitted[] = $values[$field];
114
                }
115
                $i++;
116
            }
117
            fputcsv($resource, $submitted);
118
            $submission->IsSend = true;
119
            $submission->write();
120
        }
121
    }
122
    
123
    public function afterComplete()
124
    {
125
        parent::afterComplete();
126
        if ($this->config->CleanupAfterSend) {
127
            /** @var DataList|PartialFormSubmission[] $forms */
128
            $forms = PartialFormSubmission::get()->filter(['IsSend' => true]);
129
            foreach ($forms as $form) {
130
                /** @var DataList|PartialFieldSubmission[] $fields */
131
                $fields = PartialFieldSubmission::get()->filter(['ID' => $form->PartialFields()->column('ID')]);
132
                $fields->removeAll();
133
                $form->delete();
134
                $form->destroy();
135
            }
136
        }
137
    }/**
138
 * @param $allSubmissions
139
 * @param $userDefinedForms
140
 */protected function getParents($allSubmissions, &$userDefinedForms)
141
{
142
    /** @var PartialFormSubmission $submission */
143
    foreach ($allSubmissions as $submission) {
144
        // Due to having to support Elemental ElementForm, we need to manually get the parent
145
        // It's a bit a pickle, but it works
146
        $parentClass = $submission->ParentClass;
147
        $parent = $parentClass::get()->byID($submission->UserDefinedFormID);
148
        if ($parent &&
149
            $parent->ExportPartialSubmissions &&
150
            !$userDefinedForms->find('ID', $parent->ID)
151
        ) {
152
            $userDefinedForms->push($parent);
153
        }
154
        $submission->destroy();
155
    }
156
}
157
}
158