Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 927
0.00% covered (danger)
0.00%
0 / 13
CRAP
n/a
0 / 0
file2EdoCta
0.00% covered (danger)
0.00%
0 / 346
0.00% covered (danger)
0.00%
0 / 1
12432
csv2Array
0.00% covered (danger)
0.00%
0 / 30
0.00% covered (danger)
0.00%
0 / 1
306
xlsx2Array
0.00% covered (danger)
0.00%
0 / 32
0.00% covered (danger)
0.00%
0 / 1
600
encuentraHeaderEdoCta
0.00% covered (danger)
0.00%
0 / 25
0.00% covered (danger)
0.00%
0 / 1
306
estandarizaColsEdoCta
0.00% covered (danger)
0.00%
0 / 80
0.00% covered (danger)
0.00%
0 / 1
2756
identificaBancoEdoCta
0.00% covered (danger)
0.00%
0 / 20
0.00% covered (danger)
0.00%
0 / 1
210
identificaCuentaEdoCta
0.00% covered (danger)
0.00%
0 / 153
0.00% covered (danger)
0.00%
0 / 1
7656
importaEdoCtadesdeDirectorio
0.00% covered (danger)
0.00%
0 / 61
0.00% covered (danger)
0.00%
0 / 1
1332
html2Array
0.00% covered (danger)
0.00%
0 / 49
0.00% covered (danger)
0.00%
0 / 1
420
limpiaReferenciaBancaria
0.00% covered (danger)
0.00%
0 / 16
0.00% covered (danger)
0.00%
0 / 1
30
esPurosCeros
0.00% covered (danger)
0.00%
0 / 5
0.00% covered (danger)
0.00%
0 / 1
12
actualizaIngresos
0.00% covered (danger)
0.00%
0 / 96
0.00% covered (danger)
0.00%
0 / 1
992
mueveAIEC
0.00% covered (danger)
0.00%
0 / 14
0.00% covered (danger)
0.00%
0 / 1
42
1<?php
2
3function file2EdoCta($archivo='', $bc_id='', $mes="2014-01", $saldoBCUsuario=0.00, $b_id='', $auto=false, &$forceCuenta=false)
4{
5    global $gIAParametros, $gIAsql, $gSqlClass, $gDebugging;
6    include_once('iacWorkday.php');
7
8    $tmpsql = array();
9    $sql = array();
10    $feriados = new iacWorkday();
11    $feriados->workday_set(0,false)->workday_set(6,false);    // domingo y sabado
12    $feriados->mexico_oficial_holidays()->mexico_custom_holidays(); // dias oficiales y jueves/viernes santo
13    $log_err = "";
14    global $gWebDir;
15    $file_err = "C:\\wamp\\www\\$gWebDir\\uploads\\edocta\\";
16
17    $arrfile2EdoCta = array('Error'=>'',
18        'Status'=>'',
19        'Cuenta'=>'',
20        'bc_id'=>[],
21        'MovsInsertados'=>0,
22        'MovsFallidos'=>0,
23        'MovsExistentes'=>0,
24        'ErrorCode'=>'0', /** 0 = bien, 1 = Banco no identificado, 2 = Cuenta no identificada, 3 = Saldo no coincide, 4 = Se pido un banco y el archivo no pertenece a él. **/
25        'Action2Do'=>'' /** '' = bien, 'bc_id' = Solicitar cuenta, 'saldo' = Soliciar saldo **/);
26
27    if(empty($archivo))
28    {
29        $arrfile2EdoCta['Status'] = 'Error';
30        $arrfile2EdoCta['Error'] = '<span class="txt_color_red bold">Archivo corrupto.</span>';
31        return $arrfile2EdoCta;
32    }
33
34    if((empty($bc_id) || empty($b_id)) && !$auto)
35    {
36        $arrfile2EdoCta['Status'] = 'Error';
37        $arrfile2EdoCta['Error'] = '<span class="txt_color_red bold">Cuenta Equivocada.</span>';
38        return $arrfile2EdoCta;
39    }
40
41    $failSafe = true;
42
43    if($failSafe)
44    {
45        $year = date('Y') - 1;
46        $m = date('n');
47        if($m == 1)
48            $mes = "$year-11-30";
49        else
50            $mes = "$year-12-31";
51    }
52
53    if($auto)
54        $pathUF = $gIAParametros['path_archivos_estado_de_cuenta']."\\";
55    else {
56        global $gWebDir;
57        $pathUF = "C:\\wamp\\www\\$gWebDir\\uploads\\edocta\\";
58    }
59
60
61    $arrBancoModel =    array(
62        '1' => array( 'b_id' => 1, 'nombre' => 'BBVA',
63        'minCols' => 5, //cambiar por 4 para xlsx
64        'delimiter' => "\t",
65        'pL' => false,
66        'refArray' => false,
67        'cN' => array('CUENTA:','NUMERO DE CUENTA'),
68        'fN' => array(
69            array('bc_id'=>'2','nombre'=>array('IND','INDOTEX','INOTEX','INDITEX','INDOTE','INOTEX','INDOTES','INDOTEC','NDOTEX','DOTE')),
70            array('bc_id'=>'5','nombre'=>array('MAR','MARINO','BLANCO','MARONO','NARINO','BCO','MARINO Y BLANCO','MARINO Y BCO')),
71            array('bc_id'=>'8','nombre'=>array('CRO','CROSSTEX','CROSTEX','CROSTE','CROSTES','CROSSTES','CROSSTE')),
72            array('bc_id'=>'11','nombre'=>array('VIRGINIA','BIRGINIA','VIRGI','VIRGIMIA','IRGINIA')),
73            array('bc_id'=>'13','nombre'=>array('TER','TERESA','ERESA','TRESA','TEREAS','TEREA')),
74            array('bc_id'=>'15','nombre'=>array('RIT','RITA','SANTA','STA','SANTARITA','SANTA RITA')),
75            array('bc_id'=>'17','nombre'=>array('SAL','SALLETTE','LA SALLETTE','SALLETE','SALETE','SALETTE','SALLET')),
76            array('bc_id'=>'19','nombre'=>array('OCA','OCASCIA','OCACIA','OCASIA','OCACSIA','OACSCIA')),
77            array('bc_id'=>'21','nombre'=>array('EKA','EKAVALY')),
78            array('bc_id'=>'25','nombre'=>array('RONY NO FISCAL')),
79            array('bc_id'=>'28','nombre'=>array('RONY FISCAL')),
80            array('bc_id'=>'34','nombre'=>array('STEMAX','STEMA','MAX')),
81            array('bc_id'=>'35','nombre'=>array('CANDACE','CADACE','CAND')),
82            array('bc_id'=>'36','nombre'=>array('VIRGOMA','VIRGO','GOMA')),
83            array('bc_id'=>'38','nombre'=>array('LAGO','LAGOTEX','LAG')),
84            //VCA Agregué la cuenta de Rony. El archivo debe contener la palabra RONY
85            array('bc_id'=>'39','nombre'=>array('RONY','RON','ROYN','ORNY')),
86            array('bc_id'=>'45','nombre'=>array('USD','DOLARES','DOLAR','DOL')),
87        ),
88        'sN' => array(),
89        'rA' => true),
90        '2' => array('b_id' => 2, 'nombre' => 'BANAMEX','minCols' => 5,  'delimiter' => ',',
91            'pL' => array('MOVIMIENTO DE CUENTA CHEQUES','MOVIMIENTO DE CUENTA','MOVIMIENTOS DE CUENTA','MOVIMIENTOS DE CUENTA CHEQUES'),
92            'refArray' => false,
93            'cN' => array('CUENTA', 'NUMERO CUENTA', 'NUM CTA', 'CUENTA NUMERO', 'CTA NUM'),
94            'fN' => array(),
95            'sN' => array('SALDO FINAL'),
96            'rA' => true),
97        '3' => array('b_id' => 3, 'nombre' => 'BANORTE','minCols' => 13, 'delimiter' => "|",
98            'pL' => false,
99            'refArray' => true,
100            'cN' => array('CUENTA', 'NUMERO CUENTA', 'NUM CTA', 'CUENTA NUMERO', 'CTA NUM'),
101            'fN' => array(),
102            'sN' => array(),
103            'rA' => true),
104        '5' => array('b_id' => 5, 'nombre' => 'HSBC',   'minCols' => 5,  'delimiter' => "",
105            'pL' => array('MOVIMIENTOS DE LA CUENTA','CUENTA DE CHEQUES'),
106            'refArray' => true,
107            'cN' => array('NÚMERO DE CUENTA', 'NUMERO DE CUENTA', 'N&UACUTEMERO DE CUENTA'),
108            'fN' => array(),
109            'sN' => array(),
110            'rA' => false),
111        '14' => array('b_id' => 14, 'nombre' => 'MONEX',   'minCols' => 11,  'delimiter' => "\t",
112            'pL' => array('MOVIMIENTOS DEL CONTRATO'),
113            'refArray' => true,
114            'cN' => array(),
115            'fN' => array(
116                array('bc_id'=>'58','nombre'=>array('VIRGOMA','VIRGO','GOMA')),
117                array('bc_id'=>'59','nombre'=>array('VIRGOMA USD','VIRGOMA DOLARES')),
118                array('bc_id'=>'56','nombre'=>array('STEMAX','STEMA','MAX')),
119                array('bc_id'=>'57','nombre'=>array('STEMAX USD','STEMAX  DOLARES',)),
120                array('bc_id'=>'54','nombre'=>array('OCA','OCASCIA','OCACIA','OCASIA','OCACSIA','OACSCIA')),
121                array('bc_id'=>'55','nombre'=>array('OCASCIA USD','OCASCIA DOLARES',)),
122                array('bc_id'=>'52','nombre'=>array('MAR','MARINO','BLANCO','MARONO','NARINO','BCO','MARINO Y BLANCO','MARINO Y BCO')),
123                array('bc_id'=>'53','nombre'=>array('MARINO USD','MARINO DOLARES')),
124                array('bc_id'=>'50','nombre'=>array('IND','INDOTEX','INOTEX','INDITEX','INDOTE','INOTEX','INDOTES','INDOTEC','NDOTEX','DOTE')),
125                array('bc_id'=>'51','nombre'=>array('INDOTEX USD','INDOTEX DOLARES')),
126                array('bc_id'=>'48','nombre'=>array('EKA','EKAVALY')),
127                array('bc_id'=>'49','nombre'=>array('EKAVALY USD','EKAVALY DOLARES'))),
128            'sN' => array(),
129            'rA' => false,
130            'ignora_saldo' => true));
131
132    $arrBCColModel =    array(
133        'fecha'         =>  array(  'index' => array('array' => false, 'finalKey' => 0, 'originKey' => false, 'found' => false),
134            'nombre'=> array('match' => array('FECHA', 'DATE', 'DIA', 'FECHA POSTERIOR', 'FECHA DEL APUNTE', 'FECHA OPERACION', 'FECHA DE LIQUIDACION'), //La columna de FECHA en los archivos puede traer cualquiera de estas palabras.
135                'ignore'=> array(),
136                'strict'=> true)),
137        'referencia'    =>  array(  'index' => array('array' => false, 'finalKey' => 1, 'originKey' => false, 'found' => false),
138            'nombre'=> array('match' => array('DESCRIPCION', 'DESCRIPCION DETALLADA', 'REFERENCIA', 'REFERENCE', 'REF', 'NOTES', 'REMARKS', 'DESCRIPTION', 'CONCEPTO', 'DETALLE', 'DETALLES', 'DETAILS', 'DETAIL', 'CONCEPTO / REFERENCIA', 'DESCRIPCI&OACUTE;N', 'NARRATIVA ADICIONAL', 'REFERENCIA DEL CLIENTE', 'DESCRIPCION','REFERENCIA DE CLIENTE', 'EMISORA SERIE'),
139                'ignore'=> array(),
140                'strict'=> true)),
141        'withdrawal'    =>  array(  'index' => array('array' => false, 'finalKey' => 2, 'originKey' => false, 'found' => false),
142            'nombre'=> array('match' => array('CARGO', 'CARGOS', 'RETIRO', 'RETIROS', 'WITHDRAWAL', 'WITHDRAWALS', 'IMPORTE DEL CARGO', 'IMPORTE DEL DEBITO','IMPORTE'),
143                'ignore'=> array(),
144                'strict'=> true)),
145        'deposit'       =>  array(  'index' => array('array' => false, 'finalKey' => 3, 'originKey' => false, 'found' => false),
146            'nombre'=> array('match' => array('ABONO', 'ABONOS', 'DEPOSITO', 'DEPOSITOS', 'DEPOSIT', 'DEPOSITS', 'DEP&OACUTE;SITO', 'IMPORTE DEL ABONO', 'IMPORTE DE CREDITO','IMPORTE'),
147                'ignore'=> array(),
148                'strict'=> true)),
149        'balance'       =>  array(   'index' => array('array' => false, 'finalKey' => 4, 'originKey' => false, 'found' => false),
150            'nombre'=> array('match' => array('SALDO ACTUAL EN LIBROS','SALDO', 'BALANCE'),
151                'ignore'=> array(),
152                'strict'=> true))
153    );
154
155    $arrBCColsNum = array('required' => 4, 'found' => 0);
156
157    $arrSaldosCol = array(); //Para Banamex, por si el saldo no viene en la primera, ni última filas.
158
159    $arrEmpresas = ia_sqlArray("SELECT banco_cuenta_id, empresa_id FROM banco_cuenta ORDER BY banco_cuenta_id", "banco_cuenta_id");
160
161
162
163
164    $saldoBCenArchivoAlter = 0.00;
165    $saldoBCenArchivo = 0.00;
166
167    $usuario = $_SESSION['usuario'];
168
169    $fechaKey = $arrBCColModel['fecha']['index']['finalKey'];
170    $referenciaKey = $arrBCColModel['referencia']['index']['finalKey'];
171    $withdrawalKey = $arrBCColModel['withdrawal']['index']['finalKey'];
172    $depositKey = $arrBCColModel['deposit']['index']['finalKey'];
173    $balanceKey = $arrBCColModel['balance']['index']['finalKey'];
174
175    $bIndex = false;
176
177    $arrBancoCuentaMov = array();
178    $iMovNvo = 0;
179    $arrMovsNuevos = false;
180    $arrMovsHeader = false;
181
182    $maxCharRef = 10;
183
184    if(!file_exists($pathUF.$archivo))
185    {
186        $arrfile2EdoCta['Status'] = 'Error';
187        $arrfile2EdoCta['Error'] = '<span class="txt_color_red bold">Error al procesar el archivo. El Archivo no existe.</span>';
188        return $arrfile2EdoCta;
189    }
190
191    //Detectamos el banco o al menos lo intentamos.
192
193    if($auto)
194    {
195        /**if($b_id!='5')
196        $b_id = false;
197        $bIndex = false;**/
198        $bIndex = $b_id;
199        if($b_id == '5' || $b_id == 5)
200            $bIndex = 3;
201        else if($b_id == '14' || $b_id == 14)
202            $bIndex = 4;
203    }
204    else
205    {
206        foreach($arrBancoModel as $k => $v)
207            if($v['b_id'] == $b_id)
208                $bIndex = $k;
209    }
210
211    if(empty($b_id))
212        identificaBancoEdoCta($pathUF.$archivo, $arrBancoModel, $b_id, $bIndex);
213    $bIndex = $b_id;
214    if(empty($b_id))
215    {
216        $arrfile2EdoCta['Status'] = 'Error';
217        $arrfile2EdoCta['Error'] = '<span class="txt_color_red bold">No fue posible determinar el Banco.</span>';
218        $arrfile2EdoCta['ErrorCode'] = '1';
219        $arrfile2EdoCta['Action2Do'] = 'bc_id';
220        return $arrfile2EdoCta;
221    }
222//    $arrBCColsNum['required'] = $arrBancoModel[$b_id]['minCols'];
223    /*
224            //Bloqueo de la cuenta.
225            $myLock = new ProcessLock();
226            //$s = md5($appCB.$CtaT->cuenta_bancaria.$CtaT->quantity.$CtaT->fecha_deposito);
227            $s = md5($b_id);
228            $gotLock = $myLock->aquire($s);
229
230            if(!$gotLock)
231            {
232                $arrfile2EdoCta["Status"] = 'Error';
233                $arrfile2EdoCta["Error"] = '<span class="txt_color_red bold">Concurrencia de Links.</span>';
234                $arrfile2EdoCta['ErrorCode'] = '1';
235                $arrfile2EdoCta['Action2Do'] = 'bc_id';
236                return $arrfile2EdoCta;
237            }
238    */
239
240    //echo "\r\nBanco: $b_id\r\n";
241    //quitar false para xlsx
242    if(strpos($pathUF.$archivo, "xlsx") !== false && ($b_id == 1 || $b_id == 5))//Aqui decidimos que es bancomer y traemos el arreglo de otra función. //VCA 12-03-2021 HSBC cambió su formato
243        $arrMovsNuevos = xlsx2Array($pathUF.$archivo, '', false, $arrBCColsNum['required']);
244    else if($b_id == '5' || $b_id == 5)
245        $arrMovsNuevos = html2Array($pathUF.$archivo, $arrBancoModel[$bIndex], $arrBCColModel, $arrBCColsNum);
246    else
247        $arrMovsNuevos = csv2Array($pathUF.$archivo, $arrBancoModel[$bIndex]['delimiter']);
248
249    if(!is_array($arrMovsNuevos) || empty($arrMovsNuevos))
250    {
251        $arrfile2EdoCta['Status'] = 'Error';
252        $arrfile2EdoCta['Error'] = '<span class="txt_color_red bold">Error al procesar el archivo. No se encontraron movimientos bancarios.</span>';
253        return $arrfile2EdoCta;
254    }
255
256
257    /** Establecemos si la referencia es uno o más campos **/
258
259    $arrBCColModel['referencia']['index']['array'] = $arrBancoModel[$bIndex]['refArray'];
260
261
262
263    if(encuentraHeaderEdoCta($arrBCColModel, $arrBCColsNum, $arrMovsNuevos, $arrMovsHeader) === false)
264    {
265        $arrfile2EdoCta['Status'] = 'Error';
266        $arrfile2EdoCta['Error'] = '<span class="txt_color_red bold">Error al procesar el archivo. No se encontró el inicio de los movimientos bancarios.</span>';
267        return $arrfile2EdoCta;
268    }
269
270    /**
271    //Para Banorte
272    if(is_array($arrBCColModel['referencia']['index']['originKey']) && ($b_id == '3' || $b_id == 3)){
273    $tmprefarr = $arrBCColModel['referencia']['index']['originKey'];
274    foreach($arrBCColModel['referencia']['index']['originKey'] as $k => &$v)
275    {
276    switch($k){
277    case 0: $arrBCColModel['referencia']['index']['originKey'][$k] = $tmprefarr[1]; break;
278    case 1: $arrBCColModel['referencia']['index']['originKey'][$k] = $tmprefarr[2]; break;
279    case 2: $arrBCColModel['referencia']['index']['originKey'][$k] = $tmprefarr[0]; break;
280    }
281    }
282
283    echo "tmprefarr: <pre>".print_r($tmprefarr, true)."</pre>";
284    echo "arrBCColModel: <pre>".print_r($arrBCColModel, true)."</pre>";
285    die();
286    }
287     * **/
288
289    /** Intentamos determinar la cuenta a la que pertenece el archivo **/
290    //if($auto) $bc_id = false; /** Quitar **/
291    //echo "bc_id before: $bc_id";
292    if(empty($bc_id))
293        $bc_id = identificaCuentaEdoCta($arrMovsNuevos, $arrMovsHeader, $arrBancoModel[$bIndex], $archivo, $arrBCColModel);
294ia_errores_a_dime();
295    if(empty($bc_id))
296    {
297        $arrfile2EdoCta['Status'] = 'Error';
298        $arrfile2EdoCta['Error'] = '<span class="txt_color_red bold">No fue posible determinar la Cuenta Bancaria.</span>';
299        $arrfile2EdoCta['ErrorCode'] = '2';
300        $arrfile2EdoCta['Action2Do'] = 'bc_id';
301        $arrfile2EdoCta['b_id'] = $b_id;
302    }
303//    echo "Col Model $bc_id: <pre>".print_r($arrBCColModel, true)."</pre>";
304//    echo "Nuevos Original: <pre>".print_r($arrMovsNuevos, true)."</pre>";
305//    echo "arrBCColsNum: <pre>".print_r($arrBCColsNum, true)."</pre>";
306
307
308    /** 05-01-2017 Revisamos que la cuenta esté activa **/
309    $puedeEditar = puedeCuentaBancaria('', $bc_id);
310    //echo "puedeEditar: <pre>".print_r($puedeEditar, true)."</pre>";
311    if (!$puedeEditar['puede']) {
312        $arrfile2EdoCta['Status'] = 'Error';
313        $arrfile2EdoCta['Error'] = '<span class="txt_color_red bold">La Cuenta Bancaria no está activa o no tiene permiso.</span>';
314        $arrfile2EdoCta['ErrorCode'] = '2';
315        $arrfile2EdoCta['Action2Do'] = 'bc_id';
316        $arrfile2EdoCta['b_id'] = $b_id;
317        return $arrfile2EdoCta;
318    }
319
320
321    if (!empty($forceCuenta) && !is_array($forceCuenta))
322        $forceCuenta = array($forceCuenta);
323
324
325    if (!empty($forceCuenta) && !in_array($bc_id, $forceCuenta)) {
326        $arrfile2EdoCta['Status'] = 'OK';
327        $arrfile2EdoCta['Error'] = '<span class="txt_color_red bold">El Archivo no pertenece a la Cuenta Bancaria solicitada.</span>';
328        $arrfile2EdoCta['ErrorCode'] = '4';
329        $arrfile2EdoCta['Action2Do'] = '';
330        return $arrfile2EdoCta;
331    }
332
333
334    //echo "arrfile2EdoCta: <pre>".print_r($arrfile2EdoCta, true)."</pre>";
335    //die();
336
337    /** *************************************************************************************/
338    /** *************************************************************************************/
339    /** *************************************************************************************/
340    /** *************************************************************************************/
341    /** *************************************************************************************/
342
343    //VCA: 07-Nov-2023 Intenamos un lock en las cuentas de monex =(
344    //Bloqueo de la cuenta.
345/*    $myLock = new ProcessLock();
346    //$s = md5($appCB.$CtaT->cuenta_bancaria.$CtaT->quantity.$CtaT->fecha_deposito);
347    $s = md5($bc_id);
348    $gotLock = $myLock->aquire($s);
349
350    if(!$gotLock)
351    {
352        $arrfile2EdoCta["Status"] = 'Error';
353        $arrfile2EdoCta["Error"] = '<span class="txt_color_red bold">Concurrencia de Links.</span>';
354        $arrfile2EdoCta['ErrorCode'] = '1';
355        $arrfile2EdoCta['Action2Do'] = 'bc_id';
356        return $arrfile2EdoCta;
357    }*/
358    //VCA: 16-Octubre-2023 Truco sucio para las cuentas hermanas Pesos/USD;
359    $bc_arr = array($bc_id);
360    $arr_MovsNuevos[$bc_id] = $arrMovsNuevos;
361
362    if($b_id == 14) {
363        unset($arr_MovsNuevos[$bc_id]['USD']);
364        $bc_arr[] = $bc_id + 1;
365        $arr_MovsNuevos[$bc_id + 1] = array_key_exists('USD', $arrMovsNuevos) ? $arrMovsNuevos['USD'] : [];
366    }
367
368
369
370//    echo "arrMovsNuevos: <pre>".print_r($arrMovsNuevos, true)."</pre>";
371    unset($arrMovsNuevos);
372    unset($bc_id);
373//    echo "arr_MovsNuevos: <pre>".print_r($arr_MovsNuevos, true)."</pre>";
374//    echo "bc_arr: <pre>".print_r($bc_arr, true)."</pre>";unset($bc_id);
375//
376//    die();
377    $sql_insert = array();
378    foreach($bc_arr as $bc_id) {
379        $arrBancoCuentaMov = array();
380        $arrMovsNuevos = &$arr_MovsNuevos[$bc_id];
381
382//    echo "arr_MovsNuevos $bc_id: <pre>".print_r($arrMovsNuevos, true)."</pre>";
383////    echo "bc_arr: <pre>".print_r($bc_arr, true)."</pre>";unset($bc_id);
384//
385//    die();
386        $ctaBancariaNombre = ia_htmlentities(ia_singleread("SELECT nombre FROM banco_cuenta WHERE banco_cuenta_id = '$bc_id'"));
387        $arrfile2EdoCta['Cuenta'] .= $ctaBancariaNombre;
388        $arrfile2EdoCta['bc_id'][] = $bc_id;
389
390        if (!estandarizaColsEdoCta($arrMovsNuevos, $arrBCColModel, $saldoBCenArchivo, $arrBancoModel[$bIndex], $arrMovsHeader, $saldoBCenArchivoAlter, $arrSaldosCol)) {
391            $arrfile2EdoCta['Status'] = 'Error';
392            $arrfile2EdoCta['Error'] .= '<span class="txt_color_red bold">Error al procesar el archivo. No se pudo estandarizar las columnas.</span>';
393//            $myLock->release();
394            continue;
395//            return $arrfile2EdoCta;
396        }
397//        echo "arr_MovsNuevos $bc_id: <pre>".print_r($arrMovsNuevos, true)."</pre>";
398//        die();
399        //Aquí buscamos la fecha más antigua.
400        uksort($arrMovsNuevos, function ($aKey, $bKey) use ($fechaKey, $arrMovsNuevos) {
401
402            $timestampA = strtotime($arrMovsNuevos[$aKey][$fechaKey]);
403            $timestampB = strtotime($arrMovsNuevos[$bKey][$fechaKey]);
404
405            // First, compare by dates
406            if ($timestampA != $timestampB) {
407                return $timestampA - $timestampB;
408            }
409
410            // If dates are equal, compare by keys
411            return $aKey - $bKey;
412        });
413
414
415
416        //VCA 22-05-2019
417        if (empty($arrMovsNuevos)) {
418            $arrfile2EdoCta['Status'] = 'Error';
419            $arrfile2EdoCta['Error'] .= '<span class="txt_color_red bold">No hay movimientos para revisar.</span>';
420//            return $arrfile2EdoCta;
421//            $myLock->release();
422            continue;
423        }
424
425
426
427        $tmp1 = array_values(array_slice($arrMovsNuevos, -1))[0];
428        $tmp2 = $arrMovsNuevos[0];
429
430        $tmpt1 = new DateTime(date('Y-m-d', strtotime($tmp1[$fechaKey])));
431        $tmpt2 = new DateTime(date('Y-m-d', strtotime($tmp2[$fechaKey])));
432
433        $log_err .= "1 Mov: <pre>".print_r($tmp1, true)."</pre>";
434        $log_err .= "2 Mov: <pre>".print_r($tmp2, true)."</pre>";
435
436        $log_err .= "1 fecha: <pre>".print_r($tmpt1, true)."</pre>";
437        $log_err .= "2 fecha: <pre>".print_r($tmpt2, true)."</pre>";
438
439        $mes1 = $mes;
440
441        if ($tmpt1 < $tmpt2)
442            $mes = $tmp1[$fechaKey];
443        else
444            $mes = $tmp2[$fechaKey];
445
446
447//        echo "log_err: <pre>".print_r($log_err, true)."</pre>";
448//        echo "Nuevos Estandarizados: <pre>".print_r($arrMovsNuevos, true)."</pre>";
449//        die();
450
451        //if(array_key_exists(0, $arrMovsNuevos) && array_key_exists($balanceKey, $arrMovsNuevos[0]))
452        //$saldoBCenArchivo = floatval(limpiaCantidad($arrMovsNuevos[0][$balanceKey]));
453        if (!$auto && $saldoBCenArchivo != $saldoBCUsuario) {
454            $arrfile2EdoCta['Status'] = 'Error';
455            $arrfile2EdoCta['Error'] = "<span class=\"txt_color_red bold\">Saldo no coincide 123. $saldoBCenArchivo _ $saldoBCUsuario</span>";
456//            return $arrfile2EdoCta;
457//            $myLock->release();
458            continue;
459        }
460
461
462        $sqlMovsAnt = "SELECT DATE(fecha) as '0', numero as '1', withdrawal as '2', (cash + deposit) as '3', '' as '4', banco_cuenta_mov_id, banco_cuenta_id, banco_id, fecha as fechaOri, alta_tipo, link_vale, 'NO' as 'matcheado' FROM banco_cuenta_mov WHERE banco_cuenta_id = '$bc_id' AND fecha >= '$mes' ORDER BY fechaOri DESC, banco_cuenta_mov_id DESC";
463        $arrMovsAnt = ia_sqlArrayIndx($sqlMovsAnt);
464
465//    echo "$sqlMovsAnt \r\nAnteriores Original: <pre>".print_r($arrMovsAnt, true)."</pre>";
466//    die();
467
468        if (!empty($arrMovsAnt))
469            $hayMovsAnt = true;
470        else {
471            $mes = $mes1;
472            $sqlMovsAnt = "SELECT DATE(fecha) as '0', numero as '1', withdrawal as '2', (cash + deposit) as '3', '' as '4', banco_cuenta_mov_id, banco_cuenta_id, banco_id, fecha as fechaOri, alta_tipo, link_vale, 'NO' as 'matcheado' FROM banco_cuenta_mov WHERE banco_cuenta_id = '$bc_id' /*AND fecha >= '$mes'*/ ORDER BY fechaOri ASC, banco_cuenta_mov_id DESC LIMIT 20";
473            $arrMovsAnt = ia_sqlArrayIndx($sqlMovsAnt);
474            if (empty($arrMovsAnt))
475                $hayMovsAnt = false;
476        }
477
478        $log_err .= "$sqlMovsAnt \r\n";
479
480        $nowMoment = new DateTime(date('H:i:s'));
481        $today = date('Y-m-d');
482        $arrPalabrasSBC = array('SALVO',
483            'SALVO BUEN',
484            'SALVO BUEN COBRO',
485            'OTRO BANCO',
486            'CHEQUES DE OTRO',
487            'CHEQUES DE OTRO BANCO',
488            'CHEQUE DE OTRO',
489            'CHEQUE DE OTRO BANCO',
490            'S.B.C.');
491
492//        print_r ($arrMovsNuevos);
493//        echo "\r\n";
494//        print_r ($arrMovsAnt);
495//        echo "\r\n";
496//
497//        die();
498
499
500        foreach ($arrMovsNuevos as $kmovNvo => &$movNvo) {
501            // dd_($movNvo);
502            $igual = 0;
503            $parecido = 0;
504            $nowMoment->modify("+1 seconds");//Puede ser lento.
505            $refOriginal = quitacaracraros($movNvo[$referenciaKey]);
506
507            //Compara los movimientos tentativamente nuevos con los que tiene la BD.
508            foreach ($arrMovsAnt as $kmovAnt => &$movAnt) {
509                //echo "Anterior a Comparar: <pre>".print_r($movAnt, true)."</pre>";
510                $nowMoment->modify("+1 seconds");//Puede ser lento.
511                //
512                //Hacer una variable con $movNvo[$referenciaKey], $movAnt[$referenciaKey]
513                //
514
515                //$fechaRevisada = false;
516
517                //Hacemos una verificación en putiza para arreglar los movimientos en fin de semana de banamex.
518                if ($b_id == '2') {
519                    if (isWeekend($movAnt[$fechaKey])) {
520                        //$movAnt[$fechaKey] = sumaDias($movAnt[$fechaKey],2);
521                        $movAnt[$fechaKey] = $feriados->nextWorkday($movAnt[$fechaKey]); // regresa 1 dia habil despues de la fecha
522                        //echo "Anterior a Comparar: <pre>".print_r($arrMovsAnt[$kmovAnt], true)."</pre>";
523
524                    }
525
526                    /**
527                     * foreach($arrPalabrasSBC as $ref)
528                     * if(strpos($movAnt[$referenciaKey], $ref) !== false)
529                     * {
530                     * $fechaRevisada = true;
531                     * break;
532                     * }
533                     **/
534                }
535
536                //$refSimilarity = 0.00;
537                //$refCaracIguales = similar_text($movAnt[$referenciaKey], $movNvo[$referenciaKey], $refSimilarity);
538                $refAnterior = $movAnt[$referenciaKey];
539                $refNueva = $movNvo[$referenciaKey];
540                $refNueva = limpiaReferenciaBancaria($refNueva);
541                $refAnterior = limpiaReferenciaBancaria($refAnterior);
542
543                $movNvo[$referenciaKey] = $refNueva;
544
545//                    $log_err .=  "\r\nComparacion sólo fecha monto\r\n";
546//                    $log_err .=  "1NVO: ".$refNueva."\r\n";
547//                    $log_err .=  "1ANT: ".$refAnterior."\r\n";
548
549                if ((/**$fechaRevisada ||**/ $movNvo[$fechaKey] == $movAnt[$fechaKey]) /*fecha*/
550                    && (floatval($movNvo[$withdrawalKey]) == floatval($movAnt[$withdrawalKey])) /*cargo*/
551                    && (floatval($movNvo[$depositKey]) == floatval($movAnt[$depositKey])) /*abono*/
552                    && ($movAnt['matcheado'] == 'NO')/** ( $b_id == '2' && ($refSimilarity > 50 || $refCaracIguales > 30) ) || banamex es imposible.**/
553                ) {
554                    $log_err .= "\r\nComparacion sólo cadena de caracteres\r\n";
555                    $log_err .= "\r\nPor comparar: \r\n$---------------movNvo:" . $movNvo[$referenciaKey] . "\r\n---------movAnt:" . $refAnterior . "---------\r\n";
556                    $log_err .= "\r\nmovNvo:" . $movNvo[$referenciaKey] . ", $ " . floatval($movNvo[$depositKey]) . " movAnt:" . $movAnt[$referenciaKey] . ", $ " . floatval($movAnt[$depositKey]) . "\r\n";
557
558                    //$refNueva = $movNvo[$referenciaKey];
559                    //$log_err .=  "\r\n1NVO: ".$refNueva."\r\n";
560                    //$log_err .=  "1ANT: ".$refAnterior."\r\n";
561
562                    $log_err .= "\r\nNVO: " . $refNueva . "\r\n";
563                    $log_err .= "ANT: " . $refAnterior . "\r\n";
564                    $log_err .= "COMPARACION:" . strpos($refNueva, $refAnterior) . "\r\n";
565
566
567                    if ($refAnterior == $refNueva || (strpos($refNueva, $refAnterior) == 0 && strpos($refNueva, $refAnterior) !== false) || (strpos($refAnterior, $refNueva) == 0 && strpos($refAnterior, $refNueva) !== false) || (conFin($refNueva, $refAnterior))) {
568                        $log_err .= "\r\nmovNvo:" . $refNueva . ", $ " . floatval($movNvo[$depositKey]) . " movAnt:" . $refAnterior . ", $ " . floatval($movAnt[$depositKey]) . "\r\n";
569                        if (0 == ($igual = hayIgual($arrMovsAnt, $refNueva, $referenciaKey, $log_err))) {
570                            $log_err .= "\r\nHay igual: $---------------movNvo:" . $refNueva
571                                . "\r\n---------movAnt:" . $refAnterior . "---------\r\n";
572                            $parecido++;
573
574                            $movAnt['matcheado'] = 'SI';
575                            $arrfile2EdoCta['MovsExistentes']++;
576                            $sql[] = "UPDATE banco_cuenta_mov SET numero=" . stritc($refNueva) . " numero_original=" . strit($refOriginal) . " WHERE banco_cuenta_mov_id = " . strit($movAnt['banco_cuenta_mov_id']);
577                        } else {
578                            $igual = 1;
579                            $movAnt['matcheado'] = 'SI';
580                            $arrfile2EdoCta['MovsExistentes']++;
581
582                            $sql[] = "UPDATE banco_cuenta_mov SET numero_original=" . strit($refOriginal) . " WHERE banco_cuenta_mov_id = " . strit($movAnt['banco_cuenta_mov_id']);
583
584                            if ($refAnterior != $refNueva)
585                                $sql[] = "UPDATE banco_cuenta_mov SET numero=" . stritc($refNueva) . " numero_original=" . strit($refOriginal) . " WHERE banco_cuenta_mov_id = " . strit($movAnt['banco_cuenta_mov_id']);
586                        }
587                        $movAnt[$referenciaKey] = $movNvo[$referenciaKey] = $refNueva;
588                        break;
589                    }
590                }
591            }
592            $log_err .= "\r\n>>>>>Parecidos: \r\n" . $parecido . "<<<>>>Iguales: " . $igual . "<<<<<<\r\n";
593            //Si no encontró uno parecido, entonces sí es nuevo.
594            if ($parecido == 0 && $igual == 0) /** if(!$movNvoExiste) **/ {
595                $log_err .= "\r\n <pre>Nuevo mov: " . print_r($movNvo, true) . "</pre>\r\n";
596                //InsertaNuevo();
597
598                $nowMoment->modify("+1 seconds");//Puede ser lento.
599                /** Opcion1 timestamp y sumar ints 1y lo farmateo con date**/
600                /** Opcion 2, usar add en vez de modify y antes del loop crear un dateinterval con
601                 * todo en 0 y seg en uno*/
602
603
604                $BancoCuentaMovTmp = new BancoCuentaMov;
605                $BancoCuentaMovTmp->banco_cuenta_id = $bc_id;
606                $BancoCuentaMovTmp->moneda_id = ia_singleread("SELECT moneda_id FROM banco_cuenta WHERE banco_cuenta_id = " . strit($bc_id));
607                $BancoCuentaMovTmp->fecha = $movNvo[$fechaKey] . " " . $nowMoment->format('H:i:s');
608                $BancoCuentaMovTmp->deposit = $movNvo[$depositKey];
609                $BancoCuentaMovTmp->withdrawal = $movNvo[$withdrawalKey];
610                $BancoCuentaMovTmp->cash = 0.00;
611                $BancoCuentaMovTmp->numero = $movNvo[$referenciaKey];
612                $BancoCuentaMovTmp->numero_original = $refOriginal;
613                $BancoCuentaMovTmp->banco_id = $b_id;
614                $BancoCuentaMovTmp->alta_por = $usuario;
615                $BancoCuentaMovTmp->alta_db = $today . " " . $nowMoment->format('H:i:s');
616
617                $BancoCuentaMovTmp->alta_tipo = 'auto';
618
619                $BancoCuentaMovTmp->go = 'SI';
620
621
622
623                //VCA CTA RONY 20-11-2020
624                //if($bc_id == 39 || $bc_id == '39')
625                //$BancoCuentaMovTmp->link_vale = 'ND';
626                //VCA 02-12-2020 Poner depósitos en ND
627                //Ahora revisamos si la cuenta bancaria está en los párametros del sistema
628                $cpnd_csv = ia_singleread("SELECT banco_cuenta_poner_deposito_ND FROM iac_parametros WHERE 1");
629                $cpnd_arr = explode(",", $cpnd_csv);
630                $cpnd_arr = array_flip($cpnd_arr);
631
632                //echo "<pre>$cpnd_csv" . print_r($cpnd_arr, true) . "</pre>";
633
634                if (array_key_exists($bc_id, $cpnd_arr))
635                    $BancoCuentaMovTmp->link_vale = 'ND';
636
637                $BancoCuentaMovTmp->calculaCamposAutomaticos();
638                //echo "<pre>$kmovNvo" . print_r($BancoCuentaMovTmp, true) . "</pre>";
639
640                $arrBancoCuentaMov[] = $BancoCuentaMovTmp;
641
642
643            }
644        }
645        //Revisamos los manuales.
646
647//            echo "Nuevos en Objetos: <pre>".print_r($arrBancoCuentaMov, true)."</pre>";
648////            echo "Resumen: <pre>".print_r($arrfile2EdoCta, true)."</pre>";
649//            die();
650
651
652        $log_err .= "\r\n\r\nNuevos en Objetos: <pre>" . print_r($arrBancoCuentaMov, true) . "</pre>";
653
654        //$log_err .= "\r\n\r\nsql: <pre>".print_r($sql, true)."</pre>";
655
656
657        /** Quiere decir que todos los movimientos ya existían. **/
658        if (empty($arrBancoCuentaMov) || $arrfile2EdoCta['MovsExistentes'] == sizeof($arrMovsNuevos)) {
659            //$sql = array();
660            //VCA 27-08-2020 se comenta porque se llama actualizaIngresos despues de llamar
661            //$sql[] = "UPDATE banco_cuenta SET ultima_conciliacion=NOW() WHERE banco_cuenta_id=".strit($bc_id);
662            //$sql[] = "CALL actualiza_banco_cuenta_saldos($bc_id)";
663            //async_actualizaIngresos(); se comenta porque se llama actualizaIngresos despues de llamar
664            //echo "<pre>".print_r($sql, true)."</pre>";
665            //die();
666            // $sql = array_merge($sql, $sql_2);
667            // dd_('ya existe', $sql);
668
669            ia_transaction($sql);
670            ia_errores_a_dime();
671
672            $arrfile2EdoCta['Status'] = 'OK';
673            $arrfile2EdoCta['Error'] = "<strong>Estado de Cuenta Importado con Éxito.</strong><br/><br/><strong>Resumen:</strong><br/>
674            <li>Cuenta: <strong>$ctaBancariaNombre</strong>.<br/>
675            <strong>===========================================</strong>
676            <br/>
677            <li>Movimientos Nuevos: <strong>" . sizeof($arrBancoCuentaMov) . "</strong>.
678            <li>Movimientos Existentes: <strong>$arrfile2EdoCta[MovsExistentes]</strong>.<br/>
679            <li>Movimientos con Error: <strong>$arrfile2EdoCta[MovsFallidos]</strong>.<br/><br/>
680            <a href='../cobranza/edocta.php?banco_cuenta_id=$bc_id' title='Abrir el Estado de Cuenta Importado.' target='_blank'>
681            Abrir <strong>$ctaBancariaNombre.</strong> <img src='/img/banco.png' alt='Bancos' title='Bancos'></a>";
682//            return $arrfile2EdoCta;
683//            $myLock->release();
684            continue;
685        }
686
687        //$bc_saldo_actual = 0.00;
688        //$bc_saldo_actual = limpiaCantidad(ia_singleread("SELECT SUM(cash)+SUM(deposit)-SUM(withdrawal) AS saldo_actual FROM banco_cuenta_mov WHERE banco_cuenta_id = $bc_id"));
689
690        //if($hayMovsAnt)
691        //Error en saldo 13/11/2020
692//        ia_query("CALL actualiza_banco_cuenta_saldos($bc_id)");
693        $bc_saldo_actual = limpiaCantidad(ia_singleread("SELECT saldo_actual FROM banco_cuenta_saldos WHERE banco_cuenta_id = $bc_id"));
694        $bc_saldo_actual = empty($bc_saldo_actual) ? 0.00 : $bc_saldo_actual;
695        //else
696        //$bc_saldo_actual = 0.00;
697
698        //echo "Nuevos en Objetos: <pre>".print_r($arrBancoCuentaMov, true)."</pre>";
699
700        //echo "<br/>Saldo Inicial: ".($bc_saldo_actual);
701        //echo "<br/>Saldo en el archivo: ".gettype($saldoBCenArchivo);
702
703        $huboSBCHoy = false;
704
705        foreach ($arrBancoCuentaMov as $k => &$movNvo)
706            if ($movNvo->go == 'SI') {
707                if ($b_id == '2' && $movNvo->link_vale == 'SBC' && date('Y-m-d', strtotime($movNvo->fecha)) == $today) {
708                    $huboSBCHoy .= '<li>MOVIMIENTO <strong>SALVO BUEN COBRO</strong> EL DÍA DE <strong>HOY: $ ' . echonf($movNvo->deposit - $movNvo->withdrawal) . '</strong><br/>';
709                    continue;
710                }
711                $bc_saldo_actual += ($movNvo->deposit - $movNvo->withdrawal);
712                $movNvo->bc_empresa_id = $arrEmpresas[$bc_id]['empresa_id'];
713                //echo "<br/>Monto Mov: ".($movNvo->deposit - $movNvo->withdrawal);
714            }
715
716        //echo "<br/>Saldo Calculado: ".($bc_saldo_actual);
717        //echo "<br/>Saldo en el archivo: ".($saldoBCenArchivo);
718
719        $difenSaldoFinMes = 200.00;
720        $salta_verif = false;
721        $salta_verif = true;
722
723        $diasMes = date("t");
724        $diaHoy = date("j");
725
726        ///if(abs($diasMes - $diaHoy) > 2)
727        if (!$salta_verif && (!isWeekend() && $diaHoy > 2 && $diaHoy < 28))
728            $difenSaldoFinMes = 0;
729
730        $bc_saldo_actual = round($bc_saldo_actual, 2);
731        $saldoBCenArchivo = round($saldoBCenArchivo, 2);
732        $saldoBCenArchivoAlter = round($saldoBCenArchivoAlter, 2);
733
734        if ($auto) {
735            if ($b_id == 2 || $b_id == '2') {
736                $saldoEncontrado = true;
737                if ($saldoBCenArchivo != $bc_saldo_actual && $saldoBCenArchivoAlter != $bc_saldo_actual && (abs($saldoBCenArchivo - $bc_saldo_actual) > $difenSaldoFinMes || abs($saldoBCenArchivoAlter - $bc_saldo_actual) > $difenSaldoFinMes)) {
738                    $saldoEncontrado = false;
739
740                    //echo "<pre>".print_r($arrSaldosCol, true)."</pre>";
741                    if (is_array($arrSaldosCol) && !empty($arrSaldosCol)) //Recorrer array de saldos.
742                        foreach ($arrSaldosCol as $k => $vMov) {
743                            //echo "<li>$vMov, $bc_saldo_actual, $difenSaldoFinMes";
744                            if ($vMov == $bc_saldo_actual || abs($vMov - $bc_saldo_actual) < $difenSaldoFinMes) {
745                                $saldoBCenArchivoAlter = $saldoBCenArchivo = $vMov;
746                                $saldoEncontrado = true;
747                            }
748                        }
749                }
750
751                if (!$saldoEncontrado)
752                    $arrfile2EdoCta['Status'] = 'Error';
753                else
754                    $saldoBCenArchivo = $saldoBCenArchivo == $bc_saldo_actual ? $saldoBCenArchivo : $saldoBCenArchivoAlter;
755            } elseif ($b_id == 14 || $b_id == '14') {
756                $saldoBCenArchivoAlter = $saldoBCUsuario = $saldoBCenArchivo = $bc_saldo_actual;
757                $arrfile2EdoCta['Status'] = 'OK';
758            } else {
759                if ($saldoBCenArchivo != $bc_saldo_actual && (abs($saldoBCenArchivo - $bc_saldo_actual) > $difenSaldoFinMes))
760                    $arrfile2EdoCta['Status'] = 'Error';
761            }
762
763            if ($arrfile2EdoCta['Status'] == 'Error') {
764                $arrfile2EdoCta['Error'] = "<span class='txt_color_red bold'>Saldo final no coincide.</span><br/><br/>
765                <li>Cuenta: <strong>$ctaBancariaNombre</strong>.
766                <li>Saldo Calculado: <strong>" . echonf($bc_saldo_actual, true) . "</strong>.
767                <li>Saldo en el archivo: <strong>" . echonf($saldoBCenArchivo, true) . "</strong>.<br/><br/>
768                <li>Saldo en el archivo Alter: <strong>" . echonf($saldoBCenArchivoAlter, true) . "</strong>.<br/><br/>
769                <a href='../cobranza/edocta.php?banco_cuenta_id=$bc_id' title='Abrir el Estado de Cuenta Importado.' target='_blank'>
770                Abrir <strong>$ctaBancariaNombre.</strong> <img src='/img/banco.png' alt='Bancos' title='Bancos'></a>.";
771
772                if (true) {
773                    $file_err .= sanitizeFileName($ctaBancariaNombre . "_" . $bc_id) . ".txt";
774                    $fh = fopen($file_err, 'w');
775                    fwrite($fh, $log_err . "\r\n\r\nSQL: <pre>" . print_r($sql, true) . "</pre>");
776                    fclose($fh);
777                }
778
779                /**
780                 * $file_err .= sanitizeFileName($ctaBancariaNombre."_".$bc_id).".txt";
781                 * $fh = fopen($file_err, 'w');
782                 * fwrite($fh, $log_err);
783                 * fclose($fh);
784                 * **/
785                //"<pre>".print_r($arrBancoCuentaMov, true)."</pre>"; //Para cuando no coincide el saldo.
786//                return $arrfile2EdoCta;
787//                $myLock->release();
788                continue;
789            }
790        } else {
791            if ($saldoBCenArchivo != $bc_saldo_actual || $saldoBCenArchivo != $saldoBCUsuario || $bc_saldo_actual != $saldoBCUsuario) {
792                $arrfile2EdoCta['Status'] = 'Error';
793                $arrfile2EdoCta['Error'] = '<span class="txt_color_red bold">Saldo final no coincide.</span>';
794                $arrfile2EdoCta['ErrorCode'] = '3';
795                $arrfile2EdoCta['Action2Do'] = 'saldo';
796//                return $arrfile2EdoCta;
797//                $myLock->release();
798                continue;
799            }
800        }
801
802        //Hacemos los inserts.
803        $insertInto = "INSERT INTO banco_cuenta_mov (banco_cuenta_mov_id, banco_cuenta_id, fecha, es, cash, deposit, withdrawal, banco_mov_tipo_id,numero, banco_id, link_vale, idex100, factura, remarks, alta_por, alta_tipo, categoria_gasto_id, fecha1, bc_empresa_id, numero_original, moneda_id, withdrawal_autorizado, alta_db, asignacion, supervision,  asig_semaforo_rony, asig_semaforo_usuarios, html_asignaciones)";
804
805        $insertador = new \iac\inc\sql\IacSQLMultipleInsert($gSqlClass, $insertInto, '', 5000, true);
806
807        // $asignacion = new AsignacionEstatus('banco_cuenta_mov');
808
809        // dd_($arrBancoCuentaMov);
810
811        $asignaiones_querys = [];
812
813        foreach ($arrBancoCuentaMov as $k => &$movNvo) {
814            if ($movNvo->go == 'SI') {
815                $log_err . "\r\n\r\n$k:<pre>" . print_r($movNvo, true) . "</pre>";
816                // debo agregarsht asignacion?
817                // $tmpsql = $movNvo->insertaBancoCuentaMov(false,true);
818                $tmpsql = $movNvo->insertaBancoCuentaMov(false, true, true);
819                if (array_key_exists(0, $tmpsql))
820                    $insertador->valuesString($tmpsql[0]);
821
822                if (array_key_exists(1, $tmpsql))
823                    $sql[] = $tmpsql[1];
824
825                if (array_key_exists('asignacion', $tmpsql)) {
826                    $asignaiones_querys = array_merge($asignaiones_querys, $tmpsql['asignacion']);
827                }
828
829                // $asignacion->asignaGastoSupervision('gasto_id', $sql, $gasto);
830            }
831        }
832        $sql_insert = array();
833        $insertador->insertNow();
834        $tmpsql_ = $insertador->get_allValues();
835        if (is_array($tmpsql_) && !empty($tmpsql_))
836            foreach ($tmpsql_ as $iq)
837                $sql_insert[] = $iq;
838
839        $sql_insert = array_merge($sql_insert, $asignaiones_querys);
840
841        unset($sql_insert['asignacion']);
842
843//    dd_($sql_insert);
844
845        //$sql[] = "UPDATE banco_cuenta SET ultima_conciliacion=NOW() WHERE banco_cuenta_id=".strit($bc_id);
846        //$sql[] = "CALL actualiza_banco_cuenta_saldos($bc_id)";
847
848        global $gSqlClass;
849        //El problema es un deadlock que produce el array de updates. Es muy grande. Tiene que hacer update a tantos renglones.
850        //Solución temporal, hacer los insert en una trasaction y los updates en el queryArray();
851
852        if (ia_transaction($sql_insert)) //if(!$gSqlClass->queryArray($sql_insert))
853        {
854            //if(false && $gDebugging)
855            if ($gDebugging) {
856                $file_err .= sanitizeFileName($ctaBancariaNombre . "_" . $bc_id) . ".txt";
857                $fh = fopen($file_err, 'w');
858                fwrite($fh, $log_err . "\r\n\r\nSQL: <pre>" . print_r($sql, true) . "</pre>\r\n\r\nsql insert <pre>" . print_r($sql_insert, true) . "</pre>");
859                fclose($fh);
860            }
861            //ia_transaction($sql);
862            $arrfile2EdoCta['Status'] = 'Error';
863            $arrfile2EdoCta['Error'] = '<span class="txt_color_red bold">Error al insertar los Movimientos Nuevos.</span>';
864            $arrfile2EdoCta['ErrorCode'] = '3';
865            $arrfile2EdoCta['Action2Do'] = 'saldo';
866//            return $arrfile2EdoCta;
867            ia_errores_a_dime();
868            continue;
869        }
870        //if(ia_transaction($sql))
871        if (!$gSqlClass->queryArray($sql)) {
872            //ia_transaction($sql);
873            $arrfile2EdoCta['Status'] = 'Error';
874            $arrfile2EdoCta['Error'] = '<span class="txt_color_red bold">Error al actualizar los Movimientos Existentes.</span>';
875            $arrfile2EdoCta['ErrorCode'] = '3';
876            $arrfile2EdoCta['Action2Do'] = 'saldo';
877//            return $arrfile2EdoCta;
878            ia_errores_a_dime();
879            continue;
880        }
881
882
883        /** Actualiza depositos por cuenta: los únicos que cambian son deposit_today, deposit_this_month y deposit_this_year */
884
885        $arrfile2EdoCta['MovsInsertados'] += sizeof($arrBancoCuentaMov);
886        $arrfile2EdoCta['MovsFallidos'] += $insertador->get_insertsErrorsNum();
887
888        $arrfile2EdoCta['Status'] = 'OK';
889
890        //$ctaBancariaSaldo = limpiaCantidad(ia_singleread("SELECT saldo_actual FROM banco_cuenta_saldos WHERE banco_cuenta_id = $bc_id"));
891
892        //$ctaBancariaNombre = ia_htmlentities(ia_singleread("SELECT nombre FROM banco_cuenta WHERE banco_cuenta_id = '$bc_id'"));
893
894        $lineaSaldos = "<li>Saldo final: <strong>".echonf($bc_saldo_actual, true)."</strong>.<br/>";
895        if($auto)
896            $lineaSaldos.="<li>Saldo en el archivo: <strong>".echonf($saldoBCenArchivo, true)."</strong>.<br/><br/>";
897        else
898            $lineaSaldos.="<li>Saldo usuario: <strong>".echonf($saldoBCUsuario, true)."</strong>.<br/>";
899
900        $arrfile2EdoCta['Error'] .= "<strong>Estado de Cuenta Importado con Éxito.</strong><br/><br/><strong>Resumen:</strong><br/>
901            <li>Cuenta: <strong>$ctaBancariaNombre</strong>.
902            $lineaSaldos
903            $huboSBCHoy
904            <strong>===========================================</strong>
905            <br/>
906            <li>Movimientos Nuevos: <strong>$arrfile2EdoCta[MovsInsertados]</strong>.
907            <li>Movimientos Existentes: <strong>$arrfile2EdoCta[MovsExistentes]</strong>.<br/>
908            <li>Movimientos con Error: <strong>$arrfile2EdoCta[MovsFallidos]</strong>.<br/><br/>
909            <a href='../cobranza/edocta.php?banco_cuenta_id=$bc_id' title='Abrir el Estado de Cuenta Importado.' target='_blank'>
910            Abrir <strong>$ctaBancariaNombre.</strong> <img src='/img/banco.png' alt='Bancos' title='Bancos'></a><br/>";
911
912    }
913    //if(false && $gDebugging)
914    if($gDebugging)
915    {
916        $file_err .= sanitizeFileName($ctaBancariaNombre."_".$bc_id).".txt";
917        $fh = fopen($file_err, 'w');
918        fwrite($fh, $log_err."\r\n\r\nSQL: <pre>".print_r($sql, true) . "</pre>\r\n\r\nsql insert <pre>".print_r($sql_insert, true) . "</pre>");
919        fclose($fh);
920    }
921
922    return $arrfile2EdoCta;
923}
924
925function csv2Array($archivo='', $delimiter='', $maxRows=false, $minCols=1, $conEncabezado=true, $trimResult=true): bool|array
926{
927    if(empty($archivo))
928        return false;
929
930    $arrFinal = array();
931
932    clearstatcache();
933
934    if(!file_exists($archivo)) {
935        return false;
936
937    }
938    if (empty($delimiter))
939        $delimiter = "\t";
940
941    $fp = fopen($archivo, 'r');
942    //REVISAR FP.
943
944    flock($fp, LOCK_EX);
945
946    if($maxRows === false)
947        $maxRows = 100000000000000000000000000000000000000000;
948    $i=0;
949
950    while(!feof($fp) && $i<=$maxRows)
951    {
952        $line = fgets($fp);
953        if($line === false) break;
954        $line = mb_detect_encoding($line, 'UTF-8', true) ? $line : mb_convert_encoding($line, 'UTF-8', 'ISO-8859-1');
955        $line = strip_tags($line);
956
957        //echo $line;
958
959        if($line=="\r\n" || strlen($line)<2)
960            continue;
961
962        $data = str_getcsv($line, $delimiter);
963
964        //echo "<pre>".print_r($data,true)."</pre>";
965        if($i++==0 && !$conEncabezado)
966            continue;
967
968        if(sizeof($data) < $minCols-2)
969            continue;
970
971        //if($trimResult)
972        if(is_array($data) && !empty($data))
973            foreach($data as $k=>$col)
974                $data[$k] = sanitizeString(vx_trim($col));
975        $arrFinal[] = $data;
976        $i++;
977    }
978    flock($fp, LOCK_UN);
979    fclose($fp);
980
981    //echo "<pre>".print_r($arrFinal,true)."</pre>";
982
983    return $arrFinal;
984}
985
986function xlsx2Array($archivo='', $delimiter='', $maxRows=false, $minCols=1, $conEncabezado=true, $trimResult=true)
987{
988    if(empty($archivo))
989        return false;
990
991    $arrFinal = array();
992    clearstatcache();
993    if(!file_exists($archivo))
994        return false;
995
996    $i = 0; $rowDesc=0;
997    $sizeData = 0;
998    $newRow = array();
999
1000    if($xlsx = SimpleXLSX::parse($archivo))
1001    {
1002        foreach( $xlsx->rows() as $data )
1003        {
1004            $newRow = array();
1005            if($i++==0 && !$conEncabezado)
1006                continue;
1007
1008            $sizeData = 0;
1009            //if($trimResult)
1010            if(is_array($data) && !empty($data)) {
1011                $rowDesc=0;
1012                foreach ($data as $k => $col) {
1013                    $col = sanitizeString(vx_trim($col));
1014                    if ($col == 'FECHA' || $col == 'DESCRIPCION' || $col == 'DESCRIPCIÓN' || $col == 'CARGO' || $col == 'ABONO' || $col == 'SALDO')
1015                        $rowDesc++;
1016                    if (strlen($col))
1017                        $sizeData++;
1018                    if (is_numeric($col) && ($k == 2 || $k == 3)) //Aquí viene el monto de la operación. Columna 3 ABONO, 2 CARGO
1019                        $col = abs(floatval($col));
1020                    $newRow[$k] = $col;
1021
1022                }
1023                //echo "<pre>MOV PRE $k".print_r($newRow, true)."</pre>";
1024            }
1025
1026            //VCA CTA RONY 20-11-2020
1027            //En el XLSX de RONY viene (0=>'FECHA',0=>'DESCRIPCIÓN,0=>'CARGO,0=>'ABONO,0=>'SALDO
1028            if($rowDesc >= $minCols)
1029            {
1030                $newRow[3] = "ABONO";
1031                $newRow[2] = "CARGO";
1032            }
1033
1034
1035
1036            if($sizeData < $minCols)
1037                if($i==1 && $conEncabezado);
1038                else continue;
1039
1040            $arrFinal[] = $newRow;
1041            $i++;
1042        }
1043
1044    }
1045    else
1046    {
1047        ia_errores_a_dime(SimpleXLSX::parseError());
1048    }
1049    //echo "<pre>arrFinal:".print_r($arrFinal,true)."</pre>";
1050    return $arrFinal;
1051}
1052
1053function encuentraHeaderEdoCta(&$arrBCColModel=array(), &$arrBCColsNum=array(), &$arrMovsNuevos=array(), &$arrMovsHeader=array())
1054{
1055    $method = __METHOD__;
1056    $inicioEncontrado = false;
1057
1058    if(empty($arrBCColModel) || empty($arrBCColsNum) || empty($arrMovsNuevos))
1059        return $inicioEncontrado;
1060
1061    /** Deducimos las columnas del array con el estado de cuenta del banco. **/
1062    /** Vamos a encontar el principio de los movimientos.**/
1063    /** ******************************************* **/
1064
1065    foreach($arrMovsNuevos as $kMov => &$vMov)
1066    {
1067        if(is_array($vMov) && !empty($vMov)) {
1068//            echo "\r\n<br/><pre>".print_r($vMov, true)."</pre>";
1069            if(sizeof($vMov) < $arrBCColsNum['required'])
1070                continue;
1071            foreach ($vMov as $kCol => $vCol) {
1072//                echo "\r\n<br/>Mov $kMov, Col $vCol: <pre>".print_r($vMov, true)."</pre>";
1073
1074                foreach ($arrBCColModel as $colName => $colDesc)
1075                    if (!$colDesc['index']['found'] || $colDesc['index']['array']) //Todavía no encontramos a esta columna o es un array y debemos buscarla muchas veces.
1076                    {
1077                        if (in_array($vCol, $colDesc['nombre']['match'], true)) {
1078
1079//                            echo "\r\n<br/>$vCol: <pre>".print_r($colDesc['nombre']['match'], true)."</pre>";
1080
1081                            $arrBCColModel[$colName]['index']['found'] = true;
1082
1083                            if ($colDesc['index']['array']) { //Sí es un array, entonces buscamos más de un match.
1084                                if (!is_array($arrBCColModel[$colName]['index']['originKey']))
1085                                    $arrBCColModel[$colName]['index']['originKey'] = array();
1086                                $arrBCColModel[$colName]['index']['originKey'][] = $kCol;
1087                            } else //NO es un array, entonces buscamos sólo un match.
1088                                $arrBCColModel[$colName]['index']['originKey'] = $kCol;
1089
1090                            $arrBCColsNum['found']++;
1091                            break;
1092                        }
1093                    }
1094            }
1095        }
1096        unset($arrMovsNuevos[$kMov]);
1097        if(!is_array($arrMovsHeader))
1098            $arrMovsHeader = array();
1099        $arrMovsHeader[] = $vMov;
1100
1101        if($arrBCColsNum['found'] >= $arrBCColsNum['required'])
1102        {
1103            $inicioEncontrado = $kMov;
1104            $inicioEncontrado++;
1105            break;
1106        }
1107    }
1108
1109    /**
1110    echo "Col Model: <pre>".print_r($arrBCColModel, true)."</pre>";
1111    echo "Col Num: <pre>".print_r($arrBCColsNum, true)."</pre>";
1112
1113    die();
1114    **/
1115
1116    return $inicioEncontrado;
1117}
1118
1119function estandarizaColsEdoCta(&$arrMovsNuevos=array(), &$arrBCColModel=array(), &$saldoBCenArchivo=0.00, &$arrBancoModel=array(), &$arrMovsHeader=array(), &$saldoBCenArchivoAlter=0.00, &$arrSaldosCol=array())
1120{
1121    if(empty($arrMovsNuevos) || empty($arrBCColModel) || empty($arrBancoModel))
1122        return false;
1123
1124    /** Vamos a sanear el array con los movimientos **/
1125    /** ******************************************* **/
1126
1127    /** Primero revisamos que sea necesario hacer esta operación **/
1128    /**
1129    $doEstandariza = false;
1130
1131    foreach($arrBCColModel as $colName => $colDesc)
1132    if($colDesc['index']['originKey'] != $colDesc['index']['finalKey'])
1133    $doEstandariza = true;
1134
1135    if(!$doEstandariza)
1136    return true;
1137     **/
1138
1139    $arrMovsNuevosTmp = array();
1140
1141    $cmBIfK = $arrBCColModel['balance']['index']['finalKey'];
1142//    echo "Nuevos sin Header $bc_id: <pre>".print_r($arrMovsNuevos, true)."</pre>";
1143//    echo "Headers arrBancoModel: <pre>".print_r($arrBancoModel, true)."</pre>";
1144
1145    foreach($arrMovsNuevos as $k => &$v)
1146    {
1147        if(sizeof($v) < $arrBancoModel['minCols']-1) continue;
1148
1149        $nvoMov = array();
1150        foreach($arrBCColModel as $colName => $colDesc)
1151        {
1152            $val = '';
1153            //VCA aqui se calcula la referencia
1154            if($colDesc['index']['array'] && is_array($colDesc['index']['originKey']))
1155            {
1156                if(is_array($colDesc['index']['originKey']) && !empty($colDesc['index']['originKey']))
1157                    foreach($colDesc['index']['originKey'] as $originKey)
1158                        $val .= (esPurosCeros($v[$originKey]) ? '' : $v[$originKey].' ');
1159
1160//                if(strlen($val))
1161//                    $val = substr_replace($val ,"",-1);
1162            }
1163            else
1164            {
1165                $val = $v[$colDesc['index']['originKey']];
1166            }
1167
1168            switch($colName)
1169            {
1170                case 'fecha':
1171                    if(strlen($val)<6)
1172                        $val = date('Y')."/".$val;
1173                    $val = date('Y-m-d', strtotime(str_replace('/', '-', $val)));
1174                    break;
1175
1176                case 'deposit':
1177                    $val = empty($val) || $val == '-' ? 0.00 : limpiaCantidad($val, false);
1178                    break;
1179
1180                case 'withdrawal':
1181                    $val = empty($val) || $val == '-' ? 0.00 : limpiaCantidad($val, false);
1182                    break;
1183
1184                case 'balance':
1185                    $val = empty($val) || $val == '-' ? 0.00 : limpiaCantidad($val);
1186                    break;
1187            }
1188
1189            $nvoMov[$colDesc['index']['finalKey']] = $val;
1190        }
1191        if(empty($nvoMov[$arrBCColModel['deposit']['index']['finalKey']]) && empty($nvoMov[$arrBCColModel['withdrawal']['index']['finalKey']])) continue;
1192        $arrMovsNuevosTmp[] = $nvoMov;
1193    }
1194
1195    /** ******************************************* **/
1196//    echo "Nuevos Original Tmp: <pre>".print_r($arrMovsNuevosTmp, true)."</pre>";
1197//    die();
1198
1199    $arrMovsNuevos = null;
1200    $arrMovsNuevos = $arrMovsNuevosTmp;
1201
1202    switch($arrBancoModel['b_id'])
1203    {
1204        case '1':
1205            $saldoBCenArchivo = $arrMovsNuevos[0][$cmBIfK] ?? 0.00;
1206            $arrMovsNuevos = array_reverse($arrMovsNuevos);
1207            break;
1208
1209        case '2':
1210            //echo "<pre>".print_r($arrMovsHeader, true)."</pre>";
1211            $arrMovsNuevos = array_reverse($arrMovsNuevos);
1212            $saldoBCenArchivo = false;
1213
1214            if(is_array($arrMovsHeader) && !empty($arrMovsHeader))
1215                foreach($arrMovsHeader as $k => $vMovHeader)
1216                {
1217                    if(is_array($vMovHeader) && !empty($vMovHeader))
1218                        foreach($vMovHeader as $kmh => $vMHCol)
1219                            if(in_array($vMHCol, $arrBancoModel['sN']))
1220                                if(array_key_exists($kmh+1, $vMovHeader))
1221                                {
1222                                    //echo "Header: <pre>".print_r($vMovHeader, true)."</pre>";
1223                                    $saldoBCenArchivo = limpiaCantidad($vMovHeader[$kmh+1]);
1224                                    break 2;
1225                                }
1226                }
1227
1228            if($saldoBCenArchivo === false) //Tal vez sea un archivo con movimientos del día.
1229            {
1230                //echo "Calculo en Hoy 1: <pre>".print_r($arrMovsNuevos, true)."</pre>";
1231                //$arrMovsNuevos = array_reverse($arrMovsNuevos);
1232                //echo "Calculo en Hoy 2: <pre>".print_r($arrMovsNuevos, true)."</pre>";
1233
1234                reset($arrMovsNuevos);
1235                $iK = key($arrMovsNuevos);
1236                end($arrMovsNuevos);
1237                $fK = key($arrMovsNuevos);
1238                reset($arrMovsNuevos);
1239
1240
1241                $saldoBCenArchivo = $arrMovsNuevos[$iK][$cmBIfK];
1242                $saldoBCenArchivoAlter = $arrMovsNuevos[$fK][$cmBIfK];
1243
1244                //Este hack es por si el saldo final viene en otro lugar que no sea el principio, ni el final.
1245
1246                if(is_array($arrMovsNuevos) && !empty($arrMovsNuevos))
1247                    foreach($arrMovsNuevos as $k => $vMov)
1248                        if(array_key_exists($cmBIfK, $vMov))
1249                            $arrSaldosCol[]=round($vMov[$cmBIfK], 2);
1250
1251                //$arrMovsNuevos = array_reverse($arrMovsNuevos);
1252                //echo "$iK: $saldoBCenArchivo\r\n$fK: $saldoBCenArchivoAlter\r\n";
1253            }
1254
1255            break;
1256
1257        case '3':
1258            $arrMovsNuevos = array_reverse($arrMovsNuevos);
1259            $saldoBCenArchivo = array_key_exists(0, $arrMovsNuevos) && array_key_exists($cmBIfK,$arrMovsNuevos[0]) ? $arrMovsNuevos[0][$cmBIfK] : 0.00;
1260            break;
1261
1262        case '5':
1263            if($arrBancoModel['rA'])
1264            {
1265                $saldoBCenArchivo = array_key_exists(0, $arrMovsNuevos) && array_key_exists($cmBIfK,$arrMovsNuevos[0]) ? $arrMovsNuevos[0][$cmBIfK] : 0.00;
1266                $arrMovsNuevos = array_reverse($arrMovsNuevos);
1267            }
1268            else
1269            {
1270                reset($arrMovsNuevos);
1271                end($arrMovsNuevos);
1272                $fE = key($arrMovsNuevos);
1273
1274                $saldoBCenArchivo = $arrMovsNuevos[$fE][$cmBIfK];
1275                //$arrMovsNuevos = array_reverse($arrMovsNuevos);
1276            }
1277
1278            break;
1279
1280        case '14':
1281            $saldoBCenArchivo = $saldoBCenArchivoAlter = 0.01;
1282//            $arrMovsNuevos = array_reverse($arrMovsNuevos);
1283            break;
1284
1285        default:
1286            $saldoBCenArchivo = array_key_exists(0, $arrMovsNuevos) && array_key_exists($cmBIfK,$arrMovsNuevos[0]) ? $arrMovsNuevos[0][$cmBIfK] : 0.00;
1287//            $arrMovsNuevos = array_reverse($arrMovsNuevos);
1288            break;
1289
1290
1291    }
1292//echo "Nuevos Original: <pre>".print_r($arrMovsNuevos, true)."</pre>";
1293//              die();
1294    return true;
1295}
1296
1297function identificaBancoEdoCta($archivoyPath='', &$arrBancoModel=array(), &$b_id=0, &$bIndex=0)
1298{
1299    //Hack para bancomer y sus errores 13-10-2016
1300    $fpp = pathinfo($archivoyPath);
1301    $ext=array_key_exists('extension',$fpp) ? strtolower($fpp['extension']):'';
1302
1303    if($ext=='exp' || $ext=='xlsx')
1304    {
1305        //VCA 12-03-2021 HSBC cambió su formato
1306        if(stripos($fpp['filename'],'hsbc') !== false){
1307            $b_id=5;
1308//            $bIndex = 3;
1309            return true;
1310        }
1311        $b_id=1;
1312        return true;
1313    }
1314
1315    foreach($arrBancoModel as $k => $vb_desc)
1316    {
1317        $arrPrimeraFila = csv2Array($archivoyPath, $vb_desc['delimiter'], 0);
1318        if(is_array($arrPrimeraFila) && sizeof($arrPrimeraFila))
1319        {
1320            if(sizeof($arrPrimeraFila[0]) == $vb_desc['minCols'])
1321                $b_id = $vb_desc['b_id'];
1322
1323            if(empty($b_id))
1324                if(is_array($vb_desc['pL']) && array_key_exists(0, $arrPrimeraFila[0]) && in_array($arrPrimeraFila[0][0], $vb_desc['pL']))
1325                    $b_id = $vb_desc['b_id'];
1326
1327            if(!empty($b_id))
1328            {
1329                $bIndex = $b_id;
1330                //echo "Primera Fila: <pre>".print_r($arrPrimeraFila, true)."</pre>";
1331                //echo "El Banco: <pre>".print_r($vb_desc, true)."</pre>";
1332                return true;
1333            }
1334        }
1335    }
1336    //echo "Primera Fila: <pre>".print_r($arrPrimeraFila, true)."</pre>";
1337    //echo "El Banco: <pre>".print_r($vb_desc, true)."</pre>";
1338    return true;
1339}
1340
1341function identificaCuentaEdoCta(&$arrMovsNuevos=array(), $arrMovsHeader=array(), &$arrBancoModel=array(), $archivo='', &$arrBCColModel=array())
1342{
1343    $bc_id = false;
1344
1345    if(empty($arrMovsNuevos) || empty($arrMovsHeader) || empty($arrBancoModel))
1346        return $bc_id;
1347
1348    $noCta = '';
1349
1350    switch($arrBancoModel['b_id'])
1351    {
1352        case '1': //Bancomer
1353            /** Este especificamente ya bailó porque no trae nada de info. Hay que identificarlo con sus movimientos **/
1354            if(strlen($archivo))
1355            {
1356                $archivo = strtoupper($archivo);
1357                //echo "Archivo: $archivo\r\n\r\n";
1358                if(is_array($arrBancoModel['fN']) && !empty($arrBancoModel['fN']))
1359                    foreach($arrBancoModel['fN'] as $kpC => $posibleCuenta)
1360                    {
1361                        //echo "posibleCuenta: <pre>".print_r($posibleCuenta, true)."</pre>";
1362                        if(is_array($posibleCuenta['nombre']) && !empty($posibleCuenta['nombre']))
1363                            foreach($posibleCuenta['nombre'] as $kpN => $posibleNombre)
1364                            {
1365                                //echo "\r\nposibleNombre: $posibleNombre vs. $archivo";
1366                                $posNombre = strpos($archivo, $posibleNombre);
1367                                if($posNombre !== false)
1368                                {
1369                                    $bc_id = $posibleCuenta['bc_id'];
1370                                    //echo "\r\nposibleNombre $bc_id: $posibleNombre vs. $archivo";
1371                                    break 2;
1372                                }
1373                            }
1374                    }
1375
1376                //TODO Agregar que use el primer renglón, ahí viene el número de cuenta.
1377                if(empty($bc_id)) //Si áun no encontramos el id de la cuenta. Ora hay que buscar en los movimientos.
1378                {
1379                    //Buscar en los movs.
1380                    $arrMovsAntxCta = false;
1381                    $arrMovsNuevosBBVA = $arrMovsNuevos;
1382                    $arrBCColModelBBVA = $arrBCColModel;
1383                    $saldoNuevo = 0.00;
1384                    if(!estandarizaColsEdoCta($arrMovsNuevosBBVA, $arrBCColModel, $saldoNuevo, $arrBancoModel))
1385                        break;
1386
1387                    $fechaKey = $arrBCColModel['fecha']['index']['finalKey'];
1388                    $withdrawalKey = $arrBCColModel['withdrawal']['index']['finalKey'];
1389                    $depositKey = $arrBCColModel['deposit']['index']['finalKey'];
1390                    $balanceKey = $arrBCColModel['balance']['index']['finalKey'];
1391
1392                    $sql = "SELECT banco_cuenta_id as bc_id FROM banco_cuenta WHERE banco_id = '$arrBancoModel[b_id]'";
1393                    $arrCuentasBBVA = ia_sqlArrayIndx($sql);
1394
1395                    if(empty($arrCuentasBBVA))
1396                        break;
1397
1398                    //echo "Cuentas BBVA: <pre>".print_r($arrCuentasBBVA, true)."</pre>";
1399
1400                    reset($arrMovsNuevosBBVA);
1401                    $fE = key($arrMovsNuevosBBVA);
1402                    //echo "Primer Mov: <pre>".print_r($arrMovsNuevos[$fE], true)."</pre>";
1403                    if(array_key_exists($fE,$arrMovsNuevosBBVA) && array_key_exists($arrBCColModel['fecha']['index']['finalKey'],$arrMovsNuevosBBVA[$fE]))
1404                        $mes = $arrMovsNuevosBBVA[$fE][$arrBCColModel['fecha']['index']['finalKey']];
1405
1406                    if(empty($mes))
1407                        break;
1408
1409
1410                    $sqlMovsAnt = "SELECT DATE(fecha) as '0', numero as '1', withdrawal as '2', (cash + deposit) as '3', '' as '4',
1411                        banco_cuenta_mov_id as bcm_id, banco_cuenta_id as bc_id, fecha as fechaOri FROM banco_cuenta_mov
1412                        WHERE banco_id = '$arrBancoModel[b_id]' AND fecha >= '$mes' ORDER BY fechaOri DESC, bcm_id DESC";
1413                    $arrMovsAnt = ia_sqlArrayIndx($sqlMovsAnt);
1414
1415                    if(!is_array($arrMovsAnt) || empty($arrMovsAnt))
1416                        break;
1417
1418                    //echo "Mov Anteriores Tochos: <pre>".print_r($arrMovsAnt, true)."</pre>";
1419                    foreach($arrCuentasBBVA as $kbc => $vbc)
1420                    {
1421                        //echo "\r\nBuscando en la Cuenta: $vbc[bc_id].";
1422                        $vbc_id = $vbc['bc_id'];
1423                        $arrMovsAntxCta = false;
1424
1425                        $movMatch = false;
1426                        $arrMovsAntxCta = filtraArray($arrMovsAnt, 'bc_id', $vbc_id);
1427
1428                        if(empty($arrMovsAntxCta))
1429                            continue;
1430
1431                        //echo "Mov Anteriores x Cta: <pre>".print_r($arrMovsAntxCta, true)."</pre>";
1432                        foreach($arrMovsNuevosBBVA as $kmv => $movNvo)
1433                        {
1434                            foreach($arrMovsAntxCta as $kma => $movAnt)
1435                            {
1436                                if(($movAnt[$fechaKey] == $movNvo[$fechaKey]) /*fecha*/
1437                                    && ($movAnt[$withdrawalKey] == $movNvo[$withdrawalKey]) /*cargo*/
1438                                    && ($movAnt[$depositKey] == $movNvo[$depositKey]) /*abono*/ )
1439                                {
1440                                    $movMatch = array('anterior' => $kma, 'nuevo' => $kmv);
1441                                }
1442                            }
1443                        }
1444
1445                        if($movMatch)
1446                        {
1447                            //echo "Match: <pre>".print_r($movMatch, true)."</pre>";
1448                            $saldoDB = CalculaBancoCuentaSaldodesdeunMovimiento($vbc_id, $arrMovsAntxCta[$movMatch['anterior']]['bcm_id']);
1449                            $saldoNuevo = $arrMovsNuevosBBVA[$movMatch['nuevo']][$balanceKey];
1450
1451                            //echo "\r\nsaldoDB: $saldoDB saldoNuevo: $saldoNuevo";
1452                            if($saldoDB == $saldoNuevo)
1453                            {
1454                                $bc_id = $vbc_id;
1455                                break;
1456                            }
1457                            else
1458                                continue;
1459                        }
1460                        else
1461                        {
1462                            $ultimoMovAnt = array_pop($arrMovsAntxCta);
1463
1464                            reset($arrMovsNuevosBBVA);
1465                            $fE = key($arrMovsNuevosBBVA);
1466                            $primerMovNvo = $arrMovsNuevosBBVA[$fE];
1467
1468                            //echo "Ultimo Mov Anterior: <pre>".print_r($ultimoMovAnt, true)."</pre>";
1469                            //echo "Primero Nuevo: <pre>".print_r($primerMovNvo, true)."</pre>";
1470
1471                            $saldoNuevo = $primerMovNvo[$withdrawalKey] + $primerMovNvo[$depositKey] + $ultimoMovAnt[$withdrawalKey] + $ultimoMovAnt[$depositKey];
1472                            if($primerMovNvo[$balanceKey] == $saldoNuevo)
1473                            {
1474                                $bc_id = $vbc_id;
1475                                break;
1476                            }
1477                            else
1478                                continue;
1479                        }
1480                    }
1481                }
1482
1483            }
1484            break;
1485
1486        case '2': //Banamex
1487            /** Este trae el numero de cuenta en el header. **/
1488
1489            if(is_array($arrMovsHeader) && !empty($arrMovsHeader))
1490                foreach($arrMovsHeader as $k => $vMovHeader)
1491                {
1492                    if(is_array($vMovHeader) && !empty($vMovHeader))
1493                        foreach($vMovHeader as $kmh => $vMHCol)
1494                            if(in_array($vMHCol, $arrBancoModel['cN']))
1495                                if(array_key_exists($kmh+1, $vMovHeader))
1496                                {
1497                                    //echo "Header: <pre>".print_r($vMovHeader, true)."</pre>";
1498                                    $noCta = $vMovHeader[$kmh+1];
1499                                    break 2;
1500                                }
1501                }
1502
1503            if(strlen($noCta))
1504            {
1505                $sql = "SELECT banco_cuenta_id FROM banco_cuenta WHERE numero = '$noCta'";
1506                //echo "<br>$sql";
1507                $bc_id = ia_singleread($sql);
1508            }
1509            break;
1510
1511        case '3': //Banorte
1512            /** Este trae el numero de cuenta en la primera columna de los movimientos **/
1513            //Hya veces que Banorte pone saltos de línea.
1514
1515            if(is_array($arrMovsHeader) && !empty($arrMovsHeader))
1516                foreach($arrMovsHeader as $k => $vMovHeader)
1517                {
1518                    if(is_array($vMovHeader) && !empty($vMovHeader))
1519                        foreach($vMovHeader as $kmh => $vMHCol)
1520                            if(in_array($vMHCol, $arrBancoModel['cN']))
1521                            {
1522                                //echo "Header: <pre>".print_r($vMovHeader, true)."</pre>";
1523                                //echo "\r\nk: $kmh";
1524                                reset($arrMovsNuevos);
1525                                $fE = key($arrMovsNuevos);
1526                                //echo "Primer Mov: <pre>".print_r($arrMovsNuevos[$fE], true)."</pre>";
1527                                if(array_key_exists($fE,$arrMovsNuevos) && array_key_exists($kmh,$arrMovsNuevos[$fE]))
1528                                {
1529                                    $noCta = $arrMovsNuevos[$fE][$kmh];
1530                                    break 2;
1531                                }
1532                            }
1533                }
1534
1535            if(strlen($noCta))
1536            {
1537                $sql = "SELECT banco_cuenta_id FROM banco_cuenta WHERE numero = '$noCta'";
1538                //echo "<br>$sql";
1539                $bc_id = ia_singleread($sql);
1540            }
1541            break;
1542
1543        case '5': //HSBC
1544            /** Este trae el numero de cuenta en el header o en la segunda columna de los movimientos. **/
1545
1546            if(is_array($arrMovsHeader) && !empty($arrMovsHeader))
1547                foreach($arrMovsHeader as $k => $vMovHeader)
1548                {
1549                    if(is_array($vMovHeader) && !empty($vMovHeader))
1550                        foreach($vMovHeader as $kmh => $vMHCol)
1551                            if(in_array($vMHCol, $arrBancoModel['pL']))
1552                                if(array_key_exists($kmh+1, $vMovHeader))
1553                                {
1554                                    //echo "Header: <pre>".print_r($vMovHeader, true)."</pre>";
1555                                    $noCta = $vMovHeader[$kmh+1];
1556                                    break 2;
1557                                }
1558                }
1559
1560            if(strlen($noCta))
1561            {
1562                $sql = "SELECT banco_cuenta_id FROM banco_cuenta WHERE numero = '$noCta'";
1563                //echo "<br>$sql";
1564                $bc_id = ia_singleread($sql);
1565            }
1566            else
1567            {
1568                /** Vamos a buscarlo en los movimientos **/
1569
1570                if(is_array($arrMovsHeader) && !empty($arrMovsHeader))
1571                    foreach($arrMovsHeader as $k => $vMovHeader)
1572                    {
1573                        if(is_array($vMovHeader) && !empty($vMovHeader))
1574                            foreach($vMovHeader as $kmh => $vMHCol)
1575                                if(in_array($vMHCol, $arrBancoModel['cN']))
1576                                {
1577                                    //echo "Header: <pre>".print_r($vMovHeader, true)."</pre>";
1578                                    //echo "\r\nk: $kmh";
1579                                    reset($arrMovsNuevos);
1580                                    $fE = key($arrMovsNuevos);
1581                                    //echo "Primer Mov: <pre>".print_r($arrMovsNuevos[$fE], true)."</pre>";
1582                                    if(array_key_exists($fE,$arrMovsNuevos) && array_key_exists($kmh,$arrMovsNuevos[$fE]))
1583                                    {
1584                                        $noCta = $arrMovsNuevos[$fE][$kmh];
1585                                        break 2;
1586                                    }
1587                                }
1588                    }
1589                if(strlen($noCta))
1590                {
1591                    $sql = "SELECT banco_cuenta_id FROM banco_cuenta WHERE numero = '$noCta'";
1592                    //echo "<br>$sql";
1593                    $bc_id = ia_singleread($sql);
1594                    $arrBancoModel['rA'] = true;
1595                }
1596            }
1597            break;
1598
1599            //VCA: 14-Octubre-2023 NUEVO BANCO MONEX
1600        case '14': //MONEX
1601            /** Este especificamente ya bailó porque no trae nada de info. Hay que identificarlo con sus movimientos **/
1602            if(strlen($archivo))
1603            {
1604                $archivo = strtoupper($archivo);
1605//                echo "Archivo: $archivo\r\n\r\n";
1606                if(is_array($arrBancoModel['fN']) && !empty($arrBancoModel['fN']))
1607                    foreach($arrBancoModel['fN'] as $kpC => $posibleCuenta)
1608                    {
1609                        //echo "posibleCuenta: <pre>".print_r($posibleCuenta, true)."</pre>";
1610                        if(is_array($posibleCuenta['nombre']) && !empty($posibleCuenta['nombre']))
1611                            foreach($posibleCuenta['nombre'] as $kpN => $posibleNombre)
1612                            {
1613                                //echo "\r\nposibleNombre: $posibleNombre vs. $archivo";
1614                                $posNombre = strpos($archivo, $posibleNombre);
1615                                if($posNombre !== false)
1616                                {
1617                                    $bc_id = $posibleCuenta['bc_id'];
1618                                    //echo "\r\nposibleNombre $bc_id: $posibleNombre vs. $archivo";
1619                                    break 2;
1620                                }
1621                            }
1622                    }
1623
1624                //VCA: 14-Octubre-2024 Preparamos el array para que separe abono de cargo
1625                //VCA: 14-Octubre-2024 Preparamos el array para que separe moneda MXP y USD.
1626
1627                if(!empty($bc_id)) //Si áun no encontramos el id de la cuenta. Ora hay que buscar en los movimientos.
1628                {
1629                    $arrBCColModel['deposit']['index']['found'] = true;
1630                    $fechaKey = $arrBCColModel['fecha']['index']['originKey'];
1631                    $depositKey = $arrBCColModel['deposit']['index']['originKey'] = $arrBCColModel['withdrawal']['index']['originKey'];
1632                    $balanceKey = $arrBCColModel['balance']['index']['originKey'];
1633                    $withdrawalKey = $arrBCColModel['withdrawal']['index']['originKey'] = 11;
1634
1635                    $monedaKey = 0;
1636                    $arr_USD = [];
1637                    $hubo_usd = false;
1638
1639                    foreach($arrMovsNuevos as $index => &$nuevo){
1640
1641
1642//                        echo "nuevo: <pre>".print_r($nuevo, true)."</pre>";
1643                        //echo "arrMovsHeader: <pre>".print_r($arrMovsHeader, true)."</pre>";
1644                        //die();
1645                        if(array_key_exists($depositKey, $nuevo)){
1646                            $monto = limpiaCantidad($nuevo[$depositKey]);
1647                            if($monto < 0) {
1648                                $nuevo[$withdrawalKey] = abs(limpiaCantidad($nuevo[$depositKey]));
1649                                $nuevo[$depositKey] = 0.00;
1650                            }
1651                            else{
1652                                $nuevo[$withdrawalKey] = 0.00;
1653                                $nuevo[$depositKey] = $monto;
1654                            }
1655                        }
1656
1657                        if($nuevo[$monedaKey] == 'USD'){
1658                            $arr_USD[] = $nuevo;
1659                            $hubo_usd = true;
1660                            unset($arrMovsNuevos[$index]);
1661                        }
1662                    }
1663
1664                    if($hubo_usd){
1665                        $arrMovsNuevos['USD'] = $arr_USD;
1666                    }
1667                }
1668
1669            }
1670            break;
1671    }
1672//    echo "nuevos: <pre>".print_r($arrMovsNuevos, true)."</pre>";
1673//    die();
1674    return $bc_id;
1675}
1676
1677function importaEdoCtadesdeDirectorio(&$forceCuenta=false)
1678{
1679    global $gIAParametros;
1680    $path4EdoCta = $gIAParametros['path_archivos_estado_de_cuenta'];
1681
1682    /**
1683    //Bloqueo de la cuenta.
1684    $myLock = new ProcessLock();
1685    //$s = md5($appCB.$CtaT->cuenta_bancaria.$CtaT->quantity.$CtaT->fecha_deposito);
1686    $s = md5("IMPORTACION DE ESTADO DE CUENTA POR CARPETA");
1687    $gotLock = $myLock->aquire($s);
1688
1689    if(!$gotLock)
1690    {
1691    $arrfile2EdoCta["Status"] = 'OK';
1692    $arrfile2EdoCta["Error"] = '<span class="txt_color_red bold">Concurrencia de Importaciones.</span>';
1693    $arrfile2EdoCta['ErrorCode'] = '1';
1694    $arrfile2EdoCta['Action2Do'] = '';
1695    return $arrfile2EdoCta;
1696    }
1697     * **/
1698
1699    $arrfile2EdoCta_IECD = array();
1700
1701    $arrCtas2Do = $forceCuenta;
1702
1703    //echo "<br/>$path4EdoCta";
1704
1705    $directoryHandle = @opendir($path4EdoCta);
1706    //1) meter en un array el contenido del directorio para liberarlo.
1707    //2) cuando recorro array revisar con file_Exists y si no, continue.
1708    //3) clearstatcache();
1709    $arrDirectory = array();
1710
1711
1712    clearstatcache();
1713    while($contents = @readdir($directoryHandle))
1714    {
1715        $arrDirectory[] = $contents;
1716    }
1717    @closedir($directoryHandle);
1718    clearstatcache();
1719
1720
1721    foreach($arrDirectory as $contents)
1722    {
1723        if($contents != '.' && $contents != '..')
1724        {
1725            $path = $path4EdoCta . "\\" . $contents;
1726
1727            //echo "<br/>$contents";
1728            clearstatcache();
1729            if(!file_exists($path))
1730                continue;
1731
1732            if(!is_dir($path))
1733            {
1734                $contents_parts = @pathinfo($contents);
1735                $contentsExt = array_key_exists('extension',$contents_parts) ? strtolower($contents_parts['extension']):'';
1736
1737                $contents_parts['extension'] = $contentsExt;
1738                //echo "Nombre Archivo: <pre>".print_r($contents_parts, true)."</pre>";
1739
1740                $contents_parts['basename'] = strtoupper($contents_parts['basename'] ?? "");
1741
1742                if(str_contains($contents_parts['basename'], 'RECHAZADO')) // || array_key_exists($contents_parts['basename'] ,$_SESSION))
1743                    continue;
1744
1745                $_SESSION[$contents_parts['basename']] = true;
1746                //VCA CTA RONY 20-11-2020
1747                //El archivo de rony viene en XLS.
1748                //VCA 13-Octubre-2023 monex
1749                if( $contentsExt == 'exp' || $contentsExt == 'txt' || $contentsExt == 'csv' || $contentsExt == 'html' ||
1750                    $contentsExt == 'htm' || $contentsExt == 'xls' || $contentsExt == 'xlsx')
1751                {
1752                    //echo "<br/>$contentsExt";
1753                    $b_id='';
1754                    $bc_id='';
1755                    if($contentsExt == 'html' || $contentsExt == 'htm' || $contentsExt == 'xls') {
1756                        if(str_contains($contents_parts['basename'], "MONEX") || str_contains($contents_parts['basename'], "MOVIMIENTOS") || str_contains($contents_parts['basename'], "CONTRATO"))
1757                            $b_id = '14';
1758                        else
1759                            $b_id = '5';
1760                    }
1761                    //VCA CTA RONY 20-11-2020
1762                    foreach(array('RONY','RON','ROYN','ORNY') as $str)
1763                        if(strpos($contents_parts['basename'], $str) !== false)
1764                        {
1765                            $b_id = 1;
1766                            $bc_id = 39;
1767                        }
1768
1769            /*        $myLock = new ProcessLock();
1770                    //$s = md5($appCB.$CtaT->cuenta_bancaria.$CtaT->quantity.$CtaT->fecha_deposito);
1771                    //$ooo=rand();
1772                    //ia_query("INSERT INTO dime (script,dime) VALUES ('trans-$ooo','$CtaT->cuenta_bancaria')");
1773                    $s = md5($path);
1774                    $myLock->setRetries(1);
1775                    $myLock->setRetryUsleep(1);
1776                    $gotLock = $myLock->aquire($s);*/
1777
1778                    $arrfile2EdoCta = array();
1779                    //if($gotLock) {
1780                    $arrfile2EdoCta  = file2EdoCta($contents, $bc_id, '', 0.00, $b_id, true, $arrCtas2Do);
1781
1782                    $sql = array();
1783                    $bc_id = $arrfile2EdoCta['bc_id'];
1784                    if(!empty($bc_id)) {
1785                        if(is_array($bc_id)) {
1786                            foreach ($bc_id as $bcid)
1787                                $sql[] = "UPDATE banco_cuenta SET ultima_conciliacion=NOW() WHERE banco_cuenta_id=" . strit($bcid);
1788                        }
1789                        else
1790                            $sql[] = "UPDATE banco_cuenta SET ultima_conciliacion=NOW() WHERE banco_cuenta_id=" . strit($bc_id);
1791                        //$sql[] = "CALL actualiza_banco_cuenta_saldos($bc_id)"; //Error encontrado por Pepe. $bc_id a veces llega vacía
1792                        ia_transaction($sql);
1793                    }
1794
1795                        //*ia_transaction($sql);
1796
1797                        //async_actualizaIngresos();
1798                        unset($_SESSION[$contents_parts['basename']]);
1799                        ia_errores_a_dime();
1800                        //$arrfile2EdoCta['forceEcho'] = str_pad('',4096,'&nbsp;');
1801
1802                        //echo "<pre>".print_r($arrfile2EdoCta, true)."</pre>";
1803                        //ob_flush(); flush();
1804                        if($arrfile2EdoCta['Status'] == 'OK' && $arrfile2EdoCta['ErrorCode'] != '4')
1805                            mueveAIEC($path, $contents_parts, $arrfile2EdoCta);
1806                        else
1807                        {
1808                            $nombreRechazado = '';
1809                            if($arrfile2EdoCta['ErrorCode'] == '2') //No se pudo determinar la cuenta bancaria.
1810                            {
1811                                $nombreRechazado = "RECHAZADO - $contents_parts[filename].$contents_parts[extension]";
1812                                clearstatcache();
1813                                if(file_exists($path4EdoCta/$contents_parts["basename"])){
1814                                    @rename("$path4EdoCta/$contents_parts[basename]", "$path4EdoCta/$nombreRechazado");
1815                                }
1816
1817                            }
1818
1819                            $nombreRechazado = empty($nombreRechazado) ? $path : "$path4EdoCta\\$nombreRechazado";
1820                            $arrfile2EdoCta['Error'].="<br/><span class='txt_color_red bold'>
1821                            <a href='javascript:borrarArchivo(\"$nombreRechazado\");'>
1822                            <img src='../img/delete.png' alt='Borrar Archivo' title='Borrar Archivo'/></a>
1823                            Archivo: <a href='$nombreRechazado' target='_blank'>$nombreRechazado</a>
1824                            </span>";
1825                        }
1826                        /*$myLock->release();
1827                    }
1828                    else{
1829                        continue;
1830//
1831//                        $arrfile2EdoCta['Status'] = 'Error';
1832//                        $arrfile2EdoCta['ErrorCode'] = '5'; //Está ocupado el archivo
1833                    }*/
1834
1835
1836
1837
1838                    if(($arrfile2EdoCta['Status'] == 'OK' && $arrfile2EdoCta['ErrorCode'] != '4') || $arrfile2EdoCta['Status'] == 'Error')
1839                    {
1840                        $arrfile2EdoCta_IECD[] = $arrfile2EdoCta;
1841
1842                        //Aquí actualizamos la conciliación bancaria.
1843                        if(!empty($bc_id))
1844                            ia_query("UPDATE banco_cuenta SET ultima_conciliacion=NOW() WHERE banco_cuenta_id=".strit($arrfile2EdoCta['bc_id']),true,false);
1845                        /*foreach($arrCtas2Do as $k=>$v)
1846                            if($v == $arrfile2EdoCta['bc_id'])
1847                                unset($arrCtas2Do[$k]);*/
1848                        //echo "Cuentas: <pre>".print_r($arrCtas2Do,true)."</pre>";
1849                    }
1850                }
1851                else
1852                    continue;
1853            }
1854            else
1855                continue;
1856        }
1857    }
1858
1859
1860
1861    return $arrfile2EdoCta_IECD;
1862}
1863
1864function html2Array($archivo='', $arrBancoModel=array(), $arrBCColModel=array(), $arrBCColsNum=array())
1865{
1866    //if(empty($archivo) || empty($arrBancoModel))
1867    //return false;
1868
1869    require_once('simple_html_dom.php');
1870
1871    $l_arrBancoModel = $arrBancoModel;
1872    $l_arrBCColModel = $arrBCColModel;
1873    $l_arrBCColsNum = $arrBCColsNum;
1874
1875    $arrMovsNuevos = array();
1876
1877    //echo "<br/>$archivo";
1878    //echo "Col Model:<pre>".print_r($l_arrBCColModel, true)."</pre>";
1879    //echo "Col Nums:<pre>".print_r($l_arrBCColsNum, true)."</pre>";
1880    $html = file_get_contents($archivo, FILE_USE_INCLUDE_PATH);
1881    //
1882    //echo "<br/>Encoding:".mb_detect_encoding($html);
1883
1884    $encoding = mb_detect_encoding($html, mb_detect_order(), false);
1885
1886    if($encoding == "UTF-8")
1887    {
1888        $html = mb_convert_encoding($html, 'UTF-8', 'UTF-8');
1889    }
1890
1891
1892    $html = iconv(mb_detect_encoding($html, mb_detect_order(), false), "UTF-8//IGNORE", $html);
1893
1894    /**
1895    if(mb_detect_encoding($html,'UTF-8',true) != 'UTF-8')
1896    $html = iconv('UTF-16LE' , 'UTF-8' , $html);
1897    //echo "<br/>Encoding:".mb_detect_encoding($html);
1898     * **/
1899
1900    $htmlObj = str_get_html($html);
1901
1902    //$pito = $htmlObj;
1903
1904    //echo $pito;
1905
1906    $inicioEncontrado = false;
1907
1908    foreach($htmlObj->find('table') as $table)
1909    {
1910        foreach($table->find('tr') as $tr)
1911        {
1912            foreach($tr->find('td') as $td)
1913            {
1914
1915                $txt_td = sanitizeString(vx_trim(html_entity_decode($td->plaintext)));
1916                //$txt_td = str_replace('&NBSP;','', $txt_td);
1917                //echo "$txt_td | ";
1918                foreach($l_arrBCColModel as $colName => $colDesc)
1919                    if(!$colDesc['index']['found'] || $colDesc['index']['array']) //Todavía no encontramos a esta columna o es un array y debemos buscarla muchas veces.
1920                        if(in_array($txt_td, $colDesc['nombre']['match']))
1921                        {
1922                            $l_arrBCColModel[$colName]['index']['found'] = true;
1923
1924                            $l_arrBCColsNum['found']++;
1925                            break;
1926                        }
1927            }
1928            //echo "<br/>";
1929
1930            if($l_arrBCColsNum['found'] >= $l_arrBCColsNum['required'])
1931            {
1932                $inicioEncontrado = true;
1933                $tr->id = 'vitexInicioEdoCta';
1934                $table->id = 'vitexEdoCta';
1935                //echo $tr . '<br/><hr/>';
1936                break 2;
1937            }
1938        }
1939    }
1940
1941    foreach($htmlObj->find('font') as $text)
1942    {
1943        foreach($l_arrBancoModel['pL'] as $cN)
1944        {
1945            $pT = sanitizeString(vx_trim(html_entity_decode($text->plaintext)));
1946            $poscN = strpos($pT, $cN);
1947            if($poscN !== false)
1948            {
1949                $realcN = '';
1950                $poscN+=strlen($cN);
1951
1952                $lenpT = strlen($pT);
1953                while($poscN <= $lenpT)
1954                {
1955
1956                    $charcN=substr($pT, $poscN++, 1);
1957                    //echo "<br/>$charcN";
1958                    if(is_numeric($charcN))
1959                        $realcN.=$charcN;
1960                    elseif($charcN==',')
1961                        break;
1962                }
1963
1964                $arrMovsNuevos[] = array($cN, $realcN);
1965                break 2;
1966            }
1967        }
1968    }
1969
1970
1971    foreach($htmlObj->find('table') as $table)
1972        if($table->id=='vitexEdoCta')
1973        {
1974            foreach($table->find('tr') as $tr)
1975            {
1976                $arrTR = array();
1977                foreach($tr->find('td') as $td)
1978                    $arrTR[] = sanitizeString(vx_trim(html_entity_decode($td->plaintext)));
1979
1980                $arrMovsNuevos[] = $arrTR;
1981            }
1982
1983            break;
1984        }
1985
1986    //echo "Movs Nuevos:<pre>".print_r($arrMovsNuevos, true)."</pre>";
1987    //die();
1988
1989    //echo "Col Model Final:<pre>".print_r($l_arrBCColModel, true)."</pre>";
1990    //echo "Col Nums Final:<pre>".print_r($l_arrBCColsNum, true)."</pre>";
1991
1992    return $arrMovsNuevos;
1993
1994}
1995
1996function limpiaReferenciaBancaria($str="")
1997{
1998    $str = strtoupper($str);
1999    $arr = explode(" ", $str);
2000
2001    $refProblematicas = array(
2002        'TRASPASO A CUENTA DE TERCEROS',
2003        'CHEQUE PAGADO NO',
2004        'DEPOSITO EFECTIVO PRACTIC',
2005        'DEPOSITO EN EFECTIVO',
2006        'DEPOSITO DE TERCEROS',
2007        'DEPOSITO POR CORRECCION',
2008        'PAGO CUENTA DE TERCERO',
2009        'TRASPASO ENTRE CUENTAS',
2010        'CHEQUE PAGADO NO',
2011        'SPEI RECIBIDO',
2012        'TRASPASO ENTRE CUENTAS',
2013        'DEP CHEQUES DE OTRO BANCO',
2014        'DEPOSITO CHEQUE',
2015        'DEP.CHEQUES DE OTRO BANCO',
2016        'CHEQUE PAGADO NO',
2017        'CHEQUE DEVUELTO',
2018        'CERTIFICACION DE CHEQUE',
2019        'DEP EFECTIVO','DEPOSITO CHQ','DEPOSITO EFECTIVO','DEPOSITO EFEC','DEP EFECTIVO','DEP EFEC','COMPRA ORDEN DE PAGO SPEI',
2020        'COMPENSACI',
2021        'RETIRO POR INVERSION CEDE INVERSION',
2022        'ABONO INTERESES CEDE INVERSION CAPITAL',
2023        'RETIRO POR TRANSFERENCIA',
2024        'RETIRO PARA CUBRIR COMPRA',
2025        'EN PROCESO DE REVISION',
2026        'DEPOSITO GENERADO',
2027        'DEPOSITO EN',
2028        'CLIENTE VENDE DIVISAS',
2029        'VENCIMIENTO DE COMPRA',
2030        'CLIENTE COMPRA DIVISAS',
2031        'COMPRA EN REPORTO');
2032
2033    //echo "<pre>".print_r($arr, true)."</pre>";
2034
2035    foreach($arr as $k=>$v)
2036        if(esPurosCeros($v))
2037            unset($arr[$k]);
2038
2039    //echo "<pre>".print_r($arr, true)."</pre>";
2040
2041    $str = implode(" ", $arr);
2042
2043    foreach($refProblematicas as $rp)
2044        if($pos = strpos($str, $rp) !== false)
2045        {
2046            $len = strlen($rp);// strpos($str, "/") !== false ? strpos($str, "/") : strlen($rp);
2047            $str = substr($str, 0, $len);
2048            $str = vx_trim($str);
2049            break;
2050        }
2051
2052    $str = preg_replace('/[^a-zA-Z0-9\']/', ' ', $str);
2053    $str = str_replace("'", '', $str);
2054    $str = sanitizeString($str);
2055    $str = vx_trim($str);
2056    return $str;
2057}
2058
2059function esPurosCeros($str)
2060{
2061    $arr = str_split($str);
2062
2063    //echo "<pre>".print_r($arr, true)."</pre>";
2064
2065    foreach($arr as $v)
2066        if($v != '0')
2067            return false;
2068
2069    return true;
2070}
2071
2072/**
2073 * Actualiza los ingresos del banco (banco_cuenta_saldos): deposit_xxxxx contiene: ventas e intereses por inversiones y fiduciarios
2074 * (excluye regreso de inversiones, fiduciarios, transferencias entre cuentas propias, garantías).
2075 * También actualiza sado_actual ahora. Lo arregló Pepe 14-11-2020
2076 * los campos deposit_today, deposit_this_month, deposit_this_year, deposit_custom son calculados automáticamente.
2077 * @param string $fecha_ini
2078 * @param string $fecha_fin
2079 */
2080function actualizaIngresos($fecha_ini = "", $fecha_fin = "")
2081{
2082    //$sqlComment = "";//' /* vitex.' . __FUNCTION__ . '() */ ';
2083    $sql = [];
2084
2085    $custom = false;
2086
2087    if(!empty($fecha_ini) && !empty($fecha_fin)) {
2088
2089        $fecha_ini = date('Y-m-d', strtotime($fecha_ini)) . " 00:00:00";
2090        $fecha_fin = date('Y-m-d', strtotime($fecha_fin)) . " 23:59:59";
2091        $custom = true;
2092    }
2093
2094    $sql[] = "UPDATE banco_cuenta_saldos SET fiduciario_all = 0, fiduciario_this_month = 0, fiduciario_this_year = 0,
2095                fid_ingreso_today = 0, fid_ingreso_this_year = 0, fid_ingreso_this_month = 0,
2096                inv_ingreso_today = 0, inv_ingreso_this_year = 0, inv_ingreso_this_month = 0,
2097                ingreso_today = 0, ingreso_this_year = 0, ingreso_this_month = 0,
2098                inversion_this_year = 0, inversion_all = 0 " .
2099        ($custom ? ", ingreso_custom = 0,  fid_ingreso_custom = 0, inv_ingreso_custom = 0 " : "");
2100
2101    $update_bcid = array();
2102
2103    //Ingresos en el banco
2104    $rangoFechas = [
2105        'ingreso_today' => [date('Y-m-d') . " 00:00:00", date('Y-m-d') . " 23:59:59"],
2106        'ingreso_this_month' => [date('Y-m-01') . " 00:00:00", date('Y-m-t') . " 23:59:59"],
2107        'ingreso_this_year' => [date('Y-01-01') . " 00:00:00", date('Y-m-t') . " 23:59:59"],
2108    ];
2109
2110    if($custom)
2111        $rangoFechas['ingreso_custom'] = [$fecha_ini, $fecha_fin];
2112
2113    $where_remarks = "";
2114    /**
2115     * AND bcm.remarks NOT LIKE '%SIN AFECTAR LA CUENTA T%' AND bcm.remarks NOT LIKE '%DEVUELT%' AND bcm.remarks NOT LIKE '%FIDUCI%'
2116    AND bcm.remarks NOT LIKE '%DEVOLUCI%' AND bcm.remarks NOT LIKE '%INVERSION%'
2117    AND bcm.numero NOT LIKE '%FIDUCI%' AND bcm.numero NOT LIKE '%DEV%' AND bcm.numero NOT LIKE '%INV%'
2118     *
2119     * queda a reserva el tipo 24 que es pagos entre empresas del grupo.
2120     */
2121
2122    foreach($rangoFechas as $fieldName => $fechas) {
2123        $sqlNoFiduciario =
2124            "SELECT bcm.banco_cuenta_id, SUM(bcm.cash + bcm.deposit) as monto
2125          FROM banco_cuenta_mov bcm
2126          WHERE  bcm.fecha >= '$fechas[0]' AND bcm.fecha <= '$fechas[1]'
2127                AND bcm.es = 'Deposito'
2128                AND bcm.banco_mov_tipo_id NOT IN ('18','21','22','23','26')
2129                AND bcm.link_vale NOT IN ('SBC')
2130                $where_remarks
2131          GROUP BY bcm.banco_cuenta_id";
2132        $cuentas = ia_sqlKeyValue($sqlNoFiduciario);
2133        if(!empty($cuentas))
2134            foreach($cuentas as $banco_cuenta_id => $monto) {
2135                //$sql[] = "UPDATE banco_cuenta_saldos SET $fieldName = $monto WHERE banco_cuenta_id = $banco_cuenta_id";
2136
2137                if(!array_key_exists($banco_cuenta_id, $update_bcid))
2138                    $update_bcid[$banco_cuenta_id] = array();
2139
2140                $update_bcid[$banco_cuenta_id][$fieldName] = $monto;
2141            }
2142
2143    }
2144
2145    //Fiduciarios
2146    $rangoFechas = [
2147        'fiduciario_all' => ["2000-01-01 00:00:00", "2050-12-31 23:59:59"],
2148        'fiduciario_this_month' => [date('Y-m-01') . " 00:00:00", date('Y-m-t') . " 23:59:59"],
2149        'fiduciario_this_year' => [date('Y-01-01') . " 00:00:00", date('Y-m-t') . " 23:59:59"],
2150    ];
2151
2152    if($custom)
2153        $rangoFechas['fiduciario_custom'] = [$fecha_ini, $fecha_fin];
2154
2155    foreach($rangoFechas as $fieldName => $fechas) {
2156        if($fieldName == "fiduciario_all")
2157            $sqlNoFiduciario ="SELECT banco_cuenta_id,
2158                SUM(saldo) as monto
2159                FROM fiduciario
2160                WHERE terminado = 'No'
2161                GROUP BY banco_cuenta_id";
2162        else
2163            $sqlNoFiduciario = "SELECT banco_cuenta_id,
2164                SUM(monto_retiro) as monto
2165                FROM fiduciario
2166                WHERE fecha_retiro >= '$fechas[0]' AND fecha_retiro <= '$fechas[1]'
2167                GROUP BY banco_cuenta_id";
2168
2169        $cuentas = ia_sqlKeyValue($sqlNoFiduciario);
2170        if(!empty($cuentas))
2171            foreach($cuentas as $banco_cuenta_id => $monto) {
2172                //$sql[] = "UPDATE banco_cuenta_saldos SET $fieldName = $monto WHERE banco_cuenta_id = $banco_cuenta_id";
2173
2174                if(!array_key_exists($banco_cuenta_id, $update_bcid))
2175                    $update_bcid[$banco_cuenta_id] = array();
2176
2177                $update_bcid[$banco_cuenta_id][$fieldName] = $monto;
2178            }
2179    }
2180
2181    //Ingresos por intereses de Fiduciario
2182    $rangoFechas = [
2183        'fid_ingreso_today' => [date('Y-m-d') . " 00:00:00", date('Y-m-d') . " 23:59:59"],
2184        'fid_ingreso_this_month' => [date('Y-m-01') . " 00:00:00", date('Y-m-t') . " 23:59:59"],
2185        'fid_ingreso_this_year' => [date('Y-01-01') . " 00:00:00", date('Y-m-t') . " 23:59:59"],
2186    ];
2187
2188    if($custom)
2189        $rangoFechas['fid_ingreso_custom'] = [$fecha_ini, $fecha_fin];
2190
2191    foreach($rangoFechas as $fieldName => $fechas) {
2192        $sqlNoFiduciario =
2193            "SELECT banco_cuenta_id, SUM(monto_interes) as monto
2194          FROM fiduciario_reembolso
2195          WHERE fecha_deposito >= '$fechas[0]' AND fecha_deposito <= '$fechas[1]' AND activo = 'Si'
2196          GROUP BY banco_cuenta_id";
2197
2198        $cuentas = ia_sqlKeyValue($sqlNoFiduciario);
2199        if(!empty($cuentas))
2200            foreach($cuentas as $banco_cuenta_id => $monto) {
2201                //$sql[] = "UPDATE banco_cuenta_saldos SET $fieldName = $monto WHERE banco_cuenta_id = $banco_cuenta_id";
2202
2203                if(!array_key_exists($banco_cuenta_id, $update_bcid))
2204                    $update_bcid[$banco_cuenta_id] = array();
2205
2206                $update_bcid[$banco_cuenta_id][$fieldName] = $monto;
2207            }
2208    }
2209
2210    //Ingresos por intereses de Inversiones
2211    $rangoFechas = [
2212        'inv_ingreso_today' => [date('Y-m-d') . " 00:00:00", date('Y-m-d') . " 23:59:59"],
2213        'inv_ingreso_this_month' => [date('Y-m-01') . " 00:00:00", date('Y-m-t') . " 23:59:59"],
2214        'inv_ingreso_this_year' => [date('Y-01-01') . " 00:00:00", date('Y-m-t') . " 23:59:59"],
2215    ];
2216
2217    if($custom)
2218        $rangoFechas['inv_ingreso_custom'] = [$fecha_ini, $fecha_fin];
2219
2220    foreach($rangoFechas as $fieldName => $fechas) {
2221        $sqlNoFiduciario =
2222            "SELECT  banco_cuenta_id, SUM(monto_interes) as monto
2223          FROM inversion_reembolso
2224          WHERE fecha_deposito >= '$fechas[0]' AND fecha_deposito <= '$fechas[1]' AND activo = 'Si'
2225          GROUP BY banco_cuenta_id";
2226
2227        $cuentas = ia_sqlKeyValue($sqlNoFiduciario);
2228        if(!empty($cuentas))
2229            foreach($cuentas as $banco_cuenta_id => $monto) {
2230                //$sql[] = "UPDATE banco_cuenta_saldos SET $fieldName = $monto WHERE banco_cuenta_id = $banco_cuenta_id";
2231
2232                if(!array_key_exists($banco_cuenta_id, $update_bcid))
2233                    $update_bcid[$banco_cuenta_id] = array();
2234
2235                $update_bcid[$banco_cuenta_id][$fieldName] = $monto;
2236            }
2237    }
2238
2239    //Inversiones activas por cuenta
2240    $rangoFechas = array();
2241    $rangoFechas = [
2242        'inversion_all' => ["2000-01-01 00:00:00", "2050-12-31 23:59:59"],
2243        'inversion_this_year' => [date('Y-01-01') . " 00:00:00", date('Y-m-t') . " 23:59:59"],
2244    ];
2245
2246    if($custom)
2247        $rangoFechas['inversion_custom'] = [$fecha_ini, $fecha_fin];
2248
2249    foreach($rangoFechas as $fieldName => $fechas) {
2250        $sqlNoFiduciario =
2251            "SELECT  banco_cuenta_id, SUM(saldo) as monto
2252          FROM inversion
2253          WHERE fecha_retiro >= '$fechas[0]' AND fecha_retiro <= '$fechas[1]' AND terminado = 'No'
2254          GROUP BY banco_cuenta_id";
2255
2256        $cuentas = ia_sqlKeyValue($sqlNoFiduciario);
2257        if(!empty($cuentas))
2258            foreach($cuentas as $banco_cuenta_id => $monto) {
2259                //$sql[] = "UPDATE banco_cuenta_saldos SET $fieldName = $monto WHERE banco_cuenta_id = $banco_cuenta_id";
2260
2261                if(!array_key_exists($banco_cuenta_id, $update_bcid))
2262                    $update_bcid[$banco_cuenta_id] = array();
2263
2264                $update_bcid[$banco_cuenta_id][$fieldName] = $monto;
2265            }
2266    }
2267
2268    foreach($update_bcid as $banco_cuenta_id => $campos){
2269        //$sql[] = ia_update("banco_cuenta_saldos", $campos, array("banco_cuenta_id" => $banco_cuenta_id));
2270        $campos["banco_cuenta_id"] = $banco_cuenta_id;
2271        $sql[] = ia_insert("banco_cuenta_saldos", $campos, array(),"", true);
2272    }
2273
2274    $sql[] =
2275        "INSERT INTO banco_cuenta_saldos(banco_cuenta_id, saldo_actual, sbc, deposit_cash, deposit_total, 
2276                                      withdrawal_total, Ultimo_Movimiento, Ultimo_cash, Ultimo_deposit, Ultimo_withdrawal, 
2277                                      ultima_conciliacion, orden, nombre, banco_id, moneda_id)
2278        (SELECT
2279            bcm.banco_cuenta_id,
2280            SUM(bcm.cash + bcm.deposit - bcm.withdrawal) + bcsh.deposit_total - bcsh.withdrawal_total as saldo_actual,
2281            SUM(IF(bcm.link_vale='SBC',bcm.cash + bcm.deposit,0)) as sbc,
2282            SUM(bcm.cash+bcm.deposit) + bcsh.deposit_total as deposit_cash,
2283            SUM(bcm.cash + bcm.deposit) + bcsh.deposit_total as deposit_total,
2284            SUM(bcm.withdrawal) + bcsh.withdrawal_total as withdrawal_total,
2285            MAX(fecha) as Ultimo_Movimiento,
2286            MAX(IF(bcm.cash+bcm.deposit>0,fecha,NULL)) as Ultimo_cash,
2287            MAX(IF(bcm.cash+bcm.deposit>0,fecha,NULL)) as Ultimo_deposit,
2288            MAX(IF(bcm.withdrawal>0,fecha,NULL)) as Ultimo_withdrawal,
2289            bc.ultima_conciliacion,
2290            bc.orden,
2291            bc.nombre,
2292            bc.banco_id,
2293            bc.moneda_id
2294        FROM banco_cuenta_mov bcm JOIN banco_cuenta bc ON bcm.banco_cuenta_id = bc.banco_cuenta_id JOIN banco_cuenta_saldos_hist bcsh ON bc.banco_cuenta_id = bcsh.banco_cuenta_id WHERE  bc.vale = 'Active' AND bcm.fecha >= '2023-01-01'
2295        GROUP BY bcm.banco_cuenta_id,bc.ultima_conciliacion,bc.orden, bc.nombre
2296        ) ON DUPLICATE KEY UPDATE
2297            saldo_actual=VALUES(saldo_actual),
2298            sbc=VALUES(sbc),
2299            deposit_cash=VALUES(deposit_cash),
2300            deposit_total=VALUES(deposit_total),
2301            withdrawal_total=VALUES(withdrawal_total),
2302            Ultimo_Movimiento=VALUES(Ultimo_Movimiento),
2303            Ultimo_cash=VALUES(Ultimo_cash),
2304            Ultimo_deposit=VALUES(Ultimo_deposit),
2305            Ultimo_withdrawal=VALUES(Ultimo_withdrawal),
2306            ultima_conciliacion=VALUES(ultima_conciliacion),
2307            orden=VALUES(orden),
2308            nombre=VALUES(nombre),
2309            banco_id=VALUES(banco_id),
2310            moneda_id=VALUES(moneda_id)";
2311
2312//    echo "<pre>".print_r($sql, true)."</pre>";
2313    ia_transaction($sql);
2314
2315
2316    ia_errores_a_dime();
2317    //ia_errores_a_dime("<pre>SQL" . print_r($sql, true) . "</pre>"."<pre>UP" . print_r($update_bcid, true) . "</pre>", "actualizaIngresos1");
2318    //echo "<pre>SQL" . print_r($sql, true) . "</pre>";
2319    //echo "<pre>UP" . print_r($update_bcid, true) . "</pre>";
2320    //echo "<pre>SQL1" . print_r($sql1, true) . "</pre>";
2321
2322}
2323
2324
2325function mueveAIEC($archivo, $path_parts=array(), $arrfile2EdoCta=array())
2326{
2327    global $gIAParametros;
2328
2329    $pathAIEC = $gIAParametros['path_archivos_estado_de_cuenta_importados'];
2330    clearstatcache();
2331    if(!file_exists($pathAIEC))
2332        @mkdir($pathAIEC);
2333
2334    if(file_exists($pathAIEC) && !is_dir($pathAIEC))
2335    {
2336        @unlink($pathAIEC);
2337        @mkdir($pathAIEC);
2338    }
2339
2340    if(!file_exists($archivo))
2341        return false;
2342
2343    if(strlen($path_parts['filename'])>15)
2344        $path_parts['basename'] = substr($path_parts['filename'],0,15).".$path_parts[extension]";
2345
2346    $nvoNombre = date('Y-m-d H-i-s')."-$arrfile2EdoCta[Cuenta]-$path_parts[basename]";
2347
2348    @rename("$archivo", "$pathAIEC/$nvoNombre");
2349
2350    return true;
2351
2352}