El tratamiento y entrega diario de los documentos a notificar vía SII se puede automatizar mediante una tarea registrada en el gestor de tareas. Los distintos procesos que componen el tratamiento y transmisión de los datos se pueden gestionar en tareas independientes gestionando la franja de ejecución o estableciendo una única tarea que incluye la ejeución secuenciada de todos los procesos.

Los proceso que permiten su automatización como tareas programadas están descritos ampliamente en apartados anteriores, mostramos ahora una lista simple de los procesos susceptibles de automatizar. La gestión de estos procesos en una o varias tareas y su frecuencia de ejecución debe valorarse según el perfil de cada instalación.

  • Registrar datos de impuestos en SII Facturas
  • Registrar datos de impuestos en SII Pagos
  • Crear y enviar ficheros desde SII Facturas a la agencia fiscal
  • Crear y enviar ficheros desde SII Pagos a la agencia fiscal
  • Conversión SII Facturas de documentos tipo factura = F1 en documentos tipo factura = F2 por NIF/CIF incorrecto.
  • Cierre de periodo fiscal por Agencia tributaria

Se muestra a continuación una configuración de tareas programadas básicas. La última de ellas no corresponde a ningún proceso propio del entorno SII. Se programa una tarea de control cuya única función es comprobar la correcta ejecución de las tareas anteriores.

1 Facturas.Generación registros y Entrega mensajes

Proceso de registro de impuestos en SII Facturas. Asimismo, generación y entrega de ficheros ante las Agencias Tributarias. Periodicidad diaria. En una sola tarea se ejecutan varios procesos :

  • Registrar datos de impuestos en SII Facturas
  • Generar mensajes y envío a la agencia tributaria
  • Reenviar mensajes con estado de entrega erróneo o pendientes de integrar la respuesta.
  • Notificar por email los errores en SII Facturas

Copy
<script>
                // Registrar y enviar SII Facturas de los impuestos pendientes
                //
                // cimp_essii_facturas_generate(fecini, fecfin, strQry, envioSii, errorContinue)  
                //
                // EnvioSii = 0 Generar registros SII desde impuestos
                // EnvioSii = 1 Generar registros SII y enviar fichero SII a la Agencia Fiscal
                //
                // strQuery: filtro de selección de essii_facturas
                //
                // EL JS de proceso  essii_facturas_generate  revisa que el dato de
                // impuesto esté pendiente de entregar (status = 0)
                // No es necesario fijar condición 1=1
                Ax.db.call("cimp_essii_facturas_generate",
                            null,
                            null,
                            "cimpcont_head.fecha BETWEEN TODAY - 90 UNITS DAY AND TODAY",
                            1,
                            1);
                // Seleccionar y enviar los registros ya en SII Facturas pero no entregados
                // y finalizados.
                //
                // essii_facturas_cwsi_messages(enviosii, strQuery, isRefcat15)
                //
                // EnvioSii = 0 Generar fichero SII pero no enviar
                // EnvioSii = 1 Generar fichero SII y enviar
                //
                // strQuery: filtro de selección de essii_facturas
                //
                // El JS revisa TODOS los registros essii_facturas del rango de fechas
                // seleccionado que o son pendientes de procesar, o son enviados pero
                // no totalmente aceptados. No hay rango temporal.
                Ax.db.call("essii_facturas_cwsi_messages", 1, "1=1", 1);
                // =======================================================================================
                // Reenviar mensajes con estado de entrega erroneo o pendientes de integrar la respuesta.
                // =======================================================================================
                Ax.db.call("essii_cwsi_messages_send", '1=1');
                
                
                //========================================================================================
                // Notificar por mail . Registros essii_facturas en estado erroneo
                //========================================================================================
                
                var m_rs = Ax.db.executeQuery(`
                       SELECT libro, ejercicio, periodo, facidx, numfactura, fechafactura, sii_estado, sii_errnum, sii_errmsg
                         FROM essii_facturas
                        WHERE sii_errnum IS NOT NULL
                           OR sii_errmsg IS NOT NULL`).toMemory();;

                   if (m_rs.getRowCount() == 0) {
                       return;
                   }

                   var report = new Ax.rs.Report(m_rs);
                  
                   var md = report.getMetaData();

                   // Add styles colors
                   md.setColumnColor("sii_estado", "'#D32F2F:#FFFFFF'");
                   md.setColumnColor("sii_errnum", "'#D32F2F:#FFFFFF'");
                   md.setColumnColor("sii_errmsg", "'#D32F2F:#FFFFFF'");
                  
                   // Create a combo for type
                   md.setColumnCombo("sii_estado",
                      {
                           "0" : "No entregado",
                           "2" : "Con errores",
                           "3" : "Incorrecto"
                      }
                   );    
                  
                   md.setColumnLabels([
                       "Libro",
                       "Ejercicio",
                       "Periodo",
                       "Id.",
                       "Número factura",
                       "Fecha factura",
                       "Estado SII",
                       "Número error",
                       "Mensaje error"]);
                      
                   // Render to PDF
                   var pdf = report.toPDF(config => {
                       config.setTitle("Incidencias SII-Facturas");
                   });
                  
                   var mail = new Ax.mail.MailerMessage()
                       .to("responsable@cliente.es")
                       .from("info@deister.es")
                       .subject(`Incidencias en SII-Facturas de: [${Ax.db.getName()}]`)
                       .setText("Ver el docuemnto adjunto.")
                       .addAttachment("document", pdf, "application/pdf");
                      
                   var mailer = new Ax.mail.Mailer();
                       mailer.setSMTPServer("localhost",25);
                       mailer.send(mail);   
                
                </script>

