Abrechnungs-Algorithmus

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • #16
    Hallo Leute,

    das Problem ist, dass ich derzeit keinen blassen Schimmer habe, wie ich meinen Ansatz realisieren könnte. Deswegen wollte ich mir bei euch Ansätze holen, wie ich die Situation möglichst sauber lösen kann.

    Also das Problem ist folgendes:

    Ich habe einen Zeitraum von X bis Y in UNIX-Timestamps und dieser Zeitraum kann größer als ein Monat sein. Also 1, 3 oder 6 Monate. Innerhalb dieser Zeiträume kann sich aber der Preis des Ganzen ändern. Dieser wird durch Preis, Gültig von und Gültig bis definiert.

    Ich weiß nicht, wie ich nun am sinnvollsten daraus einen Rechnungsposten mache... Wie kriege ich die Preisänderungen in dem Zeitraum sinnvoll raus und verwende die. Das ist mein derzeitiges Problem.

    VG
    Henning

    Kommentar


    • #17
      Wie kriege ich die Preisänderungen in dem Zeitraum sinnvoll raus und verwende die. Das ist mein derzeitiges Problem.
      glaub ich nicht

      Poste mal den Source wie Du irgendwas rauskriegst.

      Den kann man dann eventuell erweitern.

      Kommentar


      • #18
        PHP-Code:
        //Hier hole ich letzte und nächste Rechnungsdaten
        $contractdata_res $db->query("SELECT `contractLastBilled`, `contractDue`
        FROM `contract`
        WHERE `contractID` = 'X'"
        );

        $contractdata mysql_fetch_assoc($contractdata_res);

        $price_data $db->query("SELECT `contractPrice`, `contractPriceValidFrom`, `contractPriceValidTill`
        FROM `contractPrice`
        WHERE `contractPriceContract` = 'X'"
        );

        while(
        $price mysql_fetch_assoc($price_data)) {

        //Hier müssen die Zeilen verarbeitet werden


        Das sind die Queries, die ich ausgearbeitet habe. Das Problem ist mit den Preisen. Der Zeitraum zwischen der letzten Rechnung und der nächsten Fälligkeit (Due) kann 1, 3 oder 6 Monate betragen in UNIX-Timestamps.

        Das Problem was ich jetzt habe, ist die Verarbeitung des Preises.

        VG
        Henning

        Kommentar


        • #19
          die zwei queries hintereinander zu schreiben macht keinen Sinn.

          Bei der ersten Query wertest Du ja gar nix aus (kein mysql_fetch_assoc oder sonst was)

          Wie sind denn beide Tabellen miteinander verknüpft ?

          Beide Tabellen müssen ja einen gemeinsamen Schlüssel haben
          (z.B. contract_art)

          Kommentar


          • #20
            Klar, der Vertrags-Query (der Erste) wird ausgewertet:

            PHP-Code:
            $contractdata mysql_fetch_assoc($contractdata_res); 
            Die beiden sind voneinander anhand der contractID abhängig.
            Warum macht es keinen Sinn, die beiden Queries nacheinander zu bearbeiten?!

            VG
            Henning

            Kommentar


            • #21
              ach so - hatt ich übersehn.

              Du kannst aber beide Queries in einem machen:

              SELECT .... FROM tabelle1, tabelle2 WHERE tabelle1.id = tabelle2.id

              Kommentar


              • #22
                Hi Koalo,

                geht leider nicht, da die contractPrice Tabelle mehrere Einträge zu einer ContractID existieren können.

                Kommentar


                • #23
                  Den Zusammenhang mußt Du mir erklären:

                  EINEM Vertrag sind mehrere Preise zugeordnet ?

                  Kommentar


                  • #24
                    Entweder verstehst du dein eigenes Schema nicht oder verwürfelst hier die Angaben derart, dass wir ein falsches Bild haben.

                    Ich habe es jetzt so verstanden: Du hast auf jeden Fall so eine Tabelle:
                    contract(ID, LastBilled, Due)

                    Und dann hast du eine von diesen hier, aber welche?
                    contractPrice(Price, PriceValidFrom, PriceValidTill, PriceContract)
                    contractPrice(Price, PriceValidFrom, PriceValidTill, PriceContract, ID)
                    Entweder ist PriceContract bereits der Bezug zur contract-Tabelle oder nicht.

                    Wie auch immer, du solltest dich über JOINs informieren. Denn auch wenn einem Vertrag mehrere Preise zugeordnet sind (Januar-Miete = x, Februar-Miete = y, ...) kann man joinen und den gewünschten Zeitraum mit WHERE filtern.

                    Unabhängig davon solltest du dein Schema mal aufräumen.
                    contract(ID, LastBilled, Due)
                    price(contract_ID, Price, ValidFrom, ValidTill)
                    Mehr brauchst du doch gar nicht.
                    Zuletzt geändert von onemorenerd; 06.06.2007, 19:52.

                    Kommentar


                    • #25
                      Hallo onemorenerd,

                      die Struktur ist bereits aufgeräumt, sie sieht wie folgt aus:

                      contract (ID, Due, LastBill)
                      contractPrice (ID, contract, contractPrice, contractPriceValidFrom, contractPriceValidTill)

                      Der Zusammenhang besteht über die contractID.

                      Ein Vertrag kann mehrere Preise haben, jedoch gibt es keine Überschneidungen. Ich muss nun es irgendwie hinkriegen, dass die X Monate, die zwischen LastBill und Due liegen, berechnet werden und auf der Rechnung ausgewiesen werden. Und genau da setzt das Problem an, dass ich nicht weiß, wie ich das realisieren soll.

                      VG
                      Henning

                      Kommentar


                      • #26
                        Original geschrieben von Someday
                        contract (ID, Due, LastBill)
                        contractPrice (ID, contract, contractPrice, contractPriceValidFrom, contractPriceValidTill)

                        Der Zusammenhang besteht über die contractID.

                        Ein Vertrag kann mehrere Preise haben, jedoch gibt es keine Überschneidungen. Ich muss nun es irgendwie hinkriegen, dass die X Monate, die zwischen LastBill und Due liegen, berechnet werden und auf der Rechnung ausgewiesen werden. Und genau da setzt das Problem an, dass ich nicht weiß, wie ich das realisieren soll.
                        Hättest du es gleich so formuliert, wäre das Problem längst vom Tisch.

                        SELECT * FROM contract AS c
                        JOIN price AS p ON (c.ID = p.ID)
                        WHERE c.LastBill <= p.PriceValidTill AND p.PriceValidFrom <= c.Due

                        Das liefert dir die Überdeckung. Die Tupel, bei denen die Zeitspanne c.Lastbill bis c.Due nicht vollständig in der Spanne p.PriceValidFrom bis p.PriceValidTill liegt, mußt du besonders behandeln. Aber das kannst du ja leicht in PHP abhandeln.

                        Kommentar


                        • #27
                          Hallo onemorenerd,

                          aber genau mit der Abarbeitung dieser Fälle habe ich Schwierigkeiten. Weil ich nicht weiß, wie ich das machen kann. Ich bräuchte folgendes Ergebnis:

                          1 x Vertrag
                          01.01.2007 - 31.01.2007 39 EUR
                          01.02.2007 - 31.02.2007 21 EUR
                          01.03.2007 - offen 35 EUR

                          VG
                          Henning

                          Kommentar


                          • #28
                            Wirklich nicht? Auch nicht mit "ORDER BY p.cid, p.PriceValidTill"?
                            Zeig doch mal deinen Versuch (den Code).

                            Kommentar


                            • #29
                              Hallo onemorenerd,

                              ich habe es folgendermaßen geplant:

                              PHP-Code:
                              function billAll($customer) {

                              $result $db->query("SELECT `contractID`
                              FROM `contract`
                              WHERE `contractStatus` = '1'
                              AND `contractDue` < '"
                              .time()."'");

                              while(
                              $row mysql_fetch_assoc($result)) {

                              $contractdata $this->get($row["contractID"]);

                              $begin $contractdata->lastbill;

                              while(
                              $begin $contractdata->due) {

                              //Jetzt prüfen, welche Konditionen / Preise für diesen Monat gültig sind. Im Sinne von:

                              $res_sub $db->query("SELECT `contractPrice`
                              FROM `contractPrice`
                              WHERE `contractPriceContract` = '"
                              .$contractdata->."'
                              AND `contractPriceValidFrom <= '"
                              .$begin."'
                              AND ( `contractPriceValidTill` > '"
                              .$end."'
                              OR `contractPriceValidTill` IS NULL )"
                              );

                              //Diese dann weiterverarbeiten ...


                              Was hälst du davon?
                              Zuletzt geändert von Someday; 06.06.2007, 21:50.

                              Kommentar


                              • #30
                                Vermutlich nicht viel, weil Du seinen Hinweis ja gar nicht beachtet hast. Hast Du seine Query überhaupt mal ausprobiert? Sieht auf den ersten Blick für mich aus, als ob Dir damit genau die Datensätze für einen bestimmten Zeitraum aus den Vertragskonditionen geliefert werden. Schleife drüber, dabei auf die beiden unvollständigen Monate achten, fertig ist die Laube. Fang an, konkrete Probleme zu posten.

                                Kommentar

                                Lädt...
                                X