[MySQL+PHP] Betalingssysteem, hoe zet je dat op?

Pagina: 1
Acties:
  • 101 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • pierre-oord
  • Registratie: April 2002
  • Laatst online: 10-02 23:00
Ik heb m'n skillz in PHP en MySQL eindelijk verbeterd. Een klantensysteem opgezet, barsensvol van de gegevens over ze, over server's die ze huren, en nog een hoop meer. Weg statische pagina's, weg moeite, alles gemakkelijk te bereiken.

Nu heb ik alleen nog een systeem nodig wat controleert op betalingsgegevens. Ik wil gewoon een php scriptje laten uitvoeren in een Crobjob die dan controleert of iedereen netjes heeft betaald. Als er betalingen binnenkomen, moet ik zelf met een simpel vinkje voor een periode (bijvoorbeeld 20-04-2004 - 20-05-2004) kunnen aangeven dat ze hebben betaald. Als je een week van tevoren nog niet hebben betaald, een automagisch mailtje laten sturen.

Dit moet gaan afhangen van de datum waarop ik de server activeer, steeds een maand erna moet een betaling binnenkomen. Ook een log van de oude betalingen moet beschikbaar blijven.

Nu ben ik redelijk nieuw in dit allemaal, en weet ik zeker dat ik met 2 pagina's code en 24 kolommen voor 2 jaar een heel eind kan komen :X maar ik heb het gevoel dat het veel handiger kan. Ik dacht al aan meer gegevens in een cel te stoppen, maar ja, hoe pak je zoiets aan :?

Ik hoop dat jullie mij wat tips kunnen geven, en misschien wat voorbeelden van al bestaande systemen, die ik niet heb kunnen vinden (ook lastig, omdat dit echt een specifiek script moet zijn, niet een standaard systeem).

_/-\o_

Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 14:28
Er vanuit gaande dat een periode een maand is:

tabel servers
id-name-startdatum

tabel betalingen
id-
serverid-
datum-
betaalmaand(je kunt op 30 april al voor mei betalen)

Zodra iemand betaald voeg je een rij toe aan de betalingen tabel.

Acties:
  • 0 Henk 'm!

  • dingstje
  • Registratie: Augustus 2002
  • Laatst online: 02-01-2024
Een tabel met een kolom per periode is zowiezo niet goed. Wat doe je over twee jaar? Nieuwe kolommen maken? Zo kom je nergens. Een tabelsysteem zoals hierboven lijkt er beter op. Ik zou echter elke maand *alle* klanten in die tabel steken en er een tabel paid bij steken. Zo kunnen er klanten zijn die maar een stukje betalen (per abuis), dat kan je dan ook erin steken. Heb je ook meteen controles, alle totale bedragen - alle tegoeden moet 0 zijn.

If you can't beat them, try harder


Acties:
  • 0 Henk 'm!

  • pierre-oord
  • Registratie: April 2002
  • Laatst online: 10-02 23:00
Dit gaat een beetje snel ;)

Wat djluc zegt: Steeds eennieuwe rij maken; dat komt toch neer op wat ik zeg? Dan krijg ik heel lange rijen, ipv lange kolommen..? Het enige is dat je rijen makkelijker te maken zijn dan kolommen.

Kan een van jullie misschien een grafisch voorbeeldje geven (een kolommetje in excel bijvoorbeeld).

Ik heb nu een tabel met allerlei info van iets van 20 kolommen, o.a. komt daar in voor: 'ID', 'betaald'.

In de andere tabel kan er dan ook gewoon met ID gewerkt worden. Dat betaald hoeft niet te worden gebruikt, dat zou eventueel een 1 kunnen worden, zodat ik het makkelijk aan andere pagina's kan toevoegen zonder een nieuwe query, maar dat maakt niet zo uit.

Bedankt voor de input alsnog :)

edit:
Om alvast grafisch te zijn :P een versimpelde situatie van nu:

IDvoornaamachternaamprijsmndbetaald
15PietPaulusma20,001
16KarelAppel999,000


offtopic:
Nog even een vraagje tussendoor: Ik maak gebruik van de auto_increment functie van mysql zodat de ID's automatisch worden opgehoogd. Alleen heb ik enkele test gebruikers gehad, en ondanks dat deze zijn verwijderd, worden die ID's nooit meer gebruikt. Maakt niet veel uit, maar vroeg me meer af waarom die niet worden hergebruikt?

[ Voor 40% gewijzigd door pierre-oord op 09-06-2004 19:39 ]


Acties:
  • 0 Henk 'm!

  • PrisonerOfPain
  • Registratie: Januari 2003
  • Laatst online: 26-05 17:08
pierre-oord schreef op 09 juni 2004 @ 19:34:
offtopic:
Nog even een vraagje tussendoor: Ik maak gebruik van de auto_increment functie van mysql zodat de ID's automatisch worden opgehoogd. Alleen heb ik enkele test gebruikers gehad, en ondanks dat deze zijn verwijderd, worden die ID's nooit meer gebruikt. Maakt niet veel uit, maar vroeg me meer af waarom die niet worden hergebruikt?
offtopic:
Scheeld in de administratie voor MySQL en dus in de performance en je hebt niet dat als je een ding vergeet de verwijderen dat je dan hele vreemde koppelingen ontstaan tussen de tabellen

Acties:
  • 0 Henk 'm!

  • pierre-oord
  • Registratie: April 2002
  • Laatst online: 10-02 23:00
PrisonerOfPain schreef op 09 juni 2004 @ 19:59:
[...]

offtopic:
Scheeld in de administratie voor MySQL en dus in de performance en je hebt niet dat als je een ding vergeet de verwijderen dat je dan hele vreemde koppelingen ontstaan tussen de tabellen
Eum okay, het is zeker niet aan te passen. Niet dat het me eigenlijk veel uitmaakt magoe :)

Nu hoop ik alleen een mooie administratie te kunnen maken :)

Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 14:28
Wat djluc zegt: Steeds eennieuwe rij maken; dat komt toch neer op wat ik zeg? Dan krijg ik heel lange rijen, ipv lange kolommen..? Het enige is dat je rijen makkelijker te maken zijn dan kolommen.
Ga eens wat meer over databases lezen... Het aantal rijen maakt niets uit. Misschien dat je een keer op een extreme grens beland, maar rijen zijn er om veel van aan te maken als dat nodig is. Kolommen niet in dit geval.

Acties:
  • 0 Henk 'm!

  • WillyF
  • Registratie: Augustus 2003
  • Laatst online: 10-04-2024
Als ik genoeg afwist van PHP en MySQL :P zou ik waarschijnlijk met 3 tabellen werken:

tabel clienten
client-id (of: debiteurnummer), NAW-gegevens (Naam, Adres, Woonplaats), [andere gegevens]

met andere gegevens bedoel ik bijv. telefoonnummer, mobiel, fax, bank/girorekening etc.

tabel contracten
contract-id, client-id, ingangsdatum, actief (boolean: yes/no of 0/1), bedrag, omschrijving (bijv. wat voor server etc), [uitschrijfdatum]

Hierin wordt bijgehouden, wanneer iemand is begonnen, ingangsdatum = datum waarop server voor client is geactiveerd.
Het veld ingeschreven is om bij te houden, of dat 'contract' nog wel actief is.
Als het contract wordt opgezegd, kun je 'ingeschreven' op 0 / no zetten, en eventueel nog een uitschrijfdatum opgeven, dwz. datum van opzegging.

Tevens kan 1 cliënt meerder servers huren, maar hoef je niet steeds naam en andere gegevens in te vullen.

tabel facturen
factuurnummer, factuurdatum, vervaldatum, client-id, bedrag, (eventueel btw), betaald (boolean: yes/no)