2 Pagos.Generación registros y Entrega mensajes

Proceso de registro de impuestos en SII Pagos. Asimismo, generación y entrega de ficheros ante las Agencias Tributarias. Periodicidad diaria. En una sola tarea se ejecutan 2 procesos :

  • Registrar datos de impuestos en SII Pagos
  • Generar mensajes y envío a la agencia tributaria

Copy
<script>            
                // Enviar al SII TODOS los registros pendientes
                //
                // cimp_essii_pagos_generate(pFecIni, pFecFin, pSqlCond, pEnvioSii, errorContinue)
                //
                // pEnvioSii = 0 Generar registros SII desde impuestos
                // pEnvioSii = 1 Generar registros SII y enviar fichero SII a la Agencia Fiscal
                //
                // EL JS de proceso  essii_pagos_generate  revisa que el dato de 
                // impuesto esté pendiente de entregar (status = 0)
                // No és necesario fijar condición 1=1 
                Ax.db.call("cimp_essii_pagos_generate",
                            null,
                            null,
                            'cimpcont_head.fecha BETWEEN TODAY - 90 UNITS DAY AND TODAY',
                            1,
                            1);
            
                // Seleccionar y enviar los registros ya en SII Pagos pero no entregados
                // y finalizados.
                //
                // essii_pagos_cwsi_messages(enviosii, strQuery) 
                //
                // EnvioSii = 0 Generar fichero SII pero no enviar
                // EnvioSii = 1 Generar fichero SII y enviar 
                //
                // strQuery: filtro de selección de essii_pagos
                //
                // El JS revisa TODOS los registros essii_pagos del rango seleccionado 
                // que o son pendientes de procesar, o son enviados pero 
                // no totalmente aceptados. No hay rango temporal.
            
                Ax.db.call("essii_pagos_cwsi_messages", 1, "1=1");
            </script>

3 Conversión tipo factura F1 a F2 por error CIF/NIF

Proceso de conversión tipo factura. Trata documentos tipo factura = F1 y con errores relacionados con CIF/NIF.Se transforma el documento en tipo factura F2, permitiendo reenviarlo como documento simplificado sin identificación de CIF/NIF.

