vtex/vtex.js

Melhorar documentação de addItemAttachment

klzns opened this issue · 14 comments

klzns commented

Gostaria de saber as dificuldades enfrentadas com o uso do método de addItemAttachment para melhorar nossa documentação.

Poderiam descrever o cenário para reproduzir o problema que estão tendo? Talvez possa esclarecer as dúvidas e com isso as próximas pessoas não passem pela mesma dificuldade.

Ao usar o addItemAttachment estou recebendo um erro 404 com a mensagem O nome do anexo é inválido. No cadastro do SKU esse anexo já esta associado, como resolver esse erro?

Eu adiciono 10 itens de um SKU no carrinho, logo abaixo desse SKU existe o campo do serviço para que eu possa digitar a informação, quando insiro o valor no campo, o carrinho duplica a linha, sendo a primeira um SKU sem nada no campo de serviço e com 9 unidades e a segunda linha o mesmo SKU, com o campo serviço preenchido e com apenas 1 unidade.

Como faço com que esse serviço seja aplicado as 10 unidades sem duplicar as linhas?

klzns commented

@caljp13
Quanto ao primeiro, poderia adicionar esse item ao carrinho e colocar aqui o orderForm?

Quanto ao segundo comentário, isso é hoje uma limitação da API. Coincidentemente, essas semanas estamos discutindo em mudar esse comportamento para que isso seja possível. Aviso aqui, quando decidirmos isso.

klzns commented

Criei uma issue para o segundo item: #17

Bom dia Breno,

2 coisas que eu acho que poderiam melhorar,

  1. Na documentação, colocar uma descrição os códigos de retorno (erro)
  2. No meu caso, quando eu tenho o mesmo produto (sku) a assinatura da função addItemAttachment(itemIndex, attachmentName, content) não é clara o suficiente para que o desenvolvedor saiba para qual dos itens do carrinho o anexo está sendo inserido. Creio que teria que ter uma assinatura assim:
    addItemAttachment(item, itemIndex, attachmentName, content);
klzns commented

@lucasdall o que seria o primeiro parametro?

@BrenoC

Segue método que estou tentando executar no checkout:
vtexjs.checkout.addItemAttachment(0, 'Configurações', {Largura: '10'})

O SKU possui esses dois anexos:
http://www.evernote.com/l/Agq_59LAOIBC4JlC4DsKU_ZntcJ4Q6rKx98/

Conteúdo do OrderForm:

