pax_global_header 0000666 0000000 0000000 00000000064 14430530062 0014507 g ustar 00root root 0000000 0000000 52 comment=e8c3a78d43a3cef253c6c65d965f1e1c554b7761
lib-develop/ 0000775 0000000 0000000 00000000000 14430530062 0013255 5 ustar 00root root 0000000 0000000 lib-develop/.gitignore 0000664 0000000 0000000 00000000037 14430530062 0015245 0 ustar 00root root 0000000 0000000 /vendor
/nbproject
/.idea
.idea lib-develop/README.md 0000664 0000000 0000000 00000000136 14430530062 0014534 0 ustar 00root root 0000000 0000000 # SIU-SANAVIRON-QUILMES - LIB
Librería de uso común para los proyectos Sanavirón-Quilmes
lib-develop/composer.json 0000664 0000000 0000000 00000000473 14430530062 0016003 0 ustar 00root root 0000000 0000000 {
"name": "siu/sq-lib",
"description": "Librerias de uso comun para Sanaviron-Quilmes",
"type": "project",
"require": {
"php": ">=5.6.0"
},
"authors": [{
"name": "Esteban Sassone",
"email": "esassone@siu.edu.ar"
}],
"autoload": {
"psr-4": { "SIU\\SQ\\Lib\\":"src/siu/sq/lib" }
}
}
lib-develop/composer.lock 0000664 0000000 0000000 00000001072 14430530062 0015756 0 ustar 00root root 0000000 0000000 {
"_readme": [
"This file locks the dependencies of your project to a known state",
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
"This file is @generated automatically"
],
"content-hash": "26ed1aeabe6294976c05a71c121dedf2",
"packages": [],
"packages-dev": [],
"aliases": [],
"minimum-stability": "stable",
"stability-flags": [],
"prefer-stable": false,
"prefer-lowest": false,
"platform": {
"php": ">=5.6.0"
},
"platform-dev": []
}
lib-develop/src/ 0000775 0000000 0000000 00000000000 14430530062 0014044 5 ustar 00root root 0000000 0000000 lib-develop/src/siu/ 0000775 0000000 0000000 00000000000 14430530062 0014644 5 ustar 00root root 0000000 0000000 lib-develop/src/siu/sq/ 0000775 0000000 0000000 00000000000 14430530062 0015267 5 ustar 00root root 0000000 0000000 lib-develop/src/siu/sq/lib/ 0000775 0000000 0000000 00000000000 14430530062 0016035 5 ustar 00root root 0000000 0000000 lib-develop/src/siu/sq/lib/comandos/ 0000775 0000000 0000000 00000000000 14430530062 0017640 5 ustar 00root root 0000000 0000000 lib-develop/src/siu/sq/lib/comandos/crear_usuario_admin.php 0000664 0000000 0000000 00000006314 14430530062 0024370 0 ustar 00root root 0000000 0000000 setName('crear_usuario_admin')
->setDescription('Setea el nombre y el email del usuario administrador')
->setHelp(sprintf(
'%sUtilidades genericas%s',
PHP_EOL,
PHP_EOL
));
}
protected function execute(Console\Input\InputInterface $input, Console\Output\OutputInterface $output)
{
$helper = $this->getHelper('question');
$filtro = ['codigo' => constantes::PARAMETROS_SISTEMA_CODIGO_USUARIO_ADMIN];
$parametro_usu_admin = lib::catalogo_daos()->parametros_sistema()->get_lista($filtro)[0];
//si el usuario administrador ya esta seteado, pregunto si se desea sobrescribirlo
if (!is_null($parametro_usu_admin['valor'])) {
$question_sobreescribir =
new Question('El usuario administrador actual es "' . $parametro_usu_admin['valor'] . '". Desea sobrescribirlo? (s/n):');
$question_sobreescribir->setValidator(function ($resp) {
if ($resp != 's' && $resp != 'n') {
throw new \RuntimeException(
'Debe ingresar "s" o "n"'
);
}
return $resp;
});
$sobreescribe = $helper->ask($input, $output, $question_sobreescribir);
if ($sobreescribe == 'n') {
return;//si responde n no hago nada
}
}
$question_nombre = new Question('Ingrese el nombre del usuario administrador: ');
$question_nombre->setValidator(function ($nombre_ingresado) {
if (is_null($nombre_ingresado)) {
throw new \RuntimeException(
'Debe ingresar el nombre del usuario administrador'
);
}
return $nombre_ingresado;
});
$question_nombre->setMaxAttempts(2);
$nombre = $helper->ask($input, $output, $question_nombre);
$question_email = new Question('Ingrese el email del usuario administrador: ');
$question_email->setValidator(function ($email_ingresado) {
if (is_null($email_ingresado)) {
throw new \RuntimeException(
'Debe ingresar el email del usuario administrador'
);
}
//valido el email
if (!filter_var($email_ingresado, FILTER_VALIDATE_EMAIL)) {
throw new \RuntimeException(
'El email ingresado no es valido'
);
}
return $email_ingresado;
});
$question_email->setMaxAttempts(2);
$email = $helper->ask($input, $output, $question_email);
try {
lib::catalogo_procesos()->crear_usuario_admin($nombre, $email)->ejecutar();
$output->write('Usuario creado con exito', true);
} catch (\Exception $ex) {
$output->write('Error al crear el usuario', true);
}
}
}
lib-develop/src/siu/sq/lib/comandos/iniciar_workers.php 0000664 0000000 0000000 00000001373 14430530062 0023547 0 ustar 00root root 0000000 0000000 setName('iniciar_workers')
->setDescription('Inicia los workers (RestHooks)')
->setDefinition(array(
//new InputOption('path', null, null, 'Buscar todas las versiones'),
))
->setHelp(sprintf(
'%sUtilidades genericas%s',
PHP_EOL,
PHP_EOL
));
}
protected function execute(Console\Input\InputInterface $input, Console\Output\OutputInterface $output)
{
$proceso = lib::catalogo_procesos()->iniciar_workers();
$proceso->ejecutar();
}
}
lib-develop/src/siu/sq/lib/comandos/migrar_version.php 0000664 0000000 0000000 00000002104 14430530062 0023374 0 ustar 00root root 0000000 0000000 setName('migrar_version')
->setDescription('Inicia la migracion a una nueva version del sistema')
->addArgument('version', null, 'Identificador de la version a migrar')
->setHelp(sprintf(
'%sUtilidades genericas%s',
PHP_EOL,
PHP_EOL
));
}
protected function execute(Console\Input\InputInterface $input, Console\Output\OutputInterface $output)
{
$version = $input->getArgument("version");
if ($version and !empty($version)) {
$proceso = lib::catalogo_procesos()->migrar_version($version);
$proceso->ejecutar();
}
if (!$version or empty($version)) {
$messages = "Ninguna version especificada. Para obtener ayuda: sq migrar_version --help";
$output->write($messages, true);
}
}
}
lib-develop/src/siu/sq/lib/comandos/reenviar_mensaje.php 0000664 0000000 0000000 00000005125 14430530062 0023671 0 ustar 00root root 0000000 0000000 setName('reenviar_mensaje')
->setDescription('Reenvia un mensaje especifico a Redis (RestHooks)')
->setDefinition(array(
//new InputOption('path', null, null, 'Buscar todas las versiones'),
))
->setHelp(sprintf(
'%sUtilidades genericas%s',
PHP_EOL,
PHP_EOL
));
}
protected function execute(Console\Input\InputInterface $input, Console\Output\OutputInterface $output)
{
$helper = $this->getHelper('question');
$question_topicName = new Question('Ingrese el nombre del Tópico: ');
$question_topicName->setValidator(function ($topic_ingresado) {
if (is_null($topic_ingresado)) {
throw new \RuntimeException(
'Debe ingresar el nombre de un tópico'
);
}
return $topic_ingresado;
});
$question_topicName->setMaxAttempts(2);
$topicName = $helper->ask($input, $output, $question_topicName);
$question_listenerName = new Question('Ingrese el nombre del listener: ');
$question_listenerName->setValidator(function ($listener_ingresado) {
if (is_null($listener_ingresado)) {
throw new \RuntimeException(
'Debe ingresar el nombre del listener'
);
}
return $listener_ingresado;
});
$question_listenerName->setMaxAttempts(2);
$listenerName = $helper->ask($input, $output, $question_listenerName);
$question_messageId = new Question('Ingrese el id del mensaje: ');
$question_messageId->setValidator(function ($message_ingresado) {
if (is_null($message_ingresado)) {
throw new \RuntimeException(
'Debe ingresar el id del mensaje'
);
}
return $message_ingresado;
});
$question_messageId->setMaxAttempts(2);
$messageId = $helper->ask($input, $output, $question_messageId);
try {
$proceso = lib::catalogo_procesos()->reenviar_mensaje($topicName, $listenerName, $messageId);
$proceso->ejecutar();
$output->write('Mensaje reenviado.', true);
} catch (\Exception $ex) {
$output->write('Error al reenviar el mensaje.', true);
}
}
}
lib-develop/src/siu/sq/lib/constantes.php 0000664 0000000 0000000 00000012245 14430530062 0020733 0 ustar 00root root 0000000 0000000 entorno);
}
/**
* @return dao_parametros_sistema
*/
public function parametros_sistema()
{
return new dao_parametros_sistema($this->entorno);
}
/**
* @return dao_comprobantes
*/
public function comprobantes()
{
return new dao_comprobantes($this->entorno);
}
/**
* @return dao_alarmas
*/
public function alarmas()
{
return new dao_alarmas($this->entorno);
}
/**
* @return dao_reloj_facturador
*/
public function reloj_faturador()
{
return new dao_reloj_facturador($this->entorno);
}
/**
* @return dao_procesos
*/
public function procesos()
{
return new dao_procesos($this->entorno);
}
/**
* @return dao_ventas
*/
public function ventas()
{
return new dao_ventas($this->entorno);
}
/**
* @return dao_interoperabilidad
*/
public function interoperabilidad()
{
return new dao_interoperabilidad($this->entorno);
}
/**
* @return dao_facturador
*/
public function facturador()
{
return new dao_facturador($this->entorno);
}
/**
* @return dao_log_interacciones_externas
*/
public function log_interacciones_externas()
{
return new dao_log_interacciones_externas($this->entorno);
}
}
lib-develop/src/siu/sq/lib/daos/dao.php 0000664 0000000 0000000 00000002567 14430530062 0020251 0 ustar 00root root 0000000 0000000 entorno = $entorno;
}
/**
* @return entorno
*/
public function entorno()
{
if (!isset($this->entorno)) {
throw new error("PROCESO - El entorno no esta cargado");
}
return $this->entorno;
}
public function quote($dato)
{
return $this->entorno()->db()->quote($dato);
}
/**
* Toma un string con formato json y retorna un array del mismo con los caracteres especiales bien decodificados
* @param string $json_string
* @return array
*/
public function json_decode_caracteres_especiales($json_string)
{
$json_array = json_decode(utf8_encode($json_string), true);
foreach (array_keys($json_array) as $id) {
$elemento = $json_array[$id];
if (is_array($elemento)) {
$json_array[$id] = $this->json_decode_caracteres_especiales(json_encode($elemento));
} else {
$elem = htmlentities($elemento, ENT_COMPAT, "ISO-8859-1");
$resultado = html_entity_decode($elem, ENT_COMPAT, "ISO-8859-1");
$json_array[$id] = utf8_decode($resultado);
}
}
return $json_array;
}
}
lib-develop/src/siu/sq/lib/daos/dao_alarmas.php 0000664 0000000 0000000 00000012620 14430530062 0021740 0 ustar 00root root 0000000 0000000 quote($filtro['id']);
}
if (isset($filtro['codigo'])) {
$where .= " AND fa.codigo = " . $this->quote($filtro['codigo']);
}
if (isset($filtro['descripcion'])) {
$where .= " AND fa.descripcion = " . $this->quote($filtro['descripcion']);
}
if (isset($filtro['descripcion_comportamiento'])) {
$where .= " AND fa.descripcion_comportamiento = " . $this->quote($filtro['descripcion_comportamiento']);
}
if (isset($filtro['estado'])) {
$where .= " AND fa.estado = " . $this->quote($filtro['estado']);
}
$sql = "SELECT
fa.id,
fa.codigo,
fa.descripcion,
fa.id_tipo_facturador_alarma,
fa.descripcion_comportamiento,
fa.estado,
fa.estado_actualizado_en,
CASE tfa.parametros
WHEN 'par_rango_inferior' THEN fap.par_rango_inferior
WHEN 'par_rango_superior' THEN fap.par_rango_superior
WHEN 'par_valor' THEN
CASE
WHEN fa.id = 1 THEN coalesce(fap.par_valor,0)
ELSE fap.par_valor
END
END parametro_valor,
row_to_json(tfa.*) tipos_facturador_alarmas,
json_agg(fap.*) facturador_alarmas_parametros
FROM
facturador_alarmas fa
LEFT JOIN tipos_facturador_alarmas tfa ON fa.id_tipo_facturador_alarma = tfa.id
LEFT JOIN facturador_alarmas_parametros fap ON fa.id = fap.id_facturador_alarma
WHERE 1=1
$where
GROUP BY fa.id,fap.id,tfa.id
ORDER BY fa.id;";
$filas = $this->entorno()->db()->consultar($sql);
//convierto los string json en arrays
$resultado = [];
foreach ($filas as $f) {
$f['tipos_facturador_alarmas'] = $this->json_decode_caracteres_especiales($f['tipos_facturador_alarmas']);
$f['facturador_alarmas_parametros'] = $this->json_decode_caracteres_especiales($f['facturador_alarmas_parametros']);
$resultado[] = $f;
}
return $resultado;
}
public function obtener_alarma($id)
{
$rs = $this->obtener_alarmas(['id' => $id]);
if (count($rs) == 1) {
return $rs[0];
} else {
if (count($rs) > 1) {
throw new error_negocio("DAO_ALARMAS: "
. "La consulta devuelve mas de un registro.");
} else {
return null;
}
}
}
public function obtener_alarmas_configuradas($filtro = [])
{
$where = "";
if (isset($filtro['id'])) {
$where .= " AND id = " . $this->quote($filtro['id']);
}
if (isset($filtro['id_facturacion'])) {
$where .= " AND id_facturacion = " . $this->quote($filtro['id_facturacion']);
}
$sql = "SELECT
id,
id_facturacion,
id_facturador_alarma
FROM
facturaciones_alarmas_configuradas
WHERE 1=1
$where";
return $this->entorno()->db()->consultar($sql);
}
public function obtener_alarmas_generadas($filtro = [])
{
$where = "";
if (isset($filtro['id'])) {
$where .= " AND fa.id = " . $this->quote($filtro['id_facturador_alarma']);
}
if (isset($filtro['id_facturacion'])) {
$where .= " AND sfag.id_facturacion = " . $this->quote($filtro['id_facturacion']);
}
//NOTA: la unica manera de anidar funciones de agregacion (json_agg()) es utilizando subqueries
$sql = "SELECT
fa.id,
fa.codigo,
fa.descripcion,
fa.id_tipo_facturador_alarma,
fa.descripcion_comportamiento,
fa.estado,
fa.estado_actualizado_en,
CASE WHEN COUNT(sfag.*) > 0 THEN json_agg(sfag.*) ELSE '[]' END facturaciones_alarmas_generadas
FROM
facturador_alarmas fa
LEFT JOIN (
SELECT
fag.id,
fag.id_facturacion,
fag.id_facturador_alarma,
json_agg(fagv.*) facturaciones_alarmas_generadas_ventas
FROM
facturaciones_alarmas_generadas fag
JOIN facturaciones_alarmas_generadas_ventas fagv ON fag.id = fagv.id_facturacion_alarma_generada
GROUP BY fag.id
) sfag ON fa.id = sfag.id_facturador_alarma
WHERE 1=1
$where
GROUP BY fa.id";
$filas = $this->entorno()->db()->consultar($sql);
//convierto los string json en arrays
$resultado = [];
foreach ($filas as $f) {
$f['facturaciones_alarmas_generadas'] = $this->json_decode_caracteres_especiales($f['facturaciones_alarmas_generadas']);
$resultado[] = $f;
}
return $resultado;
}
public function obtener_alarmas_parametros($filtro = array())
{
$where = "";
if (isset($filtro['id'])) {
$where .= " AND id = " . $this->quote($filtro['id']);
}
if (isset($filtro['estado'])) {
$where .= " AND estado = " . $this->quote($filtro['estado']);
}
$sql = "SELECT
id,
codigo,
descripcion,
parametros,
estado,
estado_actualizado_en
FROM
tipos_facturador_alarmas
WHERE 1=1
$where";
return $this->entorno()->db()->consultar($sql);
}
}
lib-develop/src/siu/sq/lib/daos/dao_comprobantes.php 0000664 0000000 0000000 00000022057 14430530062 0023021 0 ustar 00root root 0000000 0000000 quote($filtro['id']);
}
if (isset($filtro['id_comprobante_template'])) {
$where .= " AND id_comprobante_template = " . $this->quote($filtro['id_comprobante_template']);
}
if (isset($filtro['id_punto_cobranza'])) {
$where .= " AND id_punto_cobranza = " . $this->quote($filtro['id_punto_cobranza']);
}
if (isset($filtro['estado'])) {
$where .= " AND estado = " . $this->quote($filtro['estado']);
}
if (isset($filtro['numero_comprobante'])) {
$where .= " AND numero_comprobante = " . $this->quote($filtro['numero_comprobante']);
}
$venta_info_personalizada = "(SELECT vip.datos FROM ventas_info_personalizada vip
JOIN cobranzas_ventas cv ON cv.id_venta = vip.id_venta
JOIN cobranzas c ON cv.id_cobranza = c.id AND c.id_comprobante = comp.id
) as ventas_info_personalizada";
if (isset($filtro['id_comprobante_relacionado'])) {
$where .= " AND id_comprobante_relacionado = " . $this->quote($filtro['id_comprobante_relacionado']);
$venta_info_personalizada = "(SELECT vip.datos FROM ventas_info_personalizada vip
JOIN cobranzas_ventas cv ON cv.id_venta = vip.id_venta
JOIN cobranzas c ON cv.id_cobranza = c.id AND c.id_comprobante = comp.id_comprobante_relacionado
) as ventas_info_personalizada";
}
$sql = "SELECT
comp.id,
comp.id_comprobante_template,
comp.presentacion,
comp.importe_control,
comp.id_rdi,
comp.uuid_arai_documentos,
comp.numero_comprobante,
comp.id_comprobante_relacionado,
comp.estado,
comp.estado_actualizado_en,
comp.id_punto_cobranza,
$venta_info_personalizada
FROM
comprobantes comp
WHERE 1=1
$where $order_by $limit;";
return $this->entorno()->db()->consultar($sql);
}
public function get($id)
{
$rs = $this->get_lista(['id' => $id]);
if (count($rs) == 1) {
$comprobante = $rs[0];
$comprobante['presentacion'] = utf8_e_seguro($comprobante['presentacion']);
return $comprobante;
} else {
if (count($rs) > 1) {
throw new error_negocio("DAO_COMPROBANTES: "
. "La consulta devuelve mas de un registro.");
} else {
return null;
}
}
}
public function get_lista_templates($filtro = [], $order_by = "ORDER BY ct.id", $limit = "")
{
$where = "";
if (isset($filtro['id'])) {
$where .= " AND ct.id = " . $this->quote($filtro['id']);
}
if (isset($filtro['codigo'])) {
$where .= " AND ct.codigo = " . $this->quote($filtro['codigo']);
}
if (isset($filtro['descripcion'])) {
$where .= " AND ct.descripcion = " . $this->quote($filtro['descripcion']);
}
if (isset($filtro['estado'])) {
$where .= " AND ct.estado = " . $this->quote($filtro['estado']);
}
$sql = "SELECT
ct.id,
ct.codigo,
ct.descripcion,
ct.tipo_comprobante,
ct.modelo,
ct.numeracion,
ct.estado,
ct.estado_actualizado_en,
ct.id_arai,
ct.revision,
ct.sincronizar,
true as numeracion_externa
FROM
comprobantes_templates ct
WHERE 1 = 1
$where
$order_by $limit";
return $this->entorno()->db()->consultar($sql);
}
public function get_template($id)
{
$rs = $this->get_lista_templates(['id' => $id]);
if (count($rs) == 1) {
return $rs[0];
} else {
if (count($rs) > 1) {
throw new error_negocio("DAO_COMPROBANTES: "
. "La consulta devuelve mas de un registro.");
} else {
return null;
}
}
}
public function get_parametrizaciones()
{
$sql = "
SELECT
p.id,
p.institucion,
p.institucion_direccion,
p.institucion_cuit,
p.institucion_posicion_fiscal,
p.institucion_telefono,
p.institucion_posicion_iibb,
p.institucion_inicio_actividad,
p.comprobante_tipo_factura,
p.comprobante_tipo_nota_credito,
p.comprobante_tipo_letra,
p.comprobante_leyenda_pie
FROM
comprobantes_templates_parametrizaciones p
LIMIT 1
";
return $this->entorno()->db()->consultar_fila($sql);
}
public function get_numeracion_faltante_afip($filtro = [])
{
$where = "";
if (isset($filtro['id_punto_cobranza'])) {
$where .= "AND sd.valor = " . $this->quote($filtro['id_punto_cobranza']);
}
$faltantes = [];
$sql = "
SELECT
s.id,
s.codigo AS punto_cobranza_codigo,
sd.valor AS id_punto_cobranza,
pc.descripcion AS punto_cobranza_descripcion,
uv.id as unidad_venta_id,
uv.descripcion as unidad_venta_descripcion
FROM suscripciones_detalle sd
JOIN suscripciones s ON sd.id_suscripcion = s.id
JOIN unidades_ventas uv ON uv.id = s.id_unidad_venta
JOIN suscripciones_parametros sp ON sp.id = sd.id_suscripcion_parametro
JOIN puntos_cobranzas pc ON CAST ( pc.id AS TEXT ) = sd.valor
WHERE
sp.codigo = '".constantes::SUSCRIPCION_PARAMETRO_CODIGO_PUNTO_COBRANZA."'
AND s.finalizada_en IS NULL
AND EXISTS (
SELECT
s2.id
FROM
suscripciones_detalle sd
JOIN suscripciones s2 ON
sd.id_suscripcion = s2.id
JOIN unidades_ventas uv ON
uv.id = s2.id_unidad_venta
JOIN suscripciones_parametros sp ON
sp.id = sd.id_suscripcion_parametro
WHERE
sp.codigo = '".constantes::SUSCRIPCION_PARAMETRO_CODIGO_ACEPTAAFIP."'
AND sd.valor = '".constantes::SUSCRIPCION_PARAMETRO_VOCABULARIO_TERMINO_SI."'
AND s2.finalizada_en IS NULL
AND s.id = s2.id)
$where;
";
foreach ($this->entorno()->db()->consultar($sql) as $r) {
$obtenidos = $this->get_numeracion_faltante($r);
if ($obtenidos) {
$faltantes = array_merge($faltantes, $obtenidos);
}
}
return $faltantes;
}
public function get_numeracion_faltante($filtro = [])
{
$faltantes = [];
// Para cada conjunto de comprobantes de determinado template y punto de cobranza
// busco si existe alguna numeración intermedia faltante entre el primero y el último
$sql = "
SELECT
numero_faltante
FROM
generate_series(1, (
SELECT MAX(numero_comprobante::INT) FROM comprobantes co WHERE co.id_comprobante_template = ".constantes::COMPROBANTE_TEMPLATE_COBRO." AND co.id_punto_cobranza = {$filtro['id_punto_cobranza']} )
) AS serie_completa(numero_faltante)
WHERE serie_completa.numero_faltante NOT IN (
SELECT
numero_comprobante::INT
FROM
comprobantes
WHERE
id_comprobante_template = ".constantes::COMPROBANTE_TEMPLATE_COBRO." AND
id_punto_cobranza = {$filtro['id_punto_cobranza']} AND
numero_comprobante IS NOT NULL
ORDER BY
numero_comprobante::INT
);
";
foreach ($this->entorno()->db()->consultar($sql) as $r) {
$faltante = [];
$faltante['id_punto_cobranza'] = $filtro['id_punto_cobranza'];
$faltante['punto_cobranza_descripcion'] = $filtro['punto_cobranza_descripcion'];
$faltante['numero_faltante'] = $r['numero_faltante'];
$faltante['punto_cobranza_codigo'] = $filtro['punto_cobranza_codigo'];
$faltante['unidad_venta_id'] = $filtro['unidad_venta_id'];
$faltante['unidad_venta_descripcion'] = $filtro['unidad_venta_descripcion'];
$faltantes[] = $faltante;
}
return $faltantes;
}
}
lib-develop/src/siu/sq/lib/daos/dao_facturador.php 0000664 0000000 0000000 00000010477 14430530062 0022462 0 ustar 00root root 0000000 0000000 quote($filtro['id']);
}
if (isset($filtro['id_reloj_facturador'])) {
$where .= " AND f.id_reloj_facturador = " . $this->quote($filtro['id_reloj_facturador']);
}
$sql = "SELECT
f.id,
f.id_ejecucion_proceso,
f.id_reloj_facturador,
f.dia_1er_vencimiento,
f.dia_2do_vencimiento,
f.id_reloj_facturador_1er_venc,
f.id_reloj_facturador_2do_venc
FROM
facturaciones f
WHERE 1=1
$where $order_by $limit;";
return $this->entorno()->db()->consultar($sql);
}
public function get_facturaciones_servicios_instancias($filtro, $order_by = "ORDER BY id", $limit = "")
{
$where = "";
if (isset($filtro['id'])) {
$where .= " AND fsi.id = " . $this->quote($filtro['id']);
}
if (isset($filtro['id_servicio_instancia'])) {
$where .= " AND fsi.id_servicio_instancia = " . $this->quote($filtro['id_servicio_instancia']);
}
if (isset($filtro['id_facturacion'])) {
$where .= " AND fsi.id_facturacion = " . $this->quote($filtro['id_facturacion']);
}
if (isset($filtro['estado'])) {
$where .= " AND fsi.estado = " . $this->quote($filtro['estado']);
}
$sql = "SELECT
fsi.id,
fsi.id_servicio_instancia,
fsi.id_facturacion,
fsi.estado
FROM
facturaciones_servicios_instancias fsi
WHERE 1=1
$where $order_by $limit;";
return $this->entorno()->db()->consultar($sql);
}
public function get_tipos_servicios($filtro = array(), $order_by = "ORDER BY id", $limit = "")
{
$where = "";
if (isset($filtro['id'])) {
$where .= " AND id = " . $this->quote($filtro['id']);
}
if (isset($filtro['codigo'])) {
$where .= " AND codigo = " . $this->quote($filtro['codigo']);
}
if (isset($filtro['devenga'])) {
$where .= " AND devenga = " . $this->quote($filtro['devenga']);
}
$sql = "SELECT
id,
codigo,
descripcion,
tiene_instancias,
estado,
estado_actualizado_en,
devenga
FROM
tipos_servicios
WHERE 1 = 1
$where $order_by $limit ;";
return $this->entorno()->db()->consultar($sql);
}
public function get_reloj_facturador($filtro = [])
{
$select = "";
$where = "";
$join = "";
if (isset($filtro['id'])) {
$where .= " AND r.id = " . $this->quote($filtro['id']);
}
if (isset($filtro['id_mes']) && !isset($filtro['con_mes'])) {
$select.=" mes,";
$join.= " join meses m on m.id=r.id_mes";
$where .= " AND r.id_mes = " . $this->quote($filtro['id']);
}
if (isset($filtro['con_mes'])) {
$select.=" numero_mes as mes,";
$join.= " join meses m on m.id=r.id_mes";
}
if (isset($filtro['id_anio']) && !isset($filtro['con_anio'])) {
$select.="anio,";
$join.= " join anios a on a.id=r.id_anio";
$where .= " AND r.id_anio = " . $this->quote($filtro['id_anio']);
}
if (isset($filtro['con_anio'])) {
$select.="anio,";
$join.= " join anios a on a.id=r.id_anio";
}
if (isset($filtro['anio'])) {
$join.= " join anios a on a.id=r.id_anio and a.codigo=". $this->quote($filtro['anio']);
}
if (isset($filtro['mes'])) {
$join.= " join meses m on m.id=r.id_mes and m.numero_mes=". $this->quote($filtro['mes']);
}
if (isset($filtro['id_reloj_facturador_estado'])) {
$where .= " AND r.id_reloj_facturador_estado = " . $this->quote($filtro['id_reloj_facturador_estado']);
}
$sql = "SELECT
$select
r.id,
r.codigo,
r.id_anio,
r.id_mes
FROM
reloj_facturador r
$join
WHERE 1=1
$where ;";
return $this->entorno()->db()->consultar($sql);
}
}
lib-develop/src/siu/sq/lib/daos/dao_interoperabilidad.php 0000664 0000000 0000000 00000006404 14430530062 0024004 0 ustar 00root root 0000000 0000000 get_sistemas_externos($filtro);
if (count($rs) == 1) {
return $rs[0];
} else {
if (isset($filtro['token']) and count($rs) == 0) {
throw new error_negocio("El sistema externo no se encuentra registrado");
}
if (count($rs) > 1) {
throw new error_negocio("DAO_INTEROPERABILIDAD: get_sistema_externo: "
. "La consulta devolvio mas de un registro.");
}
}
}
public function esUuidValido($token)
{
$dato = !empty($token) && preg_match('/^\{?[A-Z0-9]{8}-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{12}\}?$/i', $token);
if (!$dato) {
throw new error_negocio("El id ingresado no tiene formato UUID");
}
}
public function get_sistemas_externos($filtro = array())
{
$where = "";
if (isset($filtro['id'])) {
$where .= " AND se.id = " . $this->quote($filtro['id']);
}
if (isset($filtro['descripcion'])) {
$where .= " AND se.descripcion = " . $this->quote($filtro['descripcion']);
}
if (isset($filtro['token'])) {
$this->esUuidValido($filtro['token']);
$where .= " AND token = " . $this->quote($filtro['token']);
}
$sql = "SELECT
se.id,
se.descripcion,
se.token
FROM
sistemas_externos se
WHERE 1=1
$where ORDER BY id;";
return $this->entorno()->db()->consultar($sql);
}
public function get_sistemas_externos_recursos($filtro = array())
{
$where = "";
if (isset($filtro['id'])) {
$where .= " AND ser.id = " . $this->quote($filtro['id']);
}
if (isset($filtro['sistema_externo'])) {
$where .= " AND ser.sistema_externo = " . $this->quote($filtro['sistema_externo']);
}
if (isset($filtro['identificador_recurso'])) {
$where .= " AND ser.identificador_recurso = " . $this->quote($filtro['identificador_recurso']);
}
$sql = "SELECT
ser.id,
ser.sistema_externo,
ser.version_sis,
ser.recurso,
ser.identificador_recurso
FROM
sistemas_externos_recursos ser
WHERE 1=1
$where ORDER BY id;";
return $this->entorno()->db()->consultar($sql);
}
public function get_sistema_externo_recurso($filtro)
{
$rs = $this->get_sistemas_externos_recursos($filtro);
if (count($rs) == 1) {
return $rs[0];
} else {
if (count($rs) == 0) {
$msg = "El recurso asociado al sistema externo no se encuentra registrado";
$this->entorno()->log()->error(__METHOD__ . ": " . $msg . ": Filtro: " . var_export($filtro, true));
throw new error_negocio($msg);
}
if (count($rs) > 1) {
$msg = "La consulta devolvio mas de un registro.";
$this->entorno()->log()->error(__METHOD__ . ": " . $msg);
throw new error_negocio($msg);
}
}
}
}
lib-develop/src/siu/sq/lib/daos/dao_log_interacciones_externas.php 0000664 0000000 0000000 00000001775 14430530062 0025731 0 ustar 00root root 0000000 0000000 $id];
$rs = $this->get_lista($filtro);
if (count($rs) > 1) {
throw new error_negocio("DAO_LOG_INTERACCIONES_EXTERNAS: "
. "La consulta devolvio mas de un registro.");
} else {
return isset($rs[0]) ? $rs[0] : null;
}
}
public function get_lista($filtro = array())
{
$where = "";
if (isset($filtro['id'])) {
$where .= " AND id = " . $this->quote($filtro['id']);
}
$sql = "SELECT
lie.id,
lie.tipo,
lie.sistema_externo,
lie.ocurrido_en,
lie.mensaje,
lie.recurso,
lie.verbo,
lie.codigo_procesamiento,
lie.mensaje_procesamiento
FROM
log_interacciones_externas lie
WHERE 1 = 1 $where ORDER BY id;";
return $this->entorno()->db()->consultar($sql);
}
}
lib-develop/src/siu/sq/lib/daos/dao_notificaciones.php 0000664 0000000 0000000 00000011602 14430530062 0023314 0 ustar 00root root 0000000 0000000 get_lista($filtro);
if (count($rs) > 1) {
throw new error_negocio(__METHOD__
. "La consulta devolvio mas de un registro.");
} else {
return (isset($rs[0])) ? $rs[0] : null;
}
}
public function get_lista($filtro = [], $order_by = "", $limit = "", $additional_where = [])
{
$where = "";
if (isset($filtro['id'])) {
$where .= " AND n.id = " . $this->quote($filtro['id']);
}
if (isset($filtro['id_tipo_notificacion'])) {
if (is_array($filtro['id_tipo_notificacion'])) {
$where .= " AND n.id_tipo_notificacion in ( " . implode(',', $filtro['id_tipo_notificacion']) . ')';
} else {
$where .= " AND n.id_tipo_notificacion = " . $this->quote($filtro['id_tipo_notificacion']);
}
}
if (isset($filtro['id_cliente'])) {
$where .= " AND n.par_id_cliente = " . $this->quote($filtro['id_cliente']);
}
if (isset($filtro['notificado_a__not_null'])) {
$where .= " AND n.notificado_a IS NOT NULL ";
}
if (isset($filtro['notificado_a__null'])) {
$where .= " AND n.notificado_a IS NULL ";
}
if (isset($filtro['enviada_por'])) {
$where .= " AND n.enviada_por ILIKE " . $this->quote("%" . $filtro['enviada_por'] . "%");
}
if (isset($filtro['fecha_desde'])) {
$where .= " AND date(n.enviada_en) >= " . $this->quote($filtro['fecha_desde']);
}
if (isset($filtro['fecha_hasta'])) {
$where .= " AND date(n.enviada_en) <= " . $this->quote($filtro['fecha_hasta']);
}
if (isset($filtro['enviada_en__null'])) {
$where .= " AND n.enviada_en IS NULL ";
}
if (isset($filtro['enviada_en__not_null'])) {
$where .= " AND n.enviada_en IS NOT NULL ";
}
if (isset($filtro['id_venta'])) {
$where .= " AND n.par_id_venta = " . $this->quote($filtro['id_venta']);
}
if (isset($filtro['id_servicio_suscripcion'])) {
$where .= " AND n.par_id_servicio_suscripcion = " . $this->quote($filtro['id_servicio_suscripcion']);
}
// Wheres que se agregan desde afuera. Para filtrar por perfil de datos desde afuera de lib.
if (!empty($additional_where)) {
$where .= implode(' ', $additional_where);
}
// Se utiliza el * porque las columnas en nucleo y las unidades de venta difieren en los parametros...
$sql = "SELECT
n.*,
p.nombres || ' ' || p.apellido cliente,
row_to_json(tn.*) tipo_notificacion,
v.leyenda venta,
v.id_comprobante
FROM
notificaciones n
JOIN tipos_notificaciones tn ON n.id_tipo_notificacion = tn.id
LEFT JOIN ventas v ON n.par_id_venta = v.id
LEFT JOIN (clientes c JOIN personas p ON c.id_persona = p.id)
ON n.par_id_cliente = c.id
WHERE
1=1
$where $order_by $limit;";
$notificaciones = $this->entorno()->db()->consultar($sql);
foreach (array_keys($notificaciones) as $k) {
$notificaciones[$k]['tipo_notificacion'] = $this->json_decode_caracteres_especiales($notificaciones[$k]['tipo_notificacion']);
}
return $notificaciones;
}
public function get_tipo_notificacion($id)
{
$filtro['id'] = $id;
$rs = $this->get_lista_tipos_notificaciones($filtro);
if (count($rs) > 1) {
throw new error_negocio(__METHOD__
. "La consulta devolvio mas de un registro.");
} else {
return (isset($rs[0])) ? $rs[0] : null;
}
}
public function get_lista_tipos_notificaciones($filtro = array(), $order_by = "", $limit = "")
{
$where = "";
if (isset($filtro['id'])) {
$where .= " AND id = " . $this->quote($filtro['id']);
}
if (isset($filtro['codigo'])) {
$where .= " AND codigo = " . $this->quote($filtro['codigo']);
}
if (isset($filtro['descripcion'])) {
$where .= " AND descripcion = " . $this->quote($filtro['descripcion']);
}
if (isset($filtro['tema'])) {
$where .= " AND tema = " . $this->quote($filtro['tema']);
}
if (isset($filtro['estado'])) {
$where .= " AND estado = " . $this->quote($filtro['estado']);
}
$sql = "SELECT
id,
codigo,
descripcion,
momento_envio,
rol,
parametros,
tema,
mensaje,
estado,
estado_actualizado_en
FROM
tipos_notificaciones
WHERE 1=1
$where $order_by $limit;";
return $this->entorno()->db()->consultar($sql);
}
}
lib-develop/src/siu/sq/lib/daos/dao_parametros_sistema.php 0000664 0000000 0000000 00000002466 14430530062 0024231 0 ustar 00root root 0000000 0000000 get_lista($filtro);
if (count($rs) > 1) {
throw new error_negocio("dao_parametros_sistema: "
. "La consulta devolvio mas de un registro.");
} else {
return (isset($rs[0])) ? $rs[0] : null;
}
}
public function get_lista($filtro = array(), $order_by = "", $limit = "")
{
$where = "";
if (isset($filtro['id'])) {
$where .= " AND id = " . $this->quote($filtro['id']);
}
if (isset($filtro['codigo'])) {
$where .= " AND codigo = " . $this->quote($filtro['codigo']);
}
if (isset($filtro['descripcion'])) {
$where .= " AND descripcion = " . $this->quote($filtro['descripcion']);
}
if (isset($filtro['categoria'])) {
$where .= " AND categoria = " . $this->quote($filtro['categoria']);
}
$sql = "SELECT
id,
codigo,
descripcion,
categoria,
valor,
valor_default
FROM
parametros_sistema
WHERE 1=1
$where $order_by $limit;";
return $this->entorno()->db()->consultar($sql);
}
}
lib-develop/src/siu/sq/lib/daos/dao_procesos.php 0000664 0000000 0000000 00000043000 14430530062 0022151 0 ustar 00root root 0000000 0000000 get_lista($filtro);
if (count($rs) > 1) {
throw new error_negocio("dao_procesos: "
. "La consulta devolvio mas de un registro.");
} else {
return (isset($rs[0])) ? $rs[0] : null;
}
}
public function get_lista($filtro = array(), $limit = "", $order_by = "")
{
$where = "";
if (isset($filtro['id'])) {
$where .= " AND p.id = " . $this->quote($filtro['id']);
}
if (isset($filtro['codigo'])) {
$where .= " AND p.codigo = " . $this->quote($filtro['codigo']);
}
if (isset($filtro['modalidad'])) {
$where .= " AND p.modalidad = " . $this->quote($filtro['modalidad']);
}
$sql = "SELECT
p.id,
p.codigo,
p.descripcion,
p.id_tipo_proceso,
p.hora,
p.prioridad,
p.modalidad,
p.estado,
p.estado_actualizado_en
FROM
procesos p
WHERE 1=1
$where $order_by $limit;";
return $this->entorno()->db()->consultar($sql);
}
public function get_procesos_ejecuciones($filtro = array(), $order_by = "", $limit = "", $con_detalle_estado = "", $con_detalle_proceso = "")
{
$select = "";
$join = "";
$where = "";
if (isset($filtro['id'])) {
$where .= " AND pe.id = " . $this->quote($filtro['id']);
}
if (isset($filtro['id_proceso'])) {
$where .= " AND pe.id_proceso = " . $this->quote($filtro['id_proceso']);
}
if (isset($filtro['id_proceso_ejecucion_estado'])) {
$where .= " AND pe.id_proceso_ejecucion_estado = " . $this->quote($filtro['id_proceso_ejecucion_estado']);
}
if (isset($filtro['fecha_desde'])) {
$where .= " AND pe.iniciado_en::timestamp::date >= " . $this->quote($filtro['fecha_desde']);
}
if (isset($filtro['fecha_hasta'])) {
$where .= " AND pe.iniciado_en::timestamp::date <= " . $this->quote($filtro['fecha_hasta']);
}
if (isset($filtro['total_a_procesar'])) {
$where .= " AND pe.total_a_procesar = " . $this->quote($filtro['total_a_procesar']);
}
if (isset($filtro['procesados_ok'])) {
$where .= " AND pe.procesados_ok = " . $this->quote($filtro['procesados_ok']);
}
if (isset($filtro['procesados_error'])) {
$where .= " AND pe.procesados_error = " . $this->quote($filtro['procesados_error']);
}
if (isset($filtro['finalizado_en__not_null'])) {
$where .= " AND pe.finalizado_en IS NOT NULL";
}
if (isset($filtro['id_venta'])) {
$join .= " JOIN rep_ventas_nucleo rvn ON rvn.id_proceso_ejecucion = pe.id";
$where .= " AND rvn.id = " . $this->quote($filtro['id_venta']);
}
if ($con_detalle_estado == 'true') {
$select .= ", json_build_object(
'id',pee.id,
'codigo',pee.codigo,
'descripcion',pee.descripcion
) estado";
$join .= " JOIN procesos_ejecuciones_estados pee ON pee.id = pe.id_proceso_ejecucion_estado";
}
if ($con_detalle_proceso == 'true') {
$select .= ", json_build_object(
'id',p.id,
'codigo',p.codigo,
'descripcion',p.descripcion
) proceso";
$join .= " JOIN procesos p ON p.id = pe.id_proceso";
}
$sql = "SELECT
pe.id,
pe.id_proceso,
pe.iniciado_en,
pe.finalizado_en,
pe.id_proceso_ejecucion_estado,
pe.total_a_procesar,
pe.procesados_ok,
pe.procesados_error
$select
FROM
procesos_ejecuciones pe
$join
WHERE 1=1
$where $order_by $limit";
$ejecuciones = $this->entorno()->db()->consultar($sql);
foreach ($ejecuciones as &$ejecucion) {
if (isset($ejecucion['estado'])) {
$ejecucion['estado'] = $this->json_decode_caracteres_especiales($ejecucion['estado']);
}
if (isset($ejecucion['proceso'])) {
$ejecucion['proceso'] = $this->json_decode_caracteres_especiales($ejecucion['proceso']);
}
}
return $ejecuciones;
}
public function get_procesos_ejecuciones_log($id_proceso, $filtro = array(), $order_by = "ORDER BY id", $limit = "")
{
$where = "";
if (isset($filtro['ocurrido_en'])) {
$where .= " AND ocurrido_en = " . $this->quote($filtro['ocurrido_en']);
}
if (isset($filtro['severidad'])) {
$where .= " AND severidad = " . $this->quote($filtro['severidad']);
}
$sql = "SELECT
id,
id_proceso_ejecucion,
ocurrido_en,
severidad,
componente,
texto
FROM
procesos_ejecuciones_log
WHERE
id_proceso_ejecucion = " . $this->quote($id_proceso) . "
$where $order_by $limit;";
return $this->entorno()->db()->consultar($sql);
}
public function get_procesos_ejecuciones_estados($filtro = array())
{
$where = "";
if (isset($filtro['id'])) {
$where .= " AND pee.id = " . $this->quote($filtro['id']);
}
if (isset($filtro['codigo'])) {
$where .= " AND pee.codigo = " . $this->quote($filtro['codigo']);
}
if (isset($filtro['descripcion'])) {
$where .= " AND pee.descripcion = " . $this->quote($filtro['descripcion']);
}
$sql = "SELECT
pee.id,
pee.codigo,
pee.descripcion
FROM
procesos_ejecuciones_estados pee
WHERE 1=1
$where";
return $this->entorno()->db()->consultar($sql);
}
public function get_ultima_ejecucion($filtro = array())
{
$where = "";
if (isset($filtro['id_proceso'])) {
$where .= " AND id_proceso = " . $this->quote($filtro['id_proceso']);
}
$sql = "SELECT id_proceso,
iniciado_en,
finalizado_en,
id_proceso_ejecucion_estado
FROM procesos_ejecuciones
WHERE 1=1
$where
AND finalizado_en IS NOT NULL
AND id_proceso_ejecucion_estado = " . constantes::PROCESO_EJECUCION_ESTADO_OK . "
ORDER BY iniciado_en
DESC LIMIT 1;";
return $this->entorno()->db()->consultar_fila($sql);
}
public function get_procesos_parametros($filtro = array())
{
$where = "";
if (isset($filtro['id'])) {
$where .= " AND p.id = " . $this->quote($filtro['id']);
}
if (isset($filtro['codigo'])) {
$where .= " AND p.codigo = " . $this->quote($filtro['codigo']);
}
$sql = "SELECT p.id,
p.codigo,
p.descripcion,
p.tipo_dato,
p.tipo_dominio,
p.es_multivaluado,
p.cantidad_valores,
p.valor_default,
p.version_publicacion,
pd.id_proceso_parametro_vocabulario,
pd.proyector,
pd.query
FROM procesos_parametros p
JOIN procesos_parametros_dominios pd ON pd.id_proceso_parametro = p.id
WHERE 1=1
$where
ORDER BY id DESC;";
return $this->entorno()->db()->consultar($sql);
}
public function get_procesos_parametros_vocabularios($filtro = array())
{
$where = "";
if (isset($filtro['id'])) {
$where .= " AND v.id = " . $this->quote($filtro['id']);
}
if (isset($filtro['codigo'])) {
$where .= " AND v.codigo = " . $this->quote($filtro['codigo']);
}
$sql = "SELECT --v.id,
--v.codigo,
--v.descripcion,
--vt.id as id_termino,
--vt.codigo as codigo_termino,
--vt.descripcion as descripcion_termino
vt.id as id,
vt.descripcion as valor
FROM procesos_parametros_vocabularios v
JOIN procesos_parametros_vocabularios_terminos vt ON vt.id_proceso_parametro_vocabulario = v.id
WHERE 1=1
$where
ORDER BY id DESC;";
return $this->entorno()->db()->consultar($sql);
}
public function get_parametro($id)
{
$filtro['id'] = $id;
$rs = $this->get_procesos_parametros($filtro);
if (count($rs) > 1) {
throw new error_negocio(__METHOD__ . ": "
. "La consulta devolvio mas de un registro.");
} else {
return (isset($rs[0])) ? $rs[0] : null;
}
}
public function get_valores_por_parametro($id)
{
$parametro = $this->get_parametro($id);
// Según el tipo de dominio realizar la acción
if (!is_null($parametro['query']) && !is_null($parametro['proyector'])) {
$query = str_replace("%proyector%", "", $parametro['query']);
return $this->entorno()->db()->consultar($query);
} elseif ($parametro['id_proceso_parametro_vocabulario']) {
return $this->get_procesos_parametros_vocabularios(['id' => $parametro['id_proceso_parametro_vocabulario'] ]);
} else {
$msg = "El parametro con el id: '" . $id . "' no tiene definido un dominio.";
lib::entorno()->log()->error(__METHOD__ . ": " . $msg);
throw new error_negocio($msg);
}
}
public function get_procesos_parametrizaciones($filtro)
{
$where = "";
if (isset($filtro['id'])) {
$where .= " AND ppz.id = " . $this->quote($filtro['id']);
}
if (isset($filtro['id_proceso'])) {
$where .= " AND id_proceso = " . $this->quote($filtro['id_proceso']);
}
if (isset($filtro['id_proceso_parametro'])) {
$where .= " AND id_proceso_parametro = " . $this->quote($filtro['id_proceso_parametro']);
}
$sql = "SELECT ppz.id,
ppz.id_proceso,
ppz.id_proceso_parametro,
pps.descripcion
FROM procesos_parametrizaciones ppz
LEFT JOIN procesos_parametros pps on ppz.id_proceso_parametro = pps.id
WHERE 1=1
$where
ORDER BY id DESC;";
return $this->entorno()->db()->consultar($sql);
}
public function get_valores_procesos_parametrizaciones($id_proceso_parametrizacion)
{
$parametros = $this->get_procesos_parametrizaciones(['id' => $id_proceso_parametrizacion]);
$salida = [];
foreach ($parametros as $parametro) {
$valores = $this->get_valores_por_parametro($parametro['id_proceso_parametro']);
foreach ($valores as $valor) {
$salida[] = ['id' => $valor['id'], 'valor' => $valor['valor']];
}
}
return $salida;
}
public function get_tareas_programadas()
{
$sql = "SELECT
ptp.id,
ptp.id_proceso,
ptp.tipo_frecuencia,
ptp.dia,
ptp.hora,
ptp.intervalo,
proc.descripcion as proceso_descripcion
,(SELECT descripcion FROM procesos_parametros_vocabularios_terminos ppvt WHERE ppvt.id = cast(ptpv.valor as integer)) as parametro
FROM
procesos_tareas_programadas ptp
JOIN procesos proc ON proc.id = ptp.id_proceso
LEFT OUTER JOIN procesos_tareas_programadas_valores ptpv ON ptpv.id_proceso_tarea_programada = ptp.id
ORDER BY
ptp.id_proceso;";
return $this->entorno()->db()->consultar($sql);
}
public function get_tareas_programadas_valores($filtro)
{
$where = "";
if (isset($filtro['id'])) {
$where .= " AND ptpv.id = " . $this->quote($filtro['id']);
}
if (isset($filtro['id_proceso_tarea_programada'])) {
$where .= " AND ptpv.id_proceso_tarea_programada = " . $this->quote($filtro['id_proceso_tarea_programada']);
}
if (isset($filtro['id_proceso'])) {
$where .= " AND pp.id_proceso = " . $this->quote($filtro['id_proceso']);
}
$sql = "SELECT
pp.id as id_parametrizacion,
pp.id_proceso as id_proceso,
ptpv.id,
ptpv.id_proceso_tarea_programada,
ptpv.id_proceso_parametrizacion,
ptpv.valor,
param.id as id_proceso_parametro,
param.descripcion as parametro_descripcion
FROM
procesos_tareas_programadas_valores ptpv
JOIN procesos_parametrizaciones pp ON pp.id = ptpv.id_proceso_parametrizacion
JOIN procesos_parametros param ON param.id = pp.id_proceso_parametro
WHERE 1=1
$where
ORDER BY
ptpv.id;";
return $this->entorno()->db()->consultar($sql);
}
public function get_descripcion_parametro($filtro)
{
$where = $from = "";
if (isset($filtro['id'])) {
$where .= " AND p.id = " . $this->quote($filtro['id']);
}
if (isset($filtro['codigo'])) {
$where .= " AND p.codigo = " . $this->quote($filtro['codigo']);
}
if (isset($filtro['id_proceso_parametrizacion'])) {
$where .= " AND pp.id = " . $this->quote($filtro['id_proceso_parametrizacion']);
$from .= " JOIN procesos_parametrizaciones pp ON pp.id_proceso_parametro = p.id ";
}
$sql = "SELECT
p.id,
p.codigo,
p.descripcion,
p.tipo_dato,
p.tipo_dominio,
p.es_multivaluado,
p.cantidad_valores,
p.valor_default,
p.version_publicacion
FROM
procesos_parametros p
$from
WHERE 1=1
$where
ORDER BY id DESC;";
return $this->entorno()->db()->consultar($sql);
}
public function get_listado($origen)
{
$from = $select = '';
if (isset($origen)) {
if($origen == constantes_lib::ORIGEN_NUCLEO) {
$select = ",(CASE WHEN t_ptpv_uv.id is not null AND t_ptpv_informe.id is not null THEN
concat(t_p.descripcion,' || ', vt_informe.descripcion, ' || ', t_uv.descripcion)
WHEN t_ptpv_uv.id is not null AND t_ptpv_informe.id is null THEN
concat(t_p.descripcion,' || ', t_uv.descripcion)
WHEN t_ptpv_uv.id is null AND t_ptpv_informe.id is not null THEN
concat(t_p.descripcion,' || ', vt_informe.descripcion)
ELSE t_p.descripcion
END) as id_proceso_nombre";
$from = " LEFT JOIN procesos_tareas_programadas_valores as t_ptpv_informe
JOIN procesos_parametrizaciones as t_pps_informe on t_pps_informe.id = t_ptpv_informe.id_proceso_parametrizacion
JOIN procesos_parametros as t_ppa_informe on t_ppa_informe.id = t_pps_informe.id_proceso_parametro AND t_ppa_informe.codigo ='INFORME'
JOIN procesos_parametros_vocabularios_terminos vt_informe ON vt_informe.id = cast(t_ptpv_informe.valor as int)
ON t_ptpv_informe.id_proceso_tarea_programada = t_ptp.id
LEFT JOIN procesos_tareas_programadas_valores as t_ptpv_uv
JOIN procesos_parametrizaciones as t_pps_uv on t_pps_uv.id = t_ptpv_uv.id_proceso_parametrizacion
JOIN procesos_parametros as t_ppa_uv on t_ppa_uv.id = t_pps_uv.id_proceso_parametro AND t_ppa_uv.codigo ='UNIDVENTA'
JOIN unidades_ventas t_uv ON t_uv.id = cast(t_ptpv_uv.valor as int)
ON t_ptpv_uv.id_proceso_tarea_programada = t_ptp.id";
} else {
$select = " ,(CASE WHEN t_ptpv_ts.id is not null THEN
concat(t_p.descripcion,' || ', t_ts.descripcion)
ELSE t_p.descripcion
END) as id_proceso_nombre ";
$from = " LEFT JOIN procesos_tareas_programadas_valores as t_ptpv_ts
JOIN procesos_parametrizaciones as t_pps_ts on t_pps_ts.id = t_ptpv_ts.id_proceso_parametrizacion
JOIN procesos_parametros as t_ppa_ts on t_ppa_ts.id = t_pps_ts.id_proceso_parametro
JOIN tipos_servicios as t_ts ON t_ts.id = cast(t_ptpv_ts.valor as int)
ON t_ptpv_ts.id_proceso_tarea_programada = t_ptp.id AND t_ppa_ts.codigo ='TIPOSERVIC'";
}
}
$sql = "
SELECT
t_ptp.id,
t_p.id as id_proceso,
t_ptp.tipo_frecuencia,
t_ptp.dia,
t_ptp.hora,
t_ptp.intervalo,
(SELECT COUNT(*) FROM procesos_tareas_programadas_valores ptpv WHERE ptpv.id_proceso_tarea_programada = t_ptp.id) AS cantidad_parametrizaciones_seteadas,
(SELECT COUNT(*) FROM procesos_parametrizaciones pp WHERE pp.id_proceso = t_p.id) AS cantidad_parametrizaciones
$select
FROM
procesos_tareas_programadas as t_ptp
LEFT JOIN procesos as t_p ON t_ptp.id_proceso = t_p.id
$from
ORDER BY t_ptp.tipo_frecuencia";
lib::entorno()->log()->debug(__METHOD__ . ": " . $sql);
return $this->entorno()->db()->consultar($sql);
}
}
lib-develop/src/siu/sq/lib/daos/dao_reloj_facturador.php 0000664 0000000 0000000 00000017326 14430530062 0023655 0 ustar 00root root 0000000 0000000 quote($filtro['id']);
}
if (isset($filtro['id_reloj_facturador_estado'])) {
if (is_array($filtro['id_reloj_facturador_estado'])) {
$where .= " AND rfe.id IN (" . implode(',', $this->quote($filtro['id_reloj_facturador_estado'])) . ")";
} else {
$where .= " AND rfe.id = " . $this->quote($filtro['id_reloj_facturador_estado']);
}
}
if (isset($filtro['id_mes'])) {
$where .= " AND rf.id_mes = " . $filtro['id_mes'];
}
if (isset($filtro['id_anio'])) {
$where .= " AND rf.id_anio = " . $filtro['id_anio'];
}
if (isset($filtro['id_desde'])) {
$where .= " AND rf.id >= " . $this->quote($filtro['id_desde']);
}
if (isset($filtro['numero_mes'])) {
$where .= " AND m.numero_mes = " . $this->quote($filtro['numero_mes']);
}
if (isset($filtro['anio'])) {
$where .= " AND a.anio = " . $this->quote($filtro['anio']);
}
$sql = "SELECT
rf.id,
rf.codigo,
rf.descripcion,
rf.id_anio,
rf.id_mes,
rf.dia_inicio_facturacion,
rf.dia_limite_facturacion,
rf.id_reloj_facturador_estado,
rf.facturador_ejecutado_en,
rf.creado_por,
rf.creado_en,
rf.modificado_por,
rf.modificado_en,
rfe.descripcion estado,
a.descripcion anio,
m.descripcion mes
FROM
reloj_facturador rf,
reloj_facturador_estados rfe,
anios a,
meses m
WHERE
rf.id_reloj_facturador_estado = rfe.id
AND rf.id_anio = a.id
AND rf.id_mes = m.id
$where ORDER BY rf.id ASC;";
return $this->entorno()->db()->consultar($sql);
}
public function obtener_reloj($filtro)
{
$reloj = $this->obtener_relojes($filtro);
if (!empty($reloj)) {
if (count($reloj) == 1) {
return $reloj[0];
} else {
throw new error_negocio("DAO_RELOJ_FACTURACION: Se ha encontrado mas de un reloj para la consulta.");
}
}
}
/**
*
* @param integer $limit
* @return array periodos de facturacion futuros segun la fecha actual
* NOTA: si los periodos de facturacion no son mensuales esto deberia modificarse
*/
public function obtener_siguientes_periodos_de_facturacion($limit)
{
$sql = "SELECT
rf.id,
rf.codigo,
rf.descripcion,
rf.id_anio,
rf.id_mes,
rf.dia_inicio_facturacion,
rf.dia_limite_facturacion,
rf.id_reloj_facturador_estado,
rf.facturador_ejecutado_en,
rf.creado_por,
rf.creado_en,
rf.modificado_por,
rf.modificado_en
FROM
reloj_facturador rf
JOIN anios a ON rf.id_anio = a.id
JOIN meses m ON rf.id_mes = m.id
WHERE
a.anio > (SELECT EXTRACT(YEAR FROM CURRENT_DATE))
OR (a.anio = (SELECT EXTRACT(YEAR FROM CURRENT_DATE))
AND m.numero_mes > (SELECT EXTRACT(MONTH FROM CURRENT_DATE)))
ORDER BY a.anio, m.numero_mes LIMIT $limit";
return $this->entorno()->db()->consultar($sql);
}
public function obtener_cantidad_de_relojes_posteriores_al_actual()
{
$filtro['id_reloj_facturador_estado'] = constantes::RELOJ_FACTURACION_ESTADO_ACTUAL;
$reloj_actual = $this->obtener_reloj($filtro);
$sql = "SELECT
count(*)
FROM
reloj_facturador rf
WHERE
(id_anio = " . $reloj_actual['id_anio'] . "
AND id_mes > " . $reloj_actual['id_mes'] . ")
OR (id_anio > " . $reloj_actual['id_anio'] . ");";
return $this->entorno()->db()->consultar($sql)[0]['count'];
}
public function obtener_ultimo_reloj()
{
$sql = "SELECT
rf.id,
rf.codigo,
rf.descripcion,
rf.id_anio,
rf.id_mes,
rf.dia_inicio_facturacion,
rf.dia_limite_facturacion,
rf.id_reloj_facturador_estado,
rf.facturador_ejecutado_en,
rf.creado_por,
rf.creado_en,
rf.modificado_por,
rf.modificado_en,
a.anio numero_anio,
m.numero_mes
FROM
reloj_facturador rf
JOIN anios a ON rf.id_anio = a.id
JOIN meses m ON rf.id_mes = m.id
WHERE
rf.id_anio = (SELECT max(id_anio)
FROM reloj_facturador)
AND rf.id_mes = (SELECT max(id_mes)
FROM reloj_facturador
WHERE id_anio = (SELECT max(id_anio)
FROM reloj_facturador));";
return $this->entorno()->db()->consultar($sql)[0];
}
public function obtener_anio($filtro)
{
$where = "";
if (isset($filtro['numero_anio'])) {
$where .= " AND anio = " . $this->quote($filtro['numero_anio']);
}
if (isset($filtro['id'])) {
$where .= " AND id = " . $this->quote($filtro['id']);
}
$sql = "SELECT
id,
codigo,
descripcion,
anio
FROM
anios
WHERE 1=1
$where";
$r = $this->entorno()->db()->consultar($sql);
return !empty($r) ? $r[0] : null;
}
public function obtener_mes($filtro)
{
$where = "";
if (isset($filtro['numero_mes'])) {
$where .= " AND numero_mes = " . $this->quote($filtro['numero_mes']);
}
if (isset($filtro['id'])) {
$where .= " AND id = " . $this->quote($filtro['id']);
}
$sql = "SELECT
id,
codigo,
descripcion,
numero_mes
FROM
meses
WHERE 1=1
$where";
$r = $this->entorno()->db()->consultar($sql);
return !empty($r) ? $r[0] : null;
}
public function get_reloj_facturador_estados($filtro = array(), $order_by = "ORDER BY codigo", $limit = "")
{
$where = "";
if (isset($filtro['id'])) {
$where .= " AND id = " . $this->quote($filtro['id']);
}
if (isset($filtro['codigo'])) {
$where .= " AND codigo = " . $this->quote($filtro['codigo']);
}
if (isset($filtro['descripcion'])) {
$where .= " AND descripcion = " . $filtro['descripcion'];
}
if (isset($filtro['es_final'])) {
$where .= " AND es_final = " . $filtro['es_final'];
}
$sql = "SELECT
id,
codigo,
descripcion,
es_final
FROM
reloj_facturador_estados
WHERE 1=1
$where $order_by $limit";
return $this->entorno()->db()->consultar($sql);
}
public function get_feriados($filtro = array())
{
$where = "";
if (isset($filtro['1er_vencimiento'])) {
if (is_array($filtro['1er_vencimiento'])) {
$where .= " OR mes = " . $this->quote($filtro['1er_vencimiento']['mes']);
$where .= " AND anio = " . $this->quote($filtro['1er_vencimiento']['anio']);
}
}
if (isset($filtro['2do_vencimiento'])) {
if (is_array($filtro['2do_vencimiento'])) {
$where .= " OR mes = " . $this->quote($filtro['2do_vencimiento']['mes']);
$where .= " AND anio = " . $this->quote($filtro['2do_vencimiento']['anio']);
}
}
$sql = "SELECT dia
FROM feriados
WHERE 1=1
$where";
return $this->entorno()->db()->consultar($sql);
}
public function get_id_reloj($codigo)
{
$sql = "SELECT id
FROM reloj_facturador
WHERE codigo = '$codigo'";
return $this->entorno()->db()->consultar($sql);
}
}
lib-develop/src/siu/sq/lib/daos/dao_ventas.php 0000664 0000000 0000000 00000005007 14430530062 0021621 0 ustar 00root root 0000000 0000000 entorno()->db()->consultar($sql);
if (count($rs) == 1) {
return $rs;
}
return null;
}
public function get_info_personalizada_por_entidad($id_venta, $entidad)
{
$datos = null;
$info_personalizada = $this->get_info_personalizada($id_venta);
if (!empty($info_personalizada)) {
if (count($info_personalizada) == 1) {
$info_personalizada_decode = json_decode(array_a_utf8($info_personalizada[0]['datos']));
if (json_last_error() != JSON_ERROR_NONE) {
lib::entorno()->log()->error(__METHOD__ . ": Error JSON: No se pudo decodificar la info personalizada de la venta");
throw new error_negocio("No se pudo decodificar la info personalizada de la venta ID: '" . $id_venta );
}
foreach ($info_personalizada_decode as $info) {
if ($entidad == $info->entidad) {
$datos = $info->datos;
}
}
} else {
$msg = "Se encontraron '" . count($info_personalizada) . "' registros de info_personalizada asociados a la venta ID: '" . $id_venta . "' cuando solo se permite 1.";
lib::entorno()->log()->error(__METHOD__ . ": " . $msg);
throw new error_negocio($msg);
}
}
if ($datos) {
return $datos;
} else {
$msg = "";
lib::entorno()->log()->notice($msg);
return;
}
}
public function get_cobranza($id_venta)
{
$sql = "
SELECT
c.importe,
c.id_medio_pago,
c.id_unidad_venta,
c.id_comprobante,
c.id_cliente
FROM
cobranzas c
LEFT JOIN cobranzas_ventas cv ON c.id = cv.id_cobranza
LEFT JOIN ventas v ON v.id = cv.id_venta
WHERE
v.id = ". $id_venta ."
;";
return $this->entorno()->db()->consultar($sql);
}
}
lib-develop/src/siu/sq/lib/db/ 0000775 0000000 0000000 00000000000 14430530062 0016422 5 ustar 00root root 0000000 0000000 lib-develop/src/siu/sq/lib/db/db.php 0000664 0000000 0000000 00000000207 14430530062 0017517 0 ustar 00root root 0000000 0000000 parametros = $params;
try {
$this->conectar();
if (isset($this->parametros['dbname'])) {
$this->parametros['database'] = $this->parametros['dbname'];
}
$this->conexion->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
} catch (\PDOException $e) {
$msg = "ERROR conectandose al motor [" . $e->getCode() . "] - " . $e->getMessage();
$ex = new error_db("SQL CONNECTION ERROR: " . $msg);
if ($this->parametros['vendor'] != 'informix') {
$ex->set_sqlstate($this->conexion->errorCode());
}
throw $ex;
}
}
public function conexion()
{
return $this->conexion;
}
// Compatibilidad con lib toba_db
public function get_pdo()
{
return $this->conexion;
}
public function conectar()
{
try {
$dsn = array();
if (isset($this->parametros['pdo_user'])) {
$user = $this->parametros['pdo_user'];
$pass = $this->parametros['pdo_passwd'];
}
foreach ($this->parametros as $k => $p) {
if (!in_array($k, array('vendor', 'user', 'passwd', 'pdo_user', 'pdo_passwd', 'schema'))) {
$dsn[] = $k . '=' . $p;
}
}
if (isset($user)) {
$this->conexion = new \PDO($this->parametros['vendor'] . ':' . implode(';', $dsn), $user, $pass);
} else {
$this->conexion = new \PDO($this->parametros['vendor'] . ':' . implode(';', $dsn));
}
if ($this->parametros['vendor'] == 'pgsql' && isset($this->parametros['encoding'])) {
$this->set_encoding($this->parametros['encoding']);
if (isset($this->parametros['schema'])) {
$this->set_schema($this->parametros['schema']);
}
}
} catch (\PDOException $e) {
$msg = "ERROR conectandose al motor - " . $e->getMessage();
$msg .= "\n\nPor favor, verifique sus parámetros de conexión:\n" . implode("\n", $dsn);
$ex = new error_db("DB CONNECTION ERROR: " . $msg);
throw $ex;
}
}
public function get_parametros()
{
return $this->parametros;
}
public function desconectar()
{
unset($this->conexion);
}
public function set_encoding($encoding)
{
$sql = "SET CLIENT_ENCODING TO '$encoding';";
$this->ejecutar($sql);
}
public function set_schema($schema)
{
$this->schema = $schema;
$this->ejecutar("SET search_path TO $schema");
}
public function get_schema()
{
return $this->schema;
}
//------------------------------------------------------------------
// Acceso a datos
//------------------------------------------------------------------
protected function get_tipo_fetch($fetch)
{
switch ($fetch) {
case db::FETCH_ASSOC:
$f = \PDO::FETCH_ASSOC;
break;
case db::FETCH_NUM:
$f = \PDO::FETCH_NUM;
break;
default:
throw new error_db("DB: El medoto de FETCH seleccionado es incorrecto: $fetch");
}
return $f;
}
public function consultar($sql, $fetch=db::FETCH_ASSOC)
{
//kernel::log()->add_debug('SQL', $sql);
$fetch = $this->get_tipo_fetch($fetch);
try {
$statement = $this->conexion->query($sql);
$datos = $statement->fetchAll($fetch);
return $datos;
} catch (\PDOException $e) {
$ex = new error_db("SQL ERROR: " . $e->getMessage() . "\n$sql");
if ($this->parametros['vendor'] != 'informix') {
$ex->set_sqlstate($this->conexion->errorCode());
}
throw $ex;
}
}
public function consultar_fila($sql, $fetch=db::FETCH_ASSOC)
{
$data = $this->consultar($sql, $fetch);
if ($data && isset($data[0])) {
return $data[0];
}
return array();
}
public function ejecutar($sql)
{
//kernel::log()->add_debug('sql', $sql);
try {
return $this->conexion->exec($sql);
} catch (\PDOException $e) {
$ex = new error_db("SQL ERROR: " . $e->getMessage() . "\n$sql");
if ($this->parametros['vendor'] != 'informix') {
$ex->set_sqlstate($this->conexion->errorCode());
}
throw $ex;
}
}
//------------------------------------------------------------------
// Con statements
//------------------------------------------------------------------
public function sentencia_consultar($sql, $parametros=null, $fetch=null)
{
try {
kernel::log()->add_debug('sql', $sql);
kernel::log()->add_debug('parametros', var_export($parametros, true));
$stm = $this->conexion->prepare($sql);
$stm->execute($parametros);
$datos = $stm->fetchAll($fetch);
return $datos;
} catch (\PDOException $e) {
$ex = new error_db("SQL ERROR: " . $e->getMessage() . "\n$sql");
if ($this->parametros['vendor'] != 'informix') {
$ex->set_sqlstate($this->conexion->errorCode());
}
throw $ex;
}
}
public function sentencia_consultar_fila($sql, $parametros=null, $fetch=null)
{
$data = $this->sentencia_consultar($sql, $parametros, $fetch);
if ($data && isset($data[0])) {
return $data[0];
}
return array();
}
public function sentencia_ejecutar($sql, $parametros=null, $fetch=null)
{
$afectados = 0;
try {
kernel::log()->add_debug('sql', $sql);
$stm = $this->conexion->prepare($sql);
$stm->execute($parametros);
$afectados += $stm->rowCount();
} catch (\PDOException $e) {
$ex = new error_db("SQL ERROR: " . $e->getMessage() . "\n$sql");
if ($this->parametros['vendor'] != 'informix') {
$ex->set_sqlstate($this->conexion->errorCode());
}
throw $ex;
}
return $afectados;
}
public function quote($parametro)
{
if ($this->parametros['vendor'] == 'informix') {
return $this->quote_ifx($parametro);
}
return $this->conexion->quote($parametro);
}
protected function quote_ifx($parametro)
{
$search = array("'");
$replace = array("''");
$quoted = str_replace($search, $replace, $parametro);
return "'".$quoted."'";
}
//------------------------------------------------------------------------
//------------ TRANSACCIONES ---------------------------------------------
//------------------------------------------------------------------------
/**
* Ejecuta un BEGIN TRANSACTION en la conexión
*/
public function abrir_transaccion()
{
$this->ejecutar('BEGIN WORK');
//$this->conexion->beginTransaction();
//kernel::log()->add_debug("ABRIR transaccion", "base: ". $this->parametros['database']);
}
/**
* Ejecuta un ROLLBACK en la conexión
*/
public function abortar_transaccion($msj='')
{
$this->ejecutar('ROLLBACK WORK');
//$this->conexion->rollBack();
//kernel::log()->add_debug("ABORTAR transaccion: " . $msj,"base: ". $this->parametros['database']);
}
/**
* Ejecuta un COMMIT en la conexión
*/
public function cerrar_transaccion()
{
$this->ejecutar('COMMIT WORK');
//$this->conexion->commit();
//kernel::log()->add_debug("CERRAR transaccion", "base: ". $this->parametros['database']);
}
//------------------------------------------------------------------------
public function quote_like($str, $prepend = '', $append = '')
{
$str = $this->quote($str);
$str = substr($str, 1, -1);
$str = str_replace(array('%', '_'), array('\%', '\_'), $str);
$str = $prepend.$str.$append;
return "'$str'";
}
/**
* Devuelve el id del último insert en la base. Si el motor es postgres
* se debe indicar la secuencia correspondiente para tener resultados significativos
* @param string $secuencia Nombre de la secuencia que tiene asociada el id
* @return mixed
*/
public function ultimo_insert_id($secuencia = null)
{
return $this->conexion->lastInsertId($secuencia);
}
}
lib-develop/src/siu/sq/lib/db/interface_db.php 0000664 0000000 0000000 00000000626 14430530062 0021544 0 ustar 00root root 0000000 0000000 'valor')
* @param string $order_by order by de la query
* @param integer o string $limit limit de la query
* @return string consulta SQL
*/
public static function sql_select($columnas, $tabla, $db, $where = null, $order_by = null, $limit = null)
{
if (!is_null($where)) {
if (is_array($where)) {
$condiciones = " WHERE 1 = 1";
foreach ($where as $k => $v) {
if (is_null($v)) {
$condiciones .= " AND " . $k . " IS null ";
} else {
$condiciones .= " AND " . $k . " = " . $db->quote($v);
}
}
} else {
$condiciones = " WHERE $where";
}
} else {
$condiciones = null;
}
if (!is_null($order_by) && $order_by != "") {
if (strpos($order_by, 'ORDER BY') === false) {
$order_by = " ORDER BY $order_by";
}
}
if (!is_null($limit) && $limit != "") {
if (strpos($limit, 'LIMIT') === false) {
$limit = " LIMIT $limit";
}
}
return "SELECT $columnas FROM $tabla $condiciones $order_by $limit";
}
/**
* Concatena sentencias a la clausula WHERE de un SQL (Utilizando un AND)
*/
public static function sql_agregar_clausulas_where($sql, $clausulas_where=null)
{
if (preg_match("/\s+where\s+/i", $sql)) {
//TODO: Esto falla en SELECT con subquerys que no tienen WHERE en el cuerpo
//del query central, por ahora SALE...
$prefijo = " AND ";
} else {
$prefijo = " WHERE ";
}
$reemplazo = "";
if (is_array($clausulas_where)) {
if (count($clausulas_where)>0) {
$reemplazo = $prefijo . " (" . implode(" AND ", $clausulas_where) . ") ";
}
}
return preg_replace(apex_sql_where, $reemplazo, $sql);
//if(!stristr($sql,"where"))
}
/**
* Concatena sentencias a la clausula WHERE de un SQL (Utilizando un AND)
*/
public static function sql_concatenar_where($sql, $clausulas_where=array(), $comentario='')
{
if (empty($clausulas_where)) {
return $sql;
}
$sql = trim($sql);
//Elimino el ultimo punto y coma
if ($sql != '' && $sql[strlen($sql) - 1] == ';') {
$sql = substr($sql, 0, -1);
}
$balance_parentesis = 0; //Para saber si estoy metido en unos parentesis
$todos = preg_split("/([\s,;]+)/", $sql, -1, PREG_SPLIT_DELIM_CAPTURE);
$separadores = array();
$palabras = array();
$par = false;
//Se divide entre palabras y separadores para no perder la union luego
foreach ($todos as $candidato) {
if ($par) {
$separadores[] = $candidato;
} else {
$palabras[] = $candidato;
}
$par = !$par;
}
$separadores[] = '';
$punto_insercion = null;
$posee_where = false;
//--- Averiguo el punto de insercion ----------------------------------------
foreach ($palabras as $posicion => $palabra) {
$balance_parentesis += substr_count($palabra, '(');
$balance_parentesis -= substr_count($palabra, ')');
if ($balance_parentesis == 0) {
if ((strtolower($palabra) == 'where')) {
$posee_where = true;
continue;
}
if (((strtolower($palabra) == 'group') && (strtolower($palabras[$posicion+1]) == 'by'))
|| ((strtolower($palabra) == 'order') && (strtolower($palabras[$posicion+1]) == 'by'))
|| (strtolower($palabra) == 'limit')) {
$punto_insercion = $posicion - 1;
break;
}
}
}
//Llego al final sin encontrar naad
if (!isset($punto_insercion)) {
if (in_array(';', $separadores)) {
$punto_insercion = count($palabras)-2;
} else {
$punto_insercion = count($palabras)-1;
}
}
$sql = '';
for ($i = 0; $i < count($palabras) ; $i++) {
if (trim($separadores[$i]) !=';') {
$sql .= $palabras[$i].$separadores[$i];
} else {
$sql .= $palabras[$i];
}
//--- Concateno la clausula WHERE -------------------------------
if ($i == $punto_insercion) {
$sql .= ($posee_where) ? ' AND ' : ' WHERE ';
$sql .= "\n";
if ($comentario != '') {
$sql .= "/*-------- $comentario --------*/\n";
}
$sql .= implode(' AND ', $clausulas_where);
if ($comentario != '') {
$sql .= "\n/*------------------------*/\n";
}
$sql .= "\n";
}
if ($separadores[$i]==';') {
$sql .= $separadores[$i];
}
}
return $sql;
}
public static function sql_concatenar_clausulas_producto_cartesiano($sql, $fuente_datos, $where)
{
//-- 1: Preparo el SQL
// Le saco el ';' de atras
$sql = trim($sql);
if (substr($sql, -1, 1) ==';') {
$sql = substr($sql, 0, (strlen($sql)-1));
}
//-- 2: Regenero la SQL copiando los tokens ---
$en_join = false;
$sql_final = '';
$tabla = '';
$tokens = preg_split("/(\s+)/", $sql); //ei_arbol($tokens);
$cant = count($tokens);
for ($i = 0; $i < $cant ; $i++) {
if ($en_join && isset($where[$tabla])) { //Estoy dentro de un JOIN y existe una clausula para esa tabla
if ((stripos($tokens[$i], '(') !== false) && (strlen($tokens[$i]) == 1)) { //Si es un parentesis que abre
$sql_final .= $tokens[$i] . $where[$tabla] . ' AND '; //Primero va el parentesis y luego la expresion
} else {
$sql_final .= $where[$tabla] . ' AND ' .$tokens[$i] . ' '; //Sino primero la expresion y luego lo que venga
}
unset($where[$tabla]);
continue;
}
$sql_final .= $tokens[$i] . ' '; //paso el token actual para seguir armando la SQL
if (stripos($tokens[$i], 'JOIN') !== false) { //es la clausula del proximo JOIN
$en_join = false;
$tmp_name = $tokens[$i+1];
$pos_schema = stripos($tmp_name, '.');
$tabla = ($pos_schema !== false) ? substr($tmp_name, $pos_schema + 1) : $tmp_name;
} elseif (strtolower(trim($tokens[$i])) == 'on') {
$en_join = true;
}
}
return $sql_final;
}
/**
* Concatena tablas a la clausula FROM de un SQL
*/
public static function sql_agregar_tablas_from($sql, $tablas_from=null)
{
$reemplazo = "";
if (is_array($tablas_from)) {
if (count($tablas_from)>0) {
$reemplazo = ", " . implode(", ", $tablas_from);
}
}
return preg_replace(apex_sql_from, $reemplazo, $sql);
}
/**
* Concatena columnas a la clausula WHERE de un SQL
* @param array $columnas Matriz de columna, tipo. Donde tipo es asc o des
*/
public static function sql_agregar_ordenamiento($sql, $columnas)
{
if (count($columnas) > 0) {
//Busca la ultima ocurrencia de ORDER BY en el SQL, espera el ORDER BY sin espacio entre las palabras
$buscado = 'ORDER BY';
$ultima_pos = strripos($sql, $buscado);
if ($ultima_pos !== false) { //Si la encuentra
$anexo = "";
$parte_inicial = substr($sql, 0, $ultima_pos + strlen($buscado));
$parte_final = ", ".substr($sql, $ultima_pos + strlen($buscado), strlen($sql));
} else {
$anexo = "\nORDER BY ";
$parte_inicial = $sql;
$parte_final = '';
}
foreach ($columnas as $columna) {
switch ($columna[1]) {
case 'asc': $tipo_orden = 'ASC';break;
case 'des': $tipo_orden = 'DESC';break;
default: $tipo_orden = '';
}
$anexo .= " {$columna[0]} $tipo_orden, " ;
}
$anexo = substr($anexo, 0, -2); //Se le saca la ultima coma
$sql = $parte_inicial.$anexo.$parte_final;
}
return $sql;
}
/**
* Convierte un array asociativo en una sentencia de INSERT
* @param array $datos Array asociativo con el formato 'columna' => 'valor'
*/
public static function sql_array_a_insert($tabla, $datos, $db = null)
{
if (!is_array($datos)) {
throw new error_db("Los datos tienen que ser un array");
}
if (!$db) {
$db = toba::db();
}
foreach (array_keys($datos) as $columna) {
if (is_null($datos[$columna])) {
$datos[$columna] = "NULL";//Identifico los nulos
} else {
if (is_resource($datos[$columna])) {
$datos[$columna] = stream_get_contents($datos[$columna]);
}
if (is_bool($datos[$columna])) {
$datos[$columna] = ($datos[$columna]) ? 'TRUE' : 'FALSE';
} else {
$datos[$columna] = $db->quote($datos[$columna]);//Escapo caracteres
}
}
}
$sql = "INSERT INTO $tabla (" . implode(", ", array_keys($datos)) . ")".
" VALUES (" . implode(", ", $datos) . ");";
return $sql;
}
/**
* Convierte un array asociativo en una sentencia de INSERT
* @param array $datos Array asociativo con el formato 'columna' => 'valor'
*/
public static function sql_array_a_insert_condicional($tabla, $datos, $db = null)
{
if (!is_array($datos)) {
throw new error_db("Los datos tienen que ser un array");
}
$clausulas = array();
foreach (array_keys($datos) as $columna) {
if (is_null($datos[$columna])) {
$datos[$columna] = "NULL";//Identifico los nulos
} else {
if (is_resource($datos[$columna])) {
$datos[$columna] = stream_get_contents($datos[$columna]);
}
if (is_bool($datos[$columna])) {
$datos[$columna] = ($datos[$columna]) ? 'TRUE' : 'FALSE';
} else {
$datos[$columna] = $db->quote($datos[$columna]);//Escapo caracteres
}
}
$clausulas[] = " $columna = {$datos[$columna]} ";
}
$sql = "INSERT INTO $tabla (" . implode(", ", array_keys($datos)) . ')'
.' ( SELECT ' . implode(', ', $datos)
.' WHERE NOT EXISTS ('
. ' SELECT 1 '
. ' FROM ' . $tabla
. ' WHERE ' . implode(' AND ', $clausulas) .')'
.');';
return $sql;
}
/**
* Convierte un array asociativo en una sentencia de INSERT formateada para evitar conflictos cuando hay merges
* @param array $datos Array asociativo con el formato 'columna' => 'valor'
*/
public static function sql_array_a_insert_formateado($tabla, $datos, $db = null)
{
if (!is_array($datos)) {
throw new error_db("Los datos tienen que ser un array");
}
foreach (array_keys($datos) as $columna) {
if (is_null($datos[$columna])) {
$datos[$columna] = "NULL";//Identifico los nulos
} else {
if (is_resource($datos[$columna])) {
$datos[$columna] = stream_get_contents($datos[$columna]);
}
if (is_bool($datos[$columna])) {
$datos[$columna] = ($datos[$columna]) ? 'TRUE' : 'FALSE';
} else {
$datos[$columna] = $db->quote($datos[$columna]);//Escapo caracteres
}
}
}
$sql = "INSERT INTO $tabla (" . implode(', ', array_keys($datos)) . ')'.
' VALUES (';
$i = 1;
foreach ($datos as $clave => $valor) {
$coma = ($i < count($datos)) ? ',' : ' ';
$sql .= "\n\t$valor$coma --$clave"; //Sacar las comillas simples cuando el quote funcione correctamente
$i++;
}
$sql .= "\n);\n";
return $sql;
}
/**
* Convierte un array asociativo en una sentencia de UPDATE
* @param array $datos Array asociativo con el formato 'columna' => 'valor'
* @param array $where Array asociativo con el formato 'columna' => 'valor'
*/
public static function sql_array_a_update($tabla, $datos, $where, $db = null)
{
if (!is_array($datos)) {
throw new error_db("Los datos tienen que ser un array");
}
$datos = self::limpiar_array_sql($datos, $db);
$updates = array();
foreach ($datos as $k => $v) {
$updates[] = "$k = $v";
}
$set = implode(',', $updates);
if (!empty($where)) {
$where = self::limpiar_array_sql($where, $db);
$wheres = array();
foreach ($where as $k => $v) {
$wheres[] = "$k = $v";
}
$w = "WHERE ".implode(' AND ', $wheres);
} else {
$w = '';
}
$sql = "UPDATE $tabla SET $set $w;";
return $sql;
}
public static function limpiar_array_sql($datos, $db = null)
{
if (!$db) {
$db = toba::db();
}
foreach (array_keys($datos) as $columna) {
if (is_null($datos[$columna])) {
$datos[$columna] = "NULL"; //Identifico los nulos
} else {
if (is_resource($datos[$columna])) {
$datos[$columna] = stream_get_contents($datos[$columna]);
}
if (is_bool($datos[$columna])) {
$datos[$columna] = ($datos[$columna]) ? 'TRUE' : 'FALSE';
} else {
$datos[$columna] = $db->quote($datos[$columna]); //Escapo caracteres
}
}
}
return $datos;
}
/**
* Saca construcciones SQL de un STRING (necesario para concatenar el texto del usuario en el WHERE de un SQL)
*/
public static function filtrar_sql($sentencia)
{
//echo "entrada al FILTRO SQL: $sentencia
";
$temp = trim($sentencia);
$temp = preg_replace("%", "", $temp);
$temp = preg_replace("=", "", $temp);
$temp = preg_replace("\"", "", $temp);
$temp = preg_replace("\\\\", "", $temp);
$temp = preg_replace("'", "", $temp);
$temp = preg_replace("WHERE", "", $temp);
$temp = preg_replace("ORDER BY", "", $temp);
$temp = preg_replace("GROUP BY", "", $temp);
$temp = preg_replace("\(", "", $temp);
$temp = preg_replace("\)", "", $temp);
$temp = preg_replace(" AND ", "", $temp);
$temp = preg_replace(" OR ", "", $temp);
//echo "salida del filtro SQL: $temp
";
return trim($temp);
}
public static function sql_array_tablas_drop($tablas, $cascade = true)
{
$sql = array();
$sql_cascade = $cascade ? 'CASCADE' : '';
foreach ($tablas as $tabla) {
$sql[] = "DROP TABLE $tabla $sql_cascade;";
}
return $sql;
}
/*
* Espera un array asociativo con el nombre de la tabla como clave
* y el WHERE como valor
*/
public static function sql_array_tablas_delete($tablas)
{
$sql = array();
foreach ($tablas as $tabla => $where) {
$sql[] = "DELETE FROM $tabla $where;";
}
return $sql;
}
public static function sql_array_secuencias_drop($tablas)
{
$sql = array();
foreach ($tablas as $tabla) {
$sql[] = "DROP SEQUENCE $tabla;";
}
return $sql;
}
/**
* Dada una tabla, asume un posible alias para el select
*/
public static function sql_get_alias($tabla)
{
$alias = 't_';
foreach (explode('_', $tabla) as $parte) {
$alias .= substr($parte, 0, 1);
}
return $alias;
}
}
lib-develop/src/siu/sq/lib/entorno/ 0000775 0000000 0000000 00000000000 14430530062 0017521 5 ustar 00root root 0000000 0000000 lib-develop/src/siu/sq/lib/entorno/UniversalClassLoader.php 0000664 0000000 0000000 00000007544 14430530062 0024331 0 ustar 00root root 0000000 0000000
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace SIU\SQ\Lib\entorno;
/**
* UniversalClassLoader implements a "universal" autoloader for PHP 5.3.
*
* It is able to load classes that use either:
*
**********************************************************************************
**********************************************************************************
*The technical interoperability standards for PHP 5.3 namespaces and
* class names (http://groups.google.com/group/php-standards/web/psr-0-final-proposal);
* SE USA ESTE ESQUEMA SALVO LO DE LOS _ EN LOS NOMBRES DE LAS CLASES
**********************************************************************************
**********************************************************************************
* * The PEAR naming convention for classes (http://pear.php.net/).
*
* Classes from a sub-namespace or a sub-hierarchy of PEAR classes can be
* looked for in a list of locations to ease the vendoring of a sub-set of
* classes for large projects.
*
* Example usage:
*
* $loader = new UniversalClassLoader();
*
* // register classes with namespaces
* $loader->registerNamespaces(array(
* 'Symfony\Component' => __DIR__.'/component',
* 'Symfony' => __DIR__.'/framework',
* 'Sensio' => array(__DIR__.'/src', __DIR__.'/vendor'),
* ));
*
* // register a library using the PEAR naming convention
* $loader->registerPrefixes(array(
* 'Swift_' => __DIR__.'/Swift',
* ));
*
* // activate the autoloader
* $loader->register();
*
* In this example, if you try to use a class in the Symfony\Component
* namespace or one of its children (Symfony\Component\Console for instance),
* the autoloader will first look for the class under the component/
* directory, and it will then fallback to the framework/ directory if not
* found before giving up.
*
* @author Fabien Potencier
*
* @api
*/
class UniversalClassLoader
{
private $namespaces = array();
public function getNamespaces()
{
return $this->namespaces;
}
public function registerNamespace($namespace, $paths, $alias=array())
{
$this->namespaces[$namespace] = array('path'=>$paths,'alias'=>$alias);
}
public function register($prepend = false)
{
spl_autoload_register(array($this, 'loadClass'), true, $prepend);
}
public function loadClass($class)
{
if ($file = $this->findFile($class)) {
require $file;
}
}
public function findFile($class)
{
if ('\\' == $class[0]) {
$class = substr($class, 1);
}
if (false !== $pos = strrpos($class, '\\')) {
// namespaced class name
$namespace = substr($class, 0, $pos);
foreach ($this->namespaces as $ns => $dirs) {
$dir = $dirs['path'];
if (0 === strpos($namespace, $ns)) {
$className = substr($class, $pos + 1);
if (!empty($dirs['alias'])) {
$namespace = str_replace(
$dirs['alias'][0],
$dirs['alias'][1],
$namespace
);
}
$file = $dir. DIRECTORY_SEPARATOR .
str_replace('\\', DIRECTORY_SEPARATOR, $namespace).
DIRECTORY_SEPARATOR.$className.'.php';
echo "FILE: $file\n";
if (file_exists($file)) {
return $file;
}
}
}
}
}
}
lib-develop/src/siu/sq/lib/entorno/catalogo.php 0000664 0000000 0000000 00000000262 14430530062 0022023 0 ustar 00root root 0000000 0000000 entorno = $entorno;
}
}
lib-develop/src/siu/sq/lib/entorno/configurador.php 0000664 0000000 0000000 00000002675 14430530062 0022726 0 ustar 00root root 0000000 0000000 get_config_dir();
$ini_file = $config_dir."/sq.ini";
if (!is_file($ini_file)) {
die("El archivo 'sq.ini' no esta definido.");
}
$this->sq_ini = parse_ini_file($ini_file, true);
$this->bases_ini = parse_ini_file($config_dir."/bases.ini", true);
$dir = $this->get_dir();
// require_once($dir.'/../../../../../autoload.php');
// require_once($dir.'/UniversalClassLoader.php');
// $this->class_loader = new \lib\entorno\UniversalClassLoader();
// $this->class_loader->registerNamespace('lib',$dir.'/../../src');
}
// function class_loader()
// {
// return $this->class_loader;
// }
//-------------------------------------------------
public function get_dir()
{
return dirname(__FILE__);
}
public function get_logs_dir()
{
return $this->get_config_dir() . '/../logs';
}
public function get_config_dir()
{
if (isset($_SERVER['TOBA_INSTALACION_DIR'])) {
return $_SERVER['TOBA_INSTALACION_DIR'];
} else {
return $this->get_dir() . "/../../../../../../../../config";
}
}
//-------------------------------------------------
}
lib-develop/src/siu/sq/lib/entorno/entorno.php 0000664 0000000 0000000 00000003210 14430530062 0021712 0 ustar 00root root 0000000 0000000 log)) {
throw new error('Monolog no configurado');
}
return $this->log;
}
public function set_log($log)
{
$this->log = $log;
}
/**
*
* @return \Phinx\Console\PhinxApplication
*/
public function phinx()
{
if (!isset($this->phinx)) {
throw new error('Phinx no configurado');
}
return $this->phinx;
}
public function set_phinx($phinx)
{
$this->phinx = $phinx;
}
/**
*
* @return SIU\SQ\Lib\db\db_pdo
*/
public function db()
{
if (!isset($this->db)) {
throw new error('DB no configurada');
}
return $this->db;
}
public function set_db($db)
{
$this->db = $db;
}
//--------------------------------------
//---------- PERFIL DE DATOS -----------
//--------------------------------------
public function tiene_perfil_de_datos()
{
return $this->perfil_de_datos ? true : false;
}
public function perfil_de_datos()
{
if (!isset($this->perfil_de_datos)) {
throw new error('Perfil de datos no configurado');
}
return $this->perfil_de_datos;
}
public function set_perfil_de_datos($perfil_de_datos)
{
$this->perfil_de_datos = $perfil_de_datos;
}
}
lib-develop/src/siu/sq/lib/errores/ 0000775 0000000 0000000 00000000000 14430530062 0017516 5 ustar 00root root 0000000 0000000 lib-develop/src/siu/sq/lib/errores/error.php 0000664 0000000 0000000 00000000563 14430530062 0021364 0 ustar 00root root 0000000 0000000 params;
}
public function get_mensaje()
{
return $this->getMessage();
}
public function add_param($key, $value)
{
$this->params[$key] = $value;
}
}
lib-develop/src/siu/sq/lib/errores/error_db.php 0000664 0000000 0000000 00000000425 14430530062 0022026 0 ustar 00root root 0000000 0000000 sqlstate = $sqlstate;
}
public function get_sqlstate()
{
return $this->sqlstate;
}
}
lib-develop/src/siu/sq/lib/errores/error_negocio.php 0000664 0000000 0000000 00000000113 14430530062 0023056 0 ustar 00root root 0000000 0000000 sq_ini['mailer']['SMTP_HOST'];
$smtp_auth = $config->sq_ini['mailer']['SMTP_AUTENTICAR'];
$username = $config->sq_ini['mailer']['SMTP_USUARIO'];
$password = $config->sq_ini['mailer']['SMTP_CLAVE'];
$SMTPSecure = $config->sq_ini['mailer']['SMTP_PROTOCOLO_SEGURIDAD'];
$port = $config->sq_ini['mailer']['SMTP_PUERTO'];
$es_desarrollo = $config->sq_ini['mailer']['ES_DESARROLLO'];
$envia_emails = $config->sq_ini['mailer']['ENVIA_EMAILS'];
$email_envios_desarrollo = $config->sq_ini['mailer']['EMAIL_ENVIOS_DESARROLLO'];
$mailer = new util\mailer($host, $smtp_auth, $username, $password, $SMTPSecure, $port, $es_desarrollo, $envia_emails, $email_envios_desarrollo);
if (isset($config->sq_ini['mailer']['SMTP_AUTO_TLS'])) {
switch ($config->sq_ini['mailer']['SMTP_AUTO_TLS']) {
case '0':
$mailer->set_smtp_auto_tls(false);
break;
case '1':
$mailer->set_smtp_auto_tls(true);
break;
}
}
return $mailer;
}
public static function rest_hooks()
{
return \SIU\SQ\RestHooks\rest_hooks::getRestMessenger();
}
public static function es_modo_mantenimiento()
{
$config = new configurador();
$dir = $config->get_config_dir();
$proyecto = parse_ini_file($dir . "/../toba/proyecto.ini", true);
return $proyecto['proyecto']['modo_mantenimiento'];
}
/**
* Retorna una instancia de un generador de pdf que toma la data de un json
* @return \SIU\SQ\Lib\util\toba_vista_jasperreports_json
*/
public static function toba_vista_jasperreports_json($nombre = "comprobante_")
{
return new util\toba_vista_jasperreports_json($nombre);
}
/**
* Retorna el nombre del esquema si existe y false si no existe
* @return mixed
*/
public static function existe_esquema_auditoria($modulo)
{
$esquema = self::get_esquema_auditoria($modulo);
$sql = "SELECT schema_name FROM information_schema.schemata WHERE schema_name = '" . $esquema . "'";
return (!empty(self::entorno()->db()->consultar($sql))) ? $esquema : false;
}
/**
* Retorna el nombre del esquema si existe y die si no existe
* @return string
*/
public static function get_esquema_auditoria($modulo)
{
$config = new configurador();
if (isset($config->sq_ini[$modulo])) {
$parametros_db = $config->sq_ini[$modulo]['db'];
$def_base = $config->bases_ini[$parametros_db];
return $def_base['schema'] . "_auditoria";
} else {
die("El módulo '" . $modulo . "' no existe en la definición de sq.ini.");
}
}
}
lib-develop/src/siu/sq/lib/modelo/ 0000775 0000000 0000000 00000000000 14430530062 0017314 5 ustar 00root root 0000000 0000000 lib-develop/src/siu/sq/lib/modelo/catalogo.php 0000664 0000000 0000000 00000005760 14430530062 0021626 0 ustar 00root root 0000000 0000000 entorno);
}
public function notificacion($id = null, $dao_notificaciones = null)
{
return new notificacion($this->entorno, $id, $dao_notificaciones);
}
public function parametro_sistema($id = null)
{
return new parametro_sistema($this->entorno, $id);
}
public function facturador($id_tipo_servicio = null)
{
// Según si el tipo de servicio devenga o no definir que facturador tomar
$datos_tipo_servicio = lib::catalogo_daos()->facturador()->get_tipos_servicios(['id' => $id_tipo_servicio]);
if (empty($datos_tipo_servicio)) {
$msg = "Error al facturar. El tipo de servicio con el id: '" . $id_tipo_servicio . "' no es válido.";
lib::entorno()->log()->error(__METHOD__ . ": " . $msg);
throw new error_negocio($msg);
}
switch ($id_tipo_servicio) {
case constantes::ID_TIPO_SERVICIO_EXTENSION:
lib::entorno()->log()->info("Facturador TS Extension");
return new facturador_cursos_extension($this->entorno);
break;
case constantes::ID_TIPO_SERVICIO_POSGRADO:
lib::entorno()->log()->info("Facturador TS Posgrado");
return new facturador_posgrados($this->entorno);
break;
case constantes::ID_TIPO_SERVICIO_GRADO:
lib::entorno()->log()->info("Facturador TS Grado Virtual");
return new facturador_grado_virtual($this->entorno);
break;
default:
throw new error_negocio("Facturador: No se pudo determinar el tipo de servicio para el facturador.");
}
}
public function facturador_alarma($id = null)
{
return new facturador_alarma($this->entorno, $id);
}
public function reloj($id_reloj = null, $id_periodo_fact_excepciones = null)
{
return new reloj($this->entorno, $id_reloj, $id_periodo_fact_excepciones);
}
public function reloj_instancia($id_servicio_instancia)
{
return new reloj_instancia($this->entorno, $id_servicio_instancia);
}
public function comprobante($id = null)
{
return new comprobante($this->entorno, $id);
}
public function comprobante_template($id = null)
{
return new comprobante_template($this->entorno, $id);
}
public function procesos_ejecuciones($id = null)
{
return new procesos_ejecuciones($this->entorno, $id);
}
public function venta_info_personalizada($id_venta = null)
{
return new venta_info_personalizada($this->entorno, $id_venta);
}
public function log_interaccion_externa($id = null)
{
return new log_interaccion_externa($this->entorno, $id);
}
}
lib-develop/src/siu/sq/lib/modelo/comprobante.php 0000664 0000000 0000000 00000020624 14430530062 0022342 0 ustar 00root root 0000000 0000000 datos['id'] = null;
$this->datos['id_comprobante_template'] = null;
$this->datos['numero_comprobante'] = null;
$this->datos['presentacion'] = null;
$this->datos['importe_control'] = null;
$this->datos['id_comprobante_relacionado'] = null;
$this->datos['id_rdi'] = null;
$this->datos['uuid_arai_documentos'] = null;
$this->datos['id_punto_cobranza'] = null;
$this->datos['estado'] = constantes::COMPROBANTE_ESTADO_PENDIENTE;
$this->datos['estado_actualizado_en'] = "now()";
}
protected function cargar($id_comprobante)
{
$comprobante = lib::catalogo_daos()->comprobantes()->get($id_comprobante);
if (!empty($comprobante)) {
$this->datos = $comprobante;
$this->datos['presentacion'] = utf8_e_seguro($this->datos['presentacion']);
} else {
throw new error_not_found("Comprobante: El comprobante que intenta cargar no existe.");
}
}
protected function validar()
{
$campos_obligatorios = array(
'id_comprobante_template',
'estado'
);
$this->validar_campos_obligatorios($this->datos, $campos_obligatorios, __CLASS__);
// validar número de comprobante único
if (!is_null($this->datos['numero_comprobante']) && $this->datos['numero_comprobante'] != '') {
$filtro = [
'numero_comprobante' => $this->get_numero_comprobante()
];
// Si existe UV, lo agrego como condicion para aceptar un mismo número de comprobante para distintas UVs
if ($this->datos['id_punto_cobranza']) {
$filtro['id_punto_cobranza'] = $this->datos['id_punto_cobranza'];
}
if ($this->datos['id_comprobante_template']) {
$filtro['id_comprobante_template'] = $this->datos['id_comprobante_template'];
}
$comprobantes = lib::catalogo_daos()->comprobantes()->get_lista($filtro);
foreach ($comprobantes as $comprobante) {
if ($comprobante['id'] != $this->datos['id']) {
throw new error_negocio("Comprobante: El número de comprobante " . $this->get_numero_comprobante() . " ya existe.");
}
}
}
}
public function guardar()
{
$this->validar();
$this->entorno()->db()->set_encoding('utf8');
if ($this->datos['id'] !== null) {
$this->actualizar_comprobante();
} else {
$this->grabar_comprobante();
}
$this->entorno()->db()->set_encoding('latin1');
return $this->datos['id'];
}
public function cambiar_estado($estado)
{
$this->validar_cambio_de_estado($estado);
$this->set_estado($estado);
}
protected function validar_cambio_de_estado($estado)
{
switch ($estado) {
case constantes::COMPROBANTE_ESTADO_PENDIENTE:
case constantes::COMPROBANTE_ESTADO_FINALIZADO:
if ($this->get_estado() == constantes::COMPROBANTE_ESTADO_ANULADO) {
throw new error_negocio("Comprobante: No puede cambiar el estado del comprobanda a Generado ya que este se encuentra anulado.");
}
break;
case constantes::COMPROBANTE_ESTADO_ANULADO:
break;
default:
throw new error_negocio("Comprobante: El estado que intenta guardar no es valido.");
break;
}
}
//---- MÉTODOS DE GRABACIÓN ----//
protected function grabar_comprobante()
{
$datos = array(
'id_comprobante_template' => $this->datos['id_comprobante_template'],
'numero_comprobante' => $this->datos['numero_comprobante'],
'presentacion' => json_encode(array_a_utf8($this->datos['presentacion']), JSON_UNESCAPED_UNICODE),
'importe_control' => $this->datos['importe_control'],
'id_comprobante_relacionado' => $this->datos['id_comprobante_relacionado'],
'id_rdi' => $this->datos['id_rdi'],
'uuid_arai_documentos' => $this->datos['uuid_arai_documentos'],
'id_punto_cobranza' => $this->datos['id_punto_cobranza'],
'estado' => $this->datos['estado'],
'estado_actualizado_en' => $this->datos['estado_actualizado_en']
);
if (json_last_error() != JSON_ERROR_NONE) {
$msg = "Comprobante: Error la consumir el JSON del campo 'presentacion'";
lib::entorno()->log()->error(__METHOD__ . ": Error json (" . json_last_error() . ")" . $msg);
throw new error_negocio($msg);
}
$sql = sql::sql_array_a_insert('comprobantes', $datos, $this->entorno()->db());
$this->entorno()->db()->ejecutar($sql);
$seq = $this->entorno()->db()->consultar_fila("SELECT currval('comprobantes_id_seq') as seq;");
$this->datos['id'] = $seq['seq'];
}
protected function actualizar_comprobante()
{
$datos = array(
'numero_comprobante' => $this->datos['numero_comprobante'],
'presentacion' => json_encode(array_a_utf8($this->datos['presentacion']), JSON_UNESCAPED_UNICODE),
'uuid_arai_documentos' => $this->datos['uuid_arai_documentos'],
'estado' => $this->datos['estado'],
'estado_actualizado_en' => $this->datos['estado_actualizado_en']
);
$where = ['id' => $this->datos['id']];
$sql_update = sql::sql_array_a_update('comprobantes', $datos, $where, $this->entorno()->db());
$this->entorno()->db()->ejecutar($sql_update);
}
//---- GETTERS Y SETTERS ----//
public function get_id()
{
return $this->datos['id'];
}
public function get_id_comprobante_template()
{
return $this->datos['id_comprobante_template'];
}
public function get_numero_comprobante()
{
return $this->datos['numero_comprobante'];
}
public function get_presentacion()
{
return $this->datos['presentacion'];
}
public function get_importe_control()
{
return $this->datos['importe_control'];
}
public function get_id_comprobante_relacionado()
{
return $this->datos['id_comprobante_relacionado'];
}
public function get_id_rdi()
{
return $this->datos['id_rdi'];
}
public function get_uuid_arai_documentos()
{
return $this->datos['uuid_arai_documentos'];
}
public function get_id_punto_cobranza()
{
return $this->datos['id_punto_cobranza'];
}
public function get_estado()
{
return $this->datos['estado'];
}
public function get_estado_actualizado_en()
{
return $this->datos['estado_actualizado_en'];
}
public function set_id_comprobante_template($id_comprobante_template)
{
$this->datos['id_comprobante_template'] = $id_comprobante_template;
}
public function set_numero_comprobante($numero_comprobante)
{
$this->datos['numero_comprobante'] = $numero_comprobante;
}
public function set_presentacion($presentacion)
{
$this->datos['presentacion'] = $presentacion;
}
public function set_importe_control($importe_control)
{
$this->datos['importe_control'] = $importe_control;
}
public function set_id_comprobante_relacionado($id_comprobante_relacionado)
{
$this->datos['id_comprobante_relacionado'] = $id_comprobante_relacionado;
}
public function set_id_rdi($id_rdi)
{
$this->datos['id_rdi'] = $id_rdi;
}
public function set_uuid_arai_documentos($uuid_arai_documentos)
{
$this->datos['uuid_arai_documentos'] = $uuid_arai_documentos;
}
public function set_id_punto_cobranza($id_punto_cobranza)
{
$this->datos['id_punto_cobranza'] = $id_punto_cobranza;
}
public function set_estado($estado)
{
$this->datos['estado'] = $estado;
}
public function set_estado_actualizado_en($estado_actualizado_en)
{
$this->datos['estado_actualizado_en'] = $estado_actualizado_en;
}
}
lib-develop/src/siu/sq/lib/modelo/comprobante_template.php 0000664 0000000 0000000 00000007762 14430530062 0024245 0 ustar 00root root 0000000 0000000 datos['id'] = null;
$this->datos['codigo'] = null;
$this->datos['descripcion'] = null;
$this->datos['tipo_comprobante'] = null;
$this->datos['modelo'] = null;
$this->datos['numeracion'] = null;
$this->datos['estado'] = null;
$this->datos['estado_actualizado_en'] = null;
}
protected function cargar($id)
{
$this->datos = lib::catalogo_daos()->comprobantes()->get_template($id);
if (empty($this->datos)) {
throw new error_not_found(__METHOD__ . " No se pudo recuperar el comprobante_template ID $id");
}
}
protected function validar()
{
$campos_obligatorios = ['codigo','descripcion','tipo_comprobante','modelo'];
$this->validar_campos_obligatorios($this->datos, $campos_obligatorios, __METHOD__);
}
public function guardar()
{
$this->validar();
if (empty(lib::catalogo_daos()->comprobantes()->get_template($this->get_id()))) {
$this->grabar();
} else {
$this->actualizar();
}
return $this->get_id();
}
private function grabar()
{
$datos = [
'id' => $this->get_id(),
'codigo' => $this->datos['codigo'],
'descripcion' => $this->datos['descripcion'],
'tipo_comprobante' => $this->datos['tipo_comprobante'],
'modelo' => $this->datos['modelo'],
'numeracion' => $this->datos['numeracion'],
'estado' => $this->datos['estado'],
'estado_actualizado_en' => $this->datos['estado_actualizado_en']
];
$sql = sql::sql_array_a_insert('comprobantes_templates', $datos, $this->entorno()->db());
$this->entorno()->db()->ejecutar($sql);
}
private function actualizar()
{
$datos = [
'codigo' => $this->datos['codigo'],
'descripcion' => $this->datos['descripcion'],
'tipo_comprobante' => $this->datos['tipo_comprobante'],
'modelo' => $this->datos['modelo'],
'numeracion' => $this->datos['numeracion'],
'estado' => $this->datos['estado'],
'estado_actualizado_en' => $this->datos['estado_actualizado_en']
];
$where = ['id' => $this->get_id()];
$sql = sql::sql_array_a_update('comprobantes_templates', $datos, $where, $this->entorno()->db());
$this->entorno()->db()->ejecutar($sql);
}
public function avanzar_numeracion()
{
if (empty($this->datos['numeracion'])) {
$this->datos['numeracion'] = 1;
} else {
$this->datos['numeracion'] = $this->datos['numeracion'] + 1;
}
}
//--SETTERS
public function set_id($id)
{
$this->datos['id'] = $id;
}
public function set_codigo($codigo)
{
$this->datos['codigo'] = $codigo;
}
public function set_descripcion($descripcion)
{
$this->datos['descripcion'] = $descripcion;
}
public function set_tipo_comprobante($tipo_comprobante)
{
$this->datos['tipo_comprobante'] = $tipo_comprobante;
}
public function set_modelo($modelo)
{
$this->datos['modelo'] = $modelo;
}
public function set_numeracion($numeracion)
{
$this->datos['numeracion'] = $numeracion;
}
public function set_estado($estado)
{
if (is_null($this->datos['estado']) || $this->datos['estado'] != $estado) {
$this->datos['estado_actualizado_en'] = 'now()';
}
$this->datos['estado'] = $estado;
}
//--GETTERS
public function get_numeracion()
{
return $this->datos['numeracion'];
}
}
lib-develop/src/siu/sq/lib/modelo/facturador.php 0000664 0000000 0000000 00000214027 14430530062 0022165 0 ustar 00root root 0000000 0000000 reloj_facturador = lib::catalogo_modelo()->reloj();
$this->id_reloj = $this->reloj_facturador->get_actual();
$this->cantidad_ventas_pre_generadas = 0;
$this->importe_ventas_pre_generadas = 0;
$this->cantidad_ventas_generadas = 0;
$this->importe_ventas_generadas = 0;
$this->cantidad_ventas_cobradas = 0;
$this->importe_ventas_cobradas = 0;
$this->id_facturacion = null;
$this->ids_facturador_alarmas = [];
//Nota: cuando se crea una venta, el campo ventas.cobranza_vence_en se setea con la fecha
// del proceso + el valor del parametros_sistema("DIAS_1er_V"). VER SI ES FERIADO????
//
// SI el parametro '"APLIC_MORA"' esta en 'S'
// $this->calculadora_de_mora = new calculadora_de_mora();
}
protected function validar()
{
if (empty($this->ids_servicios_instancias)) {
throw new error_negocio("No se especificaron servicios para facturar.");
}
}
public function guardar()
{
throw new error_negocio("FACTURADOR: Utilizar el metodo 'Generar' o 'Confirmar' para completar una acción de facturación.");
}
public function set_proceso($proceso)
{
$this->proceso = $proceso;
}
public function get_id_reloj()
{
return $this->id_reloj;
}
public function get_cantidad_ventas_pre_generadas()
{
return $this->cantidad_ventas_pre_generadas;
}
public function get_importe_ventas_pre_generadas()
{
return $this->importe_ventas_pre_generadas;
}
public function get_cantidad_ventas_generadas()
{
return $this->cantidad_ventas_generadas;
}
public function get_ventas_generadas()
{
return $this->ventas_generadas;
}
public function get_importe_ventas_generadas()
{
return $this->importe_ventas_generadas;
}
public function get_cantidad_ventas_cobradas()
{
return $this->cantidad_ventas_cobradas;
}
public function get_importe_ventas_cobradas()
{
return $this->importe_ventas_cobradas;
}
public function set_dia_primer_vencimiento($id_reloj_1er_vencimiento, $dia_1er_vencimiento)
{
$this->dias_vencimiento['dia_1er_vencimiento'] = $dia_1er_vencimiento;
$this->dias_vencimiento['id_reloj_1er_vencimiento'] = $id_reloj_1er_vencimiento;
}
public function set_dia_segundo_vencimiento($id_reloj_2do_vencimiento, $dia_2do_vencimiento)
{
$this->dias_vencimiento['dia_2do_vencimiento'] = $dia_2do_vencimiento;
$this->dias_vencimiento['id_reloj_2do_vencimiento'] = $id_reloj_2do_vencimiento;
}
public function set_instancias_a_facturar($ids_servicios_instancias)
{
$this->ids_servicios_instancias = $ids_servicios_instancias;
}
// Obsoleto, Borrar??????
public function set_id_facturacion($id_facturacion)
{
$this->id_facturacion = $id_facturacion;
}
public function get_id_facturacion()
{
return $this->id_facturacion;
}
public function set_ids_facturador_alarmas(array $ids_facturador_alarmas)
{
$this->ids_facturador_alarmas = $ids_facturador_alarmas;
}
// Utilidades
public function contar_ventas_pregeneradas()
{
// Obtener las ventas en estado VENTA_ESTADO_PRE_FACT
$filtro['id_venta_estado'] = constantes::VENTA_ESTADO_PRE_FACT;
$filtro['id_periodo_facturacion'] = $this->id_reloj;
$filtro['id_tipo_servicio'] = $this->id_tipo_servicio;
$ventas_prefacturadas = sq_uv::catalogo_daos()->ventas()->get_ventas($filtro);
$ids_ventas_agrupadas_en_sumarizada = array_column(sq_uv::catalogo_daos()->ventas()->get_ventas_sumarizadas(), 'id_venta_sumarizada');
$ids_ventas_tipo_confinanciada = array_column(sq_uv::catalogo_daos()->ventas()->get_ventas_cofinanciadas(), 'id');
foreach ($ventas_prefacturadas as $venta_prefact) {
// Verificar si la venta no es parte de una sumarizada
if (!in_array($venta_prefact['id'], array_merge($ids_ventas_agrupadas_en_sumarizada, $ids_ventas_tipo_confinanciada))) {
$this->cantidad_ventas_pre_generadas++;
$this->importe_ventas_pre_generadas += $venta_prefact['importe_total'];
}
}
}
//-----------------------------------------------------------
// GENERACION
//-----------------------------------------------------------
protected function generar_cabecera_facturacion()
{
if (!isset($this->dias_vencimiento['dia_1er_vencimiento']) and !isset($this->dias_vencimiento['id_reloj_1er_vencimiento'])) {
throw new error_negocio("No se definieron las fechas de vencimiento para el facturador.");
}
if (lib::parametros_sistema()->get_valor(constantes::PARAMETROS_SISTEMA_CANTIDAD_VENCIMIENTOS, $this->id_tipo_servicio) == constantes::SEGUNDO_VENCIMIENTO) {
if (!isset($this->dias_vencimiento['dia_2do_vencimiento']) and !isset($this->dias_vencimiento['id_reloj_2do_vencimiento'])) {
throw new error_negocio("No se definieron las fechas de vencimiento para el facturador.");
}
$datos['id_reloj_facturador_2do_venc'] = $this->dias_vencimiento['id_reloj_2do_vencimiento'];
$datos['dia_2do_vencimiento'] = $this->dias_vencimiento['dia_2do_vencimiento'];
}
$datos['id_ejecucion_proceso'] = $this->proceso->get_id_ejecucion();
$datos['id_reloj_facturador_1er_venc'] = $this->dias_vencimiento['id_reloj_1er_vencimiento'];
$datos['dia_1er_vencimiento'] = $this->dias_vencimiento['dia_1er_vencimiento'];
$datos['id_reloj_facturador'] = lib::catalogo_modelo()->reloj()->get_actual();
$sql = sql::sql_array_a_insert("facturaciones", $datos, $this->entorno()->db());
$this->entorno()->db()->ejecutar($sql);
// Obtener el id de facturación
$this->id_facturacion = $this->entorno()->db()->ultimo_insert_id("facturaciones_id_seq");
}
protected function guardar_instancias_a_facturar()
{
$sql = null;
foreach ($this->ids_servicios_instancias as $instancia) {
$datos['id_servicio_instancia'] = $instancia;
$datos['id_facturacion'] = $this->id_facturacion;
$datos['estado'] = constantes::FACTURADOR_SERVICIO_INSTANCIA_ESTADO_INICIADO;
$sql .= sql::sql_array_a_insert("facturaciones_servicios_instancias", $datos, $this->entorno()->db());
}
if ($sql) {
$this->entorno()->db()->ejecutar($sql);
} else {
throw new error_negocio("FACTURADOR: No se encontraron servicios instancias para procesar.");
}
}
protected function guardar_facturaciones_alarmas_configuradas()
{
$sql = null;
foreach ($this->ids_facturador_alarmas as $id) {
$datos['id_facturador_alarma'] = $id;
$datos['id_facturacion'] = $this->id_facturacion;
$sql .= sql::sql_array_a_insert("facturaciones_alarmas_configuradas", $datos, $this->entorno()->db());
}
if ($sql) {
$this->entorno()->db()->ejecutar($sql);
}
}
protected function programar_cuotas_continuas()
{
/*
* Iterar suscripciones ACTIVAS
* SI $this->id_periodo_facturacion actual no foma parte de una excepcion de la instancia
* SI el programa de venta seleccionado por el cliente, tiene un articulo con frecuencia SIEMPRE,
* crear registo en "Servicios prestaciones pre programadas"
* - con id_periodo_factuacion = $this->id_periodo_facturacion
* - marcar como creado_por_facturador en TRUE
*/
//-- Obtener las suscripciones ACTIVAS, FUERA PERIODO EXCEPCION, FRECUENCIA SIEMPRE,
$filtro['ids_servicios_instancias'] = $this->ids_servicios_instancias;
$suscripciones = sq_uv::catalogo_daos()->servicios()->get_suscripciones_cuotas_continuas($filtro);
foreach ($suscripciones as $suscripcion) {
$suscripcion_obj = sq_uv::catalogo_modelo()->suscripcion($suscripcion['id']);
$suscripcion_obj->set_creado_por_facturador(true);
$filtroProgramacionVenta['id_programa_ventas']= $suscripcion['id_servicio_instancia_prog_venta'];
$filtroProgramacionVenta['id_frecuencia_facturacion']= constantes::FRECUENCIA_FACTURACION_SIEMPRE;
$prog_venta = sq_uv::catalogo_modelo()->programacion_venta()->get_detalle($filtroProgramacionVenta);
if (isset($prog_venta['detalle']) and count($prog_venta['detalle']) == 1) {
$suscripcion_obj->crear_pre_programacion_venta_continua($this->id_reloj, $prog_venta['detalle'][0]);
} else {
// No debería traer mas de uno, sino definir procedimiento.
throw new error_negocio("FACTURADOR: Se ha encontrado mas de un articulo para el programa de venta.");
}
}
$this->proceso->agregar_notificacion("Cantidad de pre-programaciones de cuotas continuas generadas:" . count($suscripciones), 'info');
}
/**
* Actualiza los vencimientos de ventas pendientes a medida que va avanzando el reloj de facturacion
*
* @return void
*/
protected function procesar_ventas_pendientes()
{
$filtro['id_venta_estado'] = constantes::VENTA_PENDIENTE;
$filtro['ids_servicios_instancias'] = $this->ids_servicios_instancias;
$ventas_pendientes = sq_uv::catalogo_daos()->ventas()->get_ventas($filtro, null, 'ORDER BY v.id', 'id_venta_origen');
if (!empty($ventas_pendientes)) {
foreach ($ventas_pendientes as $venta) {
$venta_origen = sq_uv::catalogo_modelo()->modelador_venta()->cargar($venta['id']);
$venta_origen->set_primer_vencimiento($this->dias_vencimiento['id_reloj_1er_vencimiento'], $this->dias_vencimiento['dia_1er_vencimiento']);
if (lib::parametros_sistema()->get_valor(constantes::PARAMETROS_SISTEMA_CANTIDAD_VENCIMIENTOS, $this->id_tipo_servicio) == constantes::SEGUNDO_VENCIMIENTO) {
$venta_origen->set_segundo_vencimiento($this->dias_vencimiento['id_reloj_2do_vencimiento'], $this->dias_vencimiento['dia_2do_vencimiento']);
}
//-- marcar id_periodo_factuacion = $this->id_periodo_facturacion
$venta_origen->set_id_periodo_facturacion($this->id_reloj);
$venta_origen->grabar_venta_vencimientos();
$venta_origen->guardar();
}
}
}
protected function procesar_ventas_vencidas()
{
/**
* Iterar todas las ventas en estado VENCIDAS
* - generar una nueva venta clonada de la anterior (copiar articulos y convenios)
* - en la nueva venta:
* - marcar el campo id_venta_origen con una referencia a la vencida.
* - determina la nueva fecha de vencimiento en base a la fecha del proceso y se valor sumarle el valor del parametro "DIAS_1er_V"
* - marcar id_periodo_factuacion = $this->id_periodo_facturacion
* - Crear un comprobante con dos filas: Importe Adeudado=$$ y Mora=$$
* - estado_venta: PREFACTURACION
* - Si param_sistema('APLIC_MORA') ]= 'S
* - Calculo de MORA (Segun configuracion):
* - "CONSERVAR_MAPEO_ARTICULOS".
* Iterar articulos:
* - crear un articulo de tipo MORA por cada uno.
* - calcular el $ segun el porcentaje establecido para la de mora.
* - Al articulo MORA ponerle en el campo id_articulo_copia_mapeo_presupuestario el articulo original
* - "MAPEO_MORA"
* - crear un unico articulo MORA calculando el $ en base al porcentaje
* Fin Si
* - pasar la venta original al estado ANULADA
*/
//-- Iterar todas las ventas en estado VENCIDAS de las INSTANCIAS seleccionadas
$filtro['id_venta_estado'] = constantes::VENTA_VENCIDA;
$filtro['ids_servicios_instancias'] = $this->ids_servicios_instancias;
$ventas_vencidas = sq_uv::catalogo_daos()->ventas()->get_ventas_por_servicio_instancia($filtro);
//$filtro=[];
//$filtro['id_venta_estado'] = constantes::VENTA_VENCIDA;
$filtro['estado_servicio_instancia'] = constantes::SERVICIOS_INSTANCIAS_ESTADO_INACTIVO;
$filtro['estado_servicio_suscripcion'] = constantes::SERVICIOS_SUSCRIPCIONES_ESTADO_ACTIVO;
$ventas_vencidas_intancia_inactiva = sq_uv::catalogo_daos()->ventas()->get_ventas_por_servicio_de_servicio_instancia($filtro);
$ventas_vencidas = array_merge($ventas_vencidas, $ventas_vencidas_intancia_inactiva);
if (!empty($ventas_vencidas)) {
$ventas_vencidas = $this->filtrar_ventas_que_ya_fueron_revividas_n_veces($ventas_vencidas);
}
$this->proceso->agregar_notificacion("Cantidad de ventas vencidas a procesar:" . count($ventas_vencidas), 'info');
foreach ($ventas_vencidas as $venta_vencida) {
//-- generar una nueva venta clonada de la anterior (copiar articulos y convenios)
$venta_clonada = sq_uv::catalogo_modelo()->modelador_venta()->clonar($venta_vencida['id']);
//-- marcar el campo id_venta_origen con una referencia a la vencida.
$venta_clonada->set_id_venta_origen($venta_vencida['id']);
$id_tipo_vencimiento = sq_uv::catalogo_daos()->ventas()->get_tipo_vencimiento($venta_vencida['id']);
if (isset($id_tipo_vencimiento)){
$venta_clonada->set_id_tipo_vencimiento($id_tipo_vencimiento);
}
$venta_clonada->set_primer_vencimiento($this->dias_vencimiento['id_reloj_1er_vencimiento'], $this->dias_vencimiento['dia_1er_vencimiento']);
if (lib::parametros_sistema()->get_valor(constantes::PARAMETROS_SISTEMA_CANTIDAD_VENCIMIENTOS, $this->id_tipo_servicio) == constantes::SEGUNDO_VENCIMIENTO) {
$venta_clonada->set_segundo_vencimiento($this->dias_vencimiento['id_reloj_2do_vencimiento'], $this->dias_vencimiento['dia_2do_vencimiento']);
}
//-- marcar id_periodo_factuacion = $this->id_periodo_facturacion
$venta_clonada->set_id_periodo_facturacion($this->id_reloj);
//TODO: -- Crear un comprobante con dos filas: Importe Adeudado=$$ y Mora=$$
//TODO: -- Si param_sistema('APLIC_MORA') ]= 'S
// Iniciar la venta a agrupar en TRUE
$venta_clonada->set_a_agrupar(true);
//-- estado_venta: PREFACTURACION
$venta_clonada->cambiar_estado(constantes::VENTA_ESTADO_PRE_FACT, true);
//Obtengo la suscripcion para setear el id_medio_pago de la suscripcion en la venta clonada
$suscripcion = sq_uv::catalogo_daos()->servicios()->obtener_servicios_suscripciones(['id_venta' => $venta_vencida['id']]);
if (empty($suscripcion)) {
throw new error_negocio("FACTURADOR: No se pudo obtener el servicio suscripcion asociado a la venta vencida: '" . $venta_vencida['id'] . "'");
} elseif (count($suscripcion) > 1) {
throw new error_negocio("FACTURADOR: Se obtuvo mas de una suscripcion asociada a la venta vencida: '" . $venta_vencida['id'] . "'");
}
$venta_clonada->set_medio_pago($suscripcion[0]['medio_pago']['id']);
// En ventas vencidas sumarizadas, actualiza el importe total y agrega articulos de vencimientos en el caso que corresponda
$venta_origen = sq_uv::catalogo_modelo()->modelador_venta()->cargar($venta_vencida['id']);
$venta_origen_vencimientos = $venta_origen->get_vencimientos();
if (isset($venta_origen_vencimientos['vencimiento']['segundo']['importe'])) {
// Setea el importe del segundo vencimiento al importe total de la venta
$venta_clonada->set_importe_total($venta_origen_vencimientos['vencimiento']['segundo']['importe']);
// Si la venta vencida es agrupada y sumarizada
if ($venta_vencida['a_agrupar'] == true) {
// Agregar articulo que representa el interes por segundo vencimiento de la venta vencida
$importe_unitario = $venta_origen_vencimientos['vencimiento']['segundo']['importe'] - $venta_origen_vencimientos['vencimiento']['primero']['importe'];
if ($importe_unitario > 0) {
$venta_clonada->agregar_articulo_para_venc_y_mora(constantes::ARTICULO_REC_NO_PP, $importe_unitario);
}
}
}
// Guardar la nueva venta
$venta_clonada->guardar();
//-- Reasignar el id de la nueva venta a la prestacion pre-programada que estaba asociada la venta origen
$prestacion_preprog_datos = sq_uv::catalogo_daos()->servicios()->get_prestaciones_programadas(['id_venta' => $venta_vencida['id']]);
if (empty($prestacion_preprog_datos)) {
throw new error_negocio("FACTURADOR: No se pudo obtener la prestacion pre-programada asociada a la venta vencida: '" . $venta_vencida['id'] . "'");
} else {
if (count($prestacion_preprog_datos) > 1) {
throw new error_negocio("FACTURADOR: Se obtuvo mas de una prestacion pre-programada asociada a la venta vencida: '" . $venta_vencida['id'] . "'");
}
}
// Generar cambios para una reversion de facturación
$this->registrar_punto_reversion($prestacion_preprog_datos[0]['id'], $venta_vencida['id'], constantes::VENTA_VENCIDA);
$prestacion_preprogramada = sq_uv::catalogo_modelo()->prestacion_preprogramada($prestacion_preprog_datos[0]['id']);
$prestacion_preprogramada->set_id_venta($venta_clonada->get_id());
$prestacion_preprogramada->guardar();
//-- pasar la venta original al estado ANULADA
$this->anular_venta($venta_vencida['id']);
}
}
private function anular_venta($id)
{
$venta_origen = sq_uv::catalogo_modelo()->modelador_venta()->cargar($id);
$venta_origen->cambiar_estado(constantes::VENTA_ESTADO_ANULADA, true);
$venta_origen->guardar();
}
/**
* Saca del array que recibe las ventas que ya no debe revivir y las anula
* @param array $ventas_vencidas
* @return array $ventas_vencidas que si deben ser revividas
*/
private function filtrar_ventas_que_ya_fueron_revividas_n_veces(array $ventas_vencidas)
{
$ids_ventas_vencidas = array_column($ventas_vencidas, 'id');
$ids_resultado = [];
$resultado = [];
$max_nro_ciclos_suscripcion_activa = (int)lib::parametros_sistema()->get_valor(constantes::PARAMETROS_SISTEMA_CANTIDAD_CICLOS_REVIVIR_VENTAS_SUSCRIPCION_ACTIVA, $this->id_tipo_servicio);
$max_nro_ciclos_suscripcion_inactiva = (int)lib::parametros_sistema()->get_valor(constantes::PARAMETROS_SISTEMA_CANTIDAD_CICLOS_REVIVIR_VENTAS_SUSCRIPCION_INACTIVA, $this->id_tipo_servicio);
$dao_ventas = sq_uv::catalogo_daos()->ventas();
// Recupero los estados de las suscripciones
$filtro = ['id_venta' => $ids_ventas_vencidas];
$prestaciones = sq_uv::catalogo_daos()->servicios()->get_prestaciones_programadas($filtro);
foreach ($prestaciones as $p) {
switch ($p['estado']) {//estado, es el estado de la suscripcion
case constantes::SERVICIOS_SUSCRIPCIONES_ESTADO_ACTIVO:
if ($dao_ventas->get_nro_ciclos_facturador($p['id_venta']) < $max_nro_ciclos_suscripcion_activa) {
$ids_resultado[] = $p['id_venta'];
} else {
//anulo las ventas que ya no se deben revivir
$this->anular_venta($p['id_venta']);
}
break;
case constantes::SERVICIOS_SUSCRIPCIONES_ESTADO_INACTIVO:
if ($dao_ventas->get_nro_ciclos_facturador($p['id_venta']) < $max_nro_ciclos_suscripcion_inactiva) {
$ids_resultado[] = $p['id_venta'];
} else {
//anulo las ventas que ya no se deben revivir
$this->anular_venta($p['id_venta']);
}
break;
}
}
foreach ($ids_resultado as $id) {
foreach ($ventas_vencidas as $vv) {
if ($id === $vv['id']) {
$resultado[] = $vv;
}
}
}
return $resultado;
}
protected function generar_ventas_por_suscripciones()
{
/* Consultar suscripciones activas, trayendo data del servicio y del servicio_instancia
* Iterar suscripciones ACTIVAS
* 1) Iterar prestaciones PREPROGRAMADAS con id_venta == NULL & id_periodo_facturacion = ACTUAL
* - Invocar la factory de ventas con los parametros:
* - a_agrupar = true,
* - id_periodo_facturacion = $this->id_periodo_facturacion
* - estado_venta: PREFACTURACION
* - Crear articulos programados (registrar en ventas_articulos) y poner en cada fila el ID del servicio que lo genero
* - Guardar venta y dejar el ID generado en el registro de la prestacion PREPROGRAMADA que lo genero
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
TODO:!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
* 2) Iterar prestaciones por EVENTO con id_venta == NULL & id_periodo_facturacion = ACTUAL
* - Invocar la factory de ventas con los parametros:
* - a_agrupar = true,
* - id_periodo_facturacion = $this->id_periodo_facturacion
* - estado_venta: PREFACTURACION
* - Crear articulos programados (registrar en ventas_articulos) y poner en la fila el ID del servicio que lo genero
* - Guardar venta y dejar el ID generado en la prestacion por EVENTO que lo genero
**/
//-- Iterar suscripciones ACTIVAS
$filtro['estado'] = constantes::SUSCRIPCION_ESTADO_ACTIVO;
$filtro['ids_servicios_instancias'] = $this->ids_servicios_instancias;
$suscripciones = sq_uv::catalogo_daos()->servicios()->get_suscripciones($filtro);
$ventas_generadas = [];
foreach (array_keys($suscripciones) as $id) {
// Cargar la suscripcion
$suscripcion = sq_uv::catalogo_modelo()->suscripcion($suscripciones[$id]['id']);
//-- Iterar prestaciones PREPROGRAMADAS con id_venta == NULL & id_periodo_facturacion = ACTUAL
$prestaciones_preprogramadas = $suscripcion->get_prestaciones();
foreach ($prestaciones_preprogramadas as $prestacion) {
if ($prestacion->get_id_venta() == null and $prestacion->get_id_reloj_facturador() == $this->id_reloj) {
// obtener el convenio de cofinanciacion si existe
$id_convenio_de_cofinanciacion = $suscripcion->get_convenio_de_cofinanciacion();
// si es cofinanciacion
if ($id_convenio_de_cofinanciacion) {
$venta = sq_uv::catalogo_modelo()->modelador_venta()->nueva_convenio($id_convenio_de_cofinanciacion);
} else {
$venta = sq_uv::catalogo_modelo()->modelador_venta()->nueva_convenio();
}
$venta->set_cliente($suscripciones[$id]['id_cliente']);
$venta->set_medio_pago($suscripciones[$id]['id_medio_pago']);
$venta->set_condicion_venta($suscripciones[$id]['id_condicion_venta']);
//TODO: modificar cuando se agregue el campo canal_venta en la suscripcion.
$venta->set_canal_venta(constantes::CANAL_VENTA_VIRTUAL);
$venta->set_leyenda($prestacion->get_leyenda());
$venta->set_a_agrupar(true);
$venta->set_id_periodo_facturacion($this->id_reloj);
$venta->cambiar_estado(constantes::VENTA_ESTADO_PRE_FACT, true);
// Obtener los articulos de la prestacion preprogramada
$id_servicio_instancia_prog_venta_articulo = $prestacion->get_id_servicio_instancia_prog_venta_articulo();
// Inicializar el array de articulos
$articulos = array();
// A futuro la consulta deber�a obtener un array de articulos, hoy solo trae uno
//TODO: CHEQUEAR: la consulta devuelve un registro por valorizacion, es decir que
//si el servicios_instancias_prog_ventas_articulos tiene 2 valorizaciones
//(2 registros en servicios_instancias_prog_ventas_articulos_valorizaciones)
//entonces la consulta retorna 2 filas del mismo articulo, c/u con una valorizacion
//es decir que si hay mas de una valorizacion el $importe_total de la venta generada calculado mas abajo sera incorrecto
$articulos[] = sq_uv::catalogo_daos()->servicios()->get_articulo_por_id_serv_prog_venta_art($id_servicio_instancia_prog_venta_articulo);
if (empty($articulos)) {
throw new error_negocio("FACTURADOR: GENERAR_VENTAS_POR_SUSCRIPCIONES: No se pudieron obtener los articulos por el programa de venta: " . $suscripcion->get_id_servicio_instancia_prog_venta());
}
// obtener los convenios para asociar a los articulos
$convenios = $suscripcion->get_convenios();
$importe_total = 0;
foreach (array_keys($articulos) as $id_a) {
if ($prestacion->get_importe()!=null) {
$importe_total+=$prestacion->get_importe();
$articulos[$id_a]['importe_unitario'] = $prestacion->get_importe();
} else
$importe_total += $articulos[$id_a]['importe_unitario'];
$articulos[$id_a]['cantidad'] = 1;
// Asociar los convenios menos los de cofinanciacion.
foreach (array_keys($convenios) as $id_c) {
if (!$convenios[$id_c]['es_cofinanciacion'] and !$articulos[$id_a]['no_aplica_convenio']) {
$articulos[$id_a]['convenios'][] = array( 'id' => $convenios[$id_c]['id_convenio']);
}
}
}
$venta->set_importe_total($importe_total);
$venta->agregar_articulos($articulos);
// Setear los dias de vencimientos
$id_tipo_vencimiento = sq_uv::catalogo_daos()->servicios()->get_tipo_vencimiento_servicio_instancia($suscripciones[$id]['id_servicio_instancia']);
if (isset($id_tipo_vencimiento)){
$venta->set_id_tipo_vencimiento($id_tipo_vencimiento);
}
$venta->set_primer_vencimiento($this->dias_vencimiento['id_reloj_1er_vencimiento'], $this->dias_vencimiento['dia_1er_vencimiento']);
if (lib::parametros_sistema()->get_valor(constantes::PARAMETROS_SISTEMA_CANTIDAD_VENCIMIENTOS) == constantes::SEGUNDO_VENCIMIENTO) {
$venta->set_segundo_vencimiento($this->dias_vencimiento['id_reloj_2do_vencimiento'], $this->dias_vencimiento['dia_2do_vencimiento']);
}
$venta->set_id_tipo_servicio($this->id_tipo_servicio);
//-- Guardar venta
$venta->guardar();
//-- Obtener el id de la venta que corresponde asociar a la prestación pre-programada
if ($id_convenio_de_cofinanciacion) {
$id_venta = $venta->get_id_venta_cliente();
} else {
$id_venta = $venta->get_id();
}
// Generar cambios para una reversion de facturación
$this->registrar_punto_reversion($prestacion->get_id());
//-- Dejar el ID generado en el registro de la prestacion PREPROGRAMADA que lo genero
$prestacion->set_id_venta($id_venta);
$prestacion->guardar();
$ventas_generadas[] = $venta;
}
}
}
$this->proceso->agregar_notificacion("Cantidad de ventas generadas en estado de prefacturación:" . count($ventas_generadas), 'info');
if (!empty($ventas_generadas)) {
//generacion de alarma de facturacion
$this->evaluar_generacion_de_alarmas($ventas_generadas);
}
}
/**
*
* @param venta[] $ventas
*/
public function evaluar_generacion_de_alarmas(array $ventas)
{
foreach ($this->ids_facturador_alarmas as $id) {
$facturador_alarma = lib::catalogo_modelo()->facturador_alarma($id);
foreach ($ventas as $venta) {
$facturador_alarma->evaluar_generacion($this->id_facturacion, $venta);
}
}
}
protected function procesar_ventas_por_suscripcion_y_cliente()
{
/*
* Hacer una consulta de las ventas del id_periodo_facturacion == ACTUAL con estado en PREFACTURACION,
* agrupadas por suscripcion y cliente, con un COUNT de la cantidad de ventas incluidas
* - si tiene 1 venta:
* - Pasar el flag "a_agrupar" a false.
* - si tiene mas de 1 venta:
* * Crear una VENTA SUMARIZADA y un comprobante de presentacion asociado
* * Iterar las ventas (si la venta es cofinanciada hay que evitarla)
* - copiar los articulos y sus convenios
* - si la venta se apoya en una vencida (id_venta_referencia),
* no agregar articulos al comprobante poner frase del estilo "DEUDA ANTERIOR" y total
* - si es una venta basica, agregar los articulos al comprobante
* * Aplicar descuentos especiales (EJ: dos postgrados)
* - como? -> falta METADATA de que articulos participan de la regla
* * Guardar la venta.
* Si parametros_sistema('DESC_CRED') = 'S'
* * Reclamar credito si existe
* - si el saldo del credito del cliente es mayor a cero
* - tomar la cantidad disponible hasta el total de la deuda y guardarlo en la tabla de debitos
* Fin Si
*/
//-- Hacer una consulta de las ventas del id_periodo_facturacion == ACTUAL con estado en PREFACTURACION,
// agrupadas por cliente, con un COUNT de la cantidad de ventas incluidas
$filtro['id_venta_estado'] = constantes::VENTA_ESTADO_PRE_FACT;
$filtro['id_periodo_facturacion'] = $this->id_reloj;
$filtro['id_tipo_venta'] = constantes::TIPO_VENTA_BASICA;
$filtro['id_tipo_servicio'] = $this->id_tipo_servicio;
$cantidad_ventas_por_suscripcion_cliente = sq_uv::catalogo_daos()->ventas()->get_cantidad_ventas_por_suscripcion_y_cliente($filtro);
$cantidad_ventas_sumarizadas = 0;
$ventas_sumarizadas_generadas = [];
foreach (array_keys($cantidad_ventas_por_suscripcion_cliente) as $id) {
$id_cliente = $cantidad_ventas_por_suscripcion_cliente[$id]['id_cliente'];
// Cargar las ventas para el cliente actual
$ventas_por_cliente = sq_uv::catalogo_daos()->ventas()->get_ventas_por_suscripcion_y_cliente($id_cliente, $cantidad_ventas_por_suscripcion_cliente[$id]['id_servicio_suscripcion'], $filtro);
if ($cantidad_ventas_por_suscripcion_cliente[$id]['cantidad'] == 1) {
//-- Pasar el flag "a_agrupar" a false.
$venta = sq_uv::catalogo_modelo()->modelador_venta()->cargar($ventas_por_cliente[0]['id']);
$venta->set_a_agrupar(false);
$venta->guardar();
//-- Si el cliente es beneficiario de convenio al 100% cobrar aplicando el convenio
if (sq_uv::catalogo_daos()->clientes()->es_beneficiario_convenio_100_y_tiene_pago_unico_asociado($id_cliente)) {
// Aplico el convenio para que la cobranza se genere en cero
foreach (array_keys($ventas_por_cliente) as $id_vc) {
$ventas_por_cliente[$id_vc]['importe_total'] = 0;
}
$this->generar_cobranza($venta, $ventas_por_cliente, $id_cliente, false, constantes::MEDIO_PAGO_MERCADOPAGO);
} else {
// Si no tiene nada que cobrar entonces la cobro (son los casos de convenios 100 en 'servicios_suscripciones_convenios')
if ($venta->get_importe_total_a_cobrar() == 0) {
// Aplico el convenio para que la cobranza se genere en cero
foreach (array_keys($ventas_por_cliente) as $id_vc) {
$ventas_por_cliente[$id_vc]['importe_total'] = 0;
}
$this->generar_cobranza($venta, $ventas_por_cliente, $id_cliente, false, constantes::MEDIO_PAGO_EFECTIVO);
} else {
//-- Si parametros_sistema('DESC_CRED') = 'S'
if (lib::parametros_sistema()->get_valor('DESC_CRED') == 'S') {
// Recalamar credito si existe
$this->reclamar_credito($venta, $ventas_por_cliente, $id_cliente, $venta->get_importe_total_a_cobrar());
}
}
}
} else {
$leyenda = null;
$articulos_acumulados = array();
$ids_ventas = array();
foreach (array_keys($ventas_por_cliente) as $id_vc) {
// Guardar ids de ventas a sumarizar
$ids_ventas[] = $ventas_por_cliente[$id_vc]['id'];
// Cargar venta para obtener articulos y convenios
$venta_cargada = sq_uv::catalogo_modelo()->modelador_venta()->cargar($ventas_por_cliente[$id_vc]['id']);
// Acumular los articulos de las diferentes ventas
$articulos_acumulados = array_merge($articulos_acumulados, $venta_cargada->get_articulos());
//-- si la venta se apoya en una vencida (id_venta_referencia),
// if( $venta_cargada->get_id_venta_origen() ){
// TODO:-- no agregar articulos al comprobante poner frase del estilo "DEUDA ANTERIOR" y total
// }else{
// TODO:-- si es una venta basica, agregar los articulos al comprobante
// }
$leyenda[] = $venta_cargada->get_leyenda();
}
// Obtener el importe total
$importe_total_a_cobrar = $importe_convenio = $importe_total = 0;
foreach (array_keys($articulos_acumulados) as $id_a) {
$importe_total += $articulos_acumulados[$id_a]['importe_total'];
if ($articulos_acumulados[$id_a]['id'] == constantes::CUOTA_ID_ARTICULO) {
if (!empty($articulos_acumulados[$id_a]['convenios'])) {
// Elimino convenios repetidos
$convenios = null;
foreach ($articulos_acumulados[$id_a]['convenios'] as $convenio) {
$convenios[$convenio['id']] = $convenio;
}
$articulos_acumulados[$id_a]['convenios'] = $convenios;
// Calcula el importe total de los convenios
foreach ($articulos_acumulados[$id_a]['convenios'] as $convenio) {
$importe_convenio += $convenio['importe'];
}
}
}
}
$importe_total_a_cobrar = $importe_total - $importe_convenio;
//-- Crear una VENTA SUMARIZADA y un comprobante de presentacion asociado
$venta = sq_uv::catalogo_modelo()->modelador_venta()->nueva_sumarizada();
$venta->set_leyenda(implode(' || ', $leyenda));
$venta->set_cliente($id_cliente);
$venta->set_ids_ventas_sumarizadas($ids_ventas);
$venta->set_importe_total($importe_total);
$venta->set_importe_total_a_cobrar($importe_total_a_cobrar);
$venta->set_canal_venta(constantes::CANAL_VENTA_FACTURADOR);
$id_suscripcion = $cantidad_ventas_por_suscripcion_cliente[$id]['id_servicio_suscripcion'];
$suscripcion = sq_uv::catalogo_daos()->servicios()->obtener_servicios_suscripciones(['id' => $id_suscripcion]);
if (empty($suscripcion)) {
throw new error_negocio("FACTURADOR: No se pudo obtener el servicio suscripcion.");
} elseif (count($suscripcion) > 1) {
throw new error_negocio("FACTURADOR: Se obtuvo mas de una suscripcion.");
}
$venta->set_medio_pago($suscripcion[0]['medio_pago']['id']);
$venta->set_condicion_venta(constantes::CONDICION_VENTA_EFECTIVO);
//-- copiar los articulos y sus convenios
$venta->agregar_articulos($articulos_acumulados);
//TODO: Aplicar descuentos especiales (EJ: dos postgrados)
$venta->cambiar_estado(constantes::VENTA_ESTADO_PRE_FACT);
// Setear el periodo de facturacion actual
$venta->set_id_periodo_facturacion($this->id_reloj);
// Setear los dias de vencimientos
$venta->set_primer_vencimiento($this->dias_vencimiento['id_reloj_1er_vencimiento'], $this->dias_vencimiento['dia_1er_vencimiento']);
if (lib::parametros_sistema()->get_valor(constantes::PARAMETROS_SISTEMA_CANTIDAD_VENCIMIENTOS) == constantes::SEGUNDO_VENCIMIENTO) {
$venta->set_segundo_vencimiento($this->dias_vencimiento['id_reloj_2do_vencimiento'], $this->dias_vencimiento['dia_2do_vencimiento']);
}
$venta->set_id_tipo_servicio($this->id_tipo_servicio);
//-- Guardar la venta.
$venta->guardar();
//-- Si el cliente es beneficiario de convenio al 100% cobrar aplicando el convenio
if (sq_uv::catalogo_daos()->clientes()->es_beneficiario_convenio_100_y_tiene_pago_unico_asociado($id_cliente)) {
// Aplico el convenio para que la cobranza se genere en cero
foreach (array_keys($ventas_por_cliente) as $id_vc) {
$ventas_por_cliente[$id_vc]['importe_total'] = 0;
}
$this->generar_cobranza($venta, $ventas_por_cliente, $id_cliente, false, constantes::MEDIO_PAGO_MERCADOPAGO);
} else {
//-- Si parametros_sistema('DESC_CRED') = 'S'
if (lib::parametros_sistema()->get_valor('DESC_CRED', $this->id_tipo_servicio) == 'S') {
// Reclamar credito si existe
$this->reclamar_credito($venta, $ventas_por_cliente, $id_cliente, $importe_total);
}
}
// Actualizar 'id_venta' en la prestacion pre-programada por el 'id' de la sumarizada
$filtro_prestacion_pp = [
'id_servicio_suscripcion' => $cantidad_ventas_por_suscripcion_cliente[$id]['id_servicio_suscripcion'],
'id_reloj_facturador' => $this->id_reloj
];
// Debería obtener solo una prestación preprogramada
$datos_prestacion_pp = sq_uv::catalogo_daos()->servicios()->get_prestaciones_programadas($filtro_prestacion_pp);
if (count($datos_prestacion_pp) > 1) {
$msg = "Se encontraron mas de una prestacion pre-programada para la suscripcion y el reloj.";
$this->entorno()->log()->err(__METHOD__ . ": " . var_export($filtro_prestacion_pp, true));
throw new error_negocio("FACTURADOR: " . $msg . " Verifique el log para mas informacion.");
}
if (count($datos_prestacion_pp) == 1) {
$prestacion = sq_uv::catalogo_modelo()->prestacion_preprogramada($datos_prestacion_pp[0]['id']);
$prestacion->set_id_venta($venta->get_id());
$prestacion->guardar();
}
if (count($datos_prestacion_pp) == 0) {
// Obtener las prestaciones asociadas a la suscripcion
$filtro_prestacion_pp = [
'id_servicio_suscripcion' => $cantidad_ventas_por_suscripcion_cliente[$id]['id_servicio_suscripcion'],
'ventas_no_cobradas' => true
];
$datos_prestacion_pp = sq_uv::catalogo_daos()->servicios()->get_prestaciones_programadas($filtro_prestacion_pp, "ORDER BY s.id ASC");
$prestacion = sq_uv::catalogo_modelo()->prestacion_preprogramada(max($datos_prestacion_pp)['id']);
$prestacion->set_id_venta($venta->get_id());
$prestacion->guardar();
}
if ($prestacion->get_importe() != null) {
$venta->set_importe_total($prestacion->get_importe());
$venta->guardar();
}
$cantidad_ventas_sumarizadas++;
$ventas_sumarizadas_generadas[] = $venta;
}
}
$this->proceso->agregar_notificacion("Cantidad de ventas sumarizadas generadas:" . $cantidad_ventas_sumarizadas, 'info');
$this->proceso->agregar_notificacion("Cantidad de ventas cobradas:" . $this->cantidad_ventas_cobradas, 'info');
if (!empty($ventas_sumarizadas_generadas)) {
//generacion de alarma de facturacion
$this->evaluar_generacion_de_alarmas($ventas_sumarizadas_generadas);
}
}
protected function reclamar_credito($venta, $ventas_por_cliente, $id_cliente, $importe_total)
{
$cliente = sq_uv::catalogo_modelo()->cliente($id_cliente);
if (!$cliente->tiene_credito()) {
return;//si el cliente no tiene credito no hago nada
}
//-- si el saldo del credito del cliente es mayor a cero
if ($cliente->get_saldo_de_credito() >= $importe_total) {
// Generar cobranza
$this->generar_cobranza($venta, $ventas_por_cliente, $id_cliente, true, constantes::MEDIO_PAGO_CTA_CTE);
} else {
// Pago parcial
if (lib::parametros_sistema()->get_valor('PAGOS_PARC') == 'S') {
// Recalamar credito si existe
$this->generar_cobranza($venta, $ventas_por_cliente, $id_cliente, true, constantes::MEDIO_PAGO_CTA_CTE, true);
}
}
}
protected function generar_cobranza($venta, $ventas_por_cliente, $id_cliente, $utiliza_credito_disponible, $id_medio_pago, $es_pago_parcial = false)
{
$datos_cobranza = array();
$importe_total_cobranza = 0;
foreach (array_keys($ventas_por_cliente) as $id_vc) {
$datos_cobranza['ventasCobradas'][] = array(
'id_venta' => $ventas_por_cliente[$id_vc]['id'],
'importe' => $ventas_por_cliente[$id_vc]['importe_total_a_cobrar']);
$importe_total_cobranza += $ventas_por_cliente[$id_vc]['importe_total_a_cobrar'];
}
// Generar cobranza
$datos = [
'ventasCobradas' => $datos_cobranza['ventasCobradas'],
'detalles' => [
0 => [
"concepto" => 'NV',
"importe" => $importe_total_cobranza
]
],
'id_cliente' => $id_cliente,
'importe' => $importe_total_cobranza,
'id_medio_pago' => $id_medio_pago,
'utiliza_credito_disponible' => $utiliza_credito_disponible
];
$transaccion_cobranza = sq_uv::catalogo_transacciones()->cobranza();
$transaccion_cobranza->set_datos($datos);
$transaccion_cobranza->procesar();
//- tomar la cantidad disponible hasta el total de la deuda y guardarlo en la tabla de debitos
if ($es_pago_parcial) {
$venta->cambiar_estado(constantes::VENTA_PENDIENTE);
$importe_total_cobrado = sq_uv::catalogo_daos()->cobranzas()->obtener_importe_total_cobrado($transaccion_cobranza->get_id());
$importe_total_a_cobrar = round(($importe_total_cobranza - $importe_total_cobrado), 2);
$venta->set_importe_total_a_cobrar($importe_total_a_cobrar);
$venta->set_importe_total_cobrado($importe_total_cobrado);
$dao_ventas = sq_uv::catalogo_daos()->ventas();
$venta_articulo = $dao_ventas->get_articulos_por_venta($venta->get_id(),['id_articulo' => constantes::CUOTA_ID_ARTICULO])[0];
$articulo['id_venta_articulo'] = $venta_articulo['id_venta_articulo'];
$articulo['importe_total_cobrado'] = $importe_total_cobrado;
$venta->actualizar_importe_cobrado_venta_articulo($articulo);
} else {
$venta->cambiar_estado(constantes::VENTA_COBRADA);
}
$this->cantidad_ventas_cobradas++;
$this->importe_ventas_cobradas += $importe_total_cobranza;
//-- Guardar la venta.
$venta->guardar();
}
//-----------------------------------------------------------
// CONFIRMACION
//-----------------------------------------------------------
public function cambiar_estado_ventas($ventas_prefacturadas, $estado_venta)
{
/*
* ---------------------------------------------------------------------
* ---------- TODA ESTA LOGICA SE RESOLVIO EN EL PROCESAMIENTO DE VENTAS
* POR CLIENTE ---------------------------------------------------------
* Cambiar el estado de las ventas de VENTA_ESTADO_PRE_FACT
* - si no hay movimiento de debito asociado pasarla a PENDIENTE
* - Si hay un movimiento de debito asociado con importe MENOR al total de la venta pasarla a PENDIENTE
* - Si hay un movimiento de debito asociado con importe IGUAL al total de la venta pasarla a COBRADA
*
* Atencion, las ventas sumarizadas pasan de estado a las ventas que la componen
*/
$ids_ventas_agrupadas_en_sumarizada = array_column(sq_uv::catalogo_daos()->ventas()->get_ventas_sumarizadas(), 'id_venta_sumarizada');
$ids_ventas_tipo_confinanciada = array_column(sq_uv::catalogo_daos()->ventas()->get_ventas_cofinanciadas(), 'id');
foreach ($ventas_prefacturadas as $venta_prefact) {
$venta = sq_uv::catalogo_modelo()->modelador_venta()->cargar($venta_prefact['id']);
$venta->cambiar_estado($estado_venta);
$venta->guardar();
// Verificar si la venta no es parte de una sumarizada
if (!in_array($venta_prefact['id'], array_merge($ids_ventas_agrupadas_en_sumarizada, $ids_ventas_tipo_confinanciada))) {
$this->cantidad_ventas_generadas++;
$this->importe_ventas_generadas += $venta->get_importe_total();
$this->ventas_generadas[] = $venta_prefact;
}
}
$this->proceso->agregar_notificacion("Cantidad de ventas generadas:" . $this->cantidad_ventas_generadas, 'info');
}
protected function notificar_ventas_al_nucleo($ventas_prefacturadas)
{
$ids_ventas_agrupadas_en_sumarizada = array_column(sq_uv::catalogo_daos()->ventas()->get_ventas_sumarizadas(), 'id_venta_sumarizada');
$ids_ventas_tipo_confinanciada = array_column(sq_uv::catalogo_daos()->ventas()->get_ventas_cofinanciadas(), 'id');
foreach ($ventas_prefacturadas as $venta_prefact) {
// Verificar si la venta no es parte de una sumarizada o una cofinanciada
if (!in_array($venta_prefact['id'], array_merge($ids_ventas_agrupadas_en_sumarizada, $ids_ventas_tipo_confinanciada))) {
// Cargar la venta y verificar si se tiene que enviar al nucleo
$venta = sq_uv::catalogo_modelo()->modelador_venta()->cargar($venta_prefact['id']);
if ($venta->es_notificable_al_nucleo()) {
$proceso_enviar_venta = sq_uv::catalogo_procesos()->notificar_venta($venta_prefact['id']);
$proceso_enviar_venta->ejecutar();
}
}
}
}
protected function cambiar_estado_facturacion_servicios_instancias($estado)
{
$facturaciones_servicios_instancias = lib::catalogo_daos()->facturador()->get_facturaciones_servicios_instancias(['estado' => constantes::FACTURADOR_SERVICIO_INSTANCIA_ESTADO_INICIADO]);
$datos = array(
'estado' => $estado
);
foreach ($facturaciones_servicios_instancias as $facturacion_servicio_instancia) {
$where = [
'id_servicio_instancia' => $facturacion_servicio_instancia['id_servicio_instancia']
];
$sql_update = sql::sql_array_a_update('facturaciones_servicios_instancias', $datos, $where, $this->entorno()->db());
$this->entorno()->db()->ejecutar($sql_update);
}
}
//-----------------------------------------------------------
// REVERTIR
//-----------------------------------------------------------
protected function revertir_facturacion_mora()
{
$sql = "SELECT * FROM facturaciones_reversiones_moras WHERE id_facturacion = {$this->id_facturacion};";
$filas = lib::entorno()->db()->consultar($sql);
foreach ($filas as $fila) {
$vart = sq_uv::catalogo_daos()->articulos()->get_venta_articulo($fila['id_venta_articulo']);
$sql = "DELETE FROM ventas_articulos WHERE id = {$vart['id']};";
$this->entorno()->db()->ejecutar($sql);
// Cambiar importes de la venta una vez eliminado el articulo
if (!empty($vart)) {
$venta = sq_uv::catalogo_modelo()->modelador_venta()->cargar($fila['id_venta']);
$venta->set_importe_total($venta->get_importe_total() - $vart['importe_total']);
$venta->set_importe_total_a_cobrar($venta->get_importe_total_a_cobrar() - $vart['importe_total']);
$venta->set_cobranza_vence_en($fila['cobranza_vence_en_anterior']);
$venta->guardar();
} else {
throw new error_negocio("Proceso_revertir_facturacion: No se encontro un venta articulo mora ({$fila['id_venta_articulo']}) asociado a la venta {$fila['id_venta']}.");
}
}
$this->eliminar_log_reversion_mora();
}
/**
* Elimina los registros de ventas_vencimientos de ventas pendientes que fueron prefacturadas
*
* @return void
*/
protected function revertir_pendientes()
{
$filtro['id_venta_estado'] = constantes::VENTA_PENDIENTE;
$filtro['id_periodo_facturacion'] = $this->id_reloj;
$filtro['id_tipo_venta'] = [constantes::TIPO_VENTA_BASICA];
$order = "ORDER BY id_tipo_venta DESC";
$ventas = sq_uv::catalogo_daos()->ventas()->get_ventas($filtro, null, $order);
foreach (array_keys($ventas) as $id) {
$sql = "DELETE FROM ventas_vencimientos WHERE id_venta = " . $ventas[$id]['id']." AND id_reloj_facturador = " . $this->id_reloj .";";
$this->entorno()->db()->ejecutar($sql);
}
}
protected function revertir_facturacion()
{
// Revertir las ventas pendientes
$this->revertir_pendientes();
// Obtener tabla facturaciones_reversiones
$sql = "SELECT * FROM facturaciones_reversiones;";
$prestaciones_pp = lib::entorno()->db()->consultar($sql);
foreach ($prestaciones_pp as $prestacion_pp) {
// Actualizar prestaciones pre-programadas
$prestacion = sq_uv::catalogo_modelo()->prestacion_preprogramada($prestacion_pp['id_servicio_prestacion_pre_programada']);
$prestacion->set_id_venta($prestacion_pp['id_venta']);
$prestacion->guardar();
// Actualizar estado de la venta
if (!is_null($prestacion_pp['id_venta'])) {
$venta = sq_uv::catalogo_modelo()->modelador_venta()->cargar($prestacion_pp['id_venta']);
$venta->cambiar_estado($prestacion_pp['id_venta_estado'], true);
$venta->guardar();
}
}
// Eliminar todas las ventas en prefacturacion
$filtro['id_venta_estado'] = constantes::VENTA_ESTADO_PRE_FACT;
$filtro['id_periodo_facturacion'] = $this->id_reloj;
$filtro['excluir_ventas_dependientes_de_sumarizada'] = false;
$filtro['id_tipo_venta'] = [constantes::TIPO_VENTA_BASICA, constantes::TIPO_VENTA_SUMARIZADA];
// El orden obtiene primero las sumarizadas (tipo 3) para que no falle por FK
$order = "ORDER BY id_tipo_venta DESC";
$ventas = sq_uv::catalogo_daos()->ventas()->get_ventas($filtro, null, $order);
foreach (array_keys($ventas) as $id) {
$sql = "";
$sql .= "DELETE FROM ventas_sumarizadas WHERE id_venta_sumariza_a = " . $ventas[$id]['id'].";";
$sql .= "DELETE FROM ventas_articulos_convenios WHERE id_venta_articulo IN (SELECT id FROM ventas_articulos WHERE id_venta = " . $ventas[$id]['id'].");";
$sql .= "DELETE FROM ventas_articulos WHERE id_venta = " . $ventas[$id]['id'].";";
$sql .= "DELETE FROM ventas_convenios WHERE id_venta = " . $ventas[$id]['id'].";";
$sql .= "DELETE FROM ventas_estados_log WHERE id_venta = " . $ventas[$id]['id'].";";
$sql .= "DELETE FROM ventas_vencimientos WHERE id_venta = " . $ventas[$id]['id'].";";
$sql .= "DELETE FROM facturaciones_alarmas_generadas_ventas WHERE id_venta = " . $ventas[$id]['id'].";";
$sql .= "DELETE FROM ventas WHERE id = " . $ventas[$id]['id'].";";
$this->entorno()->db()->ejecutar($sql);
}
//--- Eliminar ventas cofinanciadas
$filtro['id_venta_estado'] = constantes::VENTA_ESTADO_PRE_FACT;
$filtro['id_periodo_facturacion'] = $this->id_reloj;
$filtro['excluir_ventas_dependientes_de_sumarizada'] = false;
$filtro['id_tipo_venta'] = [constantes::TIPO_VENTA_BASICA, constantes::TIPO_VENTA_COFINANCIADA];
// El orden obtiene primero las basicas (tipo 1) para que no falle por FK contra las cofianciadas (tipo 2)
$order = "ORDER BY id_tipo_venta ASC";
$ventas = sq_uv::catalogo_daos()->ventas()->get_ventas($filtro, null, $order);
foreach (array_keys($ventas) as $id) {
$sql = "";
$sql .= "DELETE FROM ventas_sumarizadas WHERE id_venta_sumariza_a = " . $ventas[$id]['id'].";";
$sql .= "DELETE FROM ventas_articulos_convenios WHERE id_venta_articulo IN (SELECT id FROM ventas_articulos WHERE id_venta = " . $ventas[$id]['id'].");";
$sql .= "DELETE FROM ventas_articulos WHERE id_venta = " . $ventas[$id]['id'].";";
$sql .= "DELETE FROM ventas_convenios WHERE id_venta = " . $ventas[$id]['id'].";";
$sql .= "DELETE FROM ventas_estados_log WHERE id_venta = " . $ventas[$id]['id'].";";
$sql .= "DELETE FROM ventas_vencimientos WHERE id_venta = " . $ventas[$id]['id'].";";
$sql .= "DELETE FROM facturaciones_alarmas_generadas_ventas WHERE id_venta = " . $ventas[$id]['id'].";";
$sql .= "DELETE FROM ventas WHERE id = " . $ventas[$id]['id'].";";
$this->entorno()->db()->ejecutar($sql);
}
$this->eliminar_log_reversion();
}
public function eliminar_log_reversion()
{
// Eliminar tabla facturaciones_reversiones
$sql = "DELETE FROM facturaciones_reversiones;";
$this->entorno()->db()->ejecutar($sql);
}
public function eliminar_log_reversion_mora()
{
// Eliminar tabla facturaciones_reversiones
$sql = "DELETE FROM facturaciones_reversiones_moras;";
$this->entorno()->db()->ejecutar($sql);
}
public function registrar_punto_reversion($id_sppp, $id_venta = null, $id_venta_estado = null)
{
$datos = array(
'id_facturacion' => $this->id_facturacion,
'id_servicio_prestacion_pre_programada' => $id_sppp,
'id_venta' => $id_venta,
'id_venta_estado' => $id_venta_estado
);
$sql = sql::sql_array_a_insert('facturaciones_reversiones', $datos, $this->entorno()->db());
lib::entorno()->db()->ejecutar($sql);
}
public function registrar_punto_reversion_mora($id_venta, $id_venta_articulo, $cobranza_vence_en_anterior)
{
$datos = array(
'id_facturacion' => $this->id_facturacion,
'id_venta' => $id_venta,
'id_venta_articulo' => $id_venta_articulo,
'cobranza_vence_en_anterior' => $cobranza_vence_en_anterior);
if (!empty($datos)) {
$sql = sql::sql_array_a_insert('facturaciones_reversiones_moras', $datos, $this->entorno()->db());
lib::entorno()->db()->ejecutar($sql);
}
}
public function eliminar_cabecera_facturacion()
{
$sql = "DELETE FROM facturaciones_reversiones_moras WHERE id_facturacion = " . $this->entorno()->db()->quote($this->id_facturacion) . ";";
$this->entorno()->db()->ejecutar($sql);
$sql = "DELETE FROM facturaciones WHERE id = " . $this->entorno()->db()->quote($this->id_facturacion) . ";";
$this->entorno()->db()->ejecutar($sql);
}
public function eliminar_instancias_a_facturar()
{
$sql = null;
// foreach($this->datos['ids_servicios_instancias'] as $instancia){
// $datos['id_servicio_instancia'] = $instancia;
// $datos['id_facturacion'] = $this->id_facturacion;
$sql .= "DELETE FROM facturaciones_servicios_instancias
WHERE id_facturacion = " . $this->entorno()->db()->quote($this->id_facturacion) . ";";
// }
if ($sql) {
$this->entorno()->db()->ejecutar($sql);
} else {
throw new error_negocio("Proceso_revertir_facturacion: No se encontraron servicios instancias para procesar.");
}
}
public function eliminar_facturaciones_alarmas_configuradas()
{
$sql = "DELETE FROM facturaciones_alarmas_configuradas WHERE id_facturacion = " . $this->entorno()->db()->quote($this->id_facturacion) . ";";
$this->entorno()->db()->ejecutar($sql);
}
public function eliminar_facturaciones_alarmas_generadas()
{
$sql = "SELECT * FROM facturaciones_alarmas_generadas WHERE id_facturacion = " . $this->entorno()->db()->quote($this->id_facturacion) . ";";
$res = self::entorno()->db()->consultar($sql);
foreach ($res as $r ){
$sql = "DELETE FROM facturaciones_alarmas_generadas_ventas WHERE id_facturacion_alarma_generada = " . $r['id'] . ";";
$this->entorno()->db()->ejecutar($sql);
}
$sql = "DELETE FROM facturaciones_alarmas_generadas WHERE id_facturacion = " . $this->entorno()->db()->quote($this->id_facturacion) . ";";
$this->entorno()->db()->ejecutar($sql);
}
protected function revertir_confirmacion($ventas_prefacturadas)
{
if (is_array($ventas_prefacturadas) && count($ventas_prefacturadas) > 0){
$this->cambiar_estado_ventas($ventas_prefacturadas, constantes::VENTA_ESTADO_PRE_FACT);
}
$msg = 'FACTURADOR: REVERTIR CONFIRMACION: NO IMPLEMENTADO!';
lib::entorno()->log()->critical(__METHOD__, [$msg]);
ei_arbol(array(), $msg);
}
public function postfacturar()
{
// Obtener las ventas en estado VENTA_ESTADO_PRE_FACT
$filtro['id_venta_estado'] = constantes::VENTA_ESTADO_PRE_FACT;
$filtro['id_periodo_facturacion'] = $this->id_reloj;
$filtro['id_tipo_servicio'] = $this->id_tipo_servicio;
$parametros_sistema = sq_uv::parametros_sistema();
$post_fact = $parametros_sistema->get_valor(constantes::PARAMETROS_SISTEMA_POST_FACTURACION, $this->id_tipo_servicio);
if ($post_fact == constantes::POST_FACTURACION_NINGUNO) {
return true;
}
// Recupero todas las ventas pre facturadas.
$ventas_prefacturadas = sq_uv::catalogo_daos()->ventas()->get_ventas($filtro, null, null, "cobranza_vence_en", null, null, true);
$clientes_procesados = [];
$ventas_a_aplicar_convenio = [];
foreach ($ventas_prefacturadas as $venta_prefacturada) {
$venta = sq_uv::catalogo_modelo()->modelador_venta()->cargar($venta_prefacturada['id']);
if (! in_array($venta->get_id_cliente(), $clientes_procesados)) {
$filtro = [
'id_cliente' => $venta->get_id_cliente(),
'id_venta_estado' => constantes::VENTA_ESTADO_PRE_FACT,
'id_periodo_facturacion' => $this->id_reloj,
'id_tipo_servicio' => $this->id_tipo_servicio,
];
// Recupero todas las ventas de ese alumno si no las busqué previamente
$ventas_cliente = sq_uv::catalogo_daos()->ventas()->get_ventas($filtro, null, 'ORDER BY v.importe_total_a_cobrar DESC');
if (is_array($ventas_cliente)) {
// Para los casos que el cliente tiene más de una venta generada y el tipo de postfacturacion es al de menor valor
if ($post_fact == constantes::POST_FACTURACION_MENOR && count($ventas_cliente) > 1) {
// Dejo solo la venta de menor importe_total_a_cobrar
$ventas_cliente = [end($ventas_cliente)];
}
// Agrego el resto como ventas a aplicar convenio.
foreach ($ventas_cliente as $vc) {
$ventas_a_aplicar_convenio[] = $vc;
}
}
// Marco al cliente como procesado para no volver a buscar sus ventas.
$clientes_procesados[] = $venta->get_id_cliente();
}
}
foreach ($ventas_a_aplicar_convenio as $v) {
$filtro = [];
$filtro['id_instancia'] = $v['servicio_instancia']['id'];
$filtro['id_tipo_convenio'] = constantes::TIPO_CONVENIO_POSTFACTURACION;
// Convenios del servicio instancia
$sic = sq_uv::catalogo_daos()->servicios()->obtener_servicios_instancia_convenios($filtro);
// Convenios de la suscripcion
$ssc = sq_uv::catalogo_daos()->servicios()->get_suscripcion_convenios($v['id_servicio_suscripcion'], true);
$convenios_a_aplicar = [];
foreach ($sic as $convenio) {
$convenios_a_aplicar[$convenio['convenio_id']] = ['id' => $convenio['convenio_id']];
}
foreach ($ssc as $convenio) {
$convenios_a_aplicar[$convenio['id_convenio']] = ['id' => $convenio['id_convenio']];
}
$venta = sq_uv::catalogo_modelo()->modelador_venta()->cargar($v['id']);
$venta->agregar_convenios_articulos($convenios_a_aplicar);
$venta->guardar();
}
}
public function prefacturar()
{
$suscripciones = sq_uv::catalogo_daos()->servicios()->get_suscripciones([
'ids_servicios_instancias' => $this->ids_servicios_instancias,
]);
$nuevos_vencimientos_formateados = sq_uv::catalogo_daos()->ventas()->get_vencimientos_por_reloj_facturador($this->dias_vencimiento);
$proceso = sq_uv::catalogo_procesos()->aplicar_porcentaje_por_mora_ventas($suscripciones);
$proceso->ejecutar();
$articulos = $proceso->get_ventas_articulos_agregados();
$ventas_actualizadas = [];
if (!empty($articulos)) {
foreach ($articulos as $articulo) {
$cobranza_vence_en = sq_uv::catalogo_daos()->ventas()->get_cobranza_vence_en($articulo['id_venta']);
$this->registrar_punto_reversion_mora($articulo['id_venta'], $articulo['id'], $cobranza_vence_en);
//Setea el nuevo cobranza_vence_en
if (sq_uv::parametros_sistema()->get_valor(constantes::PARAMETROS_SISTEMA_CANTIDAD_VENCIMIENTOS) == constantes::SEGUNDO_VENCIMIENTO && isset($nuevos_vencimientos_formateados[1])) {
$fecha_a_actualizar = $nuevos_vencimientos_formateados[1];
} else {
$fecha_a_actualizar = $nuevos_vencimientos_formateados[0];
}
$ventas_actualizadas[] = $articulo['id_venta'];
sq_uv::catalogo_daos()->ventas()->actualizar_vencimientos_de_ventas($articulo['id_venta'], $fecha_a_actualizar);
}
}
foreach ($suscripciones as $suscripcion) {
$ventas_asociadas = sq_uv::catalogo_daos()->ventas()->get_ventas_vencidas_por_suscripcion([
'id_servicio_suscripcion' => $suscripcion['id'],
'id_venta_estado' => [constantes::VENTA_VENCIDA, constantes::VENTA_PENDIENTE],
'id_articulo' => constantes::CUOTA_ID_ARTICULO
]);
foreach ($ventas_asociadas as $venta) {
//Setea el nuevo cobranza_vence_en
if (!in_array($venta['id'], $ventas_actualizadas)) {
if (sq_uv::parametros_sistema()->get_valor(constantes::PARAMETROS_SISTEMA_CANTIDAD_VENCIMIENTOS) == constantes::SEGUNDO_VENCIMIENTO && isset($nuevos_vencimientos_formateados[1])) {
$fecha_a_actualizar = $nuevos_vencimientos_formateados[1];
} else {
$fecha_a_actualizar = $nuevos_vencimientos_formateados[0];
}
$ventas_actualizadas[] = $venta['id'];
sq_uv::catalogo_daos()->ventas()->actualizar_vencimientos_de_ventas($venta['id'], $fecha_a_actualizar);
}
}
}
}
public function confirmar()
{
// TODO: verificar que traiga solo las que tiene que traer, para los tres facturadores.
try {
$ventas_prefacturadas = [];
$this->procesar_ventas_por_suscripcion_y_cliente();
// Confirmar el procesamiento de los servicios instancias
$this->cambiar_estado_facturacion_servicios_instancias(constantes::FACTURADOR_SERVICIO_INSTANCIA_ESTADO_CONFIRMADO);
// Obtener las ventas en estado VENTA_ESTADO_PRE_FACT
$filtro['id_venta_estado'] = constantes::VENTA_ESTADO_PRE_FACT;
$filtro['id_periodo_facturacion'] = $this->id_reloj;
$filtro['id_tipo_servicio'] = $this->id_tipo_servicio;
$ventas_prefacturadas = sq_uv::catalogo_daos()->ventas()->get_ventas($filtro, null, null, "cobranza_vence_en", null, null, true);
$this->cambiar_estado_ventas($ventas_prefacturadas, constantes::VENTA_PENDIENTE);
lib::entorno()->log()->debug(__METHOD__, ["Cantidad de ventas en estado de prefacturación cambiadas de estado" => count($ventas_prefacturadas)]);
$this->notificar_ventas_al_nucleo($ventas_prefacturadas);
lib::entorno()->log()->debug(__METHOD__, ["Cantidad de ventas en estado de prefacturación notificadas al nucleo" => count($ventas_prefacturadas)]);
// Si no queda ninguna instancia para facturar en el id de reloj actual, avanzo el facturador
$datos = sq_uv::catalogo_daos()->servicios()->get_servicios_instancias_no_facturados($this->id_reloj);
if (empty($datos)) {
$this->reloj_facturador->avanzar();
}
$this->eliminar_log_reversion();
$this->eliminar_log_reversion_mora();
} catch (error_negocio $e) {
$this->revertir_confirmacion($ventas_prefacturadas);
throw $e;
}
}
public function generar()
{
$this->validar();
$this->generar_cabecera_facturacion();
$this->guardar_instancias_a_facturar();
if (!empty($this->ids_facturador_alarmas)) {
$this->guardar_facturaciones_alarmas_configuradas();
}
try {
$this->prefacturar();
$this->programar_cuotas_continuas();
$this->procesar_ventas_pendientes();
//$this->procesar_ventas_vencidas();
$this->generar_ventas_por_suscripciones();
//$this->procesar_ventas_por_suscripcion_y_cliente();
$this->contar_ventas_pregeneradas();
$this->postfacturar();
} catch (error_negocio $e) {
lib::entorno()->log()->error("Facturador: Error al generar la facturacion: " . $e->getMessage());
$this->revertir();
throw $e;
}
}
public function revertir()
{
$this->revertir_facturacion();
$this->revertir_facturacion_mora();
$this->eliminar_facturaciones_alarmas_configuradas();
$this->eliminar_facturaciones_alarmas_generadas();
$this->eliminar_instancias_a_facturar();
$this->eliminar_cabecera_facturacion();
}
}
lib-develop/src/siu/sq/lib/modelo/facturador_alarma.php 0000664 0000000 0000000 00000015445 14430530062 0023505 0 ustar 00root root 0000000 0000000 datos['id_tipo_facturador_alarma'];
}
public function get_par_valor()
{
//supongo que siempre hay un solo registro en facturador_alarmas_parametros por registro en facturador_alarmas
return $this->datos['facturador_alarmas_parametros'][0]['par_valor'];
}
protected function inicializar()
{
$this->datos['id'] = null;
$this->datos['codigo'] = null;
$this->datos['descripcion'] = null;
$this->datos['id_tipo_facturador_alarma'] = null;
$this->datos['descripcion_comportamiento'] = null;
$this->datos['estado'] = null;
$this->datos['estado_actualizado_en'] = null;
$this->datos['tipo_facturador_alarmas'] = [];
$this->datos['facturador_alarmas_parametros'] = [];
$this->alarma_generada = [];
$this->alarmas_generadas_ventas = [];
}
protected function cargar($id)
{
$datos = lib::catalogo_daos()->alarmas()->obtener_alarma($id);
if (is_null($datos)) {
throw new error_not_found("Facturador alarma: La alarma de facturacion que intenta cargar no existe.");
} else {
$this->datos = $datos;
}
}
protected function validar()
{
// Controlar que esten cargados los datos basicos
$campos_obligatorios = [
'codigo',
'descripcion',
'id_tipo_facturador_alarma',
'estado',
'estado_actualizado_en'
];
$this->validar_campos_obligatorios($this->datos, $campos_obligatorios, __CLASS__);
}
public function guardar()
{
$this->validar();
if (is_null($this->datos['id'])) {
$this->grabar();
} else {
$this->actualizar();
}
}
protected function actualizar()
{
$datos = [
'codigo' => $this->datos['codigo'],
'descripcion' => $this->datos['descripcion'],
'id_tipo_facturador_alarma' => $this->datos['id_tipo_facturador_alarma'],
'descripcion_comportamiento'=> $this->datos['descripcion_comportamiento'],
'estado' => $this->datos['estado'],
'estado_actualizado_en' => 'now()'
];
$where = ['id' => $this->datos['id']];
$sql = sql::sql_array_a_update('facturador_alarmas', $datos, $where, $this->entorno()->db());
$this->entorno()->db()->ejecutar($sql);
$this->actualizar_facturador_alarmas_parametros();
}
public function actualizar_facturador_alarmas_parametros()
{
$sql = '';
foreach ($this->datos['facturador_alarmas_parametros'] as $parametros) {
$datos = [
'par_rango_inferior'=> $parametros['par_rango_inferior'],
'par_rango_superior'=> $parametros['par_rango_superior'],
'par_valor' => $parametros['par_valor'],
'par_lista' => $parametros['par_lista']
];
$where = ['id_facturador_alarma' => $this->datos['id']];
$sql .= sql::sql_array_a_update('facturador_alarmas_parametros', $datos, $where, $this->entorno()->db());
}
if ($sql != '') {
$this->entorno()->db()->ejecutar($sql);
}
}
protected function grabar()
{
$datos = [
'codigo' => $this->datos['codigo'],
'descripcion' => $this->datos['descripcion'],
'id_tipo_facturador_alarma' => $this->datos['id_tipo_facturador_alarma'],
'descripcion_comportamiento'=> $this->datos['descripcion_comportamiento'],
'estado' => $this->datos['estado'],
'estado_actualizado_en' => 'now()'
];
$sql = sql::sql_array_a_insert('facturador_alarmas', $datos, $this->entorno()->db());
$this->entorno()->db()->ejecutar($sql);
$seq = $this->entorno()->db()->consultar_fila("SELECT currval('facturador_alarmas_id_seq') as seq;");
$this->datos['id'] = $seq['seq'];
$this->grabar_facturador_alarmas_parametros();
}
protected function grabar_facturador_alarmas_parametros()
{
$sql = '';
foreach ($this->datos['facturador_alarmas_parametros'] as $parametros) {
$datos = [
'par_rango_inferior'=> $parametros['par_rango_inferior'],
'par_rango_superior'=> $parametros['par_rango_superior'],
'par_valor' => $parametros['par_valor'],
'par_lista' => $parametros['par_lista']
];
$sql .= sql::sql_array_a_insert('facturador_alarmas_parametros', $datos, $this->entorno()->db());
}
if ($sql != '') {
$this->entorno()->db()->ejecutar($sql);
}
}
public function evaluar_generacion($id_facturacion, $venta)
{
switch ($this->get_id_tipo_facturador_alarma()) {
case constantes::ID_TIPO_FACTURADOR_ALARMA_VALOR:
if ($venta->get_importe_total() > $this->get_par_valor()) {
$this->guardar_alarma($id_facturacion, $venta);
}
break;
case constantes::ID_TIPO_FACTURADOR_ALARMA_VENTA_ANULADA:
// LAS ALARMAS DE ESTE TIPO SE CREAN A MANO EN LA PANTALLA DE FACTURACION
break;
// AGREGAR OTROS CASE PARA LOS NUEVOS TIPOS DE ALARMAS DE FACTURACION QUE SE DEFINAN
}
}
public function guardar_alarma($id_facturacion, $venta, $motivos = null)
{
//solamente tengo que crear un registro en facturaciones_alarmas_generadas
if (empty($this->alarma_generada)) {
$datos_alarma_generada = [
'id_facturacion' => $id_facturacion,
'id_facturador_alarma' => $this->get_id()
];
$sql = sql::sql_array_a_insert('facturaciones_alarmas_generadas', $datos_alarma_generada, $this->entorno()->db());
$this->entorno()->db()->ejecutar($sql);
$id = $this->entorno()->db()->ultimo_insert_id("facturaciones_alarmas_generadas_id_seq");
$this->alarma_generada = [
'id' => $id,
'id_facturacion' => $id_facturacion,
'id_facturador_alarma' => $this->get_id()
];
}
$sql = "INSERT INTO facturaciones_alarmas_generadas_ventas (id_facturacion_alarma_generada, id_venta, motivos) "
. "VALUES (" . $this->alarma_generada['id'] . ", " . $venta->get_id() . ",'$motivos');";
$this->entorno()->db()->ejecutar($sql);
}
}
lib-develop/src/siu/sq/lib/modelo/facturador_cursos_extension.php 0000664 0000000 0000000 00000000463 14430530062 0025654 0 ustar 00root root 0000000 0000000 id_tipo_servicio = constantes::ID_TIPO_SERVICIO_EXTENSION;
}
}
lib-develop/src/siu/sq/lib/modelo/facturador_grado_virtual.php 0000664 0000000 0000000 00000000454 14430530062 0025104 0 ustar 00root root 0000000 0000000 id_tipo_servicio = constantes::ID_TIPO_SERVICIO_GRADO;
}
}
lib-develop/src/siu/sq/lib/modelo/facturador_interface.php 0000664 0000000 0000000 00000000360 14430530062 0024176 0 ustar 00root root 0000000 0000000 id_tipo_servicio = constantes::ID_TIPO_SERVICIO_POSGRADO;
}
}
lib-develop/src/siu/sq/lib/modelo/log_interaccion_externa.php 0000664 0000000 0000000 00000011332 14430530062 0024712 0 ustar 00root root 0000000 0000000 datos['id'] = null;
$this->datos['tipo'] = null;
$this->datos['sistema_externo'] = null;
$this->datos['ocurrido_en'] = 'now()';
$this->datos['mensaje'] = null;
$this->datos['recurso'] = null;
$this->datos['verbo'] = null;
$this->datos['codigo_procesamiento'] = constantes::LOG_INTERACCION_EXTERNA_CODIGO_PROCESAMIENTO_NUEVO;
$this->datos['mensaje_procesamiento'] = '';
}
protected function cargar($id)
{
$this->datos = lib::catalogo_daos()->log_interacciones_externas()->get($id);
if ($this->datos == null) {
throw new error_negocio("El log de interacción externa que intenta procesar no es válido");
}
}
protected function validar()
{
// Controlar que esten cargados los datos basicos
$campos_obligatorios = array(
'tipo',
'sistema_externo',
'ocurrido_en',
'mensaje'
);
$this->validar_campos_obligatorios($this->datos, $campos_obligatorios, __CLASS__);
}
public function guardar()
{
$this->validar();
if ($this->get_id() != null) {
$this->actualizar_log();
} else {
$this->grabar_log();
}
}
protected function grabar_log()
{
$datos = array(
'tipo' => $this->get_tipo(),
'sistema_externo' => $this->get_sistema_externo(),
'ocurrido_en' => $this->get_ocurrido_en(),
'mensaje' => $this->get_mensaje(),
'recurso' => $this->get_recurso(),
'verbo' => $this->get_verbo(),
'codigo_procesamiento' => $this->get_codigo_procesamiento(),
'mensaje_procesamiento' => $this->get_mensaje_procesamiento(),
);
$sql = sql::sql_array_a_insert('log_interacciones_externas', $datos, $this->entorno()->db());
$this->entorno()->db()->ejecutar($sql);
// Obtener el id generado
$sql_consumo_generado = "SELECT id FROM log_interacciones_externas
WHERE id = (SELECT currval('log_interacciones_externas_id_seq'))";
$consumo_generado = $this->entorno()->db()->consultar_fila($sql_consumo_generado);
$this->datos['id'] = $consumo_generado['id'];
}
public function actualizar_log()
{
$datos = array(
'ocurrido_en' => 'now()',
'mensaje' => $this->get_mensaje(),
'codigo_procesamiento' => $this->get_codigo_procesamiento(),
'mensaje_procesamiento' => $this->get_mensaje_procesamiento()
);
$where = array('id' => $this->get_id());
$sql = sql::sql_array_a_update('log_interacciones_externas', $datos, $where, $this->entorno()->db());
$this->entorno()->db()->ejecutar($sql);
}
// ----- GETTERS ---- //
public function get_tipo()
{
return $this->datos['tipo'];
}
public function get_sistema_externo()
{
return $this->datos['sistema_externo'];
}
public function get_ocurrido_en()
{
return $this->datos['ocurrido_en'];
}
public function get_mensaje()
{
return $this->datos['mensaje'];
}
public function get_recurso()
{
return $this->datos['recurso'];
}
public function get_verbo()
{
return $this->datos['verbo'];
}
public function get_codigo_procesamiento()
{
return $this->datos['codigo_procesamiento'];
}
public function get_mensaje_procesamiento()
{
return $this->datos['mensaje_procesamiento'];
}
// ----- SETTERS ---- //
public function set_tipo($tipo)
{
$this->datos['tipo'] = $tipo;
}
public function set_sistema_externo($sistema_externo)
{
$this->datos['sistema_externo'] = $sistema_externo;
}
public function set_ocurrido_en($fecha)
{
$this->datos['ocurrido_en'] = $fecha;
}
public function set_mensaje($mensaje)
{
$this->datos['mensaje'] = $mensaje;
}
public function set_recurso($recurso)
{
$this->datos['recurso'] = $recurso;
}
public function set_verbo($verbo)
{
$this->datos['verbo'] = $verbo;
}
private function set_codigo_procesamiento($codigo)
{
$this->datos['codigo_procesamiento'] = $codigo;
}
private function set_mensaje_procesamiento($mensaje)
{
$this->datos['mensaje_procesamiento'] = $mensaje;
}
}
lib-develop/src/siu/sq/lib/modelo/modelo.php 0000664 0000000 0000000 00000003202 14430530062 0021301 0 ustar 00root root 0000000 0000000 entorno = $entorno;
$this->inicializar();
if ($id !== null) {
$this->cargar($id);
}
}
// Metodo opcional
protected function cargar($id)
{
}
protected function validar_campos_obligatorios($datos, $campos_obligatorios, $prefijo_desc = '')
{
$error_obligatorios = false;
foreach ($campos_obligatorios as $nombre_campo) {
if (!in_array($nombre_campo, $datos, true)
and (!isset($datos[$nombre_campo])
or $datos[$nombre_campo] === null)) {
$error_obligatorios[] = $nombre_campo;
}
}
if ($error_obligatorios) {
throw new error_negocio($prefijo_desc . ": Los siguientes campos son obligatorios: '"
. implode("', '", $error_obligatorios) . "'.");
}
}
protected function entorno()
{
return $this->entorno;
}
public function get_id()
{
return $this->datos['id'];
}
public function set_id($id)
{
$this->datos['id'] = $id;
}
public function es_alta()
{
return $this->es_alta;
}
public function set_es_alta($es_alta)
{
$this->es_alta = $es_alta;
}
// Metodos obligatorios
abstract protected function inicializar();
abstract protected function validar();
abstract public function guardar();
}
lib-develop/src/siu/sq/lib/modelo/notificacion.php 0000664 0000000 0000000 00000044317 14430530062 0022503 0 ustar 00root root 0000000 0000000 entorno = $entorno;
$this->inicializar();
if ($dao_notificaciones !== null) {
$this->dao_notificaciones = $dao_notificaciones;
}
if ($id !== null) {
$this->cargar($id);
}
}
// Permite que los mails online se envien a traves de un proceso externo (el cual se debera ejecutar manualmente por fuera)
public function set_proceso_envio(proceso_enviar_emails $proceso)
{
$this->proceso_envio = $proceso;
}
public function set_id_tipo_notificacion($id_tipo_notificacion)
{
$this->datos['id_tipo_notificacion'] = $id_tipo_notificacion;
$this->tipo_notificacion = $this->dao_notificaciones->get_tipo_notificacion($id_tipo_notificacion);
$this->template_tema = $this->tipo_notificacion['tema'];
$this->template_mensaje = $this->tipo_notificacion['mensaje'];
}
public function get_id_cliente()
{
return $this->datos['par_id_cliente'];
}
public function get_id_tipo_notificacion()
{
return $this->datos['id_tipo_notificacion'];
}
public function get_tema()
{
return $this->datos['tema'];
}
public function get_notificado_a()
{
return $this->datos['notificado_a'];
}
public function get_mensaje()
{
return $this->datos['mensaje'];
}
public function set_id_cliente($id_cliente)
{
$this->datos['par_id_cliente'] = $id_cliente;
}
public function set_tema($tema)
{
$this->datos['tema'] = $tema;
}
public function set_mensaje($mensaje)
{
$this->datos['mensaje'] = $mensaje;
}
public function set_enviada_en($enviada_en)
{
$this->datos['enviada_en'] = $enviada_en;
}
public function set_enviada_por($enviada_por)
{
$this->datos['enviada_por'] = $enviada_por;
}
public function set_id_servicio_suscripcion($id_servicio_suscripcion)
{
$this->datos['par_id_servicio_suscripcion'] = $id_servicio_suscripcion;
}
public function set_id_venta($id_venta)
{
$this->datos['par_id_venta'] = $id_venta;
}
public function get_id_venta()
{
return $this->datos['par_id_venta'];
}
public function set_id_solicitud_consumo_externo($id_solicitud_consumo_externo)
{
$this->datos['par_id_solicitud_consumo_externo'] = $id_solicitud_consumo_externo;
}
public function get_id_solicitud_consumo_externo()
{
return $this->datos['par_id_solicitud_consumo_externo'];
}
public function set_notificado_a($email)
{
$this->datos['notificado_a'] = $email;
}
public function set_usuario($usuario)
{
$this->datos['par_usuario'] = $usuario;
}
public function get_dao_notificaciones()
{
return $this->dao_notificaciones;
}
public function set_dao_notificaciones($dao_notificaciones)
{
$this->dao_notificaciones = $dao_notificaciones;
}
public function es_on_line()
{
return isset($this->tipo_notificacion) && $this->tipo_notificacion['momento_envio'] == 'O';
}
protected function inicializar()
{
$this->datos['id'] = null;
$this->datos['id_tipo_notificacion'] = null;
$this->datos['creada_en'] = 'now()';
$this->datos['notificado_a'] = null;
$this->datos['par_id_cliente'] = null;
$this->datos['par_id_servicio_suscripcion'] = null;
$this->datos['par_id_venta'] = null;
$this->datos['par_usuario'] = null;
$this->datos['par_id_solicitud_consumo_externo'] = null;
$this->datos['tema'] = null;
$this->datos['mensaje'] = null;
$this->datos['enviada_en'] = null;
$this->datos['enviada_por'] = null;
$this->tipo_notificacion = null;
$this->template_tema = null;
$this->template_mensaje = null;
$this->dao_notificaciones = lib::catalogo_daos()->notificaciones();
}
protected function cargar($id)
{
$this->datos = $this->dao_notificaciones->get($id);
$this->tipo_notificacion = $this->datos['tipo_notificacion'];
$this->template_tema = $this->tipo_notificacion['tema'];
$this->template_mensaje = $this->tipo_notificacion['mensaje'];
}
private function cargar_templates()
{
$this->tipo_notificacion = $this->dao_notificaciones->get_tipo_notificacion($this->datos['id_tipo_notificacion']);
$this->template_tema = $this->tipo_notificacion['tema'];
$this->template_mensaje = $this->tipo_notificacion['mensaje'];
}
protected function validar()
{
// Controlar que esten cargados los datos basicos
$campos_obligatorios = [
'id_tipo_notificacion',
'creada_en',
'tema',
'mensaje'
];
//agrego los campos obligatorios segun el tipo de notificacion
if (!is_null($this->tipo_notificacion['parametros'])) {
$campos_obligatorios = array_merge($campos_obligatorios, explode(',', $this->tipo_notificacion['parametros']));
}
$this->validar_campos_obligatorios($this->datos, $campos_obligatorios, __CLASS__);
}
public function guardar()
{
$this->validar();
if (is_null($this->datos['id'])) {
$this->grabar_notificacion();
} else {
$this->actualizar_notificacion();
}
if (is_null($this->datos['enviada_en']) && $this->es_on_line() && !$this->proceso_envio) {
$this->enviar_email();
}
}
protected function grabar_notificacion()
{
$datos = [
'id_tipo_notificacion' => $this->datos['id_tipo_notificacion'],
'creada_en' => 'now()',
'notificado_a' => $this->datos['notificado_a'],
'tema' => $this->datos['tema'],
'mensaje' => $this->datos['mensaje'],
'enviada_en' => $this->datos['enviada_en'],
'enviada_por' => $this->datos['enviada_por']
];
// Agregar parametros obligatorios a los datos
$campos_obligatorios = explode(',', $this->tipo_notificacion['parametros']);
foreach ($campos_obligatorios as $campo) {
$datos[ $campo ] = $this->datos[ $campo ];
}
$sql = sql::sql_array_a_insert('notificaciones', $datos, $this->entorno()->db());
$this->entorno()->db()->ejecutar($sql);
// Consultar el valor de la secuencia generada
$this->datos['id'] = $this->entorno()->db()->ultimo_insert_id("notificaciones_id_seq");
}
public function eliminar()
{
$where = " where id = " . $this->datos['id'];
$sql = sql::sql_array_tablas_delete(['notificaciones' => $where]);
$this->entorno()->db()->ejecutar($sql);
}
protected function actualizar_notificacion()
{
$datos = [
'id_tipo_notificacion' => $this->datos['id_tipo_notificacion'],
'notificado_a' => $this->datos['notificado_a'],
'tema' => $this->datos['tema'],
'mensaje' => $this->datos['mensaje'],
'enviada_en' => $this->datos['enviada_en'],
'enviada_por' => $this->datos['enviada_por']
];
// Agregar parametros obligatorios a los datos
$campos_obligatorios = explode(',', $this->tipo_notificacion['parametros']);
foreach ($campos_obligatorios as $campo) {
$datos[ $campo ] = $this->datos[ $campo ];
}
$where = ['id' => $this->datos['id']];
$sql = sql::sql_array_a_update('notificaciones', $datos, $where, $this->entorno()->db());
$this->entorno()->db()->ejecutar($sql);
}
public function armar_tema($descripcion)
{
if (is_null($this->template_tema)) {
$this->cargar_templates();
}
$this->datos['tema'] = str_replace('%1', $descripcion, $this->template_tema);
}
public function armar_mensaje(array $datos_mensaje)
{
if (is_null($this->template_mensaje)) {
$this->cargar_templates();
}
$mensaje_pers = $mensaje = "";
//ARMO EL MENSAJE SEGUN EL TIPO DE NOTIFICACION
if ($this->tipo_notificacion['rol'] == constantes::ROL_CLIENTE) {
if (isset($this->datos['par_id_venta'])) {
$info_personalizada = lib::catalogo_daos()->ventas()->get_info_personalizada_por_entidad($this->datos['par_id_venta'], constantes::VENTAS_INFO_PERSONALIZADA_ENTIDAD_MENSAJE_TIPO_NOTIFICACION);
if ($info_personalizada) {
$mensaje_pers = $this->template_mensaje;
foreach ($info_personalizada as $info_personalizada_tipo_notificacion) {
if ($info_personalizada_tipo_notificacion->codigo == $this->tipo_notificacion['codigo']) {
//$hay_info_personalizada = true;
for ($i = 0; $i < count($info_personalizada_tipo_notificacion->comodines); $i++) {
// Armar el mensaje dinamico
$mensaje_pers = str_replace('{' . $info_personalizada_tipo_notificacion->comodines[$i]->clave .'}', $info_personalizada_tipo_notificacion->comodines[$i]->valor, $mensaje_pers);
}
}
}
}
} else {
$msg = "No se pudo encontrar el valor 'par_id_venta' para obtener la info personalizada para la notificación.";
lib::entorno()->log()->warn(__METHOD__ . ": " . $msg);
}
}
if ($this->datos['id_tipo_notificacion'] == constantes::TIPO_NOTIFICACION_MORA ||
$this->datos['id_tipo_notificacion'] == constantes::TIPO_NOTIFICACION_VENTA ||
$this->datos['id_tipo_notificacion'] == constantes::TIPO_NOTIFICACION_CUPON_PAGO) {
$tabla_html = "";
foreach ($datos_mensaje as $venta) {
$tabla_html .= "";
$texto_fila = $this->template_mensaje;
if (isset($venta['leyenda'])) {
$texto_fila = str_replace('%1', $venta['leyenda'], $texto_fila);
}
if (isset($venta['cobranza_vence_en'])) {
$texto_fila = str_replace('%2', date('d-m-Y', strtotime($venta['cobranza_vence_en'])), $texto_fila);
}
$texto_fila = str_replace('%3', $venta['importe_total'], $texto_fila);
if (isset($venta['realizada_en'])) {
$texto_fila = str_replace('%4', date('d-m-Y', strtotime($venta['realizada_en'])), $texto_fila);
}
$tabla_html .= "$texto_fila | ";
$tabla_html .= "
";
}
$tabla_html .= "
";
$mensaje = $tabla_html;
} elseif ($this->datos['id_tipo_notificacion'] == constantes::TIPO_NOTIFICACION_REINTEGRO_MERCADO_PAGO ||
$this->datos['id_tipo_notificacion'] == constantes::TIPO_NOTIFICACION_CREDITO ||
$this->datos['id_tipo_notificacion'] == constantes::TIPO_NOTIFICACION_REINTEGRO_PAY_PER_TIC) {
//si es una devolucion supongo que me va a llegar una unica venta
$venta = $datos_mensaje[0];
$mensaje = str_replace('%1', $venta['leyenda'], $this->template_mensaje);
$mensaje = str_replace('%2', $venta['servicio_version_descripcion'], $mensaje);
} elseif ($this->datos['id_tipo_notificacion'] == constantes::TIPO_NOTIFICACION_ERROR_PROCESO) {
$mensaje = str_replace('%1', $datos_mensaje['descripcion'], $this->template_mensaje);
$mensaje = str_replace('%2', $datos_mensaje['id_ejecucion'], $mensaje);
$mensaje = str_replace('%3', date("H:i:s"), $mensaje);
} elseif ($this->datos['id_tipo_notificacion'] == constantes::TIPO_NOTIFICACION_TRANSFERENCIA_BANCARIA) {
$mensaje = str_replace('%1', $datos_mensaje['ventas']['leyenda'], $this->template_mensaje);
$tabla_html = "";
foreach ($datos_mensaje['datos_bancarios'] as $cuenta_bancaria) {
$tabla_html .= "";
$banco = "Banco: " . $cuenta_bancaria['descripcion'] . ".";
$banco .= "
CBU: " . $cuenta_bancaria['cbu'];
if ($cuenta_bancaria['alias']) {
$banco .= "
ALIAS: " . $cuenta_bancaria['alias'];
}
$banco .= "
";
$tabla_html .= "$banco | ";
$tabla_html .= "
";
}
$tabla_html .= "
";
$mensaje = str_replace('%2', $tabla_html, $mensaje);
} elseif ($this->datos['id_tipo_notificacion'] == constantes::TIPO_NOTIFICACION_AVISO_ALUMNO_POSGRADO || $this->datos['id_tipo_notificacion'] == constantes::TIPO_NOTIFICACION_AVISO_ALUMNO_GRADO) {
$mensaje = str_replace('%2', $datos_mensaje['descripcion'], $this->template_mensaje);
$mensaje = str_replace('%3', $datos_mensaje['id_tramite_ref'], $mensaje);
} elseif ($this->datos['id_tipo_notificacion'] == constantes::TIPO_NOTIFICACION_ENVIO_FACTURA_ELECTRONICA) {
$this->template_mensaje = (!empty($mensaje_pers)) ? $mensaje_pers : $this->template_mensaje ;
$mensaje = null;
if (!empty($datos_mensaje['comprobantes'])) {
foreach ($datos_mensaje['comprobantes'] as $comp) {
$mensaje_parcial = str_replace('{comprobante_venta}', $comp['venta'], $this->template_mensaje);
$mensaje_parcial = str_replace('{comprobante_numero}', $comp['numero_comprobante'], $mensaje_parcial);
$mensaje_parcial = str_replace('{comprobante_fecha}', substr($comp['fecha'], 0, strrpos($comp['fecha'], '.')), $mensaje_parcial);
$mensaje_parcial = str_replace('{comprobante_importe}', $comp['importe'], $mensaje_parcial);
$mensaje_parcial = str_replace('{comprobante_cae}', $comp['cae'], $mensaje_parcial);
if (isset($comp['cliente_razon_social'])){
$mensaje_parcial = str_replace('{cliente_razon_social}', $comp['cliente_razon_social'], $mensaje_parcial);
}
$breaks = empty($mensaje) ? '' : '
';
$mensaje = $mensaje . $breaks . $mensaje_parcial;
}
}
} elseif ($this->datos['id_tipo_notificacion'] == constantes::TIPO_NOTIFICACION_VENTA_COBRADA_ANULADA) {
$this->template_mensaje = (!empty($mensaje_pers)) ? $mensaje_pers : $this->template_mensaje ;
$this->datos['tema'] = utf8_e_seguro($this->datos['tema']);
if (!empty($datos_mensaje['comprobantes'])) {
$mensaje = null;
foreach ($datos_mensaje['comprobantes'] as $comp) {
$mensaje_parcial = str_replace('{comprobante_venta}', $comp['venta'], $this->template_mensaje);
$mensaje_parcial = str_replace('{comprobante_numero}', $comp['numero_comprobante'], $mensaje_parcial);
$mensaje_parcial = str_replace('{comprobante_fecha_cobro}', $comp['fecha_cobro'], $mensaje_parcial);
$mensaje_parcial = str_replace('{comprobante_fecha_anulacion}', $comp['fecha_anulacion'], $mensaje_parcial);
$mensaje_parcial = str_replace('{comprobante_nota_credito}', $comp['nota_credito'], $mensaje_parcial);
$mensaje_parcial = str_replace('{comprobante_importe}', $comp['importe'], $mensaje_parcial);
$mensaje_parcial = str_replace('{comprobante_cae}', $comp['cae'], $mensaje_parcial);
$mensaje_parcial = str_replace('{comprobante_cae_nota}', $comp['cae_nota'], $mensaje_parcial);
$mensaje_parcial = str_replace('{cliente_razon_social}', $comp['cliente_razon_social'], $mensaje_parcial);
// Para evitar multiples br que aparecen dependiendo del mensaje de tipo de notificacion y si hay varias cobranzas
$mensaje_parcial = str_replace('
', '
', $mensaje_parcial);
$breaks = empty($mensaje) ? '' : '
';
$mensaje = $mensaje . $breaks . utf8_e_seguro($mensaje_parcial);
}
}
} elseif ($this->datos['id_tipo_notificacion'] == constantes::TIPO_NOTIFICACION_COMPROBANTE_TRANSFERENCIA_RECHAZADO) {
$mensaje = str_replace('%1', $datos_mensaje['venta'], $this->template_mensaje);
} elseif (in_array($this->datos['id_tipo_notificacion'], [constantes::TIPO_NOTIFICACION_NUEVA_RECAUDACION, constantes::TIPO_NOTIFICACION_RECAUDACION_ANULADA])) {
$mensaje = str_replace('%1', $datos_mensaje['id_pilaga'], $this->template_mensaje);
$mensaje = str_replace('%2', $datos_mensaje['descripcion_especifica_recaudacion'], $mensaje);
}
$this->datos['mensaje'] = $mensaje;
}
public function enviar_email()
{
try {
$mailer = lib::mailer();
$email_from = lib::parametros_sistema()->get_valor(constantes::PARAMETROS_SISTEMA_CODIGO_EMAIL_SENDER);
$email_from_name = lib::parametros_sistema()->get_valor(constantes::PARAMETROS_SISTEMA_CODIGO_EMAIL_FROM_NAME);
$mailer->set_from($email_from, $email_from_name);
$mailer->enviar_email($this->get_tema(), $this->get_mensaje(), $this->get_notificado_a());
$this->set_enviada_en('now()');
$this->set_enviada_por($email_from_name);
$this->guardar();
} catch (\Exception $ex) {
$this->entorno()->log()->err("NOTIFICACION: Error al enviar el email on-line: " . $ex->getMessage());
}
}
}
lib-develop/src/siu/sq/lib/modelo/parametro_sistema.php 0000664 0000000 0000000 00000004552 14430530062 0023552 0 ustar 00root root 0000000 0000000 datos['valor'] = $valor;
}
protected function inicializar()
{
$this->datos['id'] = null;
$this->datos['codigo'] = null;
$this->datos['descripcion'] = null;
$this->datos['categoria'] = null;
$this->datos['valor'] = null;
$this->datos['valor_default'] = null;
}
protected function cargar($id)
{
$this->datos = lib::catalogo_daos()->parametros_sistema()->get($id);
}
protected function validar()
{
// Controlar que esten cargados los datos basicos
$campos_obligatorios = [
'codigo',
'descripcion',
'categoria',
'valor_default'
];
$this->validar_campos_obligatorios($this->datos, $campos_obligatorios, __CLASS__);
}
public function guardar()
{
$this->validar();
if (is_null($this->datos['id'])) {
$this->grabar_parametro();
} else {
$this->actualizar_parametro();
}
}
public function grabar_parametro()
{
$datos = [
'codigo' => $this->datos['codigo'],
'descripcion' => $this->datos['descripcion'],
'categoria' => $this->datos['categoria'],
'valor' => $this->datos['valor'],
'valor_default' => $this->datos['valor_default']
];
$sql = sql::sql_array_a_insert('parametros_sistema', $datos, $this->entorno()->db());
$this->entorno()->db()->ejecutar($sql);
// Consultar el valor de la secuencia generada
$this->datos['id'] = $this->entorno()->db()->ultimo_insert_id("parametros_sistema_id_seq");
}
public function actualizar_parametro()
{
$datos = [
'codigo' => $this->datos['codigo'],
'descripcion' => $this->datos['descripcion'],
'categoria' => $this->datos['categoria'],
'valor' => $this->datos['valor'],
'valor_default' => $this->datos['valor_default']
];
$where = ['id' => $this->datos['id']];
$sql = sql::sql_array_a_update('parametros_sistema', $datos, $where, $this->entorno()->db());
$this->entorno()->db()->ejecutar($sql);
}
}
lib-develop/src/siu/sq/lib/modelo/procesos_ejecuciones.php 0000664 0000000 0000000 00000012117 14430530062 0024240 0 ustar 00root root 0000000 0000000 datos['id'] = null;
$this->datos['id_proceso'] = null;
$this->datos['total_a_procesar'] = 0;
$this->datos['procesados_ok'] = 0;
$this->datos['procesados_error'] = 0;
$this->datos['iniciado_en'] = "now()";
$this->datos['finalizado_en'] = null;
$this->datos['id_proceso_ejecucion_estado'] = null;
$this->datos['descripcion'] = null;
}
protected function cargar($id_ejecucion)
{
$proceso_ejecucion = lib::catalogo_daos()->procesos()->get_procesos_ejecuciones(['id' => $id_ejecucion]);
if (!empty($proceso_ejecucion)) {
$this->datos = $proceso_ejecucion[0];
} else {
$msg = "La ejecución del proceso '" . $id_ejecucion . "'' que intenta cargar no existe.";
lib::entorno()->log()->error(__METHOD__ . ": " . $msg);
throw new error_not_found($msg);
}
}
protected function validar()
{
$campos_obligatorios = array(
'id_proceso',
'id_proceso_ejecucion_estado'
);
$this->validar_campos_obligatorios($this->datos, $campos_obligatorios, __CLASS__);
}
public function guardar()
{
$this->validar();
if ($this->datos['id'] !== null) {
$this->actualizar();
} else {
$this->grabar();
}
return $this->datos['id'];
}
private function grabar()
{
$datos = [
'id_proceso' => $this->datos['id_proceso'],
'total_a_procesar' => $this->datos['total_a_procesar'],
'procesados_ok' => $this->datos['procesados_ok'],
'procesados_error' => $this->datos['procesados_error'],
'iniciado_en' => $this->datos['iniciado_en'],
'finalizado_en' => $this->datos['finalizado_en'],
'id_proceso_ejecucion_estado' => $this->datos['id_proceso_ejecucion_estado'],
'descripcion' => $this->datos['descripcion']
];
$sql = sql::sql_array_a_insert('procesos_ejecuciones', $datos, $this->entorno()->db());
$this->entorno()->db()->ejecutar($sql);
$seq = $this->entorno()->db()->consultar_fila("SELECT currval('procesos_ejecuciones_id_seq') as seq;");
$this->datos['id'] = $seq['seq'];
}
private function actualizar()
{
$datos = [
'id_proceso' => $this->datos['id_proceso'],
'total_a_procesar' => $this->datos['total_a_procesar'],
'procesados_ok' => $this->datos['procesados_ok'],
'procesados_error' => $this->datos['procesados_error'],
'iniciado_en' => $this->datos['iniciado_en'],
'finalizado_en' => $this->datos['finalizado_en'],
'id_proceso_ejecucion_estado' => $this->datos['id_proceso_ejecucion_estado'],
'descripcion' => $this->datos['descripcion']
];
$where = ['id' => $this->get_id()];
$sql = sql::sql_array_a_update('procesos_ejecuciones', $datos, $where, $this->entorno()->db());
$this->entorno()->db()->ejecutar($sql);
}
public function set_id_proceso($id)
{
$this->datos['id_proceso'] = $id;
}
public function get_id_proceso()
{
return $this->datos['id_proceso'];
}
public function set_total_a_procesar($total_a_procesar)
{
$this->datos['total_a_procesar'] = $total_a_procesar;
}
public function get_total_a_procesar()
{
return $this->datos['total_a_procesar'];
}
public function set_procesados_ok($id)
{
$this->datos['procesados_ok'] = $id;
}
public function get_procesados_ok()
{
return $this->datos['procesados_ok'];
}
public function set_procesados_error($id)
{
$this->datos['procesados_error'] = $id;
}
public function get_procesados_error()
{
return $this->datos['procesados_error'];
}
public function set_finalizado_en($id)
{
$this->datos['finalizado_en'] = $id;
}
public function get_finalizado_en()
{
return $this->datos['finalizado_en'];
}
public function set_descripcion($descripcion)
{
$this->datos['descripcion'] = $descripcion;
}
public function get_descripcion()
{
return $this->datos['descripcion'];
}
public function set_id_proceso_ejecucion_estado($id)
{
$this->datos['id_proceso_ejecucion_estado'] = $id;
}
public function get_id_proceso_ejecucion_estado()
{
return $this->datos['id_proceso_ejecucion_estado'];
}
}
lib-develop/src/siu/sq/lib/modelo/reloj.php 0000664 0000000 0000000 00000033117 14430530062 0021145 0 ustar 00root root 0000000 0000000 cargar_meses();
$this->cargar_anios();
$this->id_meses_excepciones = array();
}
public function __construct($entorno, $id = null, $id_periodo_fact_excepciones = null)
{
$this->entorno = $entorno;
$this->inicializar();
if ($id_periodo_fact_excepciones !== null) {
$this->cargar_periodos_facturacion_excepciones($id_periodo_fact_excepciones);
}
$this->datos = $this->cargar($id);
}
private function cargar_periodos_facturacion_excepciones($id_periodo_fact_excepciones)
{
$sql = "SELECT id_mes
FROM meses_por_periodo_facturacion_excepciones fe
WHERE fe.id_periodo_facturacion_excepcion = "
. $this->entorno()->db()->quote($id_periodo_fact_excepciones) . ";";
$excepciones = $this->entorno()->db()->consultar($sql);
foreach ($excepciones as $mes) {
$this->id_meses_excepciones[] = $mes['id_mes'];
}
}
protected function cargar($id_reloj = null, $filtro = array())
{
if ($id_reloj !== null) {
$filtro['id'] = $id_reloj;
} else {
if (!isset($this->id_reloj)) {
$filtro['id_reloj_facturador_estado'] = constantes::RELOJ_FACTURACION_ESTADO_ACTUAL;
}
}
$datos = lib::catalogo_daos()->reloj_faturador()->obtener_reloj($filtro);
if ($datos) {
$this->id_reloj = $datos['id'];
} else {
$error = implode(', ', array_map(function ($v, $k) {
return $k . '=' . $v;
}, $filtro, array_keys($filtro)));
throw new error_negocio("RELOJ: No se pudo cargar el reloj con el filtro: " . $error);
}
return $datos;
}
public function get_descripcion_anio()
{
foreach ($this->anios as $anio) {
if ($anio['id'] == $this->datos['id_anio']) {
return $anio['codigo'];
}
}
}
public function get_descripcion_mes()
{
foreach ($this->meses as $mes) {
if ($mes['id'] == $this->datos['id_mes']) {
return $mes['codigo'];
}
}
}
public function get_actual()
{
return $this->id_reloj;
}
// El valor 'posicion' es cero o numero positivo. Si es cero devuelve el
// ID del reloj seteado en el constructor
public function get_reloj($posicion = 0, $id_frecuencia = null)
{
// Obtengo el anio y mes del reloj ingresado al constructor
$id_mes = $this->datos['id_mes'];
$id_anio = $this->datos['id_anio'];
// Obtener la cantidad de meses que representa el $id_frecuencia
if ($id_frecuencia) {
$frecuencia = $this->get_frecuencia_facturacion($id_frecuencia);
} else {
$frecuencia = null;
}
// Si hay posicion seteada busco el id del mes
if ($posicion != 0) {
for ($p = 0 ; $p < $posicion ; $p++) {
// Si la frecuencia esta seteada afecta los meses
if ($frecuencia) {
for ($i = 0 ; $i < $frecuencia['cantidad_meses'] ; $i++) {
// Sumar un mes al mes y año del reloj actual.
$datos = $this->get_proximo_mes_y_anio($id_mes, $id_anio);
$id_mes = $datos['id_mes'];
$id_anio = $datos['id_anio'];
}
} else {
$datos = $this->get_proximo_mes_y_anio($id_mes, $id_anio);
$id_mes = $datos['id_mes'];
$id_anio = $datos['id_anio'];
}
$datos = $this->cargar(null, array('id_mes' => $id_mes, 'id_anio' => $id_anio));
}
$id = $datos['id'];
} else {
$id = $this->id_reloj;
}
return $id;
}
/*
* Actualiza el estado del reloj actual a EJECUTADO
* Obtiene el proximo reloj y lo deja como ACTUAL
*/
public function avanzar()
{
//validar que existen 24 relojes posteriores al actual
//y si no existen crear los que hagan falta.
if (!$this->existen_relojes_posteriores()) {
$this->crear_relojes_faltantes();
}
// Actualizar el reloj
$where = array("id" => $this->id_reloj);
$datos = array("id_reloj_facturador_estado" => constantes::RELOJ_FACTURACION_ESTADO_EJECUTADO);
$sql = sql::sql_array_a_update("reloj_facturador", $datos, $where, $this->entorno()->db());
$this->entorno()->db()->ejecutar($sql);
$where = array("id" => $this->get_reloj(1));
$datos = array("id_reloj_facturador_estado" => constantes::RELOJ_FACTURACION_ESTADO_ACTUAL);
$sql = sql::sql_array_a_update("reloj_facturador", $datos, $where, $this->entorno()->db());
$this->entorno()->db()->ejecutar($sql);
}
/**
* Valida que existan los relojes de facturación necesarios para alcanzar
* el buffer deseado específicado en los parámetros de sistema.
*/
public function existen_relojes_posteriores()
{
$cant_relojes_necesarios = lib::parametros_sistema()->get_valor(constantes::BUFFER_RELOJES);
$cant_relojes_posteriores = lib::catalogo_daos()->reloj_faturador()
->obtener_cantidad_de_relojes_posteriores_al_actual();
return $cant_relojes_posteriores >= $cant_relojes_necesarios;
}
/**
* Genera los relojes de facturación necesarios para alcanzar
* el buffer deseado específicado en los parámetros de sistema.
*/
public function crear_relojes_faltantes()
{
$cant_relojes_necesarios = lib::parametros_sistema()->get_valor(constantes::BUFFER_RELOJES);
$relojes_faltantes = $cant_relojes_necesarios - lib::catalogo_daos()->reloj_faturador()
->obtener_cantidad_de_relojes_posteriores_al_actual();
$ultimo_reloj = lib::catalogo_daos()->reloj_faturador()
->obtener_ultimo_reloj();
$ultimo = [
'mes' => $ultimo_reloj['numero_mes'],
'anio' => $ultimo_reloj['numero_anio'],
];
for ($i = 0; $i < ($relojes_faltantes); $i++) {
//si es el mes 12 tengo que comenzar a insertar los relojes para el siguiente año
if ($ultimo["mes"] == 12) {
$ultimo_anio = $ultimo['anio'] + 1;
$anio = lib::catalogo_daos()->reloj_faturador()->obtener_anio(['numero_anio' => $ultimo_anio]);
if (is_null($anio)) { // si no existe el año siguiente lo inserto en la base
$datos_anio = [
'codigo' => $ultimo_anio,
'descripcion' => 'Año siguiente al ' . $ultimo['anio'],
'anio' => $ultimo_anio
];
$sql = sql::sql_array_a_insert('anios', $datos_anio, $this->entorno()->db());
$this->entorno()->db()->ejecutar($sql);
$anio = lib::catalogo_daos()->reloj_faturador()->obtener_anio(['numero_anio' => $ultimo_anio]);
}
$mes = lib::catalogo_daos()->reloj_faturador()->obtener_mes(['numero_mes' => 1]); //obtengo el primer mes del año
} else {
$anio = lib::catalogo_daos()->reloj_faturador()->obtener_anio(['numero_anio' => $ultimo['anio']]);
$mes = lib::catalogo_daos()->reloj_faturador()->obtener_mes(['numero_mes' => $ultimo['mes'] + 1]); //obtengo el mes siguiente al último generado
}
//insert row reloj facturador
$datos_reloj = [
'codigo' => substr($mes['descripcion'], 0, 3) . "." . $anio['anio'],
'descripcion' => $mes['descripcion'] . " " . $anio['anio'],
'id_anio' => $anio['id'],
'id_mes' => $mes['id'],
'dia_inicio_facturacion' => 1,
'dia_limite_facturacion' => lib::parametros_sistema()->get_valor(constantes::PARAMETROS_SISTEMA_FACTURACION_LIMITE),
'id_reloj_facturador_estado' => constantes::RELOJ_FACTURACION_ESTADO_NOINICIADO,
'creado_por' => constantes::USUARIO_INTERNO_SQ_UV,
'creado_en' => 'now()'
];
$sql = sql::sql_array_a_insert('reloj_facturador', $datos_reloj, $this->entorno()->db());
$this->entorno()->db()->ejecutar($sql);
$ultimo['anio'] = $anio['anio'];
$ultimo['mes'] = $mes['numero_mes'];
}
}
public function crear_reloj($anio, $mes)
{
$rs_anio = lib::catalogo_daos()->reloj_faturador()->obtener_anio(['numero_anio' => $anio]);
if (is_null($rs_anio)) { // si no existe el año siguiente lo inserto en la base
$datos_anio = [
'codigo' => $anio,
'descripcion' => $anio,
'anio' => $anio
];
$sql = sql::sql_array_a_insert('anios', $datos_anio, $this->entorno()->db());
$this->entorno()->db()->ejecutar($sql);
$rs_anio = lib::catalogo_daos()->reloj_faturador()->obtener_anio(['numero_anio' => $anio]);
}
$rs_mes = lib::catalogo_daos()->reloj_faturador()->obtener_mes(['numero_mes' => $mes]);
// Crear reloj
$datos_reloj = [
'codigo' => substr($rs_mes['descripcion'], 0, 3) . "." . $rs_anio['anio'],
'descripcion' => $rs_mes['descripcion'] . " " . $rs_anio['anio'],
'id_anio' => $rs_anio['id'],
'id_mes' => $rs_mes['id'],
'dia_inicio_facturacion' => 1,
'dia_limite_facturacion' => lib::parametros_sistema()->get_valor(constantes::PARAMETROS_SISTEMA_FACTURACION_LIMITE),
'id_reloj_facturador_estado' => constantes::RELOJ_FACTURACION_ESTADO_NOINICIADO,
'creado_por' => constantes::USUARIO_INTERNO_SQ_UV,
'creado_en' => 'now()'
];
$sql = sql::sql_array_a_insert('reloj_facturador', $datos_reloj, $this->entorno()->db());
$this->entorno()->db()->ejecutar($sql);
return $this->entorno()->db()->ultimo_insert_id("reloj_facturador_id_seq");
}
//-------------------- MESES Y ANIOS --------------------------------------
private function cargar_meses()
{
$sql = "SELECT id, numero_mes, codigo FROM meses ORDER BY numero_mes ASC;";
$this->meses = $this->entorno()->db()->consultar($sql);
}
private function cargar_anios()
{
$sql = "SELECT id, anio, codigo FROM anios ORDER BY anio ASC;";
$this->anios = $this->entorno()->db()->consultar($sql);
}
private function get_proximo_mes_y_anio($id_mes, $id_anio)
{
foreach (array_keys($this->meses) as $idm) {
if ($id_mes == $this->meses[$idm]['id']) {
if ($this->meses[$idm]['numero_mes'] == '12') {
// Reinicio el mes
foreach ($this->meses as $mes) {
if ($mes['numero_mes'] == 1) {
$salida['id_mes'] = $mes['id'];
}
}
// Sumo un anio
foreach (array_keys($this->anios) as $ida) {
if ($id_anio == $this->anios[$ida]['id']) {
if (isset($this->anios[$ida + 1])) {
$salida['id_anio'] = $this->anios[$ida + 1]['id'];
} else {
throw new error_negocio(
"RELOJ: No se pudo determinar el proximo año."
);
}
}
}
} else {
// Sumo un mes y sigo en el mismo anio
if (isset($this->meses[$idm + 1])) {
$salida['id_mes'] = $this->meses[$idm + 1]['id'];
$salida['id_anio'] = $id_anio;
} else {
throw new error_negocio(
"RELOJ: No se pudo determinar el proximo mes."
);
}
}
}
}
// Evaluar si el mes obtenido se encuentra dentro de las excepciones
if (in_array($salida['id_mes'], $this->id_meses_excepciones)) {
return $this->get_proximo_mes_y_anio($salida['id_mes'], $salida['id_anio']);
}
return $salida;
}
public function get_frecuencia_facturacion($id_frecuencia)
{
$sql = "SELECT cantidad_meses FROM frecuencias_facturacion
WHERE id = " . $this->entorno()->db()->quote($id_frecuencia) . ";";
return $this->entorno()->db()->consultar_fila($sql);
}
public function get_numero_mes()
{
foreach ($this->meses as $mes) {
if ($mes['id'] == $this->datos['id_mes']) {
return $mes['numero_mes'];
}
}
}
public function get_numero_anio()
{
foreach ($this->anios as $anio) {
if ($anio['id'] == $this->datos['id_anio']) {
return $anio['anio'];
}
}
}
protected function validar()
{
}
public function guardar()
{
}
}
lib-develop/src/siu/sq/lib/modelo/reloj_instancia.php 0000664 0000000 0000000 00000002572 14430530062 0023177 0 ustar 00root root 0000000 0000000 entorno;
}
public function __construct($entorno, $id_servicio_instancia)
{
$this->entorno = $entorno;
$this->id_servicio_instancia = $id_servicio_instancia;
$this->cargar_reloj();
}
private function cargar_reloj()
{
$sql = "SELECT id_reloj_facturador, id_periodo_facturacion_excepcion
FROM servicios_instancias
WHERE id = " . $this->entorno()->db()->quote($this->id_servicio_instancia)
. ";";
$datos = $this->entorno()->db()->consultar_fila($sql);
$this->reloj = lib::catalogo_modelo()->reloj($datos['id_reloj_facturador'], $datos['id_periodo_facturacion_excepcion']);
}
public function get_reloj($posicion = 0, $id_frecuencia = null)
{
return $this->reloj->get_reloj($posicion, $id_frecuencia);
}
public function crear_reloj($anio, $mes)
{
return $this->reloj->crear_reloj($anio, $mes);
}
public function get_descripcion_anio()
{
return $this->reloj->get_descripcion_anio();
}
public function get_descripcion_mes()
{
return $this->reloj->get_descripcion_mes();
}
}
lib-develop/src/siu/sq/lib/modelo/venta_info_personalizada.php 0000664 0000000 0000000 00000005042 14430530062 0025072 0 ustar 00root root 0000000 0000000 datos['id'] = null;
$this->datos['id_venta'] = null;
$this->datos['datos'] = null;
}
protected function cargar($id_venta)
{
$this->datos = lib::catalogo_daos()->ventas()->get_info_personalizada($id_venta);
if (empty($this->datos)) {
throw new error_not_found(__METHOD__ . " No se pudo recuperar la información personalizada correspondiente al ID de venta $id_venta");
}
}
protected function validar()
{
$campos_obligatorios = ['id_venta','datos'];
$this->validar_campos_obligatorios($this->datos, $campos_obligatorios, __METHOD__);
}
public function guardar()
{
$this->validar();
if (! $this->get_id()) {
$this->entorno()->db()->set_encoding('utf8');
$this->grabar();
$this->entorno()->db()->set_encoding('latin1');
} else {
// No existe ningun caso que requiera su uso
//$this->actualizar();
}
return $this->get_id();
}
private function grabar()
{
$datos = [
'id_venta' => $this->datos['id_venta'],
'datos' => json_encode($this->datos['datos'], JSON_UNESCAPED_UNICODE)
];
if (json_last_error() != JSON_ERROR_NONE) {
$msg = "Error al consumir el JSON del campo 'datos'";
lib::entorno()->log()->error(__METHOD__ . ": Error json (" . json_last_error() . ")" . $msg);
throw new error_negocio($msg);
}
$sql = sql::sql_array_a_insert('ventas_info_personalizada', $datos, $this->entorno()->db());
$this->entorno()->db()->ejecutar($sql);
$this->datos['id'] = $this->entorno()->db()->ultimo_insert_id("ventas_info_personalizada_id_seq");
}
private function actualizar()
{
$datos = [
'datos' => $this->datos['datos']
];
$where = ['id' => $this->get_id()];
$sql = sql::sql_array_a_update('ventas_info_personalizada', $datos, $where, $this->entorno()->db());
$this->entorno()->db()->ejecutar($sql);
}
//--SETTERS
public function set_id_venta($id)
{
$this->datos['id_venta'] = $id;
}
public function set_datos($datos)
{
$this->datos['datos'] = $datos;
}
}
lib-develop/src/siu/sq/lib/modelo/version.php 0000664 0000000 0000000 00000003426 14430530062 0021517 0 ustar 00root root 0000000 0000000 datos['version'] = null;
$this->datos['version_a_migrar'] = null;
}
protected function cargar($id)
{
// Cargar datos de la version actual
$proyecto_ini = parse_ini_file(sq_uv::get_path()."/toba/proyecto.ini", true);
$this->datos['version'] = $proyecto_ini['proyecto']['version'];
}
public function validar()
{
}
public function validar_migrar()
{
// Controlar que esten cargados los datos basicos del sistema externo.
$campos_obligatorios = array(
'version', 'version_a_migrar'
);
$this->validar_campos_obligatorios($this->datos, $campos_obligatorios, __CLASS__);
// Controlar si existe una version con el nombre pasado
// Controlar que la version sea mayor que la version actual
}
public function guardar()
{
// Invocar metodo migrar!
}
public function migrar($version_a_migrar)
{
$this->datos['version_a_migrar'] = $version_a_migrar;
$this->validar_migrar();
$this->activar_modo_mantenimiento();
// Exportar permisos de toba
$this->exportar_metadatos_toba();
// Actualizar los fuentes
//git pull
// Actualizar dependencias
//composer install
//Toba
$this->regenerar_toba(); //toba proyecto regenerar -p sq_uv
// Base negocio (toba proyecto ejecutar_cambios -p sq_uv -v 0.1.1)
$this->ejecutar_versionador();
$this->desactivar_modo_mantenimiento();
}
}
lib-develop/src/siu/sq/lib/procesos/ 0000775 0000000 0000000 00000000000 14430530062 0017672 5 ustar 00root root 0000000 0000000 lib-develop/src/siu/sq/lib/procesos/catalogo.php 0000664 0000000 0000000 00000004210 14430530062 0022171 0 ustar 00root root 0000000 0000000 entorno);
}
public function validar_instalacion($validar_conexiones_sistemas = array(), $imprime_salida = true)
{
return new proceso_validar_instalacion($validar_conexiones_sistemas, $imprime_salida, $this->entorno);
}
public function enviar_emails()
{
return new proceso_enviar_emails(constantes::PROCESO_ENVIAR_EMAILS, $this->entorno);
}
public function crear_usuario_admin($nombre, $email)
{
return new proceso_crear_usuario_admin($nombre, $email, constantes::PROCESO_CREAR_USUARIO_ADMIN, $this->entorno);
}
public function iniciar_workers()
{
return new proceso_iniciar_workers(constantes::PROCESO_INICIAR_WORKERS, $this->entorno, null, constantes::PROCESO_EJECUCION_ESTADO_ACTIVO);
}
public function proceso_verificar_actividad_workers()
{
return new proceso_verificar_actividad_workers(constantes::PROCESO_VERIFICAR_ACTIVIDAD_WORKERS, $this->entorno);
}
public function reenviar_mensaje($topicName, $listenerName, $messageId)
{
return new proceso_reenviar_mensaje($topicName, $listenerName, $messageId, constantes::PROCESO_REENVIAR_MENSAJE, $this->entorno);
}
public function generar_facturacion()
{
return new proceso_generar_facturacion(constantes::PROCESO_GENERAR_FACTURACION, $this->entorno);
}
public function revertir_facturacion()
{
return new proceso_revertir_facturacion(constantes::PROCESO_REVERTIR_FACTURACION, $this->entorno);
}
public function confirmar_facturacion()
{
return new proceso_confirmar_facturacion(constantes::PROCESO_CONFIRMAR_FACTURACION, $this->entorno);
}
public function generar_facturas_afip()
{
return new proceso_generar_facturas_afip(constantes::PROCESO_GENERAR_FACTURAS_AFIP, $this->entorno);
}
}
lib-develop/src/siu/sq/lib/procesos/proceso.php 0000664 0000000 0000000 00000022374 14430530062 0022065 0 ustar 00root root 0000000 0000000 inicializar($estado_inicial);
$this->entorno = $entorno;
$this->id_proceso = $id_proceso;
$this->cargar($id_proceso_ejecucion);
}
protected function inicializar($estado_inicial)
{
$this->estado_inicial = ($estado_inicial) ? $estado_inicial : constantes::PROCESO_EJECUCION_ESTADO_INDEFINIDO;
$this->verboso = false;
}
private function cargar($id_proceso_ejecucion)
{
$this->datos = lib::catalogo_daos()->procesos()->get($this->id_proceso);
if (!is_null($id_proceso_ejecucion)) {
$this->proceso_ejecucion = lib::catalogo_modelo()->procesos_ejecuciones($id_proceso_ejecucion);
} else {
$this->proceso_ejecucion = lib::catalogo_modelo()->procesos_ejecuciones();
}
$this->proceso_ejecucion->set_descripcion($this->datos['descripcion']);
}
public function ejecutar()
{
if (!lib::es_modo_mantenimiento()) {
$this->iniciar_registro_ejecucion();
$this->entorno()->log()->info("INICIANDO PROCESO: [" . $this->datos['codigo'] . "] " . $this->datos['descripcion']);
$this->ejecutar_especifico();
$this->entorno()->log()->info("FINALIZANDO PROCESO: [" . $this->datos['codigo'] . "] " . $this->datos['descripcion']);
} else {
$config = new configurador();
$dir = $config->get_config_dir();
$proyecto = parse_ini_file($dir . "/../toba/proyecto.ini", true);
$mensaje = $proyecto['proyecto']['mantenimiento_mensaje'] . PHP_EOL;
echo $mensaje;
$this->entorno->log()->warn($mensaje . " Intentando ejecutar el proceso: "
. "([" . $this->datos['codigo'] . "] " . $this->datos['descripcion'] . ")");
}
}
abstract public function ejecutar_especifico();
public function entorno()
{
if (!isset($this->entorno)) {
throw new error("PROCESO - El entorno no esta cargado");
}
return $this->entorno;
}
public function get_id_proceso()
{
return $this->id_proceso;
}
public function set_entorno($entorno)
{
$this->entorno = $entorno;
}
public function get_id_ejecucion()
{
return $this->proceso_ejecucion->get_id();
}
public function get_estado()
{
return $this->proceso_ejecucion->get_id_proceso_ejecucion_estado();
}
public function set_estado($estado)
{
$this->proceso_ejecucion->set_id_proceso_ejecucion_estado($estado);
}
public function set_total_a_procesar($total)
{
$this->proceso_ejecucion->set_total_a_procesar($total);
}
public function agregar_procesado_ok()
{
$this->proceso_ejecucion->set_procesados_ok($this->proceso_ejecucion->get_procesados_ok() + 1);
}
public function agregar_procesado_error()
{
$this->proceso_ejecucion->set_procesados_error($this->proceso_ejecucion->get_procesados_error() + 1);
}
public function es_verboso()
{
return $this->verboso;
}
public function set_verboso($verboso)
{
$this->verboso = $verboso;
}
public function iniciar_registro_ejecucion()
{
$this->proceso_ejecucion->set_id_proceso($this->id_proceso);
$this->proceso_ejecucion->set_id_proceso_ejecucion_estado($this->estado_inicial);
$this->proceso_ejecucion->guardar();
}
public function finalizar_registro_ejecucion($estado=null)
{
$estado_final = isset($estado)? $estado : $this->proceso_ejecucion->get_id_proceso_ejecucion_estado();
$this->proceso_ejecucion->set_finalizado_en('now()');
$this->proceso_ejecucion->set_id_proceso_ejecucion_estado($estado_final);
$this->proceso_ejecucion->guardar();
if ($estado_final == constantes::PROCESO_EJECUCION_ESTADO_ERROR) {
$this->notificar_error();
}
}
public function agregar_notificacion($mensaje, $severidad)
{
try {
//------ Definir que se deber�a guardar en este campo...
$tmp = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS);
unset($tmp[1]['file']);
unset($tmp[1]['function']);
unset($tmp[1]['type']);
$componente = json_encode($tmp[1]);
// Cuando es invocado desde la pantalla de toba la conexion a la db es LATIN1
// por esa razón necesito convertir el mensaje en esa codificación.
if ($this->es_encoding_latin1()) {
$mensaje_utf8 = mb_convert_encoding($mensaje, 'ISO-8859-1', 'UTF-8');
} else {
$mensaje_utf8 = $mensaje;
}
//---------------------------------------------
$datos = array( 'id_proceso_ejecucion' => $this->proceso_ejecucion->get_id(),
'ocurrido_en' => 'now()',
'severidad' => $severidad,
'componente' => $componente,
'texto' => $mensaje_utf8);
$sql = sql::sql_array_a_insert('procesos_ejecuciones_log', $datos, $this->entorno->db()); // Se le pas� la DB porque internamente necesita la funci�n de quoteo de la clase db...
$this->entorno->db()->ejecutar($sql);
} catch (\Exception $ex) {
$msg = "Error al grabar la tabla 'procesos_ejecuciones_log'. Id_proceso: " . $this->id_proceso . " - SQL: " . $sql;
$this->entorno->log()->error(__METHOD__ . ": " . $msg . " - " . $ex->getMessage());
throw new error($msg);
}
}
public function get_notificaciones()
{
return lib::catalogo_daos()->procesos()->get_procesos_ejecuciones_log($this->proceso_ejecucion->get_id());
}
protected function es_encoding_latin1()
{
$db = $this->entorno->db();
preg_match("/Client\sEncoding:\s(LATIN1)+;/", $db->get_pdo()->getAttribute(\PDO::ATTR_SERVER_INFO), $matches);
if (empty($matches)) {
return false;
} else {
return true;
}
}
public function actualizar_registros_procesados()
{
// Consultar
if ($this->proceso_ejecucion->get_id_proceso_ejecucion_estado() == constantes::PROCESO_EJECUCION_ESTADO_EN_ESPERA) {
if ($this->proceso_ejecucion->get_total_a_procesar() == $this->proceso_ejecucion->get_procesados_ok()) {
$this->proceso_ejecucion->set_id_proceso_ejecucion_estado(constantes::PROCESO_EJECUCION_ESTADO_OK);
} else {
if ($this->proceso_ejecucion->get_total_a_procesar() == ($this->proceso_ejecucion->get_procesados_ok() + $this->proceso_ejecucion->get_procesados_error())) {
$this->proceso_ejecucion->set_id_proceso_ejecucion_estado(constantes::PROCESO_EJECUCION_ESTADO_ERROR);
}
}
}
$this->proceso_ejecucion->guardar();
}
/**
* Guarda un registro en notificaciones_clientes para que luego la levante el proceso de envio de emails
*/
public function notificar_error()
{
$crear_notificacion = lib::parametros_sistema()->get_valor(constantes::PARAMETROS_SISTEMA_CODIGO_NOTIFICACION_ERROR_PROCESO);
if ($crear_notificacion == 'S') {
$param_usu_admin = lib::parametros_sistema()->get_valor(constantes::PARAMETROS_SISTEMA_CODIGO_USUARIO_ADMIN);
$param_email_admin = lib::parametros_sistema()->get_valor(constantes::PARAMETROS_SISTEMA_CODIGO_EMAIL_ADMIN);
if (empty($param_usu_admin) || empty($param_email_admin)) {
$this->agregar_notificacion('El nombre o el email del usuario administrador no esta seteado en los parametros del sistema. '
. 'Para hacerlo puede usar el comando crear_usuario_admin', 'error');
} else {
$notificacion = lib::catalogo_modelo()->notificacion();
$notificacion->set_usuario($param_usu_admin);
$notificacion->set_notificado_a($param_email_admin);
$notificacion->set_id_tipo_notificacion(constantes::TIPO_NOTIFICACION_ERROR_PROCESO);
$notificacion->armar_tema($this->datos['descripcion']);
$this->datos['id_ejecucion'] = $this->proceso_ejecucion->get_id();
$notificacion->armar_mensaje($this->datos);
$notificacion->guardar();
}
}
}
public function set_parametro($identificador, $valor)
{
$this->parametros[$identificador] = $valor;
}
public function set_descripcion_proceso_ejecucion($descripcion) {
$this->proceso_ejecucion->set_descripcion($descripcion);
}
public function get_descripcion_proceso_ejecucion() {
return $this->proceso_ejecucion->get_descripcion();
}
}
lib-develop/src/siu/sq/lib/procesos/proceso_confirmar_facturacion.php 0000664 0000000 0000000 00000005656 14430530062 0026507 0 ustar 00root root 0000000 0000000 facturador($this->id_tipo_servicio);
$facturador->set_proceso($this);
$facturador->set_dia_primer_vencimiento($this->datos_vencimientos['id_reloj_1er_vencimiento'], $this->datos_vencimientos['dia_1er_vencimiento']);
if (isset($this->datos_vencimientos['id_reloj_2do_vencimiento'])){
$facturador->set_dia_segundo_vencimiento($this->datos_vencimientos['id_reloj_2do_vencimiento'], $this->datos_vencimientos['dia_2do_vencimiento']);
}
$facturador->confirmar();
$this->cantidad_ventas_generadas = $facturador->get_cantidad_ventas_generadas();
$this->importe_ventas_generadas = $facturador->get_importe_ventas_generadas();
$this->ventas_generadas = $facturador->get_ventas_generadas();
$this->agregar_notificacion("Ha finalizado el proceso de confirmación de la facturación", 'info');
$this->finalizar_registro_ejecucion(constantes::PROCESO_EJECUCION_ESTADO_OK);
} catch (error_db $e) {
$this->agregar_notificacion($e->getMessage(), 'error');
$this->finalizar_registro_ejecucion(constantes::PROCESO_EJECUCION_ESTADO_ERROR);
throw $e;
} catch (error_negocio $e) {
$this->agregar_notificacion($e->getMessage(), 'error');
$this->finalizar_registro_ejecucion(constantes::PROCESO_EJECUCION_ESTADO_ERROR);
throw $e;
} catch (error $e) {
$this->agregar_notificacion($e->getMessage(), 'error');
$this->finalizar_registro_ejecucion(constantes::PROCESO_EJECUCION_ESTADO_ERROR);
throw $e;
} catch (\Exception $e) {
$this->agregar_notificacion($e->getMessage(), 'error');
$this->finalizar_registro_ejecucion(constantes::PROCESO_EJECUCION_ESTADO_ERROR);
throw $e;
}
}
public function set_id_tipo_servicio($id_tipo_servicio)
{
$this->id_tipo_servicio = $id_tipo_servicio;
}
public function get_cantidad_ventas_generadas()
{
return $this->cantidad_ventas_generadas;
}
public function get_importe_ventas_generadas()
{
return $this->importe_ventas_generadas;
}
public function get_ventas_generadas()
{
return $this->ventas_generadas;
}
public function set_datos_vencimiento($datos)
{
$this->datos_vencimientos = $datos;
}
}
lib-develop/src/siu/sq/lib/procesos/proceso_crear_usuario_admin.php 0000664 0000000 0000000 00000004126 14430530062 0026153 0 ustar 00root root 0000000 0000000 set_email($email);
$this->set_nombre($nombre);
}
public function get_nombre()
{
return $this->nombre;
}
public function get_email()
{
return $this->email;
}
public function set_nombre($nombre)
{
$this->nombre = $nombre;
}
public function set_email($email)
{
//valido el email
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
throw new error_negocio(
'El email ingresado no es valido'
);
}
$this->email = $email;
}
public function ejecutar_especifico()
{
try {
$filtro = ['codigo' => constantes::PARAMETROS_SISTEMA_CODIGO_USUARIO_ADMIN];
$dao_parametros_sistema = lib::catalogo_daos()->parametros_sistema();
$id = $dao_parametros_sistema->get_lista($filtro)[0]['id'];
$parametro_usuario_admin = lib::catalogo_modelo()->parametro_sistema($id);
$parametro_usuario_admin->set_valor($this->nombre);
$parametro_usuario_admin->guardar();
$filtro = ['codigo' => constantes::PARAMETROS_SISTEMA_CODIGO_EMAIL_ADMIN];
$id = $dao_parametros_sistema->get_lista($filtro)[0]['id'];
$parametro_email_admin = lib::catalogo_modelo()->parametro_sistema($id);
$parametro_email_admin->set_valor($this->email);
$parametro_email_admin->guardar();
$this->finalizar_registro_ejecucion(constantes::PROCESO_EJECUCION_ESTADO_OK);
} catch (\Exception $ex) {
$this->agregar_notificacion($ex->getMessage(), 'error');
$this->finalizar_registro_ejecucion(constantes::PROCESO_EJECUCION_ESTADO_ERROR);
throw $ex;
}
}
}
lib-develop/src/siu/sq/lib/procesos/proceso_enviar_emails.php 0000664 0000000 0000000 00000027712 14430530062 0024764 0 ustar 00root root 0000000 0000000 ids_envios_notificaciones_fallados;
}
public function get_ids_envios_notificaciones_exitosos()
{
return $this->ids_envios_notificaciones_exitosos;
}
public function set_notificaciones_a_enviar(array $notificaciones)
{
$this->notificaciones_a_enviar = $notificaciones;
}
public function agregar_notificacion_a_enviar(notificacion $notif)
{
$this->notificaciones_a_enviar[] = $notif;
}
public function ejecutar_especifico()
{
$this->set_estado(constantes::PROCESO_EJECUCION_ESTADO_OK);
try {
$this->procesar_envio_mail();
} catch (error $e) {
$this->agregar_notificacion($e->getMessage(), 'error');
$this->finalizar_registro_ejecucion(constantes::PROCESO_EJECUCION_ESTADO_ERROR);
throw $e;
}
$this->finalizar_registro_ejecucion();
}
protected function procesar_envio_mail()
{
if (empty($this->notificaciones_a_enviar)) {
$filtro = ['enviada_en__null' => true, 'notificado_a__not_null' => true];
$this->notificaciones_a_enviar = lib::catalogo_daos()->notificaciones()->get_lista($filtro);
}
$mailer = lib::mailer();
$this->email_from_defecto = lib::parametros_sistema()->get_valor(constantes::PARAMETROS_SISTEMA_CODIGO_EMAIL_SENDER);
$this->email_from_name = lib::parametros_sistema()->get_valor(constantes::PARAMETROS_SISTEMA_CODIGO_EMAIL_FROM_NAME);
$mailer->set_from($this->email_from_defecto, $this->email_from_name);
foreach ($this->notificaciones_a_enviar as $n) {
try {
if (is_array($n)) {
$n = lib::catalogo_modelo()->notificacion($n['id']);
// Por si la notificacion online fallo al enviarse y el proceso de consola la levanta.
$n->set_proceso_envio($this);
}
$this->enviar_email($mailer, $n);
$this->ids_envios_notificaciones_exitosos[] = $n->get_id();
$this->agregar_procesado_ok();
} catch (\Exception $ex) {
$this->ids_envios_notificaciones_fallados[] = $n->get_id();
$this->agregar_procesado_error();
$this->mensajes_de_error .= $ex->getMessage() . PHP_EOL;
$this->entorno()->log()->err($ex->getMessage());
$this->agregar_notificacion($ex->getMessage(), 'error');
$this->set_estado(constantes::PROCESO_EJECUCION_ESTADO_ERROR);
}
}
$this->log_info();
}
// Procesa la notificacion (por ejemplo para agregar comprobantes en nucleo/academico)
protected function procesar_tipo_notificacion($mailer, $notificacion, &$comprobantes)
{
if ($notificacion->get_id_tipo_notificacion() == constantes::TIPO_NOTIFICACION_CUPON_PAGO) {
$venta = lib::catalogo_daos()->notificaciones()->get_lista(['id' => $notificacion->get_id()])[0];
if (isset($venta['id_comprobante'])) {
$comprobante = lib::catalogo_daos()->comprobantes()->get($venta['id_comprobante']);
$partes = explode('/', $comprobante['id_rdi']);
$mailer->adjuntar_archivo($comprobante['id_rdi'], end($partes), 'base64', 'application/pdf');
}
}
}
public function enviar_email($mailer, notificacion $notificacion)
{
// Limpiar adjuntos pre nuevo envio
$mailer->eliminar_adjuntos();
//parametros para mailer
$destinatario_email = $notificacion->get_notificado_a();
if (empty($destinatario_email)) {
throw new error(__METHOD__ . ' No se pudo obtener el email destinatario de la notificacion con ID: ' . $notificacion->get_id());
}
$asunto = $notificacion->get_tema();
$cuerpo_email = $notificacion->get_mensaje();
$this->entorno()->log()->info(__METHOD__ . ": Se está procesando la notificación con ID: " . $notificacion->get_id());
// COmprobantes generados para la notificacion
$comprobantes_generados = array();
$this->procesar_tipo_notificacion($mailer, $notificacion, $comprobantes_generados);
$mailer->enviar_email($asunto, $cuerpo_email, $destinatario_email);
$mailer->eliminar_adjuntos();
$this->entorno()->log()->info(__METHOD__ . ": Comprobantes temporales a borrar: " . print_r($comprobantes_generados, true));
if (!empty($comprobantes_generados)) {
// Eliminiar los PDF's generados
foreach ($comprobantes_generados as $comp_gen) {
if (isset($comp_gen['path'])) {
$id = isset($comp_gen['id']) ? $comp_gen['id'] : 'FUSIONADO';
$this->entorno()->log()->debug(__METHOD__ . ": Borrando comprobante temporal: ID=" . $id. ' PATH=' . $comp_gen['path']);
unlink($comp_gen['path']);
} else {
$this->entorno()->log()->warn(__METHOD__ . ": No se encontro path de un comprobante generado en el envio de mail: " . print_r($comp_gen, true));
}
}
// Guardar los ids de comprobantes generados para el log
foreach ($comprobantes_generados as $comp_gen) {
if (isset($comp_gen['id'])) {
$this->comprobantes_creados_ids[] = $comp_gen['id'];
}
}
}
$notificacion->set_enviada_en('now()');
$notificacion->set_enviada_por($this->email_from_name);
$notificacion->guardar();
}
public function generar_pdf(array $datos_venta, $nombre_comprobante_jasper, $datos_qr = null)
{
$generador_de_pdf = lib::toba_vista_jasperreports_json();
$generador_de_pdf->set_datos_venta($datos_venta);
$generador_de_pdf->set_path_reporte(\toba::proyecto()->get_path().'/../reportes/' . $nombre_comprobante_jasper);
if ($datos_qr) {
$generador_de_pdf->set_datos_qr($datos_qr);
}
$generador_de_pdf->generar_pdf();
$archivo_generado = $generador_de_pdf->get_nombre_archivo_generado();
if (lib::parametros_sistema()->get_valor("USARAIDOCU") == "S") {
$this->exportar_a_arai_documentos($datos_venta, $archivo_generado);
}
return $archivo_generado;
}
public function generar_documento_unico($comprobantes_generados)
{
// https://manuals.setasign.com/fpdi-manual/v2/the-fpdi-class/examples/
$pdf = new Fpdi\Fpdi();
foreach ($comprobantes_generados as $file) {
if (is_array($file)) {
$file = $file['path'];
}
$pageCount = $pdf->setSourceFile($file);
for ($pageNo = 1; $pageNo <= $pageCount; $pageNo++) {
$templateId = $pdf->importPage($pageNo);
$size = $pdf->getTemplateSize($templateId);
$pdf->AddPage($size['orientation'], $size);
$pdf->useTemplate($templateId);
}
}
$archivo_salida = \toba::proyecto()->get_path_temp() . '/' . date('YmdHis') . '_factura' . '.pdf';
$pdf->Output('F', $archivo_salida);
return $archivo_salida;
}
protected function log_info()
{
$log_info = count($this->ids_envios_notificaciones_exitosos) . " notificaciones enviadas por email; " . PHP_EOL;
if (count($this->ids_envios_notificaciones_exitosos) > 0) {
$log_info .= "Los ids de la tabla notificaciones son: " . implode(',', $this->ids_envios_notificaciones_exitosos) . PHP_EOL;
$log_info .= "Se generaron los comprobantes id: " . implode(',', $this->comprobantes_creados_ids) . PHP_EOL;
}
$log_info .= '--------------------------------------------------------------------' . PHP_EOL;
$log_info .= "Envio de emails fallados: " . count($this->ids_envios_notificaciones_fallados) . PHP_EOL;
if (count($this->ids_envios_notificaciones_fallados) > 0) {
$log_info .= "Los ids de la tabla notificaciones que fallaron son: " . implode(',', $this->ids_envios_notificaciones_fallados) . PHP_EOL;
$log_info .= '--------------------------------------------------------------------' . PHP_EOL;
$log_info .= "Errores: " . PHP_EOL . $this->mensajes_de_error . PHP_EOL;
}
//feedback en consola
if ($this->es_verboso()) {
echo $log_info;
}
$this->agregar_notificacion($log_info, 'info');
}
protected function recuperar_de_arai_documentos($datos)
{
$this->entorno()->log()->debug('Se recupera el comprobante de Arai Documentos');
$archivo = Documentos\AraiDocumentos::downloadDocumento($datos['uuid_arai_documentos']);
$nombre_archivo = \toba::proyecto()->get_path_temp() . '/' . $datos['uuid_arai_documentos'] . '_ad' . '.pdf';
if (file_put_contents($nombre_archivo, $archivo) === false) {
throw new error(__METHOD__ . ' Error al crear el archivo recibido por Arai Documentos.');
} else {
return realpath($nombre_archivo);
}
}
protected function exportar_a_arai_documentos($comprobante, $path_to_file)
{
$this->entorno()->log()->debug('Se envia el comprobante a Arai Documentos');
$param_config = new configurador();
try {
$data = [];
$data['archivo'] = base64_encode(file_get_contents($path_to_file));
$data['autorizacion']['usuario'] = $param_config->sq_ini['AraiDocumentos']['USUARIO_ARAI'];
$data['origen']['id_usuario_sso'] = $param_config->sq_ini['AraiDocumentos']['USUARIO_SSO'];
$data['origen']['cuenta_usuario'] = $param_config->sq_ini['AraiDocumentos']['USUARIO_CUENTA'];
$data['documento']['tipo'] = $param_config->sq_ini['AraiDocumentos']['TIPO_DOCUMENTO'];
$data['documento']['titulo'] = 'Factura: ' . $comprobante['numero_comprobante'] ;
$data['documento']['descripcion'] = 'Cliente: ' . $comprobante['cliente']['descripcion'];
$data['documento']['id_tramite'] = $comprobante['id_comprobante'];
$data['documento']['referencia_interna'] = $comprobante['id_comprobante'];
$data['documento']['identificador'] = $comprobante['id_comprobante'];
$data['documento']['atributos'] = '';
$araiDoc = Documentos\AraiDocumentos::exportarDocumento($data);
$comp = lib::catalogo_modelo()->comprobante($comprobante['id_comprobante']);
$comp->set_uuid_arai_documentos($araiDoc['uid_documento']);
$comp->set_presentacion(json_decode($comp->get_presentacion()));
$comp->guardar();
} catch (AraiDocsException $e) {
$this->entorno()->log()->err($e->getMessage() . "\n Revisar log docs-cli.\n Detalle: " . $e->getDetail() . "\n Trace: " . $e->getTraceAsString());
throw new error_rest($e->getMessage(), $e->getStatusCode());
} catch (\Exception $e) {
$this->entorno()->log()->err($e->getMessage() . "\n" . $e->getTraceAsString());
throw new error_rest($e->getMessage(), $e->getCode());
}
}
}
lib-develop/src/siu/sq/lib/procesos/proceso_generar_comprobantes.php 0000664 0000000 0000000 00000005266 14430530062 0026345 0 ustar 00root root 0000000 0000000 set_estado(constantes::PROCESO_EJECUCION_ESTADO_OK);
$this->cargar_configuraciones();
$this->validar();
$this->generar_comprobantes();
//feedback en consola
if ($this->es_verboso()) {
foreach ($this->get_notificaciones() as $notificacion) {
echo $notificacion['texto'] . PHP_EOL;
}
}
$this->finalizar_registro_ejecucion();
} catch (error_db $e) {
$this->agregar_notificacion($e->getMessage(), 'error');
$this->finalizar_registro_ejecucion(constantes::PROCESO_EJECUCION_ESTADO_ERROR);
throw $e;
} catch (error_negocio $e) {
$this->agregar_notificacion($e->getMessage(), 'error');
$this->finalizar_registro_ejecucion(constantes::PROCESO_EJECUCION_ESTADO_ERROR);
throw $e;
} catch (error $e) {
$this->agregar_notificacion($e->getMessage(), 'error');
$this->finalizar_registro_ejecucion(constantes::PROCESO_EJECUCION_ESTADO_ERROR);
throw $e;
} catch (\Exception $e) {
$this->agregar_notificacion($e->getMessage(), 'error');
$this->finalizar_registro_ejecucion(constantes::PROCESO_EJECUCION_ESTADO_ERROR);
throw $e;
}
}
protected function validar()
{
$this->validar_instalacion_jasper();
}
protected function validar_instalacion_jasper()
{
lib::toba_vista_jasperreports_json();
}
protected function cargar_configuraciones()
{
// Sin configuraciones por defecto
}
public function generar_pdf(array $datos_venta, $nombre_comprobante_jasper)
{
$generador_de_pdf = lib::toba_vista_jasperreports_json();
$generador_de_pdf->set_datos_venta($datos_venta);
$generador_de_pdf->set_path_reporte(\toba::proyecto()->get_path().'/../reportes/' . $nombre_comprobante_jasper);
$generador_de_pdf->generar_pdf();
return $generador_de_pdf->get_nombre_archivo_generado();
}
public function set_ventas($ventas)
{
$this->ventas = $ventas;
}
public function generar_comprobantes()
{
}
}
lib-develop/src/siu/sq/lib/procesos/proceso_generar_facturacion.php 0000664 0000000 0000000 00000011210 14430530062 0026131 0 ustar 00root root 0000000 0000000 facturador($this->id_tipo_servicio);
$facturador->set_proceso($this);
$facturador->set_dia_primer_vencimiento($this->id_reloj_1er_vencimiento, $this->dia_1er_vencimiento);
if (lib::parametros_sistema()->get_valor(constantes::PARAMETROS_SISTEMA_CANTIDAD_VENCIMIENTOS) == constantes::SEGUNDO_VENCIMIENTO) {
$facturador->set_dia_segundo_vencimiento($this->id_reloj_2do_vencimiento, $this->dia_2do_vencimiento);
}
$facturador->set_instancias_a_facturar($this->ids_servicios_instancias);
if (isset($this->ids_facturador_alarmas)) {
$facturador->set_ids_facturador_alarmas($this->ids_facturador_alarmas);
}
$facturador->generar();
$this->id_facturacion = $facturador->get_id_facturacion();
$this->cantidad_ventas_pre_generadas = $facturador->get_cantidad_ventas_pre_generadas();
$this->importe_ventas_pre_generadas = $facturador->get_importe_ventas_pre_generadas();
$this->cantidad_ventas_cobradas = $facturador->get_cantidad_ventas_cobradas();
$this->importe_ventas_cobradas = $facturador->get_importe_ventas_cobradas();
$this->agregar_notificacion("Ha finalizado el proceso de generación de la facturación", 'info');
$this->finalizar_registro_ejecucion(constantes::PROCESO_EJECUCION_ESTADO_OK);
} catch (error_db $e) {
$this->agregar_notificacion($e->getMessage(), 'error');
$this->finalizar_registro_ejecucion(constantes::PROCESO_EJECUCION_ESTADO_ERROR);
throw $e;
} catch (error_negocio $e) {
$this->agregar_notificacion($e->getMessage(), 'error');
$this->finalizar_registro_ejecucion(constantes::PROCESO_EJECUCION_ESTADO_ERROR);
throw $e;
} catch (error $e) {
$this->agregar_notificacion($e->getMessage(), 'error');
$this->finalizar_registro_ejecucion(constantes::PROCESO_EJECUCION_ESTADO_ERROR);
throw $e;
} catch (\Exception $e) {
$this->agregar_notificacion($e->getMessage(), 'error');
$this->finalizar_registro_ejecucion(constantes::PROCESO_EJECUCION_ESTADO_ERROR);
throw $e;
}
}
public function set_dia_primer_vencimiento($id_reloj_1er_vencimiento, $dia_1er_vencimiento)
{
$this->id_reloj_1er_vencimiento = $id_reloj_1er_vencimiento;
$this->dia_1er_vencimiento = $dia_1er_vencimiento;
}
public function set_dia_segundo_vencimiento($id_reloj_2do_vencimiento, $dia_2do_vencimiento)
{
$this->id_reloj_2do_vencimiento = $id_reloj_2do_vencimiento;
$this->dia_2do_vencimiento = $dia_2do_vencimiento;
}
public function set_id_tipo_servicio($id_tipo_servicio)
{
$this->id_tipo_servicio = $id_tipo_servicio;
}
public function set_parametros_alarmas($parametros)
{
}
public function set_instancias_a_facturar($id_servicios_instancias)
{
$this->ids_servicios_instancias = $id_servicios_instancias;
}
public function get_id_facturacion()
{
return $this->id_facturacion;
}
public function get_ids_facturador_alarmas()
{
return $this->ids_facturador_alarmas;
}
public function set_ids_facturador_alarmas(array $ids_alarmas)
{
$this->ids_facturador_alarmas = $ids_alarmas;
}
public function get_cantidad_ventas_cobradas()
{
return $this->cantidad_ventas_cobradas;
}
public function get_importe_ventas_cobradas()
{
return $this->importe_ventas_cobradas;
}
public function get_cantidad_ventas_pre_generadas()
{
return $this->cantidad_ventas_pre_generadas;
}
public function get_importe_ventas_pre_generadas()
{
return $this->importe_ventas_pre_generadas;
}
}
lib-develop/src/siu/sq/lib/procesos/proceso_generar_facturas_afip.php 0000664 0000000 0000000 00000041410 14430530062 0026447 0 ustar 00root root 0000000 0000000 transaccion_comprobante_actualizar_numeracion_externa = $transaccion_comprobante_actualizar_numeracion_externa;
}
public function set_cobranzas($cobranzas)
{
$this->cobranzas = $cobranzas;
}
public function ejecutar_especifico()
{
try {
// Iniciar el proceso en estado OK (al procesarse puede pasar a ERROR)
$this->set_estado(constantes::PROCESO_EJECUCION_ESTADO_OK);
$this->cargar_configuraciones();
$this->cargar_parametrizaciones();
$this->validar();
$this->generar_facturas_afip();
//feedback en consola
if ($this->es_verboso()) {
foreach ($this->get_notificaciones() as $notificacion) {
echo $notificacion['texto'] . PHP_EOL;
}
}
$this->finalizar_registro_ejecucion();
} catch (error_db $e) {
$this->agregar_notificacion($e->getMessage(), 'error');
$this->finalizar_registro_ejecucion(constantes::PROCESO_EJECUCION_ESTADO_ERROR);
throw $e;
} catch (error_negocio $e) {
$this->agregar_notificacion($e->getMessage(), 'error');
$this->finalizar_registro_ejecucion(constantes::PROCESO_EJECUCION_ESTADO_ERROR);
throw $e;
} catch (error $e) {
$this->agregar_notificacion($e->getMessage(), 'error');
$this->finalizar_registro_ejecucion(constantes::PROCESO_EJECUCION_ESTADO_ERROR);
throw $e;
} catch (\Exception $e) {
$this->agregar_notificacion($e->getMessage(), 'error');
$this->finalizar_registro_ejecucion(constantes::PROCESO_EJECUCION_ESTADO_ERROR);
throw $e;
}
}
//---- CARGAR CONFIGURACIONES ---------------
public function cargar_configuraciones()
{
$afip = new instanciador_afip($this->entorno());
$this->afip = $afip->getAfip();
}
public function cargar_parametrizaciones()
{
$this->parametrizacion = lib::catalogo_daos()->comprobantes()->get_parametrizaciones();
if (!$this->parametrizacion['comprobante_tipo_factura']) {
throw new error_negocio(__METHOD__ . ': No se encuentra definido el parametro comprobante tipo factura');
}
}
//---- VALIDACIONES -------------
public function validar()
{
// Validar que se haya inyectado la transacción del comprobante
if (!is_object($this->transaccion_comprobante_actualizar_numeracion_externa)) {
throw new error(__METHOD__ . ": Falta asignar una transaccion de comprobantes.");
}
// Validar punto de cobranza seteado en las cobranzas
$cobranzas_sin_pcob = array();
foreach ($this->cobranzas as $cobranza) {
if (empty($cobranza['codigo_punto_cobranza'])) {
$cobranzas_sin_pcob[] = $cobranza['id'];
}
}
if (!empty($cobranzas_sin_pcob)) {
throw new error_negocio(__METHOD__ . ": No se encontraron puntos de cobranza asociados a las siguientes Id's de cobranzas: " . implode(",", $cobranzas_sin_pcob));
}
}
//----- GENERAR FACTURA AFIP -----------------------
public function generar_facturas_afip()
{
$this->agregar_notificacion("Cantidad de cobranzas a procesar: " . count($this->cobranzas), 'info');
// Generar CAE's, PDF's y grabar comprobantes
$total_errores_afip = 0;
$comprobantes = [];
foreach ($this->cobranzas as $cobranza) {
try {
// Obtener el CAE mediante WS de AFIP
$CAE = $this->generar_CAE($cobranza);
$cobranza['numero_comprobante'] = $CAE['voucher_number'];
$cobranza['CAE'] = $CAE['CAE'];
$cobranza['CAEFchVto'] = $CAE['CAEFchVto'];
$this->agregar_notificacion("Venta ID: " .$cobranza['id'] . " Num.Comprobante: " . $cobranza['numero_comprobante'] . " CAE: " . $cobranza['CAE'], 'info');
try {
$this->actualizar_comprobantes($cobranza);
$this->agregar_notificacion("Comprobante ID: " .$cobranza['id_comprobante'] . " actualizado.", 'info');
// BUscar toda la info de los comprobantes y engancharlos a sus respectivas ventas
$datos = $this->generar_datos_notificacion($cobranza);
if (isset($datos) && isset($datos['id_venta'])) {
$comprobantes[$datos['id_venta']][] = $datos;
}
} catch (\Exception $ex) {
$this->set_estado(constantes::PROCESO_EJECUCION_ESTADO_ERROR);
$msg = "Error al generar comprobante de la venta ID: " . $cobranza['id'] . ". Mensaje: " . $ex->getMessage();
$this->agregar_notificacion($msg, 'error');
}
} catch (\Exception $ex) {
$cobranza['error_CAE'] = $ex->getMessage();
$this->actualizar_comprobantes($cobranza);
$this->set_estado(constantes::PROCESO_EJECUCION_ESTADO_ERROR);
$total_errores_afip++;
$msg = "Error al obtener CAE de la venta ID: " . $cobranza['id'] . ". Mensaje: " . $ex->getMessage();
$this->agregar_notificacion($msg, 'error');
}
}
if (count($this->cobranzas)) {
$this->agregar_notificacion("Cantidad de errores al generar CAE: " . $total_errores_afip, 'info');
}
if (!empty($comprobantes)) {
// Por cada venta enviar notificacion.
foreach ($comprobantes as $id_venta => $datos_comp) {
//Una venta puede tener mas de una cobranza, por lo tanto se crea una notificacion por venta
//verifico si existe una notificacion creada para dicha venta, de lo contrario la creo
$filtro['id_tipo_notificacion'] = [
constantes::TIPO_NOTIFICACION_ENVIO_FACTURA_ELECTRONICA,
constantes::TIPO_NOTIFICACION_VENTA
];
$filtro['id_venta'] = $id_venta;
$notificaciones = lib::catalogo_daos()->notificaciones()->get_lista($filtro);
$id_tipo_notificacion = array_column($notificaciones, 'id_tipo_notificacion');
if(!in_array(constantes::TIPO_NOTIFICACION_ENVIO_FACTURA_ELECTRONICA, $id_tipo_notificacion)) {
$this->crear_notificacion_cliente($id_venta, $datos_comp[0]['id_cliente'], $datos_comp);
}
if(!in_array(constantes::TIPO_NOTIFICACION_VENTA, $id_tipo_notificacion)) {
$this->crear_notificacion_cliente_venta($id_venta, $datos_comp[0]['id_cliente']);
}
}
}
}
// Genera los datos que se van a utilizar para crear la notificacion mas adelante
public function generar_datos_notificacion($cobranza)
{
return null;
}
// Crea notificaciones segun la informacion devuelta por el metodo generar_datos_notificacion
public function crear_notificacion_cliente($id_venta, $id_cliente, $datos_notificacion)
{
}
public function crear_notificacion_cliente_venta($id_venta, $id_cliente)
{
}
public function generar_CAE($cobranza)
{
$factura_electronica = new \SIU\Afip\WebService\FacturaElectronica($this->afip);
$cliente = $this->determinar_cliente($cobranza);
$info_personalizada = $this->get_datos_venta_info_personalizada($cobranza);
$data = [
'CantReg' => 1, // Cantidad de comprobantes a registrar
'PtoVta' => $cobranza['codigo_punto_cobranza'], // Punto de venta
'CbteTipo' => $this->parametrizacion['comprobante_tipo_factura'], // Tipo de comprobante (ver tipos disponibles)
'Concepto' => $info_personalizada['Concepto'], // Concepto del Comprobante: (1)Productos, (2)Servicios, (3)Productos y Servicios
'DocTipo' => $cliente['tipo_documento'], //96, // Tipo de documento del comprador (99 consumidor final, ver tipos disponibles)
'DocNro' => $cliente['numero_documento'], //$cobranza['cliente']['numero_documento'], // Número de documento del comprador (0 consumidor final)
'CbteFch' => intval(date('Ymd')), // (Opcional) Fecha del comprobante (yyyymmdd) o fecha actual si es nulo
'ImpTotal' => $cobranza['importe_total'], // Importe total del comprobante
'ImpTotConc' => 0, // Importe neto no gravado
'ImpNeto' => $cobranza['importe_total'], // Importe neto gravado
'ImpOpEx' => 0, // Importe exento de IVA
'ImpIVA' => 0, //Importe total de IVA
'ImpTrib' => 0, //Importe total de tributos
'MonId' => 'PES', //Tipo de moneda usada en el comprobante (ver tipos disponibles)('PES' para pesos argentinos)
'MonCotiz' => 1 // Cotización de la moneda usada (1 para pesos argentinos)
];
// Si el concepto es servicio o producto y servicio se debe enviar las fechas de
if (in_array($info_personalizada['Concepto'], [constantes::AFIP_TIPO_CONCEPTO_SERVICIO, constantes::AFIP_TIPO_CONCEPTO_PRODUCTO_SERVICIO])) {
$data_servicio = [
'FchServDesde' => $info_personalizada['FchServDesde'],
'FchServHasta' => $info_personalizada['FchServHasta'],
'FchVtoPago' => intval(date('Ymd'))
];
$data = array_merge($data, $data_servicio);
}
$CAE = $factura_electronica->crearProximoComprobante($data);
/**
* Si no devuelve el CAE, consultar si ya se genero en AFIP
*/
if (!isset($CAE['CAE'])) {
try {
$comprobante_info = $factura_electronica->getComprobanteInfo($CAE['voucher_number'], $cobranza['codigo_punto_cobranza'], $this->parametrizacion['comprobante_tipo_factura']);
} catch (\Exception $e) {
$msg = "Error al intentar generar el comprobante de AFIP ".$CAE['voucher_number'].'-'.$cobranza['codigo_punto_cobranza'].'-'.$this->parametrizacion['comprobante_tipo_factura'];
lib::entorno()->log()->error(__METHOD__ . ": " . $msg);
throw new error_negocio($msg);
}
if (is_null($comprobante_info)) {
$msg = "Error al intentar generar el comprobante de AFIP ".$CAE['voucher_number'].'-'.$cobranza['codigo_punto_cobranza'].'-'.$this->parametrizacion['comprobante_tipo_factura'];
lib::entorno()->log()->error(__METHOD__ . ": " . $msg);
throw new error_negocio($msg);
} else {
return array(
'CAE' => $comprobante_info->CodAutorizacion,
'CAEFchVto' => $comprobante_info->FchVto,
);
}
}
return $CAE;
}
protected function get_datos_venta_info_personalizada($cobranza)
{
// Generar los valores por defecto
$salida['Concepto'] = constantes::AFIP_TIPO_CONCEPTO_SERVICIO;
$salida['FchServDesde'] = intval(date('Ym01', strtotime($cobranza['cobrada_en'])));
$salida['FchServHasta'] = intval(date('Ymt', strtotime($cobranza['cobrada_en'])));
// Buscar valores personalizados
if (isset($cobranza['ventas_info_personalizada']) && !is_null($cobranza['ventas_info_personalizada'])) {
$ventas_info_personalizada = json_decode($cobranza['ventas_info_personalizada'], true);
foreach ($ventas_info_personalizada as $info_personalizada) {
if (isset($info_personalizada['entidad']) and $info_personalizada['entidad'] == constantes::VENTAS_INFO_PERSONALIZADA_ENTIDAD_AFIP) {
if (isset($info_personalizada['datos']['concepto'])) {
// Validar la estructura
if (isset($info_personalizada['datos']['concepto']['codigo']) && in_array($info_personalizada['datos']['concepto']['codigo'], [1,2,3])) {
$salida['Concepto'] = $info_personalizada['datos']['concepto']['codigo'];
} else {
$msg = "Se encontraron errores en el concepto definido como: " . var_export($info_personalizada['datos']['concepto'], true);
lib::entorno()->log()->error(__METHOD__ . ": " . $msg);
throw new error_negocio($msg);
}
}
if (isset($info_personalizada['datos']['periodo_facturado'])) {
// Validar la estructura
if (isset($info_personalizada['datos']['periodo_facturado']['fecha_desde']) && isset($info_personalizada['datos']['periodo_facturado']['fecha_hasta'])) {
$salida['FchServDesde'] = intval(date('Ymd', strtotime($info_personalizada['datos']['periodo_facturado']['fecha_desde'])));
$salida['FchServHasta'] = intval(date('Ymd', strtotime($info_personalizada['datos']['periodo_facturado']['fecha_hasta'])));
}
}
}
}
}
return $salida;
}
/**
*
* @param string $CAE
* @param array $datos_cobranza
* @return int
*/
public function actualizar_comprobantes($datos_cobranza)
{
if (isset($datos_cobranza['error_CAE'])) {
$datos = [
'id' => $datos_cobranza['id_comprobante'],
'error_CAE' => $datos_cobranza['error_CAE']
];
} else {
$datos = array(
'id' => $datos_cobranza['id_comprobante'],
'numero_comprobante' => $datos_cobranza['numero_comprobante'],
'CAE' => $datos_cobranza['CAE'],
'CAEFchVto' => $datos_cobranza['CAEFchVto']
);
}
$this->transaccion_comprobante_actualizar_numeracion_externa->set_datos($datos);
$this->transaccion_comprobante_actualizar_numeracion_externa->procesar();
}
public function determinar_cliente($cobranza)
{
$cliente = [];
if (isset($cobranza['es_persona_fisica'])) {
if ($cobranza['es_persona_fisica'] == true) {
$cliente['numero_documento'] = $cobranza['numero_documento'];
} else {
$cliente['numero_documento'] = $cobranza['identificacion_fiscal'];
}
if (isset($cobranza['tipo_documento_afip'])) {
$cliente['tipo_documento_afip'] = $cobranza['tipo_documento_afip'];
$cliente['tipo_documento'] = $cobranza['responsable_pago']['tipo_documento_afip'];
}
}elseif (isset($cobranza['responsable_pago']['es_persona_fisica'])) {
if ($cobranza['responsable_pago']['es_persona_fisica'] == true) {
$cliente['numero_documento'] = $cobranza['responsable_pago']['numero_documento'];
} else {
$cliente['numero_documento'] = $cobranza['responsable_pago']['identificacion_fiscal'];
}
if (isset($cobranza['responsable_pago']['tipo_documento_afip'])) {
$cliente['tipo_documento_afip'] = $cobranza['responsable_pago']['tipo_documento_afip'];
$cliente['tipo_documento'] = $cobranza['responsable_pago']['tipo_documento_afip'];
}
}
if (!isset($cliente['tipo_documento_afip']) or empty($cliente['tipo_documento_afip'])) {
$msg = "No se pudo procesar el comprobante para el cliente con el número de documento: " . $cliente['numero_documento'] . ". No se encuentra definido en SQ el tipo de documento AFIP correspondiente al tipo de documento: '" . $cliente['tipo_documento_afip'] . "'.";
lib::entorno()->log()->error(__METHOD__ . ': ' . $msg, $cobranza);
throw new error_negocio($msg);
}
return $cliente;
}
}
lib-develop/src/siu/sq/lib/procesos/proceso_iniciar_workers.php 0000664 0000000 0000000 00000001414 14430530062 0025327 0 ustar 00root root 0000000 0000000 agregar_notificacion("Se inician los workers", 'info');
lib::rest_hooks()->runWorkers();
} catch (\Exception $e) {
$this->agregar_notificacion($e->getMessage(), 'error');
$this->finalizar_registro_ejecucion(constantes::PROCESO_EJECUCION_ESTADO_ERROR);
$this->entorno()->log()->err(__CLASS__ . ":" . $e->getTraceAsString());
}
$this->agregar_notificacion("Se detuvieron los workers", 'info');
$this->finalizar_registro_ejecucion(constantes::PROCESO_EJECUCION_ESTADO_INACTIVO);
}
}
lib-develop/src/siu/sq/lib/procesos/proceso_migrar_version.php 0000664 0000000 0000000 00000003256 14430530062 0025171 0 ustar 00root root 0000000 0000000 RUTA_DDL = $_SERVER['SQ_DIR']."/ddl/";
}
if ($dir_instalacion) {
$this->RUTA_DDL = $dir_instalacion;
}
$this->imprime_salida = $imprime_salida;
$this->version = $version;
$this->set_entorno($entorno);
}
public function ejecutar()
{
$this->ejecutar_especifico();
}
public function ejecutar_especifico()
{
$this->iniciar('INICIANDO MIGRACION A VERSION: ' . $this->version);
$version = lib::catalogo_modelo()->version();
$version->migrar($this->version);
$this->finalizar();
}
public function iniciar($msg)
{
$params = $this->entorno()->db()->get_parametros();
if ($this->imprime_salida) {
echo "\n ------------------------------------------------------------------------";
}
if ($this->imprime_salida) {
echo "\n " . $msg ;
}
if ($this->imprime_salida) {
echo "\n ------------------------------------------------------------------------";
}
}
public function finalizar()
{
if ($this->imprime_salida) {
echo "\n ------------------------------------------------------------------------\n";
}
}
}
lib-develop/src/siu/sq/lib/procesos/proceso_reenviar_mensaje.php 0000664 0000000 0000000 00000002410 14430530062 0025447 0 ustar 00root root 0000000 0000000 topicName = $topicName;
$this->listenerName = $listenerName;
$this->messageId = $messageId;
}
public function ejecutar_especifico()
{
try {
$msg = "Iniciando reenvio de mensaje: " . $this->topicName . " - " . $this->listenerName . " - " . $this->messageId . ".";
$this->agregar_notificacion($msg, 'info');
lib::rest_hooks()->getSender()->processRetry($this->topicName, $this->listenerName, $this->messageId);
$this->finalizar_registro_ejecucion(constantes::PROCESO_EJECUCION_ESTADO_OK);
} catch (\Exception $e) {
$this->agregar_notificacion($e->getMessage(), 'error');
$this->finalizar_registro_ejecucion(constantes::PROCESO_EJECUCION_ESTADO_ERROR);
$this->entorno()->log()->err(__CLASS__ . ":" . $e->getTraceAsString());
}
}
}
lib-develop/src/siu/sq/lib/procesos/proceso_revertir_facturacion.php 0000664 0000000 0000000 00000004241 14430530062 0026356 0 ustar 00root root 0000000 0000000 facturador($this->id_tipo_servicio);
$facturador->set_proceso($this);
$facturador->set_id_facturacion($this->id_facturacion);
$facturador->set_instancias_a_facturar($this->ids_servicios_instancias);
$facturador->revertir();
$this->agregar_notificacion("Ha finalizado el proceso de revertir la facturación", 'info');
$this->finalizar_registro_ejecucion(constantes::PROCESO_EJECUCION_ESTADO_OK);
} catch (error_db $e) {
$this->agregar_notificacion($e->getMessage(), 'error');
$this->finalizar_registro_ejecucion(constantes::PROCESO_EJECUCION_ESTADO_ERROR);
throw $e;
} catch (error_negocio $e) {
$this->agregar_notificacion($e->getMessage(), 'error');
$this->finalizar_registro_ejecucion(constantes::PROCESO_EJECUCION_ESTADO_ERROR);
throw $e;
} catch (error $e) {
$this->agregar_notificacion($e->getMessage(), 'error');
$this->finalizar_registro_ejecucion(constantes::PROCESO_EJECUCION_ESTADO_ERROR);
throw $e;
} catch (\Exception $e) {
$this->agregar_notificacion($e->getMessage(), 'error');
$this->finalizar_registro_ejecucion(constantes::PROCESO_EJECUCION_ESTADO_ERROR);
throw $e;
}
}
public function set_id_tipo_servicio($id_tipo_servicio)
{
$this->id_tipo_servicio = $id_tipo_servicio;
}
public function set_instancias_a_facturar($id_servicios_instancias)
{
$this->ids_servicios_instancias = $id_servicios_instancias;
}
public function set_id_facturacion($id_facturacion)
{
$this->id_facturacion = $id_facturacion;
}
}
lib-develop/src/siu/sq/lib/procesos/proceso_validar_instalacion.php 0000664 0000000 0000000 00000026326 14430530062 0026154 0 ustar 00root root 0000000 0000000 conexiones_sistemas = $conexiones_sistemas;
$this->imprime_salida = $imprime_salida;
$this->set_entorno($entorno);
}
public function ejecutar()
{
$this->ejecutar_especifico();
}
public function ejecutar_especifico()
{
$this->iniciar("INICIANDO VALIDACIONES DE LA INSTALACION");
$this->validaciones_logs();
$this->entorno()->log()->info("INICIANDO PROCESO: Validar instalacion");
$this->validaciones_php();
$this->validaciones_postgres();
$this->validaciones_version();
$this->validaciones_integracion();
$this->entorno()->log()->info("FINALIZANDO PROCESO: Validar instalacion");
if (!empty($this->error)) {
$this->entorno()->log()->error(implode(PHP_EOL, $this->error));
if (class_exists('\sq_toba_error')) {
// Formatear la salida para toba
foreach ($this->error as $key => $valor) {
$this->error[ $key ] = str2iso($valor);
}
throw new \toba_error(implode("\r", str_replace("\n", "\r", $this->error)));
} else {
throw new error(implode(PHP_EOL, $this->error));
}
} else {
if ($this->imprime_salida) {
echo PHP_EOL . " OK" . PHP_EOL;
}
}
if (!empty($this->notificaciones)) {
$this->imprimir_linea();
if ($this->imprime_salida) {
echo implode(PHP_EOL, $this->notificaciones);
}
}
$this->imprimir_linea();
}
public function validaciones_logs()
{
$config = new configurador();
try {
$handlers = $this->entorno()->log()->getHandlers();
foreach ($handlers as $handler) {
switch (get_class($handler)) {
case "Monolog\Handler\StreamHandler":
// Validar permisos de escritura para los logs
if (! is_writable(dirname($handler->getUrl()))) {
throw new \Exception("No tiene permisos para escribir en la carpeta de logs.");
}
break;
case "Monolog\Handler\GelfHandler":
// Validar conexion con Graylog
$handle = fsockopen('udp://' . $config->sq_ini['graylog']['host'], $config->sq_ini['graylog']['port'], $errno, $errstr, 1);
if (!$handle) {
echo "$errno : $errstr
";
}
socket_set_timeout($handle, 1);
$write = fwrite($handle, "x00");
if (!$write) {
echo "error writing to port: $index.
";
next;
}
$startTime = time();
$header = fread($handle, 1);
$endTime = time();
$timeDiff = $endTime - $startTime;
if ($timeDiff >= 1) {
fclose($handle);
} else {
fclose($handle);
throw new \Exception("No se pudo conectar con Graylog, revise la configuracion.");
}
break;
}
}
} catch (\RuntimeException $ex) {
$this->error[] = $ex->getMessage();
throw new \Exception($ex->getMessage());
} catch (\Exception $ex) {
$this->error[] = $ex->getMessage();
throw new \Exception($ex->getMessage());
}
}
public function validaciones_php()
{
}
public function validaciones_postgres()
{
// Validar encoding del motor postgres
$encoding = $this->entorno()->db()->consultar("SHOW SERVER_ENCODING;");
if (empty($encoding) or trim(strtolower(str_replace('-', '', $encoding[0]['server_encoding']))) !== 'utf8') {
$this->error[] = "El encoding del motor postgres es: " . $encoding[0]['server_encoding'] . " y debería ser UTF8.";
}
// Validar COLLATE del motor postgres
$collate = $this->entorno()->db()->consultar("SHOW LC_COLLATE;");
if (empty($collate) or trim(strtolower(str_replace('-', '', $collate[0]['lc_collate']))) !== 'es_ar.utf8') {
$this->error[] = "La variable LC_COLLATE del motor postgres es: " . $collate[0]['lc_collate'] . " y debería ser es_AR.UTF8.";
}
// Validar CTYPE del motor postgres
$ctype = $this->entorno()->db()->consultar("SHOW LC_CTYPE;");
if (empty($ctype) or trim(strtolower(str_replace('-', '', $ctype[0]['lc_ctype']))) !== 'es_ar.utf8') {
$this->error[] = "La variable LC_CTYPE del motor postgres es: " . $ctype[0]['lc_ctype'] . " y debería ser es_AR.UTF8.";
}
}
public function validaciones_version()
{
$config = new configurador();
$dir = $config->get_config_dir();
// Validar que todas las migraciones se hayan ejecutado
$app = new PhinxApplication();
$consoleTextWrapper = new TextWrapper($app, [
'configuration' => $dir.'/../bin/phinx.php',
'parser' => 'php'
]);
$array_de_las_migraciones = $consoleTextWrapper->getStatus('default');
$errores_en_el_array = strpos($array_de_las_migraciones, '** MISSING **');
$numero_de_migracion = trim(substr($array_de_las_migraciones, $errores_en_el_array - 19, 10));
if (!empty($numero_de_migracion) and !empty($errores_en_el_array)) {
$this->error[] = 'Hay un error con la Migración: ' . $numero_de_migracion . '.';
}
if ($consoleTextWrapper->getExitCode()) {
$this->error[] = "La version del codigo no se corresponde con la de la base de datos." . PHP_EOL . "Por favor ejecute el siguiente comando para incorporar los ultimos cambios en la base de datos:" . PHP_EOL . " ./bin/phinx migrate";
}
}
public function validaciones_integracion()
{
// Comparar fecha local (PHP) con la fecha del servidor postgres
$date_php = date("Y-m-d");
$date_postgres = $this->entorno()->db()->consultar("SELECT now()::date;");
if (empty($date_postgres) or $date_postgres[0]['now'] !== $date_php) {
$this->error[] = "La fecha del servidor web '" . $date_php . "' y la fecha del motor postgres '" . $date_postgres[0]['now'] ."' no coinciden.";
}
// Compara la hora local con la hora del servidor postgres
$hora_php = date("H:i");
$time_postgres = $this->entorno()->db()->consultar("SELECT to_char(now(), 'HH24:MI') as time;");
if (empty($time_postgres) or $time_postgres[0]['time'] !== $hora_php) {
$this->error[] = "La hora del servidor web '" . $hora_php . "' y la hora del motor postgres '" . $time_postgres[0]['time'] ."' no coinciden.";
}
// Validar conexiones
$config = new configurador();
$dir = $config->get_config_dir();
$id_proyecto = parse_ini_file($dir . "/../toba/proyecto.ini", true)['proyecto']['id'];
if (!isset($config->sq_ini[ $id_proyecto ]['validar_comunicacion_sistemas']) or
($config->sq_ini[ $id_proyecto ]['validar_comunicacion_sistemas'] and $config->sq_ini[ $id_proyecto ]['validar_comunicacion_sistemas'] == 'true')) {
// Validar restHooks
try {
lib::rest_hooks();
} catch (\Exception $ex) {
$this->error[] = "Existen errores al instanciar RestHooks. " . PHP_EOL . $ex->getMessage() . PHP_EOL;
}
// Validar conexion con Nucleo
if (in_array('nucleo', $this->conexiones_sistemas)) {
try {
lib::entorno()->get_cliente('nucleo')->get('status');
} catch (\Exception $ex) {
$this->error[] = "No se pudo conectar con el Nucleo. " . PHP_EOL . $ex->getMessage() . PHP_EOL;
}
}
// Validar conexion con la Unidad de venta
if (in_array('unidad_venta', $this->conexiones_sistemas)) {
try {
lib::entorno()->get_cliente('unidad_venta')->get('status');
} catch (\Exception $ex) {
$this->error[] = "No se pudo conectar con la Unidad de venta. " . PHP_EOL . $ex->getMessage() . PHP_EOL;
}
}
// Validar conexion con SQ-Pagos-Backend
if (in_array('sq_pagos_backend', $this->conexiones_sistemas)) {
try {
lib::entorno()->get_cliente('sq_pagos_backend')->get('status');
} catch (\Exception $ex) {
$this->error[] = "No se pudo conectar con SQ-Pagos-Backend. " . PHP_EOL . $ex->getMessage() . PHP_EOL;
}
}
// Validar configuracion basica de AFIP
if (in_array('afip', $this->conexiones_sistemas)) {
try {
if ($config->sq_ini['factura_afip']['cuit'] !== '00000000000') {
$intanciador_afip = new instanciador_afip($this->entorno());
}
} catch (\Exception $ex) {
$this->error[] = "No se pudo conectar con AFIP. " . PHP_EOL . $ex->getMessage() . PHP_EOL;
}
}
} else {
$this->notificaciones[] = "No se estan validando las conexiones con los sistemas" . PHP_EOL . "Elimine la entrada 'validar_comunicacion_sistemas' en el archivo 'sq.ini' para activarla";
}
}
public function iniciar($msg)
{
$params = $this->entorno()->db()->get_parametros();
if ($this->imprime_salida) {
echo PHP_EOL . " ------------------------------------------------------------------------";
}
if ($this->imprime_salida) {
echo PHP_EOL . " " . $msg . " del proyecto";
}
if ($this->imprime_salida) {
echo PHP_EOL . " ------------------------------------------------------------------------";
}
}
public function imprimir_linea()
{
if ($this->imprime_salida) {
echo PHP_EOL . " ------------------------------------------------------------------------" . PHP_EOL;
}
}
}
lib-develop/src/siu/sq/lib/procesos/proceso_verificar_actividad_workers.php 0000664 0000000 0000000 00000004112 14430530062 0027671 0 ustar 00root root 0000000 0000000 iniciar_workers();
$this->finalizar_registro_ejecucion(constantes::PROCESO_EJECUCION_ESTADO_OK);
} catch (error $e) {
$this->agregar_notificacion($e->getMessage(), 'error');
$this->finalizar_registro_ejecucion(constantes::PROCESO_EJECUCION_ESTADO_ERROR);
$this->entorno()->log()->err(__CLASS__ . ":" . $e->getTraceAsString());
throw $e;
}
}
protected function iniciar_workers()
{
$config = new configurador();
// Obtener los pid
if (glob($config->get_config_dir() ."/*.pid")) {
foreach (glob($config->get_config_dir() . "/*.pid") as $file) {
$name = basename($file);
$needle = strstr($name, '_', true);
switch ($needle) {
case 'scheduler':
$scheduler_pid = file_get_contents($file);
$this->agregar_notificacion('Scheduler pid: ' . $scheduler_pid, 'info');
break;
case 'workers':
$workers_pid = file_get_contents($file);
$this->agregar_notificacion('Worker pid: ' . $workers_pid, 'info');
break;
}
}
} else {
$this->agregar_notificacion('No se pudo encontrar ningun archivo pid', 'error');
}
if ((!isset($scheduler_pid) or !isset($workers_pid)) or (!file_exists("/proc/$scheduler_pid") or !file_exists("/proc/$workers_pid"))) {
$this->agregar_notificacion('Se inician los workers', 'info');
// Si no estan activos,reactivar el proceso "iniciar_workers" y dejarlo en segundo plano
shell_exec($config->get_config_dir() . "/../bin/sq iniciar_workers > /dev/null 2>&1 &");
}
}
}
lib-develop/src/siu/sq/lib/rest/ 0000775 0000000 0000000 00000000000 14430530062 0017012 5 ustar 00root root 0000000 0000000 lib-develop/src/siu/sq/lib/rest/sq_autenticacion.php 0000664 0000000 0000000 00000001220 14430530062 0023047 0 ustar 00root root 0000000 0000000 usuario_toba = $usuario;
}
public function get_usuario(request $request = null)
{
$usuario = parent::get_usuario();
if (isset($usuario)) {
return $usuario;
} else {
return $this->usuario_toba;
}
}
}
lib-develop/src/siu/sq/lib/rest/sq_autorizacion.php 0000664 0000000 0000000 00000000523 14430530062 0022735 0 ustar 00root root 0000000 0000000 entorno);
break;
case constantes::MEDIO_PAGO_PAYPERTIC:
return new paypertic($this->entorno);
break;
default:
$msg = "El ID: '" . $id_medio_pago . "' de medio de pago no es valido para cargar un gestor de pago.";
lib::entorno()->log()->err(__METHOD__ . ": " . $msg);
throw new error_negocio($msg);
}
} else {
$msg = "No esta seteado el ID del medio de pago.";
lib::entorno()->log()->err(__METHOD__ . ": " . $msg);
throw new error_negocio($msg);
}
}
public function cliente()
{
}
public function afip()
{
}
}
lib-develop/src/siu/sq/lib/sistemas_externos/gestor_pago.php 0000664 0000000 0000000 00000000736 14430530062 0024644 0 ustar 00root root 0000000 0000000 get_cliente('sq_pagos_backend')->put('mercado_pago/expirar_payment/' . $id_referencia);
} catch (\GuzzleHttp\Exception\ClientException $ex) {
$msg = $ex->getResponse()->getBody()->getContents() . ' :' . $id_referencia;
lib::entorno()->log()->err(__METHOD__ . ": " . $msg);
throw new error($msg);
} catch (\Exception $ex) {
$msg = $ex->getMessage() . ' :' . $id_referencia;
lib::entorno()->log()->err(__METHOD__ . ": " . $msg);
throw new error($msg);
}
}
/**
* @param $id_referencia (Id externo de la cobranza)
* @throws error
*/
public function devolver_pago($id_referencia)
{
try {
lib::entorno()->get_cliente('sq_pagos_backend')->put('mercado_pago/devolver_payment/' . $id_referencia);
} catch (\GuzzleHttp\Exception\ClientException $ex) {
$msg = $ex->getResponse()->getBody()->getContents() . ' :' . $id_referencia;
lib::entorno()->log()->err(__METHOD__ . ": " . $msg);
throw new error($msg);
} catch (\Exception $ex) {
$msg = $ex->getMessage() . ' :' . $id_referencia;
lib::entorno()->log()->err(__METHOD__ . ": " . $msg);
throw new error($msg);
}
}
/**
* @param $id_referencia (Id de Merchant Order)
* @throws error
*/
public function expirar_url_de_pago($id_referencia)
{
try {
$merchant_order = $this->obtener_merchant_order_mp($id_referencia);
$id_preferencia = $merchant_order['preference_id'];
lib::entorno()->get_cliente('sq_pagos_backend')->put('mercado_pago/expirar_preferencia/' . $id_preferencia);
} catch (\GuzzleHttp\Exception\ClientException $ex) {
$msg = $ex->getResponse()->getBody()->getContents() . ' :' . $id_preferencia;
lib::entorno()->log()->err(__METHOD__ . ": " . $msg);
throw new error($msg);
} catch (\Exception $ex) {
$msg = $ex->getMessage() . ' :' . $id_preferencia;
lib::entorno()->log()->err(__METHOD__ . ": " . $msg);
throw new error($msg);
}
}
/**
* @param $id_referencia (Id de Merchant Order)
* @return mixed
* @throws error
*/
public function obtener_datos_del_pago($id_referencia)
{
try {
$response = lib::entorno()->get_cliente('sq_pagos_backend')->get('mercado_pago/payment/' . $id_referencia);
$datos = json_decode($response->getBody()->getContents(), true);
return $datos;
} catch (\GuzzleHttp\Exception\ClientException $ex) {
$msg = $ex->getResponse()->getBody()->getContents() . ' :' . $id_referencia;
lib::entorno()->log()->err(__METHOD__ . ": " . $msg);
throw new error($msg);
} catch (\Exception $ex) {
$msg = $ex->getMessage() . ' :' . $id_referencia;
lib::entorno()->log()->err(__METHOD__ . ": " . $msg);
throw new error($msg);
}
}
/**
* @param $parametros
* @return mixed
* @throws error
*/
public function obtener_datos_de_pagos($parametros)
{
try {
$payments = [];
// Consulta inicial
$response = $this->entorno()->get_cliente('sq_pagos_backend')->get('mercado_pago/payment', ['query' => $parametros]);
$datos_response = json_decode($response->getBody()->getContents(), true);
// Guardo primera tanda de payments recibidos.
$payments = $datos_response['results'];
// Hay paginado?
if (isset($datos_response['paging'])) {
$paging = $datos_response['paging'];
}
// Vuelvo a realizar n consultas para traer todo.
if (!empty($paging) and ($paging['limit'] < $paging['total'])) {
$cant_paginas = ceil($paging['total'] / $paging['limit']);
for ($pagina = 1; $pagina <= $cant_paginas; $pagina++) {
$parametros['offset'] = $pagina * $paging['limit'];
$response = $this->entorno()->get_cliente('sq_pagos_backend')->get('mercado_pago/payment', ['query' => $parametros]);
$datos_response = json_decode($response->getBody()->getContents(), true);
// Voy sumando payments de siguientes tandas
$payments = array_merge($payments, $datos_response['results']);
}
}
// devuelvo todos los payments
return $payments;
} catch (\GuzzleHttp\Exception\ClientException $ex) {
if ($ex->getCode() != 423) {
$msg = $ex->getResponse()->getBody()->getContents();
lib::entorno()->log()->err(__METHOD__ . ": " . $msg);
throw new error($msg);
}
} catch (\Exception $ex) {
$msg = $ex->getMessage();
lib::entorno()->log()->err(__METHOD__ . ": " . $msg);
throw new error($msg);
}
}
//------------------------------------------------------------------------------------------------------------------
public function obtener_merchant_order_mp($id_merchant_order)
{
try {
$response = lib::entorno()->get_cliente('sq_pagos_backend')->get('mercado_pago/merchant_order/' . $id_merchant_order);
$merchant_order = json_decode($response->getBody()->getContents(), true);
return $merchant_order;
} catch (\GuzzleHttp\Exception\ClientException $ex) {
$msg = $ex->getResponse()->getBody()->getContents() . ' :' . $id_merchant_order;
lib::entorno()->log()->err(__METHOD__ . ": " . $msg);
throw new error($msg);
} catch (\Exception $ex) {
$msg = $ex->getMessage() . ' :' . $id_merchant_order;
lib::entorno()->log()->err(__METHOD__ . ": " . $msg);
throw new error($msg);
}
}
/**
* @throws error
*/
public function get_metodos_pagos()
{
try {
$response = lib::entorno()->get_cliente('sq_pagos_backend')->get('mercado_pago/metodos_pagos');
$metodos_pagos = json_decode($response->getBody()->getContents(), true);
return $metodos_pagos;
} catch (\GuzzleHttp\Exception\ClientException $ex) {
$msg = $ex->getResponse()->getBody()->getContents();
lib::entorno()->log()->err(__METHOD__ . ": " . $msg);
throw new error($msg);
} catch (\Exception $ex) {
$msg = $ex->getMessage();
lib::entorno()->log()->err(__METHOD__ . ": " . $msg);
throw new error($msg);
}
}
}
lib-develop/src/siu/sq/lib/sistemas_externos/paypertic.php 0000664 0000000 0000000 00000011572 14430530062 0024333 0 ustar 00root root 0000000 0000000 get_cliente('sq_pagos_backend')->put('paypertic/expirar_payment/' . $id_referencia);
} catch (\GuzzleHttp\Exception\ClientException $ex) {
$msg = $ex->getResponse()->getBody()->getContents() . ' :' . $id_referencia;
lib::entorno()->log()->err(__METHOD__ . ": " . $msg);
throw new error($msg);
} catch (\Exception $ex) {
$msg = $ex->getMessage() . ' :' . $id_referencia;
lib::entorno()->log()->err(__METHOD__ . ": " . $msg);
throw new error($msg);
}
}
/**
* @param $id_referencia (Id externo de la cobranza)
* @throws error
*/
public function devolver_pago($id_referencia)
{
try {
lib::entorno()->get_cliente('sq_pagos_backend')->put('paypertic/devolver_payment/' . $id_referencia);
} catch (\GuzzleHttp\Exception\ClientException $ex) {
$msg = $ex->getResponse()->getBody()->getContents() . ' :' . $id_referencia;
lib::entorno()->log()->err(__METHOD__ . ": " . $msg);
throw new error($msg);
} catch (\Exception $ex) {
$msg = $ex->getMessage() . ' :' . $id_referencia;
lib::entorno()->log()->err(__METHOD__ . ": " . $msg);
throw new error($msg);
}
}
/**
* @param $id_referencia
* @throws error
*/
public function expirar_url_de_pago($id_referencia)
{
/**
* TODO: Expirar preferencia de PPT
*/
}
/**
* @param $id_referencia
* @return mixed
* @throws error
*/
public function obtener_datos_del_pago($id_referencia)
{
try {
$response = lib::entorno()->get_cliente('sq_pagos_backend')->get('paypertic/payment/' . $id_referencia);
$datos = json_decode($response->getBody()->getContents(), true);
return $datos;
} catch (\GuzzleHttp\Exception\ClientException $ex) {
if ($ex->getCode() != 423) {
$msg = $ex->getResponse()->getBody()->getContents() . ' :' . $id_referencia;
lib::entorno()->log()->err(__METHOD__ . ": " . $msg);
throw new error($msg);
}
} catch (\Exception $ex) {
$msg = $ex->getMessage() . ' :' . $id_referencia;
lib::entorno()->log()->err(__METHOD__ . ": " . $msg);
throw new error($msg);
}
}
/**
* @param $parametros
* @return mixed
* @throws error
*/
public function obtener_datos_de_pagos($parametros)
{
try {
$payments = [];
// Consulta inicial
$response = $this->entorno()->get_cliente('sq_pagos_backend')->get('paypertic/payments', ['query' => $parametros]);
$datos_response = json_decode($response->getBody()->getContents(), true);
if (isset($datos_response['payments'])) {
// Guardo primera tanda de payments recibidos.
$payments = $datos_response['payments'];
// Vuelvo a realizar n consultas para traer lo que falta, si es que es necesario
if ($datos_response['size'] >= $datos_response['limit']) {
$cant_paginas = ceil($datos_response['size'] / $datos_response['limit']);
for ($pagina = 1; $pagina <= $cant_paginas; $pagina++) {
$parametros['page'] = $pagina;
$response = $this->entorno()->get_cliente('sq_pagos_backend')->get('paypertic/payments', ['query' => $parametros]);
$datos_response = json_decode($response->getBody()->getContents(), true);
// Voy sumando payments de siguientes tandas
$payments = array_merge($payments, $datos_response['payments']);
}
}
// devuelvo todos los payments
return $payments;
} else {
return [];
}
} catch (\GuzzleHttp\Exception\ClientException $ex) {
if ($ex->getCode() != 423) {
$msg = $ex->getResponse()->getBody()->getContents();
lib::entorno()->log()->err(__METHOD__ . ": " . $msg);
throw new error($msg);
}
} catch (\Exception $ex) {
$msg = $ex->getMessage() ;
lib::entorno()->log()->err(__METHOD__ . ": " . $msg);
throw new error($msg);
}
}
/**
* @throws error
*/
public function get_metodos_pagos()
{
}
}
lib-develop/src/siu/sq/lib/sistemas_externos/sistema_externo.php 0000664 0000000 0000000 00000000643 14430530062 0025541 0 ustar 00root root 0000000 0000000 entorno = $entorno;
if ($id !== null) {
$this->cargar($id);
}
}
// Metodo opcional
protected function cargar($id)
{
}
protected function entorno()
{
return $this->entorno;
}
}
lib-develop/src/siu/sq/lib/transaccion.php 0000664 0000000 0000000 00000007102 14430530062 0021052 0 ustar 00root root 0000000 0000000 entorno = $entorno;
$this->id = $id;
}
/**
* @return entorno
*/
public function entorno()
{
if (!isset($this->entorno)) {
throw new error("PROCESO - El entorno no esta cargado");
}
return $this->entorno;
}
// Metodos obligatorios
abstract protected function procesar_especifico();
public function procesar()
{
try {
$this->entorno()->db()->abrir_transaccion();
$this->procesar_especifico();
$this->entorno()->db()->cerrar_transaccion();
} catch (error_db $e) {
$this->entorno()->db()->abortar_transaccion($e->get_mensaje());
$this->entorno()->log()->error(__METHOD__ . ": ERROR_DB: " . $e->getMessage());
throw $e;
} catch (\toba_error_db $e) {
$this->entorno()->db()->abortar_transaccion($e->get_mensaje());
$this->entorno()->log()->error(__METHOD__ . ": TOBA_ERROR_DB: " . $e->get_mensaje() . " SQL: " . $e->get_sql_ejecutado());
throw $e;
} catch (error_negocio $e) {
$this->entorno()->db()->abortar_transaccion($e->get_mensaje());
$this->entorno()->log()->error(__METHOD__ . ": ERROR_NEGOCIO: " . $e->get_mensaje());
throw $e;
} catch (error $e) {
$this->entorno()->db()->abortar_transaccion($e->get_mensaje());
$this->entorno()->log()->error(__METHOD__ . ": ERROR: " . $e->get_mensaje());
throw $e;
} catch (\Exception $e) {
$this->entorno()->db()->abortar_transaccion($e->getMessage());
$this->entorno()->log()->error(__METHOD__ . ": EXCEPTION: " . $e->getMessage());
throw $e;
}
}
public function get_datos()
{
return $this->datos;
}
public function set_datos($datos)
{
$this->datos = $datos;
}
public function get_id()
{
return $this->id;
}
public function set_id($id)
{
$this->id = $id;
}
protected function validar_campos_obligatorios($datos, $campos_obligatorios, $prefijo_desc = '')
{
$error_obligatorios = false;
foreach ($campos_obligatorios as $nombre_campo) {
if (!in_array($nombre_campo, $datos, true)
and (!isset($datos[$nombre_campo])
or $datos[$nombre_campo] === null)) {
$error_obligatorios[] = $nombre_campo;
}
}
if ($error_obligatorios) {
throw new error_negocio($prefijo_desc . ": Los siguientes campos son obligatorios: '"
. implode("', '", $error_obligatorios) . "'.");
}
}
protected function validar_datos_cargados()
{
if (!isset($this->datos)) {
throw new error(__METHOD__ . ': no hay datos para procesar');
}
}
protected function validar_id()
{
if (!isset($this->id)) {
throw new error(__METHOD__ . ': el id de transaccion es invalido');
}
}
//----------- DEPRECATED
protected $es_alta;
public function es_alta()
{
return $this->es_alta;
}
public function set_es_alta($es_alta)
{
$this->es_alta = $es_alta;
}
}
lib-develop/src/siu/sq/lib/transacciones/ 0000775 0000000 0000000 00000000000 14430530062 0020671 5 ustar 00root root 0000000 0000000 lib-develop/src/siu/sq/lib/transacciones/catalogo.php 0000664 0000000 0000000 00000000401 14430530062 0023166 0 ustar 00root root 0000000 0000000 entorno);
}
}
lib-develop/src/siu/sq/lib/transacciones/transaccion_log_interaccion_externa.php 0000664 0000000 0000000 00000001374 14430530062 0030660 0 ustar 00root root 0000000 0000000 validar_datos_cargados();
// Nuevo log interacción externa
$log = lib::catalogo_modelo()->log_interaccion_externa();
$log->set_tipo($this->datos['tipo']);
$log->set_sistema_externo($this->datos['sistema_externo']);
$log->set_ocurrido_en($this->datos['ocurrido_en']);
$log->set_mensaje($this->datos['mensaje']);
$log->set_recurso($this->datos['recurso']);
$log->set_verbo($this->datos['verbo']);
$log->guardar();
$this->id = $log->get_id();
}
}
lib-develop/src/siu/sq/lib/util/ 0000775 0000000 0000000 00000000000 14430530062 0017012 5 ustar 00root root 0000000 0000000 lib-develop/src/siu/sq/lib/util/Documentos/ 0000775 0000000 0000000 00000000000 14430530062 0021132 5 ustar 00root root 0000000 0000000 lib-develop/src/siu/sq/lib/util/Documentos/AraiDocumentos.php 0000664 0000000 0000000 00000015732 14430530062 0024570 0 ustar 00root root 0000000 0000000 get_logs_dir();
if (!empty($param_config->sq_ini['AraiDocumentos']['LOGS_DIR'])) {
$logs_dir = $param_config->sq_ini['AraiDocumentos']['LOGS_DIR'];
}
$config = [
"host_arai" => $param_config->sq_ini['AraiDocumentos']['HOST'],
"usr_arai" => $param_config->sq_ini['AraiDocumentos']['USER'],
"pass_arai" => $param_config->sq_ini['AraiDocumentos']['PASS'],
"logs_dir" => $logs_dir,
"queue_path" => $param_config->sq_ini['AraiDocumentos']['QUEUE_PATH'],
"sistema_origen" => isset($param_config->sq_ini['AraiDocumentos']['SISTEMA_ORIGEN']) ? $param_config->sq_ini['AraiDocumentos']['SISTEMA_ORIGEN'] : null,
"queue_temp_dir" => $param_config->sq_ini['AraiDocumentos']['QUEUE_TEMP_DIR'],
"db_queue" => $param_config->sq_ini['AraiDocumentos']['DB_QUEUE'],
"dbq_host" => $param_config->sq_ini['AraiDocumentos']['DB_HOST'],
"dbq_port" => $param_config->sq_ini['AraiDocumentos']['DB_PORT'],
"dbq_user" => $param_config->sq_ini['AraiDocumentos']['DB_USER'],
"dbq_password" => $param_config->sq_ini['AraiDocumentos']['DB_PASS'],
"dbq_table_name" => $param_config->sq_ini['AraiDocumentos']['DB_TABLE'],
"polling_interval" => $param_config->sq_ini['AraiDocumentos']['POLLING_INVERVAL'],
"rest_nucleo" => $param_config->sq_ini['AraiDocumentos']['REST_NUCLEO']
];
$lib->setConfig($config);
self::$doc_lib = $lib;
}
return self::$doc_lib;
}
/**
* @return \SIU\DocumentosCli\Services\Bandejas
* @throws \Exception
*/
public static function getBandejasService()
{
$servicios_bandejas = self::getInstancia()->getBandejasService();
return $servicios_bandejas;
}
/**
* @return \SIU\DocumentosCli\Services\Documentos
* @throws \Exception
*/
public static function getDocumentosService()
{
$servicios_documentos = self::getInstancia()->getDocumentosService();
return $servicios_documentos;
}
public static function exportarDocumento($data)
{
$cont = self::getInstancia()->getContainter();
$url = isset($cont['config']['rest_nucleo']) ? $cont['config']['rest_nucleo'] : '';
$archivo = new Archivo();
$archivo->setContenidoBase64($data['archivo']);
$autorizacion = new Autorizacion();
$autorizacion->setModelo(Autorizacion::MODELO_SIMPLE);
$autorizacion->addPersona($data['autorizacion']['usuario'], Autorizacion::NIVEL_BASICA);
$origen = new Origen();
$origen->setIDUsuarioSSO($data['origen']['id_usuario_sso']); //Usuario logueado
$origen->setIDInstalacion('sq_nucleo');
$origen->setCuentaUsuario($data['origen']['cuenta_usuario']);
$documento = new Documento();
$documento->setTipo($data['documento']['tipo']);
$documento->setTitulo($data['documento']['titulo']);
$documento->setDescripcion($data['documento']['descripcion']);
$documento->setIDTramite($data['documento']['id_tramite']);
$documento->setURL($url);
$documento->setArchivo($archivo);
$documento->setAutorizacion($autorizacion);
$documento->setOrigen($origen);
$documento->setReferenciaInterna($data['documento']['referencia_interna']); // Nro
$documento->setIdentificador($data['documento']['identificador']);
$documento->setAtributos($data['documento']['atributos']); // Opcional, atributos de busqueda
$servicios_documentos = self::getInstancia()->getDocumentosService();
return $servicios_documentos->postDocumento($documento);
//$servicios_documentos->postDocumentoAsync($documento);
}
public static function getDocumento($uid_documento)
{
try {
$servicios_documentos = self::getInstancia()->getDocumentosService();
return $servicios_documentos->getDocumento($uid_documento);
} catch (\Exception $e) {
return false;
}
}
public static function getNotificacion($uid_notificacion)
{
try {
$notificaciones_service = self::getInstancia()->getNotificacionesService();
return $notificaciones_service->getNotificacion($uid_notificacion);
} catch (\Exception $e) {
return false;
}
}
public static function downloadDocumento($uid_documento, $filtro = null)
{
try {
$servicios_documentos = self::getInstancia()->getDocumentosService();
return $servicios_documentos->downloadDocumento($uid_documento);
} catch (\Exception $e) {
return false;
}
}
public static function vincularTramite($uid_documento, $data)
{
try {
$servicios_documentos = self::getInstancia()->getDocumentosService();
return $servicios_documentos->vincularTramite($uid_documento, $data);
} catch (\Exception $e) {
return false;
}
}
public static function getTramites($id_usuario_sso, $id_area = null)
{
try {
$servicios_tramites = self::getInstancia()->getTramitesService();
return $servicios_tramites->getTramites($id_usuario_sso);
} catch (\Exception $e) {
return false;
}
}
public static function getTramite($id_tramite)
{
try {
$servicios_tramites = self::getInstancia()->getTramitesService();
return $servicios_tramites->getTramite($id_tramite);
} catch (\Exception $e) {
return false;
}
}
public static function getUsuarios($filtro)
{
try {
$servicios_usuarios = self::getInstancia()->getUsuariosService();
return $servicios_usuarios->getUsuarios($filtro);
} catch (\Exception $e) {
return false;
}
}
}
lib-develop/src/siu/sq/lib/util/auth_method_factory.php 0000664 0000000 0000000 00000000676 14430530062 0023564 0 ustar 00root root 0000000 0000000 marcar("Inicio medición");
}
/**
* Guarda una marca en la l�nea de tiempo
*/
public function marcar($nombre)
{
$microtime = explode(' ', microtime());
$this->marcas[$this->indice]["t"] = $microtime[1] . substr($microtime[0], 1);
$this->marcas[$this->indice]["n"] = $nombre;
$this->indice++;
}
/**
* Calcula el tiempo enntre la primer y �ltima marca registrada
* @return float
*/
public function tiempo_acumulado()
{
$ultimo = (count($this->marcas)-1);
return (($this->marcas[$ultimo]['t']) - ($this->marcas[0]['t']));
}
/**
* Calcula el tiempo enntre la anteultima y ultima marca
* @return float
*/
public function tiempo_ultima_marca()
{
if (count($this->marcas)<2) {
throw new error('Solo hay una marca');
}
$ultimo = (count($this->marcas)-1);
$anteultimo = $ultimo -1;
$tiempo = (($this->marcas[$ultimo]['t']) - ($this->marcas[$anteultimo]['t']));
return number_format($tiempo, 3, '.', '');
}
/**
* Retorna la marcas en un arreglo
*/
public function get_marcas()
{
$marcas = array();
$marca_anterior = $this->marcas[0]['t'];
for ($f=0;$fmarcas);$f++) {
$marca_actual = $this->marcas[$f]['t'];
$marcas[$f]['texto'] = $this->marcas[$f]['n'];
$marcas[$f]['tiempo'] = number_format(($marca_actual - $marca_anterior), 3, '.', '');
$marca_anterior = $marca_actual;
}
return $marcas;
}
}
lib-develop/src/siu/sq/lib/util/fecha.php 0000664 0000000 0000000 00000024637 14430530062 0020605 0 ustar 00root root 0000000 0000000 timestamp = strtotime(date("Y-m-d H:i:s"));
} else {
list($arg) = func_get_args();
$this->set_fecha($arg);
}
}
//Metodos para setear la variable interna.
public function set_fecha($fecha)
{
if (isset($fecha)) {
$this->timestamp = strtotime($fecha);
}
}
public function set_timestamp($timestamp)
{
$this->timestamp = $timestamp;
}
//Metodos para obtener una fecha desplazada en dias, meses o a�os. Se debe incluir el signo en el parametro.
public function get_fecha_desplazada($dias)
{
$aux = strtotime("$dias day", $this->timestamp);
return $aux;
}
public function get_fecha_desplazada_meses($meses)
{
$aux = strtotime("$meses month", $this->timestamp);
return $aux;
}
public function get_fecha_desplazada_anios($anio)
{
$aux = strtotime("$anio year", $this->timestamp);
return $aux;
}
//Metodos de comparacion de fechas, siempre se compara contra la fecha cargada en la variable interna.
public function es_menor_que($fecha2)
{
if ($this->get_diferencia($fecha2) > 0) {
return true;
}
return false;
}
public function es_mayor_que($fecha2)
{
if ($this->get_diferencia($fecha2) < 0) {
return true;
}
return false;
}
public function es_igual_que($fecha2)
{
if ($this->get_diferencia($fecha2) == 0) {
return true;
}
return false;
}
//Metodos para obtener la fecha en distintos formatos, se utiliza para recuperar la fecha interna.
public function get_timestamp_db()
{
$aux = date("Y-m-d H:i:s", $this->timestamp);
return $aux;
}
public function get_fecha_db()
{
$aux = date("Y-m-d", $this->timestamp);
return $aux;
}
public function get_timestamp_pantalla()
{
$aux = date("d/m/Y H:i:s", $this->timestamp);
return $aux;
}
public function get_fecha_pantalla()
{
$aux = date("d/m/Y", $this->timestamp);
return $aux;
}
//Metodos estaticos para convertir fechas
public function convertir_fecha_a_timestamp($fecha)
{
$timestamp = strtotime($fecha);
$aux = date("Y-m-d H:i:s", $timestamp);
return $aux;
}
public function convertir_timestamp_a_fecha($timestamp)
{
$aux = null;
if (!is_null($timestamp)) {
$aux = date("Y-m-d", strtotime($timestamp));
}
return $aux;
}
//Metodos para obtener la hora apartir de un timestamp
public function convertir_timestamp_a_hora($timestamp)
{
return date("H:i", strtotime($timestamp));
}
//Metodo que devuelve si el dia es sabado o domingo.
public function es_dia_habil()
{
$aux = $this->get_parte('dia_semana'); //0 es para Domingo y 6 es para Sabado
if (($aux > '0') and ($aux < '6')) {
return true;
}
return false;
}
//Metodo que devuelve una parte especifica de la fecha.
public function get_parte($parte)
{
switch ($parte) {
case 'dia':
$parte_fecha = 'mday';
break;
case 'mes':
$parte_fecha = 'mon';
break;
case 'anio':
case 'a�o':
$parte_fecha = 'year';
break;
case 'dia_semana':
$parte_fecha = 'wday';
break;
default:
$parte_fecha = 'mday';
} // switch
$aux = $this->separar_fecha_en_partes();
return ($aux[$parte_fecha]);
}
public function separar_fecha_en_partes()
{
return getdate($this->timestamp);
}
//Metodo que calcula la diferencia de dias entre dos fechas.
public function cantidadDiasEntreDosFechas($fecha1, $fecha2, $hora_limite)
{
// Obtener dias
$f_inicio = strtotime(substr($fecha1, 0, 10));
$f_fin = strtotime(substr($fecha2, 0, 10));
$diff = $f_fin - $f_inicio;
$dias = round($diff / 86400) + 1;
// Obtener datos del timestamp
$fecha_desde = getdate(strtotime($fecha1));
$fecha_hasta = getdate(strtotime($fecha2));
// Descontar segun hora limite.
if (strtotime($fecha_desde['hours'].':'.$fecha_desde['minutes']) > strtotime($hora_limite)) {
$dias -= 0.5;
}
if (strtotime($fecha_hasta['hours'].':'.$fecha_hasta['minutes']) < strtotime($hora_limite)) {
$dias -= 0.5;
}
return $dias;
}
private function get_diferencia($fecha2)
{
if (! is_null($fecha2)) {
$timestamp2 = strtotime($fecha2);
$diff_segs = $timestamp2 - $this->timestamp;
if ($diff_segs < 0) {
$resultado = ceil($diff_segs / 86400);
} else {
$resultado = floor($diff_segs / 86400);
}
return $resultado;
}
}
public static function get_nombre_mes($id_mes)
{
return fecha::get_mes($id_mes, 'mes');
}
public static function get_mes($id_mes, $dimencion)
{
$meses = fecha::get_meses_anio();
foreach (array_keys($meses) as $id) {
if ($meses[$id]['id'] == $id_mes) {
return $meses[$id][$dimencion];
}
}
return "";
}
public static function get_meses_anio()
{
//El dia que windows cumpla con el RFC 1766 esto va a funcar correctamente.
/*$i = 0;
$meses = array();
setlocale(LC_TIME, "es-ES");
$next_fecha = strtotime(date("Y-m-d H:i:s"));
while ($i < 12){
$mes_loco = strftime('%B-%m', $next_fecha);
list($mes_letra, $mes_nro) = explode('-', $mes_loco);
$meses[$mes_nro - 1] = array('id'=> $mes_nro, 'mes' => ucfirst($mes_letra));
$next_fecha = strtotime("+1 month", $next_fecha);
$i++;
}//while */
//Por ahora lo hacemos asi mas croto.
$meses[1]['id'] = 1;
$meses[1]['mes'] = "Enero";
$meses[1]['nro'] = "01";
$meses[1]['mes_abreviado'] = "Ene.";
$meses[2]['id'] = 2;
$meses[2]['mes'] = "Febrero";
$meses[2]['nro'] = "02";
$meses[2]['mes_abreviado'] = "Feb.";
$meses[3]['id'] = 3;
$meses[3]['mes'] = "Marzo";
$meses[3]['nro'] = "03";
$meses[3]['mes_abreviado'] = "Mar.";
$meses[4]['id'] = 4;
$meses[4]['mes'] = "Abril";
$meses[4]['nro'] = "04";
$meses[4]['mes_abreviado'] = "Abr.";
$meses[5]['id'] = 5;
$meses[5]['mes'] = "Mayo";
$meses[5]['nro'] = "05";
$meses[5]['mes_abreviado'] = "May.";
$meses[6]['id'] = 6;
$meses[6]['mes'] = "Junio";
$meses[6]['nro'] = "06";
$meses[6]['mes_abreviado'] = "Jun.";
$meses[7]['id'] = 7;
$meses[7]['mes'] = "Julio";
$meses[7]['nro'] = "07";
$meses[7]['mes_abreviado'] = "Jul.";
$meses[8]['id'] = 8;
$meses[8]['mes'] = "Agosto";
$meses[8]['nro'] = "08";
$meses[8]['mes_abreviado'] = "Ago.";
$meses[9]['id'] = 9;
$meses[9]['mes'] = "Septiembre";
$meses[9]['nro'] = "09";
$meses[9]['mes_abreviado'] = "Sep.";
$meses[10]['id'] = 10;
$meses[10]['mes'] = "Octubre";
$meses[10]['nro'] = "10";
$meses[10]['mes_abreviado'] = "Oct.";
$meses[11]['id'] = 11;
$meses[11]['mes'] = "Noviembre";
$meses[11]['nro'] = "11";
$meses[11]['mes_abreviado'] = "Nov.";
$meses[12]['id'] = 12;
$meses[12]['mes'] = "Diciembre";
$meses[12]['nro'] = "12";
$meses[12]['mes_abreviado'] = "Dic.";
return $meses;
}
/**
*
* @param $mes entra el mes como numero ej:2 para febrero
* @param $anio entra el anio ej:2005
* @return retorna el ultimo dia del mes en formato fecha, de la forma Y-M-D. ej: 2009-09-30.
*/
public function ultimo_dia_mes($mes, $anio)
{
$mes_nuevo = mktime(0, 0, 0, $mes, 1, $anio);
$cant =date("t", $mes_nuevo);
$ultimo_dia=date("Y-m-d", mktime(0, 0, 0, $mes, $cant, $anio));
return $ultimo_dia;
}
// Convierte de dd/mm/aaaa a dd-mm-aaaa
public function convertir_fecha_pantalla_a_fecha_db($fecha)
{
$fecha_conv = str_replace("/", "-", $fecha);
$aux = substr($fecha_conv, 6, 4)."-".substr($fecha_conv, 3, 2)."-".substr($fecha_conv, 0, 2);
return $aux;
}
public static function formatear_para_pantalla($fecha)
{
$objeto = new fecha($fecha);
return $objeto->get_fecha_pantalla();
}
public static function formatear_para_base($fecha)
{
$objeto = new fecha();
return $objeto->convertir_fecha_pantalla_a_fecha_db($fecha);
}
/*
* $formato un formato esperado es 'Y-m-d'
*/
public static function validar_fecha($fecha, $formato)
{
$es_valido = true;
if ($formato =='Y-m-d') {
$patron = "/([0-9]{4}[-\/][0-9]{2}[-\/][0-9]{2})/";
$es_valido = preg_match($patron, $fecha, $salida);
if ($es_valido) {
$datos = explode('-', $fecha);
if (count($datos) == 3) {
$es_valido = checkdate($datos[1], $datos[2], $datos[0]);
} else {
$es_valido = false;
}
}
} else {
$es_valido = false;
}
return $es_valido;
}
public static function es_mayor($a1,$m1,$d1,$a2,$m2,$d2)
{
if ($a1 > $a2) return true;
if ($a1 == $a2 && $m1 > $m2) return true;
if ($a1 == $a2 && $m1 == $m2 && $d1 > $d2) return true;
return false;
}
public static function tal_mes($id_mes)
{
return fecha::get_mes($id_mes, 'mes_abreviado');
}
public static function get_nro_mes($mes)
{
$meses = fecha::get_meses_anio();
foreach (array_keys($meses) as $id) {
if ($meses[$id]['mes'] == $mes) {
return $meses[$id]['nro'];
}
}
return "";
}
} lib-develop/src/siu/sq/lib/util/instanciador_afip.php 0000664 0000000 0000000 00000012250 14430530062 0023200 0 ustar 00root root 0000000 0000000 entorno = $entorno;
$this->cargar_configuraciones();
$this->validar();
}
public function getAfip()
{
return $this->afip;
}
//---- CARGAR CONFIGURACIONES ---------------
protected function cargar_configuraciones()
{
$configurador = new configurador();
$credenciales = $this->get_credenciales();
$config = [
'CUIT' => $configurador->sq_ini['factura_afip']['cuit'],
'production' => ($configurador->sq_ini['factura_afip']['produccion'] == "true") ? true : false,
'cert' => $credenciales['cert'],
'key' => $credenciales['private_key'],
'token_dir' => $credenciales['token_dir'],
'connection_timeout' => $configurador->sq_ini['factura_afip']['connection_timeout']
];
try {
$this->afip = new \SIU\Afip\Afip($config);
$this->entorno->log()->info("Se cargaron las configuraciones.");
} catch (\Exception $e) {
$msg = "Se encontraron errores al cargar las configuraciones AFIP.";
throw new \Exception($msg . " " . $e);
}
if ($configurador->sq_ini['factura_afip']['produccion'] == "true") {
$this->entorno->log()->info("Se encuentra en MODO PRODUCCION.");
} else {
$this->entorno->log()->info("Se encuentra en MODO TEST.");
}
}
protected function get_credenciales()
{
$config = new configurador();
$path = realpath($config->get_config_dir()) . "/credenciales_afip";
$datos['cert'] = $path . "/certificado.crt";
$datos['private_key'] = $path . "/clave_privada";
$datos['token_dir'] = $path . "/";
return $datos;
}
//---- VALIDACIONES -------------
protected function validar()
{
// Si se encuentra configurado un nuevo de cuit...
$config = new configurador();
if ($config->sq_ini['factura_afip']['cuit'] !== '00000000000') {
$this->validar_formato_numero_cuit();
$this->validar_clave_privada_y_certificado();
$this->validar_estado_servidor_afip();
$this->validar_numero_cuit_en_afip();
} else {
throw new \Exception("No se encuentra configurado el número de CUIT.");
}
}
protected function validar_formato_numero_cuit()
{
// Validar que el numero de CUIT solo contenga numeros
$config = new configurador();
$numeros = preg_replace('/[0-9]/', '', $config->sq_ini['factura_afip']['cuit']);
if (strlen($numeros) > 0) {
throw new \Exception("El número de CUIT '" . $config->sq_ini['factura_afip']['cuit'] . "' no es válido, solo debe contener números.");
}
if (strlen($config->sq_ini['factura_afip']['cuit']) !== 11) {
throw new \Exception("El número '" . $config->sq_ini['factura_afip']['cuit'] . "' no es válido, debe contener 11 dígitos.");
}
}
protected function validar_clave_privada_y_certificado()
{
// Validar que los certificados esten generados correctamente
if (!$this->afip->getServiceTA('wsfe')) {
throw new \Exception("Existen errores con los certificados AFIP.");
}
}
protected function validar_estado_servidor_afip()
{
$configurador = new configurador();
$factura_electronica = new \SIU\Afip\WebService\FacturaElectronica($this->afip);
// Calculo de tiempo de ejecuccion del dummy
$time_start = microtime(true);
$result = $factura_electronica->getEstadoServicio();
$time_end = microtime(true);
$execution_time = intval($time_end - $time_start);
$connection_timeout = isset($configurador->sq_ini['factura_afip']['connection_timeout']) ? $configurador->sq_ini['factura_afip']['connection_timeout'] : 120;
$this->entorno->log()->debug("CONNECTION TIMEOUT DUMMY: --> ".$execution_time);
$this->entorno->log()->debug("CONNECTION TIMEOUT CONFIGURADO: --> ".$connection_timeout);
if ($execution_time > $connection_timeout) {
$this->afip->setConnectionTimeout($execution_time);
}
if ($result->AppServer !== 'OK' or $result->DbServer !== 'OK' or $result->AuthServer !== 'OK') {
$msg = "Se encontraron errores en el estado del servidor AFIP. "
. PHP_EOL . " AppServer: " . $result->AppServer
. PHP_EOL . " DbServer: " . $result->DbServer
. PHP_EOL . " AuthServer: " . $result->AuthServer;
throw new \Exception($msg);
}
$this->entorno->log()->info("Estado del servidor AFIP: OK.");
}
protected function validar_numero_cuit_en_afip()
{
// No es la mejor validacion pero se valida el numero de cuit en AFIP
$factura_electronica = new \SIU\Afip\WebService\FacturaElectronica($this->afip);
$factura_electronica->getTiposCbte();
}
}
lib-develop/src/siu/sq/lib/util/log.php 0000664 0000000 0000000 00000011012 14430530062 0020277 0 ustar 00root root 0000000 0000000 id = date("Y.m.d__H.i__s.") . $usec;
$this->dir = $dir;
if ($dir !== false) {
if (!is_dir($this->dir)) {
manejador_archivos::crear_arbol_directorios($this->dir);
}
}
}
public function set_activo($activo=true)
{
$this->activo = $activo;
}
public function guardar()
{
if ($this->activo && !$this->guardado) {
$path_log = $this->dir ."/". $this->id . '.log';
try {
$salida = '';
foreach ($this->debug as $debug) {
$salida .= txt::titulo_seccion($debug[0]);
$salida .= $debug[1] . "\n";
}
file_put_contents($path_log, $salida);
$this->guardado = true;
} catch (Exception $e) {
die("Error generando el archivo de log: $path_log. " . $e->getMessage());
}
}
}
//------------------------------------------------------------------------------
//---- LOGGING
//------------------------------------------------------------------------------
public function add_debug($etiqueta, $valor_a_dumpear, $tabla=false)
{
if (is_array($valor_a_dumpear)) {
//$this->debug[] = array($etiqueta, print_r($valor_a_dumpear, true));
if (!$tabla) {
$this->debug[] = array($etiqueta, print_r($valor_a_dumpear, true));
} else {
$this->debug[] = array($etiqueta, $this->array_txt($valor_a_dumpear));
}
} else {
if (is_object($valor_a_dumpear)) {
$this->debug[] = array($etiqueta, var_export($valor_a_dumpear, true));
} else {
$this->debug[] = array($etiqueta, $valor_a_dumpear);
}
}
}
public function add_error($excepcion)
{
$clase = get_class($excepcion);
$texto = $excepcion->getMessage();
if ($excepcion instanceof \Exception) {
$traza = $this->extraer_traza($excepcion);
} else {
$traza = 'No hay traza (excepcion mock)';
}
$log = "clase: $clase\nmensaje: $texto\ntraza: $traza";
$this->debug[] = array($excepcion->getMessage(), $log);
}
public static function extraer_traza(\Exception $excepcion)
{
//Solo muestra parametros en modo DEBUG
if (strpos(get_class($excepcion), 'Twig') !== false) {
return '';
}
$traza = $excepcion->getTrace();
$traza[0]['file'] = $excepcion->getFile();
$traza[0]['line'] = $excepcion->getLine();
return self::formatear_traza($traza);
}
public static function formatear_traza(& $pasos)
{
$html = "[TRAZA]\n";
foreach ($pasos as $idpaso => $paso) {
$clase = '';
if (isset($paso['class'])) {
$clase .= $paso['class'];
}
$html .= "\n---[ $idpaso ]-----------------------------------------\n\n";
//Se obvia los pasos por esta clase
if ($clase !== __CLASS__) {
if (isset($paso['type'])) {
$clase .= $paso['type'];
}
$html .= "- function: $clase{$paso['function']}\n";
if (isset($paso['file'])) {
$html .= "- file: {$paso['file']}, linea {$paso['line']}\n";
}
if (! empty($paso['args'])) {
$html .= "- param: \n";
foreach ($paso['args'] as $idpar => $arg) {
$html .= "\t $idpar: ";
if (is_object($arg)) {
$html .= 'object: '.get_class($arg).'';
} else {
if (!is_array($arg)) {
if (strlen($arg)> 150) {
$arg = substr($arg, 0, 150);
$arg .= "..... ETC";
}
}
$html .= print_r($arg, true);
}
}
}
}
}
return $html;
}
}
lib-develop/src/siu/sq/lib/util/mailer.php 0000664 0000000 0000000 00000006414 14430530062 0021001 0 ustar 00root root 0000000 0000000 php_mailer = new PHPMailer();
$this->php_mailer->isSMTP(); // Set mailer to use SMTP
$this->php_mailer->isHTML(true);
$this->php_mailer->Host = "$host;$host"; // Specify main and backup SMTP servers
$this->php_mailer->SMTPAuth = $smtp_auth; // Enable SMTP authentication
$this->php_mailer->Username = $username; // SMTP username
$this->php_mailer->Password = $password; // SMTP password
$this->php_mailer->SMTPSecure = $SMTPSecure;// Enable TLS encryption ('tls'), `ssl` also accepted
$this->php_mailer->Port = $port; // TCP port to connect to
$this->php_mailer->CharSet = 'utf-8';
$this->es_desarrollo = $es_desarrollo;
$this->envia_emails = $envia_emails;
$this->email_envios_desarrollo = $email_envios_desarrollo;
}
public function set_from($email, $nombre)
{
$this->php_mailer->setFrom($email, $nombre);
}
public function set_destinatario($email, $nombre = null)
{
if ($this->es_desarrollo) {
$destinatario = $this->email_envios_desarrollo;
} else {
$email = trim($email);
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
throw new error_negocio('El email ingresado no es valido. ' . $email);
}
$destinatario = $email;
}
$this->php_mailer->clearAddresses();//limpio destinatarios cargados anteriormente
$this->php_mailer->addAddress($destinatario, $nombre); // Add a recipient
}
public function set_asunto($asunto)
{
$this->php_mailer->Subject = $asunto;
}
public function adjuntar_archivo($path, $name, $encoding, $type)
{
$this->php_mailer->addAttachment($path, $name, $encoding, $type);
}
public function eliminar_adjuntos()
{
$this->php_mailer->clearAttachments();
}
public function set_cuerpo($cuerpo)
{
$this->php_mailer->Body = $cuerpo;//cuerpo es HTML
}
public function set_smtp_auto_tls($smtp_auto_tls)
{
$this->php_mailer->SMTPAutoTLS = $smtp_auto_tls;
}
public function enviar_email($asunto, $cuerpo, $destinatario_email, $destinatario_nombre = null)
{
if ($this->envia_emails) {
if ($this->es_desarrollo) {
$asunto = '[DESARROLLO] ' . $asunto;
$asunto .= ' [PARA: ' . $destinatario_email . ']';
}
$this->set_asunto($asunto);
$this->set_cuerpo($cuerpo);
$this->set_destinatario($destinatario_email, $destinatario_nombre);
$estado = $this->php_mailer->send();
if (!$estado) {
throw new error($this->php_mailer->ErrorInfo);
}
}
}
}
lib-develop/src/siu/sq/lib/util/manejador_archivos.php 0000664 0000000 0000000 00000037053 14430530062 0023371 0 ustar 00root root 0000000 0000000 ', '<', '"', "'", ':', '|');
private static $caracteres_reemplazo = array('%', '$', '_', ')', '(', '-', '.', ';', ',');
public static function crear_arbol_directorios($path, $modo=0777)
{
if (self::es_windows()) {
$path = self::path_a_windows($path, false);
}
if (!file_exists($path)) {
if (!mkdir($path, $modo, true)) {
throw new error_kernel("No es posible crear el directorio $path, verifique que el usuario de Apache posea privilegios de escritura sobre este directorio");
}
}
}
public static function crear_archivo_con_datos($nombre, $datos)
{
if (! file_exists($nombre)) {
self::crear_arbol_directorios(dirname($nombre));
}
file_put_contents($nombre, $datos);
}
public static function es_windows()
{
return (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN');
}
public static function ejecutar($cmd, &$stdout, &$stderr)
{
$outfile = tempnam('/tmp/' . uniqid(), "cmd");
$errfile = tempnam('/tmp/' . uniqid(), "cmd");
$descriptorspec = array(
0 => array("pipe", "r"),
1 => array("file", $outfile, "w"),
2 => array("file", $errfile, "w")
);
$proc = proc_open($cmd, $descriptorspec, $pipes);
if (!is_resource($proc)) {
return 255;
}
fclose($pipes[0]);
$exit = proc_close($proc);
$stdout = file_get_contents($outfile);
$stderr = file_get_contents($errfile);
unlink($outfile);
unlink($errfile);
return $exit;
}
/**
* Similar al file_exists de php pero incluye al include_path en la búsqueda
*/
public static function existe_archivo_en_path($file)
{
$fp = @fopen($file, 'r', true);
$ok = ($fp) ? true : false;
@fclose($fp);
return $ok;
}
public static function path_a_windows($nombre, $encomillar_espacios=true)
{
$nombre = str_replace('/', "\\", $nombre);
//Si algun segmento del PATH tiene espacios, hay que ponerlo entre comillas.
if ($encomillar_espacios && strpos($nombre, ' ')) {
$segmentos = explode("\\", $nombre);
for ($a=0;$a<(count($segmentos));$a++) {
if (strpos($segmentos[$a], ' ')) {
$segmentos[$a] = '"'.$segmentos[$a].'"';
}
}
$nombre = implode("\\", $segmentos);
}
return $nombre;
}
public static function path_a_unix($nombre)
{
return str_replace('\\', "/", $nombre);
}
/**
* Retorna un nombre de archivo valido
*/
public static function path_a_plataforma($path)
{
if (self::es_windows()) {
return self::path_a_windows($path);
} else {
return self::path_a_unix($path);
}
}
/**
* Retorna un path convertido a la plataforma actual de ejecución (unix o windows)
*/
public static function nombre_valido($candidato)
{
return str_replace(self::$caracteres_invalidos, self::$caracteres_reemplazo, $candidato);
}
public static function nombre_clase_valido($candidato)
{
$clase = base64_encode($candidato);
$clase = str_replace(array('/',' ','=','-'), '_', $clase);
return $clase;
}
/**
* Buscador de archivos
*/
public static function get_archivos_directorio($directorio, $patron = null, $recursivo_subdir = false, &$exclude_dirs = array())
{
$archivos_ok = array();
if (! is_dir($directorio)) {
throw new error_kernel("BUSCAR ARCHIVOS: El directorio '$directorio' es INVALIDO");
}
if (in_array($directorio, $exclude_dirs)) {
return $archivos_ok;
}
if (! $recursivo_subdir) {
if ($dir = opendir($directorio)) {
while (false !== ($archivo = readdir($dir))) {
if ($archivo != ".svn" && $archivo != "." && $archivo != "..") {
$archivos_ok[] = $directorio . '/' . $archivo;
}
}
closedir($dir);
}
} else {
$archivos_ok = self::buscar_archivos_directorio_recursivo($directorio, $exclude_dirs);
}
//Si existe un patron activado, filtro los archivos
if (isset($patron)) {
$temp = array();
foreach ($archivos_ok as $archivo) {
if (preg_match($patron, $archivo)) {
$temp[] = $archivo;
}
}
$archivos_ok = $temp;
}
return $archivos_ok;
}
/**
* Busca en profundidad los archivos existentes dentro de un directorio
*/
public function buscar_archivos_directorio_recursivo($directorio, &$exclude_dirs = array())
{
if (! is_dir($directorio)) {
throw new error_kernel("BUSCAR ARCHIVOS: El directorio '$directorio' es INVALIDO");
}
$archivos = array();
$d = dir($directorio);
if (in_array($directorio, $exclude_dirs)) {
return $archivos;
}
while (false !== ($archivo = $d->read())) {
if ($archivo != ".svn" && $archivo != "." && $archivo != "..") {
$path = $directorio.'/'.$archivo;
if (is_dir($path)) {
$archivos = array_merge(self::buscar_archivos_directorio_recursivo($path, $exclude_dirs), $archivos) ;
} else {
$archivos[] = $path;
}
}
}
$d->close();
return $archivos;
}
/**
* Devuelve la lista de subdirectorios de un directorio
*/
public static function get_subdirectorios($directorio)
{
$dirs = array();
if (! is_dir($directorio)) {
throw new error_kernel("BUSCAR SUBDIRECTORIOS: El directorio '$directorio' es INVALIDO");
}
if ($dir = opendir($directorio)) {
while (false !== ($archivo = readdir($dir))) {
if (($archivo != '.') && ($archivo != '..') && ($archivo != '.svn')) {
$path = $directorio . '/' . $archivo;
if (is_dir($path)) {
$dirs[] = $path;
}
}
}
closedir($dir);
}
return $dirs;
}
/**
* Copia el contenido de un directorio a otro.
* No copia las carpetas SVN
* @return boolean True en caso de que la copia fue exitosa
*/
public static function copiar_directorio($origen, $destino, $excepciones=array(), $manejador_interface = null, $copiar_ocultos=true)
{
if (! is_dir($origen)) {
throw new error_kernel("COPIAR DIRECTORIO: El directorio de origen '$origen' es INVALIDO");
}
$ok = true;
if (! is_dir($destino)) {
$ok = mkdir($destino) && $ok;
}
//Busco los archivos del directorio
$lista_archivos = array();
if ($dir = opendir($origen)) {
while (false !== ($a = readdir($dir))) {
if ($a != '.' && $a != '..' && $a != '.svn') {
$lista_archivos[] = $a;
}
}
closedir($dir);
}
//Copio los archivos
foreach ($lista_archivos as $archivo) {
$x_origen = $origen . '/' . $archivo;
$x_destino = $destino . '/' . $archivo;
//Evito excepciones
if (! in_array($x_origen, $excepciones) && ($copiar_ocultos || substr($archivo, 0, 1) != '.')) {
if (is_dir($x_origen)) {
if (isset($manejador_interface)) {
$manejador_interface->progreso_avanzar();
}
$ok = self::copiar_directorio($x_origen, $x_destino, $excepciones, $manejador_interface) && $ok;
} else {
$ok = copy($x_origen, $x_destino) && $ok;
}
}
}
return $ok;
}
/**
* Elimina un directorio con contenido
*/
public static function eliminar_directorio($directorio, $borrar_svn = true, $solo_contenido = false)
{
if (! is_dir($directorio)) {
throw new error_kernel("ELIMINAR DIRECTORIO: El directorio '$directorio' es INVALIDO");
}
$ok = true;
$dir = opendir($directorio);
while (false !== ($archivo = readdir($dir))) {
$path = $directorio.'/'.$archivo;
if ($archivo != "." && $archivo!="..") {
if (!$borrar_svn && $archivo == '.svn') {
continue;
}
if (is_dir($path)) {
$ok = self::eliminar_directorio($path) && $ok;
} else {
$ok = unlink($path) && $ok;
}
}
}
closedir($dir);
if (! $solo_contenido) {
$ok = rmdir($directorio) && $ok;
}
return $ok;
}
public function chmod_recursivo($path, $filemode)
{
if (!is_dir($path)) {
return chmod($path, $filemode);
}
$dh = opendir($path);
while ($file = readdir($dh)) {
if ($file != '.' && $file != '..') {
$fullpath = $path.'/'.$file;
if (!is_dir($fullpath)) {
if (!chmod($fullpath, $filemode)) {
return false;
}
} else {
if (!chmod_recursivo($fullpath, $filemode)) {
return false;
}
}
}
}
closedir($dh);
if (chmod($path, $filemode)) {
return true;
} else {
return false;
}
}
public function comprimir_archivo($src, $level = 5, $dst = false)
{
if ($dst == false) {
$dst = $src.".gz";
}
if (file_exists($src)) {
$filesize = filesize($src);
$src_handle = fopen($src, "r");
if ($src_handle === false) {
\RDIConsola::logger()->error("Comprimir archivo: No se puede abrir $src");
return false;
}
if (!file_exists($dst)) {
$dst_handle = gzopen($dst, "w$level");
while (!feof($src_handle)) {
$chunk = fread($src_handle, 2048);
gzwrite($dst_handle, $chunk);
}
fclose($src_handle);
gzclose($dst_handle);
return true;
} else {
\RDIConsola::logger()->error("Comprimir archivo: $dst ya existe");
}
} else {
\RDIConsola::logger()->error("Comprimir archivo: $src no existe");
}
return false;
}
public function es_directorio_vacio($dir)
{
if ($dh = @opendir($dir)) {
while ($file = readdir($dh)) {
if ($file != '.' && $file != '..') {
closedir($dh);
return false;
}
}
closedir($dh);
return true;
} else {
return false;
}
}
public function es_writable($path)
{
if ($path{strlen($path)-1} == '/') {
return is__writable($path.uniqid(mt_rand()).'.tmp');
}
if (file_exists($path)) {
if (!($f = @fopen($path, 'r+'))) {
return false;
}
fclose($f);
return true;
}
if (!($f = @fopen($path, 'w'))) {
return false;
}
fclose($f);
unlink($path);
return true;
}
/**
* Retorna el nombre de usuario que actualmente ejecuta el proceso
* @return null en caso
*/
public static function get_usuario_actual()
{
$usuario = null;
if (! self::es_windows()) {
$salida = array();
$valor_retorno = null;
exec('whoami', $salida, $valor_retorno);
if ($valor_retorno == 0) {
$usuario = strtolower($salida[0]);
}
} else {
$usuario = strtolower(get_current_user());
}
return $usuario;
}
public static function get_checksum_directorio($directorio)
{
$checksum = null;
$archivos = self::buscar_archivos_directorio_recursivo($directorio);
if (! empty($archivos)) {
$hsh_handler = hash_init('sha256');
$sin_error = true;
foreach ($archivos as $archivo) {
$sin_error = @hash_update_file($hsh_handler, $archivo);
if (! $sin_error) { //Si se produce error en el calculo aborto
hash_final($hsh_handler);
\RDIConsola::logger()->error("\nError calculando checksum con el archivo '$archivo' ");
throw new error_kernel("\nError calculando checksum con el archivo '$archivo' ");
}
}
$checksum = hash_final($hsh_handler);
}
return $checksum;
}
public static function borrar_directorio($directory, $empty=false)
{
if (substr($directory, -1) == '/') {
$directory = substr($directory, 0, -1);
}
if (!file_exists($directory) || !is_dir($directory)) {
return false;
} elseif (is_readable($directory)) {
$handle = opendir($directory);
while (false !== ($item = readdir($handle))) {
if ($item != '.' && $item != '..') {
$path = $directory.'/'.$item;
if (is_dir($path)) {
self::borrar_directorio($path);
} else {
unlink($path);
}
}
}
closedir($handle);
if ($empty == false) {
if (!rmdir($directory)) {
return false;
}
}
}
return true;
}
public static function csv_to_array_assoc($datos)
{
// http://php.net/manual/es/function.str-getcsv.php#117692
// agarro el fichero temporal, lo meto en memoria como asociativo.
// TODO try catch y validaciones, solo toba valida csv, nada más.
$csv = array_map('str_getcsv', file($datos['tmp_name']));
// Limpio los registros a cargar del csv con caracteres de espacios
// erroneamente colocados.
for ($i=0;$i