procedure 1
Aanmaken facturen:
Elke maand loopt de procedure de tabel contracten af. Voor elk contract dat nog actief is, wordt een factuur gemaakt, en weggeschreven in tabel facturen.
Aan de hand van de ingangsdatum van het contract, wordt een factuurdatum gemaakt, en een vervaldatum, dwz. datum waarop de factuur betaald moet zijn.

procedure 2
Herinnering :
Elke dag loopt de procedure de tabel facturen af. Voor elke factuur die nog niet betaald is, terwijl de huidige datum = 1 week voor vervaldatum, wordt een herinnering geschreven.

The trouble of being a troubleshooter is when trouble starts to shoot back


Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 14:28
Dan doe je het toch zo? Die opzet lijkt me wel ok zo op het eerste gezicht. Echte basisfouten zitten er in ieders geval niet in.

Acties:
  • 0 Henk 'm!

  • pierre-oord
  • Registratie: April 2002
  • Laatst online: 10-02 23:00
Ok, met dat idee van een tabel voor facturen is wel handig. Gewoon steeds een table aanmaken, onder elkaar, maakt niet uit welke volgorde, voor iedere klant. Dan vraag ik gewoon het klantID op voor een factuurgeschiedenis, sort by datum.

Maar dan, datum's van facturen verschillen, niet dat ik alle facturen maak op de 1e van de maand, maar door de gehele maand heen. Ik moet dan dus gemakkelijk PHP laten kijken óf er een factuur moet worden gemaakt.

Alle geactiveerde servers op de 31e zet ik gewoon op de 1e van de maand, zodat ik daar geen probleem mee krijg, voor januari bedenk ik dan nog wel wat.

Dan maar een lange if maken, die kijkt of er al een maand voorbij is. Voorbeeld:

datum aanzetten server / ontvangst eerste betaling: 24-05-2004

Dan wil ik vóór 24-06-2004 een nieuwe betaling hebben.

Dan krijg je, iets als:
-Als $dagvandaag == $dag_activatie dan zet in de database betaald op 0, als $maandvandaag > maandlaatstefactuur.

Die laatste factuur maand moet ik dan ook handig uit de database weten te halen. Op volgorde sorteren kan wel, ik weet alleen niet of dat veilig genoeg is. Ik kan natuurlijk wel maand in een aparte kolom zetten.

Heeft iemand een voorbeeld van zo'n controle toenvallig? Ik ben best nieuw in php+mysql, en leer dan ook steeds nieuwe functies kennen in scripts, afgekeken van andere scripts. Laatst nog "explode" gezien, toch wel erg handig, zeker met datums!

Anders ben ik hier dus zoals ik eerder zei 3 A4-tjes met code aan kwijt, terwijl het op een regel had kunnen passen.

Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 14:28
Je kunt gewoon eens kijken naar de date and time functies van MySQL in plaats van allemaal vage dingen gaan doen :) Explode is trouwens totaal *NIET* handig voor gebruik met datums. Kijk eens in de mysql documentatie naar de date and time functions en op http://www.php.net/date!

[ Voor 42% gewijzigd door djluc op 11-06-2004 17:39 ]


Acties:
  • 0 Henk 'm!

  • pierre-oord
  • Registratie: April 2002
  • Laatst online: 10-02 23:00
djluc schreef op 11 juni 2004 @ 17:38:
Je kunt gewoon eens kijken naar de date and time functies van MySQL in plaats van allemaal vage dingen gaan doen :)
Ga ik zo dadelijk meteen doen!

Heb je nog voorbeelden hiervan? Hier leer ik een stuk meer van altijd :)

