Avatar billede mgjuhler Nybegynder
08. marts 2014 - 18:15 Der er 8 kommentarer og
1 løsning

Tilbuds system (flere varer i et tilbud)

Jeg arbejder på et kiosk system i php og mysql, jeg er nu så vidt at jeg er gået i gang med at kigge på vare gruppe tilbud.

Meningen er at hver gang en vare tilføjes til kurven så køres alle varerne igennem for at se om der er nogle af dem der indgår i et tilbud.

Tilbud "test 1" som består af 4 grupper med forskellige varer i hver gruppe (itemId):
gruppe 1: 1,2,3,4,5
gruppe 2: 11,22,33,44,55
gruppe 3: 111,222,333,444,555
gruppe 4: 1111,2222,3333,4444,5555

Dvs følgende varer i kurven udløser rabat: 1+11+111+1111 samt 3+44+111+4444 osv

Tilbud "test 2" består af:
gruppe 1: 9,7,5,3
gruppe 2: 11,12,13,14,15
gruppe 3: 77,88,99

Der må max bruges en vare fra hver gruppe

Jeg kan bare ikke finde ud af hvordan jeg får tjekket at indholdet af kurven med de tilbud jeg har.
08. marts 2014 - 20:55 #1
Jeg er ikke sikker på, at jeg fuldt ud forstår dine rabatregler.  Du siger, at der højst må bruges en vare for hver gruppe.  Så hvis man i test1 vælger fire varer, en fra hver gruppe, så gives der rabat på disse fire varer.  Det er klart.  Men gives der også rabat på enkle varer?  Hvis jeg vælger vare nummer 1 plus vare nummer 9, altså en fra hver "tests" og så ikke andet, får jeg så rabat på begge disse?  Også, hvis jeg vælger vare nummer 1 og vare nummer 2 gives der kun rabat på en af disse, men hvordan bestemmes det, om rabatten skal gives på vare 1 eller på vare 2?  Videre, hvis jeg bestiller 2 styks af vare 1, får jeg så rabat på de tre, eller kun på en?  Hvis du kun giver rabat på  styks, hvis en kunde logger på og bestiller 1 styks af vare 1 får kunden rabat, men hvis kunden logger af og så logger på igen og bestiller 1 styks af vare 1, får kunden så igen rabat?  Hvis ikke, hvordan vil du så kontrollere, at kunden allerede har opbrugt sine rabat muligheder for vare 1?  Og så endnu et spørgsmål:  hvorfor vil du checke for rabat hver gang en vare tilføjes til kurven?  Det ville være nemmere at checke en gang når kurven afsluttes.
09. marts 2014 - 06:06 #2
Den fik jeg skudt for hurtigt af.  Jeg mener naturligvis:  ...hvis jeg bestiller 2 styk af vare 1, får jeg så rabat på de to, eller kun på en?  Hvis du kun giver rabat på 1 styk, ....
Avatar billede mgjuhler Nybegynder
09. marts 2014 - 13:36 #3
Tilbud "test 1":
gruppe 1: 1,2,3,4,5
gruppe 2: 11,22,33,44,55
gruppe 3: 111,222,333,444,555
gruppe 4: 1111,2222,3333,4444,5555

En vare fra hver gruppe udløser en kontant rabat på de 4 varer der indgår i tilbudet, dvs 1+33+222+5555 giver 20 kr rabat på de fire varer. Der er ingen rabatter på enkelte varer eller 2 ens, den eneste type rabat der er i "test 1" er 20 kr rabat på 4 varer (en fra hver gruppe)

