Identificación |
Tipo |
InsBuyUnits | Procedure |
P_nAmount: Monto a invertir
P_nCurrency: Moneda en la cual se expresa el monto a invertir
P_nBranch: Código del ramo
P_nProduct: Código del producto
P_nPolicy: Número de la póliza que compra las unidades.
P_nCertif: Numero del certificado en el colectivo
P_dEffecadate: Fecha de la compra.
P_nOrigen: Indicador del origen del monto a invertir.
P_nIdConsec_ref: Numero del registro que origina la compra de unidades.
Por cada fondo asociado a la póliza/certificado:
Se obtiene el monto total a invertir en este fondo:
- W_nAmount_to_invest = P_nAmount * W_Fund_pol.nParticip
Se registra el monto a invertir previamente calculado como un "Débito" en la cuenta corriente de la póliza (ul_move_acc_pol), para la cuenta origen indicada, y se actualiza el saldo de la cuenta corriente (ul_curr_acc_pol), tanto en el campo nDebit, como en el campo nBalance. Esto se hace para reflejar que se ha retirado dinero de la cuenta de la póliza para comprar unidades.
- Se calcula la cantidad de unidades que se pueden comprar con este monto:
Se obtiene el valor actual de la unidad, leyendo de la tabla Fund_value, para la fecha de compra. (Rutina general de consulta Ins_get_unit_rate() )
Si no hay cotización de la unidad para la fecha de consulta
- Se asigna el error No. 70085 a la variable W_Result /*No se registro precio de unidad para la fecha de consulta*/
Se retorna el valor falso, y la variable de error.
Si la moneda pasada como parámetro (P_nCurrency) es diferente a la moneda en la cual se expresan las unidades del fondo, Fund_value.nCurrency, se convierte el monto a invertir a la moneda del fondo.La cantidad de unidades que se pueden comprar es igual a:
W_Qunits = W_nAmount_to_invest / W_nUnit_value /***W_Qunits acepta decimales */
Si el número de unidaes disponibles en el inventario de unidades de la empresa (Fund_stock), para el fondo en tratamiento es menor a W_Qunits, se asigna el error 70086 /*No hay unidades suficiente en Stock */
Si el error fue registrado como "Advertencia" se continua el procedimiento, sino el mismo es terminado.
El mismo número de unidades, se registra ahora en la cuenta de
unidades de la Move_fund (cuenta de unidades de la póliza), pero
como una "Compra de Unidades" (nMove_type = 706), para la cuenta origen
indicada como parámetro. Luego se aumenta actualiza la cantidad
de unidades disponibles para la póliza en la tabla Funds_pol,:
Se lee de la tabla de fondos del producto (Funds), el porcentaje a cobrar por compra de unidades "nBuy_cost", y se almacena en la variable W_buy_cost
Se calcula el costo de compra, el cual es igual a
Se determina el número de unidades a vender para satisfacer el
costo obtenido en el paso anterior.
Se registra en el inventario de fondos de la empresa (fund_stock), la entrada de unidades de inversión y se actualiza el saldo de unidades disponibles para este fondo (Fond_inv).
Se registra el movimiento de salida de unidades de la cuenta de unidades
de la póliza (move_fund) y se disminuye la cantidad de unidades
disponible actualizando el campo correspondiente en Funds_pol,
En caso de que el valor en efectivo sea menor al costo de venta,
se asigna a la variable W_error, el número 70084 y se termina la
ejecución del precedimiento /*Saldo de la cuenta no es suficiente
para pagar el cargo */
Si ocurre algun error, se reversan las actualizaciones de base de datos (Rollback work), y se asigna el número de error 70087 a la variable W_error, y retorna el valor "False".