{
    "orderFormId": "bcc81937fb764bc39be9f63bbea37a6d",
    "salesChannel": "1",
    "loggedIn": false,
    "isCheckedIn": false,
    "storeId": null,
    "allowManualPrice": false,
    "canEditData": true,
    "userProfileId": null,
    "userType": null,
    "ignoreProfileData": false,
    "value": 1600,
    "messages": [],
    "items": [{
        "uniqueId": "12E809239EA74BA7AA4D31B9CE0B60B4",
        "id": "20",
        "productId": "8",
        "refId": "SKU-Demo",
        "name": "Cortina Demo Cadastro SKU Demo",
        "skuName": "SKU Demo",
        "modalType": null,
        "priceValidUntil": null,
        "tax": 0,
        "price": 1600,
        "listPrice": 1800,
        "manualPrice": null,
        "sellingPrice": 1600,
        "rewardValue": 0,
        "isGift": false,
        "additionalInfo": {
            "brandName": "COLUMBIA by HUNTER DOUGLAS",
            "brandId": "2000003",
            "offeringInfo": null,
            "offeringType": null,
            "offeringTypeId": null
        },
        "preSaleDate": null,
        "productCategoryIds": "/10/",
        "productCategories": {
            "10": "CORTINAS JAMIL"
        },
        "defaultPicker": null,
        "handlerSequence": 0,
        "handling": false,
        "quantity": 1,
        "seller": "1",
        "imageUrl": "http://lojavivaonline.vteximg.com.br/arquivos/ids/155398-55-55/rolo03.jpg",
        "detailUrl": "/cortina-demo-cadastro/p",
        "components": [],
        "bundleItems": [],
        "attachments": [],
        "itemAttachment": {
            "name": null,
            "content": {}
        },
        "attachmentOfferings": [{
            "name": "Identificação",
            "required": true,
            "schema": {
                "Ambiente": {
                    "maximumNumberOfCharacters": 10,
                    "domain": []
                },
                "Descrição": {
                    "maximumNumberOfCharacters": 20,
                    "domain": []
                },
                "ID": {
                    "maximumNumberOfCharacters": 2,
                    "domain": []
                }
            }
        }],
        "offerings": [],
        "priceTags": [],
        "availability": "available",
        "measurementUnit": "un",
        "unitMultiplier": 1
    }],
    "selectableGifts": [],
    "products": [],
    "totalizers": [{
        "id": "Items",
        "name": "Total dos Itens",
        "value": 1600
    }],
    "shippingData": {
        "attachmentId": "shippingData",
        "address": null,
        "logisticsInfo": [{
            "itemIndex": 0,
            "selectedSla": null,
            "slas": [],
            "shipsTo": ["BRA"],
            "itemId": "20"
        }],
        "availableAddresses": []
    },
    "clientProfileData": {
        "attachmentId": "clientProfileData",
        "email": null,
        "firstName": null,
        "lastName": null,
        "document": null,
        "documentType": "cpf",
        "phone": null,
        "corporateName": null,
        "tradeName": null,
        "corporateDocument": null,
        "stateInscription": null,
        "corporatePhone": null,
        "isCorporate": false
    },
    "paymentData": {
        "installmentOptions": [{
            "paymentSystem": "201",
            "bin": null,
            "paymentName": null,
            "paymentGroupName": null,
            "value": 1600,
            "installments": [{
                "count": 1,
                "hasInterestRate": false,
                "interestRate": 0,
                "value": 1600,
                "total": 1600,
                "sellerMerchantInstallments": [{
                    "id": "LOJAVIVAONLINE",
                    "count": 1,
                    "hasInterestRate": false,
                    "interestRate": 0,
                    "value": 1600,
                    "total": 1600
                }]
            }]
        }],
        "paymentSystems": [{
            "id": 201,
            "name": "Promissória Exemplo",
            "groupName": "custom201PaymentGroupPaymentGroup",
            "validator": {
                "regex": null,
                "mask": null,
                "cardCodeRegex": null,
                "cardCodeMask": null,
                "weights": null,
                "useCvv": false,
                "useExpirationDate": false,
                "useCardHolderName": false,
                "useBillingAddress": false
            },
            "stringId": "201",
            "template": "custom201PaymentGroupPaymentGroup-template",
            "requiresDocument": false,
            "isCustom": true,
            "description": "Exemplo de meio de pagamento customizado, para finalização de compra e aceite de pedido na VTEX",
            "requiresAuthentication": true,
            "dueDate": "2016-08-03T13:32:04.9603873Z"
        }],
        "payments": [],
        "giftCards": [],
        "giftCardMessages": [],
        "availableAccounts": []
    },
    "marketingData": null,
    "sellers": [{
        "id": "1",
        "name": "lojavivaonline",
        "logo": ""
    }],
    "clientPreferencesData": {
        "attachmentId": "clientPreferencesData",
        "locale": "pt-BR",
        "optinNewsLetter": false
    },
    "storePreferencesData": {
        "countryCode": "BRA",
        "checkToSavePersonDataByDefault": true,
        "templateOptions": {
            "toggleCorporate": false
        },
        "timeZone": "E. South America Standard Time",
        "currencyCode": "BRL",
        "currencyLocale": 1046,
        "currencySymbol": "R$",
        "currencyFormatInfo": {
            "currencyDecimalDigits": 2,
            "currencyDecimalSeparator": ",",
            "currencyGroupSeparator": ".",
            "currencyGroupSize": 3,
            "startsWithCurrencySymbol": true
        }
    },
    "giftRegistryData": null,
    "openTextField": null,
    "ratesAndBenefitsData": {
        "attachmentId": "ratesAndBenefitsData",
        "rateAndBenefitsIdentifiers": [],
        "teaser": []
    }
}

