Herramientas Informaticas

Etiqueta: PHP Página 7 de 8

MANUAL PARA CREADOR DE CATÁLOGOS PARA EL SISTEMA DE PUNTO DE VENTA JCPOS 2021

Anteriormente para crear un simple catalogo en el sistema de punto de venta hecho en PHP JCPOS2021 tardábamos algo de tiempo ya que teníamos que crear el modelo la vista y el controlador totalmente a mano.

Todo eso quedo atrás ya que hemos creado una herramienta que hará todo ese código en automático, solo necesitamos crear la tabla, siempre tenemos que poner la primer columna con el nombre de “id” que sea primera e autoincrementable.

Ya después de allí creamos las demás columnas como varchar, ya despues si es datatime o otro tipo de dato lo podemos cambiar después.

Este programa fue desarrollado en el lenguaje Gambas3, luego les dejo un tutorial con el fuente de como se hizo, es necesario tener Linux para hacer funcionar este programa y tener instalado Gambas3.

Si ya tienen Linux y el Gambas3 instalado pueden descargar el creador de catálogos.

Ahora el manual de uso, simularemos que crearemos el catalogo de proveedores, entonces lo primero que se tiene que hacer es crear la tabla proveedores, con el primer campo llamado id que debe ser primaria y autoincrementable, les dejo el codigo de ejemplo de como creamos la tabla en phpmyadmin

CREATE TABLE `pos`.`proveedores` ( `id` INT NOT NULL AUTO_INCREMENT ,  `nombre` VARCHAR(256) NULL ,  `apellido` VARCHAR(256) NULL ,  `direccion` VARCHAR(256) NULL ,    PRIMARY KEY  (`id`)) ENGINE = InnoDB;

Ahora ejecutamos el programa, en mi caso no sale el icono pero es problema de mi sistema operativo.

En mi caso no se ve el icono pero no es problema, el programa funciona igual
Al abrirse el programa se mostrara como se muestra en la imagen
Nos vamos al menú Archivo ->Configuración y nos saldrá esta ventana en donde escribimos los datos de conexión a la base de datos
No posicionamos en donde esta el fuente, escribimos el nombre de la tabla en el campo Nombre Tabla: y le damos al botón Generar Catalogo
Vemos como ya se crearon los archivos
Ahora solo agregamos manualmente la ruta de proveedores en el archivo plantilla.php
Ahora agregamos el en menú para poder usarlo
Y listo ya tenemos nuestro catalogo listo para hacerle altas bajas y cambios

CAMBIOS TÉCNICOS JCPOS 2021 TABLA CLASES

El objetivo de este cambio es para usar una herramienta que nos permitirá crear catálogos de una forma mas rápida de forma automática.

Normalmente hacer un simple catalogo nos puede llevar alrededor de una hora como mínimo

Con esta futura herramienta nos podría llevar solo 10 minutos y solo para arreglar los detalles estéticos

Cambios en la base de datos

Cambio en la tabla clases

ALTER TABLE `clases` CHANGE `id` `id` INT(11) NOT NULL AUTO_INCREMENT, add PRIMARY KEY (`id`);


INSERT INTO `clases` (`id`, `clase`) VALUES
(1, 'controladores/plantilla.controlador.php'),
(2, 'controladores/usuarios.controlador.php'),
(3, 'controladores/categorias.controlador.php'),
(4, 'controladores/productos.controlador.php'),
(5, 'controladores/clientes.controlador.php'),
(6, 'controladores/ventas.controlador.php'),
(7, 'controladores/utilerias.controlador.php'),
(8, 'controladores/empresa.controlador.php'),
(9, 'controladores/perfiles.controlador.php'),
(10, 'controladores/CorreoSaliente.controlador.php'),
(11, 'controladores/pagos.controlador.php'),
(12, 'controladores/caja.controlador.php'),
(13, 'modelos/usuarios.modelo.php'),
(14, 'modelos/categorias.modelo.php'),
(15, 'modelos/productos.modelo.php'),
(16, 'modelos/clientes.modelo.php'),
(17, 'modelos/ventas.modelo.php'),
(18, 'modelos/empresa.modelo.php'),
(19, 'modelos/correo.modelo.php'),
(20, 'modelos/perfiles.modelo.php'),
(21, 'modelos/pagos.modelo.php'),
(22, 'modelos/bitacora.modelo.php'),
(23, 'modelos/caja.modelo.php'),
(24, 'extensiones/vendor/autoload.php');

Cambios en el archivo index.php para leer las clases desde la tabla en lugar de tenerlas escritas directamente

Se remplazo el siguiente codigo:



