/**
  * Consolida las requisiciones correspondientes y mueve las solicitudes en EF
  * @return Array
  */
 public function consolidarRequisiciones()
 {
     $returnArray = array('status' => true, 'message' => '');
     $input = Request::createFromGlobals();
     $requestCore = new \RequestCore();
     $flow = $_SESSION['user_flow'];
     $step = FlowSettings::get($_SESSION['user_flow'], 'ADQ_STEP_CONSOLIDATION');
     $requisiciones = Requisicion::getRequisicionesParaConsolidar();
     $ordenescompra = OrdenCompra::getOrdenesCompraParaConsolidar();
     // Tomar la tarea actual, si no está completada salir
     foreach ($requisiciones as $requisicion) {
         if ($requisicion->asignada_totalmente == 0) {
             $returnArray['status'] = false;
             $returnArray['message'] = 'La requisición ' . $requisicion->id . ' no se encuentra asignada por completo. No se puede continuar';
             return $returnArray;
         }
     }
     // Cambiar estado de las ordenes de compra cuyas requisiciones estén totalmente asignadas
     foreach ($ordenescompra as $ordencompra) {
         $ordencompra->estado = 'C';
         $ordencompra->save();
     }
     foreach ($requisiciones as $requisicion) {
         // Solo completar tareas de requisiciones asignadas totalmente
         if ($requisicion->asignada_totalmente == 1) {
             // Cambiar estado a 'C' (Consolidada)
             $requisicion->estado = 'C';
             $requisicion->save();
             $task = $requisicion->ef_request->open_tasks[0];
             // Completar tareas diferentes a la actual
             // (No se completa la actual porque EF lo hace por default)
             if ($task->task_id != $input->task_id) {
                 $requestCore->completeTask($task->task_request, $task->task_id, $input->flow_id, $input->step_id, $input->user_id, 'Requisición consolidada por el usuario ' . $_SESSION['user_id'], 'next');
             }
         }
     }
     return $returnArray;
 }
 public function procesarOrdenesCompra()
 {
     $input = Request::createFromGlobals();
     $returnArray = array('status' => true, 'message' => '');
     $requestCore = new \RequestCore();
     $arrayRequisiciones = [];
     // Traer ordenes de compra
     $ordenes_compra = $this->getOrdenesCompra($input->request_id);
     // Iterar las ordenes de compra
     foreach ($ordenes_compra as $orden_compra) {
         // Verificar solo las que tengan cotización seleccionada
         $seleccionada = false;
         $cotizaciones = $orden_compra->cotizaciones;
         foreach ($cotizaciones as $cotizacion) {
             if ($cotizacion->estado == 'S') {
                 $seleccionada = true;
                 break;
             }
         }
         if ($seleccionada) {
             // Actualizar cabecera de OC
             $orden_compra->update(['estado' => 'S']);
             // Llenar arreglo con número de requisiciones correspondientes
             foreach ($orden_compra->lineas as $linea) {
                 $arrayRequisiciones[] = $linea->linea_requisicion->requisicion->id;
             }
         }
     }
     // Mover ef_requests correspondientes
     $arrayRequisiciones = array_unique($arrayRequisiciones);
     foreach ($arrayRequisiciones as $id_requisicion) {
         $requisicion = Requisicion::find($id_requisicion);
         $task = $requisicion->ef_request->open_tasks[0];
         // Completar tareas diferentes a la actual
         // (No se completa la actual porque EF lo hace por default)
         if ($task->task_id != $input->task_id) {
             $requestCore->completeTask($task->task_request, $task->task_id, $input->flow_id, $input->step_id, $input->user_id, 'Proveedor seleccionado por el usuario ' . $_SESSION['user_id'], 'next');
         }
     }
     return $returnArray;
 }
 public function generarOrdenCompra()
 {
     $input = Request::createFromGlobals();
     $returnArray = array("status" => true, "message" => "");
     $requestCore = new \RequestCore();
     $arrayRequisiciones = [];
     $ordenes_compra = $this->getOrdenesCompra($input->request_id);
     $handlerWebServiceCore = new WebServiceCore();
     foreach ($ordenes_compra as $orden_compra) {
         $clase = Clase::find($orden_compra->id_clase);
         if ($orden_compra->ext_id == '') {
             $wsdl = FlowSettings::get(FLOW_ADQUISICIONES, "ADQ_WS_CREAOCHACIENDAS_WSDL");
             $operation = FlowSettings::get(FLOW_ADQUISICIONES, "ADQ_WS_CREAOCHACIENDAS_OPERATION");
             $namespace = FlowSettings::get(FLOW_ADQUISICIONES, "ADQ_WS_CREAOCHACIENDAS_NAMESPACE");
             $soapAction = FlowSettings::get(FLOW_ADQUISICIONES, "ADQ_WS_CREAOCHACIENDAS_SOAPACTION");
             $params = ['Tipo' => 'OCRE', 'Hph_phwhse' => $orden_compra->bodega, 'Hph_phvend' => $orden_compra->proveedor->codigo, 'Hph_phbamt' => $orden_compra->valor_total, 'Hpo_pprod' => $clase->bien_economico, 'Hpo_pqord' => $orden_compra->cantidad_total, 'Hpo_pecst' => $orden_compra->valor_total, 'Hpo_podesc' => 'Orden de compra BPM - ' . $orden_compra->id];
             $result = $handlerWebServiceCore->callWebService($wsdl, $operation, $namespace, $soapAction, $params, true);
             if (!$result) {
                 $returnArray['status'] = false;
                 $returnArray['message'] = 'No se pudo consumir el servicio web para creación de orden de compra';
                 return;
             }
             if ($result['Longvarchar'] != '') {
                 $returnArray['status'] = false;
                 $returnArray['message'] = 'Error BPCS: ' . $result['Longvarchar'];
                 return;
             }
             $numero_oc = $result['Hph_phord'];
             // Cambiar estado de orden de compra
             $orden_compra->update(['estado' => 'G', 'fecha_creacion_erp' => date('Y-m-d H:i:s'), 'id_creador' => $_SESSION['user_id'], 'ext_id' => $numero_oc]);
             // Agregar recepción planificada del total de OC
             RecepcionPlanificada::create(['id_ordencompra' => $orden_compra->id, 'fecha' => date('Y-m-d', strtotime('+' . $orden_compra->tiempo_entrega . ' day')), 'observacion' => 'Entrega total estimada de la orden de compra']);
             // Llenar arreglo con número de requisiciones correspondientes
             foreach ($orden_compra->lineas as $linea) {
                 $arrayRequisiciones[] = $linea->linea_requisicion->requisicion->id;
             }
             // Guardar registros de precio en la base de datos
             foreach ($orden_compra->lineas as $linea) {
                 ProductoPrecio::create(['id_producto' => $linea->id_producto, 'id_proveedor' => $orden_compra->id_proveedor, 'fecha' => date('Y-m-d H:i:s'), 'precio' => $linea->valor, 'tiempo' => $orden_compra->tiempo_entrega]);
             }
             // Notificar a responsable(s) de bodega
             $responsableArray = explode(',', $orden_compra->clase->responsable_bodegas);
             // Notificar a usuarios creadores de requisición
             foreach ($orden_compra->lineas as $linea) {
                 $responsableArray[] = $linea->linea_requisicion->requisicion->id_solicitante;
             }
             $responsableArray = array_unique($responsableArray);
             foreach ($responsableArray as $responsable) {
                 $usuario = User::find($responsable);
                 if ($usuario) {
                     MailController::sendGeneralMail([['email' => $usuario->user_email]], 'Nueva Orden de Compra generada - ' . $orden_compra->clase->nombre, view('Adquisiciones.Emails.orden_compra_interna', compact('usuario', 'orden_compra')));
                 }
             }
             // Notificar a proveedor
             // Consultar la cotización seleccionada para la OC
             $cotizacion_seleccionada = Cotizacion::with(['lineas.linea_ordencompra.producto', 'contacto.proveedor'])->whereEstado('S')->whereIdOrdencompra($orden_compra->id)->first();
             MailController::sendGeneralMail([['email' => $cotizacion_seleccionada->contacto->email]], 'Nueva orden de compra', view('Adquisiciones.Emails.orden_compra_proveedor', compact('orden_compra', 'cotizacion_seleccionada')));
         }
     }
     // Mover ef_requests correspondientes
     $arrayRequisiciones = array_unique($arrayRequisiciones);
     foreach ($arrayRequisiciones as $id_requisicion) {
         $requisicion = Requisicion::find($id_requisicion);
         $task = $requisicion->ef_request->open_tasks[0];
         $this->generarOrdenCompraPDF($task->task_request);
         // Completar tareas diferentes a la actual
         // (No se completa la actual porque EF lo hace por default)
         if ($task->task_id != $input->task_id) {
             $requestCore->completeTask($task->task_request, $task->task_id, $input->flow_id, $input->step_id, $input->user_id, 'Orden de compra generada en el ERP', 'next');
         }
         // Generar PDF de orden de compra y adjuntar a solicitud
         $this->generarOrdenCompraPDF($task->task_request);
     }
     return $returnArray;
 }