Copy
<call>
           
            <![CDATA[
    
            <xsql-script name='bb_sii_f2_noidentificado'>
             
                <body>
                    <foreach>
                        <select prefix='m_'>
                            <columns>
                                essii_facturas.*
                            </columns>
                            <from table='essii_facturas'>
                                <join table='cwsi_messages'>
                                    <on>essii_facturas.id_ws_request = cwsi_messages.id_ws_request</on>
                                </join>
                            </from>
                            <where>
                                     essii_facturas.libro = 'FE'
                                AND essii_facturas.erp_estado = 'E'
                                AND essii_facturas.sii_estado = '3'
                                <!-- los errores relacionados con el NIF son estos códigos -->
                                AND essii_facturas.sii_errnum IN (1101, 1117, 4111)
            
                                <!-- error haya dado hace mas de 4 dias -->
                                AND DATE(essii_facturas.date_created) BETWEEN TODAY - 10 AND TODAY - 4
            
                                AND ABS(essii_facturas.importetotal) &lt;= 400  
                            </where>
                        </select>
                        <do>
                            <!-- Revocar mensaje y modificar tipo factura -->
                            <update table='essii_facturas'>
                                <column name='erp_estado'>P</column>           <!-- Pendiente de entrega -->
                                <column name='sii_estado'><null/></column>
                                <column name='sii_errnum'><null/></column>
                                <column name='sii_errmsg'><null/></column>
                                <column name='pro_errmsg'><null/></column>
                                <column name='id_ws_request'><null/></column>
            
                                <column name='tipocomunicacion' text='true'>(CASE WHEN sii_estado IN ('1', '2', '3')
                                                                                  THEN (CASE WHEN tipocomunicacion = 'A5' THEN 'A6'
                                                                                             ELSE tipocomunicacion
                                                                                        END)
                                                                                  ELSE tipocomunicacion
                                                                             END)
                                </column>
                                   
                                <column name='tipofactura'><string>F2</string></column>
                                <column name='user_updated'><system.user.getCode/></column>
                                <column name='date_updated'><date.current/></column>
                                <where>
                                        essii_facturas.facidx = <m_facidx/>
                                    AND abs(essii_facturas.importetotal)    &lt;= 400  
                                </where>
                            </update>
                           
                            <update table='cwsi_messages'>
                                <column name='status_message'><string>CA</string></column>
                                <where>
                                    id_ws_request = <m_id_ws_request />
                                </where>
                            </update>
                        </do>
                    </foreach>
            
                    <delete table='cwsi_messages'>
                         <where>
                            status_message = 'CA' AND
                            NOT EXISTS (SELECT a.id_ws_request FROM essii_facturas a WHERE a.id_ws_request = cwsi_messages.id_ws_request) AND
                            NOT EXISTS (SELECT a.id_ws_request FROM cwsi_messages_single a WHERE a.id_ws_request = cwsi_messages.id_ws_request) AND
                            NOT EXISTS (SELECT a.id_ws_request FROM essii_ageviaje       a WHERE a.id_ws_request = cwsi_messages.id_ws_request) AND
                            NOT EXISTS (SELECT a.id_ws_request FROM essii_bieninve       a WHERE a.id_ws_request = cwsi_messages.id_ws_request) AND
                            NOT EXISTS (SELECT a.id_ws_request FROM essii_cobmetal       a WHERE a.id_ws_request = cwsi_messages.id_ws_request) AND
                            NOT EXISTS (SELECT a.id_ws_request FROM essii_opesegur       a WHERE a.id_ws_request = cwsi_messages.id_ws_request) AND
                            NOT EXISTS (SELECT a.id_ws_request FROM essii_pagos          a WHERE a.id_ws_request = cwsi_messages.id_ws_request) AND
                            NOT EXISTS (SELECT a.id_ws_request FROM essii_pagos_sii      a WHERE a.id_ws_request = cwsi_messages.id_ws_request)
                        </where>
                    </delete>
                </body>
            </xsql-script>
        ]]>
        
    
            </call>

4 Cierre de periodo fiscal por Agencia tributaria

Proceso de cierre periodo fiscal. Se cierra el periodo según la fecha finalización informada en el mismo.

Copy
UPDATE essii_agencia_periodo
               SET essii_agencia_periodo.peri_status  = 'C'
             WHERE essii_agencia_periodo.peri_enddate < TODAY

5 Control Tareas. Envío mail resultado

Envío de mail con el resultado de las tareas programadas.

Copy
<![CDATA[
            <xsql-script>
               <body>
                
                    <connection name='wic20_conf_sii'>
                    <foreach>
                        <select prefix='m_'>
                            <columns>
                                cron_task_name
                            </columns>
                            <from table='wic_crontab_tasks' />
                            <where>
                                wic_crontab_tasks.cron_task_disabled = 0 AND
                                wic_crontab_tasks.cron_task_name != 'mail_errores'
                            </where>
                        </select>
                        <do>
                            <select first='1' prefix='m_'>
                                <columns>
                                    task_date, task_type
                                </columns>
                                <from table='wic_crontab_execs' />
                                <where>
                                    wic_crontab_execs.task_code = <m_cron_task_name/> AND
                                    DATE(task_date) = <date.today/>
                                </where>
                                <order>
                                    wic_crontab_execs.task_date DESC
                                </order>
                            </select>
                            <!-- m_task_type = N means finished  -->
                            <!-- m_task_type = E means erroneous -->
                            <if>
                                <expr>
                                    <eq><m_task_type/>E</eq>
                                </expr>
                                <then>
                                    <mail
                                        smtphost='localhost'
                                        from='info@deister.es'
                                        to='usario@deister.es,usuario@cliente.es'
                                        subject='Deister cron SII ERROR: [#m_cron_task_name] [#m_task_date]'
                                        >
                                        <content>
                                            <string>http://cliente.deistercloud.com/servlet/jrep?code=wic_crontab_execs&amp;user=manager&amp;dbms=wic20_conf_sii&amp;cond=wic_crontab_execs.task_type%20%3D%20%27E%27&amp;query=true</string>
                                        </content>
                                    </mail>
                                </then>
                            </if>
                            
                        </do>
                    </foreach>
                    </connection>
               </body>
            </xsql-script>
        ]]>