会计算法的好方法是什么?

时间:2015-04-06 14:20:17

标签: php algorithm sorting accounting

我需要在PHP中创建一个计算以下算法的会计算法。

我正在为每天提供固定金额的会员开发申请。我们假设每日捐款金额为200美元,会员可以预付给定天数。

例如,如果贡献的开始日期是2015年4月1日,并且会员支付600美元,则算法应该分配2015年4月1日至2015年4月3日的金额。

如果他在2015年4月10日支付下一笔捐款并支付2000美元,算法应首先从2015年4月4日到2015年4月10日支付赤字,金额为1400美元,然后从2015年4月11日到2015年分配余额4月13日金额达600美元。

我正在尝试使用以下代码,该代码尝试添加逻辑以检测用户何时支付过高以及如果多付,则算法将如上所述均匀分配数量。如果他的报酬过低,算法应该在违约行中添加一行,最后一个支付日期应该作为贡献表中最近添加的行来选择。

public function actionBackdate() {
        $start = new DateTime("2015-03-1");
        $now=new DateTime();
        $now->modify('+1 day');
        $days = $now->diff($start);
        echo $now->format('Y-m-d g:i a');
        echo "<br/>";
        echo $days->format('%a')." have passed since";
        echo "<br/>";
        $contributionAmount=200;
        $TotalContributed=5400;
        $amountContributed=0;
        $oustandingBalance=0;

        $contributionDetails=array(
                                  "memberid"    =>4,
                                  "payment_mode"=>"CASH",
                                  "payment_for" =>"Chama Daily",
                                  "payment_ref" =>rand(9,9999),
                                  "amount"      =>"",
                                  "currency"    =>"KSH",
                                  "created_at"  =>"",
                                  "updated_at"  =>""
                                  );
        $defaulter=array(
                                  "memberid"    =>4,
                                  "currency"    =>"KSH",
                                  "amount_defaulted"=>"",
                                  "date_defaulted" =>"Daily Contrib",
                                  "fine_amount" =>50,
                                  "note"      =>"Contribution defaulter",
                                  "status"    =>0
                                  );

        for( $i=0;$i<(int)$days->format('%a')+1;$i++){

            //underpayment from expeted contribution amount
            if($TotalContributed<$contributionAmount && $TotalContributed>0 ){              
                echo "He had a balance of ".($contributionAmount-$TotalContributed)." at date ".$start->format('Y-m-d g:i a')."<br/>";
                $oustandingBalance+=($contributionAmount-$TotalContributed);
            }elseif($TotalContributed==0){
                // paid 0                 
                $oustandingBalance+=($contributionAmount-$TotalContributed);
                $defaulter['amount_defaulted']=$contributionAmount;
                $defaulter['date_defaulted']  =$start->format('Y-m-d H:i:s');
                $model=new ChamaDefaulter;
                $model->attributes=$defaulter;
                if(!$model->save()){
                    throw new Exception("Error saving details", 1);

                }
            }elseif($TotalContributed<0){
                // he has balance expected              
                $oustandingBalance+=$contributionAmount;
                $defaulter['amount_defaulted']=$contributionAmount;
                $defaulter['date_defaulted']  =$start->format('Y-m-d H:i:s');
                $model=new ChamaDefaulter;
                $model->attributes=$defaulter;
                if(!$model->save()){
                    throw new Exception("Error saving details", 1);

                }
            }else{
                //Contribution received as expected;               
                $amountContributed+=$contributionAmount;
                $contributionDetails["amount"]=$contributionAmount;
                $contributionDetails["date_paid"]=$start->format('Y-m-d H:i:s');                
                $model=new ChamaContribution;
                $model->attributes=$contributionDetails;
               if(!$model->save()){
                    throw new Exception("Error saving details", 1);

                }

            }
            $TotalContributed-=$contributionAmount;
            $start->modify('+1 day');
        }

        exit("User oustanding Balance is KSH $oustandingBalance");
    }

1 个答案:

答案 0 :(得分:0)

您已经让我澄清我的评论,因此:

  

用户的余额可以为负数,并且可以通过以后的付款获得正数。

不确定。您需要一张付款表,由于您每天收费,您需要每天进行一次登记。您可以同样收取每周费用,然后每周收费 - 这取决于您。

我们假设您只维护付款记录,并在需要时动态计算余额。您的输入可能如下所示:

User     Value    Purpose    Date
1        600      Payment    2015-04-03
1        -200     Daily      2015-04-03
1        -200     Daily      2015-04-04
1        -200     Daily      2015-04-05
1        -200     Daily      2015-04-06

你可以在这里看到这个用户在4月3日成为会员,并且每天收取200个东西的费用。他们的余额可以计算为-200(假设以上是该用户的所有记录);您是否允许他们在该州参加会员活动完全取决于您。例如,您可以允许用户默认一定天数,或者只允许一定数量。

当此用户进行新的付款时,会以通常的方式添加,这可能会也可能不会将其重新用于信用。

  

由于付款存在分歧,因此请务必添加数据行,不要更新数据 - 如果您丢失了历史记录,那么您将无法解决财务纠纷

存储用户的余额并不像存储他们的个人付款那么重要 - 您可以根据他们的付款减去他们的费用来计算他们的余额,但是您无法从余额中计算他们的付款。

我们假设您不接受我的建议,只需使用余额表:

User     Balance    Last updated
1        -200       2015-04-06

现在,用户声称他们昨天付款,这可能是也可能不是。您可以要求他们提供证明(例如支付网关收据),但如果您可以在自己的系统中找到此信息,则会更容易。