LibroEmitidas.cs
1 # region Usings
2 using System;
3 using System.Collections.Generic;
4 using System.Drawing;
5 using System.Linq;
6 using System.Text;
7 using System.Data;
8 
9 using Sage.ES.S50.Modelos.Clases;
11 using sage.ew.contabilidad;
12 using sage.ew.db;
13 using sage.ew.global;
15 using sage.ew.listados.Clases;
16 #endregion Usings
17 
18 namespace Sage.ES.S50.Modelos
19 {
23  public class LibroEmitidas: LibroBase
24  {
25 
26  #region CONSTRUCTORES
27 
31  public LibroEmitidas() : base()
32  {
33 
34  }
35 
40  public LibroEmitidas(IModeloFiscalLibros toModeloFiscalLibros) :base(toModeloFiscalLibros)
41  {
42 
43  }
44 
45  #endregion CONSTRUCTOR
46 
47  #region METODOS PROTECTED
48 
52  protected override void _DefinicionLiteralesLibro()
53  {
54  base._DefinicionLiteralesLibro();
55 
56  _Titulo = "Emitidas";
57  _Capitulo = "Capítulo de facturas emitidas";
58  _Subcapitulo = "Capítulo de facturas emitidas";
59  }
60 
64  protected override void _DefinicionColumnasLibro()
65  {
66  _ColumnaSeleccion();
67  _ColumnaTerritorio();
68  _ColumnaEstado();
69  _ColumnaTipoEnvio();
70  _ColumnaEstadoAEAT();
71  _ColumnaIncidencia();
72  _ColumnaProximoEnvio();
73  _ColumnaFactura();
74  _ColumnaNumeroFacturaExpedicion();
75  _ColumnaAutorizacion();
76  _ColumnaDescripcionOperacion();
77  _ColumnaFechaExpedicion();
78  _ColumnaFechaOperacion();
79  _ColumnaContado();
80  _ColumnaCodigo();
81  _ColumnaTipoIdentificacion();
82  _ColumnaNIF();
83  _ColumnaNombreRazonSocial();
84  _ColumnaBase();
85  _ColumnaIVA();
86  _ColumnaRecargo();
87  _ColumnaImporte();
88  _ColumnaTipoOperacion();
89  _ColumnaCausaOperacionSujetaExenta();
90  _ColumnaCausaOperacionSujetaExentaCanarias();
91  _ColumnaCausaOperacionNoSujeta();
92  _ColumnaTipoFacturaRectificativa();
93  _ColumnaRectificativa();
94  _ColumnaCamposAdicionales();
95  _ColumnaRegistroPrevio();
96  }
97 
101  protected override void _DescripcionesFila()
102  {
103  _DescripcionFacturasAnterioresInclusionSII();
104  _DescripcionRechazadasFueraPlazo();
105  _DescripcionAceptadasConErrores();
106  _DescripcionAceptadas();
107  }
108 
112  protected override void _DefinicionBotones()
113  {
114  _BotonAsiento();
115  _BotonFacturaVenta();
116  _BotonCliente();
117  _BotonAlbaranesPedientesFacturar();
118  _BotonDatosContado();
119  _BotonAplicarRegistroPrevio();
120  }
121 
125  protected override void _DefinicionTablas()
126  {
127  _AddTabla(new LibroTabla { _BD = "GESTION", _Tabla= "IVAREPER"});
128  _AddTabla(new LibroTabla { _BD = "GESTION", _Tabla = "IVA_EXEN", _Exento = true });
129  }
130 
134  protected override void _DefinicionTablasHistorial()
135  {
136  _AddTablaHistorial(new LibroTabla { _BD = "GESTION", _Tabla = "IVAREPSII" });
137  _AddTablaHistorial(new LibroTabla { _BD = "GESTION", _Tabla = "IVAEXESII", _Exento = true });
138  }
139 
144  protected override bool _DatosLoad()
145  {
146  List<IDatosIVA> lstEmitidas = new List<IDatosIVA>();
147 
148  if (_IVARepercutido != null && _IVARepercutido.Count() > 0) //registros de repercutido que no sean comunitarios
149  lstEmitidas = _IVARepercutido.Where(iva => !iva._Comunitario && _FiltrarRegistros(iva)).ToList();
150 
151  // En bajas de IVAREPER en principio en IVAREPSII solo tenemos el campo INTRACOM de tipo lógico que va a parar a la propiedad
152  // _Comunitario. Si se trabaja con addon de facturación certificada los datos de bajas provienen de la tabla HISIVASREP y alli tambien
153  // solo tenemos el campo INTRACOM que tambien va a parar a la propiedad _Comunitario
154  //
155  if (_BajasIVARepercutido != null && _BajasIVARepercutido.Count() > 0)
156  _BajasIVARepercutido.Where(iva => !iva._Comunitario && _FiltrarRegistros(iva)).ToList().ForEach(iva => lstEmitidas.Add(iva));
157 
158  //ISABEL- Falta crear enumerat iva exento 2: ventes i 1:compres
159  if (_IVAExento != null && _IVAExento.Count() > 0) //iva exento de ventas
160  _IVAExento.Where(iva => iva._Tipo == 2 && _FiltrarRegistros(iva)).ToList().ForEach(exen => lstEmitidas.Add(exen));
161 
162 
163  // Solo añadimos los registros de facturas que no estuvieran ya obtenidos en _BajasIVARepercutido pues si una factura tiene más
164  // de un tipo de IVA como bajas solo tiene que aparecer un único registro.
165  //
166  // Si la factura tiene 2 tipos de IVA normales eso ya viene resuelto en _BajasIVARepercutido pues alli en la consulta ya se hace
167  // un GROUP BY empresa, cuenta, factura. Idéntico caso pasaría si la factura tiene dos tipos de IVA no sujetos, en _BajasIVAExento
168  // ya esta agrupado. El problema es cuando la factura viene con un tipo de IVA sujeto y otro no sujeto, entonces nos venía un
169  // registro por cada lado, y aparecían 2 registros como bajas en el libro, por eso aquí antes de añadir un registro nos aseguramos
170  // de que no fue añadido antes partiendo de _BajasIVARepercutido.
171  //
172  if (_BajasIVAExento != null && _BajasIVAExento.Count() > 0) //iva exento de ventas
173  _BajasIVAExento.Where(iva => iva._Tipo == 2 && !iva._Comunitario && (_BajasIVARepercutido == null || _BajasIVARepercutido.Where(x => x._Empresa == iva._Empresa && x._Codigo == iva._Codigo && x._Factura.Trim() == iva._Factura.Trim()).Count() == 0) &&
174  _FiltrarRegistros(iva)).ToList().ForEach(exen => lstEmitidas.Add(exen));
175 
176  if (lstEmitidas != null && lstEmitidas.Count() > 0)
177  lstEmitidas.OrderByDescending(e => e._Territorio).ThenBy(e => e._TipoRegIVA).ThenBy(e=>e._Factura).ThenBy(e => ((DatosIVABase)e)._TipoIVA).ToList().ForEach(iva => _AddFila(iva));
178 
179  lstEmitidas.Clear();
180  lstEmitidas = null;
181 
182  return true;
183  }
184 
188  protected override void _AddIVARepercutido()
189  {
190  if (((ModeloFiscalLibrosBase)_oModeloFiscalLibros)._DatosIVARepercutido != null && ((ModeloFiscalLibrosBase)_oModeloFiscalLibros)._DatosIVARepercutido.Rows.Count > 0)
191  {
192  DataTable lstEmitidas = ((ModeloFiscalLibrosBase)_oModeloFiscalLibros)._DatosIVARepercutido.AsEnumerable().
193  Where(row => !_TipoIvasExcluidos.Contains(row.Field<string>("tipo_iva"))).__CopyToDataTable();
194 
195  _AddLista(InformacionModelos.IVARepercutido, lstEmitidas);
196  }
197 
198  return;
199  }
200 
204  protected override void _AddIVAExento()
205  {
206  if (((ModeloFiscalLibrosBase)_oModeloFiscalLibros)._DatosIVAExento != null && ((ModeloFiscalLibrosBase)_oModeloFiscalLibros)._DatosIVAExento.Rows.Count > 0)
207  {
208  DataTable lstEmitidas = ((ModeloFiscalLibrosBase)_oModeloFiscalLibros)._DatosIVAExento.AsEnumerable().
209  Where(row => !_TipoIvasExcluidos.Contains(row.Field<string>("tipo_iva"))).__CopyToDataTable();
210  _AddLista(InformacionModelos.IvaExento, lstEmitidas);
211  }
212 
213  return;
214  }
215 
222  protected override bool _DatosSave(IDatosIVA tcDatos, ref StringBuilder tcSave)
223  {
224  return base._DatosSave(tcDatos, ref tcSave);
225  }
226 
231  protected override List<IRespuestaFactura> _DatosActualizarHistorialValidacion(List<IRespuestaFactura> tlstRespuestas)
232  {
233  tlstRespuestas = (from loFila in tlstRespuestas
234  group loFila by new { Factura = loFila._Factura } into g
235  select g.First()).ToList();
236 
237  return tlstRespuestas;
238  }
239 
246  protected override void _DatosActualizarHistorialAdicional(ILibroTabla toTabla, DatosIVABase toDatosIva, ref StringBuilder tcEstado)
247  {
248  tcEstado.Append($@"
249  UPDATE {DB.SQLDatabase(toTabla._BD, toTabla._Tabla)}
250  SET intracom = {(toDatosIva._Comunitario ? DB.SQLTrue() : DB.SQLFalse())},
251  fechaoper = {DB.SQLString(toDatosIva._FechaOperacion)},
252  fechaasi = {DB.SQLString(toDatosIva._FechaAsiento)},
253  siinumini = {DB.SQLString(toDatosIva._SIINumIni)},
254  siinumfin = {DB.SQLString(toDatosIva._SIINumFin)}
255  WHERE empresa = {DB.SQLString(EW_GLOBAL._GetVariable("wc_empresa"))} and guid_id = {DB.SQLString(toDatosIva._Guid_Hist)};
256  ;");
257  }
258 
265  protected override void _DatosActualizarEstadoAdicional(ILibroTabla toTabla, DatosIVABase toDatosIva, ref StringBuilder tcEstado)
266  {
267  string lcCamposContado = (toDatosIva._Contado && toTabla._Tabla == "IVAREPER" ? $",cif = { DB.SQLString(toDatosIva._NIF)}," : "");
268  lcCamposContado += (toDatosIva._Contado && toTabla._Tabla == "IVAREPER" ? $"nombre = { DB.SQLString(toDatosIva._NombreRazonSocial)} " : "");
269 
270  tcEstado.Append($@"
271  UPDATE {DB.SQLDatabase(toTabla._BD, toTabla._Tabla)}
272  SET siiautoriz = {DB.SQLString(toDatosIva._Autorizacion)},
273  siidescope = {DB.SQLString(toDatosIva._DescripcionOperacion)},
274  siiperiod = {DB.SQLString(toDatosIva._PeriodoFactura)},
275  siiprevio = {DB.SQLString(toDatosIva._SIIPrevio)}
276  {lcCamposContado}
277  WHERE empresa = {DB.SQLString(EW_GLOBAL._GetVariable("wc_empresa"))} and guid_id = {DB.SQLString(toDatosIva._IdentificacionFactura)};
278  ;");
279  }
280 
285  protected override void _AsignarPeriodo(DatosIVABase toFila)
286  {
287  // Sólo asignamos el periodo en caso de que no esté lleno
288  if (!string.IsNullOrWhiteSpace(toFila._PeriodoFactura))
289  return;
290 
291  // Por defecto, fecha de expedición
292  DateTime ldFecha = Convert.ToDateTime(toFila._FechaExpedicion);
293 
294  // Si hay fecha de operación, la usamos
295  if (toFila._FechaOperacion != null && toFila._FechaOperacion != DateTime.MinValue)
296  ldFecha = Convert.ToDateTime(toFila._FechaOperacion);
297 
298  // En caso de rectificativas, usar fecha de expedición
299  if (!string.IsNullOrWhiteSpace(toFila._SIIOriTip) && !string.IsNullOrWhiteSpace(toFila._SIIOriMot))
300  ldFecha = Convert.ToDateTime(toFila._FechaExpedicion);
301 
302  // En caso de operación "Fra Emitida en sustitución de una fra. simplificada sin identificación", utilizar la fecha de la factura original
303  if (toFila._Operacion == 28)
304  ldFecha = Convert.ToDateTime(toFila._SIIDevengoFechaIni);
305 
306  // Asignar periodo
307  toFila._PeriodoFactura = _ObtenerPeriodo(ldFecha);
308  }
309 
310 
317  public override List<IRespuestaFactura> _ValidarXML()
318  {
319  List<IRespuestaFactura> loRespuestaBase;
320  List<IRespuestaFactura> loRespuesta = new List<IRespuestaFactura>();
321 
322  // Miramos que las facturas rectificativas tengan sus datos introducidos correctamente
323  if (_Filas.Any(f => f._Seleccion))
324  {
325  loRespuesta = ValidarDatosRectificativas();
326 
327  // Ahora añadiremos las validaciones de la base
328  loRespuestaBase = base._ValidarXML();
329 
330  if (loRespuestaBase is List<IRespuestaFactura> && loRespuestaBase.Count > 0) loRespuesta.AddRange(loRespuestaBase);
331  }
332 
333  return loRespuesta;
334  }
335 
340  protected virtual List<IRespuestaFactura> ValidarDatosRectificativas()
341  {
342  RespuestaFacturaBase loRes;
343  List<IRespuestaFactura> loRespuesta = new List<IRespuestaFactura>();
344 
345  if (_Filas.Any(f => f._Seleccion))
346  {
347  // Obtener filas de facturas seleccionadas para enviar sin datos de rectificativas informados
348  var loFacturasSinDatos = (_Filas.Where(f => f._Seleccion && (string.IsNullOrWhiteSpace(((DatosIVABase)f)._SIIOriTip) || (string.IsNullOrWhiteSpace(((DatosIVABase)f)._SIIOriMot)))));
349 
350  foreach (ILibroFila loFacturasNoEnviada in loFacturasSinDatos)
351  {
352  // Controlamos aquí que sean rectificativas ya que en el LINQ no funcionaba.
353  if (CONTABILIDAD._EsFacturaVentaRectificativa(loFacturasNoEnviada._Factura))
354  {
355  loRes = new RespuestaFacturaBase();
356 
357  loRes._Libro = this;
358  loRes._FechaExpedicion = loFacturasNoEnviada._FechaExpedicion is DateTime ? Convert.ToDateTime(loFacturasNoEnviada._FechaExpedicion) : DateTime.Now;
359  loRes._Factura = loFacturasNoEnviada._Factura;
360  loRes._Cuenta = loFacturasNoEnviada._Codigo;
361  loRes._Error._Descripcion = $"No se puede enviar la factura. Debe introducir los datos rectificativos desde el botón de la columna 'Rectificativa'.";
362  loRespuesta.Add(loRes);
363 
364  // Desmarcamos la fila para que no la envie.
365  loFacturasNoEnviada._Seleccion = false;
366  }
367  }
368  }
369 
370  return loRespuesta;
371  }
372 
373 
374  #endregion
375 
376 
377  #region METODOS PUBLIC
378 
383  public override bool _DescargarDatos()
384  {
385  return base._DescargarDatos();
386  }
387 
388  #endregion
389  }
390 }
override void _AddIVAExento()
Método que filtra sobre el DataTable de IVA_EXEN, para obtener la lista de registros de DATOSIVA resp...
Clase RegistroFiscal para
Definition: DatosIVABase.cs:34
DateTime _FechaExpedicion
Fecha de expedición
LibroEmitidas(IModeloFiscalLibros toModeloFiscalLibros)
Constructor con la referencia a modelosfiscallibros
Clase ModeloFiscalLibrosBase - Definición del modelo
Clase LibroBase - Definición de un libro del modelo
Definition: LibroBase.cs:51
string _Codigo
Código(Cliente, Cuenta, Proveedor)
Definition: ILibroFila.cs:61
DateTime _FechaOperacion
Fecha de operación
string _SIIOriTip
Indicará el tipo de factura rectificativa que corresponderá al campo SIIORITIP:
static bool _EsFacturaVentaRectificativa(string tcFactura)
Devuelve si el número de factura se corresponde a un documento rectificativo
override void _DefinicionColumnasLibro()
Definimos las columnas del libro emitidas
override void _DefinicionTablasHistorial()
Definimos las tablas de historial de envíos
override List< IRespuestaFactura > _ValidarXML()
Validaciones antes de enviar facturas
override void _AsignarPeriodo(DatosIVABase toFila)
Asignar Periodo especial para facturas emitidas
override bool _DatosSave(IDatosIVA tcDatos, ref StringBuilder tcSave)
Nos guarda los cambios de modelo -> en caso de error devuelve FALSE
Clase LibroEmitidas - Emitidas
string _Cuenta
Cuenta de la factura(cliente/proveedor)
override void _DefinicionLiteralesLibro()
Literales libro emitidas
override void _DatosActualizarEstadoAdicional(ILibroTabla toTabla, DatosIVABase toDatosIva, ref StringBuilder tcEstado)
Hacemos el update de los campos propios de las tablas q afectan al libro de emitidas ...
virtual List< IRespuestaFactura > ValidarDatosRectificativas()
Validar los datos de factuas rectificativas
override void _DatosActualizarHistorialAdicional(ILibroTabla toTabla, DatosIVABase toDatosIva, ref StringBuilder tcEstado)
Hacemos el update de los campos propios de las tablas q afectan al libro de emitidas ...
override void _AddIVARepercutido()
Método que filtra sobre el DataTable de IVA repercutido, para obtener la lista de registros de DATOSI...
DateTime _SIIDevengoFechaIni
Para indicar la fecha de expedición de la factura inicial. IVA Devengo. SIIDEVFEC ...
override void _DefinicionTablas()
Definimos las tablas
override void _DefinicionBotones()
Definimos los botones donde permitimos navegación
override List< IRespuestaFactura > _DatosActualizarHistorialValidacion(List< IRespuestaFactura > tlstRespuestas)
Validamos si la lista de respuestas es correcta o es necesario hacer algun tipo de tratamiento...
override bool _DatosLoad()
Preparar los datos de la información a presentar
LibroEmitidas()
Constructor sin parámetros
DateTime _FechaExpedicion
Fecha de expedición
Definition: ILibroFila.cs:132
override void _DescripcionesFila()
Descripciones de la fila
override bool _DescargarDatos()
Descargamos listas para volver a consultar
string _SIIOriMot
Motivo de rectificación
string _PeriodoFactura
SIIPERIOD-> modo SII debe guardar el mes 01, 02