Created
July 31, 2013 15:34
-
-
Save bslima/6123074 to your computer and use it in GitHub Desktop.
Cancelar venda cafufa
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public static function cancelar_venda( $venda_id ) { | |
// ---------------------------- | |
// Inicia uma MYSQL TRANSACTION | |
// ---------------------------- | |
Venda::begin_transaction(); | |
//pega a venda no banco | |
$venda = Venda::where_venda_id( $venda_id )->first(); | |
// pega usuario | |
$usuario = Usuario::get_usuario_por_cliente_id( $venda->cliente_id ); | |
if ( ! $venda || ! $usuario ) { | |
Venda::rollback_transaction(); | |
return array( "status" => Config::get( "cafufa.cancelar_venda_status_falha" ), "msg" => "Você tentou cancelar uma venda inválida." ); | |
} | |
// ---------------------------- | |
// Pegas os ingressos e datas dos eventos para validacao de cancelamento | |
// ---------------------------- | |
$ingressos = Venda::get_evento_ingressos_por_venda( $venda_id ); | |
$datas = array(); | |
foreach ($ingressos as $key => $ingresso) { | |
//Adiciona data pra processar depois | |
array_push( $datas, $ingresso->evento_data ); | |
$ingressos[$key] = (array) $ingresso; | |
} | |
//Calcula o valor a ser devolvido (exclui-se as taxas de conveniencia de bancarias) | |
$taxas = $venda->venda_valor_total_conveniencia + $venda->venda_valor_total_bancarias; | |
$valor_total = $venda->venda_valor_total - $taxas; | |
//seta o timezone default application | |
date_default_timezone_set( Config::get('application.timezone') ); | |
//Pega a data de hoje | |
$now = new DateTime(); | |
//---------------------------- | |
// Verifica a diferenca de dias entre o proximo dia util e o evento mais proximo | |
//---------------------------- | |
//pega a data do evento mais proximo dentro do carrinho | |
$date_min_event = min( $datas ); | |
$date_event = new DateTime( $date_min_event ); | |
//Calcula a diferenca em dias entre o proximo dia util e o evento | |
$diff = $date_event->diff($now)->days; | |
//Se a diferenca for menor do que o limite para cancelamento antes do evento retorna com erro | |
if ( $diff < Config::get( 'cafufa.limite_cancelamento_compra' ) ) { | |
Venda::rollback_transaction(); | |
return array( "status" => Config::get( "cafufa.cancelar_venda_status_falha" ), | |
"msg" => Config::get( 'cafufa.cancelamento_cartao_perto_evento' ) ); | |
} | |
$pagamento = new Pagamento(); | |
//----------------------- | |
// Toma uma acao de acordo com o tipo de pagamento (boleto ou cartao) | |
//----------------------- | |
//Verifica se eh um pagamento via boleto ou via cartao | |
if ( $venda->pagamento_tipo_id == Config::get( 'cafufa.pagamento_tipo_boleto' ) ) { | |
$venda_historico_boleto = new VendaHistorico(); | |
$venda_historico_boleto->venda_id = $venda->venda_id; | |
//Verifica se eh um boleto não pago | |
if ( $venda->venda_status_id == Config::get( 'cafufa.venda_status_aguardando_pagamento' ) ) { | |
//muda o status para cancelada | |
$venda->venda_status_id = Config::get( 'cafufa.venda_status_cancelada' ); | |
$venda_historico_boleto->venda_status_id = Config::get( 'cafufa.venda_status_cancelada' ); | |
$venda_historico_boleto->save(); | |
} elseif ( $venda->venda_status_id == Config::get( 'cafufa.venda_status_cancelada' ) ) { | |
Venda::commit_transaction(); | |
return array( "status" => Config::get( "cafufa.cancelar_venda_status_falha" ), | |
"msg" => "Compra já foi devolvida ou cancelada!" ); | |
} | |
//@TODO: e se o boleto jah estiver pago ? | |
} elseif ( $venda->pagamento_tipo_id == Config::get( 'cafufa.pagamento_tipo_cartao' ) ) { | |
//verifica se a venda já foi aprovada. | |
if ( $venda->venda_status_id == Config::get( 'cafufa.venda_status_aprovada' ) ) { | |
//Pega o historico de transacao aprovado mais recente. | |
$venda_historico = VendaHistorico::where_venda_status_id( Config::get( 'cafufa.venda_status_aprovada' ) ) | |
->where( 'venda_id' , '=', $venda->venda_id ) | |
->order_by('venda_historico_id', 'DESC') | |
->first(); | |
if ( ! $venda_historico ) { | |
Venda::rollback_transaction(); | |
return array( "status" => Config::get( "cafufa.cancelar_venda_status_falha" ), | |
"msg" => "Não existe um historico de transação aprovada para essa venda." ); | |
} | |
//----------------------------- | |
// O estorno só pode ser feito X dias depois da aprovacao | |
//----------------------------- | |
$date_aprovada = DateTime::createFromFormat('d/m/Y H:i:s', $venda_historico->created_at); | |
if ( $now->diff( $date_aprovada )->days < Config::get( 'cafufa.prazo_pedido_cancelamento' ) ) { | |
Venda::rollback_transaction(); | |
return array( "status" => Config::get( "cafufa.cancelar_venda_status_falha" ), "msg" => Config::get( 'cafufa.pedido_cancelamento_antes_prazo' ) ); | |
} | |
$dados = array( 'valor_total' => $valor_total, | |
'codigo_transacao' => $venda_historico->venda_historico_codigo_transacao, | |
'codigo_pagamento' => $venda_historico->venda_historico_codigo_pagamento, | |
'venda_codigo_pedido' => $venda->venda_codigo_pedido ); | |
//------------------------------- | |
// Realiza o estorno e verifica a resposta | |
//------------------------------- | |
$resultado_estorno = $pagamento->estorno_compra_cartao_credito( $dados ); | |
//Cria um historico de transacao para essa venda com o status de cancelamento | |
$venda_historico_estorno = Helper::cria_nova_transacao( $venda->venda_id, $resultado_estorno, | |
Config::get( 'cafufa.venda_status_cancelada' ) ); | |
$venda_historico_estorno->save(); | |
if ( $resultado_estorno['sucesso'] ) { | |
$venda->venda_status_id = Config::get( 'cafufa.venda_status_cancelada' ); | |
} else { | |
//Deu erro no estorno. Muda o status para o status de aprovada e salva no historico | |
$venda_historico_estorno->venda_status_id = Config::get( 'cafufa.venda_status_aprovada' ); | |
$venda_historico_estorno->save(); | |
Venda::commit_transaction(); | |
return array( | |
"status" => Config::get( "cafufa.cancelar_venda_status_falha" ), | |
"msg" => Config::get( 'cafufa.erro_comunicacao_banco' ) | |
); | |
} | |
} elseif ( $venda->venda_status_id == Config::get( 'cafufa.venda_status_em_analise' ) ) { | |
//Cria um historico de transacao para cancelar | |
$venda_historico_analise = new VendaHistorico(); | |
$venda_historico_analise->venda_id = $venda_id; | |
$venda_historico_analise->venda_status_id = Config::get( 'cafufa.venda_status_cancelada' ); | |
$venda_historico_analise->save(); | |
//muda o status para cancelada | |
$venda->venda_status_id = Config::get( 'cafufa.venda_status_cancelada' ); | |
} else { | |
Venda::rollback_transaction(); | |
return array( "status" => Config::get( "cafufa.cancelar_venda_status_falha" ), | |
"msg" => "Compra já foi devolvida ou cancelada!" ); | |
} | |
} //end else é uma compra de cartao de credito | |
//------------------------------ | |
// Finaliza transacao no BD | |
//------------------------------ | |
if( ! $venda->save() ) { | |
Venda::rollback_transaction(); | |
return array( "status" => Config::get( "cafufa.cancelar_venda_status_falha" ), "msg" => $venda->errors ); | |
} | |
//Manda as mudancas para o banco | |
Venda::commit_transaction(); | |
//----------------------------- | |
// Envia email de cancelamento para o cliente | |
//----------------------------- | |
$dados_email = array( 'cliente_nome' => $usuario->usuario_nome, | |
'cliente_email' => $usuario->usuario_email, | |
'venda_id' => $venda->venda_id, | |
'ingressos' => $ingressos ); | |
$mailer = new Mailer(); | |
$mailer->enviar_cliente_compra_cancelada( $dados_email ); | |
//Retorna para a pagina com sucesso | |
return array( "status" => Config::get( "cafufa.cancelar_venda_status_sucesso" ), | |
"msg" => "Transação de cancelamento realizada com sucesso." ); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment