CertificationDA.cs
5 using sage.ew.empresa;
7 using sage.ew.functions;
8 using sage.ew.global;
9 using System;
10 using System.Collections.Generic;
11 using System.Data;
12 using System.Linq;
13 using System.Text;
14 using System.Threading.Tasks;
15 
16 namespace sage.addons.factucert.DataAccess.Clases
17 {
22  {
26  private const int MaxLockMinutes = 180;
27 
32  public IEnumerable<DetalleFacturaRectificativaDTO> ObtenerDatosFacturasRectificadas(string ejercicio, string empresa, string factura)
33  {
34  DataTable datos = new DataTable();
35  var lcSql = $"SELECT EMPRESA, FACTURA, LINEA, FACTU_RECT, FECHA, BASE_IVA, IVA, RECARGO, EJERCICIO, FECHA_OP, ULTFACT " + Environment.NewLine +
36  $"FROM {SQLDatabase("GESTION", "D_FACTURECT")} " +
37  $"WHERE EMPRESA = {SQLString(empresa)} AND FACTURA = {SQLString(factura)} ";
38 
39  if (!SQLExec(lcSql, ref datos) || datos.Rows.Count == 0) yield break;
40  foreach (DataRow row in datos.Rows)
41  {
43  {
44  Empresa = Convert.ToString(row["EMPRESA"]).TrimEnd(),
45  Factura = Convert.ToString(row["FACTURA"]).TrimEnd(),
46  Linea = Convert.ToInt32(row["LINEA"]),
47  Factu_rect = Convert.ToString(row["FACTU_RECT"]).Trim(), //Bug 215421 => Recuperaba con espacio en blanco por la izq.
48  Fecha = Convert.ToDateTime(row["FECHA"]),
49  Base_iva = Convert.ToDecimal(row["BASE_IVA"]),
50  Iva = Convert.ToDecimal(row["IVA"]),
51  Recargo = Convert.ToDecimal(row["RECARGO"]),
52  Ejercicio = Convert.ToString(row["EJERCICIO"]).TrimEnd(),
53  Fecha_op = Convert.ToDateTime(row["FECHA_OP"]),
54  Ultfact = Convert.ToBoolean(row["ULTFACT"]),
55  };
56  yield return detalle;
57  }
58  }
59 
63  public IEnumerable<DetalleTicketRectificativoDTO> ObtenerDatosTicketsRectificados(string ejercicio, string empresa, string ticket, string letra)
64  {
65  DataTable datos = new DataTable();
66  var lcSql = $"SELECT EMPRESA, TICKET, LINEA, TICKET_RECT, FECHA, BASE_IVA, IVA, RECARGO, EJERCICIO, LETRA, LETRA_RECT, EJER_RECT " + Environment.NewLine +
67  $"FROM {SQLDatabase(FACTUCERT._NombreAddOn, "D_TICKERECT")} " +
68  $"WHERE EJERCICIO = {SQLString(ejercicio)} AND EMPRESA = {SQLString(empresa)} AND TICKET = {SQLString(ticket)} AND LETRA = {SQLString(letra)} ";
69 
70  if (!SQLExec(lcSql, ref datos) || datos.Rows.Count == 0) yield break;
71  foreach (DataRow row in datos.Rows)
72  {
74  {
75  Empresa = Convert.ToString(row["EMPRESA"]).TrimEnd(),
76  Ticket = Convert.ToString(row["TICKET"]).TrimEnd(),
77  Linea = Convert.ToInt32(row["LINEA"]),
78  Ticket_rect = Convert.ToString(row["TICKET_RECT"]).Trim(), //Bug 215421 => Recuperaba con espacio en blanco por la izq.
79  Fecha = Convert.ToDateTime(row["FECHA"]),
80  Base_iva = Convert.ToDecimal(row["BASE_IVA"]),
81  Iva = Convert.ToDecimal(row["IVA"]),
82  Recargo = Convert.ToDecimal(row["RECARGO"]),
83  Ejercicio = Convert.ToString(row["EJERCICIO"]).TrimEnd(),
84  Letra = Convert.ToString(row["LETRA"]).TrimEnd(),
85  Letra_rect = Convert.ToString(row["LETRA_RECT"]).TrimEnd(),
86  Ejer_rect = Convert.ToString(row["EJER_RECT"]).TrimEnd(),
87  };
88  yield return detalle;
89  }
90  }
91 
97  {
98  var filtroSistema = "";
99  if(FACTUCERT._FactuCertConfig != null)
100  {
101  filtroSistema = $" AND SISTEMA = {FACTUCERT._FactuCertConfig._Sistema} ";
102  }
103 
104  object[] tipoEncadenamiento = GetValoresTabla(new string[] { "ENC_DISP" }, FACTUCERT._NombreAddOn, "CFG_ADDON", $"EMPRESA = '{EW_GLOBAL._GetVariable("wc_empresa")}' {filtroSistema}");
105  if (tipoEncadenamiento == null || tipoEncadenamiento.Length != 1)
106  throw new Exception("No ha podido leerse correctamente la información del Tipo de Encadenamiento de la tabla de configuración del Addon de Facturación Certificada");
107  else
108  return Convert.ToInt32(tipoEncadenamiento[0]);
109  }
110 
111 
117  public int ObtenerTerritorio(string codigoEmpresa)
118  {
119  var sistema = FACTUCERT._FactuCertConfig._Sistema;
120  var territorio = GetValoresTabla(new string[] { "Territorio" }, FACTUCERT._NombreAddOn, "CFG_ADDON", $"EMPRESA = '{codigoEmpresa.TrimEnd()}' AND SISTEMA = {sistema}");
121  if (territorio == null || territorio.Length != 1)
122  throw new Exception("No ha podido leerse correctamente la información del Territorio de la tabla de configuración del Addon de Facturación Certificada");
123  else
124  return Convert.ToInt32(territorio[0]);
125  }
126 
132  public int ObternerTipoIdFiscal(string codigoCliente)
133  {
134  var resModidfis = GetValoresTabla(new string[] { "Id_Fiscal" }, "GESTION", "MODIDFIS", "CUENTA = '" + codigoCliente + "'");
135  int idFiscal = (resModidfis != null && resModidfis.Length > 0) ? Convert.ToInt32(resModidfis[0]) : 0;
136  return idFiscal;
137  }
138 
144  public string ObternerLetraPais(string codigoPais)
145  {
146  var paisCliente = GetValoresTabla(new string[] { "Letra" }, "COMUNES", "PAISES", "CODIGO = '" + codigoPais + "'");
147  var siglas = paisCliente[0].ToString().ToUpper().Trim();
148  return siglas;
149  }
150 
151 
160  public int ObternerMaxLineaFcregcert(string empresa, string ejercicio, string serieTicket, string numBorrador)
161  {
162  int linea;
163 
164  // Bug 184668, para evitar lo comentado en el bug (ver incidencia Spira del bug en la imagen se ve muy bien) asignamos LINEA según
165  // EMPRESA, EJERCICIO, LETRA, BORRADOR. No incluimos NUMERO para así conseguir que todos los registros de un documento (tanto los
166  // que se generaron mientras era solo borrador, como los que se generaron despues de obtener el nº definitivo del documento), tengan
167  // la misma numeración de LINEA y sean correlativos (que no empiece LINEA con 1 en los registros posteriores que se puedan crear después
168  // de obtener el nº definitivo del documento)
169  //
170  // Actualmente toda factura o ticket certificado que se pueda generar pasa por borrador, siempre, siempre tendremos campos BORRADOR
171  // informado por lo que se decide ignorar el campo NUMERO de cara a obtener la LINEA que toca asignar. Aunque la clave de la tabla
172  // sea EMPRESA, EJERCICIO, LETRA, NUMERO, BORRADOR (incluye el campo NUMERO) no debería dar ningún problema de infracción de clave
173  // primaria el hacerlo como lo planteamos de esta nueva forma.
174 
175  var maxLinea = GetValoresTabla(new string[] { "MAX(LINEA)" }, FACTUCERT._NombreAddOn, "FCREGCERT", "EMPRESA = '" + empresa + "' AND EJERCICIO = " + SQLString(ejercicio) + " AND LETRA = " + SQLString(serieTicket) + " AND BORRADOR = " + SQLString(numBorrador, 10, ' ', true), true);
176  if (maxLinea == null || maxLinea.Length != 1 || maxLinea[0] == null || maxLinea[0] == DBNull.Value)
177  linea = 1;
178  else
179  linea = Convert.ToInt32(maxLinea[0]) + 1;
180 
181  return linea;
182  }
183 
189  public bool UserRazonComercial(string codigoEmpresa)
190  {
191  var resNombre2 = GetValoresTabla(new string[] { "M_nombre2" }, "GESTION", "MODCONFI", "EMPRESA = '" + codigoEmpresa + "'");
192  if (resNombre2 != null && resNombre2.Length > 0 && Convert.ToInt16(resNombre2[0]) == 1)
193  {
194  return true;
195  }
196  return false;
197  }
198 
205  public string[] ObtenerDatosCertificado(string nombreTerminal, string codigoEmpresa)
206  {
207  var res = GetValoresTabla(new string[] { "N_SERIE", "CRTF_NOM", "CERTXEMP" }, FACTUCERT._NombreAddOn, "fc_term", "CODIGO = '" + nombreTerminal + "'", true);
208 
209  var numeroDeSerie = res[0].ToString().Trim();
210  var nombreCertificado = res[1].ToString().Trim();
211 
212  // Comprobar si en este terminal se definen los certificados por empresa o no.
213  //
214  bool llCertifPorEmpresa = Convert.ToBoolean(res[2]);
215  if (llCertifPorEmpresa)
216  {
217  // Los certificados en este terminal van por empresa, busco el correspondiente a la empresa activa en este terminal.
218  //
219  var res2 = GetValoresTabla(new string[] { "CRTF_NOM" }, FACTUCERT._NombreAddOn, "fc_termemp", "TERMINAL = '" + nombreTerminal + "' and EMPRESA='" + codigoEmpresa + "'", true);
220 
221  // Ojo que si no encuentra el registro res2=null
222  //
223  if (res2 != null)
224  {
225  string lcCertifEmpresa = res2[0].ToString().Trim();
226  if (!string.IsNullOrWhiteSpace(lcCertifEmpresa))
227  {
228  // Si he encontrado certificado para el terminal y la empresa activa me quedo con él, caso contrario utilizaré el
229  // certificado genérico del terminal.
230  //
231  nombreCertificado = lcCertifEmpresa;
232  }
233  }
234  }
235 
236  return new string[2] { numeroDeSerie, nombreCertificado };
237  }
238 
244  public bool ObtainDBLock(int maxLockMinutes = MaxLockMinutes)
245  {
246  //Bug 189894 => Errores de precisión. Al grabar sólo lleva 3 dígitos de milisegundo y el original puede tener más cosa que hace saltar falsos positivos en la
247  //2ª vuelta de la coprobación. Los errores són aleatorios y depende de la conversión
248  DateTime currentTime = Convert.ToDateTime(DateTime.Now.ToString("dd/MM/yyyy HH:mm:ss.fff"));
249 
250  string lcSqlBloquear = "UPDATE " + SQLDatabase(FACTUCERT._NombreAddOn, "CFG_ADDON") + " SET ENVIO = '" + currentTime.ToString("dd/MM/yyyy HH:mm:ss.fff") + "' WHERE EMPRESA = '" + EW_GLOBAL._GetVariable("wc_empresa").ToString() + "' AND SISTEMA = 1";
251 
252  var fechaBloqueoEnvio = GetValoresTabla(new string[] { "ENVIO" }, FACTUCERT._NombreAddOn, "CFG_ADDON", "EMPRESA = '" + EW_GLOBAL._GetVariable("wc_empresa").ToString() + "' AND SISTEMA = 1", true);
253  if (fechaBloqueoEnvio == null || fechaBloqueoEnvio.Length != 1)
254  throw new Exception("No ha podido leerse correctamente el campo de bloqueo para Envios de Facturación Certificada de la tabla de configuración del Addon");
255 
256  if (fechaBloqueoEnvio[0] != null && fechaBloqueoEnvio[0] != DBNull.Value && (DateTime.Now - Convert.ToDateTime(fechaBloqueoEnvio[0])).TotalMinutes < maxLockMinutes)
257  return false; //Hay otro bloqueo activo
258 
259  bool lOk = SQLExec(lcSqlBloquear);
260 
261  if (!lOk)
262  throw new Exception("No ha podido obtenerse correctamente el bloqueo para Envios de Facturación Certificada de la tabla de configuración del Addon");
263 
264  //Doble comprobación de seguridad, por si justo dos puestos hacen esta actualización del timestamp del bloqueo a la vez
265  System.Threading.Thread.Sleep(500);
266  fechaBloqueoEnvio = GetValoresTabla(new string[] { "ENVIO" }, FACTUCERT._NombreAddOn, "CFG_ADDON", "EMPRESA = '" + EW_GLOBAL._GetVariable("wc_empresa").ToString() + "' AND SISTEMA = 1", true);
267  if (fechaBloqueoEnvio == null || fechaBloqueoEnvio.Length != 1)
268  throw new Exception("No ha podido leerse correctamente el campo de bloqueo para Envios de Facturación Certificada de la tabla de configuración del Addon");
269 
270  if (fechaBloqueoEnvio[0] != null && fechaBloqueoEnvio[0] != DBNull.Value && Math.Abs((Convert.ToDateTime(fechaBloqueoEnvio[0]) - currentTime).TotalMilliseconds) > 2) //SQL redondea segun una tabla, distancia máxima 2
271  return false; //Hay otro bloqueo activo
272 
273  return true;
274  }
275 
280  public bool ReleaseDBLock()
281  {
282  string lcSql = "UPDATE " + SQLDatabase(FACTUCERT._NombreAddOn, "CFG_ADDON") + " SET ENVIO = NULL WHERE EMPRESA = '" + EW_GLOBAL._GetVariable("wc_empresa").ToString() + "' AND SISTEMA = 1";
283 
284  bool lOk = SQLExec(lcSql);
285 
286  return lOk;
287  }
288 
294  public void RegistrarTraza(string basicInfo, string extendedInfo)
295  {
296  sage.ew.db.DB.Registrar_Traza(basicInfo, extendedInfo);
297  }
298 
305  {
306  string lcSql = "INSERT INTO " + SQLDatabase(FACTUCERT._NombreAddOn, "FCREGCERT") + Environment.NewLine +
307  " (USUARIO, EMPRESA, EJERCICIO, LETRA, NUMERO, BORRADOR, FECHA, TIPO_DOC, LINEA, TIPO, MOTIVO, XMLRESP)" + Environment.NewLine +
308  " VALUES(" + SQLString(registro.Usuario) + "," +
309  SQLString(registro.Empresa) + "," +
310  SQLString(registro.Ejercicio) + "," +
311  SQLString(registro.Letra) + "," +
312  SQLString(registro.Numero, 10, ' ', true) + "," +
313  SQLString(registro.Borrador, 10, ' ', true) + "," +
314  SQLString(registro.Fecha) + "," +
315  SQLString(registro.Tipo_doc) + "," +
316  SQLString(registro.Linea) + "," +
317  SQLString(registro.Tipo) + "," +
318  SQLString(registro.Motivo) + "," +
319  SQLString(registro.XmlResp) +
320  ") ";
321  return SQLExec(lcSql);
322  }
323 
324  public void ActualizarEstadoEnvioDocumentoGestion(EnvioPendiente docPendiente, int estadoEnvio)
325  {
326  var estadoAnulacion = ", ANULADO = 0 ";
327  if (docPendiente.EsAnulacion)
328  {
329  //Enviada, Aceptada o aceptada con avisos
330  var enviada = (estadoEnvio == 2 || estadoEnvio == 3 || estadoEnvio == 4 || estadoEnvio == 5 || estadoEnvio == 6); //Task 182042 => Estados 3,4,5 y 6 van ligados a ANULADO 2
331  estadoAnulacion = ", ANULADO = " + (enviada ? "2" : "1");
332  }
333 
334  // Recupero el entorno al que se ha enviado y lo guardo.
335  string entorno = FunctionsFactuCert._GetEntorno();
336  var entornoEnvio = ", TIPOENVIO = " + Convert.ToString(entorno == "PRE" ? Convert.ToInt32(TipoEnvio.PRE) : Convert.ToInt32(TipoEnvio.PRO));
337 
338  string lcSql;
339  if (docPendiente.EsTicket)
340  {
341  lcSql = "UPDATE " + SQLDatabase(FACTUCERT._NombreAddOn, "FCTICKETS") + " SET ESTADO = " + estadoEnvio.ToString() + estadoAnulacion + entornoEnvio +
342  " WHERE EMPRESA = '" + EW_GLOBAL._GetVariable("wc_empresa").ToString() + "' AND EJERCICIO = '" + EW_GLOBAL._GetVariable("wc_any").ToString().Trim() + "' AND LETRA = '" + docPendiente.Letra + "' AND NUMERO = '" + docPendiente.Numero + "'";
343  }
344  else
345  {
346  lcSql = "UPDATE " + SQLDatabase(FACTUCERT._NombreAddOn, "FCFACTUVEN") + " SET ESTADO = " + estadoEnvio.ToString() + estadoAnulacion + entornoEnvio +
347  " WHERE EMPRESA = '" + EW_GLOBAL._GetVariable("wc_empresa").ToString() + "' AND EJERCICIO = '" + EW_GLOBAL._GetVariable("wc_any").ToString().Trim() + "' AND NUMERO = '" + docPendiente.Numero + "'";
348  }
349  var updateOk = sage.ew.db.DB.SQLExec(lcSql, out int filasAfectadas);
350  if (!updateOk || filasAfectadas.Equals(0))
351  {
352  //Si ha fallado el update o no ha sido capaz de marcar el elemento que acaba de procesar dejo marca
353  Registrar_Error(new NotSupportedException($"Actualización elemento procesado fallida: {Environment.NewLine} {lcSql}"));
354  }
355  }
356 
366  private object[] GetValoresTabla(string[] fields, string tableDatabase, string tableName, string whereClause, bool desactivarCacheDB = false)
367  {
368  DataTable ldtable = new DataTable();
369 
370  string lcSql = " SELECT ";
371  for (int i = 0; i < fields.Length; i++)
372  {
373  if (i == 0)
374  lcSql += fields[i];
375  else
376  lcSql += ", " + fields[i];
377  }
378 
379  lcSql += " FROM " + SQLDatabase(tableDatabase, tableName) + Environment.NewLine;
380 
381  if (!string.IsNullOrWhiteSpace(whereClause))
382  lcSql += " WHERE " + whereClause;
383 
384  bool cacheActivaPreviamente = true;
385  if (desactivarCacheDB)
386  {
387  cacheActivaPreviamente = _UsamosCache();
388  _SetTimeCacheTo(0);
389  }
390 
391  bool llOk = SQLExec(lcSql, ref ldtable);
392 
393  if (desactivarCacheDB && cacheActivaPreviamente)
394  {
395  _SetTimeCacheTo(2);
396  }
397 
398  object[] lcRes = null;
399  if (llOk && ldtable != null && ldtable.Rows.Count > 0)
400  {
401  lcRes = ldtable.Rows[0].ItemArray;
402  }
403 
404  FUNCTIONS._DisposeDatatable(ldtable);
405 
406  return lcRes;
407  }
408 
414  public VerifautorDTO ObtenerCodigoVerificacionAutor(string codigoEmpresa)
415  {
416  DataTable datos = new DataTable();
417  var lcSql = $"SELECT EMPRESA, CODIGO, TIPO, PREDET " + Environment.NewLine +
418  $"FROM {SQLDatabase(FACTUCERT._NombreAddOn, "VERIFAUTOR")} " +
419  $"WHERE EMPRESA = {SQLString(codigoEmpresa)} AND PREDET = 1 ";
420 
421  if (SQLExec(lcSql, ref datos) && datos.Rows.Count > 0)
422  {
423  VerifautorDTO dto = new VerifautorDTO()
424  {
425  Empresa = codigoEmpresa,
426  Codigo = Convert.ToString(datos.Rows[0]["CODIGO"]).TrimEnd(),
427  Tipo = Convert.ToInt32(datos.Rows[0]["TIPO"]),
428  Predet = Convert.ToBoolean(datos.Rows[0]["PREDET"]),
429  };
430  return dto;
431  }
432  return null;
433  }
434 
440  public ModconfiDTO ObtenerDatosModconfi(string codigoEmpresa)
441  {
442  DataTable datos = new DataTable();
443  var lcSql = $"SELECT a.EMPRESA, a.NOMBRE, a.APELLIDO, a.NIF, b.GUID_ID " + Environment.NewLine +
444  $"FROM {SQLDatabase("GESTION", "MODCONFI")} a INNER JOIN {SQLDatabase("GESTION","EMPRESA")} b ON a.EMPRESA = b.CODIGO " +
445  $"WHERE a.EMPRESA = {SQLString(codigoEmpresa)} ";
446 
447  if (SQLExec(lcSql, ref datos) && datos.Rows.Count > 0)
448  {
449  ModconfiDTO dto = new ModconfiDTO()
450  {
451  Empresa = codigoEmpresa,
452  Nombre = Convert.ToString(datos.Rows[0]["NOMBRE"]).TrimEnd(),
453  Apellido = Convert.ToString(datos.Rows[0]["APELLIDO"]).TrimEnd(),
454  Nif = Convert.ToString(datos.Rows[0]["NIF"]).TrimEnd(),
455  Guid_id = Convert.ToString(datos.Rows[0]["GUID_ID"]).TrimEnd(),
456  };
457  return dto;
458  }
459  return null;
460  }
461 
468  public RegistroFactuvenDTO ObtenerRegistroFactuven(string codigoEmpresa, string numfra)
469  {
470  DataTable datos = new DataTable();
471  var lcSql = $"SELECT EMPRESA, NUMERO, OPERACION, RETPORCEN, SIITERCERO, TBTERCERO, SIIFRAMOD, SIINUMDER, SIINUMINI, SIINUMFIN " + Environment.NewLine +
472  $"FROM {SQLDatabase("GESTION", "C_FACTUVEN")} " +
473  $"WHERE EMPRESA = {SQLString(codigoEmpresa)} AND NUMERO = {SQLString(numfra)} ";
474 
475  if (SQLExec(lcSql, ref datos) && datos.Rows.Count > 0)
476  {
478  {
479  Empresa = codigoEmpresa,
480  Numero = Convert.ToString(datos.Rows[0]["NUMERO"]).TrimEnd(),
481  Operacion = Convert.ToInt32(datos.Rows[0]["OPERACION"]),
482  Retporcen = Convert.ToDecimal(datos.Rows[0]["RETPORCEN"]),
483  Siitercero = Convert.ToBoolean(datos.Rows[0]["SIITERCERO"]),
484  Tbtercero = Convert.ToInt32(datos.Rows[0]["TBTERCERO"]),
485  Siiframod = Convert.ToString(datos.Rows[0]["SIIFRAMOD"]).TrimEnd(),
486  Siinumder = Convert.ToString(datos.Rows[0]["SIINUMDER"]).TrimEnd(),
487  Siinumini = Convert.ToString(datos.Rows[0]["SIINUMINI"]).TrimEnd(),
488  Siinumfin = Convert.ToString(datos.Rows[0]["SIINUMFIN"]).TrimEnd(),
489  };
490  return dto;
491  }
492  return null;
493  }
494 
502  public RegistroFcfactuvenDTO ObtenerRegistroFcfactuven(string codigoEmpresa, string numfra, string ejercicio)
503  {
504  DataTable datos = new DataTable();
505  var lcSql = $"SELECT * " + Environment.NewLine +
506  $"FROM {SQLDatabase("FACTUCERT", "FCFACTUVEN")} " +
507  $"WHERE EMPRESA = {SQLString(codigoEmpresa)} AND NUMERO = {SQLString(numfra)} AND EJERCICIO = {SQLString(ejercicio)} ";
508 
509  if (SQLExec(lcSql, ref datos) && datos.Rows.Count > 0)
510  {
512  {
513  Usuario = Convert.ToString(datos.Rows[0]["USUARIO"]).TrimEnd(),
514  Empresa = codigoEmpresa,
515  Ejercicio = Convert.ToString(datos.Rows[0]["EJERCICIO"]).TrimEnd(),
516  Numero = Convert.ToString(datos.Rows[0]["NUMERO"]).TrimEnd(),
517  Borrador = Convert.ToString(datos.Rows[0]["BORRADOR"]).TrimEnd(),
518  Sistema = Convert.ToInt32(datos.Rows[0]["SISTEMA"]),
519  Territorio = Convert.ToInt32(datos.Rows[0]["TERRITORIO"]),
520  Tipo_cert = Convert.ToInt32(datos.Rows[0]["TIPO_CERT"]),
521  Tbai = Convert.ToString(datos.Rows[0]["TBAI"]).TrimEnd(),
522  QR_Tbai = Convert.ToString(datos.Rows[0]["QR_TBAI"]).TrimEnd(),
523  Firma = Convert.ToString(datos.Rows[0]["FIRMA"]).TrimEnd(),
524  Huella = Convert.ToString(datos.Rows[0]["HUELLA"]).TrimEnd(),
525  Estado = Convert.ToInt32(datos.Rows[0]["ESTADO"]),
526  Huella_ant = Convert.ToString(datos.Rows[0]["HUELLA_ANT"]).TrimEnd(),
527  Hora = Convert.ToDateTime(datos.Rows[0]["HORA"]),
528  N_serie = Convert.ToString(datos.Rows[0]["N_SERIE"]).TrimEnd(),
529  Modtipenv = Convert.ToInt32(datos.Rows[0]["MODTIPENV"]),
530  Modestado = Convert.ToInt32(datos.Rows[0]["MODESTADO"]),
531  Modautoriz = Convert.ToString(datos.Rows[0]["MODAUTORIZ"]).TrimEnd(),
532  Modperiod = Convert.ToString(datos.Rows[0]["MODPERIOD"]).TrimEnd(),
533  Modiae = Convert.ToString(datos.Rows[0]["MODIAE"]).TrimEnd(),
534  Anulado = Convert.ToInt32(datos.Rows[0]["ANULADO"]),
535  Tipoenvio = Convert.ToInt32(datos.Rows[0]["TIPOENVIO"]),
536  Totaldoc = Convert.ToDecimal(datos.Rows[0]["TOTALDOC"]),
537  Ter_no_env = Convert.ToBoolean(datos.Rows[0]["TER_NO_ENV"]),
538  Cliente = Convert.ToString(datos.Rows[0]["CLIENTE"]).TrimEnd(),
539  Fecha_fac = Convert.ToDateTime(datos.Rows[0]["FECHA_FAC"]),
540  Base = Convert.ToDecimal(datos.Rows[0]["BASE"]),
541  Husohora = Convert.ToString(datos.Rows[0]["HUSOHORA"]).TrimEnd(),
542  QR_verifac = Convert.ToString(datos.Rows[0]["QR_VERIFAC"]).TrimEnd(),
543  Terminal = Convert.ToString(datos.Rows[0]["TERMINAL"]).TrimEnd(),
544  };
545 
546  return dto;
547  }
548 
549  return null;
550  }
551 
559  public RegistroModocertDTO ObtenerRegistroModocert(string codigoEmpresa, string numfra, string ejercicio)
560  {
561  if (SQLExisteTabla("FACTUCERT", "MODOCERT") == false)
562  return null;
563 
564  DataTable datos = new DataTable();
565  var lcSql = $"SELECT * " + Environment.NewLine +
566  $"FROM {SQLDatabase("FACTUCERT", "MODOCERT")} " +
567  $"WHERE EMPRESA = {SQLString(codigoEmpresa)} AND NUMERO = {SQLString(numfra)} AND EJERCICIO = {SQLString(ejercicio)} ";
568 
569  if (SQLExec(lcSql, ref datos) && datos.Rows.Count > 0)
570  {
572  {
573  Usuario = Convert.ToString(datos.Rows[0]["USUARIO"]).TrimEnd(),
574  Empresa = codigoEmpresa,
575  Ejercicio = Convert.ToString(datos.Rows[0]["EJERCICIO"]).TrimEnd(),
576  Numero = Convert.ToString(datos.Rows[0]["NUMERO"]).TrimEnd(),
577  Modanula = Convert.ToBoolean(datos.Rows[0]["MODANULA"]),
578  Modificado = Convert.ToInt32(datos.Rows[0]["MODIFICADO"]),
579  Fecha = Convert.ToDateTime(datos.Rows[0]["FECHA"]),
580  Cliente = Convert.ToString(datos.Rows[0]["CLIENTE"]).TrimEnd(),
581  Nombre_cli = Convert.ToString(datos.Rows[0]["NOMBRE_CLI"]).TrimEnd(),
582  Divisa = Convert.ToString(datos.Rows[0]["DIVISA"]).TrimEnd(),
583  Totaldoc = Convert.ToDecimal(datos.Rows[0]["TOTALDOC"]),
584  Totaldiv = Convert.ToDecimal(datos.Rows[0]["TOTALDIV"]),
585  Detalle = Convert.ToString(datos.Rows[0]["DETALLE"]).TrimEnd(),
586  Portes = Convert.ToString(datos.Rows[0]["PORTES"]).TrimEnd(),
587  Sistema = Convert.ToInt32(datos.Rows[0]["SISTEMA"]),
588  Territorio = Convert.ToInt32(datos.Rows[0]["TERRITORIO"]),
589  Tipo_cert = Convert.ToInt32(datos.Rows[0]["TIPO_CERT"]),
590  Firma = Convert.ToString(datos.Rows[0]["FIRMA"]).TrimEnd(),
591  Huella = Convert.ToString(datos.Rows[0]["HUELLA"]).TrimEnd(),
592  Estado = Convert.ToInt32(datos.Rows[0]["ESTADO"]),
593  Huella_ant = Convert.ToString(datos.Rows[0]["HUELLA_ANT"]).TrimEnd(),
594  Hora = Convert.ToDateTime(datos.Rows[0]["HORA"]),
595  HusoHora = Convert.ToString(datos.Rows[0]["HUSOHORA"]).TrimEnd(),
596  Idfcfactu = Convert.ToString(datos.Rows[0]["IDFCFACTU"]).TrimEnd(),
597  Siiframod = Convert.ToString(datos.Rows[0]["SIIFRAMOD"]).TrimEnd(),
598  Siinumder = Convert.ToString(datos.Rows[0]["SIINUMDER"]).TrimEnd(),
599  Operacion = Convert.ToInt32(datos.Rows[0]["OPERACION"]),
600  Datosadici = Convert.ToString(datos.Rows[0]["DATOSADICI"]).TrimEnd(),
601  QR_verifac = Convert.ToString(datos.Rows[0]["QR_VERIFAC"]).TrimEnd(),
602  Terminal = Convert.ToString(datos.Rows[0]["TERMINAL"]).TrimEnd(),
603  Tipoenvio = Convert.ToInt32(datos.Rows[0]["TIPOENVIO"]),
604  Datosmod = Convert.ToString(datos.Rows[0]["DATOSMOD"]).TrimEnd(),
605  };
606 
607  return dto;
608  }
609 
610  return null;
611  }
612  }
613 }
Estructura para representar un registro de FCREGCERT
Definition: FcregcertDTO.cs:12
VerifautorDTO ObtenerCodigoVerificacionAutor(string codigoEmpresa)
Obtiene los datos de verificacion de autor
Classe empresa basada en sage.ew.ewmante
Definition: clsEmpresa.cs:48
Este es el espacio de nombres de su módulo. Puede encontrar más información y ayuda en el fichero rea...
string Letra
Por defecto en blanco (va incluida en Numero)
RegistroFactuvenDTO ObtenerRegistroFactuven(string codigoEmpresa, string numfra)
Obtiene los datos de la factura de la tabla GESTION.C_FACTUVEN
IEnumerable< DetalleFacturaRectificativaDTO > ObtenerDatosFacturasRectificadas(string ejercicio, string empresa, string factura)
Obtiene la colección de detalles de facturas rectificadas
Clase DTO para representar datos de facturas rectificativas
bool ObtainDBLock(int maxLockMinutes=MaxLockMinutes)
Check and try to get a lock for the Sending process
DTO de la tabla GESTION.MODCONFI
Definition: ModconfiDTO.cs:7
Clase Auxiliar para almacenar datos de un envio pendiente
string ObternerLetraPais(string codigoPais)
Obtiene las letras asociadas a un código de país
RegistroFcfactuvenDTO ObtenerRegistroFcfactuven(string codigoEmpresa, string numfra, string ejercicio)
Obtiene los datos de la factura de la tabla FACTUCERT.FCFACTUVEN
Clase DTO para representar datos de facturas rectificativas
string [] ObtenerDatosCertificado(string nombreTerminal, string codigoEmpresa)
Recupera los datos de certificado
Clase DTO para representar registros de la tabla FACTUCERT.VERIFAUTOR
Definition: VerifautorDTO.cs:6
Clase de acceso a datos de la certificación
ModconfiDTO ObtenerDatosModconfi(string codigoEmpresa)
Obtiene los datos de configuracion de modelos
void RegistrarTraza(string basicInfo, string extendedInfo)
Traces for debugging
TipoEnvio
Entorno de envío PRE/PRO
Definition: Enums.cs:710
int ObternerTipoIdFiscal(string codigoCliente)
Obtiene el tipo de identificador fiscal de un cliente
RegistroModocertDTO ObtenerRegistroModocert(string codigoEmpresa, string numfra, string ejercicio)
Obtiene los datos de la factura de la tabla FACTUCERT.MODOCERT
bool UserRazonComercial(string codigoEmpresa)
Consulta la configuración y determina si hay que informar con Nombre o Nombre2
void ActualizarEstadoEnvioDocumentoGestion(EnvioPendiente docPendiente, int estadoEnvio)
Actualiza el estado del envio
Clase base de acceso a datos
Definition: BaseDA.cs:14
int ObtenerTipoEncadenamiento()
Obtiene el tipo de encadenamiento
Interficie de acceso a datos para la certificación
int ObternerMaxLineaFcregcert(string empresa, string ejercicio, string serieTicket, string numBorrador)
Obtiene el numero de linea máximo de la BBDD
Clase base para el módulo FactuCert
Definition: SageAddons.cs:1993
IEnumerable< DetalleTicketRectificativoDTO > ObtenerDatosTicketsRectificados(string ejercicio, string empresa, string ticket, string letra)
Obtiene la colección de detalles de tickets rectificados
bool InsertarRegistroFcregcert(FcregcertDTO registro)
Inserta un registro nuevo en FCREGCERT con los datos recibidos por DTO
int ObtenerTerritorio(string codigoEmpresa)
Obtiene el territorio para la empresa recibida por parámetro de la configuración del Addon ...
Clase estática de acceso a Base de Datos
Definition: DB.cs:26