Forum Replies Created

Viewing 15 replies - 1 through 15 (of 15 total)
  • Eu tenho um snippet aqui que faz isso. Bem hardcoded no codigo do plugin. Não é uma boa pratica, mas por enquanto ajuda. Quer?

    Estou em contato com o pessoal do Melhor Envios para conseguir algumas melhorias.
    Coloque por aqui o que voce acha que falta.
    Eu tenho diversas pontuações, principalmente o fato de não poder fitrar o metodo de entrega de acordo com regras que eu definir. Costumo abrir Jamef por exemplo, somente para alguns clientes de perfil definido.

    Pessoal,

    O plugin do @claudiosanches é muito bacana, porém faltam algumas lógicas relacionadas a compensação bancária e o Claudio não tem só este projeto. Por conta disto, eu escrevi uma solução temporária da forma q eu consegui, por favor quem manja melhor de programação reescreve isto de forma mais sanitizada e posta la no GitHub (não sei usar direito :/ )

    O que eu alterei:
    – Estou forçando o horario de 23:59:59 na expiração do boleto que é gravada no banco pro caso do cara ter comprado as 10 da manha e pago as 10 da manha do dia do vencimento por exemplo e não dar cancelado.

    – Fiz umas condicionais que jogam o vencimento de boletos para segunda-feira no caso de cairem de Sabado ou Domingo de acordo com a data da compra e a config de dias para pagar.

    – Adicionei 1 dia de margem para o SOUNDER (cron q checa o pagamento) para checar casos em que o cara paga o boleto nas ultimas horas do dia de vencimento e o sounder não tem tempo habil de esperar a compensação.

    – Retiro esta margem na hora de mandar pro boleto fisico. Ou seja: O itau recebe o vencimento pro dia X, mas no banco de dados (que é o dado utilizado pelo SOUNDER) vai estar X+1

    Segue o código. Alteracoes no arquivo wc-class-itau-shopline-api.php
    Funcoes abaixo, somente troca-las por completo.
    Fazer um tente em sandbox para confirmar se tudo funciona. Aqui está ok.

    
    	/**
    	 * Save expiry time in the database.
    	 *
    	 * @param  int $order_id
    	 *
    	 * @return int
    	 */
    	public function save_expiry_time( $order_id ) {
    		$days   = absint( $this->days_to_pay );
    		$now    = strtotime( current_time( 'mysql' ) );
    
    		// Seta o horario para 23:59:59 para enganar o sounder. O horario limite do vencimento é as 21:00:00 do dia de vencimento.
    		$fixtime = strtotime(date( 'Y-m-d', $now ).' 23:59:59');
    		
    		$expiry = strtotime( '+' . $days . ' days', $fixtime );
    
    		// Descobre o dia da semana que cai o vencimento
    		$weekday = date('w', $expiry);
    
    		// Joga o vencimento para segunda-feira as 23:59:59 caso o expiry caia de sabado ou domingo e o sistema entenda o sistema bancario de dias úteis
    
    		if ($weekday == 6){
    		$expiry = strtotime( '+ 2 days', $expiry );
     		 // 'Caiu no Sabado - ' ; 
    		}
    
    		if ($weekday == 0){
    		$expiry = strtotime( '+ 1 days', $expiry );
     		 // 'Caiu no Domingo - ' ;   
    		}
    
    		// Insere um dia de margem pra burlar o sounder no caso do cliente pagar nas ultimas hora do dia de vencimento e só compensar no próximo dia.
    
    		$expiry = strtotime( '+ 1 days', $expiry );
    
    		update_post_meta( $order_id, '_wc_itau_shopline_expiry_time', $expiry );
    
    		return $expiry;
    	}
    
    	/**
    	 * Get expiry date.
    	 *
    	 * @param  int $order_id
    	 *
    	 * @return string
    	 */
    	protected function get_expiry_date( $order_id ) {
    		$time = get_post_meta( $order_id, '_wc_itau_shopline_expiry_time', true );
    
    		if ( '' == $time ) {
    			$time = $this->save_expiry_time( $order_id );
    		}
    
    		// Elimina a margem de um dia pra jogar no boleto propriamente dito, mantendo 1 dia a mais somente no banco de dados para enganar o sounder.
    
    		$time = strtotime( '- 1 days', $time );
    
    		return date( 'dmY', $time );
    	}    

    o sistema precisaria contemplar tabelas padrao e tabelas de contrato certo?
    alguem pode me dar mais dados de como isso funciona?
    nao uso contrato….
    cada cliente tem uma negociação de preço, ou são tabelas padrao por faixas de faturamento mensal?

    as tabelas mudam de origem pra origem tb né?

    @claudiosanches, neste plugin novo seu seria interessante a opção de configurar a classe de entrega de forma a escolher se vai dividir em pacotes ou não.

    Existem muitos cenários onde é até possivel colocar tudo no mesmo pacote, mas tem q aguardar o pedido q demora mais a produzir para enviar.

    Entao acho q 2 passos sao necessarios:

    Configurar se X classes no mesmo pedido, desejam fazer o split package OU se pegará o tempo maior de envio e usará como padrao no mesmo pacote.

    COnfigurar granulado a nivel de produto se aquele produto, independente de classe, NECESSITA de um pacote individual

    Como já te disse, nao sou muito bom programador, mas posso te ajudar com logica e testes. Se tiver esse plugin, ou o esboco dele no github já, me avisa que vou lá.

    @claudiosanches disponha

    @claudiosanches
    Acabei de postar esse… até umas 16hs deve permanecer com UMA movimentação só
    PN963983509BR

    valeu

    @claudiosanches beleza… assim que eu tiver algum código, te passo

    @claudiosanches beleza… assim que eu tiver algum código, te passo

    @claudiosanches

    infelizmente nao tenho mais nenhum codigo de coisas recem postadas 🙁
    mas o que podemos fazer é simular o restorno numa variavel né?
    eu tenho aqui no meu log, os arrays … se acha q da pra fazer assim me avisa que te envio

    desculpe, mas faltou uma alteração:
    no mesmo arquivo do post acima…
    na segunda condicional, onde vc checa se evento é objeto, tem que remover a key [0]

    // Handle multiple objects.
    				if ( is_array( $response->return->objeto ) ) {
    					$objects = (array) $response->return->objeto;
    
    					// Fix when return only last event for each object.
    					if ( is_object( $objects->evento ) ) {
    						$new_objects = array();
    						foreach ( $objects as $key => $object ) {
    							$new_objects[ $key ] = $object;
    							$new_objects[ $key ]->evento = array( $new_objects[ $key ]->evento );
    						}
    						$objects = $new_objects;
    					}

    @claudiosanches
    Comecei a dar uma fuçada aqui, meter uns print_r pra ver o que vinha na parte q tava errada. Ai vi que voce pra arrumar outros cenarios “tirava” o status de array dos caras q teoricamente so tinham 1 movimentacao.

    depois de muita tentativa e erro, coloquei uma condicional no ultimo foreach antes de chamar a template pra recolocar o array antes de mandar pra views q faz o foreach no front. Acho que foi!!!

    if ( is_object( $object->evento ) ) {
    $object->evento = array( $object->evento );}

    Vou deixar o seu comment pra vc localizar facil ai:

    class-wc-correios-tracking-history.php

    // Display the right template for show the tracking code or tracking history.
    		if ( ! empty( $objects ) ) {
    			foreach ( $objects as $object ) {
    
    				if ( is_object( $object->evento ) ) {
    			    	$object->evento = array( $object->evento );}
    				
    				wc_get_template(
    					'myaccount/tracking-history-table.php',
    					array(
    						'events' => (array) $object->evento,
    						'code'   => (string) $object->numero,
    					),
    					'',
    					WC_Correios::get_templates_path()
    				);
    			}
    		} else {
    			wc_get_template(
    				'myaccount/tracking-codes.php',
    				array(
    					'codes' => $tracking_codes,
    				),
    				'',
    				WC_Correios::get_templates_path()
    			);
    		}

    Agora precisa ver se outras coisas vão c**gar hehehe
    Acredito que até tenha outra forma de tratar isso sem verificar no foreach… talvez fazer uma condição lá em cima onde vc gera o $objects… mas isso nao consegui…
    Desculpe novamente utilizar aqui pra mandar codigo… sei que é chato, mas nao sei direito usar o versionamento hehe

    • This reply was modified 9 years, 1 month ago by adborges.
    • This reply was modified 9 years, 1 month ago by adborges.

    @claudiosanches

    A unica forma de ocorrer o erro é quando um codigo que tem somente UMA movimentacao esta colocado junto de outros que tenham mais de uma.

    Quando esse codigo está sozinho, tudo ok
    quando os outros estao sozinhos tb tudo ok

    PL654047926BR – Este AINDA tem um movimento só (postei hoje, amanha ou mais tarde deve mudar já) Se nao conseguir mexer nisso hoje, depois vamos ter que arrumar outro codigo fresco entao hehehe.
    PN922320686BR – Este tem mais movimentacoes
    PN901186751BR – Este tem mais movimentacoes

    Se precisar de ajuda pra testes me avisa….
    abs

    @claudiosanches
    Deixa eu aproveitar pra te alertar de algo.
    Quando voce coloca múltiplos códigos de rastreamento, está ocorrendo um problema nas tabelas do my-account.

    Eu vi no código que tem uma lógica pra tratar o cenario de quando o objeto deles vem com UMA ou MAIS partes no array.

    Mas tem UM cenário que rola uma falha.
    Quando voce tem mais de um código de rastreamento e o PRIMEIRO da lista só tem um objeto de movimentacao (por exemplo: Pacote postado), os outros codigos de rastreamento do foreach vem em branco.

    tentei resolver a logica, mas sou bem limitado em programação… não consegui 🙁

    Quando puder, da uma olhada. Valeu

    Vou deixar aqui como resolvi.
    O rastreamento interno via webservice está funcionando normalmente. Quando você ativa a tabela de rastreamento, o plugin passa a adotar o link do pedido para mostrar o rastreamento. Ponto 1 resolvido.

    O link externo que aparece na página do pedido, onde o cliente pode checar o rastreamento no site dos correios pode ser resolvido da seguinte maneira:

    Alterar o código que gera os links nos arquivos:
    tracking-codes.php
    tracking-history-table.php

    <form method="POST" target="_blank" action="http://www2.correios.com.br/sistemas/rastreamento/resultado_semcontent.cfm" class="shipment-details-service__correios">
                            <input type="hidden" name="Objetos" value="<?php echo esc_attr( $code ); ?>">
                            <input class="shipment-details-service__correios-action" type="submit" value="<?php echo esc_attr( $code ); ?>">
                        </form>

    Trocar o a porção do código que gera o link via , por este snippet acima.
    Desta forma você inclui um botão que gera um POST para o servidor dos correios.
    Cada um pode estilizar o botão com CSS.

    A única coisa que não consegui fazer, foi colocar uma forma na paginado admin do pedido para checar o rastreamento, pois todo a pagina do editar pedido é um FORM. Pode haver alguma outra forma….

    Desculpem não propor isto no github, nem taopouco sei se isto é uma boa pratica, se alguem tiver mais experiencia pode criar um PR lá. Isso é um começo.

Viewing 15 replies - 1 through 15 (of 15 total)