martes, 27 de octubre de 2009

TCB Migración.- Prestamos Movimiento.- part II

después de una rotura de cabeza, me dediqué a implementar el script PHP y aquí lo muestro:



2 case 878:

3

4
$msg .= "============================ GENERANDO
TABLAS DE AMORTIZACION TCB \r\n "
;

5

6

7

8
//crear tabla
de amortizaciones pagadas


9

10
$sql = "SELECT SQL_CACHE

11

12 `operaciones_mvtos`.`socio_afectado` AS `socio`,


13

14 `operaciones_mvtos`.`docto_afectado` AS `credito`,


15

16 `operaciones_mvtos`.`tipo_operacion` AS `operacion`,


17

18 `operaciones_mvtos`.`fecha_operacion` AS `fecha`,


19

20 `eacp_config_bases_de_integracion_miembros`.`codigo_de_base`,


21

22 SUM(`operaciones_mvtos`.`afectacion_real`) AS `monto`

23

24 FROM

25

26 `eacp_config_bases_de_integracion_miembros`

27

28 `eacp_config_bases_de_integracion_miembros`

29

30 INNER JOIN `operaciones_mvtos` `operaciones_mvtos`

31

32 ON `eacp_config_bases_de_integracion_miembros`.`miembro` =

33

34 `operaciones_mvtos`.`tipo_operacion`

35

36 WHERE

37

38 (`eacp_config_bases_de_integracion_miembros`.`codigo_de_base`
=8002)


39

40 AND

41

42 (`operaciones_mvtos`.`docto_afectado` != 1)


43

44 GROUP BY

45

46 `operaciones_mvtos`.`docto_afectado`,


47

48 `operaciones_mvtos`.`tipo_operacion`,


49

50 `operaciones_mvtos`.`fecha_operacion`

51

52 ORDER BY

53

54 `eacp_config_bases_de_integracion_miembros`.`codigo_de_base`,


55

56 `operaciones_mvtos`.`docto_afectado`,


57

58 `operaciones_mvtos`.`fecha_operacion`,


59

60 `operaciones_mvtos`.`tipo_operacion` /* LIMIT 0,100 */ "
;

61

62
$rs = mysql_query($sql, cnnGeneral() );

63

64
$MarkCredito = false;

65

66
$MarkFecha = false;

67

