Skip to content

Instantly share code, notes, and snippets.

@bslima
Created July 31, 2013 15:34
Show Gist options
  • Save bslima/6123074 to your computer and use it in GitHub Desktop.
Save bslima/6123074 to your computer and use it in GitHub Desktop.
Cancelar venda cafufa
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