WIP 2025-03-17 RML Billing
This commit is contained in:
@@ -6,6 +6,7 @@ class PreorderBilling extends mfBaseModel {
|
||||
private $invoice;
|
||||
private $vatgroup;
|
||||
|
||||
public static $earliest_bill_date = "2025-01-01";
|
||||
|
||||
public function getProperty($name) {
|
||||
if($this->$name == null) {
|
||||
@@ -76,9 +77,9 @@ class PreorderBilling extends mfBaseModel {
|
||||
$model = new PreorderBilling();
|
||||
|
||||
$table_fields = [
|
||||
"invoice_id", "preorder_id", "adb_wohneinheit_id", "order_date", "start_date", "end_date", "preorderbillingcustomer_id", "owner_id", "billingaddress_id",
|
||||
"fibu_account_number", "company", "firstname", "lastname", "street", "zip", "city", "country", "email", "uid", "billing_delivery",
|
||||
"product_id", "product_name", "product_info", "article_number", "amount", "unit", "price", "price_setup", "vatrate", "billing_period",
|
||||
"invoice_id", "preorder_id", "oaid", "adb_wohneinheit_id", "order_date", "start_date", "end_date", "preorderbillingcustomer_id", "owner_id",
|
||||
"billingaddress_id", "fibu_account_number", "company", "firstname", "lastname", "street", "zip", "city", "country", "email", "uid",
|
||||
"billing_delivery", "product_id", "product_name", "product_info", "article_number", "amount", "unit", "price", "price_setup", "vatrate", "billing_period",
|
||||
"create_by","edit_by","create","edit"
|
||||
];
|
||||
|
||||
@@ -120,7 +121,8 @@ class PreorderBilling extends mfBaseModel {
|
||||
$db = FronkDB::singleton();
|
||||
|
||||
$where = self::getSqlFilter($filter);
|
||||
$sql = "SELECT * FROM PreorderBilling
|
||||
$sql = "SELECT PreorderBilling.* FROM PreorderBilling
|
||||
LEFT JOIN Preorder ON Preorder.id = PreorderBilling.preorder_id
|
||||
WHERE $where
|
||||
ORDER BY preorder_id LIMIT 1";
|
||||
//var_dump($sql);exit;
|
||||
@@ -143,6 +145,7 @@ class PreorderBilling extends mfBaseModel {
|
||||
|
||||
$where = self::getSqlFilter($filter);
|
||||
$sql = "SELECT COUNT(*) as cnt FROM PreorderBilling
|
||||
LEFT JOIN Preorder ON Preorder.id = PreorderBilling.preorder_id
|
||||
WHERE $where";
|
||||
|
||||
//mfLoghandler::singleton()->debug($sql);
|
||||
@@ -166,7 +169,8 @@ class PreorderBilling extends mfBaseModel {
|
||||
$db = FronkDB::singleton();
|
||||
|
||||
$where = self::getSqlFilter($filter);
|
||||
$sql = "SELECT * FROM PreorderBilling
|
||||
$sql = "SELECT PreorderBilling.* FROM PreorderBilling
|
||||
LEFT JOIN Preorder ON Preorder.id = PreorderBilling.preorder_id
|
||||
WHERE $where
|
||||
ORDER BY $order";
|
||||
|
||||
@@ -178,7 +182,7 @@ class PreorderBilling extends mfBaseModel {
|
||||
}
|
||||
}
|
||||
|
||||
//mfLoghandler::singleton()->debug($sql);
|
||||
mfLoghandler::singleton()->debug($sql);
|
||||
|
||||
$res = $db->query($sql);
|
||||
if($db->num_rows($res)) {
|
||||
@@ -217,7 +221,14 @@ class PreorderBilling extends mfBaseModel {
|
||||
$where .= " AND PreorderBilling.adb_wohneinheit_id=$adb_wohneinheit_id";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if(array_key_exists("oaid", $filter)) {
|
||||
$oaid = FronkDB::singleton()->escape($filter['oaid']);
|
||||
if($oaid) {
|
||||
$where .= " AND PreorderBilling.oaid = '$oaid'";
|
||||
}
|
||||
}
|
||||
|
||||
if(array_key_exists("order_date", $filter)) {
|
||||
$order_date = FronkDB::singleton()->escape($filter['order_date']);
|
||||
if($order_date) {
|
||||
@@ -398,7 +409,12 @@ class PreorderBilling extends mfBaseModel {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if(array_key_exists("preordercampaign_id", $filter)) {
|
||||
$preordercampaign_id = $filter['preordercampaign_id'];
|
||||
if(is_numeric($preordercampaign_id)) {
|
||||
$where .= " AND Preorder.preordercampaign_id = $preordercampaign_id";
|
||||
}
|
||||
}
|
||||
|
||||
if(array_key_exists("add-where", $filter)) {
|
||||
$where .= " ".$filter['add-where'];
|
||||
|
||||
@@ -46,11 +46,46 @@ class PreorderBillingController extends mfBaseController {
|
||||
if (is_numeric($this->request->s)) {
|
||||
$pagination['start'] = intval($this->request->s);
|
||||
}
|
||||
|
||||
/*$my_campaigns = [];
|
||||
$my_networks = $this->me->myNetworks(["netowner", "salespartner"]);
|
||||
foreach($my_networks as $network) {
|
||||
foreach(PreordercampaignModel::search(['network_id' => $network->id]) as $campaign) {
|
||||
if(!array_key_exists($campaign->id, $my_campaigns)) $my_campaigns[] = $campaign;
|
||||
}
|
||||
}*/
|
||||
$my_campaigns = PreordercampaignModel::search(["owner_id" => $this->me->address_id]);
|
||||
//var_dump($my_network_ids,$my_campaign_ids);exit;
|
||||
$this->layout()->set("my_campaigns", $my_campaigns);
|
||||
|
||||
$netoperators = [];
|
||||
foreach(PreordercampaignModel::search(["owner_id" => $this->me->address_id]) as $campaign) {
|
||||
foreach($campaign->active_operators as $op) {
|
||||
if(!array_key_exists($op->operator_id, $netoperators)) {
|
||||
$nop = new Address($op->operator_id);
|
||||
if($nop->id) {
|
||||
$netoperators[$nop->id] = $nop;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
foreach($campaign->passive_operators as $op) {
|
||||
if(!array_key_exists($op->operator_id, $netoperators)) {
|
||||
$nop = new Address($op->operator_id);
|
||||
if($nop->id) {
|
||||
$netoperators[$nop->id] = $nop;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$this->layout()->set("netoperators", $netoperators);
|
||||
|
||||
//var_dump($filter);exit;
|
||||
$pagination['maxItems'] = PreorderBilling::count($filter);
|
||||
|
||||
$projects = PreorderBilling::getAll();
|
||||
$this->layout()->set("billings", $projects);
|
||||
$billings = PreorderBilling::search($filter, $pagination);
|
||||
$this->layout()->set("billings", $billings);
|
||||
$this->layout()->set("pagination", $pagination);
|
||||
|
||||
}
|
||||
@@ -58,7 +93,35 @@ class PreorderBillingController extends mfBaseController {
|
||||
private function getPreparedFilter($filter) {
|
||||
$new_filter = [];
|
||||
|
||||
if(array_key_exists("status", $filter)) {
|
||||
if($filter["status"] == "billed") {
|
||||
$new_filter["invoice_id"] = true;
|
||||
} else {
|
||||
$new_filter["invoice_id"] = null;
|
||||
}
|
||||
} else {
|
||||
$new_filter["invoice_id"] = null;
|
||||
}
|
||||
|
||||
if(array_key_exists("start_date_from", $filter)) {
|
||||
if($filter["start_date_from"]) {
|
||||
try {
|
||||
$from = DateTime::createFromFormat("d.m.Y", $filter["start_date_from"]);
|
||||
} catch (Exception $e) {}
|
||||
$new_filter["start_date>="] = $from->format("Y-m-d");
|
||||
}
|
||||
unset($filter["start_date_from"]);
|
||||
}
|
||||
|
||||
if(array_key_exists("start_date_to", $filter)) {
|
||||
if($filter["start_date_to"]) {
|
||||
try {
|
||||
$to = DateTime::createFromFormat("d.m.Y", $filter["start_date_to"]);
|
||||
} catch (Exception $e) {}
|
||||
$new_filter["start_date<="] = $to->format("Y-m-d");
|
||||
}
|
||||
unset($filter["start_date_to"]);
|
||||
}
|
||||
|
||||
if (is_array($filter) && count($filter)) {
|
||||
foreach ($filter as $name => $value) {
|
||||
@@ -70,15 +133,14 @@ class PreorderBillingController extends mfBaseController {
|
||||
}
|
||||
|
||||
protected function importPreorders() {
|
||||
$today = new DateTime("now");
|
||||
$today->setTime(0,0,0);
|
||||
$earliest_bill_date = new DateTime(PreorderBilling::$earliest_bill_date);
|
||||
|
||||
$now_year = date("Y");
|
||||
$now_month = date("m");
|
||||
$now_day = date("d");
|
||||
|
||||
//$today = new DateTime("$now_year-$now_month-$now_day");
|
||||
$today = new DateTime("2025-02-13");
|
||||
$today = new DateTime("$now_year-$now_month-$now_day");
|
||||
//$today = new DateTime("2025-02-13");
|
||||
$today->setTime(2,0,0);
|
||||
$today->setTimezone(new DateTimeZone("Europe/Vienna"));
|
||||
|
||||
@@ -86,6 +148,9 @@ class PreorderBillingController extends mfBaseController {
|
||||
$bill_date->modify("first day of this month");
|
||||
$bill_date->modify("-1 month");
|
||||
|
||||
$latest_bill_date = clone $bill_date;
|
||||
$latest_bill_date->modify("last day of this month");
|
||||
|
||||
$del = 0;
|
||||
// first delete all non-invoiced billing records
|
||||
foreach(PreorderBilling::search(["invoice_id" => null]) as $bill) {
|
||||
@@ -101,12 +166,24 @@ class PreorderBillingController extends mfBaseController {
|
||||
|
||||
$preorder_search = [
|
||||
"preordercampaign_id" => $campaign_ids,
|
||||
">=status_code" => 241
|
||||
">=status_code" => 241,
|
||||
//"oaid" => "AT-8943-a1116acf.001",
|
||||
];
|
||||
|
||||
$billing_records = [];
|
||||
|
||||
foreach(PreorderModel::search($preorder_search) as $preorder) {
|
||||
$bill_enduser_setup = true;
|
||||
$bill_operator_setup = true;
|
||||
$bill_usage = true;
|
||||
|
||||
if($preorder->deleted) continue;
|
||||
|
||||
if(!$preorder->adb_wohneinheit_id) {
|
||||
$this->log->info(__METHOD__.": Ignoring Preorder ".$preorder->id." without adb_wohneinheit_id");
|
||||
continue;
|
||||
}
|
||||
|
||||
//$order_date = false;
|
||||
if($preorder->order_date) {
|
||||
$order_date = new DateTime('@'.$preorder->order_date);
|
||||
@@ -118,7 +195,8 @@ class PreorderBillingController extends mfBaseController {
|
||||
|
||||
if($order_date->format("Ymd") < "2025-01-01") {
|
||||
// start billing from 2025-01-01
|
||||
continue;
|
||||
$this->log->debug(__METHOD__.": Preorder ".$preorder->id." ordered before 2025-01-01, so billing no enduser setup");
|
||||
$bill_enduser_setup = false;
|
||||
}
|
||||
|
||||
$operator_id = false;
|
||||
@@ -140,14 +218,16 @@ class PreorderBillingController extends mfBaseController {
|
||||
"order_date" => $order_date,
|
||||
"today" => $today,
|
||||
"bill_date" => $bill_date,
|
||||
"earliest_bill_date" => $earliest_bill_date,
|
||||
"latest_bill_date" => $latest_bill_date,
|
||||
];
|
||||
|
||||
if($preorder->status->code >= 241) {
|
||||
$this->billSetup($preorder, "enduser_setup", $bill_params);
|
||||
if($bill_enduser_setup) $this->billSetup($preorder, "enduser_setup", $bill_params);
|
||||
}
|
||||
if($preorder->status->code >= 500) {
|
||||
$this->billSetup($preorder, "operator_setup", $bill_params);
|
||||
$this->billEnduserPeriodic($preorder, $bill_params);
|
||||
if($bill_operator_setup) $this->billSetup($preorder, "operator_setup", $bill_params);
|
||||
if($bill_usage) $this->billOperatorPeriodic($preorder, $bill_params);
|
||||
//exit;
|
||||
}
|
||||
}
|
||||
@@ -163,6 +243,9 @@ class PreorderBillingController extends mfBaseController {
|
||||
$order_date = $options['order_date'];
|
||||
$today = $options['today'];
|
||||
$bill_date = $options['bill_date'];
|
||||
$earliest_bill_date = $options['earliest_bill_date'];
|
||||
|
||||
$this->log->debug(__METHOD__.": bill $type Preorder ".$preorder->id);
|
||||
|
||||
// get price_setup
|
||||
$product = PreorderProduct::getFirst(["type" => $type]);
|
||||
@@ -170,6 +253,12 @@ class PreorderBillingController extends mfBaseController {
|
||||
die("operator_setup price not found!");
|
||||
}
|
||||
|
||||
if($preorder->status->code >= 899) {
|
||||
// TODO is canceled, need to determine if setup still needs to be billed
|
||||
$this->log->debug(__METHOD__." already cancelled");
|
||||
return true;
|
||||
}
|
||||
|
||||
$product->setNetownerId($netowner->id);
|
||||
$product->setNetoperatorId($netoperator->id);
|
||||
$price = $product->getCampaignPrice($preorder->preordercampaign_id, $order_date->format("Y-m-d"));
|
||||
@@ -181,6 +270,7 @@ class PreorderBillingController extends mfBaseController {
|
||||
//var_dump($product);
|
||||
if(PreorderBilling::getFirst(["preorder_id" => $preorder->id, "product_id" => $product->id])) {
|
||||
//echo "billing record exists\n<br />";
|
||||
$this->log->debug(__METHOD__."billing record exists");
|
||||
return true; // already billed
|
||||
}
|
||||
|
||||
@@ -203,10 +293,17 @@ class PreorderBillingController extends mfBaseController {
|
||||
$status_change = $preorder;
|
||||
}
|
||||
|
||||
|
||||
|
||||
$status_change_date = new DateTime("@".$status_change->create);
|
||||
|
||||
if($preorder->oaid == 'AT-8943-8392e815.001') {
|
||||
//var_dump($status_change, $status_change_date);
|
||||
}
|
||||
|
||||
$billing_data = [
|
||||
"preorder_id" => $preorder->id,
|
||||
"oaid" => $preorder->oaid,
|
||||
"adb_wohneinheit_id" => $preorder->adb_wohneinheit_id,
|
||||
"order_date" => $order_date->format("Y-m-d"),
|
||||
"start_date" => $status_change_date->format("Y-m-d"),
|
||||
@@ -265,6 +362,17 @@ class PreorderBillingController extends mfBaseController {
|
||||
$billing_data["product_info"] = "Bestellung vom ".$order_date->format("d.m.Y");
|
||||
|
||||
} elseif($type == "operator_setup") {
|
||||
$change_to_active = PreorderHistoryModel::getFirstStatusChangeTo($preorder->id, 500);
|
||||
if($change_to_active) {
|
||||
$status_change_date = new DateTime("@".$change_to_active->create);
|
||||
$billing_data["start_date"] = $status_change_date->format("Y-m-d");
|
||||
$billing_data["end_date"] = $status_change_date->format("Y-m-d");
|
||||
}
|
||||
|
||||
if($preorder->oaid == 'AT-8943-8392e815.001') {
|
||||
//var_dump($change_to_active, $status_change_date);exit;
|
||||
}
|
||||
|
||||
// Netzbetreiber Setup Gebühr
|
||||
$billing_data["product_name"] = "Brereitstellungsentgelt ".$bill_date->format("m/Y");
|
||||
$billing_data["owner_id"] = $netoperator->id;
|
||||
@@ -290,18 +398,24 @@ class PreorderBillingController extends mfBaseController {
|
||||
}
|
||||
|
||||
//var_dump($billing);
|
||||
|
||||
$this->log->debug(__METHOD__.": Billed");
|
||||
return true;
|
||||
}
|
||||
|
||||
private function billEnduserPeriodic($preorder, $options) {
|
||||
private function billOperatorPeriodic($preorder, $options) {
|
||||
$netowner = $options['netowner'];
|
||||
$netoperator = $options['netoperator'];
|
||||
$order_date = $options['order_date'];
|
||||
$today = $options['today'];
|
||||
$bill_date = $options['bill_date'];
|
||||
$earliest_bill_date = $options['earliest_bill_date'];
|
||||
$latest_bill_date = $options['latest_bill_date'];
|
||||
|
||||
|
||||
if($preorder->status->code >= 899) {
|
||||
$this->log->debug(__METHOD__.": Preorder is cancelled");
|
||||
// TODO is cancelled, so determine if refund is necessary
|
||||
return true;
|
||||
}
|
||||
|
||||
// get price_setup
|
||||
$product = PreorderProduct::getFirst(["type" => "operator_usage"]);
|
||||
@@ -311,7 +425,7 @@ class PreorderBillingController extends mfBaseController {
|
||||
|
||||
$product->setNetownerId($netowner->id);
|
||||
$product->setNetoperatorId($netoperator->id);
|
||||
$price = $product->getCampaignPrice($preorder->preordercampaign_id, $order_date->format("Y-m-d"));
|
||||
$price = $product->getCampaignPrice($preorder->preordercampaign_id, $bill_date->format("Y-m-d"));
|
||||
if(!$price) {
|
||||
die("operator_setup price not found for campaign ".$preorder->preordercampaign_id." and date ".$order_date->format("Y-m-d"));
|
||||
}
|
||||
@@ -325,87 +439,134 @@ class PreorderBillingController extends mfBaseController {
|
||||
}
|
||||
|
||||
$status_change_date = new DateTime("@".$status_change->create);
|
||||
|
||||
$first_bill_day = clone $status_change_date;
|
||||
|
||||
$first_day = clone $today;
|
||||
$first_day->modify("first day of this month");
|
||||
$last_day = clone $today;
|
||||
$last_day->modify("last day of this month");
|
||||
|
||||
//var_dump($first_bill_day);
|
||||
//var_dump($first_day);
|
||||
if($first_bill_day->format("Ymd") > $first_day->format("Ymd")) {
|
||||
$first_day = clone $first_bill_day;
|
||||
if($status_change_date->format("Ymd") > $earliest_bill_date->format("Ymd")) {
|
||||
$earliest_bill_date = $status_change_date;
|
||||
}
|
||||
|
||||
$start_date = clone($first_day);
|
||||
$end_date = clone($last_day);
|
||||
$first_bill_date = clone $status_change_date;
|
||||
|
||||
|
||||
// get earlier missing billing records and bill them too
|
||||
$create_date = clone $bill_date;
|
||||
$create_date->modify("first day of this month");
|
||||
$create_date->setTime(0,0,0);
|
||||
$last_create_date = false;
|
||||
$to_bill_dates = [];
|
||||
|
||||
$sday = $start_date->format("d");
|
||||
$eday = $end_date->format("d");
|
||||
/*var_dump($today);
|
||||
var_dump($bill_date);
|
||||
var_dump($earliest_bill_date);
|
||||
var_dump($status_change_date);exit;
|
||||
*/
|
||||
$earliest_bill_year = $status_change_date->format('Y');
|
||||
$earliest_bill_month = $status_change_date->format('m');
|
||||
$earliest_bill_day = $status_change_date->format('d');
|
||||
|
||||
$bill_price = $price->price_inet;
|
||||
// earliest bill date is before this month
|
||||
//echo "\$create_date ".$create_date->format("Y-m-d H:i:s")."<br />\n";
|
||||
//echo "\$earliest_bill_date ".$earliest_bill_date->format("Y-m-d H:i:s")."<br /><br />\n";
|
||||
|
||||
if($price->price_inet && ($sday > 1)) {
|
||||
// Aliquoten Preis errechnen
|
||||
$first_of_period = clone $start_date;
|
||||
$first_of_period->modify("first day of this month");
|
||||
while($create_date->format("Ym") >= $earliest_bill_date->format("Ym")) {
|
||||
if($last_create_date) {
|
||||
//var_dump($create_dates);
|
||||
// just for safety / shouldn't happen
|
||||
break;
|
||||
//die("need-date ran out of dates");
|
||||
}
|
||||
|
||||
$last_of_period = clone $start_date;
|
||||
$last_of_period->modify("last day of this month");
|
||||
//echo " - \$create_date ".$create_date->format("Y-m-d H:i:s")."<br />\n";
|
||||
//echo " - \$earliest_bill_date ".$earliest_bill_date->format("Y-m-d H:i:s")."<br /><br />\n";
|
||||
if($create_date->format("Y") == $earliest_bill_date->format("Y") && $create_date->format("m") == $earliest_bill_date->format("m")) {
|
||||
// this is the finish month, so set day back to day of finish_date
|
||||
$create_date->setDate($earliest_bill_date->format("Y"), $earliest_bill_date->format("m"), $earliest_bill_date->format("d"));
|
||||
$last_create_date = true;
|
||||
}
|
||||
|
||||
$total_days = $last_of_period->diff($first_of_period)->format("%a") + 1;
|
||||
$period_days = ($end_date->diff($start_date)->format("%a")) + 1;
|
||||
|
||||
if($period_days < 0) return true; // don't bill for negative time range
|
||||
|
||||
$pc = $period_days / $total_days * 100;
|
||||
$bill_price = round($price->price_inet / 100 * $pc, 4);
|
||||
$existing_bill = PreorderBilling::getFirst(["product_id" => $product->id, "preorder_id" => $preorder->id, "start_date" => $create_date->format("Y-m-d")]);
|
||||
//var_dump($existing_bill);
|
||||
if(!$existing_bill) {
|
||||
$new_create_date = clone $create_date;
|
||||
$to_bill_dates[] = $new_create_date;
|
||||
$create_date->modify("-1 months");
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
}
|
||||
//var_dump($to_bill_dates);
|
||||
//exit;
|
||||
|
||||
$article_number = $product->article_number;
|
||||
if(!$article_number) {
|
||||
$article_number = $product->getDefaultArticlenumber();
|
||||
}
|
||||
|
||||
$billing_data = [
|
||||
"preorder_id" => $preorder->id,
|
||||
"adb_wohneinheit_id" => $preorder->adb_wohneinheit_id,
|
||||
"order_date" => $order_date->format("Y-m-d"),
|
||||
"start_date" => $start_date->format("Y-m-d"),
|
||||
"end_date" => $end_date->format("Y-m-d"),
|
||||
"billing_delivery" => "email",
|
||||
"product_id" => $product->id,
|
||||
"product_info" => "",
|
||||
"article_number" => $article_number,
|
||||
"amount" => 1,
|
||||
"unit" => "Stk.",
|
||||
"price" => $bill_price,
|
||||
"price_setup" => 0,
|
||||
"vatrate" => 20,
|
||||
"billing_period" => 0,
|
||||
"product_name" => "Nutzungsentgelt " . $start_date->format("m/Y"),
|
||||
"owner_id" => $netoperator->id,
|
||||
"billingaddress_id" => $netoperator->id,
|
||||
"fibu_account_number" => $netoperator->attributes['rml-fibu-account']->value,
|
||||
"company" => trim($netoperator->company),
|
||||
"firstname" => trim($netoperator->firstname),
|
||||
"lastname" => trim($netoperator->lastname),
|
||||
"street" => trim($netoperator->street),
|
||||
"zip" => trim($netoperator->zip),
|
||||
"city" => trim($netoperator->city),
|
||||
"country" => trim($netoperator->country->name),
|
||||
"email" => trim($netoperator->email),
|
||||
"uid" => trim($netoperator->uid),
|
||||
];
|
||||
foreach($to_bill_dates as $start_date) {
|
||||
$end_date = clone $start_date;
|
||||
$end_date->modify("first day of this month");
|
||||
$end_date->modify("+1 months");
|
||||
$end_date->modify("-1 day");
|
||||
|
||||
$billing = PreorderBilling::create($billing_data);
|
||||
//var_dump($billing);exit;
|
||||
if(!$billing->save()) {
|
||||
die("Billing record could not be saved!");
|
||||
|
||||
$sday = $start_date->format("d");
|
||||
$eday = $end_date->format("d");
|
||||
|
||||
$bill_price = $price->price_inet;
|
||||
|
||||
if ($price->price_inet && ($sday > 1)) {
|
||||
// Aliquoten Preis errechnen
|
||||
$first_of_period = clone $start_date;
|
||||
$first_of_period->modify("first day of this month");
|
||||
|
||||
$last_of_period = clone $start_date;
|
||||
$last_of_period->modify("last day of this month");
|
||||
|
||||
$total_days = $last_of_period->diff($first_of_period)->format("%a") + 1;
|
||||
$period_days = ($end_date->diff($start_date)->format("%a")) + 1;
|
||||
|
||||
if ($period_days < 0) return true; // don't bill for negative time range
|
||||
|
||||
$pc = $period_days / $total_days * 100;
|
||||
$bill_price = round($price->price_inet / 100 * $pc, 4);
|
||||
}
|
||||
|
||||
$article_number = $product->article_number;
|
||||
if (!$article_number) {
|
||||
$article_number = $product->getDefaultArticlenumber();
|
||||
}
|
||||
|
||||
$billing_data = [
|
||||
"preorder_id" => $preorder->id,
|
||||
"oaid" => $preorder->oaid,
|
||||
"adb_wohneinheit_id" => $preorder->adb_wohneinheit_id,
|
||||
"order_date" => $order_date->format("Y-m-d"),
|
||||
"start_date" => $start_date->format("Y-m-d"),
|
||||
"end_date" => $end_date->format("Y-m-d"),
|
||||
"billing_delivery" => "email",
|
||||
"product_id" => $product->id,
|
||||
"product_info" => "",
|
||||
"article_number" => $article_number,
|
||||
"amount" => 1,
|
||||
"unit" => "Stk.",
|
||||
"price" => $bill_price,
|
||||
"price_setup" => 0,
|
||||
"vatrate" => 20,
|
||||
"billing_period" => 0,
|
||||
"product_name" => "Nutzungsentgelt " . $start_date->format("m/Y"),
|
||||
"owner_id" => $netoperator->id,
|
||||
"billingaddress_id" => $netoperator->id,
|
||||
"fibu_account_number" => $netoperator->attributes['rml-fibu-account']->value,
|
||||
"company" => trim($netoperator->company),
|
||||
"firstname" => trim($netoperator->firstname),
|
||||
"lastname" => trim($netoperator->lastname),
|
||||
"street" => trim($netoperator->street),
|
||||
"zip" => trim($netoperator->zip),
|
||||
"city" => trim($netoperator->city),
|
||||
"country" => trim($netoperator->country->name),
|
||||
"email" => trim($netoperator->email),
|
||||
"uid" => trim($netoperator->uid),
|
||||
];
|
||||
|
||||
$billing = PreorderBilling::create($billing_data);
|
||||
//var_dump($billing);exit;
|
||||
if (!$billing->save()) {
|
||||
die("Billing record could not be saved!");
|
||||
}
|
||||
}
|
||||
|
||||
//var_dump($billing);
|
||||
|
||||
Reference in New Issue
Block a user