Add new table PartnerProducts
This commit is contained in:
parent
dc61d3b010
commit
920ff62e98
|
@ -664,3 +664,19 @@ class AppSucursales(object):
|
||||||
req.context['result'] = self._db.sucursales_post(values)
|
req.context['result'] = self._db.sucursales_post(values)
|
||||||
resp.status = falcon.HTTP_200
|
resp.status = falcon.HTTP_200
|
||||||
|
|
||||||
|
|
||||||
|
class AppPartnerProducts(object):
|
||||||
|
|
||||||
|
def __init__(self, db):
|
||||||
|
self._db = db
|
||||||
|
|
||||||
|
def on_get(self, req, resp):
|
||||||
|
values = req.params
|
||||||
|
req.context['result'] = self._db.partner_products_get(values)
|
||||||
|
resp.status = falcon.HTTP_200
|
||||||
|
|
||||||
|
def on_post(self, req, resp):
|
||||||
|
values = req.params
|
||||||
|
req.context['result'] = self._db.partner_products_post(values)
|
||||||
|
resp.status = falcon.HTTP_200
|
||||||
|
|
||||||
|
|
|
@ -792,6 +792,12 @@ def _products_from_xml(rfc, data):
|
||||||
return result
|
return result
|
||||||
|
|
||||||
result['data'] = cfdi.data
|
result['data'] = cfdi.data
|
||||||
|
|
||||||
|
emisor = result['data']['emisor']
|
||||||
|
emisor['rfc'] = emisor['Rfc']
|
||||||
|
emisor['nombre'] = emisor['Nombre']
|
||||||
|
result['data']['emisor'] = emisor
|
||||||
|
|
||||||
products = result['data']['conceptos']
|
products = result['data']['conceptos']
|
||||||
rows = []
|
rows = []
|
||||||
for p in products:
|
for p in products:
|
||||||
|
|
|
@ -17,7 +17,8 @@ from controllers.main import (AppEmpresas,
|
||||||
AppDocumentos, AppFiles, AppPreInvoices, AppCuentasBanco,
|
AppDocumentos, AppFiles, AppPreInvoices, AppCuentasBanco,
|
||||||
AppMovimientosBanco, AppTickets, AppStudents, AppEmployees, AppNomina,
|
AppMovimientosBanco, AppTickets, AppStudents, AppEmployees, AppNomina,
|
||||||
AppInvoicePay, AppCfdiPay, AppSATBancos, AppSociosCuentasBanco,
|
AppInvoicePay, AppCfdiPay, AppSATBancos, AppSociosCuentasBanco,
|
||||||
AppSATFormaPago, AppSATLeyendaFiscales, AppCert, AppSucursales
|
AppSATFormaPago, AppSATLeyendaFiscales, AppCert, AppSucursales,
|
||||||
|
AppPartnerProducts
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -64,6 +65,7 @@ api.add_route('/socioscb', AppSociosCuentasBanco(db))
|
||||||
api.add_route('/leyendasfiscales', AppSATLeyendaFiscales(db))
|
api.add_route('/leyendasfiscales', AppSATLeyendaFiscales(db))
|
||||||
api.add_route('/cert', AppCert(db))
|
api.add_route('/cert', AppCert(db))
|
||||||
api.add_route('/sucursales', AppSucursales(db))
|
api.add_route('/sucursales', AppSucursales(db))
|
||||||
|
api.add_route('/partnerproducts', AppPartnerProducts(db))
|
||||||
|
|
||||||
|
|
||||||
session_options = {
|
session_options = {
|
||||||
|
|
|
@ -466,17 +466,20 @@ class StorageEngine(object):
|
||||||
return main.SATLeyendasFiscales.remove(values)
|
return main.SATLeyendasFiscales.remove(values)
|
||||||
|
|
||||||
# ~ v2
|
# ~ v2
|
||||||
def cert_get(self, values):
|
def cert_get(self, filters):
|
||||||
return main.Certificado.get_data(values)
|
return main.Certificado.get_data(filters)
|
||||||
|
|
||||||
def cert_post(self, values):
|
def cert_post(self, filters):
|
||||||
return main.Certificado.post(values)
|
return main.Certificado.post(filters)
|
||||||
|
|
||||||
def sucursales_get(self, values):
|
def sucursales_get(self, filters):
|
||||||
return main.Sucursales.get_data(values)
|
return main.Sucursales.get_data(filters)
|
||||||
|
|
||||||
def sucursales_post(self, values):
|
def sucursales_post(self, filters):
|
||||||
return main.Sucursales.post(values)
|
return main.Sucursales.post(filters)
|
||||||
|
|
||||||
|
def partner_products_get(self, filters):
|
||||||
|
return main.PartnerProducts.get_data(filters)
|
||||||
|
|
||||||
# Companies only in MV
|
# Companies only in MV
|
||||||
def _get_empresas(self, values):
|
def _get_empresas(self, values):
|
||||||
|
|
|
@ -104,6 +104,37 @@ def desconectar():
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
||||||
|
class UploadFile(object):
|
||||||
|
|
||||||
|
def _read_productsadd(self, result):
|
||||||
|
emisor = result['data']['emisor']
|
||||||
|
rfc = emisor['rfc']
|
||||||
|
|
||||||
|
where = ((Socios.rfc == rfc) & (Socios.es_proveedor == True))
|
||||||
|
try:
|
||||||
|
row = (Socios
|
||||||
|
.select(Socios.id)
|
||||||
|
.where(where)
|
||||||
|
.get()
|
||||||
|
.dicts()
|
||||||
|
)
|
||||||
|
emisor['id'] = row['id']
|
||||||
|
except Socios.DoesNotExist:
|
||||||
|
emisor['id'] = 0
|
||||||
|
|
||||||
|
result['data']['emisor'] = emisor
|
||||||
|
|
||||||
|
return result
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def read(cls, rfc, opt, file_obj):
|
||||||
|
result = utils.upload_file(rfc, opt, file_obj)
|
||||||
|
method = f'_read_{opt}'
|
||||||
|
if hasattr(cls, method):
|
||||||
|
return getattr(cls, method)(cls, result)
|
||||||
|
return result
|
||||||
|
|
||||||
|
|
||||||
def upload_file(rfc, opt, file_obj):
|
def upload_file(rfc, opt, file_obj):
|
||||||
if opt == 'cfdixml':
|
if opt == 'cfdixml':
|
||||||
sxml = file_obj.file.read().decode()
|
sxml = file_obj.file.read().decode()
|
||||||
|
@ -120,7 +151,7 @@ def upload_file(rfc, opt, file_obj):
|
||||||
# ~ v2
|
# ~ v2
|
||||||
names = ('productsadd',)
|
names = ('productsadd',)
|
||||||
if opt in names:
|
if opt in names:
|
||||||
result = utils.upload_file(rfc, opt, file_obj)
|
result = UploadFile.read(rfc, opt, file_obj)
|
||||||
return result
|
return result
|
||||||
|
|
||||||
result = util.upload_file(rfc, opt, file_obj)
|
result = util.upload_file(rfc, opt, file_obj)
|
||||||
|
@ -9288,6 +9319,57 @@ class CfdiNominaRelacionados(BaseModel):
|
||||||
return [str(r.cfdi_origen.uuid) for r in query]
|
return [str(r.cfdi_origen.uuid) for r in query]
|
||||||
|
|
||||||
|
|
||||||
|
class PartnerProducts(BaseModel):
|
||||||
|
partner = ForeignKeyField(Socios)
|
||||||
|
key = TextField(default='')
|
||||||
|
product = ForeignKeyField(Productos)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
order_by = ('partner', 'key')
|
||||||
|
indexes = (
|
||||||
|
(('partner', 'key', 'product'), True),
|
||||||
|
)
|
||||||
|
|
||||||
|
def _get_product(self, filters):
|
||||||
|
data = {'ok': True}
|
||||||
|
id = int(filters['partner_id'])
|
||||||
|
rfc = filters['partner_rfc']
|
||||||
|
key = filters['partner_key']
|
||||||
|
|
||||||
|
where = (Socios.rfc == rfc)
|
||||||
|
if id:
|
||||||
|
where = (Socios.id == id)
|
||||||
|
where = (where & (PartnerProducts.key == key))
|
||||||
|
select = (
|
||||||
|
Productos.id.alias('id_product'),
|
||||||
|
Productos.clave_sat.alias('key_sat1'),
|
||||||
|
Productos.descripcion.alias('description1'),
|
||||||
|
)
|
||||||
|
try:
|
||||||
|
row = (PartnerProducts
|
||||||
|
.select(select)
|
||||||
|
.join(Socios).switch(PartnerProducts)
|
||||||
|
.join(Productos).switch(PartnerProducts)
|
||||||
|
.where(where)
|
||||||
|
.get()
|
||||||
|
.dicts()
|
||||||
|
)
|
||||||
|
except PartnerProducts.DoesNotExist:
|
||||||
|
msg = 'No se encontró un producto existente'
|
||||||
|
data = {'ok': False, 'msg': msg}
|
||||||
|
return data
|
||||||
|
|
||||||
|
print('ROW', row)
|
||||||
|
data['row'] = row
|
||||||
|
|
||||||
|
return data
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def get_data(cls, filters):
|
||||||
|
method = f"_get_{filters['opt']}"
|
||||||
|
return getattr(cls, method)(cls, filters)
|
||||||
|
|
||||||
|
|
||||||
@util.run_in_thread
|
@util.run_in_thread
|
||||||
def _save_log(user, action, table):
|
def _save_log(user, action, table):
|
||||||
data = {'usuario': user, 'accion': action, 'tabla': table}
|
data = {'usuario': user, 'accion': action, 'tabla': table}
|
||||||
|
@ -9503,6 +9585,7 @@ def _crear_tablas(rfc):
|
||||||
Socios.tags.get_through_model(),
|
Socios.tags.get_through_model(),
|
||||||
Productos.impuestos.get_through_model(),
|
Productos.impuestos.get_through_model(),
|
||||||
Productos.tags.get_through_model(),
|
Productos.tags.get_through_model(),
|
||||||
|
PartnerProducts,
|
||||||
]
|
]
|
||||||
log.info('Creando tablas...')
|
log.info('Creando tablas...')
|
||||||
database_proxy.create_tables(tablas, True)
|
database_proxy.create_tables(tablas, True)
|
||||||
|
@ -9555,7 +9638,7 @@ def _migrate_tables(rfc=''):
|
||||||
CfdiNominaOtroPago, CfdiNominaOtros, CfdiNominaPercepciones,
|
CfdiNominaOtroPago, CfdiNominaOtros, CfdiNominaPercepciones,
|
||||||
CfdiNominaRelacionados, CfdiNominaSeparacion, CfdiNominaSubcontratos,
|
CfdiNominaRelacionados, CfdiNominaSeparacion, CfdiNominaSubcontratos,
|
||||||
CfdiNominaTotales, SATNivelesEducativos, Roles, Permisos,
|
CfdiNominaTotales, SATNivelesEducativos, Roles, Permisos,
|
||||||
SociosCuentasBanco, SATLeyendasFiscales
|
SociosCuentasBanco, SATLeyendasFiscales, PartnerProducts
|
||||||
]
|
]
|
||||||
log.info('Creando tablas nuevas...')
|
log.info('Creando tablas nuevas...')
|
||||||
database_proxy.create_tables(tablas, True)
|
database_proxy.create_tables(tablas, True)
|
||||||
|
|
|
@ -436,6 +436,8 @@ function up_products_upload_complete(response){
|
||||||
//~ Add products
|
//~ Add products
|
||||||
function cmd_products_add_click(id, e, node){
|
function cmd_products_add_click(id, e, node){
|
||||||
$$("multi_products").setValue("product_add")
|
$$("multi_products").setValue("product_add")
|
||||||
|
cfg_products['partner_id'] = 0
|
||||||
|
cfg_products['partner_rfc'] = ''
|
||||||
}
|
}
|
||||||
|
|
||||||
//~ Close add products
|
//~ Close add products
|
||||||
|
@ -514,13 +516,69 @@ function up_products_from_xml_upload_complete(response){
|
||||||
|
|
||||||
var grid = $$('grid_partner_products')
|
var grid = $$('grid_partner_products')
|
||||||
var data = response.data
|
var data = response.data
|
||||||
|
cfg_products['partner_id'] = data.emisor.id
|
||||||
|
cfg_products['partner_rfc'] = data.emisor.rfc
|
||||||
|
|
||||||
var html = '<span class="webix_icon fa-user"></span><span class="lbl_partner">'
|
var html = '<span class="webix_icon fa-user"></span><span class="lbl_partner">'
|
||||||
html += data.emisor.Nombre + ' (' + data.emisor.Rfc + ')</span>'
|
html += data.emisor.nombre + ' (' + data.emisor.rfc + ')</span>'
|
||||||
$$('lbl_partner').setValue(html)
|
$$('lbl_partner').setValue(html)
|
||||||
|
|
||||||
grid.clearAll();
|
grid.clearAll()
|
||||||
grid.parse(data.conceptos, 'json');
|
grid.parse(data.conceptos, 'json')
|
||||||
grid.refresh()
|
grid.refresh()
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function get_partner_product(grid, row){
|
||||||
|
grid.refresh(row.id)
|
||||||
|
|
||||||
|
var filters = {
|
||||||
|
opt: 'product',
|
||||||
|
partner_id: cfg_products['partner_id'],
|
||||||
|
partner_rfc: cfg_products['partner_rfc'],
|
||||||
|
partner_key: row.key,
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!filters['partner_id']){
|
||||||
|
msg = 'El Proveedor no esta dado de alta'
|
||||||
|
msg_ok(msg)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
webix.ajax().get('/partnerproducts', filters, {
|
||||||
|
error: function(text, data, xhr) {
|
||||||
|
msg_error('Ocurrio un error, consulta a soporte técnico.')
|
||||||
|
},
|
||||||
|
success: function(text, data, xhr){
|
||||||
|
var values = data.json()
|
||||||
|
if(values.ok){
|
||||||
|
row['id_product'] = values.row.id_product
|
||||||
|
row['key_sat1'] = values.row.key_sat1
|
||||||
|
row['description1'] = values.row.description1
|
||||||
|
grid.refresh(row.id)
|
||||||
|
}else{
|
||||||
|
msg_error(values.msg)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function grid_partner_products_select(row_id, state){
|
||||||
|
var grid = $$('grid_partner_products')
|
||||||
|
var row = grid.getItem(row_id)
|
||||||
|
|
||||||
|
if(state){
|
||||||
|
row['key_sat1'] = row.key_sat
|
||||||
|
row['description1'] = row.description
|
||||||
|
row['cant1'] = row.cant
|
||||||
|
get_partner_product(grid, row)
|
||||||
|
}else{
|
||||||
|
row['key_sat1'] = ''
|
||||||
|
row['description1'] = ''
|
||||||
|
row['cant1'] = ''
|
||||||
|
grid.refresh(row_id)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -238,23 +238,21 @@ var grid_partner_products_cols = [
|
||||||
{id: 'unit', header:{text: 'Unidad', css: 'center'}, width: 100,
|
{id: 'unit', header:{text: 'Unidad', css: 'center'}, width: 100,
|
||||||
adjust: 'data'},
|
adjust: 'data'},
|
||||||
{id: 'unit_value', header:{text: 'Valor Unitario', css: 'center'},
|
{id: 'unit_value', header:{text: 'Valor Unitario', css: 'center'},
|
||||||
width: 100, format: format_currency, css: 'right', editor: 'text'},
|
width: 100, format: format_currency, css: 'right'},
|
||||||
//~ {id: 'descuento', header:{text: 'Descuento', css: 'center'},
|
|
||||||
//~ width: 100, format: format_currency, css: 'right', editor: 'text'},
|
|
||||||
//~ {id: 'precio_final', hidden: true, header: 'precio_final', width: 80,
|
|
||||||
//~ format: webix.i18n.priceFormat, css: 'right'},
|
|
||||||
{id: 'import', header:{text: 'Importe', css: 'center'}, width: 100,
|
|
||||||
format: webix.i18n.priceFormat, css: 'right'},
|
|
||||||
{id: 'cant', header: {text: 'Cantidad', css: 'center'}, width: 50,
|
{id: 'cant', header: {text: 'Cantidad', css: 'center'}, width: 50,
|
||||||
format: webix.i18n.numberFormat, css: 'right', editor: 'text'},
|
format: webix.i18n.numberFormat, css: 'right'},
|
||||||
{id: 'separate', header: '', width: 25},
|
{id: 'separate', header: '', width: 25},
|
||||||
{id: 'id_product', header: '', hidden: true},
|
{id: 'id_product', header: '', hidden: true},
|
||||||
{id: 'key1', header:{text: 'Clave', css: 'center'}, width: 100,
|
{id: 'key1', header:{text: 'Clave', css: 'center'}, width: 100,
|
||||||
adjust: 'data'},
|
adjust: true, editor: 'text', hidden: true},
|
||||||
{id: 'key_sat1', header:{text: 'Clave SAT', css: 'center'}, width: 100,
|
{id: 'key_sat1', header:{text: 'Clave SAT', css: 'center'}, width: 100,
|
||||||
adjust: 'data'},
|
adjust: true, editor: 'text'},
|
||||||
{id: 'description1', header:{text: 'Descripción', css: 'center'},
|
{id: 'description1', header:{text: 'Descripción', css: 'center'},
|
||||||
fillspace: true, editor: 'popup'},
|
fillspace: true, editor: 'popup'},
|
||||||
|
{id: 'unit_value1', header:{text: 'Valor Unitario', css: 'center'},
|
||||||
|
width: 100, format: format_currency, css: 'right', editor: 'text'},
|
||||||
|
{id: 'cant1', header: {text: 'Cantidad', css: 'center'}, width: 50,
|
||||||
|
format: webix.i18n.numberFormat, css: 'right', editor: 'text'},
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
|
@ -268,6 +266,11 @@ var grid_partner_products = {
|
||||||
columns: grid_partner_products_cols,
|
columns: grid_partner_products_cols,
|
||||||
data: [],
|
data: [],
|
||||||
fixedRowHeight: false,
|
fixedRowHeight: false,
|
||||||
|
on:{
|
||||||
|
onCheck:function(rowId, colId, state){
|
||||||
|
grid_partner_products_select(rowId, state);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue