diff --git a/source/app/controllers/main.py b/source/app/controllers/main.py index 4f2c8c9..5df8012 100644 --- a/source/app/controllers/main.py +++ b/source/app/controllers/main.py @@ -498,14 +498,18 @@ class AppNomina(object): def on_get(self, req, resp): values = req.params - by = values.get('by', '') - req.context['result'] = self._db.get_nomina(values) - if 'download' in by: - name = req.context['result']['name'] - req.context['blob'] = req.context['result']['data'] - resp.content_type = 'application/octet-stream' - resp.append_header( - 'Content-Disposition', f'attachment; filename={name}') + user = req.env['beaker.session']['userobj'] + if 'opt' in values: + req.context['result'] = self._db.nomina_get(values, user) + else: + by = values.get('by', '') + req.context['result'] = self._db.get_nomina(values) + if 'download' in by: + name = req.context['result']['name'] + req.context['blob'] = req.context['result']['data'] + resp.content_type = 'application/octet-stream' + resp.append_header( + 'Content-Disposition', f'attachment; filename={name}') resp.status = falcon.HTTP_200 def on_post(self, req, resp): diff --git a/source/app/models/db.py b/source/app/models/db.py index 4e74252..def0789 100644 --- a/source/app/models/db.py +++ b/source/app/models/db.py @@ -511,6 +511,9 @@ class StorageEngine(object): def products_get(self, filters, user): return main.Productos.get_data(filters, user) + def nomina_get(self, filters, user): + return main.CfdiNomina.get_data(filters, user) + # Companies only in MV def _get_empresas(self, values): return main.companies_get() diff --git a/source/app/models/main.py b/source/app/models/main.py index 8e725a6..1c89d85 100644 --- a/source/app/models/main.py +++ b/source/app/models/main.py @@ -8630,6 +8630,58 @@ class CfdiNomina(BaseModel): class Meta: order_by = ('fecha',) + @classmethod + def _get_status_sat(cls, filters, user): + id = filters['id'] + + obj = CfdiNomina.get(CfdiNomina.id == id) + estatus_sat = utils.get_status_sat(obj.xml) + if obj.estatus_sat != estatus_sat: + obj.estatus_sat = estatus_sat + obj.save() + + if obj.estatus_sat == 'Vigente' and obj.estatus == 'Cancelada': + days = utils.get_days(obj.fecha_cancelacion) + if days > 3: + estatus_sat = 'uncancel' + + return estatus_sat + + @classmethod + def _get_yearmonth(cls, filters, user): + if filters['year'] == '-1': + fy = (CfdiNomina.fecha.year > 0) + else: + fy = (CfdiNomina.fecha.year == int(filters['year'])) + if filters['month'] == '-1': + fm = (CfdiNomina.fecha.month > 0) + else: + fm = (CfdiNomina.fecha.month == int(filters['month'])) + filters = (fy & fm) + return cls._get(cls, filters) + + @classmethod + def _get_dates(cls, filters, user): + dates = util.loads(filters['range']) + filters = CfdiNomina.fecha.between( + util.get_date(dates['start']), + util.get_date(dates['end'], True) + ) + return cls._get(cls, filters) + + @classmethod + def _get_import(cls, filters, user): + return cls._import(cls) + + @classmethod + def _get_stamp(cls, filters, user): + return cls._stamp(cls) + + @classmethod + def get_data(cls, values, user): + opt = values.pop('opt') + return getattr(cls, f'_get_{opt}')(values, user) + def _cancel(self, values, user): id = int(values['id']) obj = CfdiNomina.get(CfdiNomina.id==id) @@ -9526,32 +9578,6 @@ class CfdiNomina(BaseModel): if values.get('by', ''): return getattr(cls, f"_get_by_{values['by']}")(cls, values) - if values['opt'] == 'dates': - dates = util.loads(values['range']) - filters = CfdiNomina.fecha.between( - util.get_date(dates['start']), - util.get_date(dates['end'], True) - ) - return cls._get(cls, filters) - - if values['opt'] == 'yearmonth': - if values['year'] == '-1': - fy = (CfdiNomina.fecha.year > 0) - else: - fy = (CfdiNomina.fecha.year == int(values['year'])) - if values['month'] == '-1': - fm = (CfdiNomina.fecha.month > 0) - else: - fm = (CfdiNomina.fecha.month == int(values['month'])) - filters = (fy & fm) - return cls._get(cls, filters) - - if values['opt'] == 'import': - return cls._import(cls) - - if values['opt'] == 'stamp': - return cls._stamp(cls) - @classmethod def remove(cls, ids): ids = util.loads(ids) diff --git a/source/static/js/controller/nomina.js b/source/static/js/controller/nomina.js index 702c03b..4ce72a1 100644 --- a/source/static/js/controller/nomina.js +++ b/source/static/js/controller/nomina.js @@ -12,6 +12,7 @@ var nomina_controllers = { $$('cmd_nomina_without_stamp').attachEvent('onItemClick', cmd_nomina_without_stamp_click) $$('cmd_nomina_delete').attachEvent('onItemClick', cmd_nomina_delete_click) $$('cmd_nomina_timbrar').attachEvent('onItemClick', cmd_nomina_timbrar_click) + $$('cmd_nomina_sat').attachEvent('onItemClick', cmd_nomina_sat_click) $$('cmd_nomina_log').attachEvent('onItemClick', cmd_nomina_log_click) $$('cmd_nomina_download').attachEvent('onItemClick', cmd_nomina_download_click) $$('cmd_nomina_cancel').attachEvent('onItemClick', cmd_nomina_cancel_click) @@ -570,3 +571,41 @@ function grid_nomina_on_select_change(){ g.getColumnConfig('empleado').footer[0].text = webix.i18n.priceFormat(total) g.refreshColumns() } + + +function cmd_nomina_sat_click(){ + var g = $$('grid_nomina') + + if(g.count() == 0){ + return + } + + var row = g.getSelectedItem() + if (row == undefined){ + msg_error('Selecciona un recibo de nómina') + return + } + if (row instanceof Array){ + msg_error('Selecciona solo un recibo de nómina') + return + } + + if(!row.uuid){ + msg_error('La factura no esta timbrada, solo es posible consultar \ + el estatus en el SAT de facturas timbradas') + return + } + + var options = {opt: 'status_sat', id: row.id} + webix.ajax().get('/nomina', options, function(text, data){ + var value = data.json() + if(value == 'Vigente'){ + msg_ok(value) + }else if(value == 'uncancel'){ + ask_invoice_uncancel(row.id) + }else{ + msg_error(value) + } + }) + +}