Passed
Push — 1.0 ( 970d8e...b00a03 )
by Morven
01:44
created

PostageUpgradeTask::up()   C

Complexity

Conditions 7
Paths 10

Size

Total Lines 31
Code Lines 17

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 7
eloc 17
nc 10
nop 0
dl 0
loc 31
rs 6.7272
c 0
b 0
f 0
1
<?php
2
3
namespace SilverCommerce\Postage\Tasks;
4
5
use SilverStripe\ORM\DB;
6
use SilverStripe\ORM\DataObject;
7
use SilverStripe\Control\Director;
8
use SilverStripe\Dev\MigrationTask;
9
use SilverStripe\ORM\DatabaseAdmin;
10
use SilverStripe\Control\Controller;
11
use SilverStripe\ORM\Queries\SQLInsert;
12
use SilverStripe\ORM\Queries\SQLSelect;
13
use SilverStripe\ORM\Queries\SQLUpdate;
14
use SilverCommerce\Postage\Model\PostageType;
15
use SilverCommerce\GeoZones\Model\Zone;
16
17
class PostageUpgradeTask extends MigrationTask
18
{
19
    private static $segment = 'PostageUpgradeTask';
0 ignored issues
show
introduced by
The private property $segment is not used, and could be removed.
Loading history...
20
21
    protected $title = 'Upgrage Postage';
22
23
    protected $description = 'Upgrade postage to the latest setup';
24
25
    /**
26
     * Should this task be invoked automatically via dev/build?
27
     *
28
     * @config
29
     * @var bool
30
     */
31
    private static $run_during_dev_build = true;
0 ignored issues
show
introduced by
The private property $run_during_dev_build is not used, and could be removed.
Loading history...
32
33
    protected $tables = [
34
        "PostageType_FlatRate_Locations" => "PostageType_FlatRateID",
35
        "PostageType_PriceBased_Locations" => "PostageType_PriceBasedID",
36
        "PostageType_QuantityBased_Locations" => "PostageType_QuantityBasedID",
37
        "PostageType_WeightBased_Locations" => "PostageType_WeightBasedID"
38
    ];
39
40
    /**
41
     * {@inheritdoc}
42
     */
43
    public function run($request)
44
    {
45
        if ($request && $request->getVar('direction') == 'down') {
46
            $this->down();
47
        } else {
48
            $this->up();
49
        }
50
    }
51
52
    /**
53
     * {@inheritdoc}
54
     */
55
    public function up()
56
    {
57
        $this->log("Upgrading Postage");
58
        $i = 0;
59
        $table_list = DB::table_list();
60
61
        // Get locations from existing join tables
62
        foreach ($this->tables as $table => $column) {
63
            if (in_array($table, $table_list)) {
64
                $sqlQuery = new SQLSelect();
65
                $sqlQuery->setFrom($table);
66
                $result = $sqlQuery->execute();
67
68
                foreach ($result as $row) {
69
                    $postage = PostageType::get()->byID($row[$column]);
70
                    $zone = Zone::get()->byID($row['GeoZoneZoneID']);
71
72
                    if (isset($postage) && isset($zone)) {
73
                        $postage->Locations()->add($zone);
74
                        $i++;
75
                    }
76
                }
77
78
                // Finally remove table
79
                DB::query("DROP TABLE $table;");
80
            }
81
        }
82
83
        // If we have data to migrate, do it now
84
        if ($i > 0) {
85
            $this->log("Migrated {$i} postage locations");
86
        }
87
    }
88
89
    /**
90
     * {@inheritdoc}
91
     */
92
    public function down()
93
    {
94
        $this->log("Downgrading Postage");
95
        $i = 0;
96
97
        $sqlQuery = new SQLSelect();
98
        $sqlQuery->setFrom("PostageType_Locations");
99
        $result = $sqlQuery->execute();
100
101
        foreach ($result as $row) {
102
            $postage = PostageType::get()->byID($row['PostageTypeID']);
103
            $zone = Zone::get()->byID($row['GeoZoneZoneID']);
104
105
            if (isset($postage) && isset($zone)) {
106
                $postage->Locations()->add($zone);
107
                $i++;
108
            }
109
        }
110
111
        // If we have data to migrate, do it now
112
        if ($i > 0) {
113
            $this->log("Downgraded {$i} postage locations");
114
        }
115
    }
116
117
    /**
118
     * Output a message
119
     *
120
     * @param string $text
121
     */
122
    protected function log($text)
123
    {
124
        if (Controller::curr() instanceof DatabaseAdmin) {
125
            DB::alteration_message($text, 'obsolete');
126
        } elseif (Director::is_cli()) {
127
            echo $text . "\n";
128
        } else {
129
            echo $text . "<br/>";
130
        }
131
    }
132
}
133