<?php
namespace App\Http\Controllers;

use App\Custom\SQLConnection;
use App\Custom\Misc;

use Illuminate\Support\Facades\Response;
use Illuminate\Support\Facades\Session;
use Illuminate\Support\Facades\Request;

use App\Custom\Classes\SociedadesHelper;
use Datetime;
use DB;
use Route;
use stdClass;


class FacturacionController extends Controller {

	public function index() {
		if (Request::input('ruta') !== null) {
			$ruta = '/' . Request::input('ruta');
		} else {
			$ruta = '/';
		}
		//
		$titulo_navbar = 'Facturación';
		return view('/facturacion/panel_clientes')->with(compact('ruta', 'titulo_navbar'));
	}

	public function buscarCliente() {
		if (isset($_POST['clienteOk']) && !Misc::tieneCaracterRaroBase($_POST['clienteOk'])) {
			$valoresConsulta = $_POST['clienteOk'];
			$data = explode('-', trim($valoresConsulta));
			$ruta = '/fact/facturacion-manual';
			$cli_codigo = trim($data[0]);
			$cliente = $data[1];
			$titulo_navbar = 'Datos del cliente';

			$params = array($cliente);
			$datos_cliente = SQLConnection::backendStoreProcedure("backend_datos_clientes", $params, 'selectOne');	//	SP con datos del cliente
			$cliente_condiciones = SQLConnection::backendStoreProcedure("cliente_condiciones_", array('select', $cliente), 'selectOne');	//	SP con datos del cliente
			$dias_vto_factura = $cliente_condiciones->dias_vto_factura ?? '7';
			$nombre_cliente = $datos_cliente->nombre;
			$cli_cuit = $datos_cliente->cuit;
			//------

			$fecha_actual = date("Y-m-d");
			$fecha_vencimiento = date("Y-m-d", strtotime($fecha_actual . "+ " . $dias_vto_factura . " days"));

			$periodo = [];
			$periodo[0] = date("Y-m", strtotime($fecha_actual . "- 2 month"));
			$periodo[1] = date("Y-m", strtotime($fecha_actual . "- 1 month"));
			$periodo[2] = date("Y-m");
			$periodo[3] = date("Y-m", strtotime($fecha_actual . "+ 1 month"));
			$nro_pedido = SQLConnection::backendStoreProcedure("Facturacion_enc_pedido", array(), 'selectOne')->nro_pedido;
			$resiva = SQLConnection::backendStoreProcedure("resiva_", array(), 'selectAll');
			return view('facturacion/facturacion_manual')->with(compact('datos_cliente', 'cli_codigo', 'cliente', 'ruta', 'nombre_cliente', 'cli_cuit', 'titulo_navbar', 'periodo', 'nro_pedido', 'resiva', 'fecha_actual', 'fecha_vencimiento', 'cliente_condiciones'));
		} else {
			return 0;
		}
	}

	public function clienteCondidiones() {
		$cliente = Request::input('cliente');
		$cli_codigo = Request::input('cli_codigo');
		$cond_iva = Request::input('cond_iva');
		$cond_moneda = Request::input('cond_moneda');
		$cond_forma_cobro = Request::input('cond_forma_cobro');
		$cond_dias_vto_factura = Request::input('cond_dias_vto_factura');
		$cond_tolerancia_mora = Request::input('cond_tolerancia_mora');
		$sesion = Request::session()->all();
		$user_id = $sesion['usuario']->user_id;
		$cliente_condiciones = SQLConnection::backendStoreProcedure("cliente_condiciones_", array('update', $cliente, $cli_codigo, $cond_iva, $cond_moneda, $cond_forma_cobro, $cond_dias_vto_factura, $cond_tolerancia_mora, $user_id), 'selectOne');
		$fecha_factura = Request::input('fecha_factura');
		$fecha_vencimiento = date("Y-m-d", strtotime($fecha_factura . "+ " . $cond_dias_vto_factura . " days"));
		return json_encode(array('procesado' => (isset($cliente_condiciones) && isset($cliente_condiciones->respuesta)) ? true : false, 'fecha_vencimiento' => $fecha_vencimiento ?? ''));
	}
	public function hacerPedido() {
		$sesion = Request::session()->all();
		$cliente = Request::input('cliente');
		$cli_codigo = Request::input('cli_codigo');
		$cli_nombre = Request::input('cli_nombre');
		$cli_cuit = Request::input('cli_cuit');
		$resiva = Request::input('iva');
		$moneda = Request::input('moneda');
		$cotizacion = Request::input('cotizacion') ?? '1';
		if ($moneda == 'PES') {
			$cotizacion = '1';
		}
		$nro_pedido = Request::input('nro_pedido');
		$periodo = Request::input('periodo');
		$comprobante = Request::input('comprobante');
		$fecha = Request::input('fecha');
		$vencimiento = Request::input('vencimiento');
		$recargo = Request::input('recargo');
		$tiporecargo = Request::input('tiporecargo');
		$cant = Request::input('cant');
		$detalle = Request::input('detalle');
		$precio = Request::input('precio');
		$descuento = Request::input('descuento');
		$total = Request::input('total');
		$totalcondescuento = Request::input('totalcondescuento');
		$totalescondescuento = Request::input('totalescondescuento');
		$email = Request::input('email') ?? 'facturaelectronica@fidelitas.com.ar';
		$zona = Request::input('ven_codigo') ?? '01';
		$lista = 0;
		$user_id = $sesion['usuario']->user_id;

		foreach ($detalle as $i => $det) {
			$deta = $det;

			if ($deta !== '') {
				$fac_comprobante = 'FAC';
				if ($lista == '2016') {
					$fac_comprobante = 'EXT';
				}

				$fac_tipo_pedido = 'I';
				$fac_nro_pedido = $nro_pedido;
				$fac_tipo_factura = NULL;
				$fac_nro_factura_1 = NULL;
				$fac_nro_factura = NULL;
				$prod_codigo = 0;
				$det_cantidad = $cant[$i];
				$det_neto = $cotizacion * $total[$i];
				$det_porbon = $descuento[$i];
				$det_bonif = $det_neto * $descuento[$i] / 100;
				$det_importe = $det_neto - $det_bonif; //$totalcondescuento[$i];
				$det_neto_uni = $cotizacion * $precio[$i];
				$det_bonif_uni = $det_neto_uni * $descuento[$i] / 100;
				$det_importe_uni = $det_neto_uni - $det_bonif_uni;
				$det_con_iva_uni = 0;

				if ($resiva == '3' ||
					$resiva == '4' ||
					$resiva == '5' ||
					$resiva == '6') {
					$det_con_iva_uni = $det_importe_uni;
				}
				$prod_numero = $i + 1;
				$prod_texto = $deta;

				// Para que grabe los importes de las B sin iva
				if ($resiva == '3' ||
					$resiva == '4' ||
					$resiva == '5' ||
					$resiva == '6') {
					$det_neto = $det_neto / 1.21;
					$det_bonif = $det_bonif / 1.21;
					$det_importe = $det_importe / 1.21;
					$det_neto_uni = $det_neto_uni / 1.21;
					$det_bonif_uni = $det_bonif_uni / 1.21;
					$det_importe_uni = $det_importe_uni / 1.21;
				}

				// FACTURACION_DET  
				$detalle = SQLConnection::backendStoreProcedure("facturacion_det_", array('insert',
					$fac_nro_pedido,
					$fac_comprobante,
					$fac_tipo_pedido,
					$fac_tipo_factura,
					$fac_nro_factura_1,
					$fac_nro_factura,
					$prod_codigo,
					$det_cantidad,
					round($det_neto, 2),
					round($det_porbon, 2),
					round($det_bonif, 2),
					round($det_importe, 2),
					round($det_neto_uni, 2),
					round($det_bonif_uni, 2),
					round($det_importe_uni, 2),
					round($det_con_iva_uni, 2),
					$prod_numero,
					$prod_texto,
					$user_id), 'selectOne');

				// FIDE_DETAIL_TANGO
				if ($resiva == '3' ||
					$resiva == '4' ||
					$resiva == '5' ||
					$resiva == '6') {
					$det_neto = $det_neto * 1.21;
					$det_bonif = $det_bonif * 1.21;
					$det_importe = $det_importe * 1.21;
					$det_neto_uni = $det_neto_uni * 1.21;
					$det_bonif_uni = $det_bonif_uni * 1.21;
					$det_importe_uni = $det_importe_uni * 1.21;
				}
				if ($resiva == '2' || $resiva == '1') {
					$iva_det = round(($det_importe / $cotizacion * 0.21), 2);
				} else {
					$iva_det = '0.00';
				}


				$registro_det = [];
				$registro_det['accion'] = 'insert';
				$registro_det['id_pedido_fidelitas'] = round($nro_pedido, 0);
				$registro_det['item'] = round($prod_numero, 0);
				$registro_det['cod_producto'] = round($prod_codigo, 0);
				$registro_det['texto_factura_1'] = '';
				$registro_det['texto_factura_2'] = '';
				if (strlen($prod_texto) > 0) {
					$registro_det['texto_factura_1'] = substr($prod_texto, 0, 30);
				}
				if (strlen($prod_texto) > 30) {
					$registro_det['texto_factura_2'] = substr($prod_texto, 30, 20);
				}
				$registro_det['unidades'] = round($det_cantidad, 0);
				$registro_det['importe_unidad'] = round(($det_neto_uni / $cotizacion), 2);
				$registro_det['importe_unidades_item'] = round(($det_neto / $cotizacion), 2);
				$registro_det['porc_dto_item'] = round(($det_porbon), 2);
				$registro_det['importe_dto_item'] = round(($det_bonif / $cotizacion), 2);
				$registro_det['importe_iva_item'] = round($iva_det, 2);
				$registro_det['importe_neto_item'] = round(($det_importe / $cotizacion), 2);
				$registro_det['importe_con_iva_b'] = round(($det_con_iva_uni / $cotizacion), 2);

				$reg_det = array(
					$registro_det['accion'],
					$registro_det['id_pedido_fidelitas'],
					$registro_det['item'],
					$registro_det['cod_producto'],
					$registro_det['texto_factura_1'],
					$registro_det['texto_factura_2'],
					$registro_det['unidades'],
					$registro_det['importe_unidad'],
					$registro_det['importe_unidades_item'],
					$registro_det['porc_dto_item'],
					$registro_det['importe_dto_item'],
					$registro_det['importe_iva_item'],
					$registro_det['importe_neto_item'],
					$registro_det['importe_con_iva_b']
				);

				$graba_registro_det = SQLConnection::backendStoreProcedure("fide_detail_tango_", $reg_det, 'selectOne');

			}

		}



		$fac_masiva_libre = 'L';
		$fac_neto = $cotizacion * $totalescondescuento;
		$fac_iva_1 = 0;
		$fac_iva_2 = 0;
		$Lista = 2017;
		if ($resiva == '1' || $resiva == '2') {
			$porcentajeIva = 21;

			if ($Lista == '2016') {
				$porcentajeIva = 1;
			}
			$fac_iva_1 = $fac_neto * $porcentajeIva / 100;
			$fac_total = $fac_neto + $fac_iva_1 + $fac_iva_2;
		} else {
			$fac_total = $fac_neto;
			$fac_neto = $fac_neto / 1.21;
		}
		$fac_no_catego = 0;

		/*
		$Cli_Domici = Request::input('domicilio');
		$Cli_Codpos = Request::input('cod_postal');
		$Loc_Nombre = Request::input('localidad');
		$Prv_Codigo = '';
		$Pai_Nombre = Request::input('pai_nombre');
		$Pai_Codigo = Request::input('pai_codigo_ifx');
		$CP = Request::input('cod_postal');
		*/

		/* Lo mandamos vacío. Los datos los tomará de lo cargado en el sistema Tango */
		$Cli_Domici = '';
		$Cli_Codpos = '';
		$Loc_Nombre = '';
		$Prv_Codigo = '';
		$Pai_Nombre = '';
		$CP = '';
		$Pai_Codigo = '';
		$zona = '';

		/*
				$Texto_cliente = $cli_codigo  . '|' .
								 trim(substr($cli_nombre,0,60)) . '|' . $cli_cuit . '|';
				$iva = '1';
				if ($resiva == '3') {
				   $Texto_cliente = $Texto_cliente . '5'; #'EX';
				   $iva = '5';
				   }
				if ($resiva == '7') {
				   $Texto_cliente = $Texto_cliente . '9'; #'EXE';
				   $iva = '9';
				   }
				if ($resiva == '4') {
				   $Texto_cliente = $Texto_cliente . '2'; #'CF';
				   $iva = '2';
				   }

				 if ($resiva == '5') {
				   $Texto_cliente = $Texto_cliente . '4'; #'MON';
				   $iva = '4';
				   }
				if ($resiva == '6') {
				   $Texto_cliente = $Texto_cliente . '10'; #'NC';
				   $iva = '10';
				   }
				if ($resiva == '1') {
				   $Texto_cliente = $Texto_cliente . '1'; #'RI';
				   $iva = '1';
				   }
				if ($resiva == '2') {
				   $Texto_cliente = $Texto_cliente . '3'; #'RNI';
				   $iva = '3';
				   }

				$Texto_cliente = 	$Texto_cliente .
									'|' . trim($Cli_Domici) .
									'|' . trim($Cli_Codpos) .
									'|' . trim(substr($Loc_Nombre,0,20)) .
									'|' . trim($Prv_Codigo) .
									'|' . trim($Pai_Nombre) .
									'|' . trim($Pai_Codigo) ;                     
					if ($moneda == 'USD')
					{
						$moneda = 'DOL'; 
					} 
					
				  $Texto_cliente = $Texto_cliente . '|' . $moneda . '|' . number_format($cotizacion, 2, '.', '');
				$fac_texto     = $Texto_cliente; 
				*/
		$fac_texto = ''; // No lo grabamos mas... se tomaran los datos del sistema Tango 
		$fac_marca_pago = "SP";
		$fac_periodo = $periodo;
		$fac_fecha_fact = $fecha;
		$fac_fecha_vto = $vencimiento;

		$fac_tipo_pedido = 'I';

		// FACTURACION_ENC 
		$encabezado = SQLConnection::backendStoreProcedure("facturacion_enc_", array('update',
			$fac_nro_pedido,
			$fac_comprobante,
			$fac_tipo_pedido,
			$cliente,
			$cli_codigo,
			$fac_masiva_libre,
			$fac_periodo,
			$fac_tipo_factura,
			$fac_nro_factura_1,
			$fac_nro_factura,
			$fac_fecha_fact,
			$fac_fecha_vto,
			round($fac_neto, 2),
			round($fac_iva_1, 2),
			round($fac_iva_2, 2),
			round($fac_total, 2),
			round($fac_no_catego, 2),
			$fac_texto,
			$fac_marca_pago,
			$user_id), 'selectOne');


		// FAC_HEADER_TANGO


		$iva = '1';
		if ($resiva == '3') {
			$iva = '5';
		}
		if ($resiva == '7') {
			$iva = '9';
		}
		if ($resiva == '4') {
			$iva = '2';
		}

		if ($resiva == '5') {
			$iva = '4';
		}
		if ($resiva == '6') {
			$iva = '10';
		}
		if ($resiva == '1') {
			$iva = '1';
		}
		if ($resiva == '2') {
			$iva = '3';
		}



		if ($resiva == '7') {
			$lista = '7002';
		} // Facturas E
		if ($resiva == '2') {
			$lista = '7000';
		} // Facturas A
		if ($resiva == '1') {
			$lista = '7000';
		}
		if ($lista < '7000') {
			$lista = '7001';
		} // Facturas B

		$cli_nombre = str_replace('Ñ', 'N', $cli_nombre);
		$cli_nombre = str_replace('ñ', 'n', $cli_nombre);
		$cli_nombre = str_replace("'", " ", $cli_nombre);
		$cli_nombre = str_replace('"', ' ', $cli_nombre);
		/*
				  $Cli_Domici = str_replace('Ñ', 'N', $Cli_Domici);
				  $Cli_Domici = str_replace('ñ', 'n', $Cli_Domici);
				  $Cli_Domici = str_replace("'", " ", $Cli_Domici);
				  $Cli_Domici = str_replace('"', ' ', $Cli_Domici);

				  $Loc_Nombre = str_replace('Ñ', 'N', $Loc_Nombre);
				  $Loc_Nombre = str_replace('ñ', 'n', $Loc_Nombre);
				  $Loc_Nombre = str_replace("'", " ", $Loc_Nombre);
				  $Loc_Nombre = str_replace('"', ' ', $Loc_Nombre);

				  $Pai_Nombre = str_replace('Ñ', 'N', $Pai_Nombre);
				  $Pai_Nombre = str_replace('ñ', 'n', $Pai_Nombre);
				  $Pai_Nombre = str_replace("'", " ", $Pai_Nombre);
				  $Pai_Nombre = str_replace('"', ' ', $Pai_Nombre);
		*/
		$Pai_Codigo = Request::input('pai_codigo_ifx');
		// Si es del exterior hay que pasarle 49 a la tabla de Tango... Por qué?? Quién sabrá??... 
		if ($Pai_Codigo !== '54') {
			$Pai_Codigo = '49';
		}

		$fecha1 = new DateTime($fecha);
		$fecha2 = new DateTime($vencimiento);
		$interval = $fecha1->diff($fecha2);
		$dias = $interval->days;
		//$dias = $factura->dias_vencimiento ?? '07';
		if (strlen($dias) < 2) {
			$dias = '0' . $dias;
		}
		if ($dias > 99) {
			$dias = '99';
		}

		$registro_enc = [];
		$registro_enc['accion'] = 'insert';
		$registro_enc['id_pedido_fidelitas'] = $nro_pedido;
		$registro_enc['fecha_pedido'] = $fecha;
		$registro_enc['cliente'] = $cli_codigo;
		$registro_enc['razon_social'] = $cli_nombre;
		$registro_enc['cuit'] = $cli_cuit;
		$registro_enc['condicion_iva'] = $iva;
		$registro_enc['domicilio'] = $Cli_Domici;
		$registro_enc['cp'] = $CP;
		$registro_enc['localidad'] = $Loc_Nombre;
		$registro_enc['provincia'] = $Prv_Codigo;
		$registro_enc['pais'] = $Pai_Nombre;
		$registro_enc['cod_pais'] = $Pai_Codigo;
		$registro_enc['importe_neto'] = round(($fac_neto / $cotizacion), 2);
		$registro_enc['iva'] = round(($fac_iva_1 / $cotizacion), 2);
		$registro_enc['importe_total'] = round(($fac_total / $cotizacion), 2);
		$registro_enc['condicion_venta'] = $dias;
		$registro_enc['email_envio_factura'] = $email;
		$registro_enc['vendedor'] = $zona;
		$registro_enc['lista'] = $lista;
		$registro_enc['nro_factura'] = null;
		$registro_enc['fecha_emision'] = null;
		$registro_enc['fecha_cobranza'] = null;
		$registro_enc['importe_cobranza'] = null;
		$registro_enc['moneda'] = $moneda;
		$registro_enc['cotizacion'] = $cotizacion;
		$registro_enc['procesado'] = 'I';
		$registro_enc['pasaje_cobranza'] = null;
		$registro_enc['pasaje_facturas'] = null;

		$reg_enc = array(
			$registro_enc['accion'],
			$registro_enc['id_pedido_fidelitas'],
			$registro_enc['fecha_pedido'],
			$registro_enc['cliente'],
			$registro_enc['razon_social'],
			$registro_enc['cuit'],
			$registro_enc['condicion_iva'],
			$registro_enc['domicilio'],
			$registro_enc['cp'],
			$registro_enc['localidad'],
			$registro_enc['provincia'],
			$registro_enc['pais'],
			$registro_enc['cod_pais'],
			$registro_enc['importe_neto'],
			$registro_enc['iva'],
			$registro_enc['importe_total'],
			$registro_enc['condicion_venta'],
			$registro_enc['email_envio_factura'],
			$registro_enc['vendedor'],
			$registro_enc['lista'],
			$registro_enc['nro_factura'],
			$registro_enc['fecha_emision'],
			$registro_enc['fecha_cobranza'],
			$registro_enc['importe_cobranza'],
			$registro_enc['moneda'],
			$registro_enc['cotizacion'],
			$registro_enc['procesado'],
			$registro_enc['pasaje_cobranza'],
			$registro_enc['pasaje_facturas']
		);

		$graba_registro_enc = SQLConnection::backendStoreProcedure("fide_header_tango_", $reg_enc, 'selectOne');

	}

