示例#1
0
 /**
  	 *
  	 *Crea una nueva regla para una version. 
 
 Una regla que no tiene producto, categoria de producto o alguna otra relacion, es una regla que se aplica a todos los productos, servicios y paquetes.
 
 Las secuencias de las reglas no se pueden repetir.
 
 La formula que siguen las reglas para obtener el precio fina es la siguiente: 
 
        Precio Final = Precio Base * (1 + porcentaje_utilidad) + utilidad_neta
 
 Donde :
  
     Precio Base : Es obtenido de la tarifa con la que se relaciona esta regla. 
                   Si no se relaciona con ninguna tarifa, entonces lo toma del 
                   precio o costo (dependiendo del metodo de costeo) del producto,servicio
                   o paquete.
 
     porcentaje_utilidad:El porcentaje de utilidad que se le ganara al precio o costo base.
                         Puede ser negativo
 
     utilidad_neta: La utilidad neta que se ganara al comerciar este producto,servicio o
                    paquete. Puede ser negativo.
 
 
 Al asignar una tarifa base a una regla se verifica que no haya una dependencia circular.
 
 Una misma regla puede aplicar a un producto, una clasificacion de producto, un servicio, una clasificacion de servicio y un paquete a la vez.
  	 *
  	 * @param id_version int Id de la version a la que pertenecera esta regla
  	 * @param nombre string Nombre de la regla
  	 * @param secuencia int Numero de secuencia de la regla, sirve para definir prioridades entre las reglas.
  	 * @param cantidad_minima int Cantidad minima que debe cumplirse de objetos para que esta regla se cumpla
  	 * @param id_clasificacion_producto int Id de la clasificacion del producto a la que se le aplicara esta regla
  	 * @param id_clasificacion_servicio int Id de la clasificacion del servicio a la cual se le aplicara esta regla
  	 * @param id_paquete int Id del paquete al cal se le aplicara esta regla
  	 * @param id_producto int Id del producto al que se le aplicara esta regla
  	 * @param id_servicio int Id del servicio al cual se le aplicara esta regla
  	 * @param id_tarifa int Id de la tarifa que se usara para determinar el precio base del objeto
  	 * @param id_unidad int La regla se aplicara a los productos (especificados por el id_producto o id_clasificacion_producto) que esten en esta unidad. Si un id de producto no ha sido especificado, este valor se ignora.
  	 * @param margen_max float Pendiente descripcion por Manuel
  	 * @param margen_min float Pendiente descripcion por Manuel
  	 * @param metodo_redondeo float Pendiente descricpion por manuel
  	 * @param porcentaje_utilidad float Porcentaje de utilidad, va de -1 a 1
  	 * @param utilidad_neta float La utilidad neta que se ganara, puede ser negativa indicando un descuento
  	 * @return id_regla int Id de la regla creada
  	 **/
 private static function NuevaRegla($id_version, $nombre, $secuencia, $cantidad_minima = null, $id_clasificacion_producto = null, $id_clasificacion_servicio = null, $id_paquete = null, $id_producto = null, $id_servicio = null, $id_tarifa = null, $id_unidad = null, $margen_max = 0, $margen_min = 0, $metodo_redondeo = 0, $porcentaje_utilidad = 0, $utilidad_neta = 0)
 {
     Logger::log("Creando nueva regla");
     //Se validan los parametros recibidos
     $validar = self::ValidarParametrosRegla(null, $nombre, $id_producto, $id_clasificacion_producto, $id_unidad, $id_servicio, $id_clasificacion_servicio, $id_paquete, $cantidad_minima, $porcentaje_utilidad, $utilidad_neta, $metodo_redondeo, $margen_min, $margen_max, $secuencia);
     if (is_string($validar)) {
         Logger::error($validar);
         throw new Exception($validar);
     }
     //Valida que la secuencia de la regla no exista ya en esta version
     $reglas = ReglaDAO::search(new Regla(array("id_version" => $id_version)));
     //var_dump($reglas);
     foreach ($reglas as $regla) {
         if ($regla->getSecuencia() == $secuencia) {
             Logger::error("La secuencia " . $secuencia . " ya esta en uso por la regla " . $regla->getIdRegla());
             throw new Exception("La secuencia " . $secuencia . " ya esta en uso por la regla " . $regla->getIdRegla(), 901);
         }
     }
     $regla = new Regla(array("id_version" => $id_version, "nombre" => $nombre, "id_producto" => $id_producto, "id_clasificacion_producto" => $id_clasificacion_producto, "id_clasificacion_servicio" => $id_clasificacion_servicio, "id_unidad" => $id_unidad, "id_servicio" => $id_servicio, "id_paquete" => $id_paquete, "cantidad_minima" => $cantidad_minima, "porcentaje_utilidad" => $porcentaje_utilidad, "utilidad_neta" => $utilidad_neta, "metodo_redondeo" => $metodo_redondeo, "margen_min" => $margen_min, "margen_max" => $margen_max, "secuencia" => $secuencia, "id_tarifa" => $id_tarifa ? $id_tarifa : -1));
     DAO::transBegin();
     try {
         ReglaDAO::save($regla);
     } catch (Exception $e) {
         DAO::transRollback();
         Logger::error("No se pudo crear la nueva regla: " . $e);
         throw new Exception("No se pudo crear la nueva regla, intenelo mas tarde o consulte a su administrador del sistema", 901);
     }
     DAO::transEnd();
     Logger::log("La regla ha sido creada exitosamente");
 }