/home/dvjjulio/test.istyle.mx/app/Http/Controllers/ComisionesController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Venta;
use App\Cliente;
use App\Comision;
use Uuid;
use Auth;
use App\Helper;
use App\Http\Controllers\ComisionPagoController;
use App\Nivel;

class ComisionesController extends Controller
{
  //
  public function index()
  {
    $clientesI = new Cliente();
    $clientes = $clientesI->Clientes();

    $redes = new Venta();

    $years = $redes->monthYearVenta();
    // $months = $redes->monthYearVenta(date('Y'));
    $months = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];

    // $clientes = Cliente::where('status_id', 1)->get();


    /* $redController = new RedController();
      $red = [];
      $comisiones = [];

      $total = 0;
      $comision = 0;
      $red_size = 0;
      $message = "";
      $year = date('Y');
      $month = date('m');

      foreach ($clientes as $key => $value) {
        $compra = $redes->cliente_compra($value->id);
        $ids = '"'.$value->id.'"';
        for($i = 1; $i<= 4; $i++){
          $red_first = $redes->red_first($ids,$i);
          if(isset($red_first)){
            $ids = $redController->get_ids($red_first);
            $red[$i] = $red_first;
            foreach($red_first as $val){
              if($val->total < 4000 | !$val->comisiona){
                $comision += 0;
              }else{
                $comision += $val->comision;
              }
              $red_size++;
              $total += $val->total;
            }
          }else{
              break;
          }
        } */

    /*if($comision >= 10000){
            $frontales = $redController->afterTen($value->id,$year,$month);
          if($frontales < 5){
            $message = "Necesitas tus 5 frontales con venta para tu comisi贸n completa";
            $comision = 0;
            $ids = '"'.$value->id.'"';
            $front = 1;
            for($i = 1; $i<= 2; $i++){
               $red_first = $redes->red_first($ids,$i);
              if(isset($red_first)){
                $ids = $redController->get_ids($red_first);
                foreach($red_first as $val){
                  if($val->total >= 4000){
                    if($front <= $frontales){
                      $comision += $val->comision;
                      $front++;
                    }
                  }
                }
                $front = 1;
              }
            }
          }

        }

        if($comision != 0){
          $comisiones[$key] = [ 'cliente'=> $value->nombre." ".$value->ape_p." ".$value->ape_m, 'tel'=> $value->tel, 'id'=>$value->id, 'pagado' => $value->pagado, 'comision'=>$comision, 'total' => $total,
                                'compra'=>$compra, 'message' => $message  ];
        }
      } */
    $comision = new Comision();
    $comisiones = $comision->existPay(null, null, null);
    $totalPagado = $comision->totalPagado(null, null, null);
    $totalPagado = $totalPagado[0]->total;
    $data = ['years' => $years, 'months' => $months];