	public function verPedidos() {
		if (Request::input('ruta') !== null) {
			$ruta = '/' . Request::input('ruta');
		} else {
			$ruta = '/';
		}
		//
		$titulo_navbar = 'Facturación';
		$facturas = SQLConnection::backendStoreProcedure("facturacion_enc_", array('pedidos'), 'selectAll');
		$detalle = SQLConnection::backendStoreProcedure("facturacion_det_", array('pedidos'), 'selectAll');

		$facturas_canc = SQLConnection::backendStoreProcedure("facturacion_enc_", array('cancelados'), 'selectAll');
		$detalle_canc = SQLConnection::backendStoreProcedure("facturacion_det_", array('cancelados'), 'selectAll');


		return view('/facturacion/ver_pedidos')->with(compact('ruta', 'titulo_navbar', 'facturas', 'detalle', 'facturas_canc', 'detalle_canc'));
	}

	public function cancelarPedidos() {
		$sesion = Request::session()->all();
		$user_id = $sesion['usuario']->user_id;
		$pedidoss = Request::input('pedido'); // array con los nros de pedidos
		$pedidos = [];
		if (is_array($pedidoss)) {
			$pedidos = $pedidoss;
		} else {
			$pedidos[0] = $pedidoss;
		}
		$lista = implode(',', $pedidos);
		// En las tablas fider_header_tango, fide_detail_tango, facturacion_enc y fecturacion_det marca con C (Cancelado)
		$procesar = SQLConnection::backendStoreProcedure("fide_header_tango_p", array('cancelar', $lista), 'selectOne');
	}

