plxdcma_eshop
Version:
Instala todo lo necesario para una tienda virtual
752 lines (694 loc) • 24.6 kB
JavaScript
var memorymanager=require(`./memorymanager.js`)
let plxsessions=require(`plxdcma_sessions`)
let sqltableinstalers=require(`plxdcma_sqltableinstalers`)
var plxdcma_dbclient=require(`plxdcma_dbclient`)
var plxdcma_standarinit=require(`plxdcma_standarinit`)
var plxdcma_accessmanager=require(`plxdcma_accessmanager`)
var myux=require(`plxdcma_myux`)
let dbclient=require(`plxdcma_dbclient`)
let imagepicker=require(`plxdcma_imagesmanager`)
var guardarImagen=imagepicker.guardarImagen
let urlgen=require(`plxdecma_urlcodegen`)
var path=require(`path`)
var fs=require(`fs`)
var products=dbclient.table("products")
var tables=dbclient.table("facturas")
sqltableinstalers.add([path.join(__dirname,"dbcreates")])
function doesItExist(databasename,tablename,handler){
var pool=plxdcma_standarinit.pool
pool.query(`SELECT count(*) as x FROM information_schema.TABLES WHERE TABLE_SCHEMA LIKE 'eshop' AND TABLE_TYPE LIKE 'BASE TABLE' AND TABLE_NAME = 'facturas';`,function(er,resutl){
handler(resutl[0].x > 0)
})
}
function proceedToRegisterStandars(perfilId,productId,usuariosDefaultStandares,standares,conclusion){
var pool=plxdcma_standarinit.pool
var productid=productId
//var standares=standares
var estandares=standares
for(var each in estandares){
estandares[each][0]=productid
}
var pendingPromises=[]
for(var i = 0 ; i < estandares.length;i++){
var tx=estandares[i][3]
var wasInside=false
for(var each2 in usuariosDefaultStandares){
var t=usuariosDefaultStandares[each2]
if(t.text == tx){
standares[each][3]=t.id
wasInside=true
break
}
}
if(wasInside == false){
pendingPromises.push(new Promise(function(resolve,reject){
var array=standares[i]
pool.query(`insert into productos_perfil_regproducts_standaroptions set ? `,{perfil:perfilId,texto:array[3]},function(er,result){
if(er != null){
console.log(er)
}
usuariosDefaultStandares.push({
text:this.array[3],
id:result.insertId
})
resolve(result.insertId)
}.bind({array:array}))
}))
}
}
Promise.all(pendingPromises).then(function(){
pool.query(`delete from productos_estandares where product = ${productId}`,function(){
pool.query(`insert into productos_estandares(product,precio,inventario,option) values ? `,[estandares],function(e,r){
conclusion(r)
})
})
})
}
function proceedToRegisterProduct(req,res){
var userinsession=plxsessions.usuarioEn(req,res)
var perfilId=userinsession.perfil.id
var usuariosDefaultStandares=userinsession.usuariosDefaultStandares
if(usuariosDefaultStandares == null){
usuariosDefaultStandares=[]
userinsession.usuariosDefaultStandares=usuariosDefaultStandares
}
var nombre =req.body.nombre;
var descripcion =req.body.descripcion;
var currency =req.body.currency ?? req.body.moneda;
var moneda=currency
var caracteristics=req.body.caracteristics ?? req.body.caracteristicas;
var imagesStrings =req.body.images
var estandares =req.body.standares;
var urlofProduct=urlgen().toLowerCase()
var spromesas=[]
var pool=plxdcma_standarinit.pool
var inserting={
nombre:nombre,
descripcion:descripcion,
url:urlofProduct,
shop:userinsession.currentShop.id
}
pool.query(`insert into productos set ? `,inserting,function(er,result){
if(er != null){
console.log(`Er`)
console.log(er)
}
var estandares=req.body.standares
var standares=estandares
inserting.id=result.insertId
var productid=result.insertId
for(var each in estandares){
estandares[each][0]=productid
}
var pendingPromises=[]
for(var i = 0 ; i < estandares.length;i++){
var tx=estandares[i][3]
if(tx == null || tx == ""){
tx=tx.toLowerCase().trim("")
}
estandares[i][3]=tx
var wasInside=false
for(var each2 in usuariosDefaultStandares){
var t=usuariosDefaultStandares[each2]
if(t.texto == tx){
estandares[i][3]=t.id
wasInside=true
break
}
}
if(wasInside == false){
pendingPromises.push(new Promise(function(resolve,reject){
var array=estandares[i]
pool.query(`insert into productos_perfil_regproducts_standaroptions set ? `,{perfil:perfilId,texto:array[3]},function(er,result){
if(er != null){
console.log(er)
}
usuariosDefaultStandares.push({
texto:this.array[3],
id:result.insertId
})
this.array[3]=result.insertId
resolve()
}.bind({array:array}))
}))
}
}
Promise.all(pendingPromises).then(function(){
if(userinsession.myshop == null){
userinsession.myshop={}
}
userinsession.myshop.previewProduct=inserting
var finalizingPromises=[]
var insertid=inserting.id
var insertscaracteristicas=[]
for(var each in caracteristics){
var c=caracteristics[each]
insertscaracteristicas.push([productid,c])
}
pool.query(`insert into productos_estandares(product,precio,inventario,texto,moneda) values ? `,[estandares])
if(insertscaracteristicas.length > 0){
pool.query(`insert into productos_caracteristicas(product,caracteristics) value ? `,[insertscaracteristicas])
}
if(module.exports.onProductDidRegister != null){
module.exports.onProductDidRegister(inserting,req,res,function(){
res.json({
state:true,
id:result.insertId,
url:urlofProduct
})
})
}else{
res.json(reutnrmsg)
}
})
})
}
plxdcma_accessmanager.onLogin(function(sessionObject,conclusion){
var pool=plxdcma_standarinit.pool
pool.query(`select id,texto from productos_perfil_regproducts_standaroptions where perfil = ${sessionObject.perfil.id}`,function(er,result){
if(er != null){
console.log(`er `)
console.log(er)
}
sessionObject.usuariosDefaultStandares=result
console.log(`running on login`)
conclusion()
})
})
plxdcma_standarinit.use(function(app,interfacingfunction){
app.get(`/myshop.js`,function(req,res){
fs.readFile(path.join(__dirname,"public","js","init.js"),"utf8",function(err,html){
res.write(html)
res.end()
})
})
app.get(`/myshop/register/product.js`,function(req,res){
var promesas=[]
promesas.push(new Promise(function(accept,reject){
fs.readFile(path.join(__dirname,"public","js","registingproduct","posting.js"),"utf8",function(err,html){
accept(html)
})
}))
promesas.push(new Promise(function(accept,reject){
fs.readFile(path.join(__dirname,"public","js","registrymanager.js"),"utf8",function(err,html){
accept(html)
})
}))
Promise.all(promesas).then(function(results){
fs.readFile(path.join(__dirname,"productregistrymodal.ejs"),"utf8",function(err,html){
var xz="`"+html+"`"
var ntext=`
window.addEventListener('load',function(){
var dx=document.createElement("div")
dx.innerHTML=${xz}
document.body.appendChild(dx)
})
`
res.write(`${results.join("")} ${ntext}`)
res.end()
})
})
})
app.get(`/myshop/register/product.css`,function(req,res){
fs.readFile(path.join(__dirname,"public","css","productregistry.css"),"utf8",function(err,html){
res.write(html)
res.end()
})
})
app.get(`/myshop/main.css`,function(req,res){
fs.readFile(path.join(__dirname,"public","css","main.css"),"utf8",function(err,html){
res.write(html)
res.end()
})
})
app.post(`/myshop/myproductstandars`,function(req,res){
var s=plxsessions.usuarioEn(req,res)
if(s == null || s.perfil == null){
res.json({state:0,msg:"nope"})
return
}
var pool=plxdcma_standarinit.pool
pool.query(`select id,texto from productos_perfil_regproducts_standaroptions where perfil = ${s.perfil.id}`,function(er,r){
res.json(r)
})
})
app.post(`/myproduct/add/image`,function(req,res){
var imageurl=urlgen().toLowerCase()
var data=req.body
var userinsession=plxsessions.usuarioEn(req,res)
var productId=userinsession.myshop.previewProduct.productId ?? userinsession.myshop.previewProduct.id;
var pool=plxdcma_standarinit.pool
if(data.length == null){
data=[data]
}
var urls=[]
var promesas=[]
for(var i = 0 ; i < data.length;i++){
var imageurl=urlgen().toLowerCase()
urls.push(imageurl)
guardarImagen(`${imageurl}`,data[i])
promesas.push(new Promise(function(resolve, reject) {
pool.query(`insert into mediaresource set ?`,{
owner:userinsession.perfil.id,
url:imageurl
},function(er,insert){
resolve(insert.insertId)
})
}))
}
res.json(urls)
memorymanager.articulosImagesMemoryArray.search(function(item){
if(item[0].id_ == productId){
item.push({id_:productId,_id:imageurl})
return true
}
})
Promise.all(promesas).then(function(insertIds){
var ars=[]
for(var each in insertIds ){
ars.push([productId,insertIds[each]])
}
pool.query(`insert into productos_recursos(id_,_id) values ?`,[ars])
})
})
app.post(`/myshop/reg/product`,function(req,res){
if(module.exports.canProductBeRegistered != null){
module.exports.canProductBeRegistered(req,res,function(itCan,messageDown){
if(itCan){
proceedToRegisterProduct(req,res)
}else{
res.json({state:false,msg:messageDown})
}
})
}else{
proceedToRegisterProduct(req,res)
}
})
app.post(`/myshop/update/product/standars`,function(req,res){
var userinsession=plxsessions.usuarioEn(req,res)
if(userinsession == null){
res.json({state:0,msg:"nope"})
return
}
var perfilId=userinsession.perfil.id
var previewProduct=userinsession.myshop.previewProduct
if(productId != previewProduct.id){
res.json({state:0,msg:"nope"})
return
}
var usuariosDefaultStandares=userinsession.usuariosDefaultStandares
var standares=req.body.standares
proceedToRegisterStandars(perfilId,productId,usuariosDefaultStandares,standares,function(result){
res.json(result)
})
})
return []
})
module.exports.prepareManager=function(req){
imagepicker.use(req)
dbclient.use(req)
plxdcma_dbclient.use(req)
myux.use(req)
if(req.__myAppInternals.isEshopInstalled==null){
req.__myAppInternals.isEshopInstalled=true
req.__myAppInternals.paths.push(`<script src="/myshop.js"></script>`)
req.__myAppInternals.paths.push(`<script src="/myshop/register/product.js"></script>`)
req.__myAppInternals.paths.push(`<link rel="stylesheet" href="/myshop/register/product.css">`)
}
}
module.exports.use=module.exports.prepareManager
module.exports.articulos=memorymanager.articulos
module.exports.articuloByUrl=memorymanager.articuloByUrl
module.exports.imagenesDelProducto=memorymanager.imagenesDelProducto
module.exports.caracteristicasDeArticulo=memorymanager.caracteristicasDeArticulo
module.exports.estandaresDeArticulo=memorymanager.estandaresDeArticulo
module.exports.q=memorymanager
module.exports.inventarios=function(productos,renderObject,fieldName,promesas){
promesas.push(new Promise(function(accept,reject){
var pool=plxdcma_standarinit.pool
pool.query(`select product,inventario from productos_estandares where product in(${productos})`,function(erx,rxz){
renderObject[fieldName]=rxz
accept()
})
}))
}
module.exports.updateProduct=function(producto){
return new Promise(function(accept,reject){
var o={
nombre:producto.nombre,
descripcion:producto.descripcion
}
var o=memorymanager.memories.articulos.objects.allObjects[producto.id]
if(o != null){
o.nombre=producto.nombre
o.descripcion=producto.descripcion
}
var pool=plxdcma_standarinit.pool
pool.query(`update productos set ? where id = ${producto.id}`,o,function(e,r){
if(e != null){
console.log(`Error`)
console.log(e)
}
accept()
})
})
}
module.exports.updateProductStandares=function(producto,estandares,req){
return new Promise(function(resolve,reject){
var pool=plxdcma_standarinit.pool
var o=memorymanager.memories.articulos.estandares.allObjects[producto.id]
var inserts=[]
var productid=producto
if(producto.id != null){
productid= producto.id
}
var subpromesas=[]
var arz=[]
var wordsinsidetext=[]
var wordsids=[]
var perfilId;
var defaultStandares=null
if(req != null){
var usob=plxsessions.usuarioEn(req)
if(usob != null){
perfilId=usob.perfil.id
var s=usob.usuariosDefaultStandares
if(s != null){
defaultStandares=s
for(var each in s){
var so=s[each]
wordsinsidetext.push(so.texto)
wordsids.push(so.id)
}
}else{
usob.usuariosDefaultStandares=[]
defaultStandares=usob.usuariosDefaultStandares
}
}
}
var allPromises=[]
var xz=-1
for(var each in estandares.inserts){
xz=xz+1
var object=estandares.objects[xz]
var insert=estandares.inserts[each]
//inserts.push([productid,caracteristics[each]])
var position=wordsinsidetext.indexOf(insert[3])
if(position == -1){
allPromises.push(new Promise(function(resolve2,reject2){
pool.query(`insert into productos_perfil_regproducts_standaroptions(perfil,texto) value (${perfilId},'${insert[3]}') `,function(e,r){
if(e != null){
console.log(e)
}
defaultStandares.push({
texto:this.ar[3],
id:r.insertId
})
this.ar[3]=r.insertId
resolve2()
}.bind({ar:insert,obj:object}))
}))
}else{
insert[3]=wordsids[position]
}
}
Promise.all(allPromises).then(function(){
memorymanager.memories.articulos.estandares.allObjects[producto.id]=estandares.objects
pool.query(`delete from productos_estandares where product = ${productid}`,function(e,r){
pool.query(`insert into productos_estandares(product,precio,inventario,texto,moneda) values ?`,[estandares.inserts],function(e){
if(e != null){
console.log(e)
}
resolve()
})
})
})
})
}
module.exports.updateProductCaracteristics=function(producto,caracteristics){
return new Promise(function(resolve,reject){
var o=memorymanager.memories.articulos.caracteristics.allObjects[producto.id]
var inserts=[]
var productid=producto
if(producto.id != null){
productid= producto.id
}
var arz=[]
for(var each in caracteristics){
var c=caracteristics[each]
inserts.push([productid,caracteristics[each]])
arz.push({
product:productid,
caracteristics:c
})
}
pool=plxdcma_standarinit.pool
memorymanager.memories.articulos.caracteristics.allObjects[producto.id]=arz
pool.query(`delete from productos_caracteristicas where product = ${productid}`,function(e,r){
pool.query(`insert into productos_caracteristicas(product,caracteristics) values ?`,[inserts],function(){
resolve()
})
})
})
}
module.exports.focusProduct=function(item,req,res){
var userinsession=plxsessions.usuarioEn(req,res)
if(userinsession.myshop == null){
userinsession.myshop={}
}
userinsession.myshop.previewProduct=item
}
module.exports.addImagenAlProducto=memorymanager.addImagenAlProducto
module.exports.preciosDeArticulos=memorymanager.preciosDeArticulos
module.exports.productPreview=memorymanager.productPreview
var paypalinterface=require(`plxdcma_paypalinterface`)
function returnAllIntoInventario(pid,conclusion){
var pool=plxdcma_standarinit.pool
pool.query(`select * from shopcart_inventariotempcounter where shopcart = ${pid}`,function(e,rx){
var p=[]
for(var each in rx){
p.push(new Promise(function(resolve,reject){
var da=rx[each]
pool.query(`update productos_estandares set inventario = inventario + ${da.cuantity} where id = ${da.standar}`,function(){
resolve()
})
}))
}
Promise.all(p).then(function(){
pool.query(`delete from shopcart_inventariotempcounter where shopcart = ${pid}`,function(){
conclusion()
})
})
})
}
function moveInventarioOfShopCartIntoTemp(shopcartid,items,conclusion){
var inserts=[]
var querytoupdates=[]
for(var each in items){
var item=items[each]
inserts.push([shopcartid,item.standarId,item.quantity])
querytoupdates.push(new Promise(function(accept,reject){
pool.query(`update productos_estandares set inventario = inventario - ${item.quantity} where id = ${item.standarId}`,function(e){
accept()
})
}))
}
querytoupdates.push(new Promise(function(accept,reject){
pool.query(`insert into shopcart_inventariotempcounter(shopcart,standar,cuantity) values ? `,[inserts],function(){
accept()
})
}))
Promise.all(querytoupdates).then(function(){
conclusion()
})
}
module.exports.payWithPaypal=function(emisorid,descripcion,dirrecionId,handler){
module.exports.payWithPaypalAppUrl(null,emisorid,descripcion,dirrecionId,handler)
}
module.exports.payWithPaypalAppUrl=function(accessinterf,emisorid,descripcion,dirrecionId,handler){
pool=plxdcma_standarinit.pool
var shopcartid=emisorid
pool.query(`select pe.id as standarId,p.nombre as name,pe.precio as price,p.shop,shpc.cantidad as quantity,pe.inventario,001 as sku,pe.id,moneda as currency from shopingcart as shpc
inner join productos_estandares as pe on pe.id = shpc.standar
inner join productos as p on p.id = pe.product
where shpc.perfil = ${emisorid}`,function(er,result){
var total=0
var currency=""
var shop;
for(var each in result){
var rx=result[each]
if(rx.quantity > rx.inventario){
handler({state:0,msg:"notenough"})
return
}
shop=rx.shop
delete rx.shop
delete rx.inventario;
total=total+(rx.price * rx.quantity)
currency=rx.currency
if(currency == "USD"){
var s=`${rx.price}`
if(s.split("").indexOf(".") == -1){
rx.price=`${rx.price}.00`
}
}
//delete rx.currency
delete rx.id
}
if(currency == "USD"){
var s=`${total}`
if(s.split("").indexOf(".") == -1){
total=`${total}.00`
}
}
var amount={
currency:currency,
total:total
}
/*
result=[{
"name": "Red Sox Hat",
"sku": "001",
"price": "25.00",
"currency": "USD",
"quantity": 1
}]
amount={
"currency": "USD",
"total": "25.00"
}
*/
moveInventarioOfShopCartIntoTemp(shopcartid,result,function(){
for(var each in result){
delete result[each].standarId
}
paypalinterface.pay(accessinterf,result,amount,descripcion,emisorid,shop,dirrecionId,function(linkhreftopayment,paypaltransctionid,iteminserted){
pool.query(`insert into paypaltransactionid_shopingcart(id_,_id)value(${paypaltransctionid},${shopcartid})`,function(){
handler(linkhreftopayment,paypaltransctionid,iteminserted)
})
})
})
})
}
function buildNewFactura(perfilId,completOrderId,shop,shopProducts,ubicaicon){
return new Promise(function(resolve,reject){
var insertsproducts=[]
for(var each in shopProducts){
var p=shopProducts[each]
insertsproducts.push([null,p.standar,p.precio,p.moneda,p.cantidad])
}
var url=urlgen()
pool.query(`insert into facturas(url,fecha,seller,buyer,dirrecion,state)value('${url}',now(),${shop},${perfilId},${ubicaicon},0)`,function(er,r){
if(er != null){
console.log(er)
}
var facturaid=r.insertId
for(var each in insertsproducts){
var ins=insertsproducts[each]
ins[0]=facturaid
}
pool.query(`insert into facturas_productos(factura,standar,precio,moneda,cantidad) values ? `,[insertsproducts],function(er,result){
if(er != null){
console.log(er)
}
resolve({id:facturaid,url:url})
})
})
})
}
module.exports.installPaypal=function(isLive,yourclientid,yoursecretkey,onSuccess,onCancel){
var successFunction=function(req, res,fresultId,transactionsInnerDeailts){
var rx=transactionsInnerDeailts
var shopcartid;
var userperfilid=transactionsInnerDeailts.emisor
var buyloction=transactionsInnerDeailts.dirrecion
//var buyloction=userinsession.perfil.locationforcurrentshopcart
plxsessions.allSessionsObjects(function(o){
if( o.perfil != null && o.perfil.id == userperfilid){
plxsessions.assignSession(o,req,res)
return false
}
return true
})
pool.query(`select s.standar,s.cantidad,ps.precio,ps.moneda,ps.inventario,p.shop
from shopingcart as s
inner join productos_estandares as ps on ps.id = s.standar
inner join productos as p on p.id = ps.product
where s.perfil = ${userperfilid}`,function(er,shopcartitems){
if(er != null){
console.log(`Er C`)
console.log(er)
}
pool.query(`select * from localizaciones where id = (select lastlocationselected from perfil where id = ${userperfilid})`,function(erx,ubicaiconqrsult){
if(er != null){
console.log(`Er C`)
console.log(erx)
}
var ubicaicon=ubicaiconqrsult[0].id
var standares=[]
var failedCantidades=[]
var promises=[]
// for(var each in shopcartitems){
//
// promises.push(new Promise(function(resolve,reject){
// var s=shopcartitems[each]
// pool.query(`update productos_estandares set inventario = inventario - ${s.cantidad} where id = ${s.standar}`,function(er,result){
// resolve()
// })
// }))
// }
Promise.all(promises).then(function(){
var shops=[]
var orders=[]
for(var each in shopcartitems){
var s=shopcartitems[each]
var position=shops.indexOf(s.shop)
if( position == -1){
position=shops.length
shops.push(s.shop)
orders.push([])
}
orders[position].push(s)
}
var url=urlgen().toLowerCase()
pool.query(`insert into completeorders(url)value('${url}')`,function(er,r){
var subromesas=[]
for(var i = 0 ; i < shops.length;i++){
subromesas.push(buildNewFactura(userperfilid,r.insertId,shops[i],orders[i],ubicaicon))
}
Promise.all(subromesas).then(function(facturas){
pool.query(`delete from shopingcart where perfil = ${userperfilid}`,function(){
pool.query(`delete from shopcart_inventariotempcounter where shopcart = ${userperfilid}`,function(){
isBusy=false
onSuccess(req,res,transactionsInnerDeailts,shops)
})
})
})
})
})
})
})
}
var cancelFunction=function(transactionsInnerDeailts,req,res){
var userperfilid=transactionsInnerDeailts.emisor
plxsessions.allSessionsObjects(function(o){
if( o.perfil != null && o.perfil.id == userperfilid){
plxsessions.assignSession(o,req,res)
return false
}
return true
})
returnAllIntoInventario(transactionsInnerDeailts.emisor,function(){
pool.query(`select url from shop_defaultglobals where id = ${transactionsInnerDeailts.shop} `,function(e,r){
transactionsInnerDeailts.shopUrl=r[0].url
onCancel(transactionsInnerDeailts,req,res)
})
})
}
if(isLive == "sandbox"){
paypalinterface.asSandBox(yourclientid,yoursecretkey,successFunction,cancelFunction)
}else{
paypalinterface.asProduction(yourclientid,yoursecretkey,successFunction,cancelFunction)
}
}
//--