<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Requests;
use Illuminate\Support\Facades\Redirect;
use Illuminate\Support\Facades\Input;
use App\Http\Requests\VentaFormRequest;
use App\Models\Venta;
use App\Models\DetalleVenta;
use DB;
use Illuminate\Support\Facades\Session;
use Carbon\Carbon;
use Response;
use Illuminate\Support\Collection;
use Codedge\Fpdf\Fpdf\Fpdf;

class VentaController extends Controller
{
    private $fpdf;
    public function __construct()
    {
        $this->middleware('permission:venta-list|venta-create|venta-edit|venta-delete', ['only' => ['index','show']]);
        $this->middleware('permission:venta-create', ['only' => ['create','store']]);
        $this->middleware('permission:venta-edit', ['only' => ['edit','update']]);
        $this->middleware('permission:venta-delete', ['only' => ['destroy']]);
    }
    public function index(Request $request)
    {
        if ($request)
        {
           $query=trim($request->get('searchText'));
           $ventas=DB::table('venta as v')
            ->join('persona as p','v.idcliente','=','p.idpersona')
            ->join('detalle_venta as dv','v.idventa','=','dv.idventa')
            ->select('v.idventa','v.fecha_hora','p.nombre','v.tipo_comprobante','v.serie_comprobante','v.num_comprobante','v.impuesto','v.estado','v.total_venta')
            ->where('v.num_comprobante','LIKE','%'.$query.'%')
            ->orderBy('v.idventa','desc')
            ->groupBy('v.idventa','v.fecha_hora','p.nombre','v.tipo_comprobante','v.serie_comprobante','v.num_comprobante','v.impuesto','v.estado','v.total_venta')
            ->paginate(10);
            return view('ventas.venta.index',["ventas"=>$ventas,"searchText"=>$query]);

        }

    }
    public function create()
    {
        $personas=DB::table('persona')->where('tipo_persona','=','Cliente')->get();
        $articulos = DB::table('articulo as art')
            ->join('detalle_ingreso as di','art.idarticulo','=','di.idarticulo')
            ->select(DB::raw('CONCAT(art.codigo, " - ",art.nombre) AS articulo'),'art.idarticulo','art.stock',DB::raw('avg(di.precio_venta) as precio_promedio'))
            ->where('art.estado','=','Activo')
            ->where('art.stock','>','0')
            ->groupBy('articulo','art.idarticulo','art.stock')
            ->get();
        return view("ventas.venta.create",["personas"=>$personas,"articulos"=>$articulos]);
    }

     public function store (VentaFormRequest $request)
    {
        try{
            DB::beginTransaction();
            $venta=new Venta;
            $venta->idcliente=$request->get('idcliente');
            $venta->tipo_comprobante=$request->get('tipo_comprobante');
            $venta->serie_comprobante=$request->get('serie_comprobante');
            $venta->num_comprobante=$request->get('num_comprobante');
            $venta->total_venta=$request->get('total_venta');

            $mytime = Carbon::now('America/Santo_Domingo');
            $venta->fecha_hora=$mytime->toDateTimeString();
            if ($request->get('impuesto')=='1')
            {
                $venta->impuesto='18';
            }
            else
            {
                $venta->impuesto='0';
            }
            $venta->estado='Activo';
            $venta->save();

            $idarticulo = $request->get('idarticulo');
            $cantidad = $request->get('cantidad');
            $descuento = $request->get('descuento');
            $precio_venta = $request->get('precio_venta');

            $cont = 0;

            while($cont < count($idarticulo)){
                $detalle = new DetalleVenta();
                $detalle->idventa= $venta->idventa;
                $detalle->idarticulo= $idarticulo[$cont];
                $detalle->cantidad= $cantidad[$cont];
                $detalle->descuento= $descuento[$cont];
                $detalle->precio_venta= $precio_venta[$cont];
                $detalle->save();
                $cont=$cont+1;
            }

            DB::commit();

        }catch(\Exception $e)
        {
            DB::rollback();
        }

        session::flash('statuscode','success');
        return Redirect::to('ventas/venta')->with('status','Venta creado con éxito.');
    }

