sql >> Base de Datos >  >> RDS >> Mysql

Informe de contabilidad de doble entrada

Con la esperanza de que esto es lo que está buscando, que esto será suficiente:

  • simplemente INSERT LedgerTransaction ... para cada transacción del libro mayor del mundo real

Si está buscando más que eso, significa que necesita conceptos básicos de contabilidad, que no se pueden responder aquí. Consulte los Tutoriales gratuitos disponibles en la web.

SQL • Ver

He actualizado la vista de la pregunta vinculada para obtener TotalCredit &TotalDebit columnas, para todas las Transacciones desde el primer día del mes anterior.

CREATE VIEW Account_Current_V 
AS
    SELECT 
        AccountNo,
        Date = DATEADD( DD, -1, GETDATE() ), -- show previous day
        ClosingBalance,
        TotalCredit = (
            -- TotalCredit_Subquery
            SELECT SUM( Amount )
                FROM AccountTransaction
                WHERE AccountNo = @AccountNo
                    AND XactTypeCode_Ext IN ( "AC", "Dp" )
                        -- this month
                    AND DateTime >= CONVERT( CHAR(6), GETDATE(), 2 ) + "01"
                ),
        TotalDebit = (
            -- TotalDebit_Subquery
            SELECT SUM( Amount )
                FROM AccountTransaction
                WHERE AccountNo = @AccountNo
                    AND XactTypeCode_Ext NOT IN ( "AC", "Dp" )
                    AND DateTime >= CONVERT( CHAR(6), GETDATE(), 2 ) + "01"
                ),
        CurrentBalance = ClosingBalance + 
            <TotalCredit_Subquery> - 
            <TotalDebit_Subquery>
        FROM AccountStatement                -- 1st day of this month
        WHERE Date = CONVERT( CHAR(6), GETDATE(), 2 ) + "01"

SQL • Fin de mes • Insertar estado de cuenta

El día 1 del nuevo mes, la idea es cerrar el mes anterior, fechado el día 1 del nuevo mes. Usamos la vista anterior para obtener el TotalCredit &TotalDebit columnas para todas las Transacciones desde el primer día del mes anterior.

Esta es solo una tarea en el trabajo de fin de mes, el primer día del mes. Normalmente se ejecutaría en la cola por lotes, para todas las Accounts ,con límites de control de transacciones adecuados (por ejemplo, SET ROWCOUNT 500 ), etc.

INSERT AccountStatement 
    SELECT  AccountNo,
            -- Date: 1st day of this month
            CONVERT( CHAR(6), GETDATE(), 2 ) + "01",
            ACV.CurrentBalance,
            ACV.TotalCredit,
            ACV.TotalDebit
        FROM Account_Current_V    ACV
            JOIN AccountStatement ASS
                ON ACV.AccountNo = ASS.AccountNo
        -- AccountStatements that are not yet MonthEnd-ed
        -- get single row that is newest
        WHERE ASS.Date = (
            SELECT MAX( Date )
                FROM AccountStatement
                WHERE AccountNo = ASS.AccountNo
                )
                -- that is not 1st day of this month
            AND ASS.Date != CONVERT( CHAR(6), GETDATE(), 2 ) + "01"

Es lo mismo para actualizar el LedgerStatement .

No. Mientras que la interfaz GUI está en línea, una aplicación de complejidad razonable necesita ejecutar trabajos en el servidor back-end. P.ej. Fin de mes; Copias de seguridad diarias; resúmenes del registro de transacciones; etc. En general, hay una configuración en el servidor para hacer eso, de lo contrario, debe escribir uno.

Habrá muchas Tareas que comprenden Fin de Mes. Esta es solo una de esas tareas. Hay un límite para lo que puede hacer en PHP, y no soñaría con hacer esto en PHP. Por razones técnicas y de modularidad, colocaría el código para esa tarea y todas las demás tareas de fin de mes en un proceso almacenado Account_MonthEnd_btr .

No puedes hacerlo desde un botón porque:

  • colgará la GUI hasta que finalice la tarea de fin de mes, lo que puede demorar más de unos minutos (depende de la cantidad de Accounts) , LedgerAccounts , etc.).

  • volará el registro de transacciones (si el número de Ledgers o Accounts es del todo grande). Ese control también tiene que estar en la parte trasera.