public static function registrarHistoricoTransacao($idTransacao, $novoEstado) { HistoricoMudancaEstado::create(['fkTransacao' => $idTransacao, 'fkEstadoTransacaoNovo' => $novoEstado]); }
public function store(Request $request) { //Pagamento/Efetivar $inputArray = $request->all(); $checkboxes = Session::get('checkbox'); if (!$checkboxes) { return Redirect::to('Pagamento\\Calcular')->withErrors(['Nenhuma assinatura foi selecionada']); } $valorRealGet = 0.0; $idUsuario = Auth::id(); $asCom = DB::table('assinaturas')->join('assinaturasFiliais', 'assinaturasFiliais.idAssinatura', '=', 'assinaturas.id')->join('filiais', 'assinaturasFiliais.idFilial', '=', 'filiais.id')->join('empresas', 'empresas.id', '=', 'filiais.idEmpresa')->join('planos', 'assinaturas.idPlano', '=', 'planos.id')->join('comerciantes', 'assinaturas.idComerciante', '=', 'comerciantes.id')->select('planos.valor', 'assinaturas.id as idAssinatura', 'empresas.nomeFantasia', 'comerciantes.idUsuario as idUsuario', 'empresas.id as idEmpresa')->whereIn('assinaturas.id', array_values($checkboxes))->get(); foreach ($asCom as $single) { $valorRealGet = $valorRealGet + $single->valor; } $valorRealGet = Transacao::getValorCentavos($valorRealGet); $inputArray['valorReal'] = $valorRealGet; $mensagensErro = array('min' => 'Valor a ser pago invalido.', 'numeric' => 'Valor a ser pago invalido.', 'valor_pagamento_positivo_minimo_valido' => 'Valor a ser pago não pode ser inferior a 1'); Validator::extend('valor_pagamento_positivo_minimo_valido', function ($attribute, $value, $parameters) { if (str_contains($value, 'R$ ')) { $floated = floatval(str_replace(',', '.', ltrim($value, "R\$ "))); if ($floated < 1) { return false; } else { return true; } } else { return false; } }); $validator = Validator::make($inputArray, ['valorPagamento' => 'required|min:1|valor_pagamento_positivo_minimo_valido', 'payment' => 'required', 'valorReal' => 'required|min:1'], $mensagensErro); if ($validator->fails()) { return Redirect::to('Pagamento/Calcular')->withErrors($validator); } Pagarme::setApiKey("ak_test_1jVGAUzxWNanzfTiW6yGX0cbA8Ywq7"); $idEmpresa = $asCom[0]->idEmpresa; $transacao = null; $transacao = Transacao::create(['idUsuario' => $idUsuario, 'idTipoTransacao' => Transacao::getTipoTransacao($inputArray['payment']), 'idEstadoTransacao' => '1', 'valorBruto' => $valorRealGet, 'cardHash' => Transacao::getSkipCardHash($inputArray), 'dataInicio' => date('y-m-d'), 'dataResposta' => date('y-m-d')]); HistoricoMudancaEstado::registrarHistoricoTransacao($transacao->id, EstadoTransacao::Criado); $dataValidade = new DateTime(date('y-m-d')); // $dataValidade = $dataValidade->add(DateInterval::createFromDateString('1 month')); //WRONG $assinaturasCliente = array_values($checkboxes); $assinaturasConfereData = null; foreach ($assinaturasCliente as $single) { $candidato = DB::table('pagamentos')->where('idAssinatura', $single)->orderBy('validade', 'asc')->first(); if ($candidato) { //existe pagamento if ($candidato->isPaid == 1) { //foi pago?, entao pegar a data de vencimento e add1mes $dataAntiga = new DateTime($candidato->validade); $dataValidade = new DateTime(date('y-m-d')); $checkDate = $dataValidade->diff($dataAntiga); $dataValidade = $dataValidade->add(DateInterval::createFromDateString('1 month')); if (!$checkDate->invert) { $dataValidade->setDate($dataValidade->format('y'), $dataValidade->format('m'), $dataAntiga->format('d')); //set o mesmo dia do vencimento } else { } $assinaturasConfereData[$single] = $dataValidade; } } else { //nunca existiu pagamento, criar o primeiro vencimento $dataValidade = new DateTime(date('y-m-d')); $assinaturasConfereData[$single] = $dataValidade->add(DateInterval::createFromDateString('1 month')); } } switch ($transacao->idTipoTransacao) { //TODO: fazer a pagina mostrando pagamento efetuado etc default: case 1: //pagamentocartaosimples $transactionPagarMe = new PagarMe_Transaction(array('amount' => $transacao->valorBruto, 'card_hash' => $transacao->cardHash)); $transactionPagarMe->charge(); if ($transactionPagarMe->status == 'paid') { foreach ($asCom as $single) { $pagamento = Pagamento::create(['isPaid' => 1, 'idUsuario' => $idUsuario, 'valor' => Transacao::converteCentavos($single->valor), 'dataPagamento' => date('y-m-d'), 'dataBaixa' => date('y-m-d'), 'idAssinatura' => $single->idAssinatura, 'idTransacao' => $transacao->id, 'validade' => $assinaturasConfereData[$single->idAssinatura]]); } $transacao->idEstadoTransacao = EstadoTransacao::Pago; $transacao->save(); HistoricoMudancaEstado::registrarHistoricoTransacao($transacao->id, EstadoTransacao::Pago); return "thank you " . $transactionPagarMe->status; } else { HistoricoMudancaEstado::registrarHistoricoTransacao($transacao->id, EstadoTransacao::Recusado); $transacao->idEstadoTransacao = EstadoTransacao::Recusado; $transacao->save(); return "sorry " . $transactionPagarMe->status; } //TODO: fazer pagina informando o resultado do pagamento //TODO: fazer pagina informando o resultado do pagamento case 2: ///assinatura $transactionPagarMe = new PagarMe_Transaction(array('amount' => $transacao->valorBruto, 'card_hash' => $transacao->cardHash)); $transactionPagarMe->charge(); $card = new PagarMe_Card(array('card_hash' => $transacao->cardHash)); $card->create(); $card_id = $card->id; //$transacao->save(); //TODO: criar CRONJOB para recobrar if ($transactionPagarMe->status == 'paid') { foreach ($asCom as $single) { $pagamento = Pagamento::create(['isPaid' => 1, 'idUsuario' => $idUsuario, 'valor' => Transacao::converteCentavos($single->valor), 'dataPagamento' => date('y-m-d'), 'dataBaixa' => date('y-m-d'), 'idAssinatura' => $single->idAssinatura, 'idTransacao' => $transacao->id, 'validade' => $assinaturasConfereData[$single->idAssinatura]]); } $transacao->idEstadoTransacao = EstadoTransacao::Pago; $transacao->cardHashMensal = $card_id; $transacao->save(); HistoricoMudancaEstado::registrarHistoricoTransacao($transacao->id, EstadoTransacao::Pago); return "thank you " . $transactionPagarMe->status; } else { HistoricoMudancaEstado::registrarHistoricoTransacao($transacao->id, EstadoTransacao::Recusado); return "sorry " . $transactionPagarMe->status; } //return $status = $transactionPagarMe->status . ' ' . $card_id; //return $status = $transactionPagarMe->status . ' ' . $card_id; case 3: //boleto $transaction = new PagarMe_Transaction(array('amount' => $transacao->valorBruto, 'payment_method' => "boleto")); foreach ($asCom as $single) { $pagamento = Pagamento::create(['isPaid' => 0, 'idUsuario' => $idUsuario, 'valor' => Transacao::converteCentavos($single->valor), 'dataPagamento' => date('y-m-d'), 'dataBaixa' => date('y-m-d'), 'idAssinatura' => $single->idAssinatura, 'idTransacao' => $transacao->id, 'validade' => $assinaturasConfereData[$single->idAssinatura]]); } $transaction->charge(); $boleto_url = $transaction->boleto_url; // URL do boleto bancário $boleto_barcode = $transaction->boleto_barcode; // código de barras do boleto bancário $transacao->idEstadoTransacao = EstadoTransacao::PagamentoPendente; $transacao->numeroBoleto = $boleto_barcode; $transacao->save(); HistoricoMudancaEstado::registrarHistoricoTransacao($transacao->id, EstadoTransacao::PagamentoPendente); //TODO: provavelmente gerar a pagina do boleto? no ambiente de teste só aparece return $boleto_barcode . ' ' . $boleto_url; } }