    public function show($id)
    {
        $venta=DB::table('venta as v')
            ->join('persona as p','v.idcliente','=','p.idpersona')
            ->join('detalle_venta as dv','v.idventa','=','dv.idventa')
            ->select('v.idventa','v.fecha_hora','p.nombre','v.tipo_comprobante','v.serie_comprobante','v.num_comprobante','v.impuesto','v.estado','v.total_venta')
            ->where('v.idventa','=',$id)
            ->first();

        $detalles=DB::table('detalle_venta as d')
             ->join('articulo as a','d.idarticulo','=','a.idarticulo')
             ->select('a.nombre as articulo','d.cantidad','d.descuento','d.precio_venta')
             ->where('d.idventa','=',$id)
             ->get();
        return view("ventas.venta.show",["venta"=>$venta,"detalles"=>$detalles]);
    }

    public function destroy($id)
    {
        $venta=Venta::findOrFail($id);
        $venta->Estado='Anulado';
        $venta->update();

        session::flash('statuscode','success');
        return Redirect::to('ventas/venta')->with('status','Venta anulado con éxito.');
    }


    public function reportec($id){
         //Obtengo los datos

        $venta=DB::table('venta as v')
            ->join('persona as p','v.idcliente','=','p.idpersona')
            ->join('detalle_venta as dv','v.idventa','=','dv.idventa')
            ->select('v.idventa','v.fecha_hora','p.nombre','p.direccion','p.num_documento','v.tipo_comprobante','v.serie_comprobante','v.num_comprobante','v.impuesto','v.estado','v.total_venta')
            ->where('v.idventa','=',$id)
            ->first();

        $detalles=DB::table('detalle_venta as d')
             ->join('articulo as a','d.idarticulo','=','a.idarticulo')
             ->select('a.nombre as articulo','d.cantidad','d.descuento','d.precio_venta')
             ->where('d.idventa','=',$id)
             ->get();

        $empresas=DB::table('empresa')
           ->select('ruc','razon_social','direccion','telefono','correo','pag_web','logo')
           ->first();

           $pdf = new FPDF('P', 'mm','A4');
           $pdf->AddPage();
           $pdf->Image('imagenes/empresa/'.$empresas->logo,10,20,40);

           $pdf->SetFont('Arial','B',12);
           $pdf->SetXY(75,20);
           $pdf->Cell(20  ,0,utf8_decode(strtoupper($empresas->razon_social)),0,0,'C');

           $pdf->SetFont('Arial','',10);
           $pdf->SetXY(75,25);
           $pdf->Cell(20  ,0,utf8_decode(strtoupper('RUC: '.$empresas->ruc)),0,0,'C');

           $pdf->SetFont('Arial','',10);
           $pdf->SetXY(75,30);
           $pdf->Cell(20  ,0,utf8_decode(strtoupper($empresas->direccion)),0,0,'C');

           $pdf->SetFont('Arial','',10);
           $pdf->SetXY(75,35);
           $pdf->Cell(20  ,0,utf8_decode(strtoupper($empresas->correo)),0,0,'C');

           $pdf->SetFont('Arial','',10);
           $pdf->SetXY(75,40);
           $pdf->Cell(20  ,0,utf8_decode(strtoupper($empresas->pag_web)),0,0,'C');

           $pdf->SetFont('Arial','',10);
           $pdf->SetXY(75,45);
           $pdf->Cell(20  ,0,utf8_decode(strtoupper('celular: ' . $empresas->telefono)),0,0,'C');

           $pdf->SetFont('Arial','',9);
           $pdf->SetXY(155,10);
           $pdf->MultiCell(55,0,utf8_decode('Fecha Impresión: '.date('m - d - Y')),0,'C');

            $pdf->SetFont('Arial','B',14);
            $pdf->SetXY(140,20);
            $pdf->MultiCell(55,9,utf8_decode(strtoupper($venta->tipo_comprobante.' DE VENTA ELECTRONICA')),1,'C');
            $pdf->SetFont('Arial','',14);
            $pdf->SetXY(140,38);
            $pdf->MultiCell(55,9,utf8_decode($venta->serie_comprobante."-".$venta->num_comprobante),1,'C');

            $pdf->SetFont('Arial','B',10);
            $pdf->SetXY(20,55);
            $pdf->Cell(20  ,0,utf8_decode('CLIENTE:'),0,0,'C');
            $pdf->SetFont('Arial','',10);
            $pdf->SetXY(40,55);
            $pdf->Cell(0,0,utf8_decode(strtoupper($venta->nombre)));

            $pdf->SetFont('Arial','B',10);
            $pdf->SetXY(23,63);
            $pdf->Cell(20  ,0,utf8_decode('DIRECCIÓN:'),0,0,'C');
            $pdf->SetFont('Arial','',10);
            $pdf->SetXY(46,63);
            $pdf->Cell(0,0,utf8_decode(strtoupper($venta->direccion)));
            //***Parte de la derecha
        $pdf->SetFont('Arial','B',10);
        $pdf->SetXY(170,55);
        $pdf->Cell(0  ,0,utf8_decode('DNI:'),0,0);
        $pdf->SetFont('Arial','',10);
        $pdf->SetXY(180,55);
        $pdf->Cell(0,0,utf8_decode($venta->num_documento));

        $pdf->SetFont('Arial','B',10);
        $pdf->SetXY(165,63);
        $pdf->Cell(20  ,0,utf8_decode('FECHA:'),0,0);
        $pdf->SetFont('Arial','',10);
        $pdf->SetXY(180,63);
        $pdf->Cell(20,0,substr($venta->fecha_hora,0,10));
        $total=0;

        $y=70;

        $pdf->SetFont('Arial','B',12);
        $pdf->SetXY(20,$y);
        $pdf->Cell(20  ,10,'CANT.',0,0,'C');
        $pdf->SetXY(40,$y);
        $pdf->Cell(110  ,10,utf8_decode('DESCRIPCIÓN'));
        $pdf->SetXY(150,$y);
        $pdf->Cell(25   ,10,'P. UNITARIO',0,0,'C');
        $pdf->SetXY(175,$y);
        $pdf->Cell(25,10,'IMPORTE',0,0,'C');//end of line
        $pdf->Line(20,70,200,70);
        $pdf->Line(20,80,200,80);
        $pdf->SetFillColor(232, 232, 232);

        //Mostramos los detalles
        $y=82;
        $pdf->SetFont('Arial','',12);
        foreach($detalles as $det){
            $pdf->SetXY(20,$y);
            $pdf->MultiCell(20,10,$det->cantidad,0,'C');

            $pdf->SetXY(40,$y);
            $pdf->MultiCell(110,10,utf8_decode(strtoupper($det->articulo)));

            $pdf->SetXY(150,$y);
            $pdf->MultiCell(25,10,$det->precio_venta-$det->descuento,0,'C');

            $pdf->SetXY(175,$y);
            $pdf->MultiCell(25,10,sprintf("%0.2F",(($det->precio_venta-$det->descuento)*$det->cantidad)),0,'C');

            $total=$total+($det->precio_venta*$det->cantidad);
            $y=$y+7;
        }

        $pdf->Line(20,191,200,191);
        $pdf->Line(20,192,200,192);
        $pdf->SetFont('Arial','B',10);
        $pdf->SetXY(150,195);
        $pdf->Cell(0  ,0,'SUB TOTAL:');
        $pdf->SetXY(180,195);
        $pdf->MultiCell(35,0,"S/. ".sprintf("%0.2F", $venta->total_venta-($venta->total_venta*$venta->impuesto/($venta->impuesto+100))));

        $pdf->SetXY(128,200);
        $pdf->Cell(0  ,0,'TOTAL IMPUESTO (18%):');
        $pdf->SetXY(180,200);
        $pdf->MultiCell(35,0,"S/. ".sprintf("%0.2F", ($venta->total_venta*$venta->impuesto/($venta->impuesto+100))));

        $pdf->SetXY(143,205);
        $pdf->Cell(0  ,0,'TOTAL PAGAR:');
        $pdf->SetXY(180,205);
        $pdf->MultiCell(35,0,"S/. ".sprintf("%0.2F", $venta->total_venta));

        $pdf->Output();
        exit;
    }
    public function reporte(){
         //Obtenemos los registros
         $registros=DB::table('venta as v')
            ->join('persona as p','v.idcliente','=','p.idpersona')
            ->join('detalle_venta as dv','v.idventa','=','dv.idventa')
            ->select('v.idventa','v.fecha_hora','p.nombre','v.tipo_comprobante','v.serie_comprobante','v.num_comprobante','v.impuesto','v.estado','v.total_venta')
            ->orderBy('v.idventa','desc')
            ->groupBy('v.idventa','v.fecha_hora','p.nombre','v.tipo_comprobante','v.serie_comprobante','v.num_comprobante','v.impuesto','v.estado','v.total_venta')
            ->get();
        $empresas=DB::table('empresa')
           ->select('ruc','razon_social','direccion','telefono','correo','pag_web','logo')
           ->first();

           $pdf = new FPDF('P', 'mm','A4');
           $pdf->AddPage();
           $pdf->Image('imagenes/empresa/'.$empresas->logo,10,10,60);

           $pdf->SetFont('Arial','B',10);
           $pdf->SetXY(100,15);
           $pdf->Cell(20  ,0,utf8_decode(strtoupper($empresas->razon_social)),0,0,'C');

           $pdf->SetFont('Arial','',9);
           $pdf->SetXY(100,20);
           $pdf->Cell(20  ,0,utf8_decode(strtoupper('RUC: '.$empresas->ruc)),0,0,'C');

           $pdf->SetFont('Arial','',8);
           $pdf->SetXY(100,24);
           $pdf->Cell(20  ,0,utf8_decode(strtoupper($empresas->direccion)),0,0,'C');

           $pdf->SetFont('Arial','',8);
           $pdf->SetXY(100,28);
           $pdf->Cell(20  ,0,utf8_decode($empresas->correo ." - ". $empresas->pag_web ." - ". $empresas->telefono),0,0,'C');

           $pdf->SetFont('Arial','B',9);
           $pdf->SetXY(155,20);
           $pdf->MultiCell(55,0,utf8_decode('Fecha Impresión'),0,'C');
           $pdf->SetFont('Arial','',9);
           $pdf->SetXY(155,25);
           $pdf->MultiCell(55,0,utf8_decode(date('m - d - Y')),0,'C');

           $pdf->SetFont('Arial','B',12);
           $pdf->SetXY(80,37);
           $pdf->Cell(50,0,utf8_decode('REPORTE DE VENTAS'),0,0,'C');

           $pdf->Line(10,41,200,41);
           $pdf->Line(10,42,200,42);

           $pdf->Ln(8);
           $pdf->SetTextColor(0,0,0);  // Establece el color del texto
           $pdf->SetFillColor(232, 232, 232); // establece el color del fondo de la celda
           $pdf->SetFont('Arial','B',11);
         //El ancho de las columnas debe de sumar promedio 190
         $pdf->cell(30,8,utf8_decode("Fecha"),1,"","C",true);
         $pdf->cell(80,8,utf8_decode("Cliente"),1,"","C",true);
         $pdf->cell(35,8,utf8_decode("Comprobante"),1,"","C",true);
         $pdf->cell(10,8,utf8_decode("Imp"),1,"","C",true);
         $pdf->cell(20,8,utf8_decode("Total"),1,"","C",true);
         $pdf->cell(15,8,utf8_decode("Estado"),1,"","C",true);

         $pdf->Ln();
         $pdf->SetTextColor(0,0,0);  // Establece el color del texto
         $pdf->SetFillColor(255, 255, 255); // establece el color del fondo de la celda
         $pdf->SetFont("Arial","",8);

         foreach ($registros as $reg)
         {
            $pdf->cell(30,8,utf8_decode($reg->fecha_hora),1,"","L",true);
            $pdf->cell(80,8,utf8_decode($reg->nombre),1,"","L",true);
            $pdf->cell(35,8,utf8_decode($reg->tipo_comprobante.': '.$reg->serie_comprobante.'-'.$reg->num_comprobante),1,"","L",true);
            $pdf->cell(10,8,utf8_decode($reg->impuesto),1,"","C",true);
            $pdf->cell(20,8,utf8_decode($reg->total_venta),1,"","R",true);
            $pdf->cell(15,8,utf8_decode($reg->estado),1,"","C",true);
            $pdf->Ln();
         }

         $pdf->Output();
         exit;
    }
}