Der kan i kurven sagtens være flere varer af den samme type, det er stadig kun en af varerne der er med til at udløse et tilbud
09. marts 2014 - 19:21 #4
Jamen så begynder det vist at dæmre.  Lad mig forklare det med mine egne ord, så kan du rette mig hvis jeg alligevel har fået galt fat på det.  Du kan have flere forskellige tilbud kørende.  Hvert tilbud er på et bestemt rabat-beløb (for test 1 20 kr., for test 2 måske et andet beløb for eksempel 15 kr.), og hvert tilbud indeholder et antal grupper hver med et antal varenumre.  For at en kunde kan få en rabat skal kundens kurv indeholde mindst vare fra hvert af tilbuddets grupper.  Hvis en kundes kurv indeholder fem styks af vare 1, 3 af 2, 1 af 22, 2 af 333, 1 af 4444, 1 af 5555, 1 af 9, 2 af 12, 3 af 13, og 1 af 99, så får kunden, så får kunden de 20 kr. rabat for test 1 plus 15 kr. rabat for test 2.

I så fald tror jeg, at i stedet for at 'køre alle varene igennem for at se om der er nogen af dem der indgår i et tilbud' så vil det være nemmere at køre alle tilbuddene igennem for at se om kurven opfylder betingelsen.

Men du svarede ikke på mit spørgsmål om hvorfor du vil foretage denne test hver gang en vare tilføjes til kurven i stedet for når kurven er klar.

Jeg 'brainstormer' lidt.  Hvordan kender 'systemet' tilbuddene?  Har du disse i database tabeller?  Jeg kunne forestille mig en tabel 'tilbud' hvor hvert tilbud har en id, et rabatbeløb, og andre informationer så som gyldighed (så du kan gemme oplysninger om tilbud der ikke længere er gyldige) og så en anden tabel 'tilbudslinjer' med fire felter, id, tilbud, gruppe, varenummer.  Hvis 'test 1' har tilbud-id 1, så kommer 'tilbudslinjer' tabellen til at se således ud:

1  1  1  1
2  1  1  2
3  1  1  3
4  1  1  4
5  1  1  5
6  1  2  11
7  1  2  22
....
11  1  3  111
o.s.v

Testen for om varerne i en kurv udløser en eller flere rabatter kunne jeg forestille mig således, at for hvert gyldigt tilbud sættes $rabat til 0.  Så for hver af tilbuddets grupper sættes $gruppe til 0.  Indenfor hver gruppe undersøges det så for hvert varenummer om varenummeret er i kurven.  Hvis ja, så sættes $gruppe til 1, og der gås videre med næste gruppe.  Hvis alle varerne i en gruppe er kørt igennem og $gruppe stadig er 0, så stoppes testen for dette tilbud, og testen kører videre med næste tilbud.  Hvis for alle grupperne i tilbuddet $gruppe bliver 1, så sættes $rabat til 1.  Når alle tilbuddene er kørt igennem får kunden rabatterne for de tilbud der har $rabat lig med 1.

Hvad mener du om det?
Avatar billede mgjuhler Nybegynder
09. marts 2014 - 19:39 #5
Det ser ud til at du har forstået det :) Grunden til at jeg vil udgøre tjekket hver gang er for at være sikker på at en varer ikke bliver brugt i et andet tilbud, en vare kan godt være en del af flere tilbud og bare for at være sikker så ville jeg tjekke hver gang.

Dette er hvad jeg er kommet på indtil nu:

$this->db->from('shop_deals_multi');

    $this->db->where('status',1);
    $this->db->order_by("id",'ASC');

    $deals = $this->db->get();

    /* kører alle tidbud igennem */       
    foreach ($deals->result_array() as $deal) {

        echo 'Tilbud: '.$deal['title'].' tjekkes<br>';

        $checks = 0;

        for ($groupId=1; $groupId < 5; $groupId++) {

            if (!empty($deal['items_'.$groupId])) {

                echo 'Tjekker gruppe '.$groupId.'<br>';

                /* Køre kurven igennem for tjek på varer fra gruppe x */
                $this->db->select('pId,pAmount');
                $this->db->from('shop_receiptItems');

                $this->db->where('pDealId',0);
                $this->db->where('dealCheck',0);
                $this->db->where('pEventId',$this->event->current());
                $this->db->where('pReceiptId',$this->session->userdata('orderId'));
                $this->db->where_in('pItemsId', explode(',', $deal['items_'.$groupId]));

                $query = $this->db->get();

                if ($query->num_rows()) {
                    echo 'Der blev fundet en vare der indgår i gruppe '.$groupId.'<br>';
                    pre($query->row_array());
                    $checks++;
                }

            }

        }

        if ($checks > 0) {
            echo 'TILBUD GODKENDT<br>';
        }

        echo '------------------------------------------<br>';
    }

