Cada desarrollo es un subdominio individual. La nomenclatura que se estuvo manejando es la siguiente:
1.- Definir un slug para el desarrollo. Ej. Sí el desarrollo se llama Capital Desarrollo, definiríamos el slug como capital.
2.- El subdominio utilizará el slug, Ej. capital.naboo.mx
3.- Las instancias de naboo están almacenadas en una carpeta llamada crm. Todas tienen como nombre de carpeta el slug utilizado para el subdominio seguido de un sufijo app. Ej. capital-app.
naboo_capitalsudo cp /etc/nginx/sites-available/desarrollo-existente.naboo.com /etc/nginx/sites-available/nuevosubdominio.naboo.com
sudo nano /etc/nginx/sites-available/nuevosubdominio.naboo.comserver {
listen 80 default_server;
listen [::]:80 default_server;
root /home/rodrigo/crm/nuevosubdominio-app/public;
# Add index.php to the list if you are using PHP
index index.php index.html index.htm index.nginx-debian.html;
server_name nuevosubdominio.naboo.com www.nuevosubdominio.naboo.com;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
}
location ~ /\.ht {
deny all;
}
}
sudo nginx -t
Debemos obtener de salida:
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
sudo ln -s /etc/nginx/sites-available/nuevosubdominio.naboo.com /etc/nginx/sites-enabled/sudo systemctl reload nginxsudo service nginx restartcrm/mkdir nombre-desarrollo-app git clone https://rodr_locker@bitbucket.org/lockeragency/naboo.git
composer install
.env con las credenciales correspondientes.
NOTA: Es importante definir los siguientes valores para el
.env:
APP_URL=https://misubdominio.naboo.mx(Con la url que le corresponde).
BROADCAST_DRIVER=pusher
MAIL_DRIVER=ses
MAIL_FROM_ADDRESS=no-reply@naboo.mx
MAIL_FROM_NAME=Naboo
AWS_ACCESS_KEY_ID=AKIAXFAZPL2SBCVKRI4P
AWS_SECRET_ACCESS_KEY=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
AWS_DEFAULT_REGION=us-east-1
AWS_BUCKET=
PUSHER_APP_ID=1057969
PUSHER_APP_KEY=2a184977126d0b374437
PUSHER_APP_SECRET=060111e6b38ba257e903
PUSHER_APP_CLUSTER=us2
MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"
CHATAPI_TOKEN=y4sp8odtgrrwvnd0
CHATAPI_URL=https://eu144.chat-api.com/instance162467/
composer install
php artisan key:generate
php artisan migrate
php artisan composer:install
INSERT INTO `users` (`user_id`, `role_id`, `consumer_id`, `picture`, `name`, `surname`, `phone_number`, `email`, `email_verified_at`, `password`, `remember_token`, `created_at`, `updated_at`)
VALUES
(1, 1, 1, 'storage/images/default.png', 'Soporte', 'Naboo', '999123456', 'soporte@naboo.mx', NULL, '$2y$10$jKg0q60NzdV92l3FJs0kxu1jzbYQR1tq40U1EF/sKHJ.03S.BrEY2', NULL, '2021-02-09 11:29:49', '2021-08-02 15:06:46')
INSERT INTO `permission_role_consumers` (`permission_id`, `role_id`, `consumer_id`, `created_at`, `updated_at`)
VALUES
(1, 1, 1, '2021-07-26 11:59:42', '2021-07-26 11:59:42'),
(2, 1, 1, '2021-07-26 11:59:42', '2021-07-26 11:59:42'),
(3, 1, 1, '2021-07-26 11:59:42', '2021-07-26 11:59:42'),
(4, 1, 1, '2021-07-26 11:59:42', '2021-07-26 11:59:42'),
(5, 1, 1, '2021-07-26 11:59:42', '2021-07-26 11:59:42'),
(7, 1, 1, '2021-07-26 11:59:42', '2021-07-26 11:59:42'),
(8, 1, 1, '2021-07-26 11:59:42', '2021-07-26 11:59:42'),
(30, 1, 1, '2021-07-26 11:59:42', '2021-07-26 11:59:42'),
(31, 1, 1, '2021-07-26 11:59:42', '2021-07-26 11:59:42'),
(32, 1, 1, '2021-07-26 11:59:42', '2021-07-26 11:59:42'),
(33, 1, 1, '2021-07-26 11:59:42', '2021-07-26 11:59:42'),
(34, 1, 1, '2021-07-26 11:59:42', '2021-07-26 11:59:42'),
(35, 1, 1, '2021-07-26 11:59:42', '2021-07-26 11:59:42'),
(36, 1, 1, '2021-07-26 11:59:42', '2021-07-26 11:59:42'),
(37, 1, 1, '2021-07-26 11:59:42', '2021-07-26 11:59:42'),
(38, 1, 1, '2021-07-26 11:59:42', '2021-07-26 11:59:42'),
(39, 1, 1, '2021-07-26 11:59:42', '2021-07-26 11:59:42'),
(40, 1, 1, '2021-07-26 11:59:42', '2021-07-26 11:59:42'),
(41, 1, 1, '2021-07-26 11:59:42', '2021-07-26 11:59:42'),
(42, 1, 1, '2021-07-26 11:59:42', '2021-07-26 11:59:42'),
(1, 2, 1, '2021-08-02 15:03:47', '2021-08-02 15:03:47'),
(2, 2, 1, '2021-08-02 15:03:47', '2021-08-02 15:03:47'),
(5, 2, 1, '2021-08-02 15:03:47', '2021-08-02 15:03:47'),
(8, 2, 1, '2021-08-02 15:03:47', '2021-08-02 15:03:47'),
(7, 2, 1, '2021-08-02 15:03:47', '2021-08-02 15:03:47')
INSERT INTO `role_consumers` (`role_id`, `consumer_id`, `name`, `display_name`, `created_at`, `updated_at`)
VALUES
(1, 1, 'administrador', 'Administrador', '2019-07-19 22:21:55', '2019-07-19 22:21:55'),
(2, 1, 'auxiliar_account', 'Vendedor', '2021-07-28 11:03:08', '2021-07-28 11:05:55')
INSERT INTO `permission_consumers` (`permission_id`, `key`, `table_name`, `public_name`, `created_at`, `updated_at`, `type`)
VALUES
(1, 'view_development', 'developments', 'ver desarrollos', '2019-07-09 18:11:09', '2019-07-09 18:11:09', 'builder'),
(2, 'view_contacts', 'contacts', 'ver contactos de clientes', '2019-07-09 18:11:09', '2019-07-09 18:11:09', 'both'),
(3, 'view_roles', 'roles', 'ver roles', '2019-07-09 18:11:09', '2019-07-09 18:11:09', 'both'),
(4, 'view_accounts', 'accounts', 'ver cuentas de usuario', '2019-07-09 18:11:09', '2019-07-09 18:11:09', 'both'),
(5, 'view_bill', 'cotizaciones', 'ver cotizaciones', '2019-07-09 18:11:09', '2019-07-09 18:11:09', 'builder'),
(7, 'view_dashboard', 'dashboard', 'var dashboard', '2019-07-09 18:11:09', '2019-07-09 18:11:09', 'both'),
(8, 'change_status_development', 'developments', 'Cambiar disponibilidad', '2019-07-09 18:11:09', '2019-07-09 18:11:09', 'builder'),
(9, 'view_requests', 'requests', 'Ver Solicitudes', '2019-07-09 18:11:09', '2019-07-09 18:11:09', 'realstate'),
(10, 'view_propiedades', 'propiedades', 'Ver Propiedades', NULL, NULL, 'realstate'),
(11, 'add_propiedades', 'propiedades', 'Agregar Propiedades', NULL, NULL, 'realstate'),
(12, 'update_propiedades', 'propiedades', 'Actualizar Propiedades', NULL, NULL, 'realstate'),
(13, 'delete_propiedades', 'propiedades', 'Eliminar Propiedades', NULL, NULL, 'realstate'),
(14, 'view_category_properties', 'propiedad_categorias', 'Ver Categorías Propiedades', NULL, NULL, 'realstate'),
(15, 'add_category_properties', 'propiedad_categorias', 'Agregar Categorías Propiedades', NULL, NULL, 'realstate'),
(16, 'delete_category_properties', 'propiedad_categorias', 'Eliminar Categorías Propiedades', NULL, NULL, 'realstate'),
(17, 'update_category_properties', 'propiedad_categorias', 'Actualizar Categorías Propiedades', NULL, NULL, 'realstate'),
(18, 'view_zone_properties', 'propertie_zones', 'Ver Zonas', NULL, NULL, 'realstate'),
(19, 'add_zone_properties', 'propertie_zones', 'Agregar Zonas', NULL, NULL, 'realstate'),
(20, 'delete_zone_properties', 'propertie_zones', 'Eliminar Zonas', NULL, NULL, 'realstate'),
(21, 'view_slider', 'sliders', 'Ver Slider', NULL, NULL, 'realstate'),
(22, 'add_slider', 'sliders', 'Agregar Slider', NULL, NULL, 'realstate'),
(23, 'update_slider', 'sliders', 'Modificar Slide', NULL, NULL, 'realstate'),
(24, 'delete_slider', 'sliders', 'Eliminar Slide', NULL, NULL, 'realstate'),
(25, 'view_blog', 'blog', 'Ver Blog', NULL, NULL, 'realstate'),
(26, 'view_propierty_tag', 'etiquetas_propiedads', 'Ver Etiquetas Propiedad', NULL, NULL, 'realstate'),
(27, 'update_propierty_tag', 'etiquetas_propiedads', 'Modificar Etiquetas Propiedad', NULL, NULL, 'realstate'),
(28, 'delete_propierty_tag', 'etiquetas_propiedads', 'Eliminar Etiquetas Propiedad', NULL, NULL, 'realstate'),
(29, 'add_propierty_tag', 'etiquetas_propiedads', 'Agregar Etiquetas Propiedad', NULL, NULL, 'realstate'),
(30, 'add_plan_quoter', 'planes', 'Agregar Planes Cotizador', NULL, NULL, 'builder'),
(31, 'view_plans', 'planes', 'Ver Planes de Financiamiento', NULL, NULL, 'builder'),
(32, 'view_btn_venta_send', 'ventas', 'Ver Boton Solicitud Ventas', NULL, NULL, 'builder'),
(33, 'view_btn_venta', 'ventas', 'Ver Boton Ventas', NULL, NULL, 'builder'),
(34, 'view_btn_venta_status', 'ventas', 'Cambiar Status Ventas', NULL, NULL, 'builder'),
(35, 'view_btn_venta_pendientes', 'ventas', 'Ver ventas pendientes', NULL, NULL, 'builder'),
(36, 'view_btn_venta_aprobadas', 'ventas', 'Ver ventas aprobadas', NULL, NULL, 'builder'),
(37, 'view_btn_venta_rechazados', 'ventas', 'Ver ventas rechazados', NULL, NULL, 'builder'),
(38, 'view_btn_excel', 'ventas', 'Mostrar botón exportar excel', NULL, NULL, 'builder'),
(39, 'edit_venta', 'ventas', 'Editar Venta', NULL, NULL, 'builder'),
(40, 'view_btn_abono', 'ventas', 'Mostrar Boton Abono', NULL, NULL, 'builder'),
(41, 'view_btn_adicional', 'ventas', 'Mostrar Boton Adicional', NULL, NULL, 'builder'),
(42, 'view_btn_descuento', 'ventas', 'Mostrar Boton Descuento', NULL, NULL, 'builder')
INSERT INTO `consumers` (`consumer_id`, `type`, `logo`, `name`, `email`, `phone_number`, `address`, `country`, `state`, `city`, `web_url`, `facebook_url`, `instagram_url`, `twitter_url`, `order`, `watermark`, `status`, `created_at`, `updated_at`)
VALUES
(1, 'builder', 'storage/images/default.jpg', 'Nombre Desarrollo', 'nombre@desarrollo.com', '9993154338', 'Calle Lorem', 'México', 'Yucatán', 'Mérida', '', '', '', NULL, 1, 'storage/images/locker-agencia/eZYLH2faN6cwOJjqjHS4GBNou9SxbNgTog10Hdou.png', 'visible', '2019-08-02 01:37:06', '2019-12-12 21:31:30')
INSERT INTO `consumer_fiscal_data` (`consumer_fiscal_data_id`, `consumer_id`, `person`, `razon_social`, `rfc`, `direccion_fiscal`, `correo`, `uso_cfdi`, `forma_pago`, `created_at`, `updated_at`)
VALUES
(1, 1, 'moral', 'N/A', 'N/A', 'N/A', 'contacto@gmail.com', 'gastos generaless', '04', '2019-08-02 01:37:06', '2019-08-02 01:37:06');
Por defecto, con lo anterior se crea un usuario Administrador, con las siguientes credenciales:
Correo: soporte@naboo.mx
Contraseña: 123456
Los directorios más importantes para cada instancia de naboo son los que se encuentran en: storage/app/development. Ya que ahí está almacenada las lotificaciones de cada desarrollo. Suponiendo tenemos registrado dos desarrollos, nuestros directorios tendrían la siguiente estructura:
storage
└──app
└───development
└───primer-desarrollo
| lotificacion.json
└───segundo-desarrollo
| lotificacion.json
En el storage/public/images están ubicados los archivos relacionados a los planos de cada desarrollo.
storage
└──app
└───public
└───images
└───primer-desarrollo
| plano.svg
| plano_fondo.png
| Atributo | Tipo | Descripción |
|---|---|---|
| version | double | Define como interpretar el json. La versión anterior no contaba con todos los atributos que la versión 2 (estable). |
| lotificacion | array | Arreglo de objetos con la información de cada (#lote) |
| colores | object | Define los colores que tendrán al iniciar el mapa. Los valores aceptaos son: bgDisponible, bgApartado, bgVendido, disponible, apartado, vendido, bgSelected, selected |
| corrida | boolean | Especifica si es posible generar las corridas financieras (mantener true si es versión 2) |
| Atributo | Tipo | Descripción |
|---|---|---|
| id | integer | Identificador único para el lote. |
| nombre | string | Nombre a visualizar del lote |
| precio | double | Precio base del lote (Por lo general es el precio de contado). Pueden haber escenarios en el que el precio base no es el de contado sino el de algún plan de financiamiento. Significa que tienen creado planes de financiamiento con descuentos. |
| metros | double | Metros cuadrados del lote |
| status | string | Disponibilidad del lote, valores aceptados: disponible, apartado, vendido |
| Atributo | Tipo | Descripción |
|---|---|---|
| id | integer | Identificador único |
| nombre | varchar | Nombre a visualizar |
| tipo | varchar | Tipo de financiamiento, valores aceptados: contado, financiamiento |
| porcentaje_descuento | double | Monto a descontar al precio base |
| porcentaje_interes | double | Monto a incrementar al precio base |
| tipo_enganche | varchar | Modelo en el que se descontará el enganche al precio toal, los valores aceptados son: porcentaje, cantidad |
| enganche | double | Valor a descontar del precio total |
| cuota_apertura | double | Descontinuado |
| mensualidad | integer | Cantidad de meses a financiar (en caso de aplicar) |
| pago_mensual | double | Monto a pagar mensualmente (descontinuado) |
| apartado_minimo | double | Monto a pagar para apartar |
| vigencia | varchar | Texto para vigencia |
| restricciones | varchar | Texto para restricciones |
| monto_anualidad | double | Monto de pago por anualidad |
| anualidad | integer | Cantidad de anualidades disponibles para el plan |
| e_pago_diferido | integer | Cantidad de pagos a diferir el enganche |
| saldo | double | Porcentaje del saldo que se espera |
Sí es necesario modificar algunos de los campos del modal que se generá, será necesario actualizar el .js correspondiente, ya que el modal y el mapa del cotización se generán automáticamente con JS.
El archivo a modificar es el que se encuentra en: /resources/js/panel/CalculadoraLocker.js. El modal es generado en la función createNabooQuoter(_lotes).
Para hacer válidos nuestros cambios, será necesario ejecutar el siguiente comando:
npm run prod
El comando anterior nos generará un archivo en /public/app-assets/js/custom/calc.js.
Para poder visualizar un cotizador en un sitio web, necesitaremos varios elementos. El primero es la apikey del desarrollo; esa se encuentra en la base de datos de la tabla developments (se crea automáticamente al crear un nuevo desarrollo), supongamos que es: xqd045EyATnXiELU1aaINOPONK1N1el9.
Necesitamos tener listo el subdominio, y haber finalizado el proceso de instalación para la instancia de naboo. Supongamos que estaremos trabajando en el subdominio: https://emedos.naboo.mx. El script que se encargá de generar el cotizador se encontraría en: https://emedos.naboo.mx/app-assets/js/custom/calc.js
Luego necesitamos generar un base64 con la url de la api que consultaremos, por ejemplo, supongamos que tenemos nuestro subdominio listo https://emedos.naboo.mx/api/. Esto lo codificamos a base64 y otbenemos el siguiente valor que será nuestro appId: aHR0cHM6Ly9lbWVkb3MubmFib28ubXgvYXBpLw==
Una vez teniendo listo estos dos datos, en el sitio web que deseamos instalar definimos un elemento dentro del <body> con la siguiente estructura (Sustituir los valores, del appId, apikey y el JS que usaremos con los que obtuvimos):
<div id="masterplan" style="background:url('https://3dbionotes.cnb.csic.es/images/loading.gif');background-repeat: no-repeat;background-position: center;background-size: contain;min-height: 40rem;">
<!-- Contenido creado dinamicamente con JS (se debe mantener vacío) -->
</div>
Después de cerrar la etiqueta </body> agregar los siguientes scripts:
<script src="https://code.jquery.com/jquery-3.2.1.slim.min.js" integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js" integrity="sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q" crossorigin="anonymous"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js" integrity="sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl" crossorigin="anonymous"></script>
<!-- Modificar esta url con el subdominio que corresponde!!! -->
<script src="https://emedos.naboo.mx/app-assets/js/custom/calc.js"></script>
<script>
window.onload = () => {
let calc = new CalculadoraLocker({
appId: 'aHR0cHM6Ly9lbWVkb3MubmFib28ubXgvYXBpLw==',
apikey: 'xqd045EyATnXiELU1aaINOPONK1N1el9',
target: '#masterplan'
});
}
</script>
Una vez teniendo esto el mapa debe ser visible en el sitio web.