我需要在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");
}
答案 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
现在,用户声称他们昨天付款,这可能是也可能不是。您可以要求他们提供证明(例如支付网关收据),但如果您可以在自己的系统中找到此信息,则会更容易。