require_once "controladores/plantilla.controlador.php";
require_once "controladores/usuarios.controlador.php";
require_once "controladores/categorias.controlador.php";
require_once "controladores/productos.controlador.php";
require_once "controladores/clientes.controlador.php";
require_once "controladores/ventas.controlador.php";
require_once "controladores/utilerias.controlador.php";
require_once "controladores/empresa.controlador.php";
require_once "controladores/perfiles.controlador.php";
require_once "controladores/CorreoSaliente.controlador.php";
require_once "controladores/pagos.controlador.php";
require_once "controladores/bitacora.controlador.php";
require_once "controladores/caja.controlador.php";


require_once "modelos/usuarios.modelo.php";
require_once "modelos/categorias.modelo.php";
require_once "modelos/productos.modelo.php";
require_once "modelos/clientes.modelo.php";
require_once "modelos/ventas.modelo.php";
require_once "modelos/empresa.modelo.php";
require_once "modelos/correo.modelo.php";
require_once "modelos/perfiles.modelo.php";
require_once "modelos/pagos.modelo.php";
require_once "modelos/bitacora.modelo.php";
require_once "modelos/caja.modelo.php";
require_once "extensiones/vendor/autoload.php";

Por este código:

foreach ($clases as $key => $value) {

  if (!file_exists($value["clase"])){

      $mensaje = "EL ARCHIVO ".strtoupper($value["clase"])." NO EXISTE";

        echo '<!DOCTYPE html> <html lang=&quot;es&quot;>
              <head>
              <meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=utf-8&quot; />
              <meta name=&quot;description&quot; content=&quot;&quot; />
              <style>             ::-moz-selection {background: #b3d4fc; text-shadow: none;}             ::selection {background: #b3d4fc; text-shadow: none;}
              html {padding: 30px 10px; font-size: 16px; line-height: 1.4; color: #737373; background: #f0f0f0;
              -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%;}             html,
              input {font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;}             body
              {max-width:700px; _width: 700px; padding: 30px 20px 50px; border: 1px solid #b3b3b3;
              border-radius: 4px;margin: 0 auto; box-shadow: 0 1px 10px #a7a7a7, inset 0 1px 0 #fff;                 background: #fcfcfc;}
              h1 {margin: 0 10px; font-size: 50px; text-align: center;}             h1 span {color: #bbb;}
              h2 {color: #D35780;margin: 0 10px;font-size: 40px;text-align: center;}             h2 span {color: #bbb;font-size: 80px;}
              h3 {margin: 1.5em 0 0.5em;}             p {margin: 1em 0;}             ul {padding: 0 0 0 40px;margin: 1em 0;}             .container
              {max-width: 380px;_width: 480px;margin: 0 auto;}             input::-moz-focus-inner {padding: 0;border: 0;}         </style>     </head>
              <body>         <div class=&quot;container&quot;>             <h2><span>500</span> Error interno del servidor</h2>
              <p>¡Vaya! Algo salió mal.<br /><br />'.$mensaje.'.</p>
              </div>
              </body>
              </html>';
      return;
  }

     require_once $value["clase"];

}

Y eso seria todo, es importante actualizar por que en un futuro cercano nos servira

CAMBIOS PUNTO DE VENTA JCPOS 2021 ARQUEO DE CAJA

Se han hecho algunos cambios significativos al arqueo de caja y son los siguientes

Se agrego una opción en datos empresa para especificar si se va usar el arqueo se caja, en caso de que no este activado se podrá realizar una venta aunque no este abierta una caja

En configuración ->Datos empresa definimos si se validara el arqueo de caja

En arqueo de caja se agrego para poder escoger con que usuario/vendedor se abrirá la caja, antes solo se podía abrir con el usuario con el que se inicio sesión

De lado izquierdo vemos como abrimos la caja con el usuario asd y en el centro vemos como podemos escoger con un combo el usuario/vendedor

En el fuente archivo configuración.php se agrego una constante llamada debug, lo ideal si tenemos el programa en XAMPP es que esa variable este como false, pero si queremos debugear directamente con PHP sin utilizar el archivo .htaccess debemos ponerlo en true

normalmente debe de estar como false

Se agrego el campo caja en datosempresa lo puede agregar con el siguiente código SQL

ALTER TABLE `datosempresa` ADD `caja` VARCHAR(5) NULL AFTER `diasEntrega`;

COMO REGRESAR ARCHIVOS DEL CÓDIGO FUENTE A UNA VERSIÓN ANTERIOR

En algunas ocasiones hacemos cambios nuevos en el fuente y el resultado no es satisfactorio, como es el caso de agregarle la función de guardar las imágenes directamente en la base de datos, en nuestro caso el resultado fue que funciono mas lento, ya que no queda de otra que volver a la versión anterior.

Esto no sera problema en nuestro caso ya que manejamos la tecnología GIT, y en nuestro caso con Netbeans sera mucho mas fácil volver a la versión anterior.

Primero listamos los archivos que modificamos que serian los siguientes.

  1. controladores/usuarios.controlador.php
  2. vistas/usuarios.php
  3. vistas/cabezote.php
  4. vistas/menu.php
  5. ajax/usuarios.ajax.php
  6. modelos/usuarios.modelo.php

Buscamos el commit donde no tenia los cambios que no deseamos y le damos click y luego revert y así con todos los archivos que hicimos cambios.

Por ultimo eliminamos el campo archivoFoto de la tabla usuarios con este comando

ALTER TABLE `usuarios` DROP `archivoFoto`;

Y bien seria todo el cambio por hoy les dejo el fuente para que lo puedan descargar y el demo, saludos y espero que les sea de utilidad

ACTUALIZAR IMAGEN EN CAMPO MYSQL

Ya hicimos el insert en la base de datos del archivo de la imagen, tambien la mostramos en las vistas, ahora sigue hacer la modificacion “UPDATE” en la base de datos
FORO

https://foro.cesarsystems.com.mx/
DISCORD

https://discord.gg/7cJSkMxA

FACEBOOK
https://www.facebook.com/rasec555

TWITTER
https://twitter.com/JulioLeyvaR

CHANNEL TELEGRAM
https://telegram.me/CesarSystems

PAGINA WEB
https://cesarsystems.com.mx

TWITCH
https://www.twitch.tv/bardack21

DLIVE
https://dlive.tv/JulitoLeyva

ODYSEE
https://odysee.com/@JulioCesarLeyvaRodriguez:9

Select2 Con Server Side Miles de registros en el ComboBox

Cuando se requiere poner miles o cientos de miles de options en un select no es bueno ponerlos todos ya que la carga de la pagina y la pagina misma se pondría lenta

La mejor opción es ponerlo via ajax y solo muestre de 5 a 10 registros cuando se haga la busqueda, a continuación mostraremos como hacerlo, basado en el sistema de punto de venta POS 2021, usando el modelo vista controlador

Ejemplo

CREATE TABLE `unidadMedidasSAT` (
  `id` bigint(20) NOT NULL,
  `c_ClaveUnidad` varchar(3) DEFAULT NULL,
  `Nombre` varchar(106) DEFAULT NULL,
  `Descripción` varchar(551) DEFAULT NULL,
  `Nota` varchar(221) DEFAULT NULL,
  `Fecha de inicio de vigencia` varchar(10) DEFAULT NULL,
  `Fecha de fin de vigencia` varchar(10) DEFAULT NULL,
  `Símbolo` varchar(21) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Insertando datos



INSERT INTO `unidadMedidasSAT` (`id`, `c_ClaveUnidad`, `Nombre`, `Descripción`, `Nota`, `Fecha de inicio de vigencia`, `Fecha de fin de vigencia`, `Símbolo`) VALUES
(1, '18', 'Tambor de cincuenta y cinco galones (EUA)', NULL, 'Las unidades marcadas como borradas en el catálogo internacional de UNECE, serán retenidas indefinidamente en las listas de códigos. En su caso, estas unidades podrán ser reinstalado a través del proceso de mantenimiento.', '13/08/2017', NULL, NULL),
(2, '19', 'Camión cisterna', NULL, 'Las unidades marcadas como borradas en el catálogo internacional de UNECE, serán retenidas indefinidamente en las listas de códigos. En su caso, estas unidades podrán ser reinstalado a través del proceso de mantenimiento.', '13/08/2017', NULL, NULL),
(3, '26', 'Tonelada real', NULL, 'Las unidades marcadas como borradas en el catálogo internacional de UNECE, serán retenidas indefinidamente en las listas de códigos. En su caso, estas unidades podrán ser reinstalado a través del proceso de mantenimiento.', '13/08/2017', NULL, NULL),
(4, '29', 'Libra por mil pies cuadrados', NULL, 'Las unidades marcadas como borradas en el catálogo internacional de UNECE, serán retenidas indefinidamente en las listas de códigos. En su caso, estas unidades podrán ser reinstalado a través del proceso de mantenimiento.', '13/08/2017', NULL, 'Lb / kft²'),
(5, '30', 'Día de potencia de caballos por tonelada métrica de aire seco', NULL, 'Las unidades marcadas como borradas en el catálogo internacional de UNECE, serán retenidas indefinidamente en las listas de códigos. En su caso, estas unidades podrán ser reinstalado a través del proceso de mantenimiento.', '13/08/2017', NULL, NULL),
(6, '31', 'Pescar', NULL, 'Las unidades marcadas como borradas en el catálogo internacional de UNECE, serán retenidas indefinidamente en las listas de códigos. En su caso, estas unidades podrán ser reinstalado a través del proceso de mantenimiento.', '13/08/2017', NULL, NULL),
(7, '32', 'Kilogramo por tonelada métrica seca del aire', NULL, 'Las unidades marcadas como borradas en el catálogo internacional de UNECE, serán retenidas indefinidamente en las listas de códigos. En su caso, estas unidades podrán ser reinstalado a través del proceso de mantenimiento.', '13/08/2017', NULL, NULL),
(8, '36', 'Pie cúbico por minuto por pie cuadrado', 'Se requiere factor de conversión', 'Las unidades marcadas como borradas en el catálogo internacional de UNECE, serán retenidas indefinidamente en las listas de códigos. En su caso, estas unidades podrán ser reinstalado a través del proceso de mantenimiento.', '13/08/2017', NULL, 'Ft³ / (min / ft²)'),
(9, '44', 'Bolsa a granel de quinientos kilos', NULL, 'Las unidades marcadas como borradas en el catálogo internacional de UNECE, serán retenidas indefinidamente en las listas de códigos. En su caso, estas unidades podrán ser reinstalado a través del proceso de mantenimiento.', '13/08/2017', NULL, NULL),
(10, '45', 'Bolsa a granel de trescientos kilos', NULL, 'Las unidades marcadas como borradas en el catálogo internacional de UNECE, serán retenidas indefinidamente en las listas de códigos. En su caso, estas unidades podrán ser reinstalado a través del proceso de mantenimiento.', '13/08/2017', NULL, NULL),
(11, '46', 'Bolsa a granel de cincuenta libras', NULL, 'Las unidades marcadas como borradas en el catálogo internacional de UNECE, serán retenidas indefinidamente en las listas de códigos. En su caso, estas unidades podrán ser reinstalado a través del proceso de mantenimiento.', '13/08/2017', NULL, NULL);

HTML

<div class="form-group">
                            <span class="input-group-addon">Unidad De Medida SAT</span>


                            <select class="form-control input-lg nuevoUnidades select2 " id="nuevoUnidades" name="nuevoUnidades" required style="width: 100%;"> 

                                <option value="">Selecionar unidades</option>



                            </select>


                        </div>

<script src="vistas/js/productos.js"></script>

JAVASCRIPT


// TRAE EL CODIGO DE LAS UNIDADES 
$('.nuevoUnidades').select2({
  ajax: {
    url: 'ajax/autocompletarUnidades.php',
    dataType: 'json'
    // Additional AJAX parameters go here; see the end of this chapter for the full code of this example
  }
});

AJAX


<?php

require_once "../modelos/unidadMedidasSAT.modelo.php";


if(isset($_GET["term"])){
    $buscar = "%".$_GET["term"]."%";
}else{
    $buscar ="%%";
}


$datos = ModeloUnidadMedidasSAT::mdlMostrarAjax("unidadMedidasSAT", $buscar);


//echo json_encode($datos);



$jsonVariable =' { "results": [';

foreach ($datos as $key => $value) {
    
    $jsonVariable .=' {
      "id": '.$value["id"].',
      "text": "'.$value["text"].'"
    },';
    
    
}
      $jsonVariable = substr($jsonVariable, 0, -1);


$jsonVariable .= ' ]
}';

echo $jsonVariable; 

Modelo


<?php
require_once "conexion.php";

Class ModeloUnidadMedidasSAT {



   
     /* =============================================
     MOSTRAR UNIDADMEDIDASSAT
      ============================================= */

    Static Public Function mdlMostrarAjax($tabla, $buscar) {

       If ($buscar != Null) {

           $stmt = Conexion:: conectar() -> prepare( "Select id
,Nombre as text

           From unidadMedidasSAT a WHERE Nombre like :buscar  limit 10");  

             $stmt -> bindParam( ":buscar" , $buscar, PDO::PARAM_STR);

           Try {
               $stmt -> execute();

                Return $stmt -> fetchAll();
           } Catch (PDOException $e) {

               $arr = $stmt -> errorInfo();
                $arr[3] = " Error ";

               If ($e -> getMessage() == 23000) {
                   $mensaje = " El registro esta duplicado, Favor de checar el numero de nomina ";
                   Return $mensaje;
               } Else {
                  Return $arr[2];
              }
           }
           
           
       } Else {

           $stmt = Conexion:: conectar() -> prepare("Select id
,Nombre as text

           

           From unidadMedidasSAT a limit 10 "); 

           $stmt -> execute();

           Return $stmt -> fetchAll();
       }


       $stmt -> close();

        $stmt = Null;
   }


}

Archivo Conexión



<?php
include_once "../configuracion.php";

include_once "../../../configuracion.php";

include_once "../../configuracion.php";
class Conexion{

	static public function conectar(){

		
            try { 
                
                $link = new PDO("mysql:host=".BD_HOST.";dbname=".BD_NOMBRE."",
                    BD_USUARIO,
                   BD_CONTRA);
                }
            catch (PDOException $e){
                
                
                if($e->getCode()==2002){
                    echo '<!DOCTYPE html> <html lang=&quot;es&quot;>      
                    <head> 		
                    <meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=utf-8&quot; /> 		
                    <meta name=&quot;description&quot; content=&quot;Esta Tienda está desarrollada con PrestaShop&quot; />         
                    <style>   s          ::-moz-selection {background: #b3d4fc; text-shadow: none;}             ::selection {background: #b3d4fc; text-shadow: none;}        
                    html {padding: 30px 10px; font-size: 16px; line-height: 1.4; color: #737373; background: #f0f0f0;                
                    -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%;}             html,             
                    input {font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;}             body 
                    {max-width:700px; _width: 700px; padding: 30px 20px 50px; border: 1px solid #b3b3b3;                 
                    border-radius: 4px;margin: 0 auto; box-shadow: 0 1px 10px #a7a7a7, inset 0 1px 0 #fff;                 background: #fcfcfc;}            
                    h1 {margin: 0 10px; font-size: 50px; text-align: center;}             h1 span {color: #bbb;}            
                    h2 {color: #D35780;margin: 0 10px;font-size: 40px;text-align: center;}             h2 span {color: #bbb;font-size: 80px;}            
                    h3 {margin: 1.5em 0 0.5em;}             p {margin: 1em 0;}             ul {padding: 0 0 0 40px;margin: 1em 0;}             .container 
                    {max-width: 380px;_width: 480px;margin: 0 auto;}             input::-moz-focus-inner {padding: 0;border: 0;}         </style>     </head>     
                    <body>         <div class=&quot;container&quot;>             <h2><span>500</span> Error interno del servidor</h2>             
                    <p>¡Vaya! Algo salió mal.<br /><br />No se pudo conectar con la base de datos, revise los datos de conexion.</p>         
                    </div>     
                    </body> 
                    </html>';
                }
                
                
                return "ERROR DE CONEXION";
             
            }

		$link->exec("set names utf8");

		return $link;
                
        
	}

}

MAS CORRECCIONES Y AGRADECIMIENTOS 26

Saludos camaradas, en este vídeo se verán algunas correcciones al sistema así como un nuevo panel para los colaboradores Saludos y esperemos que les sirva

Ver demo en linea
http://pos.cesarsystems.com.mx/

CORRECCIÓN EN EL REPORTE DE VENTAS POR FECHA 14

En este vídeo se vera como se hace la corrección del reporte de ventas con productos
Les dejo el fuente en los comentarios
Ver demo en linea
http://pos.cesarsystems.com.mx/
Pueden seguirme en las siguientes redes sociales
VK
https://vk.com/id543521033
FACEBOOK
https://www.facebook.com/rasec555
TWITTER
https://twitter.com/JulioLeyvaR
CHANNEL TELEGRAM
https://telegram.me/CesarSystems
PAGINA WEB
https://cesarsystems.com.mx
MOVIL
+52 6688612348

GITHUB EN NETBEANS 12 Clone, Push, Pull

Bien ahora veremos el uso del Git GitHub , las cuales nos darán muchas ventajas significativas en contraste a como guardábamos los cambios antes, continuación veremos las ventajas.

QUITAR EL NUMERO DE RENGLON DEL CODIGO FUENTE CON SUBLIME Y EXPRESIONES REGULARES

INTRODUCCIÓN

Es muy común que cuando volvemos a ver algún fuente que subimos antiguamente en nuestro blog y o necesitamos de nuevo algunas veces esta con el numero de renglón y cuando el código es muy extenso es muy difícil quitar uno a uno el numero de renglón.

OBJETIVO

Remplazar el numero de renglón por un espacio en blanco usando las expresiones regulares en sublime

Página 7 de 8

Creado con WordPress & Tema de Anders Norén