viewData['pageTitle'] = lang('Facturas.facturas'); // Se indica que este controlador trabaja con soft_delete $this->viewData = ['usingServerSideDataTable' => true]; // Breadcrumbs $this->viewData['breadcrumb'] = [ ['title' => lang("App.menu_facturas"), 'route' => "javascript:void(0);", 'active' => false], ]; parent::initController($request, $response, $logger); } public function index() { $this->viewData['usingClientSideDataTable'] = true; $this->viewData['pageSubTitle'] = lang('Basic.global.ManageAllRecords', [lang('Tarifaextra.tarifaextra')]); parent::index(); } public function list() { $viewData = [ 'currentModule' => static::$controllerSlug, 'pageSubTitle' => lang('Basic.global.ManageAllRecords', [lang('Facturas.facturas')]), 'usingServerSideDataTable' => true, 'pageTitle' => lang('Facturas.facturas'), ['title' => lang("App.menu_facturas"), 'route' => site_url('facturas/list'), 'active' => true] ]; $viewData['breadcrumb'] = [ ['title' => lang("App.menu_facturas"), 'route' => "javascript:void(0);", 'active' => false], ['title' => lang("Facturas.facturaList"), 'route' => "javascript:void(0);", 'active' => true] ]; return view(static::$viewPath . 'viewFacturasList', $viewData); } public function add() { if ($this->request->getPost()) : $nullIfEmpty = true; // !(phpversion() >= '8.1'); $postData = $this->request->getPost(); $noException = true; $allData = true; if( !isset($postData['cliente_id']) || !isset($postData['serie_id']) ) { $this->viewData['errorMessage'] = lang('Facturas.errors.requiredFields'); $this->session->setFlashdata('formErrors', $this->model->errors()); $allData = false; $noException = false; } try { $clienteModel = model('App\Models\Clientes\ClienteModel'); $datosCliente = $clienteModel->getClienteDataFacturas($postData['cliente_id']); if(count($datosCliente)>0){ // add array data datosCliente to postData $postData = array_merge($postData, $datosCliente[0]); } } catch (\Exception $e) { $noException = false; $this->dealWithException($e); } $sanitizedData = $this->sanitized($postData, $nullIfEmpty); $sanitizedData['user_updated_id'] = auth()->user()->id; $sanitizedData['user_created_id'] = auth()->user()->id; if ($allData && $successfulResult = $this->canValidate()) : // if ($successfulResult = $this->validate($this->formValidationRules) ) : if ($this->canValidate()) : try { $successfulResult = $this->model->skipValidation(true)->save($sanitizedData); } catch (\Exception $e) { $noException = false; $this->dealWithException($e); } else: $this->viewData['errorMessage'] = lang('Basic.global.formErr1', [lang('Basic.global.record')]); $this->session->setFlashdata('formErrors', $this->model->errors()); endif; endif; if ($noException && $successfulResult) : $id = $this->model->db->insertID(); $message = lang('Basic.global.saveSuccess', [lang('Basic.global.record')]) . '.'; return redirect()->to(route_to('editarFactura', $id))->with('sweet-success', $message); endif; // $noException && $successfulResult endif; // ($requestMethod === 'post') $this->viewData['factura'] = isset($sanitizedData) ? new FacturaEntity($sanitizedData) : new FacturaEntity(); $this->viewData['formAction'] = route_to('createFactura'); $this->viewData['boxTitle'] = lang('Basic.global.addNew') . ' ' . lang('Facturas.facturas') . ' ' . lang('Basic.global.addNewSuffix'); helper('form'); $this->viewData['breadcrumb'] = [ ['title' => lang("App.menu_facturas"), 'route' => "javascript:void(0);", 'active' => false], ['title' => lang("Facturas.facturaList"), 'route' => route_to('facturasList'), 'active' => true] ]; $this->viewData['usingSelect2'] = true; $validation = \Config\Services::validation(); $this->viewData['validation'] = $validation; $viewFilePath = static::$viewPath . 'viewAddFactura'; return view($viewFilePath, $this->viewData); } // end function add() public function edit($id=null){ if ($id == null) : return $this->redirect2listView(); endif; $id = filter_var($id, FILTER_SANITIZE_URL); $factura = $this->model->find($id); if ($factura == false) : $message = lang('Basic.global.notFoundWithIdErr', [mb_strtolower(lang('Facturas.factura')), $id]); return $this->redirect2listView('sweet-error', $message); endif; $this->obtenerDatosFormulario($factura); $this->viewData['breadcrumb'] = [ ['title' => lang("App.menu_facturas"), 'route' => "javascript:void(0);", 'active' => false], ['title' => lang("Facturas.facturaList"), 'route' => route_to('facturasList'), 'active' => true] ]; $this->viewData['facturaEntity'] = $factura; $this->viewData['boxTitle'] = lang('Basic.global.edit2') . ' ' . lang('Facturas.factura') . ' ' . lang('Basic.global.edit3'); return $this->displayForm(__METHOD__, $id); } public function datatable(){ if ($this->request->isAJAX()) { $reqData = $this->request->getPost(); if (!isset($reqData['draw']) || !isset($reqData['columns']) ) { $errstr = 'No data available in response to this specific request.'; $response = $this->respond(Collection::datatable( [], 0, 0, $errstr ), 400, $errstr); return $response; } $start = $reqData['start'] ?? 0; $length = $reqData['length'] ?? 5; $search = $reqData['search']['value']; $requestedOrder = $reqData['order']['0']['column'] ?? 0; $order = FacturaModel::SORTABLE[$requestedOrder >= 0 ? $requestedOrder : 0]; $dir = $reqData['order']['0']['dir'] ?? 'asc'; $resourceData = $this->model->getResource($search)->orderBy($order, $dir)->limit($length, $start)->get()->getResultObject(); return $this->respond(Collection::datatable( $resourceData, $this->model->getResource("")->countAllResults(), $this->model->getResource($search)->countAllResults() )); } else { return $this->failUnauthorized('Invalid request', 403); } } public function update($id = null){ if ($this->request->isAJAX()) { $newTokenHash = csrf_hash(); $csrfTokenName = csrf_token(); if ($id == null) : $data = [ 'error' => 2, $csrfTokenName => $newTokenHash ]; return $this->respond($data); endif; $id = filter_var($id, FILTER_SANITIZE_URL); $facturaEntity = $this->model->find($id); if ($facturaEntity == false) : $message = lang('Basic.global.notFoundWithIdErr', [mb_strtolower(lang('Factura.factura')), $id]); $data = [ 'error' => $message, $csrfTokenName => $newTokenHash ]; return $this->respond($data); endif; if ($this->request->getPost()) : $nullIfEmpty = true; // !(phpversion() >= '8.1'); $postData = $this->request->getPost(); $sanitizedData = $this->sanitized($postData, $nullIfEmpty); // JJO $sanitizedData['user_updated_id'] = auth()->user()->id; $noException = true; if ($successfulResult = $this->canValidate()) : // if ($successfulResult = $this->validate($this->formValidationRules) ) : if ($this->canValidate()) : try { $successfulResult = $this->model->skipValidation(true)->update($id, $sanitizedData); } catch (\Exception $e) { $noException = false; $this->dealWithException($e); } else: $this->viewData['warningMessage'] = lang('Basic.global.formErr1', [mb_strtolower(lang('Facturas.factura'))]); $this->session->setFlashdata('formErrors', $this->model->errors()); endif; $facturaEntity->fill($sanitizedData); endif; if ($noException && $successfulResult) : $id = $facturaEntity->id ?? $id; $message = lang('Basic.global.updateSuccess', [lang('Basic.global.record')]) . '.'; $data = [ 'error' => 0, $csrfTokenName => $newTokenHash ]; return $this->respond($data); endif; // $noException && $successfulResult endif; // ($requestMethod === 'post') $data = [ 'error' => 1, $csrfTokenName => $newTokenHash ]; return $this->respond($data); } else { return $this->failUnauthorized('Invalid request', 403); } } public function menuPedidosPendientes($cliente_id){ if ($this->request->isAJAX()) { $model = model('\App\Models\Pedidos\PedidoLineaModel'); $pedidos = []; try{ $pedidos = $model->obtenerLineasPedidoSinFacturar($cliente_id); } catch(Exception $e){ } $newTokenHash = csrf_hash(); $csrfTokenName = csrf_token(); $data = [ 'menu' => $pedidos, $csrfTokenName => $newTokenHash ]; return $this->respond($data); } else { return $this->failUnauthorized('Invalid request', 403); } } public function duplicate($factura_id = 0){ if($this->request->isAJAX()){ $factura_origen = $this->model->find($factura_id); // se quita la key "id" del objeto unset($factura_origen->id); $factura_origen->estado = 'borrador'; $factura_origen->estado_pago = 'pendiente'; $factura_origen->base = 0; $factura_origen->total = 0; $factura_origen->pendiente = 0; $factura_origen->total_pagos = 0; $factura_origen->user_created_id = auth()->user()->id; $factura_origen->user_updated_id = null; $this->model->insert($factura_origen); $id = $this->model->getInsertID(); $newTokenHash = csrf_hash(); $csrfTokenName = csrf_token(); $data = [ 'id' => $id, $csrfTokenName => $newTokenHash ]; return $this->respond($data); }else{ return $this->failUnauthorized('Invalid request', 403); } } public function updateTotales($factura_id = 0){ if($this->request->isAJAX()){ $postData = $this->request->getPost(); $data = [ 'base' => $postData['base'] ?? 0, 'total' => $postData['total'] ?? 0, 'pendiente' => $postData['pendiente'] ?? 0, 'total_pagos' => $postData['total_pagos'] ?? 0, 'user_updated_id' => auth()->user()->id, 'estado_pago' => (intval($postData['pendiente'] ?? 0)==0) ? 'pagada' : 'pendiente', ]; $newTokenHash = csrf_hash(); $csrfTokenName = csrf_token(); $data_ret = [ $csrfTokenName => $newTokenHash ]; if($factura_id == 0){ return $this->respond($data_ret); } $data_ret['estado_pago'] = $data['estado_pago']; $model = model('\App\Models\Facturas\FacturaModel'); $model->update($factura_id, $data); return $this->respond($data_ret); } else { return $this->failUnauthorized('Invalid request', 403); } } public function addLineaPedidoImpresion($factura_id){ if ($this->request->isAJAX()) { $model_pedido_linea = model('\App\Models\Pedidos\PedidoLineaModel'); $model_presupuesto = model('\App\Models\Presupuestos\PresupuestoModel'); $model_factura_linea = model('\App\Models\Facturas\FacturaLineaModel'); try{ $pedido_linea_id = $this->request->getPost('lineaPedido') ?? 0; $linea = $model_pedido_linea->find($pedido_linea_id); if($linea){ $presupuesto = $model_presupuesto->find($linea->presupuesto_id); if($presupuesto){ // Se aƱade la linea de factura $descripcion = $model_presupuesto->generarLineaPedido($presupuesto->id, true, $linea->pedido_id); $cantidad = intval($presupuesto->tirada) - intval($this->model->getCantidadLineaPedidoFacturada($linea->id)); $base = $cantidad * floatval($presupuesto->total_precio_unidad); $total_iva = $base * ($presupuesto->iva_reducido==1 ? 0.04 : 0.21); // se redondea a dos decimales $total_iva = round($total_iva, 2); $total = $base + $total_iva; $data = (object)[ 'factura_id'=>$factura_id, 'pedido_linea_impresion_id'=>$linea->pedido_id, 'descripcion'=>$descripcion[0]->concepto, 'cantidad'=>$cantidad, 'precio_unidad'=>$presupuesto->total_precio_unidad, 'iva' => $presupuesto->iva_reducido==1 ? 4 : 21, 'base' => $base, 'total_iva' => $total_iva, 'total' => $total, 'user_updated_id' => auth()->user()->id, ]; $model_factura_linea->insert($data); $id = $model_factura_linea->getInsertID(); if($id){ $model_factura_linea->addFacturaPedidoLinea($factura_id, $linea->id, $cantidad); $newTokenHash = csrf_hash(); $csrfTokenName = csrf_token(); $data = [ 'error' => 0, 'id' => $id, $csrfTokenName => $newTokenHash ]; return $this->respond($data); } } } } catch(Exception $e){ } $newTokenHash = csrf_hash(); $csrfTokenName = csrf_token(); $data = [ $csrfTokenName => $newTokenHash ]; return $this->respond($data); } else { return $this->failUnauthorized('Invalid request', 403); } } public function deleteLineaPedidoImpresion(){ if ($this->request->isAJAX()) { $postData = $this->request->getPost(); $factura_id = $postData['factura_id'] ?? 0; $linea_id = $postData['linea_id'] ?? 0; $cantidad = $postData['cantidad'] ?? 0; $model_factura_linea = model('\App\Models\Facturas\FacturaLineaModel'); $model_factura_linea->deleteFacturasLineasPedido($factura_id, $linea_id, $cantidad); $newTokenHash = csrf_hash(); $csrfTokenName = csrf_token(); $data = [ $csrfTokenName => $newTokenHash ]; return $this->respond($data); } else { return $this->failUnauthorized('Invalid request', 403); } } public function validar($factura_id){ if($this->request->isAJAX()){ $factura = $this->model->find($factura_id); if($factura){ $model_series = model('\App\Models\Configuracion\SeriesFacturasModel'); $numero = $model_series->getSerieNumerada($factura->serie_id); $data = [ 'estado' => 'validada', 'numero' => $numero, 'user_updated_id' => auth()->user()->id, ]; if((strpos($numero, "REC ") === 0)){ $data['estado_pago'] = 'pagada'; } $this->model->update($factura_id, $data); } $newTokenHash = csrf_hash(); $csrfTokenName = csrf_token(); $data = [ $csrfTokenName => $newTokenHash ]; return $this->respond($data); } else { return $this->failUnauthorized('Invalid request', 403); } } public function updateCabecera($factura_id){ if($this->request->isAJAX()){ if($factura_id == 0){ return; } $factura = $this->model->find($factura_id); if($factura){ $postData = $this->request->getPost(); $dataName = $postData['name'] ?? ''; $dataValue = $postData['value'] ?? ''; if($dataName == 'factura_rectificativa_id'){ // se actualiza la factura donde el campo 'numero' sea igual al valor de $dataValue. El campo a actualizar es 'factura_rectificada_id' $factura_rectificada = $this->model->where('numero', $dataValue)->first(); if($factura_rectificada){ $data2 = [ 'factura_rectificada_id' => $factura->numero, 'user_updated_id' => auth()->user()->id, ]; $this->model->update($factura_rectificada->id, $data2); } } $data = [ $dataName => $dataValue, 'user_updated_id' => auth()->user()->id, ]; $this->model->update($factura_id, $data); $newTokenHash = csrf_hash(); $csrfTokenName = csrf_token(); $data = [ $csrfTokenName => $newTokenHash ]; return $this->respond($data); } } else { return $this->failUnauthorized('Invalid request', 403); } } /************************************* * FUNCIONES AUXILIARES ************************************/ private function obtenerDatosFormulario(&$factura){ if($factura->estado == 'borrador'){ $serieModel = model('App\Models\Configuracion\SeriesFacturasModel'); $serie = $serieModel->find($factura->serie_id); if($serie){ $factura->numero = str_replace("{numero}", $serie->next, $serie->formato); } } $clienteModel = model('App\Models\Clientes\ClienteModel'); $cliente = $clienteModel->find($factura->cliente_id); $factura->cliente_alias = $cliente->alias; $serieModel = model('App\Models\Configuracion\SeriesFacturasModel'); $serie = $serieModel->find($factura->serie_id); $factura->serie_nombre = $serie->nombre; $formaPagoModel = model('App\Models\Configuracion\FormaPagoModel'); $factura->formas_pago = $formaPagoModel->getMenuItems(); $factura->fecha_factura_at_text = $factura->fecha_factura_at ? date('d/m/Y', strtotime($factura->fecha_factura_at)) : ''; } }