diff --git a/README.md b/README.md index 11895e1..256cd40 100644 --- a/README.md +++ b/README.md @@ -158,39 +158,39 @@ $payment = new \Potelo\MultiPayment\MultiPayment(); $payment->setGateway('iugu')->charge($options); ``` -| atributo | obrigatório | tipo | descrição | exemplo | -|-------------------------------|---------------------------------------------------------------------|--------------------------------|-------------------------------------------|---------------------------------------| -| `amount` | **obrigatório** caso `items` não seja informado | int | valor em centavos | `10000` | -| `customer` | **obrigatório** | array | array com os dados do cliente | `['name' => 'Nome do cliente'...]` | -| `customer.name` | **obrigatório** | string | nome do cliente | `'Nome do cliente'` | -| `customer.email` | **obrigatório** | string | email do cliente | `'joaomaria@email.com'` | -| `customer.tax_document` | | string | cpf ou cnpj do cliente | `'12345678901'` | -| `birth_date` | | string formato `yyyy-mm-dd` | data de nascimento | `'01/01/1990'` | -| `customer.phone_number` | | string | telefone | `'999999999'` | -| `customer.phone_area` | | string | DDD | `'999999999'` | -| `customer.address` | **obrigatório** para o método de pagamento `bank_slip` | array | array com os dados do endereço do cliente | `['street' => 'Rua do cliente'...]` | -| `customer.address.street` | **obrigatório** | string | nome da rua | `'Nome da rua'` | -| `customer.address.number` | **obrigatório** | string | número da casa | `'123'` | -| `customer.address.district` | **obrigatório** | string | bairro | `'Bairro do cliente'` | -| `customer.address.city` | **obrigatório** | string | cidade | `'Salvador'` | -| `customer.address.state` | **obrigatório** | string | estado | `'Bahia'` | +| atributo | obrigatório | tipo | descrição | exemplo | +|------------------------------|---------------------------------------------------------------------|--------------------------------|-------------------------------------------|---------------------------------------| +| `amount` | **obrigatório** caso `items` não seja informado | int | valor em centavos | `10000` | +| `customer` | **obrigatório** | array | array com os dados do cliente | `['name' => 'Nome do cliente'...]` | +| `customer.name` | **obrigatório** | string | nome do cliente | `'Nome do cliente'` | +| `customer.email` | **obrigatório** | string | email do cliente | `'joaomaria@email.com'` | +| `customer.tax_document` | | string | cpf ou cnpj do cliente | `'12345678901'` | +| `birth_date` | | string formato `yyyy-mm-dd` | data de nascimento | `'01/01/1990'` | +| `customer.phone_number` | | string | telefone | `'999999999'` | +| `customer.phone_area` | | string | DDD | `'999999999'` | +| `customer.address` | **obrigatório** para o método de pagamento `bank_slip` | array | array com os dados do endereço do cliente | `['street' => 'Rua do cliente'...]` | +| `customer.address.street` | **obrigatório** | string | nome da rua | `'Nome da rua'` | +| `customer.address.number` | **obrigatório** | string | número da casa | `'123'` | +| `customer.address.district` | **obrigatório** | string | bairro | `'Bairro do cliente'` | +| `customer.address.city` | **obrigatório** | string | cidade | `'Salvador'` | +| `customer.address.state` | **obrigatório** | string | estado | `'Bahia'` | | `customer.address.complement` | **obrigatório** | string | complemento | `'Apto. 123'` | -| `customer.address.zip_code` | **obrigatório** | string | cep | `'12345678'` | -| `items` | **obrigatório** caso `amount` não tenha sido informado | array | array com os itens da compra | `[['description' => 'Produto 1',...` | -| `items.description` | **obrigatório** | string | descrição do item | `'Produto 1'` | -| `items.quantity` | **obrigatório** | int | quantidade do item | `1` | -| `items.price` | **obrigatório** | int | valor do item | `10000` | -| `payment_method` | | `'credit_card'`,`'bank_slip'` | método de pagamento | `'credit_card'` | -| `expires_at` | **obrigatório** caso `payment_method` seja `'bank_slip'` ou `'pix'` | string no formato `yyyy-mm-dd` | data de expiração da fatura | `2021-10-10` | -| `credit_card` | **obrigatório** caso `payment_method` seja `'credit_card'` | array | array com os dados do cartão de crédito | `['number' => '1234567890123456',...` | -| `credit_card.token` | | string | token do cartão para o gateway escolhido | `'abcdefghijklmnopqrstuvwxyz'` | -| `credit_card.number` | **obrigatório** caso `token` não tenha sido informado | string | número do cartão de crédito | `'1234567890123456'` | -| `credit_card.month` | **obrigatório** caso `token` não tenha sido informado | string | mês de expiração do cartão de crédito | `'12'` | -| `credit_card.year` | **obrigatório** caso `token` não tenha sido informado | string | ano de expiração do cartão de crédito | `'2022'` | -| `credit_card.cvv` | **obrigatório** caso `token` não tenha sido informado | string | código de segurança do cartão de crédito | `'123'` | -| `credit_card.first_name` | | string | primeiro nome no cartão de crédito | `'João'` | -| `credit_card.last_name` | | string | último nome no cartão de crédito | `'Maria'` | -| `bank_slip` | | array | array com os dados do boleto | `['expires_at' => '2022-12-31',...` | +| `customer.address.zip_code` | **obrigatório** | string | cep | `'12345678'` | +| `items` | **obrigatório** caso `amount` não tenha sido informado | array | array com os itens da compra | `[['description' => 'Produto 1',...` | +| `items.description` | **obrigatório** | string | descrição do item | `'Produto 1'` | +| `items.quantity` | **obrigatório** | int | quantidade do item | `1` | +| `items.price` | **obrigatório** | int | valor do item | `10000` | +| `payment_method` | | `'credit_card'`,`'bank_slip'` | método de pagamento | `'credit_card'` | +| `due_at` | **obrigatório** caso `payment_method` seja `'bank_slip'` ou `'pix'` | string no formato `yyyy-mm-dd` | data de expiração da fatura | `2021-10-10` | +| `credit_card` | **obrigatório** caso `payment_method` seja `'credit_card'` | array | array com os dados do cartão de crédito | `['number' => '1234567890123456',...` | +| `credit_card.token` | | string | token do cartão para o gateway escolhido | `'abcdefghijklmnopqrstuvwxyz'` | +| `credit_card.number` | **obrigatório** caso `token` não tenha sido informado | string | número do cartão de crédito | `'1234567890123456'` | +| `credit_card.month` | **obrigatório** caso `token` não tenha sido informado | string | mês de expiração do cartão de crédito | `'12'` | +| `credit_card.year` | **obrigatório** caso `token` não tenha sido informado | string | ano de expiração do cartão de crédito | `'2022'` | +| `credit_card.cvv` | **obrigatório** caso `token` não tenha sido informado | string | código de segurança do cartão de crédito | `'123'` | +| `credit_card.first_name` | | string | primeiro nome no cartão de crédito | `'João'` | +| `credit_card.last_name` | | string | último nome no cartão de crédito | `'Maria'` | +| `bank_slip` | | array | array com os dados do boleto | `['due_at' => '2022-12-31',...` | ### Models #### Customer diff --git a/src/Builders/InvoiceBuilder.php b/src/Builders/InvoiceBuilder.php index d501f39..b3ad810 100644 --- a/src/Builders/InvoiceBuilder.php +++ b/src/Builders/InvoiceBuilder.php @@ -58,18 +58,31 @@ public function setPaymentMethod(string $paymentMethod): InvoiceBuilder } /** - * set invoice expiresAt + * set invoice DueAt * - * @param Carbon|string $expiresAt Carbon or string in Y-m-d format + * @param Carbon|string $dueAt Carbon or string in Y-m-d format * * @return InvoiceBuilder */ - public function setExpiresAt($expiresAt): InvoiceBuilder + public function setDueAt($dueAt): InvoiceBuilder { - if (is_string($expiresAt)) { - $expiresAt = Carbon::parse($expiresAt); + if (is_string($dueAt)) { + $dueAt = Carbon::parse($dueAt); } - $this->model->expiresAt = $expiresAt; + $this->model->dueAt = $dueAt; + return $this; + } + + /** + * set invoice expirationDays + * + * @param int $expirationDays + * + * @return InvoiceBuilder + */ + public function setExpirationDays(int $expirationDays): InvoiceBuilder + { + $this->model->expirationDays = $expirationDays; return $this; } diff --git a/src/Gateways/IuguGateway.php b/src/Gateways/IuguGateway.php index efde1a7..839e1ba 100644 --- a/src/Gateways/IuguGateway.php +++ b/src/Gateways/IuguGateway.php @@ -56,6 +56,7 @@ public function createInvoice(Invoice $invoice): Invoice $iuguInvoiceData['customer_id'] = $invoice->customer->id; $iuguInvoiceData['payer']['cpf_cnpj'] = $invoice->customer->taxDocument; $iuguInvoiceData['email'] = $invoice->customer->email; + $iuguInvoiceData['expires_in'] = $invoice->expirationDays ?? 0; $iuguInvoiceData['items'] = []; foreach ($invoice->items as $item) { @@ -76,8 +77,8 @@ public function createInvoice(Invoice $invoice): Invoice } } - $iuguInvoiceData['due_date'] = !empty($invoice->expiresAt) - ? $invoice->expiresAt->format('Y-m-d') + $iuguInvoiceData['due_date'] = !empty($invoice->dueAt) + ? $invoice->dueAt->format('Y-m-d') : Carbon::now()->format('Y-m-d'); if (!empty($invoice->customer->address)) { @@ -423,6 +424,7 @@ private function parseInvoice($iuguInvoice, ?Invoice $invoice = null): Invoice $invoice->amount = $iuguInvoice->total_cents; $invoice->paidAmount = $iuguInvoice->paid_cents; $invoice->refundedAmount = $iuguInvoice->refunded_cents; + $invoice->expirationDays = $iuguInvoice->expires_in; $invoice->customer = new Customer(); $invoice->customer->id = $iuguInvoice->customer_id; @@ -454,7 +456,7 @@ private function parseInvoice($iuguInvoice, ?Invoice $invoice = null): Invoice } $invoice->paymentMethod = $this->iuguToMultiPaymentPaymentMethod($iuguInvoice->payment_method); - $invoice->expiresAt = !empty($iuguInvoice->due_date) ? new Carbon($iuguInvoice->due_date) : null; + $invoice->dueAt = !empty($iuguInvoice->due_date) ? new Carbon($iuguInvoice->due_date) : null; $invoice->createdAt = new Carbon($iuguInvoice->created_at_iso); $invoice->fee = $iuguInvoice->taxes_paid_cents ?? null; $invoice->gateway = 'iugu'; diff --git a/src/Models/Invoice.php b/src/Models/Invoice.php index ca9ebba..648d921 100644 --- a/src/Models/Invoice.php +++ b/src/Models/Invoice.php @@ -89,7 +89,12 @@ class Invoice extends Model /** * @var Carbon|null */ - public ?Carbon $expiresAt; + public ?Carbon $dueAt; + + /** + * @var int|null + */ + public ?int $expirationDays; /** * @var int|null @@ -165,9 +170,9 @@ public function fill(array $data): void unset($data['customer']); } - if (!empty($data['expires_at'])) { - $this->expiresAt = Carbon::createFromFormat('Y-m-d', $data['expires_at']); - unset($data['expires_at']); + if (!empty($data['due_at'])) { + $this->dueAt = Carbon::createFromFormat('Y-m-d', $data['due_at']); + unset($data['due_at']); } if (!empty($data['credit_card']) && is_array($data['credit_card'])) { @@ -208,9 +213,9 @@ public function attributesExtraValidation($attributes): void ($this->paymentMethod == Invoice::PAYMENT_METHOD_BANK_SLIP || $this->paymentMethod == Invoice::PAYMENT_METHOD_PIX ) && - empty($this->expiresAt) + empty($this->dueAt) ) { - throw new ModelAttributeValidationException('The `expiresAt` attribute is required for bank_slip or pix payment method.'); + throw new ModelAttributeValidationException('The `dueAt` attribute is required for bank_slip or pix payment method.'); } if ( diff --git a/tests/Unit/Builders/InvoiceBuilderTest.php b/tests/Unit/Builders/InvoiceBuilderTest.php index 4bf7092..473f723 100644 --- a/tests/Unit/Builders/InvoiceBuilderTest.php +++ b/tests/Unit/Builders/InvoiceBuilderTest.php @@ -45,8 +45,8 @@ private function createInvoice(string $gateway, array $data): Invoice foreach ($data['items'] as $item) { $invoiceBuilder->addItem($item['description'], $item['price'], $item['quantity']); } - if (isset($data['expiresAt'])) { - $invoiceBuilder->setExpiresAt($data['expiresAt']); + if (isset($data['dueAt'])) { + $invoiceBuilder->setDueAt($data['dueAt']); } if (isset($data['paymentMethod'])) { $invoiceBuilder->setPaymentMethod($data['paymentMethod']); @@ -115,8 +115,8 @@ public function testShouldCreateInvoice(string $gateway, array $data): void $this->assertEquals($item['quantity'], $invoice->items[$key]->quantity); } - if (isset($data['expiresAt'])) { - $this->assertEquals($data['expiresAt'], $invoice->expiresAt->format('Y-m-d')); + if (isset($data['dueAt'])) { + $this->assertEquals($data['dueAt'], $invoice->dueAt->format('Y-m-d')); } if (isset($data['paymentMethod'])) { @@ -164,8 +164,8 @@ public function testShouldCreateInvoice(string $gateway, array $data): void $this->assertEquals($item['quantity'], $invoice->items[$key]->quantity); } - if (isset($data['expiresAt'])) { - $this->assertEquals($data['expiresAt'], $invoice->expiresAt->format('Y-m-d')); + if (isset($data['dueAt'])) { + $this->assertEquals($data['dueAt'], $invoice->dueAt->format('Y-m-d')); } if (isset($data['paymentMethod']) && $invoice->status === $invoice::STATUS_PAID) { @@ -193,7 +193,7 @@ public function shouldCreateInvoiceDataProvider(): array 'iugu - without payment method' => [ 'gateway' => 'iugu', 'data' => [ - 'expiresAt' => Carbon::now()->addWeekday()->format('Y-m-d'), + 'dueAt' => Carbon::now()->addWeekday()->format('Y-m-d'), 'items' => [['description' => 'Teste', 'quantity' => 1, 'price' => 10000,]], 'customer' => self::customerWithAddress(), ] @@ -201,7 +201,7 @@ public function shouldCreateInvoiceDataProvider(): array 'iugu - without payment method - with custom variable' => [ 'gateway' => 'iugu', 'data' => [ - 'expiresAt' => Carbon::now()->addWeekday()->format('Y-m-d'), + 'dueAt' => Carbon::now()->addWeekday()->format('Y-m-d'), 'items' => [['description' => 'Teste', 'quantity' => 1, 'price' => 10000,]], 'customer' => self::customerWithAddress(), 'customVariables' => [ @@ -213,7 +213,7 @@ public function shouldCreateInvoiceDataProvider(): array 'iugu - company with address without payment method' => [ 'gateway' => 'iugu', 'data' => [ - 'expiresAt' => Carbon::now()->addWeekday()->format('Y-m-d'), + 'dueAt' => Carbon::now()->addWeekday()->format('Y-m-d'), 'items' => [['description' => 'Teste', 'quantity' => 1, 'price' => 10000,]], 'customer' => self::companyWithAddress(), ] @@ -239,7 +239,7 @@ public function shouldCreateInvoiceDataProvider(): array 'iugu - bank slip with address' => [ 'gateway' => 'iugu', 'data' => [ - 'expiresAt' => Carbon::now()->addWeekday()->format('Y-m-d'), + 'dueAt' => Carbon::now()->addWeekday()->format('Y-m-d'), 'items' => [['description' => 'Teste', 'quantity' => 1, 'price' => 10000,]], 'customer' => self::customerWithAddress(), 'paymentMethod' => 'bank_slip', @@ -248,7 +248,7 @@ public function shouldCreateInvoiceDataProvider(): array 'iugu - pix with address' => [ 'gateway' => 'iugu', 'data' => [ - 'expiresAt' => Carbon::now()->addWeekday()->format('Y-m-d'), + 'dueAt' => Carbon::now()->addWeekday()->format('Y-m-d'), 'items' => [['description' => 'Teste', 'quantity' => 1, 'price' => 10000,]], 'customer' => self::customerWithAddress(), 'paymentMethod' => 'pix', @@ -257,7 +257,7 @@ public function shouldCreateInvoiceDataProvider(): array 'iugu - pix without address' => [ 'gateway' => 'iugu', 'data' => [ - 'expiresAt' => Carbon::now()->addWeekday()->format('Y-m-d'), + 'dueAt' => Carbon::now()->addWeekday()->format('Y-m-d'), 'items' => [['description' => 'Teste', 'quantity' => 1, 'price' => 10000,]], 'customer' => self::customerWithoutAddress(), 'paymentMethod' => 'pix',