Jeg har mine tilbud i en tabel som skal rettes til så den ikke virker så uoverskuelig :) men den indeholde id, titel, gruppe_1 varegruppe id (sodavand, chokolade mv) items_1 de varer fra vare gruppen som er en del af tilbudet og sådan forsætter den til gruppe 4, også er der feltet med selve rabatten.
Avatar billede mgjuhler Nybegynder
09. marts 2014 - 19:39 #6
Jeg har ikke mere tid i dag til at kigge på det men jeg skal lige have testet det igennem i morgen
10. marts 2014 - 07:03 #7
Et par strøtanker - jeg har ikke studeret koden i #5, jeg må indrømme, at jeg tabte tråden.

1.  Ja, du synes at have lavet en meget uoverskuelig og lidet fleksibel tabel for tilbud.  Har du kikket på mit forslag: at have en tabel for tilbud 'headeren' med tilbuds-id, tilbuds-navn, rabat beløbet, måske noget med gyldighed, måske et felt til bemærkninger.  Og så en anden tabel med grupperne og varerne med en linke for hver kombination af tilbuds-id, gruppe, og vare.  Du trækker så oplysninger ud ved at joine.  (En af fordelene skulle være, at du så ikke i al fremtid er bundet til at have fire grupper med fem varer i hvert tilbud.)

2.  Jeg kan se, at når du finder en vare i kurven der indgår i en tilbudsgruppe, så udskriver du en tekst.  Men sker der også noget elektronisk?  Eller er det din tanke at beregne rabatterne manuelt baseret på disse udskrifter?  Et alternativ kunne være, i den databasetabel hvor du har kurven, at tilføje et felt, for eksempel 'brugt for rabat' med default værdi 0 som du så updater til 1 for de varer du finder der indgår i en gruppe.  Og så søger du kun efter varer i kurven hvor 'brugt for rabat' har værdien 0.  Men du siger, at en vare kan indgå i flere tilbud.  Lad os sige, at test2 gruppe 1 indeholder varerne 1, 9, 7, 6, og 3.  Så indgår vare 1 både i test1 og test2.  Hvis så en kunde i sin kurv har vare 1 og vare 2 og et antal andre varer, vil du så sige, at vare1 er brugt for rabat i test1, så tæller den ikke for rabat i test2?  Eller vil du bruge vare 2 for rabat i test1 så vare1 er til rådighed for rabat i test2?  Det lyder som noget indviklet at kode og holde styr på.

3.  Det fører til min sidste strøtanke (og så skal jeg nok holde op for denne gang):  Optimale rabat systemer skulle gerne virke således at den forventede ekstra indkomst ved større salg overstiger udgiften til rabatter, og således at man ønsker og opfordrer kunderne til at bruge rabat systemet så meget som muligt.  Har du sat dit rabatsystem op således, at du med indviklede programmering er nødt til at passe på at kunderne ikke snyder dig?
Avatar billede mgjuhler Nybegynder
13. marts 2014 - 14:23 #8
Jeg har lagt gruppe tilbuds delen på is indtil jeg får bedre tid til at kigge på det, jeg beklager.

Smid et svar hvis du vil have points
13. marts 2014 - 14:27 #9
Et svar for at få spørgsmålet lukket for nærværende.  (Alternativt kan du naturligvis selv oprette et svar og lukke på det.)  Hvis du senere får mere tid og får det gennemtænkt igen og så stadig har problemer regner jeg med, at du opretter et nyt spørgsmål.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester