Completed
Push — master ( ac8e10...d5ebee )
by Jean C.
02:30
created

Payment::setOnlineBankDebit()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 13
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Importance

Changes 6
Bugs 4 Features 0
Metric Value
c 6
b 4
f 0
dl 0
loc 13
rs 9.4285
cc 2
eloc 9
nc 2
nop 3
1
<?php
2
3
namespace Moip\Resource;
4
5
use Requests;
6
use stdClass;
7
8
class Payment extends MoipResource
9
{
10
    /**
11
     * @const string
12
     */
13
    const PATH = 'payments';
14
15
    /**
16
     * @const string
17
     */
18
    const MULTI_PAYMENTS_PATH = 'multipayments';
19
20
    /**
21
     * Payment means.
22
     *
23
     * @const string
24
     */
25
    const METHOD_CREDIT_CARD = 'CREDIT_CARD';
26
27
    /**
28
     * Payment means.
29
     *
30
     * @const string
31
     */
32
    const METHOD_BOLETO = 'BOLETO';
33
34
    /**
35
     * Payment means.
36
     *
37
     * @const string
38
     */
39
    const METHOD_ONLINE_DEBIT = 'ONLINE_DEBIT';
40
41
    /**
42
     * Payment means.
43
     *
44
     * @const string
45
     */
46
    const METHOD_WALLET = 'WALLET';
47
48
    /**
49
     * Payment means.
50
     *
51
     * @const string
52
     */
53
    const METHOD_ONLINE_BANK_DEBIT = 'ONLINE_BANK_DEBIT';
54
55
    /**
56
     * @var \Moip\Resource\Orders
57
     */
58
    private $order;
59
60
    /**
61
     * @var \Moip\Resource\Multiorders
62
     */
63
    private $multiorder;
64
65
    /**
66
     * Initializes new instances.
67
     */
68
    protected function initialize()
69
    {
70
        $this->data = new stdClass();
71
        $this->data->installmentCount = 1;
72
        $this->data->fundingInstrument = new stdClass();
73
    }
74
75
    /**
76
     * Create a new payment in api MoIP.
77
     *
78
     * @return $this
79
     */
80
    public function execute()
81
    {
82
        if ($this->order !== null) {
83
            $path = sprintf('/%s/%s/%s/%s', MoipResource::VERSION, Orders::PATH, $this->order->getId(), self::PATH);
84
        } else {
85
            $path = sprintf('/%s/%s/%s/%s', MoipResource::VERSION, Multiorders::PATH, $this->multiorder->getId(),
86
                self::MULTI_PAYMENTS_PATH);
87
        }
88
        $response = $this->httpRequest($path, Requests::POST, $this);
89
90
        return $this->populate($response);
91
    }
92
93
    /**
94
     * Get an payment in MoIP.
95
     *
96
     * @param string $id_moip Id MoIP payment
97
     *
98
     * @return stdClass
99
     */
100
    public function get($id_moip)
101
    {
102
        return $this->getByPath(sprintf('/%s/%s/%s', MoipResource::VERSION, self::PATH, $id_moip));
103
    }
104
105
    /**
106
     * Get id MoIP payment.
107
     *
108
     *
109
     * @return \Moip\Resource\Payment
110
     */
111
    public function getId()
112
    {
113
        return $this->getIfSet('id');
114
    }
115
116
    /**
117
     * Mount payment structure.
118
     *
119
     * @param \stdClass $response
120
     *
121
     * @return Payment
122
     */
123
    protected function populate(stdClass $response)
124
    {
125
        $payment = clone $this;
126
127
        $payment->data->id = $this->getIfSet('id', $response);
128
        $payment->data->status = $this->getIfSet('status', $response);
129
        $payment->data->delayCapture = $this->getIfSet('delayCapture', $response);
130
        $payment->data->amount = new stdClass();
131
        $payment->data->amount->total = $this->getIfSet('total', $response->amount);
132
        $payment->data->amount->currency = $this->getIfSet('currency', $response->amount);
133
        $payment->data->installmentCount = $this->getIfSet('installmentCount', $response);
134
        $payment->data->fundingInstrument = $this->getIfSet('fundingInstrument', $response);
135
        $payment->data->fees = $this->getIfSet('fees', $response);
136
        $payment->data->refunds = $this->getIfSet('refunds', $response);
137
        $payment->data->_links = $this->getIfSet('_links', $response);
138
        $payment->data->createdAt = $this->getIfSetDateTime('createdAt', $response);
139
        $payment->data->updatedAt = $this->getIfSetDateTime('updatedAt', $response);
140
141
        return $payment;
142
    }
143
144
    /**
145
     * Refunds.
146
     *
147
     * @return Refund
148
     */
149
    public function refunds()
150
    {
151
        $refund = new Refund($this->moip);
152
        $refund->setPayment($this);
153
154
        return $refund;
155
    }
156
157
    /**
158
     * get creation time.
159
     *
160
     * @return \DateTime
161
     */
162
    public function getCreatedAt()
163
    {
164
        return $this->data->createdAt;
165
    }
166
167
    /**
168
     * Returns when the last update occurred.
169
     *
170
     * @return \DateTime
171
     */
172
    public function getUpdatedAt()
173
    {
174
        return $this->data->updatedAt;
175
    }
176
177
    /**
178
     * Returns the funding instrument.
179
     *
180
     * @return stdClass
181
     */
182
    public function getFundingInstrument()
183
    {
184
        //todo: return a funding instrument object
185
        return $this->data->fundingInstrument;
186
    }
187
188
    /**
189
     * Set means of payment.
190
     *
191
     * @param \stdClass $fundingInstrument
192
     *
193
     * @return $this
194
     */
195
    public function setFundingInstrument(stdClass $fundingInstrument)
196
    {
197
        $this->data->fundingInstrument = $fundingInstrument;
198
199
        return $this;
200
    }
201
202
    /**
203
     * Set billet.
204
     *
205
     * @param \DateTime|string $expirationDate   Expiration date of a billet.
206
     * @param string           $logoUri          Logo of billet.
207
     * @param array            $instructionLines Instructions billet.
208
     *
209
     * @return $this
210
     */
211
    public function setBoleto($expirationDate, $logoUri, array $instructionLines = [])
212
    {
213
        $keys = ['first', 'second', 'third'];
214
215
        if (empty($instructionLines)) {
216
            //Avoid warning in array_combine
217
            $instructionLines = ['', '', ''];
218
        }
219
220
        if ($expirationDate instanceof \DateTime) {
221
            $expirationDate = $expirationDate->format('Y-m-d');
222
        }
223
224
        $this->data->fundingInstrument->method = self::METHOD_BOLETO;
225
        $this->data->fundingInstrument->boleto = new stdClass();
226
        $this->data->fundingInstrument->boleto->expirationDate = $expirationDate;
227
        $this->data->fundingInstrument->boleto->instructionLines = array_combine($keys, $instructionLines);
228
        $this->data->fundingInstrument->boleto->logoUri = $logoUri;
229
230
        return $this;
231
    }
232
233
    /**
234
     * Set credit card holder.
235
     *
236
     * @param \Moip\Resource\Customer $holder
237
     */
238
    private function setCreditCardHolder(Customer $holder)
239
    {
240
        $birthdate = $holder->getBirthDate();
241
        if ($birthdate instanceof \DateTime) {
242
            $birthdate = $birthdate->format('Y-m-d');
243
        }
244
        $this->data->fundingInstrument->creditCard->holder = new stdClass();
245
        $this->data->fundingInstrument->creditCard->holder->fullname = $holder->getFullname();
246
        $this->data->fundingInstrument->creditCard->holder->birthdate = $birthdate;
247
        $this->data->fundingInstrument->creditCard->holder->taxDocument = new stdClass();
248
        $this->data->fundingInstrument->creditCard->holder->taxDocument->type = $holder->getTaxDocumentType();
249
        $this->data->fundingInstrument->creditCard->holder->taxDocument->number = $holder->getTaxDocumentNumber();
250
        $this->data->fundingInstrument->creditCard->holder->phone = new stdClass();
251
        $this->data->fundingInstrument->creditCard->holder->phone->countryCode = $holder->getPhoneCountryCode();
252
        $this->data->fundingInstrument->creditCard->holder->phone->areaCode = $holder->getPhoneAreaCode();
253
        $this->data->fundingInstrument->creditCard->holder->phone->number = $holder->getPhoneNumber();
254
    }
255
256
    /**
257
     * Set credit cardHash.
258
     *
259
     * @param string                  $hash   Credit card hash encripted using Moip.js
260
     * @param \Moip\Resource\Customer $holder
261
     *
262
     * @return $this
263
     */
264
    public function setCreditCardHash($hash, Customer $holder)
265
    {
266
        $this->data->fundingInstrument->method = self::METHOD_CREDIT_CARD;
267
        $this->data->fundingInstrument->creditCard = new stdClass();
268
        $this->data->fundingInstrument->creditCard->hash = $hash;
269
        $this->setCreditCardHolder($holder);
270
271
        return $this;
272
    }
273
274
    /**
275
     * Set credit card
276
     * Credit card used in a payment.
277
     * The card when returned within a parent resource is presented in its minimum representation.
278
     *
279
     * @param int                     $expirationMonth Card expiration month
280
     * @param int                     $expirationYear  Year of card expiration.
281
     * @param string                  $number          Card number.
282
     * @param int                     $cvc             Card Security Code.
283
     * @param \Moip\Resource\Customer $holder
284
     *
285
     * @return $this
286
     */
287
    public function setCreditCard($expirationMonth, $expirationYear, $number, $cvc, Customer $holder)
288
    {
289
        $this->data->fundingInstrument->method = self::METHOD_CREDIT_CARD;
290
        $this->data->fundingInstrument->creditCard = new stdClass();
291
        $this->data->fundingInstrument->creditCard->expirationMonth = $expirationMonth;
292
        $this->data->fundingInstrument->creditCard->expirationYear = $expirationYear;
293
        $this->data->fundingInstrument->creditCard->number = $number;
294
        $this->data->fundingInstrument->creditCard->cvc = $cvc;
295
        $this->setCreditCardHolder($holder);
296
297
        return $this;
298
    }
299
300
    /**
301
     * Set installment count.
302
     *
303
     * @param int $installmentCount
304
     *
305
     * @return $this
306
     */
307
    public function setInstallmentCount($installmentCount)
308
    {
309
        $this->data->installmentCount = $installmentCount;
310
311
        return $this;
312
    }
313
314
    /**
315
     * Set payment means made available by banks.
316
     *
317
     * @param string           $bankNumber     Bank number. Possible values: 001, 237, 341, 041.
318
     * @param \DateTime|string $expirationDate Date of expiration debit.
319
     * @param string           $returnUri      Return Uri.
320
     *
321
     * @return $this
322
     */
323
    public function setOnlineBankDebit($bankNumber, $expirationDate, $returnUri)
324
    {
325
        if ($expirationDate instanceof \DateTime) {
326
            $expirationDate = $expirationDate->format('Y-m-d');
327
        }
328
        $this->data->fundingInstrument->method = self::METHOD_ONLINE_BANK_DEBIT;
329
        $this->data->fundingInstrument->onlineBankDebit = new stdClass();
330
        $this->data->fundingInstrument->onlineBankDebit->bankNumber = $bankNumber;
331
        $this->data->fundingInstrument->onlineBankDebit->expirationDate = $expirationDate;
332
        $this->data->fundingInstrument->onlineBankDebit->returnUri = $returnUri;
333
334
        return $this;
335
    }
336
337
    /**
338
     * Set delay capture.
339
     *
340
     * @return $this
341
     */
342
    public function setDelayCapture()
343
    {
344
        $this->data->delayCapture = true;
345
346
        return $this;
347
    }
348
349
    /**
350
     * Set Multiorders.
351
     *
352
     * @param \Moip\Resource\Multiorders $multiorder
353
     *
354
     * @return $this
355
     */
356
    public function setMultiorder(Multiorders $multiorder)
357
    {
358
        $this->multiorder = $multiorder;
359
360
        return $this;
361
    }
362
363
    /**
364
     * Set order.
365
     *
366
     * @param \Moip\Resource\Orders $order
367
     *
368
     * @return $this
369
     */
370
    public function setOrder(Orders $order)
371
    {
372
        $this->order = $order;
373
374
        return $this;
375
    }
376
}
377