	public function activarPedidos() {
		$sesion = Request::session()->all();
		$user_id = $sesion['usuario']->user_id;
		$pedidoss = Request::input('pedido'); // array con los nros de pedidos
		$pedidos = [];
		if (is_array($pedidoss)) {
			$pedidos = $pedidoss;
		} else {
			$pedidos[0] = $pedidoss;
		}
		$lista = implode(',', $pedidos);
		// En las tablas fider_header_tango, fide_detail_tango, facturacion_enc y fecturacion_det marca con I (Ingresado)
		$procesar = SQLConnection::backendStoreProcedure("fide_header_tango_p", array('activar', $lista), 'selectOne');
	}


	public function archivoTango() {
		if (Request::input('ruta') !== null) {
			$ruta = '/' . Request::input('ruta');
		} else {
			$ruta = '/';
		}
		//
		$titulo_navbar = 'Facturación';
		$facturas = SQLConnection::backendStoreProcedure("facturacion_enc_", array('pedidos'), 'selectAll');
		$detalle = SQLConnection::backendStoreProcedure("facturacion_det_", array('pedidos'), 'selectAll');
		return view('/facturacion/archivo_tango')->with(compact('ruta', 'titulo_navbar', 'facturas', 'detalle'));
	}


	public function generaArchivoTango() {
		$sesion = Request::session()->all();
		$user_id = $sesion['usuario']->user_id;
		$pedidoss = Request::input('pedido'); // array con los nros de pedidos
		$pedidos = [];
		if (is_array($pedidoss)) {
			$pedidos = $pedidoss;
		} else {
			$pedidos[0] = $pedidoss;
		}
		$lista = implode(',', $pedidos);
		// En las tablas fider_header_tango, fide_detail_tango, facturacion_enc y fecturacion_det los marca con P (Pedido) para saber que son los proximos a pasar en la API de pedidos a tango 
		$procesar = SQLConnection::backendStoreProcedure("fide_header_tango_p", array('pedido', $lista), 'selectOne');
	}



}