Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 138
0.00% covered (danger)
0.00%
0 / 42
CRAP
0.00% covered (danger)
0.00%
0 / 1
PermisosBodega
0.00% covered (danger)
0.00%
0 / 138
0.00% covered (danger)
0.00%
0 / 42
6162
0.00% covered (danger)
0.00%
0 / 1
 __construct
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
6
 getPermisosPorUsuariosBodegas
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
6
 getPermisosPorBodegasUsuarios
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
6
 getBodegasActivas
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
6
 getBodegasActivasEInactivas
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
6
 getUsr
0.00% covered (danger)
0.00%
0 / 3
0.00% covered (danger)
0.00%
0 / 1
12
 instanceUser
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 puedeEntrarABodegas
0.00% covered (danger)
0.00%
0 / 10
0.00% covered (danger)
0.00%
0 / 1
42
 puedeEditarCatalogosBodega
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 puedeConsultarCatalogosBodega
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 puede_movimientos
0.00% covered (danger)
0.00%
0 / 3
0.00% covered (danger)
0.00%
0 / 1
6
 puede_verificar_movimientos
0.00% covered (danger)
0.00%
0 / 3
0.00% covered (danger)
0.00%
0 / 1
6
 bodegasPuedeHacerMovimientos
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 bodegasPuedeConsultarMovimientos
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 inBodegasIdConsultarMovimientos
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 inClause
0.00% covered (danger)
0.00%
0 / 6
0.00% covered (danger)
0.00%
0 / 1
12
 bodegasPuedeHacerVerificarMovimientos
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 bodegasPuedeConsultarVerificarMovimientos
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 inBodegasIdConsultarVerificarMovimientos
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 bodegasPuedeRegistarConteoFisico
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 bodegasPuedeConsultarConteoFisico
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 puedeHacerMovimientos
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 puedeConsultarMovimientos
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 puedeHacerVerificarMovimientos
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 puedeConsultarVerificarMovimientos
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 puedeVerValorProductos
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
6
 puedeReportesEspeciales
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
6
 getPermisosDeBodega
0.00% covered (danger)
0.00%
0 / 3
0.00% covered (danger)
0.00%
0 / 1
6
 puedeConsultarExistencias
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 tienePermisoPorTiendas
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
2
 tiendasPermitidas
0.00% covered (danger)
0.00%
0 / 3
0.00% covered (danger)
0.00%
0 / 1
2
 traeUsuarioBodegas
0.00% covered (danger)
0.00%
0 / 5
0.00% covered (danger)
0.00%
0 / 1
12
 bodegasConRW
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
6
 bodegasConROoRW
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
12
 permisosBodegaRonyModificar
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
12
 permisosBodegaRonyConsulta
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
12
 permisoRW
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
6
 permisoConsultar
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
12
 getSupervisanBodegas
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 puedeUsarOrigenDestinoEspeciales
0.00% covered (danger)
0.00%
0 / 5
0.00% covered (danger)
0.00%
0 / 1
6
 setRegistraNotasTodasBodegas
0.00% covered (danger)
0.00%
0 / 13
0.00% covered (danger)
0.00%
0 / 1
12
 setConsultarNotasTodasBodegas
