-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathPluginManager.php
158 lines (135 loc) · 5.43 KB
/
PluginManager.php
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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
<?php
/**
* This file is part of payjp4
*
* Copyright(c) Akira Kurozumi <info@a-zumi.net>
*
* https://a-zumi.net
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Plugin\payjp4;
use Doctrine\ORM\EntityManagerInterface;
use Eccube\Entity\Master\SaleType;
use Eccube\Entity\Payment;
use Eccube\Plugin\AbstractPluginManager;
use Eccube\Util\StringUtil;
use Plugin\payjp4\Entity\Config;
use Plugin\payjp4\Entity\PaymentStatus;
use Plugin\payjp4\Service\Method\CreditCard;
use Plugin\payjp4\Service\Method\Subscription;
use Symfony\Component\DependencyInjection\ContainerInterface;
class PluginManager extends AbstractPluginManager
{
public function enable(array $meta, ContainerInterface $container)
{
/** @var EntityManagerInterface $entityManager */
$entityManager = $container->get('doctrine.orm.entity_manager');
$Config = $entityManager->getRepository(Config::class)->get();
if (!$Config) {
$Config = new Config();
$entityManager->persist($Config);
$entityManager->flush();
}
$this->addEnv($container);
$this->createSaleType($container);
$this->createPaymentStatuses($container);
$Payment = new Payment();
$Payment->setMethod('クレジットカード');
$Payment->setMethodClass(CreditCard::class);
$this->createPayment($container, $Payment);
$Payment = new Payment();
$Payment->setMethod('定期購入');
$Payment->setMethodClass(Subscription::class);
$this->createPayment($container, $Payment);
}
public function disable(array $meta, ContainerInterface $container)
{
/** @var EntityManagerInterface $entityManager */
$entityManager = $container->get('doctrine.orm.entity_manager');
$paymentRepository = $entityManager->getRepository(Payment::class);
// TODO 外部キー制約で削除できない
// $Payments = $paymentRepository->findBy(['method_class' => [CreditCard::class, Subscription::class]]);
// if ($Payments) {
// foreach ($Payments as $Payment) {
// $entityManager->remove($Payment);
// }
// $entityManager->flush();
// }
// TODO APIでPAY.JPのプランをすべて削除
}
private function addEnv(ContainerInterface $container)
{
$envFile = $container->getParameter('kernel.project_dir') . '/.env';
$env = file_get_contents($envFile);
$env = StringUtil::replaceOrAddEnv($env, [
'PAYJP_PUBLIC_KEY' => '',
'PAYJP_SECRET_KEY' => ''
]);
file_put_contents($envFile, $env);
}
private function createPayment(ContainerInterface $container, Payment $Payment)
{
/** @var EntityManagerInterface $entityManager */
$entityManager = $container->get('doctrine.orm.entity_manager');
$paymentRepository = $entityManager->getRepository(Payment::class);
$LastPayment = $paymentRepository->findOneBy([], ['sort_no' => 'DESC']);
$sortNo = $LastPayment ? $LastPayment->getSortNo() + 1 : 1;
if ($paymentRepository->findOneBy(['method_class' => $Payment->getMethodClass()])) {
return;
}
$Payment->setCharge(0);
$Payment->setSortNo($sortNo);
$Payment->setVisible(true);
$entityManager->persist($Payment);
$entityManager->flush();
}
private function createSaleType(ContainerInterface $container)
{
/** @var EntityManagerInterface $entityManager */
$entityManager = $container->get('doctrine.orm.entity_manager');
$saleTypeRepository = $entityManager->getRepository(SaleType::class);
$SaleType = $saleTypeRepository->findOneBy([], ['sort_no' => 'DESC']);
$id = $SaleType ? $SaleType->getId() + 1 : 1;
$sortNo = $SaleType ? $SaleType->getSortNo() + 1 : 1;
$SaleType = $saleTypeRepository->findOneBy(['name' => '定期購入']);
if ($SaleType) {
return;
}
$SaleType = new SaleType();
$SaleType->setId($id);
$SaleType->setName('定期購入');
$SaleType->setSortNo($sortNo);
$entityManager->persist($SaleType);
$entityManager->flush();
}
private function createMasterData(ContainerInterface $container, array $statuses, $class)
{
/** @var EntityManagerInterface $entityManager */
$entityManager = $container->get('doctrine.orm.entity_manager');
$i = 0;
foreach ($statuses as $id => $name) {
$PaymentStatus = $entityManager->find($class, $id);
if (!$PaymentStatus) {
$PaymentStatus = new $class;
}
$PaymentStatus->setId($id);
$PaymentStatus->setName($name);
$PaymentStatus->setSortNo($i++);
$entityManager->persist($PaymentStatus);
}
$entityManager->flush();
}
private function createPaymentStatuses(ContainerInterface $container)
{
$statuses = [
PaymentStatus::OUTSTANDING => '未決済',
PaymentStatus::ENABLED => '有効性チェック済',
PaymentStatus::PROVISIONAL_SALES => '決済完了',
PaymentStatus::ACTUAL_SALES => '実売上',
PaymentStatus::CANCEL => 'キャンセル'
];
$this->createMasterData($container, $statuses, PaymentStatus::class);
}
}