예제 #4
0
 public function AprobarCotizacion()
 {
     $input = Request::createFromGlobals();
     $returnArray = array("status" => true, "message" => "");
     $requestCore = new \RequestCore();
     $arrayRequisiciones = [];
     // Traer ordenes de compra
     $ordenes_compra = $this->getCotizaciones($input->request_id);
     foreach ($ordenes_compra as $orden_compra) {
         // Iterar las cotizaciones
         foreach ($orden_compra->cotizaciones as $cotizacion) {
             if ($cotizacion->estado == "S") {
                 // Depende del siguiente paso:
                 // - Si es selección de proveedor cambiar el estado de OC a 'I' - Ingresada
                 // - Si es generación de OC cambiar el estado a 'A' - Aprobada. Copiar cantidades de Cotización
                 if ($input->step_id == FlowSettings::get($_SESSION['user_flow'], 'ADQ_STEP_SELECCIONPROV')) {
                     $cotizacion->ordencompra->update(['estado' => 'I']);
                 } else {
                     // Actualizar cabecera de OC
                     $cotizacion->ordencompra->update(['id_proveedor' => $cotizacion->contacto->id_proveedor, 'forma_pago' => $cotizacion->forma_pago, 'tiempo_entrega' => $cotizacion->tiempo_entrega, 'bodega' => FlowSettings::get(FLOW_ADQUISICIONES, "ADQ_BODEGA_DEFAULT_OC"), 'id_aprobador_cotizacion' => $_SESSION['user_id'], 'id_aprobador_ordencompra' => $_SESSION['user_id'], 'estado' => 'A']);
                     // Actualizar líneas de OC
                     foreach ($cotizacion->lineas as $linea) {
                         $linea->linea_ordencompra->update(['cantidad' => $linea->cantidad, 'valor' => $linea->valor_unitario_final, 'observacion' => $linea->observacion, 'estado' => 'A']);
                     }
                 }
                 // Llenar arreglo con número de requisiciones correspondientes
                 foreach ($cotizacion->lineas as $linea) {
                     $arrayRequisiciones[] = $linea->linea_ordencompra->linea_requisicion->requisicion->id;
                 }
             }
         }
     }
     // Mover ef_requests correspondientes
     $arrayRequisiciones = array_unique($arrayRequisiciones);
     foreach ($arrayRequisiciones as $id_requisicion) {
         $requisicion = Requisicion::find($id_requisicion);
         $task = $requisicion->ef_request->open_tasks[0];
         // Completar tareas diferentes a la actual
         // (No se completa la actual porque EF lo hace por default)
         if ($task->task_id != $input->task_id) {
             // TODO: Este valor cambia de acuerdo al siguiente paso
             if ($input->step_id == FlowSettings::get($_SESSION['user_flow'], 'ADQ_STEP_SELECCIONPROV')) {
                 $description = 'Cotización no aprobada';
             } else {
                 $description = 'Cotización aprobada por el usuario ' . $_SESSION['user_id'];
             }
             $requestCore->completeTask($task->task_request, $task->task_id, $input->flow_id, $input->step_id, $input->user_id, $description, 'next');
         }
     }
     return $returnArray;
 }
 public function AprobarOrdenCompra()
 {
     $input = Request::createFromGlobals();
     $returnArray = array("status" => true, "message" => "");
     $requestCore = new \RequestCore();
     $arrayRequisiciones = [];
     // Traer ordenes de compra
     $ordenes_compra = OrdenCompra::getOrdenesCompraParaAprobacionOrdenCompra($input->request_id);
     foreach ($ordenes_compra as $orden_compra) {
         // Depende del siguiente paso:
         // - Si es selección de proveedor cambiar el estado de OC a 'C' - Consolidada
         // - Si es generación de OC cambiar el estado a 'O' - orden de compra aprobada. Copiar cantidades de Cotización
         if ($input->step_id == FlowSettings::get($_SESSION['user_flow'], 'ADQ_STEP_SELECCIONPROV')) {
             $orden_compra->update(['estado' => 'C']);
         } else {
             // Actualizar cabecera de OC
             $orden_compra->update(['id_aprobador_ordencompra' => $_SESSION['user_id'], 'estado' => 'O']);
             // Actualizar líneas de OC
             foreach ($orden_compra->lineas as $linea) {
                 $linea->update(['estado' => 'O']);
                 // Llenar arreglo con número de requisiciones correspondientes
                 $arrayRequisiciones[] = $linea->linea_requisicion->requisicion->id;
             }
         }
     }
     // Mover ef_requests correspondientes
     $arrayRequisiciones = array_unique($arrayRequisiciones);
     foreach ($arrayRequisiciones as $id_requisicion) {
         $requisicion = Requisicion::find($id_requisicion);
         $task = $requisicion->ef_request->open_tasks[0];
         // Completar tareas diferentes a la actual
         // (No se completa la actual porque EF lo hace por default)
         if ($task->task_id != $input->task_id) {
             // TODO: Este valor cambia de acuerdo al siguiente paso
             if ($input->step_id == FlowSettings::get($_SESSION['user_flow'], 'ADQ_STEP_SELECCIONPROV')) {
                 $description = 'Orden de Compra no aprobada';
             } else {
                 $description = 'Orden de Compra aprobada por el usuario ' . $_SESSION['user_id'];
             }
             $requestCore->completeTask($task->task_request, $task->task_id, $input->flow_id, $input->step_id, $input->user_id, $description, 'next');
         }
     }
     return $returnArray;
 }