2015-07-11 54 views
0

我正在開發零售應用程序。通常在零售銷售中可以有多種支付類型和金額(以及一段時間內的多種相同類型)。我遇到了一個錯誤,並希望確保我有意義的修復。確定每種付款類型實際使用多少付款和金額

這些付款總額可能大於或等於付款類型(用於出售)。我遇到了一個奇怪的場景,我不確定自己有沒有正確的想法。

實例問題我有:

售總+20他們支付-2cash,然後debit+22。下面的功能報告+20現金和0借方。我想要一個方法來報告-2cash+22debit

還有其他一些簡單的情況,如總銷售+18,他們在cash支付+20。這種情況下工作並報告+18cash

還可以按不同的順序輸入付款;但我認爲它應該根據它輸入的順序來完成。

我遇到的問題是積極銷售的負支付。

邏輯首先獲得總銷售餘額。 (可能對銷售有積極影響,對於退貨可能爲負數;甚至可能爲0)。從這裏檢查支付金額是正面還是負面。

  1. 如果是肯定的,它會嘗試儘可能多地使用付款金額直到總銷售餘額(我認爲這是正確的)。

2.負向支付類型存在逆邏輯。我認爲在正面銷售中出現負付款會造成問題。我不知道如何解決這個問題,我沒有預想到這種情況。

經過這些檢查後,它會從總銷售餘額中扣除付款,並對所有付款執行相同的邏輯。

$total_sale_balance = $sales_totals[$sale_id];  
foreach($payment_rows as $payment_row) 
{ 
    if ($payment_row['payment_amount'] >=0) 
    { 
     $payment_amount = $payment_row['payment_amount'] <= $total_sale_balance ? $payment_row['payment_amount'] : $total_sale_balance; 
    } 
    else 
    { 
     $payment_amount = $payment_row['payment_amount'] >= $total_sale_balance ? $payment_row['payment_amount'] : $total_sale_balance; 
    } 
    if (!isset($payment_data[$payment_row['payment_type']])) 
    { 
     $payment_data[$payment_row['payment_type']] = array('payment_type' => $payment_row['payment_type'], 'payment_amount' => 0); 
    } 

    $exists = $this->_does_payment_exist_in_array($payment_row['payment_id'], $payments_by_sale[$sale_id]); 

    if ($total_sale_balance != 0 && $exists) 
    { 
     $payment_data[$payment_row['payment_type']]['payment_amount'] += $payment_amount; 
    } 
    $total_sale_balance-=$payment_amount;     
} 

我正在尋找一種不同的方式來查看問題,因爲我遇到了針對銷售和退貨的不同付款類型的問題。

我是否需要4種可能的邏輯?(這似乎是有道理的)

1:銷售總陽性,付款方式正

$payment_amount = $payment_row['payment_amount'] <= $total_sale_balance ? $payment_row['payment_amount'] : $total_sale_balance; 

2:銷售總陽性,付款類型負

$payment_amount = $payment_row['payment_amount']; 

3:住宅總負,付款類型正面

$payment_amount = $payment_row['payment_amount']; 

4:銷售總計負面,付款方式負面

$payment_amount = $payment_row['payment_amount'] >= $total_sale_balance ? $payment_row['payment_amount'] : $total_sale_balance; 

我只是想確保覆蓋所有場景。

這與上述邏輯的最終代碼....我俯瞰什麼?這似乎是有道理的嗎?

$total_sale_balance = $sales_totals[$sale_id];  
foreach($payment_rows as $payment_row) 
{ 
    //Postive sale total, positive payment 
    if ($sales_totals[$sale_id] >= 0 && $payment_row['payment_amount'] >=0) 
    { 
     $payment_amount = $payment_row['payment_amount'] <= $total_sale_balance ? $payment_row['payment_amount'] : $total_sale_balance; 
    }//Negative sale total negative payment 
    elseif ($sales_totals[$sale_id] < 0 && $payment_row['payment_amount'] < 0) 
    { 
     $payment_amount = $payment_row['payment_amount'] >= $total_sale_balance ? $payment_row['payment_amount'] : $total_sale_balance; 
    }//Positive Sale total negative payment 
    elseif($sales_totals[$sale_id] >= 0 && $payment_row['payment_amount'] < 0) 
    { 
     $payment_amount = $payment_row['payment_amount']; 
    }//Negtive sale total postive payment 
    elseif($sales_totals[$sale_id] < 0 && $payment_row['payment_amount'] >= 0) 
    { 
     $payment_amount = $payment_row['payment_amount']; 
    } 

    if (!isset($payment_data[$payment_row['payment_type']])) 
    { 
     $payment_data[$payment_row['payment_type']] = array('payment_type' => $payment_row['payment_type'], 'payment_amount' => 0); 
    } 

    $exists = $this->_does_payment_exist_in_array($payment_row['payment_id'], $payments_by_sale[$sale_id]); 

    if ($total_sale_balance != 0 && $exists) 
    { 
     $payment_data[$payment_row['payment_type']]['payment_amount'] += $payment_amount; 
    } 

    $total_sale_balance-=$payment_amount; 
} 

