Code Coverage |
||||||||||
Lines |
Functions and Methods |
Classes and Traits |
||||||||
| Total | |
0.00% |
0 / 102 |
|
0.00% |
0 / 5 |
CRAP | n/a |
0 / 0 |
|
| reporte_ventas_defaults | |
0.00% |
0 / 41 |
|
0.00% |
0 / 1 |
812 | |||
| getRecomiendaPedido | |
0.00% |
0 / 14 |
|
0.00% |
0 / 1 |
56 | |||
| reporte_ventas_filtro_describe | |
0.00% |
0 / 33 |
|
0.00% |
0 / 1 |
90 | |||
| reporte_ventas_filtro_display | |
0.00% |
0 / 6 |
|
0.00% |
0 / 1 |
6 | |||
| controlesPrograma | |
0.00% |
0 / 8 |
|
0.00% |
0 / 1 |
20 | |||
| 1 | <?php |
| 2 | |
| 3 | function 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 | |
| 92 | function 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 | |
| 113 | function 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> |
| 225 | HTML; |
| 226 | } |
| 227 | |
| 228 | function 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> |
| 265 | EOF |
| 266 | ); |
| 267 | } |
| 268 | |
| 269 | function 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 | } |