wirecardBrasil / moip-sdk-php

Cliente em PHP para integração server-side com APIs Moip v2
MIT License
124 stars 90 forks source link

Multipedidos dinâmico #174

Closed raank closed 7 years ago

raank commented 7 years ago

Como adicionar vários produtos no multipedido dinamicamente?

Algo do tipo:

$order = $moip->orders()->setOwnId(uniqid())
                ->addItems([
                    ["bicicleta 1",1, "sku1", 10000],
                    ["bicicleta 2",2, "sku2", 10000],
                    ["bicicleta 3",3, "sku3", 10000],
                ])
                ->setShippingAmount(3000)
                ->setAddition(1000)
                ->setDiscount(5000)
                ->setCustomer($customer)
                ->addReceiver('MPA-VB5OGTVPCI52', 'PRIMARY', NULL);
raank commented 7 years ago

Será que isso não resolve?

Meu código:

    foreach($business['items'] as $product) {
        $products[] = [
            'product' => $product['title'],
            'quantity' => $product['qnt'],
            'detail' => $product['sku'],
            'price' => Helpers::format($product['total'])
        ];
    }

    if(isset($products)) {
        $this->moip->orders()->setOwnId(uniqid())
            ->addItems($products)
            ->setShippingAmount($business['total'])
            ->setAddition($business['adition'])
            ->setDiscount($business['discount'])
            ->setCustomer($this->customer)
            ->addReceiver($business['id'], 'PRIMARY', NULL);
    }

No arquivo: vendor/moip/moip-sdk-php/src/Resource/Orders.php

    /**
     * Adds a new item to order.
     *
     * @param array    $items    Array with Products
     *
     * @return $this
     */
    public function addItems(array $items)
    {

        foreach($items as $item) {
            if (!is_int($item['price'])) {
                throw new \UnexpectedValueException('Informe o valor do item como inteiro');
            }

            if (!is_int($item['quantity']) || $item['quantity'] < 1) {
                throw new \UnexpectedValueException('A quantidade do item deve ser um valor inteiro maior que 0');
            }

            $item = new stdClass();
            $item->product = $item['product'];
            $item->quantity = $item['quantity'];
            $item->detail = $item['detail'];
            $item->price = $item['price'];

            $this->data->items[] = $item;
        }

        return $this;
    }
caiogaspar commented 7 years ago

Olá @raank, tudo bem? Esse método addItems funcionaria, porém não existe na versão atual da nossa SDK. Se você quiser enviar um PR com ele, será muito bem-vindo :)

Existe uma outra forma de enviar vários itens ao pedido, veja abaixo:

$order = $this->moip->orders()->setOwnId(uniqid())
    ->setShippingAmount($business['total'])
    ->setAddition($business['adition'])
    ->setDiscount($business['discount'])
    ->setCustomer($this->customer)
    ->addReceiver($business['id'], 'PRIMARY', NULL);

foreach($business['items'] as $product) {
    $order->addItem($product['title'], $product['qnt'], $product['sku'],  Helpers::format($product['total']));
}

$order->create();

Dessa forma você enviaria os itens dinamicamente, conforme o seu array de itens.

Abs, Caio Gaspar

raank commented 7 years ago

@caiogaspar e como faço com multiorders?

raank commented 7 years ago

@caiogaspar segue meu código. Lembrando que TODOS os dados estão tratados de maneira correta, como manda a Documentação.

    static public function setOrder($customer, $address, $card, $installments = 1)
    {
        try {
            $moip = \Moip::start();

            $birthDate = Carbon::parse(str_replace('/', '-', $customer['birth']));
            $phone = Helpers::phone($customer['phone']);

            $customer = $moip->customers()->setOwnId(uniqid())
                ->setFullname($customer['name'])
                ->setEmail($customer['email'])
                ->setBirthDate($birthDate->format('Y-m-d'))
                ->setTaxDocument(Helpers::format($customer['document_cpf']))
                ->setPhone($phone['area'], $phone['number'])
                ->addAddress('SHIPPING',
                    $address['street'], $address['number'],
                    $address['district'], $address['city'], $address['state'],
                    Helpers::format($address['postalCode']), $address['complement'])
                ->create();

            foreach(Cart::business()->all() as $b) {
                $ordersItem =  $moip->orders()->setOwnId(uniqid())
                    ->setShippingAmount($b['total'])
                    ->setAddition(0)
                    ->setDiscount(0)
                    ->setCustomer($customer)
                    ->addReceiver($b['moip_id'], 'PRIMARY', NULL);

                foreach ($b['items'] as $item) {
                    $value = number_format($item['total'], 2, '.', '');
                    $ordersItem->addItem($item['title'], (int) $item['qnt'], $item['sku'], (int) Helpers::format($value));
                }

                $orders[] = $ordersItem;
            }

            if (isset($orders)) {
                $multiorder = $moip
                    ->multiorders()
                    ->setOwnId(uniqid());

                foreach($orders as $o) {
                    $multiorder->addOrder($o);
                }

                $multiorder->create();

//            $payment = $multiorder->multipayments()
//                ->setCreditCardHash($card['hash'], $customer)
//                ->setInstallmentCount($installments)
//                ->setStatementDescriptor('teste de pag')
//                ->setDelayCapture(false)
//                ->execute();
                return $multiorder;
            } else {
                return null;
            }
        } catch (\Exception $exception) {
            return $exception->__toString();
        }
    }
caiogaspar commented 7 years ago

Olá @raank, você apenas precisaria dividir os itens entre os orders e adicionar esses mesmos orders ao multiorder. Aqui está um exemplo: https://github.com/moip/moip-sdk-php#criando-um-multipedido. Abs, Caio Gaspar