Maar op de PHP website staan ook altijd wel nuttige commentaren van gebruikers.

Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 14:28
pierre-oord schreef op 11 juni 2004 @ 17:39:[...]Ga ik zo dadelijk meteen doen!
Heb je nog voorbeelden hiervan? Hier leer ik een stuk meer van altijd :)
Maar op de PHP website staan ook altijd wel nuttige commentaren van gebruikers.
Wat voor voorbeelden bedoel je? Dit is zo simpel dat de voorbeelden toch hetzelfde zullen worden als de functiebeschrijvingen. Veel speciaal is het namelijk niet.

Acties:
  • 0 Henk 'm!

  • pierre-oord
  • Registratie: April 2002
  • Laatst online: 10-02 23:00
Je hebt ook wel gelijk ook, laat deze maar even zakken, ik ga morgen even wat proberen, maar heb dan eigenlijk teveel tijd. Ik zit midden in de toetsen op dit moment, na woensdag meer tijd, na vrijdag enkele weken tijd :) ik ga dan aan de slag, en mocht ik er nog niet uitkomen, dan post ik m'n code hier :)

Na honderden edit's:

Hieronder vind je wat code. Klopt wel aardig, het werkt tenminste als ik handmatig wat users aanmaak. Uitbreiden enzo gaat wel lukken, ik zorg gewoon dat ik heel makkelijk een nieuwe factuur kan aanmaken, nadat ik een gebruiker op betaald heb gezet.

Nu moet deze code alleen nog schikkeljaar-proof worden gemaakt, en ik denk dat het ook wel korter kan. Kan iemand me met deze punten helpen? Er zijn vast mensen met schikkeljaar ervaring hier ( :P ) anders maak ik een fout, en mis ik straks een maand lang betalingen ;)

Zijn er overigens nog manieren om deze code handig te laten weergeven, net zoals op GoT, maar dan op m'n eigen website, zodat ik een link naar het script kan maken? Het wordt hier op GoT met de enorme breedte van ik gok 800 pixels erg krapjes.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
<?
include "db_connect.php";
dbConnect();
$users_tabel = "users_test";
$factuur_tabel = "factuur_test";
// Datum vandaag
$time=date("H:i:s");
$date=date("Y-m-d");
$vandaag_datum="$date $time"; // (yyyy-mm-dd H:i:s)

// Ook even omzetten, niet erg efficient, kan beter in een keer, later aanpassen
$vandaag_datum_tijd = explode(" ",$vandaag_datum);
$vandaag_date = explode("-",$vandaag_datum_tijd[0]);
#$vandaag_time = explode(":",$vandaag_datum_tijd[1]);

$users_query = mysql_query("SELECT * FROM $users_tabel");


