private function invoice_subscription() { /* Selecteer alle abonnees. */ $select = Database::query("SELECT s.*, c.email, ci.bank_account FROM subscription AS s INNER JOIN customer AS c ON c.id = s.customer_id INNER JOIN customer_info AS ci ON ci.customer_id = s.customer_id"); /* Kijken of query gelukt is. */ if ($select) { /* Kijken of er abonnees zijn. */ if ($select->num_rows != 0) { /* Haal de prijs op van de abonneekosten. */ $sub_price = Settings::get('citypark_subscription_month_cost'); /* Loop elke abonnee bij langs. */ while ($obj = $select->fetch_object()) { /* Maak een invoice object aan. */ $obj->invoice = new Invoice(); /* Maak nieuw factuur aan. */ $obj->invoice->new_invoice($obj->customer_id, 'subscription'); /* Voeg een item toe aan het factuur, met daarin de abonnement kosten van nu (eerste van de maand) tot en met einde deze maand. */ $obj->invoice->add_item('Abonnement kosten', 'Van 01-' . Date('m-Y') . ' tot en met ' . Date('t-m-Y') . '.', '1', $sub_price); /* Haal aantal gratis minuten op, en zet deze in het object. */ $obj->free_minutes = Settings::get('citypark_guest_free_minutes'); /* Geef obj als current sub in. */ $this->current_sub = $obj; /* Bereken de gastenpas kosten. */ $this->invoice_guest_pass($obj); /* Haal totaal bedrag op. */ $price = $obj->invoice->get_total_price(); /* Proberen te betalen. */ if (Bank_api::transfer($price, $obj->bank_account, Config::$bank_account)) { /* Stel factuur als betaald in. */ $obj->invoice->set_paid(); /* Mail success. */ Email::send_mail($obj->email, 'CityPark - Factuur aangemaakt en betaald', 'Er is zojuist een factuur aangemaakt waarin de kosten van het abonnement en de eventuele kosten van het gebruik van de gasten pas. Het factuur is succesvol betaald.<br /><br />U kun het factuur downloaden en bekijken in het klanten paneel.'); } else { /* Mail foutmelding. */ Email::send_mail($obj->email, 'CityPark - Factuur aangemaakt en niet betaald', 'Er is zojuist een factuur aangemaakt waarin de kosten van het abonnement en de eventuele kosten van het gebruik van de gasten pas<br /><br />Het factuur kon niet worden betaald. Binnen een aantal dagen proberen wij het verschuldigde bedrag nogmaals van uw rekeningnummer af te schrijven.<br /><br />U kun het factuur downloaden en bekijken in het klanten paneel.'); } } } } else { /* MySQL Foutmelding. */ die('Error [invoice_subscription]: ' . Database::error()); } }
public static function pay_subscription($subscription_id, $month, $account_from, $finish_month = false) { /* Pak de rekeningnummer van CityPark. */ $account_to = Config::$bank_account; /* Haal de maand prijs op en vermenigvuldig dit met $month. */ $amount = $month * Settings::get('citypark_subscription_month_cost'); /* Kijken of we de laatste paar dagen moeten berekenen. */ if ($finish_month) { /* Haal totaal aantal dagen op van deze maand. */ $days_in_month = Date('t'); /* Bereken het resterende aantal dagen op van deze maand. */ $days = $days_in_month - Date('j'); /* Bereken de kosten van 1 dag deze maand. */ $amount_one_day = $amount / $days_in_month; /* Bereken de kosten van de overgebleven dagen. */ $amount_left = $amount_one_day * $days; /* Rond het getal af omhoog, en replace een eventuele komma met een punt. */ $amount = str_replace(',', '.', round($amount_left, 2, PHP_ROUND_HALF_UP)); } /* Kijken of de transactie is gelukt. */ if (Bank_api::transfer($amount, $account_from, $account_to)) { /* Succesvol overgemaakt, update query maken. */ $update = Database::query("UPDATE subscription SET last_paid = NOW() WHERE sub_number = " . Database::escape($subscription_id)); /* Kijken of de query is gelukt. */ if ($update) { /* Customer ID ophalen. */ $select = Database::query("SELECT customer_id FROM subscription WHERE sub_number = " . Database::escape($subscription_id) . " LIMIT 1"); /* Kijken of de select query gelukt is. */ if ($select) { /* Haal de customer ID op. */ $cid = $select->fetch_object()->customer_id; /* Probeer onderstaande. */ try { /* Nieuw invoice object aanmaken. */ $invoice = new Invoice(); /* Nieuw factuur aanmaken. */ $invoice_id = $invoice->new_invoice($cid); /* Factuur regel aanmaken. */ /* $amount bevat in dit geval de prijs wat er betaald is. */ $invoice->add_item('Abonnement kosten', 'Van ' . Date('d-m-Y') . ' tot ' . Date('t-m-Y') . '.', '1', $amount); /* Factuur als betaald instellen. */ $invoice->set_paid(); } catch (Exception $e) { /* Er ging wat fout bij het aanmaken van het factuur. */ throw new Exception($e->getMessage()); } /* Return een true. */ return true; } else { /* Foutmelding. */ throw new Exception('Er ging wat fout bij het ophalen van uw gegevens voor het factuur.<br />' . Database::error()); } } else { /* Query is gefaalt, gooi foutmelding. */ throw new Exception('Er ging wat fout bij het updaten van de betaling in de database.<br />' . Database::error()); } } else { /* Kon niet overmaken. */ return false; } }
public static function register_subscription() { /* Controleren of alle vereiste velden ingevuld zijn. */ if (!empty($_POST['firstname']) && !empty($_POST['lastname']) && !empty($_POST['street']) && !empty($_POST['house_nr']) && !empty($_POST['zipcode']) && !empty($_POST['city']) && !empty($_POST['bank_account']) && !empty($_POST['email']) && !empty($_POST['passwd_sha512']) && !empty($_POST['passwd_conf_sha512'])) { /* Kijken of minimaal een van de twee telefoonnummers ingevuld is. */ if (!empty($_POST['phone_home']) || !empty($_POST['phone_mob'])) { /* Controleren of het bank rekening nummer een getal is. */ if (is_numeric($_POST['bank_account']) && strlen($_POST['bank_account']) == 6) { /* Controleren of het huis nummer een getal is. */ if (is_numeric($_POST['house_nr'])) { /* Controleren of het e-mailadres klopt. */ if (filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) { /* Kijken of beide ingevulde wachtwoorden overeen komen. */ if ($_POST['passwd_sha512'] == $_POST['passwd_conf_sha512']) { /* Escape de heel $_POST array, en plaats het resultaat terug in $_POST. */ $_POST = Database::escape_array($_POST); /* Select query uitvoeren op het ingevulde email. */ $check_mail = Database::query("SELECT id FROM customer WHERE email = '" . $_POST['email'] . "' LIMIT 1"); /* Kijken of de query is gelukt. */ if ($check_mail) { /* Kijken of het email niet al bestaat. */ if ($check_mail->num_rows == 0) { /* Haal minimaal bedrag op wat de klant moet kunnen betalen. */ $min_balance = Settings::get('citypark_subscription_month_cost') * Settings::get('citypark_register_min_balance'); /* Voor de zekerheid komma's vervangen met punten. */ $min_balance = str_replace(',', '.', $min_balance); /* Bij de bank controlleren of de gebruiker het minimum bedrag kan betalen. */ if (Bank_api::check($_POST['bank_account'], $min_balance)) { /* Het nieuwe wachtwoord aanmaken. */ $passwd = password_hash($_POST['passwd_sha512'], PASSWORD_DEFAULT, ['cost' => Settings::get('login_passwd_cost')]); /* Het nieuwe wachtwoord base64 encoderen. */ $passwd = base64_encode($passwd); /* Insert query voor een customer. */ $insert_customer = Database::query("INSERT INTO customer (username, password, email, active, register_date) VALUES ('', '" . $passwd . "', '" . $_POST['email'] . "', 0, NOW())"); /* Controleren of de query is gelukt. */ if ($insert_customer) { /* Haal het customer ID op. */ $customer_id = Database::insert_id(); /* Insert query voor customer info. */ $insert_customer_info = Database::query("INSERT INTO customer_info (customer_id, firstname, inserts, lastname, street, house_nr, house_nr_add, city, zipcode, phone_home, phone_mob, bank_account) VALUES (" . $customer_id . ", '" . $_POST['firstname'] . "', " . (!empty($_POST['inserts']) ? '\'' . $_POST['inserts'] . '\'' : 'NULL') . ", '" . $_POST['lastname'] . "', '" . $_POST['street'] . "', " . $_POST['house_nr'] . ", " . (!empty($_POST['house_nr_add']) ? '\'' . $_POST['house_nr_add'] . '\'' : 'NULL') . ", '" . $_POST['city'] . "', '" . $_POST['zipcode'] . "', '" . $_POST['phone_home'] . "', '" . $_POST['phone_mob'] . "', " . $_POST['bank_account'] . ")"); /* Controleren of de insert query is gelukt. */ if ($insert_customer_info) { /* Proberen twee passen op te halen. */ try { /* Haal de passen op. */ $pass_array = Self::get_free_pass(); } catch (Exception $e) { /* Foutmelding gevangen, verwijder de customer uit de database. */ Database::query("DELETE FROM customer WHERE id = " . $customer_id); Database::query("DELETE FROM customer_info WHERE customer_id = " . $customer_id); /* Gooi foutmelding door. */ throw new Exception($e->getMessage()); } /* Maak een nieuw abonneenummer. */ $abonneenummer = Self::new_sub_number(); /* Insert query voor abonnee. */ $insert_subscription = Database::query("INSERT INTO subscription (customer_id, sub_number, start_date) VALUES (" . $customer_id . ", " . $abonneenummer . ", NOW())"); /* Kijken of de insert gelukt is. */ if ($insert_subscription) { /* Haal het abonnee ID op. */ $abonnee_id = Database::insert_id(); /* Maak een random string aan met 96 karakters. */ $activate_key_db = Functions::random_string(96); /* Zet hier het account id voor. */ $activate_key = $customer_id . '-' . $activate_key_db; /* Base64 encode de activate keys. */ $activate_key = base64_encode($activate_key); $activate_key_db = base64_encode($activate_key_db); /* Update de customer, en geef de gebruikersnaam het zelfde als het abonneenummer en sla de activate key op. */ $update_username = Database::query("UPDATE customer SET username = '******', activate_key = '" . Database::escape($activate_key_db) . "' WHERE id = " . $customer_id); /* Kijken of de update query gelukt is. */ if ($update_username) { /* Update de twee RFID kaarten en koppel ze aan het abonnement. */ $update_card_one = Database::query("UPDATE rfid_card SET subscription_id = " . $abonnee_id . ", type_card = 'subscription', in_use = 1, blocked = 0, blocked_reason = NULL, blocked_date = NULL WHERE id = " . Database::escape($pass_array[0])); /* Kijken of de update query is gelukt. */ if ($update_card_one) { /* Update de tweede kaart. */ $update_card_two = Database::query("UPDATE rfid_card SET subscription_id = " . $abonnee_id . ", type_card = 'guest', in_use = 1, blocked = 0, blocked_reason = NULL, blocked_date = NULL WHERE id = " . Database::escape($pass_array[1])); /* Kijken tweede update query is gelukt. */ if ($update_card_two) { /* Betaling maken, en kijken of deze is gelukt. */ if (Payment::pay_subscription($abonneenummer, 1, $_POST['bank_account'], true)) { /* Query om permissies aan account toe te voegen. */ $insert_permission = Database::query("INSERT INTO permission_customer_in_group (customer_id, group_id) VALUES (" . $customer_id . ", " . (int) Database::escape(Settings::get('citypark_standard_group')) . ")"); if ($insert_permission) { /* Probeer het onderstaande. */ try { /* Probeer een mail te sturen. */ Email::send_mail($_POST['email'], 'CityPark - Abonnoment aanvraag', 'Beste ' . $_POST['firstname'] . ' ' . $_POST['lastname'] . ',<br /><br />Op ' . Date('d-m-Y \\o\\m H:i:s') . ' heeft u succesvol een abonnement aangevraagd bij CityPark.<br /><br />Er zijn twee parkeerpassen aan uw abonnement gekoppeld en worden zo snel mogelijk naar uw adres gestuurt. De parkeerpassen die aan uw abonnement zijn gekoppeld hebben de nummers:<br /><i>Abonneepas #' . $pass_array[0] . '</i><br /><i>Gastenpas #' . $pass_array[1] . '</i><br /><br />Om toegang te krijgen tot het klantenpaneel, dient u het account, die aangemaakt is tijdens het aanvragen van het abonnement, te activeren. U kunt uw account activeren door op de onderstaande link te klikken.<br /><a href="' . Config::$base_href . '?activate=' . $activate_key . '">Klik hier om uw account te activeren</a><br /><br />Het gebruikersnaam van uw account is <strong>' . $abonneenummer . '</strong>, en het wachtwoord heeft u zelf ingevuld.<br /><br />Het factuur van uw eerste maandafschiften is te vinden op het klantenpaneel.<br /><br />Uw abonnement is per direct in gegaan, en u kunt de parkeerpassen direct gebruiken wanneer u deze ontvangen heeft. Indien de parkeerpassen verloren raken of gestolen zijn, kunt u deze blokkeren in het klantenpaneel.'); /* Registratie gelukt, return een true. */ return true; } catch (Exception $e) { /* Foutmelding gevangen, gooi deze door. */ throw new Exception($e->getMessage()); } } else { /* Query mislukt, maar omdat de betaling wel gelukt is, laten we het abonnement in de database staan. */ /* Gooi foutmelding. */ throw new Exception('Er is wat fout gegaan bij het toevoegen van de rechten op uw account. Neem a.u.b. contact op.<br />' . Database::error()); } } else { /* Query mislukt, verwijder de customer uit de database. */ Database::query("DELETE FROM customer WHERE id = " . $customer_id); Database::query("UPDATE rfid_card SET type_card = NULL, in_use = 0 WHERE id = " . Database::escape($pass_array[0])); Database::query("UPDATE rfid_card SET type_card = NULL, in_use = 0 WHERE id = " . Database::escape($pass_array[1])); /* Gooi foutmelding door. */ throw new Exception('Er kon geen betaling worden gedaan.'); } } else { /* Query mislukt, verwijder de customer uit de database. */ Database::query("DELETE FROM customer WHERE id = " . $customer_id); Database::query("UPDATE rfid_card SET type_card = NULL, in_use = 0 WHERE id = " . Database::escape($pass_array[0])); /* Gooi foutmelding. */ throw new Exception('[1] Er ging wat fout bij het koppelen van de parkeer passen.<br />' . Database::error()); } } else { /* Query mislukt, verwijder de customer uit de database. */ Database::query("DELETE FROM customer WHERE id = " . $customer_id); /* Gooi foutmelding. */ throw new Exception('[0] Er ging wat fout bij het koppelen van de parkeer passen.<br />' . Database::error()); } } else { /* Query mislukt, verwijder de customer uit de database. */ Database::query("DELETE FROM customer WHERE id = " . $customer_id); /* Gooi foutmelding door. */ throw new Exception('Er ging wat fout tijdens het genereren van uw gebruikersnaam.<br />' . Database::error()); } } else { /* Query mislukt, verwijder de customer uit de database. */ Database::query("DELETE FROM customer WHERE id = " . $customer_id); /* Gooi foutmelding door. */ throw new Exception('Er ging wat fout bij het aanmaken van uw abonnement.<br />' . Database::error()); } } else { /* Om de database schoon te houden, verwijderen we de customer zelf. */ Database::query("DELETE FROM customer WHERE id = " . $customer_id); /* MySQL Foutmelding. */ throw new Exception('Er ging wat fout tijdens het aanmaken van uw account gegevens.<br />' . Database::error()); } } else { /* MySQL Foutmelding. */ throw new Exception('Er ging wat fout tijdens het aanmaken van uw account.<br />' . Database::error()); } } else { /* De klant heeft niet genoeg saldo om te mogen registreren. */ throw new Exception('Het saldo op rekeningnummer \'' . $_POST['bank_account'] . '\' is te laag om de registratie te voltooien.'); } } else { /* Er bestaat al een klant met dit email. */ throw new Exception('Er is al reeds een klant geregistreerd met het ingevulde e-mailadres.'); } } else { /* MySQL Foutmelding. */ throw new Exception('Er ging wat fout tijdens het controleren van uw e-mailadres.<br />' . Database::error()); } } else { /* Wachtwoorden komen niet overeen. */ throw new Exception('De twee ingevulde wachtwoorden komen niet overeen.'); } } else { /* E-mailadres is ongeldig. */ throw new Exception('Het ingevulde e-mailadres is ongeldig.'); } } else { /* Huisnummer is geen getal. */ throw new Exception('Het ingevulde huisnummer is ongeldig.'); } } else { /* Banknummer is geen getal. */ throw new Exception('Het ingevulde rekeningnummer is ongeldig.'); } } else { /* Beide telefoonnummers missen. */ throw new Exception('Minimaal een van de telefoonnummers dient ingevuld te worden.'); } } else { /* Niet alle verplichte velden zijn ingevuld. */ throw new Exception('Niet alle verplichte velden zijn ingevuld.'); } }