Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 102
0.00% covered (danger)
0.00%
0 / 5
CRAP
n/a
0 / 0
reporte_ventas_defaults
0.00% covered (danger)
0.00%
0 / 41
0.00% covered (danger)
0.00%
0 / 1
812
getRecomiendaPedido
0.00% covered (danger)
0.00%
0 / 14
0.00% covered (danger)
0.00%
0 / 1
56
reporte_ventas_filtro_describe
0.00% covered (danger)
0.00%
0 / 33
0.00% covered (danger)
0.00%
0 / 1
90
reporte_ventas_filtro_display
0.00% covered (danger)
0.00%
0 / 6
0.00% covered (danger)
0.00%
0 / 1
6
controlesPrograma
0.00% covered (danger)
0.00%
0 / 8
0.00% covered (danger)
0.00%
0 / 1
20
1<?php
2
3function reporte_ventas_defaults(bool $saveToDefaults):array {
4    unset($_REQUEST['maximize'], $_POST['maximize'], $_GET['maximize']);
5    global $gRequestFiltrada;
6    $gRequestFiltrada = empty($_POST) ? 0 : 1;
7    $userDefaults = usuario_defaults_get('bodega/bodega_reporte_ventas.php');
8    $recuerda =[
9        'tipo' => 'Olla',
10        'dias_entrega'=>80,
11        'ver_qty_rolls' => 'Qty',
12        'unidades_id' => '',
13        'fecha_min' => '',
14        'fecha_max' => '',
15        'bodega_id_all' => 'all',
16        'bodega_id' => '',
17
18        'pedir' => '',
19        'en_remate' => '',
20        'es_saldo' => '',
21        'super_lento' => '',
22        'lento' => '',
23        'oculto' => '',
24        'escondido' => '',
25        'con_existencia_quantity' => '',
26
27        'producto_general_id' => '',
28        'color_id' => '',
29
30        'ver_articulos_ocultos' => '',
31
32        'ver_unidad' => '1',
33        'statusAndOr' => 'or',
34    ];
35    foreach($recuerda as $nombre => $valor)
36        if(!array_key_exists($nombre, $userDefaults))
37            $userDefaults[$nombre] = $valor;
38    if(empty($userDefaults['dias_entrega']) || !is_numeric($userDefaults['dias_entrega']))
39        $userDefaults['dias_entrega'] = $recuerda['dias_entrega'];
40    if($userDefaults['tipo'] !== 'Olla' && $userDefaults['tipo'] !== 'Programacion')
41        $userDefaults['tipo'] = $recuerda['tipo'];
42
43    $defaults = [
44        'tipo' => $_REQUEST['tipo'] ?? $userDefaults['tipo'],
45        'ver_articulos_ocultos' => $gRequestFiltrada ? $_REQUEST['ver_articulos_ocultos'] ?? '' : '1',
46        'dias_entrega' => $gRequestFiltrada ? $_REQUEST['dias_entrega'] ?? '90' : $userDefaults['dias_entrega'],
47        'ver_articulos_pedidos' => $_REQUEST['ver_articulos_pedidos'] ?? 'todo',
48        'ver_min_rollos' => trim($_REQUEST['ver_min_rollos'] ?? ''),
49        'ver_qty_rolls' => $gRequestFiltrada ? $_REQUEST['ver_qty_rolls'] ?? '' : $userDefaults['ver_qty_rolls'],
50        'statusAndOr' => $_REQUEST['statusAndOr'] ?? $userDefaults['statusAndOr'],
51        'unidades_id' => $_REQUEST['unidades_id'] ?? $userDefaults['unidades_id'],
52    ];
53    if(empty($defaults['statusAndOr']))
54        $defaults['statusAndOr'] = 'or';
55    $valor_o_Blanco = [
56        'fecha_min', 'fecha_max', 'bodega_id_all', 'bodega_id', 'pedir',
57        'en_remate', 'es_saldo', 'super_lento', 'lento', 'oculto',
58        'con_existencia_quantity','escondido','producto_general_id', 'color_id','unidades_id',
59
60    ];
61    foreach($valor_o_Blanco as $save)
62        $defaults[$save] = $gRequestFiltrada ? $_REQUEST[$save] ?? '' : $userDefaults[$save] ?? '';
63
64    $valor_o_uno = ['ver_venta_neta_quantity', 'ver_unidad'];
65    foreach($valor_o_uno as $save)
66        $defaults[$save] = $gRequestFiltrada ? $_REQUEST[$save] ?? '1' : $userDefaults[$save] ?? '1';
67
68    if(!$gRequestFiltrada)
69        $defaults['ver_unidad'] = '1';
70
71
72    if( !empty($defaults['fecha_min']) && !empty($defaults['fecha_max']) && $defaults['fecha_min'] > $defaults['fecha_max']) {
73        $min = $defaults['fecha_min'];
74        $defaults['fecha_min'] = $defaults['fecha_max'];
75        $defaults['fecha_max'] = $min;
76    }
77    if( !empty($defaults['fecha_min']) && ('2036-01-01' < $defaults['fecha_min'] || '2014-01-01' > $defaults['fecha_min']))
78        $defaults['fecha_min'] = Date('Y-m-d');
79    if( !empty($defaults['fecha_max']) && ('2036-01-01' < $defaults['fecha_max'] || '2014-01-01' > $defaults['fecha_max']))
80        $defaults['fecha_max'] = Date('Y-m-d');
81    if(empty($defaults['dias_entrega']))
82        $defaults['dias_entrega'] = '90';
83
84    if($saveToDefaults)
85        usuario_defaults_set(
86            array_intersect_key($defaults, $recuerda),
87            'bodega/bodega_reporte_ventas.php'
88        );
89    return $defaults;
90}
91
92function getRecomiendaPedido(bool $paraOlla = true):string|false {
93    if(usuarioTipoRony() || Permisador::puede('puede_reporte_ventas') === 'Pedir') {
94        $nombre = Date('d/M/y H:i');
95        $tipo = $paraOlla ? 'Olla' : 'Programacion';
96        $where = "activo='Si' AND iac_usr_id=" . strit($_SESSION['usuario_id']) . " AND tipo = " . strit($tipo);
97        $function = __FUNCTION__;
98        $sql = "SELECT /*$function*/ pedido_recomienda_id FROM pedido_recomienda WHERE $where ORDER BY alta_db DESC";
99        $pedido_recomienda_id = ia_singleread($sql);
100        if(!empty($pedido_recomienda_id))
101            return $pedido_recomienda_id;
102        if($pedido_recomienda_id === false)
103            $pedido_recomienda_id = ia_singleread($sql);
104        if($pedido_recomienda_id === false)
105            throw new Exception("DB Error");
106        $insert = "INSERT INTO pedido_recomienda(tipo, iac_usr_id, nombre) 
107                VALUES(" . strit($tipo) . "," .strit($_SESSION['usuario_id']) . ',' . strit($nombre) . ")";
108        return ia_insertIded($insert);
109    }
110    return '';
111}
112
113function reporte_ventas_filtro_describe(BodegaReportes $bodegaReportes, array $defaults):string {
114    $icon = '<i style="color:green;" class="fa-thin fa-octagon-check filtradoPorIcon"></i>';
115    $charFiltered = '<span class="filtradoPorIcon">⚠️</span>';
116    $iconError = '<i style="color:red" class="fa-duotone fa-skull-crossbones filtradoPorIcon"></i>';
117
118    $method = __FUNCTION__;
119    $bodegaReportes->notasArticuloWhereNew($defaults);
120    $describe = $bodegaReportes->notasArticulosDescribeWhere;
121
122    //if(empty($defaults['ver_articulos_ocultos'])) {
123        $describeOcultosArray = $bodegaReportes->ventas_no_salen_describe($defaults);
124        if( !empty($describeOcultosArray))
125            $describe[] = '<details class="default"><summary class="tooltip_grid" title="Artículos que se muestran únicamente si tienen existencia<br>Click para verlos">¡Hay Artículos Ocultos!</summary><div>
126                Estos únicamente se muestran si tienen existencia. 
127                <ul class="ocultoColumn"><li>' . implode("<li>", $describeOcultosArray) . "</ul>
128                </div></details>";
129    //}
130
131    if($defaults['ver_min_rollos'] !== '')
132        $describe[] = "Artículos que <b>vendieron al menos " . $defaults['ver_min_rollos'] . " Rollos.</b>";
133    if($defaults['ver_articulos_pedidos'] !== 'todo')
134        $describe[] = "Mostrando Artículos: <b class='yaPedido'>" . ucwords(str_replace('_', ' ', $defaults['ver_articulos_pedidos']  )) . "</b>";
135
136
137        $productosOcultosPedidos = ia_sqlVector(
138            "
139                SELECT /*$method*/ DISTINCT CONCAT(pg.producto, ' ', c.color)
140                FROM pedido_items pei JOIN pedido p on pei.pedido_id = p.pedido_id
141                    JOIN producto_general pg on pei.producto_general_id = pg.producto_general_id
142                    JOIN producto_color_oculta pco on pg.producto_general_id = pco.producto_general_id AND pei.color_id=pco.color_id
143                    JOIN color c on pei.color_id = c.color_id
144                WHERE p.mostrar_en_ventas = 'Si'
145                UNION
146                SELECT DISTINCT pg.producto
147                FROM pedido_items pei JOIN pedido p on pei.pedido_id = p.pedido_id
148                    JOIN producto_general pg on pei.producto_general_id = pg.producto_general_id
149                    JOIN producto_color_oculta pco on pg.producto_general_id = pco.producto_general_id AND pco.color_id=''
150                WHERE p.mostrar_en_ventas = 'Si'
151                UNION
152                SELECT DISTINCT c.color
153                FROM pedido_items pei JOIN pedido p on pei.pedido_id = p.pedido_id
154                    JOIN producto_general pg on pei.producto_general_id = pg.producto_general_id
155                    JOIN producto_color_oculta pco on pco.producto_general_id='' AND pei.color_id=pco.color_id
156                    JOIN color c on pei.color_id = c.color_id
157                WHERE p.mostrar_en_ventas = 'Si' ");
158        if( !empty($productosOcultosPedidos))
159            $describe[] = "<div style='color:red;width:fit-content;border:1px red solid;padding:0.3em'>" .
160                implode(", ", $productosOcultosPedidos) . " Tienen <b>Pedido a China</b> con <b>Mostrar</b> en Ventas <b>Si</b> pero estan en <b>PRODUCTOS OCULTOS</b></div>";
161        $productosOcultosRecomienda = ia_sqlVector(
162            "
163                SELECT /*$method*/ DISTINCT CONCAT(pg.producto, ' ', c.color)
164                FROM pedido_recomienda_items pei 
165                    JOIN producto_general pg on pei.producto_general_id = pg.producto_general_id
166                    JOIN producto_color_oculta pco on pg.producto_general_id = pco.producto_general_id AND pei.color_id=pco.color_id
167                    JOIN color c on pei.color_id = c.color_id
168                WHERE pei.digo NOT IN ('No Pedir', '')
169                UNION
170                SELECT DISTINCT pg.producto
171                FROM pedido_recomienda_items pei 
172                    JOIN producto_general pg on pei.producto_general_id = pg.producto_general_id
173                    JOIN producto_color_oculta pco on pg.producto_general_id = pco.producto_general_id AND pco.color_id=''
174                WHERE pei.digo NOT IN ('No Pedir', '')
175                UNION
176                SELECT DISTINCT c.color
177                FROM pedido_recomienda_items pei 
178                    JOIN producto_general pg on pei.producto_general_id = pg.producto_general_id
179                    JOIN producto_color_oculta pco on pco.producto_general_id='' AND pei.color_id=pco.color_id
180                    JOIN color c on pei.color_id = c.color_id
181                WHERE pei.digo NOT IN ('No Pedir', '')"
182        );
183        if( !empty($productosOcultosRecomienda)) {
184            $icon = $iconError;
185            $charFiltered = $iconError;
186            $describe[] = "<div style='color:red;width:fit-content;border:1px red solid;padding:0.3em'>" .
187                implode(", ", $productosOcultosRecomienda) . " Estan en <b>Recomienda Pedir: Olla o Programación,</b> pero estan en <b>PRODUCTOS OCULTOS</b></div>";
188        }
189
190    $pedidosInactive = ia_sqlVector("SELECT /*$method*/ CONCAT('Pedido #', numero) FROM pedido WHERE mostrar_en_ventas = 'No' AND activo = 'Si'");
191    if(!empty($pedidosInactive)) {
192        $icon = $iconError;
193        $charFiltered = $iconError;
194        $describe[] = "<div style='width:fit-content;border:1px red solid;padding:0.3em'><b style='color:red'>Ojo</b>: " .
195            implode(", ", $pedidosInactive) . " dicen <b>Mostrar</b> en <b>Ventas</b> <b style='color:red'>No</b>, por lo tanto el total de Pedidos a China de Ventas NO coincide con el Total De Pedidos China a menos que filtre por Mostrar En Ventas = Si</div>";
196    }
197
198    $pedidosInactive = ia_sqlVector("SELECT /*$method*/ CONCAT('Pedido #', numero) FROM pedido WHERE mostrar_en_ventas = 'Si' AND activo = 'No'");
199    if(!empty($pedidosInactive)) {
200        $icon = $iconError;
201        $charFiltered = $iconError;
202        $describe[] = "<div style='color:red;width:fit-content;border:1px red solid;padding:0.3em'>" .
203            implode(", ", $pedidosInactive) . " estan <b>INACTIVE</b> pero dicen <b>Mostrar</b> en Ventas <b>SI</b></div>";
204    }
205
206    if(empty($describe)) {
207        $charTitle =  $charFiltered = '';
208    } else {
209        $charTitle = '🕱';
210    }
211
212    $describeLi = implode("<li>", $describe);
213
214    return  <<< HTML
215        <fieldset id='filtradoPor' title="🕱 Avisos" 
216        style='display:none;padding:1em;margin:1em;border:1px lightblue solid;width:fit-content;'>
217        <legend>$charFiltered Avisos:
218                <span title="Copiar artículos ocultos" data-clipboard-target='#filtradoPorLi' style="cursor:copy" class="ui-icon ui-icon-copy copyClipBloard noprint"></span>
219                <span class="ui-icon ui-icon-print noprint" style="cursor:pointer;" onclick="printElement('#filtradoPor')"></span></legend>
220        </legend>
221        $charFiltered
222        <ul id="filtradoPorLi"><li>$describeLi</li></ul>
223        $charFiltered
224        </fieldset>
225HTML;
226}
227
228function reporte_ventas_filtro_display($bodegaReportes, $defaults):string {
229    unset($defaults['tipo']);
230    $filterIt = new FilterIt($defaults, $defaults);
231
232    $describeFiltro = reporte_ventas_filtro_describe($bodegaReportes, $defaults);
233    $defaults['ver_min_rollos'] === '' ? '' : (int)$defaults['ver_min_rollos'];
234    return strim("<form title='Filtrar por' id='ElFiltro' method='post' action='$_SERVER[SCRIPT_NAME]
235        style='margin:0.5em;padding:0.5em;border:1px blue solid;display:none'><div id='ElFiltroDivScroll' style='overflow:auto;max-height:800px!important'>
236        <span style='visibility: hidden'><input type='text' autofocus></span>
237        <div style='display:flex;flex-wrap: wrap;flex-direction:row;'>" .
238        $filterIt->filterDefault() .
239        <<<EOF
240         <div>
241            <div class="bold lbl">Activar Búsqueda (F8)<br>Maximizar (F9)<br></div>
242            <div style="padding:1em 0.5em;font-size:0.8em">
243                <label style="background-color: lightpink;box-shadow: 0 0 9px #000022;padding:0.5em">
244                <input type="checkbox" id="default_query" value="default_query" name="default_query">al buscar hazlo Mi Default</label>
245            </div>
246            <div style="padding:1em 0.5em">
247                <button type="button" value="clear" 
248                    onclick="resetFiltro();document.getElementById('default_query').checked=true;this.form.submit();" 
249                    style="font-size:1.1em;padding:0.2em 1em;cursor:pointer;background-color: silver;" 
250                    class="btnGenerar-comodin btnGenerar-comodin-change" title="Borra el default">Elimina mi Default
251                </button>
252            </div>  
253            <div style="padding:1em 1em">
254                <input type="submit" value="Buscar (F6)" style="font-size:1.4em;padding:0.2em 1em;cursor:pointer;box-shadow: 0 0 9px #000022;" 
255                    class="btnGenerar-comodin btnGenerar-comodin-change">
256            </div>
257            <div style="padding:1em 1em">
258                <button type="button" value="Reset" onclick="resetFiltro()" 
259                    style="font-size:1.1em;padding:0.2em 1em;cursor:pointer;background-color: silver;" 
260                    class="btnGenerar-comodin btnGenerar-comodin-change" title="Borra que buscar para mostrar todo. No cambia el Default">Quita el Filtro
261                </button>
262            </div>
263        </div>
264    </div></form>$describeFiltro</div>
265EOF
266    );
267}
268
269function controlesPrograma():string {
270    if(usuarioTipoRony() || Permisador::puede('puede_reporte_ventas') === 'Pedir') {
271        $controles = '<div class="pc">';
272        if(usuarioTipoRony())
273            $controles .= '<div class="dr cl" onclick="ollaBorraRenglon(this)" title="Eliminar la Olla de TODOS en este Renglón">🗑</div>';
274        $controles .= '<div class="im cl" onclick="brv.iDo(this)" title="Importante">ⓘ</div>';
275        $controles .= '<div class="cm cl" onclick="brv.cDo(this)" title="Solo si hay espacio: complementar el contenedor">⛴</div>';
276        $controles .= '<div class="pn cl" onclick="brv.pDo(this)" title="No Pedir">🚫</div>';
277        return $controles . "</div>";
278    }
279    return '';
280}