while($users_row = mysql_fetch_array($users_query)){

    $factuur_query = mysql_query("SELECT * FROM $factuur_tabel WHERE ID='$users_row[ID]'");
    $factuur_rows = mysql_num_rows($factuur_query); 
    if ($factuur_rows == 0) {
        echo "Gebruiker met ID $users_row[ID] heeft nog geen facturen!"; 
    } else {
        while($factuur_row = mysql_fetch_array($factuur_query)){
            if ($factuur_row[betaald] != 1) {
                $factuur_uiterlijke_betaal_datum = $factuur_row[factuur_uiterlijke_betaal_datum]; // (yyyy-mm-dd H:i:s)
                $factuur_uiterlijke_betaal_datum_tijd = explode(" ",$factuur_uiterlijke_betaal_datum);
                $factuur_uiterlijke_betaal_date = explode("-",$factuur_uiterlijke_betaal_datum_tijd[0]);
                #$factuur_uiterlijke_betaal_time = explode(":",$factuur_uiterlijke_betaal_datum_tijd[1]);
                            
                // Begin controleren of gebruiker optijd heeft betaald
                // Als ze al een jaar te laat zijn...
                if ($vandaag_date[0] > $factuur_uiterlijke_betaal_date[0]) {
                    echo "Gebruiker met ID $users_row[ID] had een of meerdere jaren eerder moeten betalen... 
                    voor factuur $factuur_row[factuur_nummer]"; 
                    // Het volgende komt bij al deze if's (als functie in dat geval)
                    if ($factuur_row[mail_verstuurd] == 0) {
                        # stuur e-mail naar mij om op de hoogte te worden gesteld van wanbetaling;
                        $mail_query  ="UPDATE $factuur_tabel SET mail_verstuurd='1'";
                        mysql_query("$mail_query") or die("Ongeldige query: " . mysql_error());
                    }                       
                
                // Als het jaar nog gelijk is
                } elseif ($vandaag_date[0] == $factuur_uiterlijke_betaal_date[0]) {
                    
                    // als we een maand verder dan betaaldatum zitten
                    if ($vandaag_date[1] > $factuur_uiterlijke_betaal_date[1]) {        
                        echo "Gebruiker met ID $users_row[ID] had een of meerdere maanden eerder moeten betalen...";  
                    // als we in dezelfde maand zitten, controleer dan op de dag
                    } elseif ( ($vandaag_date[1] == $factuur_uiterlijke_betaal_date[1]) AND ($vandaag_date[2] > $factuur_uiterlijke_betaal_date[2])) {      
                        echo "Gebruiker met ID $users_row[ID] had een of meerdere dagen eerder moeten betalen...";
                    } else {
                        echo "Gebruiker is liev :P ";
                    }
                // ALs de betaaldatum pas in het volgende jaar valt
                } elseif ($vandaag_date[0] < $factuur_uiterlijke_betaal_date[1]) {      
                    echo "Gebruiker is liev :P ";
                
                } else {
                    echo "Bel de MySQL alarmdienst, de het databeest is ziek!";
                }
                          

            }
            
        }
    }
    
    // Voor in welke maand moet een factuur worden gemaakt?
    
    // nu loop ik vast, ik kan grof typen wat het moet worden
    
    //Facturen moeten 10 dagen van tevoren worden verzonden.
    //Als gebruiker niet binnen 10 dagen betaald,
    //moet ik in een ander script hiervan op de hoogte worden gesteld.
    
    //Als gebruiker al factuur heeft voor deze maand, dan einde en 
    //volgende gebruiker (rij)  controleren.
    //Hoe controleer ik dat nu het handigste? Ik moet met de data straks ook nog oppassen
    //voor schikkeljaren etc ...
    
    //Als gebruiker niet betaald heeft voor deze maand, 
    //dan factuur toevoegen aan tabel 'factuur', onder vermelding van:
    //ID (halen uit tabel users, en ook in tabel factuur stoppen)
    //betreft (halen uit tabel users, berichtje maken over servertype enz)
    //betaald (betaald op 0 zetten (hoeft eigenlijk niet) )
    //factuur_datum
    //factuur_uiterlijke_betaal_datum
    //factuur_nummer (genereren aan de hand van gebruikersID en datum)
}

?>

[ Voor 218% gewijzigd door pierre-oord op 12-06-2004 16:40 ]


Acties:
  • 0 Henk 'm!

  • pierre-oord
  • Registratie: April 2002
  • Laatst online: 10-02 23:00
schopje

Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 14:28
Gebruik gewoon de date and time functions dan heb je geen schrikkeljaar problemen.

Acties:
  • 0 Henk 'm!

  • pierre-oord
  • Registratie: April 2002
  • Laatst online: 10-02 23:00
djluc schreef op 13 juni 2004 @ 13:26:
Gebruik gewoon de date and time functions dan heb je geen schrikkeljaar problemen.
Ow, wacht, ik heb het zelf al goed gedaan geloof ik; als iemand niet zou worden gecontroleerd doordat de huidige datum van 28 > 1 mei versprong, dan wordt die wel gecontroleerd door de maand controle :)

Ik geloof dat het zo wel goed zit, ik post vanavond wel een laatste stukje code, kijk maar of dat dan waterdicht is :)
Pagina: 1