68 while(
$rw = mysql_fetch_array($rs) ) {

69

70
$credito = $rw["credito"];

71

72
$socio = $rw["socio"];

73

74
$fecha = $rw["fecha"];

75

76
$operacion = $rw["operacion"];

77

78
$monto = $rw["monto"];

79

80

81

82
$iva_pagado = 0;

83

84
$capital_pagado = 0;

85

86
$IM_pagado = 0;

87

88
$IN_pagado = 0;

89

90
$IvaMPagado = 0;

91

92
$comisiones = 0;

93

94
$iva_comisiones = 0;

95

96

97

98 switch (
$operacion
){

99

100 case
120:

101

102
$capital_pagado
+= $monto;

103

104 break;

105

106 case
140:

107

108
$IN_pagado += $monto;

109

110
$iva_pagado += $monto * 0.15;

111

112 break;

113

114 case
141:

115

116
$IM_pagado += $monto;

117

118
$IvaMPagado += $monto * 0.15;

119

120 break;

121

122 case
146:

123

124
$comisiones += $monto;

125

126 break;

127

128 case
145:

129

130
$comisiones += $monto;

131

132 break;

133

134 case
351:

135

136
$IN_pagado += $monto;

137

138
$iva_pagado += $monto * 0.15;

139

140 break;

141

142 case
143:

143

144
$IM_pagado += $monto;

145

146
$IvaMPagado += $monto * 0.15;

147

148 break;

149

150 case
142:

151

152
$IN_pagado += $monto;

153

154
$iva_pagado += $monto * 0.15;

155

156 break;

157

158 }

159

160
$sql = "UPDATE tcb_prestamos_movimientos

161

162 SET

163

164 capital_pagado=(capital_pagado + $capital_pagado),


165

166 interes_pagado= (interes_pagado + $IN_pagado),


167

168 iva_pagado=(iva_pagado + $iva_pagado),


169

170 interes_moratorio= (interes_moratorio + $IM_pagado),

171

172 iva_interes_moratorio=(iva_interes_moratorio + $IvaMPagado),


173

174 comisiones=(comisiones + $comisiones),

175

176 iva_comisiones=(iva_comisiones + $iva_comisiones)


177

178 WHERE

179

180 (numero_de_cliente=$socio)


181

182 AND

183

184 (numero_de_credito=$credito)


185

186 AND

187

188 (fecha_de_amortizacion='$fecha') "
;

189

190
$x = my_query($sql, true);

191

192 if ( (
$x["stat"] == false) OR ($x["rows"] <= 0) ){

193

194
$msg .= "$socio\t$credito\t$operacion\tWARN\tSe
fallo al actualizar el registro("
. $x["rows"] . "), se intenta uno nuevo\r\n";

195

196
$sql = "INSERT INTO tcb_prestamos_movimientos

197

198 (numero_de_cliente, numero_de_credito, numero_de_pago,
fecha_de_amortizacion,


199

200 capital_a_pagar, interes_a_pagar,
iva_por_el_interes_a_pagar,


201

202 capital_pagado, interes_pagado, iva_pagado,


203

204 interes_moratorio, iva_interes_moratorio, comisiones,
iva_comisiones)

205

206 VALUES

207

208 ($socio, $credito, 0, '$fecha',


209

210 0, 0, 0,

211

212 $capital_pagado, $IN_pagado, $iva_pagado,


213

214 $IM_pagado, $IvaMPagado, $comisiones, $iva_comisiones) "
;

215

216

217

218
$x = my_query($sql);

219

220 if (
$x["stat"] == false){

221

222
$msg .= "$socio\t$credito\t$operacion\tERROR\tSe
fallo al agregar el registro\r\n"
;

223

224 }

225

226 } else {

227

228
$msg .= "$socio\t$credito\t$operacion\tOK\tRegistro
actualizado\r\n"
;

229

230 }

231

232 }

233

234
//separar de
un pago

235

236 //separar de pagos varios

237

238 //acumular operaciones por pagar

239

240 //acumular conceptos pagados

241

242
$sqlIS = "SELECT socio, credito, parcialidad,

243

244 fecha_de_vencimiento, fecha_de_abono,

245

246 saldo_vigente, saldo_vencido, interes_vigente,
interes_vencido, saldo_interes_vencido,

247

248 interes_moratorio, estatus, iva_interes_normal,
iva_interes_moratorio

249

250 FROM sisbancs_amortizaciones "
;

251

252

253

254
$rs = mysql_query($sqlIS, cnnGeneral() );

255

256 while(
$rw = mysql_fetch_array($rs) ) {

257

258
$credito = $rw["credito"];

259

260
$socio = $rw["socio"];

261

262
$fecha = $rw["fecha_de_vencimiento"];

263

264
$monto = $rw["monto"];

265

266
$letra = $rw["parcialidad"];

267

268
$capital = $rw["saldo_vigente"] + $rw["saldo_vencido"];

269

270
$interes = $rw["interes_vigente"] + $rw["interes_vencido"];

271

272
$iva = $rw["iva_interes_normal"];

273

274

275

276
$sqlIS = "INSERT INTO tcb_prestamos_movimientos

277

278 (numero_de_cliente, numero_de_credito, numero_de_pago,
fecha_de_amortizacion, capital_a_pagar,


279

280 interes_a_pagar, iva_por_el_interes_a_pagar, capital_pagado,
interes_pagado, iva_pagado,


281

282 interes_moratorio, iva_interes_moratorio, comisiones,
iva_comisiones)

283

284 VALUES($socio, $credito, $letra, '$fecha', $capital,


285

286 $interes, $iva, 0, 0, 0, 0, 0, 0, 0)"
;

287

288
my_query($sqlIS);

289

290 }

291

292 break;

293

La primera pruebas me ha arrojado buenos resultados, pero no los que esperaba.
Uno de esos errores era la no coincidencia entre el saldo y la suma de "pagados" y "pendientes de pago", por ellos elaboré un script SQL para buscar diferencias

SELECT numero_de_cliente, numero_de_credito, saldo_actual, SUM(capital_a_pagar) AS 'apagar',

SUM(capital_pagado) AS 'pagado', monto_autorizado,
(SUM(capital_a_pagar) + SUM(capital_pagado)) AS 'resultado'

FROM `creditos_solicitud` `creditos_solicitud`
INNER JOIN `tcb_prestamos_movimientos` `tcb_prestamos_movimientos`
ON `creditos_solicitud`.`numero_solicitud` = `tcb_prestamos_movimientos`
.`numero_de_credito`

GROUP BY

numero_de_credito
HAVING (monto_autorizado - resultado) != 0



También me día la tarea de elaborar otro procedimiento PHP para eliminar Movimientos de Crédito mo migrables, tal como es el caso de los créditos pagados.



2 case 881:
3
4
$sql = "
5
6 SELECT
7
8 `creditos_solicitud`.*,
9
10 `creditos_solicitud`.`estatus_actual`,
11
12 `creditos_solicitud`.`saldo_actual`
13
14 FROM
15
16 `creditos_solicitud` `creditos_solicitud`
17
18 WHERE
19
20 (`creditos_solicitud`.`estatus_actual` =50) OR
21
22 (`creditos_solicitud`.`saldo_actual` <=0.99)
23
24 "
;
25
26
$rs = mysql_query($sql, cnnGeneral() );
27
28 while(
$rw = mysql_fetch_array($rs) ) {
29
30
$credito = $rw["numero_solicitud"];
31
32
$sqlDE = " DELETE FROM tcb_prestamos_movimientos WHERE numero_de_credito=$credito ";
33
34
$x = my_query($sqlDE, true);
35
36
$msg = $x["info"];
37
38 }
39
40 break;
41




ejecuté el código de la utilería 882, y tardó varios minutos en mi pc de pruebas un Intel Dual Core a 1.8 Ghz con 2GB de RAM.

sábado, 24 de octubre de 2009

Recursos en Microfinanzas en la web.

Me tomaré unos minutos para escribir esto, y se trata de unos links donde se puede encontrar información interesante en el mundo de la Microfinanzas.
Generalmente consultamos páginas como la de Bansefi, FONAES o la de la CNBV, pero estos tres links encontrarás mucha información relativa a nuestro mercado: Microfinanzas; y que no es fácil de localizar, además de ser sumamente interesante los artículos y tratados que contienen estas páginas.
La primera es : http://www.microfinance.com/ que contiene artículos muy interesantes como un CreditScoring en muchos idiomas.
la se segunda es: http://www.ruralfinance.org/ que es un Centro de Aprendizaje en Finanzas Rurales, donde hay mucho casos de éxitos y recursos como Experiencias, Metodologías, etc.
La tercera, y más importante para mí, es: http://www.cgap.org/ que contienen infinidad de temas sobre Microfinanzas, análisis de Software, Recursos y Artículos, Casos de éxito, etc, etc, etc.
Todo un tesoro para quién lo sabe apreciar.
Hasta Luego!!!.

lunes, 19 de octubre de 2009

TCB Migración.- Prestamos Movimiento.- part I

Migrando a TCB.
Cuadernos de Origen: Prestamo Movimientos. Ya le he dado muchas vueltas al asusnto, el hecho es que no he podido concebir la forma en que estará conformada la información. No he platicado muy bién con el Consultor, pues me da un poco de pena mi incapacidad de entender la necesidad de información. Se que SAFE tiene todo lo necesario, pero no logro imaginar donde va cada pieza del rompecabezas... hasta ahora... es el único cuaderno que me ha solapado mi capacidad. Primero intentaré con iniciar una
consulta SQL, ordenando los pagos efectivamente hechos por fechas.

SELECT

`operaciones_mvtos`.`socio_afectado` AS `socio`,
`operaciones_mvtos`.`docto_afectado` AS `credito`,
`operaciones_mvtos`.`tipo_operacion` AS `operacion`,
`operaciones_mvtos`.`fecha_operacion` AS `fecha`,
`eacp_config_bases_de_integracion_miembros`.`codigo_de_base`,
SUM(`operaciones_mvtos`.`afectacion_real`) AS `monto`
FROM
`eacp_config_bases_de_integracion_miembros`
`eacp_config_bases_de_integracion_miembros`
INNER JOIN `operaciones_mvtos` `operaciones_mvtos`
ON
`eacp_config_bases_de_integracion_miembros`.`miembro` =
`operaciones_mvtos`.`tipo_operacion`
WHERE
(`eacp_config_bases_de_integracion_miembros`.`codigo_de_base` =8002)
GROUP BY
`operaciones_mvtos`.`docto_afectado`,
`operaciones_mvtos`.`tipo_operacion`,
`operaciones_mvtos`.`fecha_operacion`
ORDER BY
`eacp_config_bases_de_integracion_miembros`.`codigo_de_base`,
`operaciones_mvtos`.`fecha_operacion`,
`operaciones_mvtos`.`tipo_operacion`

el código de base es 8002.- TCB pagos de crédito efectuado. Los resultados ascienden a más de 221,000 registros, ejecutados en mi inspiron 1520 en 5 segundos. Agregaré un SQL_CACHE por sí necesito ejecutarlas varias veces. La tabla de destino se llama tcb_prestamos_movimientos y tiene este script de
creación:CREATE TABLE `tcb_prestamos_movimientos` (
`numero_de_cliente`
bigint(20) default '0',
`numero_de_credito` bigint(20) default
NULL,
`numero_de_pago` int(4) default NULL,
`fecha_de_amortizacion` date default NULL,
`capital_a_pagar`
float(12,2) default NULL,
`interes_a_pagar` float(12,2) default
NULL,
`iva_por_el_interes_a_pagar` float(12,2) default NULL,
`capital_pagado` float(12,2) default NULL,
/* correcion */
`interes_pagado` float(12,2) default NULL,
`iva_pagado` float(12,2) default NULL,
`interes_moratorio` float(12,2) default NULL,
`iva_interes_moratorio` float(12,2) default NULL,
`comisiones`
float(12,2) default NULL,
`iva_comisiones` float(12,2) default
NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='tabla de
movimientos de prestamos, construidos con codigo p'

que en sí, es el mismo layout de los Cuadernos de Origen. también lo
agregué al proyecto de respaldo "PROYECTO-2009" le agregué dos lineas al SQL:
/* WHERE .. */
AND

(`operaciones_mvtos`.`docto_afectado` != 1)
/* ORDER BY ... */
`operaciones_mvtos`.`docto_afectado`,


En la consulta, interpretaré cada fecha como cada letra. bueno, hasta hoy terminé, pues debo checar el proyecto de estatus de la Sociedad cooperativa.

sábado, 3 de octubre de 2009

Un gran chasco.

No debería de criticar, pero es que estoy muy molesto con el actuar de esta Empresa de Software.
Orgullosamente, trabajo en una microfinanciera de caracter social de rápido crecimiento, esto se ha dado por dos factores principales: el compromiso de su gente y el compromiso de sus directivos.
Hace diez años solo eramos tres personas: el Contador (yo), el Gerente y un auxiliar. Hoy somos más de 35 personas con tres sucursales y 4 ventanillas, con presencia en Yucatán y Campeche.
En el 2001, se publicó la Ley de Ahorro y Crédito Popular que es una ley para regularizar a microfinancieras del sector rural, que no entraban en otras leyes como la Ley de Organizacion y Operaciones Auxiliares de Crédito; en un principio esta Ley está basada en los principios de los acuerdos de Basilea; pero con el toque mexicano de alta complejidad; siendo tan exigente que muchas microfinancieras sociales no podría cubrirlas.
Nosotros, después de esperar un sistema integral, y rechazar un propio proyecto, en busca de la garantía de Autorización emitida por la Comisión Nacional Bancaria y de Valores, buscamos la asesoría de nuestra Federación quién nos recomendó un software que en supuesto usaban ya varias entidades afiliadas.
En el mes de octubre de 2008 tuvimos una plática con la proveedora de Software, y con la confianza que tenemos con nuestra Federación.
Cuando tuvimos las platicas el gerente de la proveedora de software nos lo pintó como miel sobre hojuelas, nos dijo que la infraestructura de software teníamos era suficiente y que el sistema corría sobre un frijol como servidor.
Firmamos los contratos de inmediantos basados en el "profesionalismo" de la proveedora y por recomendación de nuestra Federación.
Yo era en ese momento el Jefe de migración del módulo operativo del sistema, y con la renuncia de la parte contable, me quedé con la resposabilidad de ambas.
Inicié los trabajos de migración para adaptar la información mantenidad en el sistema, a los requerimiento pedidos por el sistema.
También inicié la conversión de variables y matrices al sistema según los cuadernos de migración.
La otra tarea que llevé a cabo fue el subsane de la información del actual sistema, ya que mantenía errores o datos incompletos desde que se migró.
Algunos datos como los planes de pago, debido a la variedad de criterios del oficial de crédito, se tuvo que subir mediante hojas de cálculo que para ello programé. Todo esto me llevó cuatro meses de intenso trabajo, y aunado a la presión de la entrega de los estados financieros (mi trabajo como titular contable) fue una ardua labor.
Ya terminada mi labor empezamos la siguiente etapa que era de la evaluación de los datos migrados. hasta esa fecha nos habrían brindado unas 30 horas de asesoría, solamente los contacté para aclarar dudas, preguntas que no tardaban más de 5 minutos en contestar.
Por todo esto pagamos más de $ 420,000.00 correspondiente al 100% de cobro de licencias, 50% del cobro de Migración que asciende a $ 75,000.00 (migración == subir datos al sistema), y $ 45,000.00 al cobro de actualización por un año, más de $ 20,000 de viáticos que pagamos.
Es de notar, que somos una Microfinanciera que no es tan grande, he hicimos un gran sacrificio económico adquirir el sistema.
Para nuestra sorpresa, en la planeación de la instalación, donde nos iríamos a poner de acuerdo en la fechas y método de instalación, el Gerente de la proveedora de software nos condicionó la compra de Hardware y otro equipo por más de 780,000.00 o si no fuese así que adquirieramos su hosting por dos años que costaba aproximadamente 350,000 por año.
Además de comprar licencias del protocolo Citrix para correr la aplicación, y licencias de los sistemas operativos por más de $ 90,000.00, en total, un gasto por más de 1,290,000.00, y siendo una microfinanciera con altos requerimientos de crédito, no podríamos desembolsar esa cantidad a corto plazo, como lo exigía la proveedora de software.
Al vernos engalados, quisimos dar marcha atrás con el proyecto de migración, contactamos con la Proveedora quién nos dijo que los formatos estaban firmados y que no podía deolver el costo de la licencias, esto a pesar de no habernos entregado nada del software o ni siquiera mostrarnos en funcionamiento de forma presencial.
Nos pusimos en contacto con nuestra Federación para que gestionase la devolución de los recursos, para colmo nuestra Federación nos dió las espalda, argumentando que la Proveedora tenía razón, y que nosotros debíamos pagar.
Ahora nos dicen que sólo 90,000 nos pueden devolver, y para matar el caso, el consejo de administración no quizo levantar ninguna denuncia.
En mi opinión, la Proveedora abusó de nuestra confianza, nos engañó y no cumplió el contrato, yo estuve en contacto directo con la gente de la proveedora y les puedo asegurar que no gastaron mas de 8 horas de su tiempo.
El actuar de nuestra Federación nos mostró la inutilidad de este tipo de instituciones, que solo quieren comer y beber a costillas de Microfinancieras que nacieron con un propósito noble.
Actualmente inicié los trabajos para otra plafaforma informática apadrinada por Bansefi, en la cual ya avanzamos más que con la anterior Proveedora y espero que para el cierre de Diciembre de este año tenga yo Migrado el sistema.
Sirva esto de experiencia:
No todo lo que brilla es oro
.

viernes, 2 de octubre de 2009

soporte de carga masiva de cobros a S.A.F.E.

Como somos una microfinanciera que tenemos convenios de Ministración y Cobro de créditos vía nómina con distintas instituciones, se ha vuelvo una necesidad el crear una forma eficiente de cargar los recibos en el Sistema S.A.F.E, para ello he hecho modificaciones al core y he creado un módulo de carga Batch para cubrir esta necesidad.
Las características de archivo de carga es:
Archivo de texto o cvs separado con comas (,), tener claro que en las observaciones no debe llevar ninguna coma, pues esto hará que se cargue incorrectamente el archivo. El Archivo admite hasta 100 lineas, o sea 100 cobros por recibo, si es mas de 100, éstos son ignorados.
El layout de carga del archivo es el siguiente:
NUMERO_DE_SOCIO[coma]NUMERO_DE_CREDITO[coma]NUMERO_DE_PARCIALIDAD[coma]CAPITAL[coma]INTERES[coma]IVA[coma]AHORRO[coma]OBSERVACIONES

al tener el archivo hecho, vamos al menú caja>factura rápida de convenios:

carga-paso-01

Al cargar el archivo tenemos esta vista:

carga-paso-02

En la última parte de archivo (o el pie de página) tenemos las notas y avisos que el sistema manda:


carga-paso-03

una vez analizado el pago, para guardar y generar el recibo solo se oprime el boton "enviar pago"; los registros irán desapareciendo uno a uno conforme se vayan guardando, hasta quedar el registro cero (0) y te mostrará el botón "imprimir recibo xxxx".

BUGS:
Como el conteo de matrices en php empieza de cero (0), este no se elimina, y muestra el seudo error la "linea [número de registros] no se existe".
El proceso puede ser tardado, según el servidor y el tamaño de la base de datos, en nuestro caso como tenemos cientos de miles, el proceso tarda más de 10 minutos.

jueves, 1 de octubre de 2009

Comiendo un Armadillo.

bueno, si no me conoces... nunca vayas a creer que soy un nerd con lentes grandres y fino como una muñequita, la verdad soy medio salvaje. Me gusta mucho la cacería y el campo, vagar por el monte y pasar hambre, frío y humedad.
Ya tiene un buen tiempo que no salgo, así que me he vuelvo sedentario, anteriormente urgaba en montículos de los llamados "cuyos" que no son más que antigüos edificios mayas (en su momento colgaré fotos). Aunque hay oportunidades de retomar mi salvajez y un ejemplo fue hace una semanas fuimos a un pobrado a 40km de San Francisco de Campeche que se llama Nohakal, donde tuve la oportunidad de deleitarme con carne de "tepezcuintle" y de "huéch" en "pí", mi hijo que es más citadino, quedó encantado por el contacto con la naturaleza, pero haya les dejo unos videos y fotos.


este lo filmó mi hijo... habrán de notar su profesionalismo.

Productos que me gustan

Estos son productos que me encantan:

Imagen014_aImagen013_b

Mi Primer Fail con Windows 7

uso windows 7 en una de mis laptops ya hace varios meses, la que actualmente tengo en una Dell Inspiron 1525 es la 7.100, y aunque ya había tenido un BSOD no me pareció que fuera importante de mencionar, sin embargo lo que les cuento si fué el cuento de nunca acabar de Windows.
Aunque tiene sus detalles, como su paupérrimo manejo de vantanas (si usas varias como yo, sí lo resientes), o sus achaques por tener Internet Explorer 8, en general Windows 7 es el mejor SO que ha creado Microsoft hasta ahora.
En mi Inspiron también tengo Ubuntu 9.04, hace unos días, descargué algunas actualizaciones para Windows 7, después de un reincio normal simplemente el SO no cargaba, usé las herramientas que trae el DVD pero nada, busqué en Internet, pero al ser realtivamente nuevo, la información es algo pobre o poco clara. No me quejé de que no registre correctamente los OCX o que IE8 se congele al imprimir, o su horrible forma de administrar las ventanas abiertas, pero esto és el colmo.
Eso es lo que más odio de los sistemas cerrados, la poca transparencia la guardar sus datos, y no es un juego, en este error perdí datos de Trabajadores de la Empresa en el programa SUA, varios archivos descargados, semanas de trabajo, etc.
Afortunadamente tenía mi partición con Ubuntu, y desde este SO pude rescatar la mayoría de mi información, desgraciadamente, entre tanto directorio oculto no pude salvaguardar importantísimos datos.
En fín, que me sirva de experiencia y que me quede claro "lo bonito, no és seguro...".