Что такое хороший подход для алгоритма учета?

Мне нужно создать алгоритм учета в PHP, который вычисляет следующее.

Я разрабатываю приложение для участников, ежедневно вносящих фиксированную сумму денег. Допустим, ежедневная сумма взноса составляет 200 долларов, и участники могут вносить предоплату за указанное количество дней.

Например, если датой начала взноса является апрель-1 2015 года, а участник платит 600 долларов США, алгоритм должен распределить сумму за период с апреля-1 апреля 2015 года по апрель-3 2015 года.

Если он выплачивает следующий взнос в апреле-10 2015 года и платит 2000 долларов, алгоритм должен сначала оплатить дефицит с даты 2015 года по апрель-4 по 2015 год-10 апреля в размере 1400 долларов, а затем распределить остаток с 2015 года по апрель-11 по 2015 год по апрель-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");
}

-2

Решение

Вы попросили меня уточнить мой комментарий, таким образом:

Баланс пользователя может стать отрицательным, а при последующих платежах он может стать положительным.

Конечно. Вам понадобится таблица платежей, и, поскольку вы взимаете плату ежедневно, вам необходимо делать запись каждый день. Вы также можете иметь еженедельный заряд, а затем заряжать каждую неделю — решать только вам.

Предположим, вы ведете только учет платежей и рассчитываете баланс динамически, когда это необходимо. Ваши записи могут выглядеть так:

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

Здесь вы можете видеть, что этот пользователь стал участником 3 апреля, и с него каждый день взимается 200 с человека. Их баланс может быть рассчитан как -200 (при условии, что выше все записи для этого пользователя); разрешаете ли вы им принимать участие в деятельности членов в этом штате, полностью зависит от вас. Например, вы можете разрешить пользователям использовать настройки по умолчанию на определенное количество дней или только на определенную сумму.

Когда этот пользователь вносит новый платеж, он добавляется обычным способом, который может или не может вернуть их в кредит.

Поскольку платежи могут быть несогласованными, всегда добавляйте строки данных, не обновляйте их — если вы потеряете историю, вы не сможете разрешить финансовые споры

Хранение баланса пользователя не так важно, как хранение его индивидуальных платежей — вы можете рассчитать их баланс из их платежей за вычетом их сборов, но вы не можете рассчитать их платежи из их баланса.

Допустим, вы не прислушиваетесь к моему совету, а просто используете таблицу баланса:

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

Теперь пользователь утверждает, что он сделал платеж вчера, что может быть или не быть правдой. Вы можете попросить их предоставить подтверждение (например, квитанцию ​​о платежном шлюзе), но гораздо проще найти эту информацию в своей собственной системе.

0

Другие решения

Других решений пока нет …