Skip to content

Instantly share code, notes, and snippets.

@reginaldojunior
Created March 15, 2017 19:23
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save reginaldojunior/dd530cf3cb5bd2ef74e6d4a0ee317fcc to your computer and use it in GitHub Desktop.
Save reginaldojunior/dd530cf3cb5bd2ef74e6d4a0ee317fcc to your computer and use it in GitHub Desktop.
classebemlouca.php
<?php
class Product extends Eloquent
{
/**
* The database table used by the model.
*
* @var string
*/
protected $table = 'products';
protected $dates = ['deleted_at'];
protected $b2w;
protected $plugg;
protected $atributteAllowed;
public $debug = false;
// product creatiation
protected $error;
protected $productAttribute;
// Shares
protected $share_price = null;
protected $share_description = null;
protected $share_title = null;
protected $share_available_quantity = null;
protected $share_dimensions = null;
protected $share_imagens = null;
protected $user_attributes = null;
protected $product;
protected $result;
protected $userId;
protected $countVariance;
// new variations
protected $fillable = array('id', 'extra_id', 'pluggto_id', 'user_id', 'extra_token', 'sku', 'productIdOrigin', 'sellingTitle',
'brand', 'ean');
// used to register observers
public static function boot()
{
parent::boot();
Product::observe(new Observer);
}
public function loadPlugg($user_id = null)
{
if (empty($this->plugg)) {
if (empty($user_id)) {
$this->plugg = loadClass('Plugg');
} else {
$this->plugg = new Plugg($user_id);
}
}
}
//
public function getUserAttributes()
{
if (is_null($this->user_attributes)) {
$this->user_attributes = DB::table('user_attributes')->where('user_id', $this->plugg->id)->get();
}
$attribues = array();
foreach ($this->user_attributes as $att) {
$possibleAttributes = explode(',', $att->pluggto_code);
foreach ($possibleAttributes as $possible) {
$attribues[$possible] = $att->b2w_code;
}
}
return $attribues;
}
public function getProductAttributes($productAttributes,$product)
{
if (!is_array($productAttributes)) {
return '';
}
$this->getAllowedAttributes();
$Userattributes = $this->getUserAttributes();
$returnAtt = array();
$attrArray = array();
foreach ($productAttributes as $attribute) {
$att = array();
if (isset($Userattributes[$attribute['code']]) && !empty($Userattributes[$attribute['code']]) //&&
// in_array($Userattributes[$attribute['code']], $this->atributteAllowed)
) {
$att = array();
$att['name'] = $Userattributes[$attribute['code']];
$attrArray[] = $Userattributes[$attribute['code']];
if (isset($attribute['value']['code']) && !empty($attribute['value']['code'])) {
$att['value'] = $attribute['value']['code'];
} elseif (isset($attribute['value']['label']) && !empty($attribute['value']['label'])) {
$att['value'] = $attribute['value']['label'];
} else {
$att['value'] = 'unico';
}
}
if (!empty($att)) {
$returnAtt[] = $att;
}
}
foreach ($product['attributes'] as $attribute) {
$att = array();
if (isset($Userattributes[$attribute['code']]) && !empty($Userattributes[$attribute['code']]) //&&
// in_array($Userattributes[$attribute['code']], $this->atributteAllowed)
) {
$att = array();
$att['name'] = $Userattributes[$attribute['code']];
$attrArray[] = $Userattributes[$attribute['code']];
if (isset($attribute['value']['code']) && !empty($attribute['value']['code'])) {
$att['value'] = $attribute['value']['code'];
} elseif (isset($attribute['value']['label']) && !empty($attribute['value']['label'])) {
$att['value'] = $attribute['value']['label'];
} else {
$att['value'] = 'unico';
}
}
if (!empty($att)) {
$returnAtt[] = $att;
}
}
if (in_array('TAMANHO', $attrArray) && !in_array('COR', $attrArray)) {
if (isset($att['value'])) {
$cor['name'] = 'COR';
if (!empty($this->productAttribute)) {
foreach ($this->productAttribute as $att) {
if ($att['name'] == 'COR') {
$cor['value'] = $att['value'];
}
}
$returnAtt[] = $cor;
}
}
} elseif (!in_array('TAMANHO', $attrArray) && in_array('COR', $attrArray)) {
if (isset($att['value'])) {
$tam['name'] = 'TAMANHO';
if (!empty($this->productAttribute)) {
foreach ($this->productAttribute as $att) {
if ($att['name'] == 'TAMANHO') {
if (isset($att['value'])) $tam['value'] = $att['value'];
}
$returnAtt[] = $tam;
}
}
}
}
if(in_array('MARCA', $this->atributteAllowed) && isset($product['brand'])){
$returnAtt[] = array('name'=>'MARCA','value'=>$product['brand']);
}
return $returnAtt;
}
// Função que verifica se EAN possui 13 digitos e é numerico
public function validaEan($string)
{
if (is_numeric($string) && strlen($string) == 13) {
return true;
} else {
$this->error[] = 'Campo ean deve ser númerico com 13 dígitos';
}
}
// Função, que a apartir do retorno de erro da B2W, formata para o Pluggto
public function generateB2wError($errors)
{
foreach ($errors as $error) {
$this->error[] = 'Erro retornado da B2W: ' . $error['message'] . ' campo: ' . $error['fieldName'];
}
}
// pega os atributos do produto
public function getAllowedAttributes()
{
if (empty($this->atributteAllowed)) {
$this->atributteAllowed = array();
$b2w = new B2w();
$categoryId = Session::get('category');
if (!empty($categoryId)) {
$attributes = $b2w->request('marketstructure/category/' . $categoryId . '/attribute', 'GET');
} else {
// $attributes = $b2w->request('marketstructure/category/9999/attribute', 'GET');
$attributes = null;
}
if (isset($attributes['body']) && is_array($attributes['body'])) {
foreach ($attributes['body'] as $att) {
if(isset($att['name'])){
$this->atributteAllowed[] = $att['name'];
}
}
}
}
if (!in_array('COR', $this->atributteAllowed)) {
$this->atributteAllowed[] = "COR";
}
if (!in_array('TAMANHO', $this->atributteAllowed)) {
$this->atributteAllowed[] = "TAMANHO";
}
return $this->atributteAllowed;
}
public function checkPrice($price, $user,$field='price',$productData,$variation=null,$tablePriceName=null)
{
if(!is_object($user)){
try{
$user = User::where('plugg_id',$user)->firstOrFail();
} catch (exception $e){
// not found user, just return the price
return $this->numberFormat($price);
}
}
if(!empty($tablePriceName)){
$tablepriceName = $tablePriceName;
} else if(isset($user->table_data)){
$tablepriceName = $user->table_data;
} elseif(isset($user->b2w->table_data)) {
$tablepriceName = $user->b2w->table_data;
} else {
$tablepriceName = null;
}
if(!empty($tablepriceName)){
if(isset($variation['price_table']) && is_array($variation['price_table'])) {
foreach($variation['price_table'] as $table){
if($table['code'] == $tablepriceName){
if(!isset($table['action'])){
continue;
}
if($table['action'] == 'overwrite' && !empty($field)){
if($field == 'price' && isset($table['price']) && !empty($table['price'])){
$fprice = $table['price'];
} else if($field == 'special_price' && isset($table['special_price']) && !empty($table['special_price'])){
$fprice = $table['special_price'];
} else if($field == 'special_price' && isset($table['special_price']) && !empty($table['price'])){
$fprice = $table['price'];
}
} else if ($table['action'] == 'increase' && isset($table['percentage']) && !empty($table['percentage'])){
$fprice = $price + ($price * ($table['percentage'] / 100));
} else if ($table['action'] == 'decrease' && isset($table['percentage']) && !empty($table['percentage'])){
$fprice = $price - ($price * ($table['percentage'] / 100));
}
if (isset($fprice) && $fprice > 0) {
return $this->numberFormat($fprice);
}
}
}
} else if(isset($productData['price_table']) && is_array($productData['price_table'])){
foreach($productData['price_table'] as $table){
if($table['code'] == $tablepriceName){
if(!isset($table['action'])){
continue;
}
if($table['action'] == 'overwrite' && !empty($field)){
if($field == 'price' && isset($table['price']) && !empty($table['price'])){
$fprice = $table['price'];
} else if($field == 'special_price' && isset($table['special_price']) && !empty($table['special_price'])){
$fprice = $table['special_price'];
} else if($field == 'special_price' && isset($table['special_price']) && !empty($table['price'])){
$fprice = $table['price'];
}
} else if ($table['action'] == 'increase' && isset($table['percentage']) && !empty($table['percentage'])){
$fprice = $price + ($price * ($table['percentage'] / 100));
} else if ($table['action'] == 'decrease' && isset($table['percentage']) && !empty($table['percentage'])){
$fprice = $price - ($price * ($table['percentage'] / 100));
}
if (isset($fprice) && $fprice > 0) {
return $this->numberFormat($fprice);
}
}
}
}
}
if (!empty($user->dec_inc)) {
if (!empty($user->porcentagem)) {
if ($user->dec_inc == 'dec') {
$fprice = $price - ($price * ($user->porcentagem / 100));
} elseif ($user->dec_inc == 'inc') {
$fprice = $price + ($price * ($user->porcentagem / 100));
}
if ($fprice > 0) {
$price = $fprice;
}
}
}
return $this->numberFormat($price);
}
public function formatPriceManul($get_valor)
{
$source = array('.', ',');
$replace = array('', '.');
$valor = str_replace($source, $replace, $get_valor); //remove os pontos e substitui a virgula pelo ponto
return self::numberFormat($valor, 2, '.', ''); //retorna o valor formatado para gravar no banco
}
public static function numberFormat($number)
{
return number_format($number, 2, '.', '');
}
public static function formatImagesOrder($ProductPhotos)
{
$photoArray = array();
foreach ($ProductPhotos as $onephoto) {
if (isset($onephoto['order'])) {
$photoArray[(int)$onephoto['order']] = $onephoto;
} else {
$photoArray[] = $onephoto;
}
}
// sort array
ksort($photoArray);
return $photoArray;
}
public function checkIfPriceIsBiggerThanSpecialPrice($price,$specialPrice){
if(empty($specialPrice) || $specialPrice == '0.00' ){
$specialPrice = $price;
}
if ($specialPrice > $price) {
$specialPrice = $price;
}
return $specialPrice;
}
public function getBrandPrice($product,$variacao=null){
$brandPrice = array();
if(isset($this->plugg->b2w->table_data_lojasamericans)){
if(isset($variacao['price']) && isset($variacao['special_price'])){
$specialprice = $this->checkPrice($variacao['special_price'], $this->plugg,'special_price',$product,$variacao,$this->plugg->b2w->table_data_lojasamericans);
} else {
$specialprice = $this->checkPrice($product['special_price'], $this->plugg,'special_price',$product,null,$this->plugg->b2w->table_data_lojasamericans);
}
if(isset($variacao['price']) && isset($variacao['special_price'])){
$price = $this->checkPrice($variacao['price'], $this->plugg,'price',$product,$variacao,$this->plugg->b2w->table_data_lojasamericans);
} else {
$price = $this->checkPrice($product['price'], $this->plugg,'price',$product,null,$this->plugg->b2w->table_data_lojasamericans);
}
$specialprice = $this->checkIfPriceIsBiggerThanSpecialPrice($price,$specialprice);
if(!empty($price) && !empty($specialprice)){
$brandPrice[] = array('store'=>'LOJASAMERICANAS','listPrice'=>$price,'sellPrice'=>$specialprice);
}
}
if(isset($this->plugg->b2w->table_data_submarino)){
if(isset($variacao['price']) && isset($variacao['special_price'])){
$specialprice = $this->checkPrice($variacao['special_price'], $this->plugg,'special_price',$product,$variacao,$this->plugg->b2w->table_data_submarino);
} else {
$specialprice = $this->checkPrice($product['special_price'], $this->plugg,'special_price',$product,null,$this->plugg->b2w->table_data_submarino);
}
if(isset($variacao['price']) && isset($variacao['special_price'])){
$price = $this->checkPrice($variacao['price'], $this->plugg,'price',$product,$variacao,$this->plugg->b2w->table_data_submarino);
} else {
$price = $this->checkPrice($product['price'], $this->plugg,'price',$product,null,$this->plugg->b2w->table_data_submarino);
}
$specialprice = $this->checkIfPriceIsBiggerThanSpecialPrice($price,$specialprice);
if(!empty($price) && !empty($specialprice)){
$brandPrice[] = array('store'=>'SUBMARINO','listPrice'=>$price,'sellPrice'=>$specialprice);
}
}
if(isset($this->plugg->b2w->table_data_shoptime)){
if(isset($variacao['price']) && isset($variacao['special_price'])){
$specialprice = $this->checkPrice($variacao['special_price'], $this->plugg,'special_price',$product,$variacao,$this->plugg->b2w->table_data_shoptime);
} else {
$specialprice = $this->checkPrice($product['special_price'], $this->plugg,'special_price',$product,null,$this->plugg->b2w->table_data_shoptime);
}
if(isset($variacao['price']) && isset($variacao['special_price'])){
$price = $this->checkPrice($variacao['price'], $this->plugg,'price',$product,$variacao,$this->plugg->b2w->table_data_shoptime);
} else {
$price = $this->checkPrice($product['price'], $this->plugg,'price',$product,null,$this->plugg->b2w->table_data_shoptime);
}
$specialprice = $this->checkIfPriceIsBiggerThanSpecialPrice($price,$specialprice);
if(!empty($price) && !empty($specialprice)){
$brandPrice[] = array('store'=>'SHOPTIME','listPrice'=>$price,'sellPrice'=>$specialprice);
}
}
if(isset($this->plugg->b2w->table_data_soubarato)){
if(isset($variacao['price']) && isset($variacao['special_price'])){
$specialprice = $this->checkPrice($variacao['special_price'], $this->plugg,'special_price',$product,$variacao,$this->plugg->b2w->table_data_soubarato);
} else {
$specialprice = $this->checkPrice($product['special_price'], $this->plugg,'special_price',$product,null,$this->plugg->b2w->table_data_soubarato);
}
if(isset($variacao['price']) && isset($variacao['special_price'])){
$price = $this->checkPrice($variacao['price'], $this->plugg,'price',$product,$variacao,$this->plugg->b2w->table_data_soubarato);
} else {
$price = $this->checkPrice($product['price'], $this->plugg,'price',$product,null,$this->plugg->b2w->table_data_soubarato);
}
$specialprice = $this->checkIfPriceIsBiggerThanSpecialPrice($price,$specialprice);
if(!empty($price) && !empty($specialprice)){
$brandPrice[] = array('store'=>'SOUBARATO','listPrice'=>$price,'sellPrice'=>$specialprice);
}
}
return $brandPrice;
}
public function removeNotAllowedTags($description)
{
$description = preg_replace('/class=".*?"/', '', $description);
//Substitui as tags
//Chave do array = tag que deseja substituir
//Valor do array = nova tag
$tags_to_replace = array(
'<li>' => '<p>-',
'</li>' => '</p>',
'<p>&nbsp;</p>' => ''
);
//Substitui as tags conforme array acima
$description = strtr($description, $tags_to_replace);
//Remove todas as tags que não estejam sendo passadas no método
$description = strip_tags($description, '<br><b><p><strong><i>');
//Substitui todos os caracteres especiais em HTML (&nbsp, &atilde ... e todos os outros ...)
$description = html_entity_decode($description);
return $description;
return strip_tags($description, '<b></b><strong></strong><i></i><br></br><p></p>');
}
// Envia skus para o b2w em massa
public function createSku($id_product, $product, $options, $variacao = false, $manual = true)
{
if ($variacao) {
$productSku = Sku::firstOrNew(array('sku' => $variacao['sku']));
$productSku->push();
$productSku->pluggto_id = $product['id'];
$var['id'] = $productSku->id;
$sku = $variacao['sku'];
} else {
$productSku = Sku::firstOrNew(array('sku' => $product['sku']));
$productSku->push();
$sku = $product['sku'];
}
if (!empty($sku)) {
$productSku->sku = $sku;
}
$productSku->user_id = $this->plugg->id;
if ($this->plugg->origin_sku) {
$var['id'] = $this->formateSkuToB2w($productSku->sku);
$productSku->b2w_sku = $this->formateSkuToB2w($productSku->sku);
} else {
$productSku->b2w_sku = $productSku->id;
$var['id'] = $productSku->id;
}
$productSku->product_id = $id_product;
// Product Name
if (isset($options['name'])) {
$this->share_title = false;
$productSku->name = $options['name'];
$var['name'] = $options['name'];
} elseif (isset($variacao['name']) && !empty($variacao['name'])) {
$productSku->name = $variacao['name'];
$var['name'] = $variacao['name'];
} else {
$productSku->name = $product['name'];
$var['name'] = $product['name'];
}
if (isset($options['description'])) {
$this->share_description = false;
$var['description'] = $options['description'];
$productSku->description = $options['description'];
} else {
$var['description'] = $this->removeNotAllowedTags($product['description']);
$productSku->description = $this->removeNotAllowedTags($product['description']);
}
// Peso e medidas
if (isset($options['weight']) && $options['weight'] != 0) {
$this->share_dimensions = false;
$weight = $options['weight'];
} elseif (isset($product['dimension']['weight']) &&
!empty($product['dimension']['weight']) &&
$product['dimension']['weight'] != 0
) {
$weight = $product['dimension']['weight'];
} else {
$weight = 1;
}
if (isset($options['height']) && $options['height'] != 0) {
$this->share_dimensions = false;
$height = $options['height'];
} elseif (isset($product['dimension']['height']) &&
!empty($product['dimension']['height']) &&
$product['dimension']['height'] != 0
) {
$height = $product['dimension']['height'];
}
if (isset($options['lenght']) && $options['lenght'] != 0) {
$this->share_dimensions = false;
$lenght = $options['lenght'];
} elseif (isset($product['dimension']['length']) &&
!empty($product['dimension']['length']) &&
$product['dimension']['length'] != 0
) {
$lenght = $product['dimension']['length'];
}
if (isset($options['width']) && $options['width'] != 0) {
$this->share_dimensions = false;
$width = $options['width'];
} elseif (isset($product['dimension']['width']) &&
!empty($product['dimension']['width']) &&
$product['dimension']['width'] != 0
) {
$width = $product['dimension']['width'];
}
if (isset($weight)) {
if ($this->plugg->peso == 'Kilo') {
$var['weight'] = (float)$weight;
$productSku->weight = (float)$weight;
} else {
$var['weight'] = (float)$weight / 1000;
$productSku->weight = (float)$var['weight'];
}
}
if (isset($width)) {
if ($this->plugg->dimensions == 'Metros') {
$var['width'] = (float)$width;
$productSku->width = $width;
} else {
$var['width'] = (float)$width / 100;
$productSku->width = $var['width'];
}
}
if (isset($lenght)) {
if ($this->plugg->dimensions == 'Metros') {
$var['length'] = (float)$lenght;
$productSku->length = $lenght;
} else {
$var['length'] = (float)$lenght / 100;
$productSku->length = $var['length'];
}
}
if (isset($height)) {
if ($this->plugg->dimensions == 'Metros') {
$var['height'] = (float)$height;
$productSku->height = $height;
} else {
$var['height'] = (float)$height / 100;
$productSku->height = $var['height'];
}
}
if (isset($options['quantity'])) {
$this->share_available_quantity = false;
$var['stockQuantity'] = (int)$options['quantity'];
$productSku->quantity = (int)$options['quantity'];
} elseif ($variacao && isset($variacao['quantity'])) {
$var['stockQuantity'] = (int)$variacao['quantity'];
$productSku->quantity = (int)$variacao['quantity'];
} else {
$var['stockQuantity'] = (int)$product['quantity'];
$productSku->quantity = (int)$product['quantity'];
}
if ($var['stockQuantity'] > 0) {
$var['enable'] = true;
$productSku->enable = true;
} else {
$var['enable'] = false;
$productSku->enable = false;
}
// preço POR R$ ....
// primeiro das opcoes
if (isset($options['sale_price'])) {
$this->share_price = false;
$var['price']['sellPrice'] = $this->formatPriceManul($options['sale_price']);
$productSku->special_price = false;
// 2 - do preco espcial da variacao , caso exista e nao esteja zerada
} elseif (isset($variacao['special_price']) && !empty($variacao['special_price'])) {
$var['price']['sellPrice'] = $this->checkPrice($variacao['special_price'], $this->plugg,'special_price',$product,$variacao);
$productSku->special_price = $var['price']['sellPrice'];
// 3 - da preoco especial do produto , caso exista e nao esteja zerada
} elseif(isset($product['special_price']) && !empty($product['special_price'])) {
$var['price']['sellPrice'] = $this->checkPrice($product['special_price'], $this->plugg,'special_price',$product,$variacao);
$productSku->special_price = $var['price']['sellPrice'];
// 4 - da preoco da variacao , caso exista e nao esteja zerada
} elseif(isset($variacao['price']) && !empty($variacao['price'])) {
$var['price']['sellPrice'] = $this->checkPrice($variacao['price'], $this->plugg,'price',$product,$variacao);
$productSku->special_price = $var['price']['sellPrice'];
// 5 - da preco da produto
} else {
$var['price']['sellPrice'] = $this->checkPrice($product['price'], $this->plugg,'price',$product,$variacao);
$productSku->special_price = $var['price']['sellPrice'];
}
// Preço DE R$
if (isset($options['price'])) {
$this->share_sale_price = false;
$var['price']['listPrice'] = $this->formatPriceManul($options['price']);
$productSku->price = $this->formatPriceManul($options['price']);
} else {
$var['price']['listPrice'] = $this->checkPrice($product['price'], $this->plugg,'special_price',$product,$variacao);
$productSku->price = $var['price']['listPrice'];
}
if ($var['price']['listPrice'] < $var['price']['sellPrice']) {
$var['price']['listPrice'] = $var['price']['sellPrice'];
}
$brandPrice = $this->getBrandPrice($product,$var);
if(!empty($brandPrice)){
$var['brandPrices'] = $brandPrice;
}
if ($variacao && isset($variacao['photos']) && is_array($variacao['photos']) && !empty($variacao['photos'])) {
$count = 0;
$VariProductPhotos = $this->formatImagesOrder($variacao['photos']);
foreach ($VariProductPhotos as $photo) {
$var['urlImage'][] = $photo['url'];
$count++;
if ($count >= 4) {
break;
}
}
} else {
$count = 0;
$ProductPhotos = $this->formatImagesOrder($product['photos']);
foreach ($ProductPhotos as $photo) {
$var['urlImage'][] = $photo['url'];
$count++;
if ($count >= 4) {
break;
}
}
}
$variance = $this->countVariance;
$productSku->variance = $variance;
$var['variance'] = $this->countVariance;
if (isset($options['handlingTime'])) {
$var['crossDocking'] = $options['handlingTime'];
$productSku->crossdocking = $options['handlingTime'];
} elseif (!empty($product['handling_time'])) {
$var['crossDocking'] = $product['handling_time'];
$productSku->crossdocking = $product['handling_time'];
} else {
$var['crossDocking'] = $this->plugg->b2w->crossdoking;
$productSku->crossdocking = $this->plugg->b2w->crossdoking;
}
if ($variacao) {
if($this->plugg->b2w->send_ean){
if (isset($options['ean']) && !empty($options['ean'])) {
$var['ean'][] = $options['ean'];
$productSku->ean = $options['ean'];
} elseif (isset($variacao['ean']) && !empty($variacao['ean'])) {
$var['ean'][] = (int)$variacao['ean'];
$productSku->ean = (int)$variacao['ean'];
} elseif ($this->plugg->validate_ean) {
$this->error[] = 'É obrigatório o cadastro do EAN do produto, verifique SKU ' . $sku;
} else {
if ($manual) {
$var['marketStructure'] = $this->getMarketStructure();
}
}
} else {
if ($manual) {
$var['marketStructure'] = $this->getMarketStructure();
}
}
} else {
if($this->plugg->b2w->send_ean){
if (isset($options['ean']) && !empty($options['ean']) ) {
$var['ean'][] = (int)$options['ean'];
$productSku->ean = (int)$options['ean'];
} elseif (isset($product['ean']) && !empty($product['ean']) && !empty($product['ean'])) {
$var['ean'][] = (int)$product['ean'];
$productSku->ean = (int)$product['ean'];
} elseif ($this->plugg->validate_ean) {
$this->error[] = 'É obrigatório o cadastro do EAN do produto, verifique SKU ' . $sku;
} else {
$var['marketStructure'] = $this->getMarketStructure();
}
} else {
$var['marketStructure'] = $this->getMarketStructure();
}
}
$marketStructure = $this->getMarketStructure();
if(!empty($marketStructure)){
$var['marketStructure'] = $this->getMarketStructure();
}
if (isset($var['urlImage'])) {
$productSku->images = json_encode($var['urlImage']);
}
if ($variacao) {
$var['attributeValues'] = $this->getProductAttributes($variacao['attributes'],$product);
if (empty($var['attributeValues'])) {
unset($var['attributeValues']);
} else {
$productSku->atributes = json_encode($var['attributeValues']);
}
} else {
$var['attributeValues'] = $this->getProductAttributes($product['attributes'],$product);
if (empty($var['attributeValues'])) {
unset($var['attributeValues']);
} else {
$productSku->atributes = json_encode($var['attributeValues']);
}
}
if (empty($this->error)) {
$productSku->situation = 'NOT_INDEXED';
$productSku->save();
}
return $var;
}
function tirarAcentos($string){
return preg_replace(array("/(á|à|ã|â|ä)/","/(Á|À|Ã|Â|Ä)/","/(é|è|ê|ë)/","/(É|È|Ê|Ë)/","/(í|ì|î|ï)/","/(Í|Ì|Î|Ï)/","/(ó|ò|õ|ô|ö)/","/(Ó|Ò|Õ|Ô|Ö)/","/(ú|ù|û|ü)/","/(Ú|Ù|Û|Ü)/","/(ñ)/","/(Ñ)/","/(&)/",'/;/'),explode(" ","a A e E i I o O u U n N - "),$string);
}
public function formateSkuToB2w($sku){
return $this->tirarAcentos(str_replace(' ','',$sku));
}
// pega a estrutura de marketing / categorias
public function getMarketStructure()
{
$categoryId = Session::get('category');
$subCategoryId = Session::get('subcategory');
$familyId = Session::get('family');
$subfamilyId = Session::get('subfamily');
if (!empty($categoryId) &&
!empty($subCategoryId) &&
!empty($familyId) &&
!empty($subfamilyId)
) {
return array(
'categoryId' => (int)$categoryId,
'subCategoryId' => (int)$subCategoryId,
'familyId' => (int)$familyId,
'subFamilyId' => (int)$subfamilyId,
);
} else {
return array();
$this->error[] = 'Para produtos sem EAN é obrigatório informar a categoria do produto na B2W.';
}
}
// envia produto para a b2w
public function createProduct($product, $options)
{
$this->loadPlugg();
$this->countVariance = 0;
if (!is_array($product)) {
$product = $this->plugg->request('products/' . $product, 'GET', array(), 'query');
}
$item = Product::firstOrNew(array('pluggto_id' => $product['id']));
$this->error = array();
$item->user_id = $this->plugg->id;
// PRODUCT
// ID
if ($this->plugg->origin_sku) {
$item->sku = $product['sku'];
$toB2w['id'] = $this->formateSkuToB2w($product['sku']);
$item->b2w_sku = $toB2w['id'];
} else {
$toB2w['id'] = $product['id'];
$item->b2w_sku = $toB2w['id'];
$item->sku = $toB2w['id'];
}
// BRAND
if (isset($options['brand'])) {
$this->share_brand = false;
$toB2w['manufacturer']['name'] = $options['brand'];
$item->manufactory_name = $options['brand'];
} elseif (isset($product['brand']) && !empty($product['brand'])) {
$toB2w['manufacturer']['name'] = $product['brand'];
$item->manufactory_name = $product['brand'];
} else {
$this->error[] = 'Brand cannot be empty';
}
// DELIVERY TYPE
if (isset($options['deliveryType'])) {
$toB2w['deliveryType'] = $options['deliveryType'];
$item->delivery_type = $options['deliveryType'];
} elseif (isset($product['deliveryType']) && !empty($product['deliveryType'])) {
switch ($product['deliveryType']):
case 'withdrawInStore';
$toB2w['deliveryType'] = 'WITHDRAW';
$item->delivery_type = 'WITHDRAW';
break;
case 'post':
$toB2w['deliveryType'] = 'SHIPMENT';
$item->delivery_type = 'SHIPMENT';
break;
case 'both':
$toB2w['deliveryType'] = 'ALL';
$item->delivery_type = 'ALL';
break;
endswitch;
} else {
$item->delivery_type = $this->plugg->b2w->deliveryType;
$toB2w['deliveryType'] = $this->plugg->b2w->deliveryType;
}
// Product Name
if (isset($options['name'])) {
$this->share_title = false;
$toB2w['name'] = $options['name'];
$item->name = $options['name'];
} else {
$item->name = $product['name'];
$toB2w['name'] = $product['name'];
}
// NBM
if (isset($product['nbm']) && !empty($product['nbm'])) {
$toB2w['nbm']['number'] = $product['nbm'];
$item->nbm_number = $product['nbm'];
}
if (isset($product['origin']) && !empty($product['origin'])) {
$toB2w['nbm']['origin'] = $product['origin'];
$item->nbm_origin = $product['origin'];
} else {
$toB2w['nbm']['origin'] = $this->plugg->b2w->origin;
$item->nbm_origin = $this->plugg->b2w->origin;
}
// Skus
$this->productAttribute = $this->getProductAttributes($product['attributes'],$product);
if (isset($product['variations']) && is_array($product['variations'])
&& !empty($product['variations'])
) {
foreach ($product['variations'] as $vari) {
$toB2w['sku'][] = $this->createSku($item->id, $product, $options, $vari);
$this->countVariance++;
}
} else {
$toB2w['sku'][] = $this->createSku($item->id, $product, $options);
}
$b2w = new B2w();
//debug($toB2w);die;
// retorna erro
if (!empty($this->error)) {
return $this->returnError($product, 'html', $item);
}
$item->push();
$result = $b2w->request('product', 'POST', $toB2w, 'jsonCreate');
// retry 3 times in case of error at b2w
if ($result['status']['http_code'] != 201 && isset($result['body']['message'])) {
$result = $b2w->request('product', 'POST', $toB2w, 'jsonCreate');
if ($result['status']['http_code'] != 201 && isset($result['body']['message'])) {
$result = $b2w->request('product', 'POST', $toB2w, 'jsonCreate');
}
}
if ($result['status']['http_code'] == 201) {
$toPlugg = array(
'available' => 1,
'update' => 0,
);
try {
$plugg = new Plugg($item->user_id);
$plugg->request('products/' . $item->pluggto_id, 'PUT', $toPlugg);
} catch (exception $e) {
}
if (isset($result['header']['location'])) {
$item->location = $result['header']['location'];
$item->save();
$skusOks = Sku::where('pluggto_id', $item->pluggto_id)->get();
// seta o status do sku sem erro
foreach ($skusOks as $skusOk) {
$skusOk->status = 'enviado';
$skusOk->error_mensage = null;
$skusOk->save();
}
return;
} else {
$this->error[] = 'Ocorreu um erro inesperado, tente novamente';
return $this->returnError($product, 'html', $item);
}
} else {
$skusErros = Sku::where('pluggto_id', $item->pluggto_id)->get();
foreach ($skusErros as $skerror) {
if (isset($result['body']['message'])) {
$skerror->error_mensage = $result['body']['message'];
} else {
$skerror->error_mensage = 'Erro não informado pela B2W';
}
$skerror->status = 'error';
$skerror->enable = 0;
$skerror->save();
}
$item->status = 'error';
$item->push();
if (isset($result['body']['message'])) {
if (!empty($result['body']['message'])) {
$this->error[] = $result['body']['message'];
}
} else {
$this->error[] = 'Ocorreu um problema interno na B2W, tente novamente mais tarde';
}
if (isset($result['body']['validationErrors'])) {
$this->generateB2wError($result['body']['validationErrors']);
}
return $this->returnError($product, null, $item);
}
}
public function returnError($product, $type = 'html', $item)
{
if (is_array($this->error) && !empty($this->error)) {
if ($type == 'html') {
$error = implode('<br>', $this->error);
} else {
$error = implode('/n', $this->error);
}
} else {
$error = $this->error;
}
$result['erro']['description'] = $error;
$result['erro']['sellingTitle'] = $product['name'];
$result['erro']['pluggid'] = $product['id'];
$result['erro']['status'] = 'error';
$result['erro']['product'] = $item;
return $result;
}
// from extra
public function saveManual($item, $POST)
{
if ($item->has_vari) {
if (isset($POST['variacao'])) {
$toreturn = array();
$toreturn['status'] = 'success';
foreach ($POST['variacao'] as $key => $variacoes) {
$findItem = ItemVari::where('pluggto_id', $key)->firstOrFail();
$retorno = $this->manualChange($findItem, $variacoes);
if ($retorno['status'] == 'fail') {
$toreturn['status'] = 'fail';
$toreturn['response'] = $retorno['response'];
}
}
return $toreturn;
}
} else {
return $this->manualChange($item, $POST);
}
}
public function joinAllProduct($user_id = null)
{
$b2w = new B2w($user_id);
$page = 0;
$productsArray = array();
$showing = 0;
do {
$body = array();
$body['offset'] = $page;
$body['limit'] = 50;
$resource = $b2w->request('sku', 'GET', $body, 'query');
$status = $resource['status']['http_code'];
if ($status == 200) {
$showing = count($resource['body']['skus']);
$page = $page + $body['limit'];
$productsArray = array_merge($productsArray, $resource['body']['skus']);
$already = $showing + count($productsArray);
} else if($status == 423){
if(isset($resource['body']['message']) && !empty($resource['body']['message'])){
throw new exception($resource['body']['message']);
}
}
} while ($showing > 0 && $status == 200);
return $productsArray;
}
public function CreateOnPluggto($sku, $userid)
{
try {
$plugg = new Plugg($userid);
} catch (exception $e) {
return false;
}
if (isset($sku['id'])) $body['sku'] = $sku['id'];
if (isset($sku['name'])) $body['name'] = $sku['name'];
if (isset($sku['description'])) $body['description'] = $sku['description'];
if (isset($sku['ean'][0])) $body['ean'] = $sku['ean'][0];
if (isset($sku['height'])) $body['dimension']['height'] = $sku['height'];
if (isset($sku['width'])) $body['dimension']['width'] = $sku['width'];
if (isset($sku['length'])) $body['dimension']['length'] = $sku['length'];
if (isset($sku['weight'])) $body['dimension']['weight'] = $sku['weight'];
if (isset($sku['stockQuantity'])) $body['quantity'] = $sku['stockQuantity'];
if (isset($sku['enable'])) $body['available'] = $sku['enable'];
if (isset($sku['price']['listPrice'])) $body['price'] = $sku['price']['listPrice'];
if (isset($sku['price']['sellPrice'])) $body['special_price'] = $sku['price']['sellPrice'];
if (isset($sku['urlImage'])) {
$i = 0;
foreach ($sku['urlImage'] as $img) {
$i++;
$tophotos[] = array('url' => $img, 'order' => (int)$i);
}
}
if (isset($sku['attributeValues'])) {
$attributes = array();
foreach ($sku['attributeValues'] as $att) {
$thisatt = array();
$thisatt['value']['code'] = $att['value'];
$thisatt['code'] = $att['name'];
$attributes[] = $thisatt;
}
$body['attributes'] = $attributes;
}
try {
$result = $plugg->request('products', 'POST', $body, 'json');
return $result;
} catch (exception $e) {
return false;
}
}
public function importOrJoinFromB2w($sendToPluggTo = false)
{
$skus = $this->joinAllProduct();
$notfound = array();
foreach ($skus as $sku) {
$result = $this->createFromB2wSku($sku, $sendToPluggTo);
if (isset($result['notfound'])) {
$notfound[] = $result['notfound'];
}
}
return $notfound;
}
public function createFromB2wSku($sku, $sendToPluggTo = false)
{
$plugg = loadClass('Plugg');
try{
$result = $plugg->request('products', 'GET', array('bysku' => $sku['id']), 'query');
} catch (exception $e){
$tries = 0;
$ok = false;
while(!$ok){
if($tries > 3){
$result = array();
break;
}
try{
$result = $plugg->request('products', 'GET', array('bysku' => $sku['id']), 'query');
$ok = true;
} catch (exception $e){
}
$tries ++;
}
}
if (isset($result["body"]["result"]["0"]["Product"])) {
$Pluggproduct = $result["body"]["result"]["0"]["Product"];
} elseif ($sendToPluggTo) {
$Pluggproduct = $this->CreateOnPluggto($sku, $plugg->id);
if (isset($Pluggproduct['body']['Product'])) {
$Pluggproduct = $Pluggproduct['body']['Product'];
} else {
return;
}
} else {
$notFound['notfound'] = $sku['id'];
return $notFound;
}
// is variation
if (isset($Pluggproduct['variations']) && count($Pluggproduct['variations']) > 0) {
foreach ($Pluggproduct['variations'] as $varia) {
if ($varia['sku'] == $sku['id']) {
$bdsku = Sku::firstOrCreate(array('pluggto_var_id' => $varia["id"]));
}
}
if (!isset($bdsku)) {
// TODO somenthing where not find this variation (should not happen)
return false;
}
// is not a variation
} else {
try {
$bdsku = Sku::firstOrCreate(array('pluggto_id' => $Pluggproduct['id']));
} catch (exception $e) {
debug($Pluggproduct);
die;
}
}
$bdproduct = Product::firstOrCreate(array('pluggto_id' => $Pluggproduct['id']));
$bdproduct->user_id = $plugg->id;
$bdproduct->pluggto_id = $Pluggproduct['id'];
$bdproduct->sku = $Pluggproduct['sku'];
if (isset($sku['name'])) $bdproduct->name = $sku['name'];
if (isset($sku['link']['href'])) $bdproduct->location = $sku['link']['href'];
$bdproduct->push();
$bdsku->user_id = $plugg->id;
$bdsku->pluggto_id = $Pluggproduct['id'];
if (isset($sku['id'])) $bdsku->b2w_sku = $sku['id'];
if (isset($sku['id'])) $bdsku->sku = $sku['id'];
if (isset($bdproduct['id'])) $bdsku->product_id = $bdproduct['id'];
if (isset($sku['name'])) $bdsku->name = $sku['name'];
if (isset($sku['description'])) $bdsku->description = $sku['description'];
if (isset($sku['ean'][0])) $bdsku->ean = $sku['ean'][0];
if (isset($sku['height'])) $bdsku->height = $sku['height'];
if (isset($sku['width'])) $bdsku->width = $sku['width'];
if (isset($sku['length'])) $bdsku->length = $sku['length'];
if (isset($sku['weight'])) $bdsku->weight = $sku['weight'];
if (isset($sku['stockQuantity'])) $bdsku->quantity = $sku['stockQuantity'];
if (isset($sku['enable'])) $bdsku->enable = $sku['enable'];
if (isset($sku['urlImage'])) $bdsku->images = json_encode($sku['urlImage']);
if (isset($sku['variance'])) $bdsku->variance = $sku['variance'];
if (isset($sku['crossDocking'])) $bdsku->crossdocking = $sku['crossDocking'];
if (isset($sku['attributeValues'])) $bdsku->atributes = json_encode($sku['attributeValues']);
if (isset($sku['price']['sellPrice'])) $bdsku->special_price = $sku['price']['sellPrice'];
if (isset($sku['price']['listPrice'])) $bdsku->price = $sku['price']['listPrice'];
if (isset($sku['B2WLinks']['americanas'])) $bdsku->link_americana = $sku['B2WLinks']['americanas'];
if (isset($sku['B2WLinks']['submarino'])) $bdsku->link_submarino = $sku['B2WLinks']['submarino'];
if (isset($sku['B2WLinks']['shoptime'])) $bdsku->link_shoptime = $sku['B2WLinks']['shoptime'];
$bdsku->share_quantity = 1;
$bdsku->share_price = 1;
$bdsku->push();
}
// from b2w
public function saveSku($sku, $POST)
{
$updatePrice = false;
$error = array();
$b2w = new B2w();
if (isset($POST['defaultprice']) && isset($POST['specialprice'])) {
$toB2W['listPrice'] = (float)$this->formatPriceBd($POST['defaultprice'], 2);
$toB2W['sellPrice'] = (float)$this->formatPriceBd($POST['specialprice'], 2);
$updatePrice = true;
} elseif (isset($POST['specialprice'])) {
$updatePrice = true;
$toB2W['sellPrice'] = (float)$this->formatPriceBd($POST['specialprice'], 2);
$toB2W['listPrice'] = (float)$sku->price;
} elseif (isset($POST['defaultprice'])) {
$updatePrice = true;
$toB2W['listPrice'] = (float)$this->formatPriceBd($POST['defaultprice'], 2);
$toB2W['sellPrice'] = (float)$sku->special_price;
}
if ($updatePrice) {
$result = $b2w->request('sku/' . $sku->b2w_sku . '/price', 'PUT', $toB2W, 'json');
if ($result['status']['http_code'] == '204') {
$sku->price = $toB2W['listPrice'];
$sku->special_price = $toB2W['sellPrice'];
$sku->share_price = 0;
$sku->push();
} else if($result['status']['http_code'] == '422') {
$toB2W = array();
$toB2W['quantity'] = (int)$POST['availableQuantity'];
$result = $b2w->request('sku/' . strtoupper($sku->b2w_sku) . '/price', 'PUT', $toB2W, 'json');
if ($result['status']['http_code'] == '204') {
$sku->price = $toB2W['listPrice'];
$sku->special_price = $toB2W['sellPrice'];
$sku->share_price = 0;
$sku->push();
} else {
if (isset($result['body']['message'])) {
$error[] = $result['body']['message'];
} elseif ($result['body']) {
$error[] = $result;
} else {
$error[] = 'Ocorreu um erro ao atualizar a quantidade do produto.';
}
}
} else {
if (isset($result['body']['errorDesc'])) {
$error[] = $result['body']['errorDesc'];
} elseif ($result['body']) {
$error[] = print_r($result,1);
} else {
$error[] = 'Ocorreu um erro ao atualizar o preço do Sku';
}
}
}
if (isset($POST['availableQuantity'])) {
$toB2W = array();
$toB2W['quantity'] = (int)$POST['availableQuantity'];
$result = $b2w->request('sku/' . $sku->b2w_sku . '/stock', 'PUT', $toB2W, 'json');
if ($result['status']['http_code'] == '204') {
$sku->quantity = $toB2W['quantity'];
$sku->share_quantity = 0;
$sku->push();
} elseif($result['status']['http_code'] == '422') {
$toB2W = array();
$toB2W['quantity'] = (int)$POST['availableQuantity'];
$result = $b2w->request('sku/' . strtoupper($sku->b2w_sku) . '/stock', 'PUT', $toB2W, 'json');
if ($result['status']['http_code'] == '204') {
$sku->quantity = $toB2W['quantity'];
$sku->share_quantity = 0;
$sku->push();
} else {
if (isset($result['body']['message'])) {
$error[] = $result['body']['message'];
} elseif ($result['body']) {
$error[] = $result;
} else {
$error[] = 'Ocorreu um erro ao atualizar a quantidade do produto.';
}
}
} else {
if (isset($result['body']['message'])) {
$error[] = $result['body']['message'];
} elseif ($result['body']) {
$error[] = $result;
} else {
$error[] = 'Ocorreu um erro ao atualizar a quantidade do produto.';
}
}
}
if (isset($POST['status'])) {
$toB2W = array();
$toB2W['enable'] = (bool)$POST['status'];
$result = $b2w->request('/sku/' . $sku->b2w_sku . '/status', 'PUT', $toB2W, 'json');
if ($result['status']['http_code'] == '204') {
$sku->status = $POST['status'];
$sku->push();
} elseif ($result['status']['http_code'] == '422') {
$toB2W = array();
$toB2W['enable'] = (bool)$POST['status'];
$result = $b2w->request('/sku/' . strtoupper($sku->b2w_sku) . '/status', 'PUT', $toB2W, 'json');
if ($result['status']['http_code'] == '204') {
$sku->status = $POST['status'];
$sku->push();
$sku->push();
} else {
if (isset($result['body']['message'])) {
$error[] = $result['body']['message'];
} elseif ($result['body']) {
$error[] = $result;
} else {
$error[] = 'Ocorreu um erro ao alterar o status do Sku.';
}
}
} else {
if (isset($result['body']['message'])) {
$error[] = $result['body']['message'];
} elseif ($result['body']) {
$error[] = $result;
} else {
$error[] = 'Ocorreu um erro ao alterar o status do Sku.';
}
}
if (!empty($error)) {
$retorno['status'] = 'fail';
$retorno['response'] = implode('<br>', $error);
} else {
$retorno['status'] = 'success';
}
}
return $retorno;
}
public function updateFromPluggTo($resource, $user)
{
$this->product = $resource['Product'];
if (is_array($resource['Product']['variations']) && count($resource['Product']['variations']) > 0) {
foreach ($resource['Product']['variations'] as $variation) {
$this->updateOneFromPluggTo($variation, $user);
}
} else {
$this->updateOneFromPluggTo($resource['Product'], $user);
}
}
public function updateOneFromPluggTo($resource, $user)
{
try {
if(!empty($user->id)){
$user_id = $user->id;
} else {
$user_id = $user->plugg_id;
}
$item = Sku::where('sku',$resource['sku'])->where('user_id',$user_id)->firstOrFail();
$updatePrice = false;
$updateQuantity = false;
$toB2W = array();
$toB2WQtd = array();
if (!empty($resource['price'])) {
$price = $resource['price'];
} else {
$price = $this->product['price'];
}
if (!empty($resource['special_price'])) {
$specialprice = $resource['special_price'];
} else if(!empty($this->product['special_price'])) {
$specialprice = $this->product['special_price'];
} else {
$specialprice = $this->product['price'];
}
if ($item->share_price &&
!empty($specialprice) &&
($specialprice < $price)
) {
$toB2W['listPrice'] = $this->checkPrice($price,$user,'price',$this->product,$resource);
$toB2W['sellPrice'] = $this->checkPrice($specialprice,$user,'special_price',$this->product,$resource);
$updatePrice = true;
} else if ($item->share_price) {
$toB2W['listPrice'] = $this->checkPrice($price,$user,'price',$this->product,$resource);
$toB2W['sellPrice'] = $this->checkPrice($price,$user,'price',$this->product,$resource);
$updatePrice = true;
}
if ($item->share_quantity) {
$updateQuantity = true;
if($resource['quantity'] < 0){
$resource['quantity'] = 0;
}
$toB2WQtd['quantity'] = $resource['quantity'];
}
$b2w = new B2w($item->user_id);
if ($updatePrice) {
$result = $b2w->request('sku/' . rawurlencode($item->b2w_sku) . '/price', 'PUT', $toB2W, 'json');
if ($result['status']['http_code'] == '204') {
$item->price = $toB2W['listPrice'];
$item->special_price = $toB2W['sellPrice'];
$item->push();
} else if($result['status']['http_code'] == '422'){
$result = $b2w->request('sku/' . rawurlencode(strtoupper($item->b2w_sku)) . '/price', 'PUT', $toB2W, 'json');
if ($result['status']['http_code'] == '204') {
$item->price = $toB2W['listPrice'];
$item->special_price = $toB2W['sellPrice'];
$item->push();
} else {
if(isset($result['body']['message']) && strripos('not found',$result['body']['message'])){
} else {
$this->loadPlugg($item->user_id);
$erro = ['user_id'=>$item->user_id,'message'=>'Não foi possível atualizar o preço do produto '.$item->b2w_sku ,'application'=>'B2W','type'=>'products','description'=>print_r($result,1)];
$this->plugg->request('logs','POST',$erro,'json',true);
}
}
}
}
if ($updateQuantity) {
$result = $b2w->request('sku/' . rawurlencode($item->b2w_sku) . '/stock', 'PUT', $toB2WQtd, 'json');
if ($result['status']['http_code'] == '204') {
$item->quantity = $toB2WQtd['quantity'];
$item->push();
} else if($result['status']['http_code'] == '422'){
$result = $b2w->request('sku/' . rawurlencode(strtoupper($item->b2w_sku)) . '/stock', 'PUT', $toB2WQtd, 'json');
if ($result['status']['http_code'] == '204') {
$item->price = $toB2W['listPrice'];
$item->special_price = $toB2W['sellPrice'];
$item->push();
} else {
if(isset($result['body']['message']) && strripos('not found',$result['body']['message'])){
} else {
$this->loadPlugg($item->user_id);
$erro = ['user_id'=>$item->user_id,'message'=>'Não foi possível atualizar a quantidade do produto '.$item->b2w_sku ,'application'=>'B2W','type'=>'products','description'=>print_r($result,1)];
$this->plugg->request('logs','POST',$erro,'json',true);
}
}
}
}
$brandsPrices = $this->getBrandPrice($this->product,$resource);
if(!empty($brandsPrices)){
foreach($brandsPrices as $brandsPrices){
$result = $b2w->request('sku/' . rawurlencode($item->b2w_sku) . '/price', 'PUT', $brandsPrices, 'json');
if ($result['status']['http_code'] != '204') {
$item->warning = $item->warning .= '<br>Data:'.date('Y-m-d H:m:s').' erro: Preço não atualizado para bandeira' . $brandsPrices['store'];
$item->push();
} else if($result['status']['http_code'] == '422'){
$result = $b2w->request('sku/' . rawurlencode(strtoupper($item->b2w_sku)) . '/price', 'PUT', $brandsPrices, 'json');
if ($result['status']['http_code'] == '204') {
$item->price = $toB2W['listPrice'];
$item->special_price = $toB2W['sellPrice'];
$item->push();
}
}
}
}
// unset to see if necessary sent a new variation
if (isset($varis[$item->pluggto_var_id])) {
unset($varis[$item->pluggto_var_id]);
}
} catch (exception $e){
// TODO -- AUTO CREATE
// $this->createNewSku($bdproduct[0],$this->product,$resource);
//$this->createNewSku($bdproduct[0], $resource['Product'], $vari);
}
}
public function inactive($sku){
$b2w = new B2w($sku->user_id);
$result = $b2w->request('sku/' . strtoupper($sku->b2w_sku) . '/status', 'PUT', array('enable'=>false), 'json');
if ($result['status']['http_code'] == 200 || $result['status']['http_code'] == 204) {
$sku->enable = false;
$sku->push();
} else {
throw new exception ('Not possible to update sku');
}
}
protected function createNewSku($bdproduct, $pluggProduct, $vari)
{
$this->loadPlugg($bdproduct->user_id);
$sku = $this->createSku($bdproduct->id, $pluggProduct, null, $vari, false);
if (!empty($this->error)) {
return;
}
$b2w = new B2w($bdproduct->user_id);
if (!empty($bdproduct)) {
$result = $b2w->request('product/' . $bdproduct->sku . '/sku', 'POST', $sku, 'jsonCreate');
}
if ($result['status']['http_code'] == 201) {
if (isset($result['header']['location'])) {
$skusOks = Sku::where('b2w_sku', $sku['id'])->get();
// seta o status do sku sem erro
foreach ($skusOks as $skusOk) {
$skusOk->status = null;
$skusOk->error_mensage = null;
$skusOk->save();
}
return;
} else {
return;
}
} else {
$skusErros = Sku::where('b2w_sku', $sku['id'])->get();
foreach ($skusErros as $skerror) {
if (isset($result['body']['message'])) {
// $skerror->error_mensage = $result['body']['message'];
} else {
// $skerror->error_mensage = 'Erro não informado pela B2W';
}
// $skerror->status = 'error';
$skerror->delete();
}
if (isset($result['body']['message'])) {
if (!empty($result['body']['message'])) {
$this->error[] = $result['body']['message'];
}
} else {
$this->error[] = 'Ocorreu um problema interno na B2W, tente novamente mais tarde';
}
if (isset($result['body']['validationErrors'])) {
$this->generateB2wError($result['body']['validationErrors']);
}
return;
}
}
public function getOneTableDataFromPluggTo($page,$limit){
$data = array('page'=>$page,'limit'=>$limit);
$result = $this->plugg->request('products/tabledata', 'GET',$data, 'query');
if(isset($result['body']['Products'])){
return $result['body']['Products'];
} else {
return false;
}
}
public function gellTableDataFromPluggTo(){
$products = $this->getOneTableDataFromPluggTo(1,100);
if (!$products){
$products = array();
}
$page = 1;
$_limit = 100;
if (count($products) == 100) {
$lastResult = $products;
while (count($lastResult) == $_limit) {
$page += 1;
$_limit = 100;
// try to get more
$result = $this->getOneTableDataFromPluggTo($page, $_limit);
$lastResult = $result;
if (is_array($lastResult)) {
$products = array_merge($lastResult,$products);
}
}
}
return $products;
}
public function syncAllProducts($user_id)
{
// GET All Products from Plugg.To
$this->result['total_b2w'] = 0;
$this->result['total_pluggto'] = 0;
$this->result['total_connector'] = 0;
$this->result['total_found_in_both'] = 0;
$this->result['total_create_in_connector'] = 0;
$this->result['total_not_in_pluggto'] = 0;
$this->result['total_sync_necessary'] = 0;
try {
$user = User::where('plugg_id', $user_id)->firstOrFail();
} catch (exception $e) {
echo 'user not found';
return;
}
$relatorio = array();
$plugg = new Plugg($user_id);
$this->plugg = $plugg;
$allPluggProductsTableData = $this->gellTableDataFromPluggTo();
$pluggProductsIdArray = array();
$pluggProductsSkuArray = array();
$allSkusinCnovaConnector = Sku::where('user_id', '=', $user_id)->get();
$allInConnector = array();
foreach ($allSkusinCnovaConnector as $connector) {
$allInConnector[$connector->b2w_sku] = $connector;
$this->result['total_connector'] ++;
}
foreach ($allPluggProductsTableData as $pluggProducts) {
$pluggProductsIdArray[$pluggProducts['id']] = $pluggProducts;
$pluggProductsSkuArray[trim($pluggProducts['sku'])] = $pluggProducts;
// alternative sku
$sku = $this->formateSkuToB2w($pluggProducts['sku']);
$pluggProductsSkuArray[strtoupper(trim($sku))] = $pluggProducts;
$this->result['total_pluggto'] ++;
if (isset($pluggProducts['variations']) && is_array($pluggProducts['variations'])) {
foreach ($pluggProducts['variations'] as $varis) {
if (!isset($varis['id']) || !isset($varis['sku'])) {
continue;
}
$variProduct = $varis;
if (!empty($varis['sku'])) {
$pluggProductsSkuArray[trim($varis['sku'])] = $variProduct;
$pluggProductsSkuArray[trim($varis['sku'])]['pluggto_parent_id'] = $pluggProducts['id'];
$pluggProductsSkuArray[trim($varis['sku'])]['parent'] = $pluggProducts;
// alternative sku
$sku = $this->formateSkuToB2w($varis['sku']);
$pluggProductsSkuArray[strtoupper(trim($sku))] = $variProduct;
$pluggProductsSkuArray[strtoupper(trim($sku))]['pluggto_parent_id'] = $pluggProducts['id'];
$pluggProductsSkuArray[strtoupper(trim($sku))]['parent'] = $pluggProducts;
}
$this->result['total_pluggto'] ++;
$variProduct['pluggto_parent_id'] = $pluggProducts['id'];
$pluggProductsIdArray[$varis['id']] = $variProduct;
}
}
}
$B2WProduts = $this->joinAllProduct($user_id);
// $b2w = new B2w($user_id);
//$B2WProduts = $resource = $b2w->request('/sku/79413','GET',array(),'query');
// $B2WProduts = array($B2WProduts['body']);
// debug($B2WProduts);die;
if (is_array($B2WProduts) && !empty($B2WProduts)):
foreach ($B2WProduts as $B2WProdut) {
$this->result['total_b2w'] ++;
try {
if ($user->origin) {
$findItem = Sku::where('b2w_sku',$B2WProdut['id'])->where('user_id',$user_id)->firstOrFail();;
} else {
$findItem = Sku::where('b2w_sku',$B2WProdut['id'])->where('user_id',$user_id)->firstOrFail();;
}
} catch (exception $e) {
$findItem = false;
}
if ($findItem) {
unset($allInConnector[$findItem->sku]);
}
if ($user->origin) {
$cleanSku = $this->formateSkuToB2w($B2WProdut['id']);
} else if (isset($findItem->sku) && !empty($findItem->sku)) {
$cleanSku = $this->formateSkuToB2w($findItem->sku);
} else {
$cleanSku = $B2WProdut['id'];
}
$alternativeSku = strtoupper($cleanSku);
if ($findItem && isset($pluggProductsSkuArray[$cleanSku])) {
$plProduct = $pluggProductsSkuArray[$cleanSku];
unset($pluggProductsSkuArray[$cleanSku]);
unset($pluggProductsIdArray[$plProduct['id']]);
} else if (isset($pluggProductsSkuArray[$cleanSku])) {
// Found by PluggTo Sku
$plProduct = $pluggProductsSkuArray[$cleanSku];
unset($pluggProductsSkuArray[$cleanSku]);
unset($pluggProductsIdArray[$plProduct['id']]);
// check to see if not sku is not a pluggto id
} else if (isset($pluggProductsIdArray[$cleanSku])) {
$plProduct = $pluggProductsIdArray[$cleanSku];
unset($pluggProductsIdArray[$cleanSku]);
if (isset($plProduct['sku'])) unset($pluggProductsSkuArray[$plProduct['sku']]);
} else if (isset($pluggProductsSkuArray[$alternativeSku])) {
// product not found in Plugg.To
$plProduct = $pluggProductsSkuArray[$alternativeSku];
unset($pluggProductsSkuArray[$alternativeSku]);
} else {
$plProduct = false;
}
// item find in pluggto and cnova connector
if ($plProduct && $findItem) {
$this->result['total_found_in_both'] ++;
$needupdate = false;
if (!isset($plProduct['price'])) {
continue;
}
if (isset($B2WProdut['situation'])) $findItem->situation = $B2WProdut['situation'];
if (isset($B2WProdut['B2WLinks']['americanas'])) $findItem->link_americana = $B2WProdut['B2WLinks']['americanas'];
if (isset($B2WProdut['B2WLinks']['submarino'])) $findItem->link_submarino = $B2WProdut['B2WLinks']['submarino'];
if (isset($B2WProdut['B2WLinks']['shoptime'])) $findItem->link_shoptime = $B2WProdut['B2WLinks']['shoptime'];
$findItem->push();
try {
if(isset($plProduct['parent'])){
if (isset($plProduct['price'])) $price = $this->checkPrice($plProduct['price'],$user,'price',$plProduct['parent'],$plProduct);
if (isset($plProduct['special_price'])) $specialprice = $this->checkPrice($plProduct['special_price'],$user,'special_price',$plProduct['parent'],$plProduct);
} else {
if (isset($plProduct['price'])) $price = $this->checkPrice($plProduct['price'],$user,'price',$plProduct);
if (isset($plProduct['special_price'])) $specialprice = $this->checkPrice($plProduct['special_price'],$user,'special_price',$plProduct);
}
} catch (exception $e) {
}
if (isset($plProduct['pluggto_parent_id'])) {
$findItem->pluggto_id = $plProduct['pluggto_parent_id'];
$findItem->pluggto_var_id = $plProduct['id'];
} else {
$findItem->pluggto_id = $plProduct['id'];
}
if ($findItem->share_quantity && $plProduct['quantity'] != $B2WProdut['stockQuantity']) {
$findItem->quantity = $plProduct['quantity'];
$needupdate = true;
}
if (!isset($B2WProdut['price']['listPrice']) || ($findItem->share_price && isset($price) && !empty($price) && (isset($B2WProdut['price']['listPrice']) && $price != $B2WProdut['price']['listPrice']))) {
$findItem->price = $price;
$needupdate = true;
}
if ((!isset($B2WProdut['price']['sellPrice']) || $findItem->share_price && isset($specialprice) && !empty($specialprice) && isset($B2WProdut['price']['sellPrice']) && $specialprice != $B2WProdut['price']['sellPrice'])) {
$findItem->special_price = $specialprice;
$needupdate = true;
}
if (isset($B2WProdut['enable'])) {
$findItem->enable = $B2WProdut['enable'];
}
if (isset($B2WProdut['situation'])) {
$findItem->situation = $B2WProdut['situation'];
}
$findItem->push();
if ($needupdate) {
$this->result['total_sync_necessary'] ++;
$relatorio[$findItem->sku]['price'] = $findItem->price;
$relatorio[$findItem->skuIdOrigin]['availableQuantity'] = $findItem->quantity;
$relatorio[$findItem->skuIdOrigin]['what'] = 'Sincronização necessária';
$plugg->tries = 0;
$resource = $plugg->request('skus/' . $findItem->sku, 'GET', array(), 'query');
if (isset($resource['body']['Product'])) {
$this->updateFromPluggTo($resource['body'], $user);
}
}
$findItem->push();
// item find in pluggto, but not find item create, need to create a item
} else if ($plProduct && !$findItem) {
$this->result['total_create_in_connector'] ++;
$findItem = new Sku();
if(isset($plProduct['parent'])){
if (isset($plProduct['price'])) $price = $this->checkPrice($plProduct['price'],$user,'price',$plProduct['parent'],$plProduct);
if (isset($plProduct['special_price'])) $specialprice = $this->checkPrice($plProduct['special_price'],$user,'special_price',$plProduct['parent'],$plProduct);
} else {
if (isset($plProduct['price'])) $price = $this->checkPrice($plProduct['price'],$user,'price',$plProduct);
if (isset($plProduct['special_price'])) $specialprice = $this->checkPrice($plProduct['special_price'],$user,'special_price',$plProduct);
}
if (isset($plProduct['pluggto_parent_id'])) {
$findItem->pluggto_id = $plProduct['pluggto_parent_id'];
$findItem->pluggto_var_id = $plProduct['id'];
} else {
$findItem->pluggto_id = $plProduct['id'];
}
$findItem->name = $B2WProdut['name'];
if (isset($B2WProdut['situation'])) $findItem->situation = $B2WProdut['situation'];
if (isset($B2WProdut['B2WLinks']['americanas'])) $findItem->link_americana = $B2WProdut['B2WLinks']['americanas'];
if (isset($B2WProdut['B2WLinks']['submarino'])) $findItem->link_submarino = $B2WProdut['B2WLinks']['submarino'];
if (isset($B2WProdut['B2WLinks']['shoptime'])) $findItem->link_shoptime = $B2WProdut['B2WLinks']['shoptime'];
$findItem->b2w_sku = $B2WProdut['id'];
if (isset($B2WProduts['enable'])) {
$findItem->enable = $B2WProduts['enable'];
} else {
$findItem->enable = 0;
}
$findItem->sku = $plProduct['sku'];
$findItem->user_id = $user_id;
if (isset($specialprice) && isset($price)) {
if (!empty($plProduct['special_price'])) {
$findItem->special_price = $specialprice;
} else {
$findItem->special_price = $price;
}
}
if (isset($price)) {
$findItem->price = $price;
}
if (isset($plProduct['quantity'])) {
$findItem->quantity = $plProduct['quantity'];
}
$findItem->push();
// Verificar se necessita enviar atualização para Cnova
if (isset( $plProduct['quantity']) && $plProduct['quantity'] != $B2WProdut['stockQuantity'] ||
$specialprice != $B2WProdut['price']['sellPrice'] ||
$price != $B2WProdut['price']['listPrice']
) {
$resource = $plugg->request('products/' . $findItem->pluggto_id, 'GET', array(), 'query');
if (isset($resource['body']['Product'])) {
$this->updateFromPluggTo($resource['body'], $user);
}
}
$relatorio[$B2WProdut['id']] = $B2WProdut;
$relatorio[$B2WProdut['id']]['sku'] = $B2WProdut['id'];
$relatorio[$B2WProdut['id']]['what'] = 'Importação para o connector Cnova';
$findItem->save();
// item not find in pluggto, but not find product in pluggto, should be reset the stock in cnova because is not linked
} else if (!$plProduct && $findItem) {
$fbody = array();
if ($user->origin) {
$fbody['bysku'] = $findItem->b2w_sku;
} else if (!empty($findItem->sku)) {
$fbody['bysku'] = $findItem->sku;
} else {
$findItem->pluggto_id = '';
$findItem->pluggto_var_id = '';
$findItem->status = 'error';
$findItem->push();
$relatorio[$findItem->sku] = $findItem[$findItem->sku];
$relatorio[$findItem->sku]['what'] = 'Não encontrado no Pluggto';
continue;
}
$nresource = $plugg->request('products', 'GET', $fbody, 'query');
if (isset($nresource['body']['result'][0]['Product']['id'])) {
$nPluggToProduct = $nresource['body']['result'][0]['Product'];
if (isset($nPluggToProduct['variations']) && is_array($nPluggToProduct['variations'])) {
$foundVari = false;
foreach ($nPluggToProduct['variations'] as $variations) {
if ($variations['sku'] == $fbody['bysku']) {
$findItem->sku = $variations['sku'];
$findItem->b2w_sku = $B2WProdut['id'];
$findItem->pluggto_id = $nPluggToProduct['id'];
$findItem->pluggto_var_id = $variations['id'];
$findItem->quantity = $variations['quantity'];
if (isset($B2WProdut['enable'])) {
$findItem->enable = $B2WProdut['enable'];
}
if (isset($B2WProdut['situation'])) {
$findItem->situation = $B2WProdut['situation'];
}
if (isset($B2WProduts['enable'])) {
$findItem->enable = $B2WProduts['enable'];
} else {
$findItem->enable = 0;
}
$findItem->price = $variations['price'];
$findItem->special_price = $variations['special_price'];
$findItem->push();
$resource = $plugg->request('products/' . $findItem->pluggto_id, 'GET', array(), 'query');
if (isset($resource['body']['Product'])) {
$this->updateFromPluggTo($resource['body'], $plugg);
}
}
if (!$foundVari) {
$findItem->status = 'error';
}
}
} else {
$findItem->sku = $nPluggToProduct['sku'];
$findItem->b2w_sku = $B2WProdut['id'];
$findItem->pluggto_id = $nPluggToProduct['id'];
$findItem->quantity = $nPluggToProduct['quantity'];
$findItem->price = $nPluggToProduct['price'];
$findItem->special_price = $nPluggToProduct['special_price'];
if (isset($B2WProdut['enable'])) {
$findItem->enable = $B2WProdut['enable'];
}
if (isset($B2WProdut['situation'])) {
$findItem->situation = $B2WProdut['situation'];
}
if (isset($B2WProduts['enable'])) {
$findItem->enable = $B2WProduts['enable'];
} else {
$findItem->enable = 0;
}
$findItem->push();
$resource = $plugg->request('products/' . $findItem->pluggto_id, 'GET', array(), 'query');
if (isset($resource['body']['Product'])) {
$this->updateFromPluggTo($resource['body'], $user);
}
}
} else {
$this->result['total_not_in_pluggto'] ++;
$findItem->pluggto_id = '';
$findItem->pluggto_var_id = '';
$findItem->status = 'error';
$findItem->push();
}
$relatorio[$findItem->sku] = $findItem[$findItem->sku];
$relatorio[$findItem->sku]['what'] = 'Não encontrado no Pluggto';
// not find in plugg.to and in cnova
}
}
endif;
return $this->result;
// debug($relatorio);
}
public static function formatPriceBd($number)
{
$source = array('.', ',');
$replace = array('', '.');
$valor = str_replace($source, $replace, $number); //remove os pontos e substitui a virgula pelo ponto
return self::numberFormat($valor, 2, '.', ''); //retorna o valor formatado para gravar no banco
return (float)str_replace(',', '.', $number);
}
public static function formatData($dataHora)
{
$timestamp = strtotime($dataHora);
return date('d/m/Y H:i', $timestamp);
}
public static function formatPrice($number)
{
$number = (float)$number;
return "R$ " . number_format($number, 2, ',', '.');
}
public static function situationFlag($value){
switch ($value):
case 'INCLUDED':
return '<span class="label label-success">Incluído</span>';
break;
case 'NOT_INDEXED':
return '<span class="label label-danger">Não incluido</span>';
break;
case 'PENDING_MATCH':
return '<span class="label label-info">Pendente de match</span>';
break;
case 'RELEASED_MATCH':
return '<span class="label label-info">Liberado de match</span>';
break;
case 'PENDING_FIRST_PRICE_BLOCK':
return '<span class="label label-info">Trava de primeiro preço</span>';
break;
case 'PENDING_PRICE_BLOCK':
return '<span class="label label-info">Trava de primeiro preço</span>';
break;
case 'PENDING_PRICE_BLOCK_ANALYSIS':
return '<span class="label label-info">Trava de variação de preço</span>';
break;
case 'RELEASED_PRICE_BLOCK':
return '<span class="label label-info">Liberado de trava de preço</span>';
break;
case 'PENDING_EXCLUSIVITY_ANALYSIS':
return '<span class="label label-info">Pendência de exclusividade</span>';
break;
case 'RELEASED_EXCLUSIVITY':
return '<span class="label label-info">Liberação de pendência de exclusividade</span>';
break;
case 'INACTIVE':
return '<span class="label label-danger">Inativo</span>';
break;
case 'REACTIVATED':
return '<span class="label label-success">Reativado</span>';
break;
case 'EXCLUDED':
return '<span class="label label-danger">Excluido</span>';
break;
endswitch;
}
public static function statusFlag($value)
{
switch ($value):
case 'new':
return '<span class="label label-primary">' . self::changeValues($value) . '</span>';
break;
case 'Produto indexado':
return '<span class="label label-success">' . self::changeValues($value) . '</span>';
break;
case 'Não importado':
return '<span class="label label-danger">' . self::changeValues($value) . '</span>';
break;
case 'active':
return '<span class="label label-success">' . self::changeValues($value) . '</span>';
break;
case 'inactive':
return '<span class="label label-danger">' . self::changeValues($value) . '</span>';
break;
case 'under_review':
return '<span class="label label-warning">' . self::changeValues($value) . '</span>';
break;
case 'not_yet_active':
return '<span class="label label-primary">' . self::changeValues($value) . '</span>';
break;
case 'payment_required':
return '<span class="label label-warning">' . self::changeValues($value) . '</span>';
break;
case 'confirmed':
return '<span class="label label-primary">' . self::changeValues($value) . '</span>';
break;
case 'payment_in_process':
return '<span class="label label-warning">' . self::changeValues($value) . '</span>';
break;
case 'paid':
return '<span class="label label-success">' . self::changeValues($value) . '</span>';
break;
case 'approved':
return '<span class="label label-success">' . self::changeValues($value) . '</span>';
break;
case 'canceled':
case 'cancelled':
return '<span class="label label-danger">' . self::changeValues($value) . '</span>';
break;
case 'invalid':
return '<span class="label label-danger">' . self::changeValues($value) . '</span>';
break;
case 'handling':
return '<span class="label label-warning">' . self::changeValues($value) . '</span>';
break;
case 'shipped':
return '<span class="label label-primary">' . self::changeValues($value) . '</span>';
break;
case 'delivered':
return '<span class="label label-success">' . self::changeValues($value) . '</span>';
break;
case 'Not_delivered':
return '<span class="label label-danger">' . self::changeValues($value) . '</span>';
break;
case 'active':
case '1':
return '<span class="label label-success">' . self::changeValues('active') . '</span>';
break;
case 'inactive':
case '0':
return '<span class="label label-danger">' . self::changeValues('inactive') . '</span>';
break;
case 'to_be_agreed':
return '<span class="label label-info">' . self::changeValues($value) . '</span>';
break;
case 'ready_to_ship':
return '<span class="label label-warning">' . self::changeValues($value) . '</span>';
break;
default:
default:
return '<span class="label label-info">' . self::changeValues($value) . '</span>';
endswitch;
}
// from extra
public static function changeValues($value)
{
switch ($value):
case '0':
return Lang::get('status.inactive');
break;
case 'new':
return Lang::get('status.Pending');
break;
case 'pending':
return Lang::get('status.Pending');
break;
case 'active':
return Lang::get('status.Active');
break;
case 'paused':
return Lang::get('status.Paused');
break;
case 'closed':
return Lang::get('status.Closed');
break;
case 'under_review':
return Lang::get('status.UnderReview');
break;
case 'not_yet_active':
return Lang::get('status.Activing');
break;
case 'inactive':
return Lang::get('status.inactive');
break;
case 'payment_required':
return Lang::get('status.PaymentRequired');
break;
case 'confirmed':
return Lang::get('status.Confirmed');
break;
case 'paid':
return Lang::get('status.Paid');
break;
case 'approved':
return Lang::get('status.Approved');
break;
case 'payment_in_process':
return Lang::get('status.Payment_in_process');
break;
case 'cancelled':
case 'canceled':
return Lang::get('status.Cancelled');
break;
case 'Invalid':
return Lang::get('status.invalid');
break;
case 'handling':
return Lang::get('status.Handling');
break;
case 'shipped':
case 'sent':
return Lang::get('status.Shipped');
break;
case 'delivered':
return Lang::get('status.Delivered');
break;
case 'not_delivered':
return Lang::get('status.Not_delivered');
break;
case 'to_be_agreed':
return Lang::get('status.ToAgree');
case 'ready_to_ship':
return Lang::get('status.Ready');
break;
case 'ANSWERED':
return Lang::get('status.ANSWERED');
break;
case 'UNANSWERED':
return Lang::get('status.UNANSWERED');
break;
default:
return $value;
break;
endswitch;
}
// from extra
public static function listStatuses()
{
return array(
'active' => Lang::get('status.Active'),
'paused' => Lang::get('status.Paused'),
'closed' => Lang::get('status.Closed'),
'under_review' => Lang::get('status.UnderReview'),
'not_yet_active' => Lang::get('status.Activing'),
'inactive' => Lang::get('status.Inactive'),
'payment_required' => Lang::get('status.PaymentRequired'));
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment