示例#1
0
function VerifyItemDueDate($itemdue, $i, $Errors, $db)
{
    $sql = 'select confvalue from config where confname="' . DefaultDateFormat . '"';
    $result = api_DB_query($sql, $db);
    $myrow = DB_fetch_array($result);
    $DateFormat = $myrow[0];
    if (strstr($itemdue, '/')) {
        $DateArray = explode('/', $itemdue);
    } elseif (strstr($itemdue, '.')) {
        $DateArray = explode('.', $itemdue);
    }
    if ($DateFormat == 'd/m/Y') {
        $Day = $DateArray[0];
        $Month = $DateArray[1];
        $Year = $DateArray[2];
    } elseif ($DateFormat == 'm/d/Y') {
        $Day = $DateArray[1];
        $Month = $DateArray[0];
        $Year = $DateArray[2];
    } elseif ($DateFormat == 'Y/m/d') {
        $Day = $DateArray[2];
        $Month = $DateArray[1];
        $Year = $DateArray[0];
    } elseif ($DateFormat == 'd.m.Y') {
        $Day = $DateArray[0];
        $Month = $DateArray[1];
        $Year = $DateArray[2];
    }
    if (!checkdate(intval($Month), intval($Day), intval($Year))) {
        $Errors[$i] = InvalidItemDueDate;
    }
    return $Errors;
}
function AllocateTrans($AllocDetails, $User, $Password)
{
    /* This function is quite specific and probably not generally useful
     * It only attempts to allocate a receipt or credit note sent to invoices that have a customerref equal to the value sent
     *
     * The first parameter  AllocDetails is an associative array containing:
     * AllocDetails['debtorno']
     * AllocDetails['type']
     * AllocDetails['transno']
     * AllocDetails['customerref']
     */
    $Errors = array();
    $db = db($User, $Password);
    if (gettype($db) == 'integer') {
        $Errors[0] = NoAuthorisation;
        return $Errors;
    }
    $Errors = VerifyDebtorExists($AllocDetails['debtorno'], sizeof($Errors), $Errors, $db);
    /*Get the outstanding amount to allocate (all amounts in FX) from the transaction*/
    if ($AllocDetails['type'] != '11' and $AllocDetails['type'] != 12) {
        $Errors[] = MustBeReceiptOrCreditNote;
    }
    $SQL = "SELECT id,\n\t\t\t\t\trate,\n\t\t\t\t\tovamount+ovgst+ovdiscount-alloc AS lefttoalloc\n\t\t\t\tFROM debtortrans\n\t\t\t\tWHERE debtorno='" . $AllocDetails['debtorno'] . "'\n\t\t\t\tAND type='" . $AllocDetails['type'] . "'\n\t\t\t\tAND transno='" . $AllocDetails['transno'] . "'";
    $Result = api_DB_query($SQL, $db);
    $LeftToAllocRow = DB_fetch_array($Result);
    if (DB_num_rows($Result) == 0) {
        $Errors[0] = NoTransactionToAllocate;
        return $Errors;
    }
    if ($LeftToAllocRow['lefttoalloc'] < 0) {
        /* negative if it is a positive receipt to allocate against invoices */
        /*Now look for invoices with the same customerref to allocate to */
        $SQL = "SELECT id,\n\t\t\t\t\t\trate,\n\t\t\t\t\t\tovamount+ovgst+ovdiscount-alloc AS outstanding\n\t\t\t\t\tFROM debtortrans\n\t\t\t\t\tWHERE debtorno='" . $AllocDetails['debtorno'] . "'\n\t\t\t\t\tAND type=10\n\t\t\t\t\tAND reference='" . $AllocDetails['customerref'] . "'\n\t\t\t\t\tAND ovamount+ovgst+ovdiscount-alloc >0";
        $Result = api_DB_query($SQL, $db);
        if (DB_num_rows($Result) == 0) {
            $Errors[0] = NoTransactionToAllocate;
            return $Errors;
        }
        /* The receipts will always be smaller than the invoice as there can be several receipts to make up payment for a single invocie - but not vice-versa - that's why there is no point iterating over the possibilities  - in the words of McCloud "There can be only one"*/
        $OSInvRow = DB_fetch_array($Result);
        if ($OSInvRow['rate'] == $LeftToAllocRow['rate'] and $OSInvRow['outstanding'] > 0) {
            if ($OSInvRow['outstanding'] + $LeftToAllocRow['lefttoalloc'] >= 0) {
                /*We can allocate the whole amount of the credit/receipt */
                $AllocateAmount = -$LeftToAllocRow['lefttoalloc'];
            } else {
                /*We can only allocate the rest of the invoice outstanding */
                $AllocateAmount = $OSInvRow['outstanding'];
            }
            DB_Txn_Begin($db);
            /*Now insert the allocation records */
            $SQL = "INSERT INTO custallocns (amt,\n\t\t\t\t\t\t\t\t\t\t\t\tdatealloc,\n\t\t\t\t\t\t\t\t\t\t\t\ttransid_allocfrom,\n\t\t\t\t\t\t\t\t\t\t\t\ttransid_allocto)\n\t\t\t\t\t\t\t\t\tVALUE('" . $AllocateAmount . "',\n\t\t\t\t\t\t\t\t\t\t'" . Date('Y-m-d') . "',\n\t\t\t\t\t\t\t\t\t\t'" . $LeftToAllocRow['id'] . "',\n\t\t\t\t\t\t\t\t\t\t'" . $OSInvRow['id'] . "')";
            $Result = api_DB_query($SQL, $db, '', '', true);
            /*Now update the allocated amounts in the debtortrans for both transactions */
            $SQL = "UPDATE debtortrans SET alloc=alloc-" . $AllocateAmount . "\n\t\t\t\t\t\tWHERE id = '" . $LeftToAllocRow['id'] . "'";
            $Result = api_DB_query($SQL, $db, '', '', true);
            $SQL = "UPDATE debtortrans SET alloc=alloc+" . $AllocateAmount . "\n\t\t\t\t\t\tWHERE id = '" . $OSInvRow['id'] . "'";
            $Result = api_DB_query($SQL, $db, '', '', true);
        }
        /*end if the exchange rates are the same so no diff on exchange */
        /*end if it is a normal allocation of receipt to invoice*/
    } elseif ($LeftToAllocRow['lefttoalloc'] > 0) {
        /* it is a payment - negative receipt - already checked type=12 need to find credit note to allocate to
        	  Now look for credit notes  type 11 with the same customerref to allocate to */
        $SQL = "SELECT id,\n\t\t\t\t\t\trate,\n\t\t\t\t\t\tovamount+ovgst+ovdiscount-alloc AS outstanding\n\t\t\t\t\tFROM debtortrans\n\t\t\t\t\tWHERE debtorno='" . $AllocDetails['debtorno'] . "'\n\t\t\t\t\tAND type=11\n\t\t\t\t\tAND reference='" . $AllocDetails['customerref'] . "'\n\t\t\t\t\tAND ovamount+ovgst+ovdiscount-alloc < -0.005";
        $Result = api_DB_query($SQL, $db);
        if (DB_num_rows($Result) == 0) {
            // then we need to cast the net further afield and look for normal receipts to allocate to
            $SQL = "SELECT id,\n\t\t\t\t\t\trate,\n\t\t\t\t\t\tovamount+ovgst+ovdiscount-alloc AS outstanding\n\t\t\t\t\tFROM debtortrans\n\t\t\t\t\tWHERE debtorno='" . $AllocDetails['debtorno'] . "'\n\t\t\t\t\tAND type=12\n\t\t\t\t\tAND reference='" . $AllocDetails['customerref'] . "'\n\t\t\t\t\tAND ovamount+ovgst+ovdiscount-alloc < 0";
            $Result = api_DB_query($SQL, $db);
        }
        if (DB_num_rows($Result) == 0) {
            //then no trans to allocate this to
            $Errors[0] = 'no transactions to allocate this to';
            return $Errors;
        }
        $LeftToAllocate = $LeftToAllocRow['lefttoalloc'];
        DB_Txn_Begin($db);
        /* there could be several receipts to allocate against ... loop through until $LefToAllocate is exhausted */
        while ($OSCreditRow = DB_fetch_array($Result)) {
            if ($OSCreditRow['rate'] == $LeftToAllocRow['rate'] and $LeftToAllocate > 0) {
                if ($OSCreditRow['outstanding'] + $LeftToAllocate <= 0) {
                    /*We can allocate the whole amount of the receipt */
                    $AllocateAmount = $LeftToAllocate;
                    $LeftToAllocate = 0;
                } else {
                    /*We can only allocate the rest of the invoice outstanding */
                    $AllocateAmount = $OSCreditRow['outstanding'];
                    $LeftToAllocate += $OSCreditRow['outstanding'];
                }
                /*Now insert the allocation records */
                $SQL = "INSERT INTO custallocns (amt,\n\t\t\t\t\t\t\t\t\t\t\t\t\tdatealloc,\n\t\t\t\t\t\t\t\t\t\t\t\t\ttransid_allocfrom,\n\t\t\t\t\t\t\t\t\t\t\t\t\ttransid_allocto)\n\t\t\t\t\t\t\t\t\t\tVALUE('" . $AllocateAmount . "',\n\t\t\t\t\t\t\t\t\t\t\t'" . Date('Y-m-d') . "',\n\t\t\t\t\t\t\t\t\t\t\t'" . $OSCreditRow['id'] . "',\n\t\t\t\t\t\t\t\t\t\t\t'" . $LeftToAllocRow['id'] . "')";
                $Result = api_DB_query($SQL, $db, '', '', true);
                /*Now update the allocated amounts in the debtortrans for both transactions */
                $SQL = "UPDATE debtortrans SET alloc=alloc+" . $AllocateAmount . "\n\t\t\t\t\t\t\tWHERE id = '" . $LeftToAllocRow['id'] . "'";
                $Result = api_DB_query($SQL, $db, '', '', true);
                $SQL = "UPDATE debtortrans SET alloc=alloc-" . $AllocateAmount . "\n\t\t\t\t\t\t\tWHERE id = '" . $OSCreditRow['id'] . "'";
                $Result = api_DB_query($SQL, $db, '', '', true);
            }
        }
        //end loop around potential positive receipts not fully allocated already
    }
    if (sizeof($Errors) == 0) {
        $Result = DB_Txn_Commit($db);
        $Errors[0] = 0;
    } else {
        $Result = DB_Txn_Rollback($db);
    }
    return $Errors;
}
function GetCustomerBranchCodes($DebtorNumber, $user, $password)
{
    $Errors = array();
    $db = db($user, $password);
    if (gettype($db) == 'integer') {
        $Errors[0] = NoAuthorisation;
        return $Errors;
    }
    $sql = "SELECT branchcode FROM custbranch\n                WHERE debtorno = '" . $DebtorNumber . "'";
    $result = api_DB_query($sql);
    if (DB_error_no() != 0) {
        $Errors[0] = DatabaseUpdateFailed;
    } else {
        $Errors[0] = 0;
        // Signal data may follow.
        while ($myrow = DB_fetch_row($result)) {
            $Errors[] = $myrow[0];
        }
    }
    return $Errors;
}
function GetCurrentPeriod(&$db)
{
    $TransDate = time();
    //The current date to find the period for
    /* Find the unix timestamp of the last period end date in periods table */
    $sql = "SELECT MAX(lastdate_in_period), MAX(periodno) from periods";
    $result = DB_query($sql, $db);
    $myrow = DB_fetch_row($result);
    if (is_null($myrow[0])) {
        $InsertFirstPeriodResult = api_DB_query("INSERT INTO periods VALUES (0,'" . Date('Y-m-d', mktime(0, 0, 0, Date('m') + 1, 0, Date('Y'))) . "')", $db);
        $InsertFirstPeriodResult = api_DB_query("INSERT INTO periods VALUES (1,'" . Date('Y-m-d', mktime(0, 0, 0, Date('m') + 2, 0, Date('Y'))) . "')", $db);
        $LastPeriod = 1;
        $LastPeriodEnd = mktime(0, 0, 0, Date('m') + 2, 0, Date('Y'));
    } else {
        $Date_Array = explode('-', $myrow[0]);
        $LastPeriodEnd = mktime(0, 0, 0, $Date_Array[1] + 1, 0, (int) $Date_Array[0]);
        $LastPeriod = $myrow[1];
    }
    /* Find the unix timestamp of the first period end date in periods table */
    $sql = "SELECT MIN(lastdate_in_period), MIN(periodno) from periods";
    $result = api_DB_query($sql, $db);
    $myrow = DB_fetch_row($result);
    $Date_Array = explode('-', $myrow[0]);
    $FirstPeriodEnd = mktime(0, 0, 0, $Date_Array[1], 0, (int) $Date_Array[0]);
    $FirstPeriod = $myrow[1];
    /* If the period number doesn't exist */
    if (!PeriodExists($TransDate, $db)) {
        /* if the transaction is after the last period */
        if ($TransDate > $LastPeriodEnd) {
            $PeriodEnd = mktime(0, 0, 0, Date('m', $TransDate) + 1, 0, Date('Y', $TransDate));
            while ($PeriodEnd >= $LastPeriodEnd) {
                if (Date('m', $LastPeriodEnd) <= 13) {
                    $LastPeriodEnd = mktime(0, 0, 0, Date('m', $LastPeriodEnd) + 2, 0, Date('Y', $LastPeriodEnd));
                } else {
                    $LastPeriodEnd = mktime(0, 0, 0, 2, 0, Date('Y', $LastPeriodEnd) + 1);
                }
                $LastPeriod++;
                CreatePeriod($LastPeriod, $LastPeriodEnd, $db);
            }
        } else {
            /* The transaction is before the first period */
            $PeriodEnd = mktime(0, 0, 0, Date('m', $TransDate), 0, Date('Y', $TransDate));
            $Period = $FirstPeriod - 1;
            while ($FirstPeriodEnd > $PeriodEnd) {
                CreatePeriod($Period, $FirstPeriodEnd, $db);
                $Period--;
                if (Date('m', $FirstPeriodEnd) > 0) {
                    $FirstPeriodEnd = mktime(0, 0, 0, Date('m', $FirstPeriodEnd), 0, Date('Y', $FirstPeriodEnd));
                } else {
                    $FirstPeriodEnd = mktime(0, 0, 0, 13, 0, Date('Y', $FirstPeriodEnd));
                }
            }
        }
    } else {
        if (!PeriodExists(mktime(0, 0, 0, Date('m', $TransDate) + 1, Date('d', $TransDate), Date('Y', $TransDate)), $db)) {
            /* Make sure the following months period exists */
            $sql = "SELECT MAX(lastdate_in_period), MAX(periodno) from periods";
            $result = DB_query($sql, $db);
            $myrow = DB_fetch_row($result);
            $Date_Array = explode('-', $myrow[0]);
            $LastPeriodEnd = mktime(0, 0, 0, $Date_Array[1] + 2, 0, (int) $Date_Array[0]);
            $LastPeriod = $myrow[1];
            CreatePeriod($LastPeriod + 1, $LastPeriodEnd, $db);
        }
    }
    /* Now return the period number of the transaction */
    $MonthAfterTransDate = Mktime(0, 0, 0, Date('m', $TransDate) + 1, Date('d', $TransDate), Date('Y', $TransDate));
    $GetPrdSQL = "SELECT periodno\n\t\t\t\t\t\tFROM periods\n\t\t\t\t\t\tWHERE lastdate_in_period < '" . Date('Y-m-d', $MonthAfterTransDate) . "'\n\t\t\t\t\t\tAND lastdate_in_period >= '" . Date('Y-m-d', $TransDate) . "'";
    $ErrMsg = _('An error occurred in retrieving the period number');
    $GetPrdResult = DB_query($GetPrdSQL, $db, $ErrMsg);
    $myrow = DB_fetch_row($GetPrdResult);
    return $myrow[0];
}