/** * *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"); }