    return view('Catalogos.Comisiones')->with(compact('comisiones', 'clientes', 'data'));
  }

  public function getComisiones(Request $request)
  {
    $data = $request->all();

    $comision = new Comision();

    $comisiones = $comision->existPay($data['cliente'], $data['year'], $data['month']);

    $totalPagado = $comision->totalPagado($data['year'], $data['month'], $data['cliente']);
    $totalPagado = $totalPagado[0]->total;

    return view('Catalogos.sectionComisiones')->with(compact('comisiones', 'totalPagado'));
  }

  public function getComisiones_updated(Request $request)
  {

    $data = $request->all();

    $redes = new Venta();
    $comisiones_ = new Comision();

    if ($data['cliente'] != "vacio") {
      $clientesI = new Cliente();
      $clientes = $clientesI->Clientes($data['cliente']);
    } else {
      $clientes = Cliente::where('status_id', 1)->OrderBy('nombre')->get();
    }

    $year = $data['year'];
    $month = $data['month'];

    $redController = new RedController();
    $red = [];
    $comisiones = [];


    foreach ($clientes as $key => $value) {

      $total = 0;
      $comision = 0;
      $red_size = 0;
      $message = "";

      $compra = $redes->cliente_compra($value->id, $year, $month);
      $ids = '"' . $value->id . '"';
      for ($i = 1; $i <= 4; $i++) {
        $red_first = $redes->red_first($ids, $i, $month, $year);
        if (isset($red_first)) {
          $ids = $redController->get_ids($red_first);
          $red[$i] = $red_first;
          foreach ($red_first as $val) {
            if ($val->total < 4000 | !$val->comisiona) {
              $comision += 0;
            } else {
              $comision += $val->comision;
            }
            $red_size++;
            $total += $val->total;
          }
        } else {
          break;
        }
      }
      if ($total >= 400000 || $value->nivel == 2) {
        $redController->checkLevel($value->id, 2);
        $frontales = $redController->afterTen($value->id, $year, $month);
        if ($frontales < 10) {
          $message = "Necesitas tus 10 frontales con venta para tu comisi贸n completa";
          $comision = 0;
          $ids = '"' . $value->id . '"';
          $front = 1;
          for ($i = 1; $i <= 2; $i++) {
            $red_first = $redes->red_first($ids, $i, $month, $year);
            if (isset($red_first)) {
              $ids = $redController->get_ids($red_first);
              foreach ($red_first as $val) {
                if ($val->total >= 4000) {
                  if ($front <= $frontales) {
                    $comision += $val->comision;
                    $front++;
                  }
                }
              }
              $front = 1;
            }
          }
        }
      } else if ($comision >= 10000 || $value->nivel == 1) {
        $redController->checkLevel($value->id, 1);
        $frontales = $redController->afterTen($value->id, $year, $month);
        if ($frontales < 5) {
          $message = "Necesitas tus 5 frontales con venta para tu comisi贸n completa";
          $comision = 0;
          $ids = '"' . $value->id . '"';
          $front = 1;
          for ($i = 1; $i <= 2; $i++) {
            $red_first = $redes->red_first($ids, $i, $month, $year);
            if (isset($red_first)) {
              $ids = $redController->get_ids($red_first);
              foreach ($red_first as $val) {
                if ($val->total >= 4000) {
                  if ($front <= $frontales) {
                    $comision += $val->comision;
                    $front++;
                  }
                }
              }
              $front = 1;
            }
          }
        }
      }

      if ($comision != 0) {
        $comision_ = $comisiones_->existPay($value->id, $year, $month);
        $comisiones[$key] = [
          'cliente' => $value->nombre . " " . $value->ape_p . " " . $value->ape_m,
          'tel' => $value->tel,
          'id' => $value->id,
          'pagado' => (isset($comision_)) ? $comision_[0]->pagado : null,
          'comision' => $comision,
          'total' => $total,
          'compra' => $compra,
          'message' => $message
        ];
      }
    }
    $totalPagado = $comisiones_->totalPagado($year, $month, $data['client']);
    $totalPagado = $totalPagado[0]->total;
    return view('Catalogos.sectionComisiones')->with(compact('comisiones', 'totalPagado'));
  }

  public function payComisiones(Request $request)
  {
    $data = $request->all();

    $comisiones = new Comision();

    $exist = $comisiones->existPay($data['cliente_id'], $data['year'], $data['month']);

    if (!isset($exist)) {
      $comisiones->id = Uuid::generate()->string;
    } else {
      $comisiones = Comision::find($exist[0]->id);
    }

    $comisiones->cliente_id = $data['cliente_id'];
    $comisiones->ano        = $data['year'];
    $comisiones->mes        = $data['month'];
    $comisiones->venta      = $data['venta'];
    $comisiones->comision   = $data['comision'];
    $comisiones->pagado     = $data['pay'];
    $comisiones->created_by = Auth::user()->id;

    if ($comisiones->save()) {
      $comisionPaid = $comisiones->updateComisionPagado($data['cliente_id'], $data['year'], $data['month'], $data['pay']);
      echo $comisionPaid;
      return response()->json(['status' => "success", 'message' => 'Pago guardado']);
    } else {
      return response()->json(['status' => "error", 'message' => 'Error al Guardar']);
    }
  }

  public function getMonths(Request $request)
  {
    $year = $request->input('year');

    $redes = new Venta();
    $months = $redes->monthYearVenta($year);

    $months_select = "<option value=''>Selecciona</option>";

    foreach ($months as $month) {
      $months_select .= "<option value='" . $month->mes . "'>" . Helper::month($month->mes) . "</option>";
    }

    return $months_select;
  }

  public function generateComisiones($client = null, $year, $month)
  {
    $data = "";

    $redes = new Venta();
    $comisiones_ = new Comision();

    if ($client != "" || $client != null) {
      $clientesI = new Cliente();
      $clientes = $clientesI->Clientes($client);
    } else {
      $clientes = Cliente::where('status_id', 1)->OrderBy('nombre')->get();
    }
    if ($year == null) $year = date('Y');
    if ($month == null) $month = date('m');

    $redController = new RedController();
    $red = [];
    $comisiones = [];

    foreach ($clientes as $key => $value) {

        $total = 0;
        $comision = 0;
        $red_size = 0;
        $message = "";
        $cantidad = 0;

        $compra = $redes->cliente_compra($value->id, $year, $month);
        $ids = '"'.$value->id.'"';
        for($i = 1; $i<= 4; $i++){
          $red_first = $redes->red_first($ids,$i,$month,$year);
          if(isset($red_first)){
            $ids = $redController->get_ids($red_first);
            $red[$i] = $red_first;
            foreach($red_first as $val){
              if ($val->total >= 4000 && $val->comisiona){
                $comision += $val->comision;
              }
              $red_size++;
              $total += $val->total;
              $cantidad += $val->cantidad;
            }
          }else{
              break;
          }
        }
        if($comision >= 400000 || $value->nivel == 2){
            $redController->checkLevel($value->id,2);
            $frontales = $redController->afterTen($value->id,$year,$month);
          if($frontales < 10){
            $message = "Necesitas tus 10 frontales con venta para tus activos";
            $comisionType = Helper::getComisionCountry($value->pais);
            $firstLevel = Nivel::where('nivel', 'Primer')->first();
            $comision = $frontales * $firstLevel->$comisionType;
            $ids = '"'.$value->id.'"';
            $front = 1;
            for($i = 1; $i<= 2; $i++){
               $red_first = $redes->red_first($ids,$i,$month,$year);
              if(isset($red_first)){
                $ids = $redController->get_ids($red_first);
                foreach($red_first as $val){
                  if($val->total >= 4000){
                    if($front <= $frontales){
                      // $comision += $val->comision;
                      $secondLevel = Nivel::where('nivel', 'Segundo')->first();
                      $comision += $val->nivel === 'Segundo' ? $secondLevel->$comisionType : 0;
                      $cantidad += $val->cantidad;
                      $front++;
                    }
                  }
                }
                $front = 1;
              }
            }
          }
        }else if(($comision >= 10000 && $comision <= 400000) || $value->nivel == 1){
            $redController->checkLevel($value->id, 1);
            $frontales = $redController->afterTen($value->id,$year,$month);
          if($frontales < 5){
            $message = "Necesitas tus 5 frontales con venta para tus activos";
            $comisionType = Helper::getComisionCountry($value->pais);
            $firstLevel = Nivel::where('nivel', 'Primer')->first();
            $comision = $frontales * $firstLevel->$comisionType;
            $ids = '"'.$value->id.'"';
            $front = 1;
            for($i = 1; $i<= 2; $i++){
              $red_first = $redes->red_first($ids,$i,$month,$year);
              if(isset($red_first)){
                $ids = $redController->get_ids($red_first);
                foreach($red_first as $val){
                  if($val->total >= 4000){
                    if($front <= $frontales){
                      $secondLevel = Nivel::where('nivel', 'Segundo')->first();
                      $comision += $val->nivel === 'Segundo' ? $secondLevel->$comisionType : 0;
                      // $comision += $val->comision;
                      $cantidad += $val->cantidad;
                      $front++;
                    }
                  }
                }
                $front = 1;
              }
            }
          }
        }
      $total_comision = $redes->Get_3_Months($value->id, $year, $month);
      if($comision != 0 || $total_comision[0]->comision != 0){
         $comision_ = $comisiones_->existPay($value->id, $year, $month);
         // $total_comision = $redes->Get_3_Months($value->id, $year, $month);
         $comision_3_meses = 0;
         if (isset($total_comision)) {
          $comision_3_meses = $total_comision[0]->comision;
         }
         $comisiones[$key] = [
                               'cliente'=> $value->nombre." ".$value->ape_p." ".$value->ape_m, 'tel'=> $value->tel, 
                               'id'     => $value->id,
                               'pagado' => (isset($comision_))? $comision_[0]->pagado : null,
                               'comision'=>$comision,
                               'comision_3meses' => $comision_3_meses,
                               'total'   => $total,
                               'compra'  => $compra,
                               'message' => ($compra) ? $message : 'NO TIENE DERECHO A ACTIVOS!'."<br />". $message,
                               'year'    => $year,
                               'month'   => $month,
                               'cantidad'   => $cantidad
                             ];
      }
    }
    $totalPagado = $comisiones_->totalPagado($year, $month, $client);
    $totalPagado = $totalPagado[0]->total;
    return $comisiones;
  }

  public function insertComisionesTerminal($clientId = null, $year = null, $month = null)
  {
    set_time_limit(300);
    // $info = $request->all();
    $data = $this->generateComisiones($clientId, $year, $month);

    // $data = array_slice($data, 0, 4);
    $comision_ = new Comision();
    foreach ($data as $key => $client) {
      $exist = $comision_->checkComisionUpdate($client['id'], null, $client['year'], $client['month'], $client['comision_3meses']);
      if ($exist) {
        if ($exist[0]->cliente_id == $client['id'] && $exist[0]->comision != $client['comision'] || $exist[0]->venta != $client['total'] || $exist[0]->comentarios != $client['message'] || $exist[0]->comision_3meses != $client['comision_3meses']) {
          $comision = Comision::find($exist[0]->id);
          $comision->venta = $client['total'];
          $comision->comision = $client['comision'];
          $comision->cantidad = $client['cantidad'];
          $comision->comentarios = $client['message'];
          $comision->comision_3meses = ($client['comision_3meses'] ? $client['comision_3meses'] : 0);
          if ($comision->save()) {
            echo 'saved correctly';
          } else {
            echo 'error to save';
          }
        } else {
          echo 'same';
        }
      } else {
        $comision = new Comision();
        $comision->id = Uuid::generate()->string;
        $comision->cliente_id = $client['id'];
        $comision->ano = $client['year'];
        $comision->mes = $client['month'];
        $comision->venta = $client['total'];
        $comision->comision = $client['comision'];
        $comision->cantidad = $client['cantidad'];
        $comision->comentarios = $client['message'];
        $comision->comision_3meses = ($client['comision_3meses'] ? $client['comision_3meses'] : 0);
        $comision->pagado = 0;
        $comision->status_id = 1;
        $comision->created_by = 'f3b078a0-5907-11e8-9745-4770ebde3703';

        if ($comision->save()) {
          echo 'saved correctly';
        } else {
          echo 'error to save';
        }
      }
    }
  }

  public function insertComisiones(Request $request)
  {
    set_time_limit(300);
    $info = $request->all();
    $data = $this->generateComisiones($info["clientId"], $info['year'], $info['month']);

    // $data = array_slice($data, 0, 4);
    $comision_ = new Comision();
    foreach ($data as $key => $client) {
      $exist = $comision_->checkComisionUpdate($client['id'], null, $client['year'], $client['month'], $client['comision_3meses']);
      if ($exist) {
        if ($exist[0]->cliente_id == $client['id'] && $exist[0]->comision != $client['comision'] || $exist[0]->venta != $client['total'] || $exist[0]->comentarios != $client['message'] || $exist[0]->comision_3meses != $client['comision_3meses']) {
          $comision = Comision::find($exist[0]->id);
          $comision->venta = $client['total'];
          $comision->comision = $client['comision'];
          $comision->cantidad = $client['cantidad'];
          $comision->comentarios = $client['message'];
          $comision->comision_3meses = ($client['comision_3meses'] ? $client['comision_3meses'] : 0);
          if ($comision->save()) {
            echo 'saved correctly';
          } else {
            echo 'error to save';
          }
        } else {
          echo 'same';
        }
      } else {
        $comision = new Comision();
        $comision->id = Uuid::generate()->string;
        $comision->cliente_id = $client['id'];
        $comision->ano = $client['year'];
        $comision->mes = $client['month'];
        $comision->venta = $client['total'];
        $comision->comision = $client['comision'];
        $comision->cantidad = $client['cantidad'];
        $comision->comentarios = $client['message'];
        $comision->comision_3meses = ($client['comision_3meses'] ? $client['comision_3meses'] : 0);
        $comision->pagado = 0;
        $comision->status_id = 1;
        $comision->created_by = 'f3b078a0-5907-11e8-9745-4770ebde3703';

        if ($comision->save()) {
          echo 'saved correctly';
        } else {
          echo 'error to save';
        }
      }
    }
  }

  public function updateGastoComision($client_id, $venta_id, $cantidad)
  {
    $venta = Venta::where('id', $venta_id)->first();
    $redes = new Venta();
    $date = \DateTime::createFromFormat("Y-m-d", $venta->fecha_venta);
    $year = $date->format("Y") ?? date('Y');
    $month = $date->format("m") ?? date('m');
    $getMonthsComision = $redes->Get_3_Months($client_id, $year, $month);
    return $this->iteratePreviousMonths($client_id, $getMonthsComision, $cantidad, $venta_id);
  }

  public function iteratePreviousMonths($client_id, $getMonthsComision, $cantidad, $venta_id)
  {
    $monts = ['firstMonth', 'secondMonth', 'thirdMonth'];
    $comisionPago = new ComisionPagoController();
    foreach ($monts as $value) {
      $comision = $this->getComision($client_id, $getMonthsComision[0]->$value);
      if ($comision && $cantidad > 0) {
        $restanteComision = ($comision['comision'] - $comision['comision_pagada']);
        if ($restanteComision > 0) {
          if ($cantidad > $restanteComision) {
            $comision->comision_pagada = $comision['comision_pagada'] + $restanteComision;
            if (!$comision->save()) return ['status' => false, 'message' => "saving Comision month: $value canidad: $restanteComision"];
            if (!$comisionPago->guardar($client_id, $venta_id, $restanteComision, $comision->id)) return ['status' => false, 'message' => "saving ComisionPago month: $value canidad: $restanteComision"];
          } else {
            if ($cantidad > 0) {
              $comision->comision_pagada = $comision['comision_pagada'] + $cantidad;
              if (!$comision->save()) return ['status' => false, 'message' => "saving Comision month: $value canidad: $restanteComision"];
              if (!$comisionPago->guardar($client_id, $venta_id, $cantidad, $comision->id)) return ['status' => false, 'message' => "saving ComisionPago month: $value canidad: $restanteComision"];
              return ['status' => true];
            }
          }
          $cantidad = $cantidad - $restanteComision;
        }
      }
    }
    return ['status' => true];
  }

  public function getComision($client_id, $date)
  {
    $date = \DateTime::createFromFormat("Y-m-d", $date);
    return Comision::where('cliente_id', $client_id)
      ->where('ano', $date->format("Y"))
      ->where('mes', $date->format("m"))
      ->where('comision', '>', 0)
      ->where('status_id', 1)
      ->first();
  }

  public function updateComisionGasto($comision_id, $cantidad)
  {
    $comision = Comision::where('id', $comision_id)->first();
    $restoComisionPagada = $comision->comision_pagada - $cantidad;
    $comision->comision_pagada = $restoComisionPagada;
    if ($comision->save()) {
      return true;
    } else {
      return false;
    }
  }
}