Skip to content

Commit

Permalink
Merge pull request #33 from Potelo/iugu-due-at
Browse files Browse the repository at this point in the history
Permite configurar a validade e expiração da fatura de forma independente
  • Loading branch information
gabrielpeixoto authored Oct 16, 2023
2 parents bf275e2 + 63d0c47 commit e3eff8d
Show file tree
Hide file tree
Showing 5 changed files with 79 additions and 59 deletions.
64 changes: 32 additions & 32 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 | `'[email protected]'` |
| `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 | `'[email protected]'` |
| `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
Expand Down
25 changes: 19 additions & 6 deletions src/Builders/InvoiceBuilder.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

Expand Down
8 changes: 5 additions & 3 deletions src/Gateways/IuguGateway.php
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand All @@ -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)) {
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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';
Expand Down
17 changes: 11 additions & 6 deletions src/Models/Invoice.php
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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'])) {
Expand Down Expand Up @@ -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 (
Expand Down
Loading

0 comments on commit e3eff8d

Please sign in to comment.