回答

0

您需要確保所有負面交易都先發生(對於我所知道的所有情況,您都可以在其他地方)。有了您的最終代碼塊,共計+20,-2現金交易,而+22一切總計借記交易正確爲0。但是,如果借方處理至上那麼你+的總餘額結束2因爲第一個邏輯塊(正數+正數)會將借記交易限制在20,因爲那是該點的總餘額。

另一件你可能想也可能不想要的事情是,如果總數是負數並且付款是正數,那麼收費仍然會全額發生,從而推動總數進一步負數(即總數= -10,付款= 10,總數將變成-20)。由於您的第一個邏輯塊直接嘗試抵消負餘額,因此您可能不需要這個。

另一種做法可能是:

$total_sale_balance = $sales_totals[$sale_id]; 
$positive_transactions = array(); // or [] if you're using a new enough PHP 
$negative_transactions = array(); 
foreach ($payment_rows as $payment_row) { 
    // Let's just check if the transaction exists here. 
    // No need to do anything else with it if this check fails. 
    if (!$this->_does_payment_exist_in_array($payment_row['payment_id'], $payments_by_sale[$sale_id])) { continue; } 

    if ($payment_row['payment_amount'] > 0) { 
    $positive_transactions[] = $payment_row; 
    } else if ($payment_row['payment_amount'] < 0) { 
    $negative_transactions[] = $payment_row; 
    } 
} // No logic for == 0 since it doesn't look like you're actually doing anything with that. 

foreach ($negative_transactions as $transaction) { 
    $total_sale_balance -= $transaction['payment_amount']; 
    $payment_data[$transaction['payment_type']]['payment_amount'] += $transaction['payment_amount']; 
} 

foreach ($positive_transactions as $transaction) { 
    if ($total_sale_balance <= 0) { break; } 
    $amount_to_pay = ($transaction['payment_amount'] < $total_sale_balance ? $transaction['payment_amount'] : $total_sale_balance); 
    $total_sale_balance -= $amount_to_pay; 
    $payment_data[$transaction['payment_type']]['payment_amount'] += $amount_to_pay; 
} 

如果你可以忽略的事實,我顯然不堅持一些編碼標準,你可以看到,我被到處轉移的幾件事情,使之更加耐用並節省一些計算週期。

在初始循環中首先進行'支付存在'檢查,如果檢查失敗,基本上只是跳過所有事務,不需要在任何其他位置放置更多的邏輯來處理該事務,並且不會浪費計算時間來嘗試邏輯我們通過交易的方式,無論如何我們不會做任何事情。

接下來,通過分割事務分爲正面和負面的,可以簡化的if-else邏輯,確保交易,防止濫,並保持理智的順序發生。

在負塊,就沒有必要做任何額外的邏輯,因爲(在你上面的代碼)陰性交易不能不基於總的平衡。

在正塊,唯一必要的檢查是到付款金額約束到總。通過首先檢查是否全部得到滿足,我們就可以儘快結束循環爲所需金額已經滿足,或者總還是積極的,但比交易金額較低,我們可以只約束它。

同樣值得注意的是,如果您刪除了積極區塊頂部的if語句,那麼如果總數爲負值,那麼支付將自動被限制爲可能或可能不需要的負值,這取決於例如,你是否想要償還一個負的總餘額。如果購買涉及退款(因此總額開始爲負數 - 因爲邏輯不允許負數總額)爲20美元(總數= -20),那麼下一次正面交易將被限制爲-20,其將爲零在總數和(其他地方,無論是在代碼或現實世界)給我我的錢。當然,在這種情況下,您可能希望在肯定列表中包含0筆金額的交易(將第一個分欄中的if-statement更改爲>= 0),因爲這可能是退款的交易起點。