Add new table PartnerProducts

This commit is contained in:
Mauricio Baeza 2021-06-13 23:12:07 -05:00
parent dc61d3b010
commit 920ff62e98
7 changed files with 195 additions and 24 deletions

View File

@ -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

View File

@ -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:

View File

@ -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 = {

View File

@ -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):

View File

@ -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)

View File

@ -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)
}
}

View File

@ -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);
}
}
} }