@BrenoC, o primeiro parametro seria o objeto item do orderForm.

Por exemplo, supondo que eu tenha 3 skus no carrinho. O primeiro sku tem quantidade 3, o segundo quantidade 2 e o terceiro quantidade 1.

Teríamos o item assim:

  • orderForm.items[0] e itemIndex = 0 (primeiro sku, posição 1)
  • orderForm.items[0] e itemIndex = 1 (primeiro sku, posição 2)
  • orderForm.items[0] e itemIndex = 2 (primeiro sku, posição 3)
  • orderForm.items[1] e itemIndex = 0 (segundo sku, posição 1)
  • orderForm.items[1] e itemIndex = 1 (segundo sku, posição 2)
  • orderForm.items[2] e itemIndex = 0 (segundo sku, posição 1)
klzns commented

@lucasdall @caljp13 Poderiam ver o #18 e comentarem o que acham?

@lucasdall o itemIndex tem seu indice com base em todo o carrinho e não com base nos skus, por isso que só utilizamos ele nos parâmetros. O vtexjs é só uma camada mais amigável para a API do Checkout. O que você sugere teria que mudar a API do Checkout e, hoje, não é isso que estamos buscando.

Boa tarde, @BrenoC e @lucasdall ! Na verdade, mundo ideal seria adicionar o item ao carrinho com um parâmetro opcional de enviar o anexo junto. Isso melhoraria demais nossas vidas.

klzns commented

@alexandreTrino você fala pela URL de adicionar ao carrinho?

@BrenoC se eu não entendi errado o que falou o @alexandreTrino, seria a possibilidade de adicionar itens ao carrinho enviando um JSON e não chamando a URL /checkout/cart/add, assim nesse JSON já seria possível adicionar um SKU junto com os dados de serviço

Exatamente, @caljp13! Nós escreveríamos, por exemplo @BrenoC :

item = {
    id: 11221,
    quantity: 2,
    seller: 1,
    attachments:
    [
        {
            index:0,
            attachmentName: "nome-1"
            content: "content-1"
        },
        {
            index:1,
            attachmentName: "nome-1"
            content: "content-1"
         }
    ]    
};
myItems.push(item);
vtexjs.checkout.getOrderForm().done(function(order){
    return vtexjs.checkout.addToCart(myItems).done(function(){
    console.log("adicionou ao carrinho!");
});

O que acham? resumiria mais o código e evitaria alguns bugs por aí, talvez.

klzns commented

@caljp13 @alexandreTrino

Vi que o método addToCart não retorna informações necessárias para poder fazer algo como:

var item = {
  id: 26,
  quantity: 1,
  seller: 1
};

vtexjs.checkout.addToCart([item], null, 1)
  .then(function(orderForm) {
    var itemIndex = 0; // Não temos certeza do index do item que acabamos de adicionar
    var attachmentName = 'Customizacao';
    var attachment = { Nome: 'Teste' };
    return vtexjs.checkout.addItemAttachment(itemIndex, attachmentName, attachment);
  })
  .then(function(orderForm) {
    console.log(orderForm);
  });

Estou conversando com o time da API para retornar algo que torne isso possível. Algo como:

var item = {
  id: 26,
  quantity: 1,
  seller: 1
};

vtexjs.checkout.addToCart([item], null, 1)
  .then(function(orderForm) {
    var addedItemsIndex = orderForm.addedItemsIndex; // Propriedade que teria um array com indices dos items adicionados no carrinho
    var itemIndex = addedItemsIndex[0];
    var attachmentName = 'Customizacao';
    var attachment = { Nome: 'Teste' };
    return vtexjs.checkout.addItemAttachment(itemIndex, attachmentName, attachment);
  })
  .then(function(orderForm) {
    console.log(orderForm);
  });