Fishbowl Query: QBO Invoice ID


SELECT DISTINCT
    ps.extTxnID AS `QuickBooks Online Invoice ID`,

    CASE
        WHEN RIGHT(TRIM(s.num), 3) REGEXP '^-[0-9][0-9]$'
            THEN LEFT(TRIM(s.num), CHAR_LENGTH(TRIM(s.num)) - 3)
        ELSE TRIM(s.num)
    END AS `Zoey Order Number`,

    qbc.name AS `QuickBooks Class Name`

FROM postso ps

INNER JOIN so s
    ON s.id = ps.soid

INNER JOIN qbclass qbc
    ON qbc.id = s.qbClassId

CROSS JOIN (
    SELECT
        (
            SELECT fsh1.lastRunTime
            FROM fbschedule fs1
            INNER JOIN fbschedulehistory fsh1
                ON fsh1.scheduleId = fs1.id
            WHERE TRIM(fs1.name) = 'Invoices to Zoey'
            ORDER BY fsh1.lastRunTime DESC
            LIMIT 1
        ) AS CurrentRunTime,

        (
            SELECT fsh2.lastRunTime
            FROM fbschedule fs2
            INNER JOIN fbschedulehistory fsh2
                ON fsh2.scheduleId = fs2.id
            WHERE TRIM(fs2.name) = 'Invoices to Zoey'
            ORDER BY fsh2.lastRunTime DESC
            LIMIT 1, 1
        ) AS PreviousRunTime
) cutoff

WHERE NULLIF(TRIM(ps.extTxnID), '') IS NOT NULL

  AND UPPER(TRIM(qbc.name)) = 'ZOEY'

  AND NOT EXISTS (
        SELECT 1
        FROM postorderstatus pos
        WHERE pos.id = ps.statusId
          AND (
                UPPER(TRIM(pos.name)) LIKE '%VOID%'
             OR UPPER(TRIM(pos.name)) LIKE '%DELET%'
             OR UPPER(TRIM(pos.name)) LIKE '%CANCEL%'
          )
      )

  AND NOT EXISTS (
        SELECT 1
        FROM sostatus sos
        WHERE sos.id = s.statusId
          AND (
                UPPER(TRIM(sos.name)) LIKE '%VOID%'
             OR UPPER(TRIM(sos.name)) LIKE '%DELET%'
             OR UPPER(TRIM(sos.name)) LIKE '%CANCEL%'
          )
      )

  AND cutoff.CurrentRunTime IS NOT NULL
  AND cutoff.PreviousRunTime IS NOT NULL

  /*
     Capture invoices whose QBO ID record was updated between
     the prior hourly run and the current hourly run.
  */
  AND ps.dateLastModified > cutoff.PreviousRunTime
  AND ps.dateLastModified <= cutoff.CurrentRunTime

ORDER BY
    ps.extTxnID;