0.00% covered (danger)
0.00%
0 / 14
0.00% covered (danger)
0.00%
0 / 1
12
1<?php
2
3/** 2021-12-18 todo verde */
4
5use Iac\inc\sql\IacSqlBuilder;
6use JetBrains\PhpStorm\ExpectedValues;
7
8/**
9 * Clase para saber los permisos de usuarios en las bodegas
10 *
11 * @author José Juan del Prado
12 * @examples
13    global $gPermisosbodega;
14    $permisoNotas = $gPermisosbodega->puede_movimientos($bodega_id);
15        $permisoNotas es R/W, R/O o Nada segun el permiso del usuario actual para alta y edicion de notas en la bodega $bodega_id
16
17    global $gPermisosbodega;
18    $puedeEnBodega = [];
19    foreach(ia_sqlKeyValue("SELECT bodega_id, bodega FROM bodega ORDER BY 2") as $bodega_id => $bodega)
20        foreach(ia_sqlKeyValue("SELECT iac_usr_id, nick FROM iac_usr ORDER BY 2") as $iac_usr_id => $nick)
21            $puedeEnBodega[] = ['bodega'=>$bodega, 'usuario' => $nick,
22                'puede_movimientos' => $gPermisosbodega->puede_movimientos($bodega_id, $iac_usr_id)
23            ];
24    echo iaTableIt::getTableIt($puedeEnBodega);
25 *
26 *
27 * @version 1.1.0 2023-06-13
28 */
29
30
31final class PermisosBodega
32{
33    protected int|string $user_id;
34    protected array $permisosPorUsuariosBodegas = [];
35    protected array $permisosPorBodegasUsuarios = [];
36    protected array $bodegasActivas = [];
37    protected array $bodegasActivasEInactivas = [];
38    protected array $usuario = [];
39
40    /**
41     * Inicia la clase con el usuario que le manden como parametro o lo toma de la sesión
42     * @param int|string|null $user_id , Es el Id del usuario que queremos saber los permisos (Si es null los permisos son de la sesion actual)
43     * @return void
44     */
45    function __construct(int|string|null $user_id = null)
46    {
47        $this->user_id = empty($user_id) ? $_SESSION['usuario_id'] ?? 0 : $user_id;
48    }
49
50    /**
51     * Por cada usuario activo regresa en que bodega (activa) tiene permisos y cada uno de sus permisos
52     *
53     * @return array [icac_usr_id=>[bodega_id=>[bodega=>'',color=>'', bodega_id=>'', iac_usr_id=>'', nick=>'', permiso1=>'', ...], ]]
54     */
55    public function getPermisosPorUsuariosBodegas(): array
56    {
57        if (empty($this->permisosPorUsuariosBodegas)) {
58            $method = __METHOD__;
59            $queryUsuarioBodega =
60                "SELECT /*$method*/ pb.iac_usr_id as uid, b.bodega_id as bid, pb.*, b.bodega, b.label, b.color, iu.nick, b.grupo
61                FROM permiso_bodega pb JOIN bodega b ON pb.bodega_id = b.bodega_id JOIN iac_usr iu on pb.iac_usr_id = iu.iac_usr_id
62                WHERE b.activo = 'Si' AND iu.vale = 'Active' 
63                ORDER BY b.bodega";
64            $this->permisosPorUsuariosBodegas = ia_sqlSelectMultiKey($queryUsuarioBodega, 2);
65        }
66        return $this->permisosPorUsuariosBodegas;
67    }
68
69    /**
70     * Por cada bodega (activa)  regresa en que usuario activo  tiene permisos y cada uno de sus permisos
71     *
72     * @return array [icac_usr_id=>[bodega_id=>[bodega=>'',color=>'', bodega_id=>'', iac_usr_id=>'', nick=>'', permiso1=>'', ...], ]]
73     */
74    public function getPermisosPorBodegasUsuarios(): array
75    {
76        if (empty($this->permisosPorBodegasUsuarios)) {
77            $method = __METHOD__;
78            $queryUsuarioBodega =
79                "SELECT /*$method*/ b.bodega_id as bid, pb.iac_usr_id as uid,  pb.*, b.bodega, b.label, b.color, iu.nick, b.grupo
80                FROM permiso_bodega pb JOIN bodega b ON pb.bodega_id = b.bodega_id JOIN iac_usr iu on pb.iac_usr_id = iu.iac_usr_id
81                WHERE b.activo = 'Si' AND iu.vale = 'Active' 
82                ORDER BY b.grupo <> '', b.grupo, b.bodega, iu.nick";
83            $this->permisosPorBodegasUsuarios = ia_sqlSelectMultiKey($queryUsuarioBodega, 2);
84        }
85        return $this->permisosPorBodegasUsuarios;
86    }
87    /**
88     * Un array indexado por bodega_id de las bodegas activas
89     * @return array ['bodega_id'=>[bodega_id=>'',bodega=>'',color=>'',empresa_id=>'']
90     */
91    public function getBodegasActivas(): array
92    {
93        if (empty($this->bodegasActivas)) {
94            $method = __METHOD__;
95            $this->bodegasActivas = ia_sqlArray(
96                "SELECT /*$method*/ bodega_id, bodega, label, color, empresa_id, grupo, activo FROM bodega WHERE activo = 'Si' ORDER BY bodega", 'bodega_id');
97        }
98        return $this->bodegasActivas;
99    }
100
101    /**
102     * Un array indexado por bodega_id de todas las bodegas activas o inactivas
103     * @return array ['bodega_id'=>[bodega_id=>'',bodega=>'',color=>'',empresa_id=>'']
104     */
105    public function getBodegasActivasEInactivas(): array
106    {
107        if (empty($this->bodegasActivasEInactivas)) {
108            $method = __METHOD__;
109            $this->bodegasActivasEInactivas = ia_sqlArray(
110                "SELECT /*$method*/ bodega_id, bodega, label, color, empresa_id, grupo, activo FROM bodega ORDER BY bodega", 'bodega_id');
111        }
112        return $this->bodegasActivasEInactivas;
113    }
114
115    public function getUsr(string|null $key = null):string {
116        if(empty($this->usuario))
117           $this->instanceUser();
118       return empty($key) ? $this->user_id : ($this->usuario[$key] ?? $this->user_id);
119    }
120
121    protected function instanceUser():void {
122       $method = __METHOD__;
123       $this->usuario = ia_singleton("SELECT /*$method*/ * FROM iac_usr WHERE iac_usr_id = " . strit($this->user_id));
124    }
125
126    /**
127     * Obtiene el permiso para saber si puede entrar al sistema de bodegas, con que tenga algun permiso.
128     * @return bool [true, false], el usuario tiene permiso (true => el usuario tiene permiso, false => el usuario no tiene permiso)
129     */
130    public function puedeEntrarABodegas(): bool
131    {
132        if (usuarioSupervisaBodega($this->user_id))
133            return true;
134        if(!empty($this->bodegasPuedeConsultarMovimientos()) )
135            return true;
136        if(!empty($this->bodegasPuedeConsultarVerificarMovimientos()))
137            return true;
138        if(!empty($this->bodegasPuedeHacerVerificarMovimientos()))
139            return true;
140        if(!empty($this->bodegasPuedeHacerMovimientos()))
141            return true;
142        return false;
143    }
144
145
146    /**
147     * Obtiene el permiso para saber si puede altas, bajas y cambios la tabla bodega
148     * @return bool [true, false], el usuario tiene permiso (true => el usuario tiene permiso, false => el usuario no tiene permiso)
149     */
150    public function puedeEditarCatalogosBodega(): bool
151    {
152        return usuarioSupervisaBodega($this->user_id);// || $this->user_id == '86';
153
154    }
155
156    /**
157     * Obtiene el permiso para saber si puede consultar la tabla bodega
158     * @return bool [true, false], el usuario tiene permiso (true => el usuario tiene permiso, false => el usuario no tiene permiso)
159     */
160    public function puedeConsultarCatalogosBodega(): bool
161    {
162        return usuarioSupervisaBodega($this->user_id);// || $this->user_id == '86';
163    }
164
165
166    /**
167     * @param string $bodega_id
168     * @param $user_id
169     * @return string ExpectedValues('R/W', 'R/O', 'Nada')
170     */
171    #[ExpectedValues('R/W', 'R/O', 'Nada')]
172    public function puede_movimientos(string $bodega_id, $user_id = null):string {
173        if(usuarioTipoRony($user_id))
174            return 'R/W';
175        return $this->getPermisosPorUsuariosBodegas()[$user_id ?? $this->user_id][$bodega_id]['puede_movimientos'] ?? 'Nada';
176    }
177
178    /**
179     * @param string $bodega_id
180     * @param $user_id
181     * @return string
182     */
183    #[ExpectedValues('R/W', 'R/O', 'Nada')]
184    public function puede_verificar_movimientos(string $bodega_id, $user_id = null):string {
185        if(usuarioTipoRony($user_id))
186            return 'R/W';
187        return $this->getPermisosPorUsuariosBodegas()[$user_id ?? $this->user_id][$bodega_id]['puede_verificar_movimientos'] ?? 'Nada';
188    }
189
190    /////////////////////////////////////////////
191    ///
192    /**
193     * Permisos que regresan un array, indexado por bodega_id, que indica en que bodegas puede hacer lo solicitado
194     */
195
196    /**
197     * Obtiene el permiso para saber si puede generar movimientos en bodega (entradas, salidas)
198     * @param string $bodega_id Id del la bodega de la que se quiere saber si puede hacer movimientos
199     * @return array ['bodega_id' => ['key1' => 'val1'...]] Con las bodegas donde puede, en caso de no poder regresa array vacío []
200     */
201    public function bodegasPuedeHacerMovimientos(string $bodega_id = ''): array
202    {
203        return $this->bodegasConRW($bodega_id, 'puede_movimientos');
204    }
205
206    /**
207     * Obtiene los permisos para saber si puede consultar movimientos en bodega (entradas, salidas)
208     * @param string $bodega_id Id del la bodega de la que se quiere saber si puede hacer movimientos
209     * @return array ['bodega_id' => ['permiso1' => 'val1'...]] Con las bodegas donde puede, en caso de no poder regresa array vacío []
210     */
211    public function bodegasPuedeConsultarMovimientos(string $bodega_id = ''): array
212    {
213        return $this->bodegasConROoRW($bodega_id, 'puede_movimientos');
214    }
215
216    public function inBodegasIdConsultarMovimientos(): string
217    {
218        return $this->inClause($this->bodegasPuedeConsultarMovimientos());
219    }
220
221    public function inClause(array $array): string
222    {
223        $inArray = [];
224        foreach ($array as $k => $_)
225            $inArray[] = strit($k);
226        if (empty($inArray)) {
227            return "('\r\t\n')";
228        }
229        return '(' . implode(',', $inArray) . ')';
230    }
231
232    /**
233     * Obtiene en que bodegas puede escribir movimientos de verificiacíon (entradas, salidas).
234     * @param string $bodega_id Id del la bodega de la que se quiere saber si puede hacer movimientos, en blanco todas las bodegas
235     * @return array ['bodega_id' => ['permiso1' => 'val1'...]] Con las bodegas donde puede en caso de no poder regresa array vacío []
236     */
237    public function bodegasPuedeHacerVerificarMovimientos(string $bodega_id = ''): array
238    {
239        return $this->bodegasConRW($bodega_id, 'puede_verificar_movimientos');
240    }
241
242    /**
243     * Obtiene los permisos para saber si puede consultar movimientos en bodega (entradas, salidas)
244     * @param string $bodega_id Id del la bodega de la que se quiere saber si puede hacer movimientos
245     * @return array ['bodega_id' => ['permiso1' => 'val1'...], ...] Con las bodegas donde puede
246     */
247    public function bodegasPuedeConsultarVerificarMovimientos(string $bodega_id = ''): array
248    {
249        return $this->bodegasConROoRW($bodega_id, 'puede_verificar_movimientos');
250    }
251
252    /**
253     * @return string "('bodega_id1', 'bodega_id2', ...)"  para en un sql:
254     *      ".. WHERE bodega_id IN " . inBodegasIdConsultarVerificarMovimientos();
255     */
256    public function inBodegasIdConsultarVerificarMovimientos(): string
257    {
258        return $this->inClause($this->bodegasPuedeConsultarVerificarMovimientos());
259    }
260
261
262    /**
263     * Regresa: en $bodega_id='' todas las bodegas en que bodegas puede hacer inventario físico o spot checks
264     *  es decir contar la existencia de productos,
265     *
266     * @param string $bodega_id en blanco trae todas las bodegas en que puede, con Id solo esa bodega
267     * @return array ['bodega_id' => ['permiso1' => 'val1'...], ...], las bodegas en que bodegas puede
268     */
269    public function bodegasPuedeRegistarConteoFisico(string $bodega_id = ''): array
270    {
271        return $this->bodegasConRW($bodega_id, 'puede_conteo_fisico');
272    }
273
274    /**
275     * Regresa: en $bodega_id='' todas las bodegas en que bodegas puede consultar los inventarios físicos o spot checks
276     *  es decir contar la existencia de productos,
277     *
278     * @param string $bodega_id en blanco trae todas las bodeas en que puede, con Id solo esa bodega
279     * @return array ['bodega_id' => ['permiso1' => 'val1'...], ...], las bodegas en que bodegas puede
280     */
281    public function bodegasPuedeConsultarConteoFisico(string $bodega_id = ''): array
282    {
283        return $this->bodegasConROoRW($bodega_id, 'puede_conteo_fisico');
284    }
285
286    /////////////////////////////////////////////
287    ///
288    /**
289     * Permisos que son si o no Por Bodega regresan true/false
290     */
291
292    /**
293     *  True puede hacer movimientos en $bodega_id, false no puede, no existe $bodega_id, o esta inactiva
294     *  key permiso_bodega.puede_movimientos
295     *
296     * @param string $bodega_id
297     * @return bool true puede hacer movimientos en $bodega_id, false no puede
298     */
299    public function puedeHacerMovimientos(string $bodega_id): bool
300    {
301        return $this->permisoRW($bodega_id, 'puede_movimientos');
302    }
303
304    /**
305     * True puede consultar movimientos en $bodega_id, false no puede o no existe $bodega_id, o esta inactiva y no es usuario tipo rony
306     *  key permiso_bodega.puede_movimientos
307     *
308     * @param string $bodega_id
309     * @return bool true puede, false no puede
310     */
311    public function puedeConsultarMovimientos(string $bodega_id): bool
312    {
313        return $this->permisoConsultar($bodega_id, 'puede_movimientos');
314    }
315
316    /**
317     *  True puede hacer movimientos verificar en $bodega_id, false no puede, no existe $bodega_id, o esta inactiva
318     *  key permiso_bodega.puede_verificar_movimientos
319     *
320     * @param string $bodega_id
321     * @return bool true puede hacer movimientos de verificación en $bodega_id, false no puede
322     * @throws Exception
323     */
324    public function puedeHacerVerificarMovimientos(string $bodega_id): bool
325    {
326        return $this->permisoRW($bodega_id, 'puede_verificar_movimientos');
327    }
328
329    /**
330     * True puede consultar movimientos de verificación en $bodega_id, false no puede o no existe $bodega_id, o esta inactiva y no es usuario tipo rony
331     *  key permiso_bodega.puede_verificar_movimientos
332     *
333     * @param string $bodega_id
334     * @return bool true puede, false no puede
335     */
336    public function puedeConsultarVerificarMovimientos(string $bodega_id): bool
337    {
338        return $this->permisoConsultar($bodega_id, 'puede_verificar_movimientos');
339    }
340
341    /**
342     * Puede ver el valor de productos y reportes que contengan el valor
343     *
344     * @param string $bodega_id
345     * @return bool true si, false no puede
346     */
347    public function puedeVerValorProductos(string $bodega_id): bool
348    {
349        if (usuarioSupervisaBodega($this->user_id) ) {
350            return array_key_exists($bodega_id, $this->getBodegasActivasEInactivas());
351        }
352        $puede = $this->getPermisosDeBodega($bodega_id)[$bodega_id]['puede_ver_valor_productos'] ?? '';
353        return $puede === 'Si';
354    }
355
356    /**
357     * Puede ver reportes indicados como 'especiales'
358     *
359     * @param string $bodega_id
360     * @return bool true si, false no puede
361     */
362    public function puedeReportesEspeciales(string $bodega_id): bool
363    {
364        if (usuarioSupervisaBodega($this->user_id) ) {
365            return array_key_exists($bodega_id, $this->getBodegasActivasEInactivas());
366        }
367        $puede = $this->getPermisosDeBodega($bodega_id)[$bodega_id]['puede_reportes_especiales'] ?? '';
368        return $puede === 'Si';
369    }
370
371    /**
372     * Trae los permisos
373     */
374
375    /**
376     * Obtiene los permisos que tiene el usuario, no tipoRony en las bodegas o una bodega.
377     * Los usuarios tipoRony tienen todos los permisos, para ellos regresa las bodegas activas sin permisos.
378     *
379     * @param string $bodega_id Id del la bodega de la que se quieren obtener los permisos,
380     * @return array [bodega_id=>[permiso1=>'',... bodega=>'', color=>'', bodega_id=>'', 'iac_usr_id'=>'',nick=>'' ]],
381     *         Con los permisos del usuario en las bodegas
382     */
383    public function getPermisosDeBodega(string $bodega_id = ''): array
384    {
385        if (usuarioSupervisaBodega($this->user_id)) {
386            return $this->permisosBodegaRonyModificar($bodega_id);
387        }
388        return $this->traeUsuarioBodegas($bodega_id);
389    }
390
391    /**
392     * @param string $bodega_id
393     * @return bool
394     * @noinspection PhpUnusedParameterInspection
395     */
396    public function puedeConsultarExistencias(string $bodega_id = ''): bool
397    {
398        return true;
399    }
400
401    public function tienePermisoPorTiendas(): bool
402    {
403        $usuario_id = $_SESSION['usuario_id'];
404        $query = "SELECT * FROM permiso_bodega_consulta_salida_tienda WHERE iac_usr_id = $usuario_id";
405        $tiendas = ia_sqlArrayIndx($query);
406        return !empty($tiendas);
407    }
408
409    public function tiendasPermitidas():array
410    {
411        $usuario_id = $_SESSION['usuario_id'];
412        $query = "SELECT * FROM permiso_bodega_consulta_salida_tienda WHERE iac_usr_id = $usuario_id";
413        return ia_sqlArrayIndx($query);
414    }
415
416
417
418
419///// Helpers ///////////////////////////
420/// Helpers
421/////////////////////////////////////////////
422///
423    protected function traeUsuarioBodegas(string $bodega_id):array {
424        if($bodega_id == '') {
425            return $this->getPermisosPorUsuariosBodegas()[$this->user_id] ??
426                [];
427        }
428        // return $this->getPermisosPorUsuariosBodegas()[$this->user_id][$bodega_id] ?? [];
429        $bodega = $this->getPermisosPorUsuariosBodegas()[$this->user_id][$bodega_id] ?? [];
430        return empty($bodega) ? [] : [$bodega_id => $bodega];
431    }
432
433    protected function bodegasConRW(string $bodega_id, string $permiso):array {
434        if (usuarioSupervisaBodega($this->user_id) ) {
435            return $this->permisosBodegaRonyModificar($bodega_id);
436        }
437        $bodegas = $this->traeUsuarioBodegas($bodega_id);
438        return array_filter($bodegas, function ($bodega) use ($permiso) {
439            return $bodega[$permiso] === "R/W";
440        });
441    }
442
443    protected function bodegasConROoRW(string $bodega_id, string $permiso):array {
444        if (usuarioSupervisaBodega($this->user_id) ) {
445            return $this->permisosBodegaRonyConsulta($bodega_id);
446        }
447        $bodegas = $this->traeUsuarioBodegas($bodega_id);
448        return array_filter($bodegas, function ($bodega) use ($permiso) {
449            return $bodega[$permiso] === "R/W" || $bodega[$permiso] === "R/O";
450        });
451    }
452
453    protected function permisosBodegaRonyModificar(string $bodega_id = ''): array
454    {
455        if (empty($bodega_id)) {
456            return $this->getBodegasActivas();
457        }
458        $permiso = $this->getBodegasActivas()[$bodega_id] ?? [];
459        return empty($permiso) ? [] : [$bodega_id => $permiso];
460    }
461
462    protected function permisosBodegaRonyConsulta(string $bodega_id = ''):array {
463        if(empty($bodega_id)) {
464            return $this->getBodegasActivas();
465        }
466            //return $this->getBodegasActivasEInactivas();
467
468        return array_key_exists($bodega_id, $this->getBodegasActivasEInactivas() ) ?
469            [$bodega_id => $this->getBodegasActivasEInactivas()[$bodega_id] ] : [];
470    }
471
472    protected function permisoRW(string $bodega_id, string $permiso):bool {
473        if(usuarioSupervisaBodega($this->user_id))
474            return array_key_exists($bodega_id, $this->getBodegasActivas());
475        $puede = $this->getPermisosPorUsuariosBodegas()[$this->user_id][$bodega_id][$permiso] ?? '';
476        return $puede === 'R/W';
477    }
478
479    protected function permisoConsultar(string $bodega_id, string $permiso):bool {
480        if(usuarioSupervisaBodega($this->user_id)/* || $this->user_id == '86'*/) {
481            $method = __METHOD__;
482            return (bool)ia_singleread("SELECT /*$method*/ 1 FROM bodega WHERE bodega_id=" . strit($bodega_id));
483        }
484        $puede = $this->getPermisosPorUsuariosBodegas()[$this->user_id][$bodega_id][$permiso] ?? '';
485        return $puede === 'R/W' || $puede === 'R/O';
486    }
487
488    /**
489     * @return array|bool [iac_usr_id=>nick, ...]
490     */
491    public static function getSupervisanBodegas(): false|array {
492        return ia_sqlKeyValue("SELECT iac_usr_id, nick FROM iac_usr WHERE vale='Active' AND puede_supervisar_bodega='Si' ORDER BY nick");
493    }
494
495    /*public function tienePermisoPorTienda()
496    {
497        if (usuarioSupervisaBodega($this->usuario_id)) return true;
498
499        $tienda_id = param('tienda_id');
500        if (empty($tienda_id)) return false;
501
502        $permiso = $this->getTienda($tienda_id);
503
504        if (empty($permiso)) return false;
505
506        return true;
507    }
508
509    protected function getTienda($tienda_id = '')
510    {
511        if (empty($tienda_id))
512            $tienda_id = param('tienda_id');
513
514        if (empty($tienda_id)) return [];
515
516        if (!usuarioSupervisaBodega()) {
517            $usuario_id = $_SESSION['usuario_id'];
518            $where_complete = "iac_usr_id = $usuario_id AND";
519        } else {
520            $where_complete = "";
521        }
522
523
524        $query = "SELECT
525                    pc.tienda_id, pc.tienda_id real_data, t.tienda, pc.tienda_id real_value, t.clave, t.clave label, t.clave value
526                FROM iac_usr
527                JOIN plantilla_cobranza pc ON iac_usr.plantillatienda_id=pc.plantillatienda_id AND pc.permiso_cheque IN('Editar', 'Consultar')
528                JOIN tienda t USING(tienda_id)
529                WHERE $where_complete t.vale = 'Active' AND t.tienda_id = " . strit($tienda_id);
530
531        return ia_singleton($query);
532    }*/
533
534    public function puedeUsarOrigenDestinoEspeciales(): bool
535    {
536        if (usuarioSupervisaBodega($this->user_id))
537            return true;
538        $select = "SELECT puede_bodega_destinos_especiales FROM iac_usr WHERE iac_usr_id = ". strit($this->user_id);
539        $permiso = ia_singleread($select, 'No');
540        return $permiso === 'Si';
541    }
542
543    /**
544     * @param string $permiso Si o No
545     * @param array $usuarios_id
546     * @return bool true Ok, false Error
547     */
548    public function setRegistraNotasTodasBodegas(#[ExpectedValues('Si', 'No')] string $permiso, array $usuarios_id):bool {
549        if(empty($usuarios_id))
550            return true;
551        global $gStrIt;
552
553        $method =  __METHOD__;
554        $sql = [];
555        $builder = new IacSqlBuilder();
556        if($permiso === 'Si')
557            $sql[] =
558                "INSERT /*$method*/ INTO permiso_bodega(bodega_id, iac_usr_id, puede_movimientos)
559                     SELECT b.bodega_id, i.iac_usr_id, 'R/W'
560                     FROM bodega b JOIN iac_usr i
561                     WHERE b.activo = 'Si' AND i.vale = 'Active' AND " . $builder->where(['i.iac_usr_id' => $usuarios_id]) . 
562                 ON DUPLICATE KEY UPDATE puede_movimientos = 'R/W'";
563        else {
564            $sql[] =
565                "INSERT /*$method*/ INTO permiso_bodega(bodega_id, iac_usr_id, puede_movimientos)
566                   ( SELECT b.bodega_id, i.iac_usr_id, IF(i.puede_solo_consultar_bodegas = 'Si', 'R/O', 'Nada') as permiso
567                    FROM bodega b JOIN iac_usr i
568                    WHERE b.activo = 'Si' AND i.vale = 'Active' AND " . $builder->where(['i.iac_usr_id' => $usuarios_id]) . ")
569                 ON DUPLICATE KEY UPDATE puede_movimientos = 'Nada'";
570            $sql[] =
571                "UPDATE /*$method*/ permiso_bodega SET puede_movimientos = 'R/O'
572                WHERE puede_movimientos = 'Nada' AND iac_usr_id IN (SELECT iac_usr_id FROM iac_usr WHERE puede_solo_consultar_bodegas = 'Si')";
573        }
574        $sql[] = "UPDATE /*$method*/ iac_usr SET puede_registrar_todas_bodegas = {$gStrIt($permiso)} WHERE " .
575                    $builder->where(['iac_usr_id' => $usuarios_id]);
576        return !ia_transaction($sql);
577    }
578
579    /**
580     * @param string $permiso Si o No
581     * @param array $usuarios_id
582     * @return bool true Ok, false Error
583     */
584    public function setConsultarNotasTodasBodegas(#[ExpectedValues('Si', 'No')] string $permiso, array $usuarios_id):bool {
585        if(empty($usuarios_id))
586            return true;
587        global $gStrIt;
588
589        $method =  __METHOD__;
590        $sql = [];
591        $builder = new IacSqlBuilder();
592        if($permiso === 'Si')
593            $sql[] =
594                "INSERT /*$method*/ INTO permiso_bodega(bodega_id, iac_usr_id, puede_movimientos)
595                     SELECT b.bodega_id, i.iac_usr_id, 'R/O'
596                     FROM bodega b JOIN iac_usr i
597                     WHERE b.activo = 'Si' AND i.vale = 'Active' AND " . $builder->where(
598                         ['i.puede_registrar_todas_bodegas' => 'Nada',  'i.iac_usr_id' => $usuarios_id]
599                ) . 
600                 ON DUPLICATE KEY UPDATE puede_movimientos = 'R/O'";
601        else {
602            $sql[] =
603                "INSERT /*$method*/ INTO permiso_bodega(bodega_id, iac_usr_id, puede_movimientos)
604                   ( SELECT b.bodega_id, i.iac_usr_id, 
605                            IF(i.puede_registrar_todas_bodegas = 'Si', 'R/W', 'Nada') as permiso
606                    FROM bodega b JOIN iac_usr i
607                    WHERE b.activo = 'Si' AND i.vale = 'Active' AND " . $builder->where(['i.iac_usr_id' => $usuarios_id]) . ")
608                 ON DUPLICATE KEY UPDATE puede_movimientos = 'Nada'";
609            $sql[] =
610                "UPDATE /*$method*/ permiso_bodega SET puede_movimientos = 'R/W'
611                WHERE puede_movimientos <> 'R/W' AND iac_usr_id IN (SELECT iac_usr_id FROM iac_usr WHERE puede_registrar_todas_bodegas = 'Si')";
612        }
613        $sql[] = "UPDATE /*$method*/ iac_usr SET puede_solo_consultar_bodegas = {$gStrIt($permiso)} WHERE " .
614            $builder->where(['iac_usr_id' => $usuarios_id]);
615        return !ia_transaction($sql);
616    }
617}