Gestione delle fatture con data e ora

3

Al momento sto scrivendo qualcosa su crea automaticamente fatture con cronjobs utilizzando PHP e timestamp.

Ho una idea ben ponderata su come risolverlo, ma voglio chiedere alla community se qualcuno può vedere errori nel ragionamento e < strong> possibili problemi con la mia soluzione .

Sto cercando di descrivere la mia idea nel modo più dettagliato possibile in modo che tutti possano seguire il mio modo di pensare:

In generale ci sono 4 tipi di fatture :

  1. Pagato annualmente
  2. Pagato semiyearly
  3. Pagato trimestralmente
  4. Pagato mensilmente

I prodotti acquistati vengono salvati in un database SQL con il ciclo di fatturazione:

  • ID dell'utente
  • ID prodotto
  • Ciclo di fatturazione
  • Scadenza

Ora c'è un cronjob che viene eseguito una volta al giorno per verificare se è necessario creare una nuova fattura per ogni prodotto acquistato. Nella riga Last Due Date salvi il timestamp della prima data da pagare quando viene creato.

Un codice che ho già scritto calcola il tempo trascorso dal Last Due Date timestamp e restituisce qualcosa di simile a questo:

  • La data / ora è passata o futura
  • Mese passato
  • I giorni passati

Ora le mie regole per la creazione di una nuova fattura sono:

  1. Pagato annualmente

    if (Il timestamp è passato = true AND il mese è passato = 11 AND Days gone by > = 20)

    quindi (crea una nuova fattura e imposta "Ultima data di scadenza" su time ())

  2. A pagamento semiyearly

    if (Il timestamp è passato = true AND il mese è passato = 5 AND Days gone by > = 20)

    quindi (crea una nuova fattura e imposta "Ultima data di scadenza" su time ())

  3. Pagato trimestralmente

    if (Il timestamp è passato = true AND il mese è passato = 3 AND Days gone by > = 20)

    quindi (crea una nuova fattura e imposta "Ultima data di scadenza" su time ())

  4. Pagato mensilmente

    if (Il timestamp è passato = true AND il mese è passato = 0 AND Days gone by > = 20)

    quindi (crea una nuova fattura e imposta "Ultima data di scadenza" su time ())

Come puoi vedere una nuova fattura verrà creata ~ 10 giorni prima della data di pagamento e il timestamp in Last Due Date è impostato sull'ora corrente, quindi quando il cronjob torna indietro il giorno successivo non verrà creata alcuna fattura per questo prodotto acquistato.

La mia domanda è se questo è un modo appropriato per risolverlo e se puoi vedere eventuali errori nel ragionamento o problemi che potrebbero verificarsi ?

    
posta Fabian 20.01.2012 - 14:26
fonte

3 risposte

4

La cosa più grande che vedo manca è tenere traccia di ciò che l'utente ha effettivamente pagato. Alcune persone pagano un importo più o meno dell'importo dovuto, quindi alcuni potrebbero avere un saldo dovuto dall'ultima fattura, mentre altri potrebbero essere pre-pagati per diversi periodi precedenti.

MODIFICA: in base al tuo commento, vedo che questo è gestito separatamente, ottimo!

L'altra cosa che vedo è il modo in cui gestisci il campo TIMESTAMP. Ad esempio:

Pagamento mensile

if (Il timestamp è passato = true AND il mese è passato = 0 AND I giorni sono passati > = 20)

quindi (crea una nuova fattura e imposta "Ultima data di scadenza" su time ())

Supponiamo che inizialmente mi sia registrato il 1 ° gennaio 2012, quindi Timestamp inizia con quella data. Supponendo che pago mensilmente, ciò significa che generi una fattura il 20/01/2012 e imposta il Timestamp al 20/01/2012. Ciò significa che generi una fattura ogni 20 giorni anziché una volta al mese? In altre parole, genererai una fattura il 2/9/2012 (20 giorni dopo il 20/01/2012)?

Il punto è che la prossima fattura deve essere generata in base alla data di fine del periodo di fatturazione corrente, non alla data in cui è stata generata la fattura.

Attualmente "imposti" l'ultima data di scadenza "a tempo ()", forse vuoi impostare la data di scadenza per il primo giorno del prossimo periodo di fatturazione? Quindi, ad esempio, quando si generano fatture mensili il 20/01/2012 si cambierà 1/1/2012 (valore corrente in DB) a 2/1/2012. Non si indica quale database si sta utilizzando, ma molti hanno funzioni incorporate per aggiungere 1 mese, trimestre, anno ecc.

    
risposta data 20.01.2012 - 14:38
fonte
1

Se il tuo obiettivo è di fatturare ogni giorno, non sei sicuro di avere una scelta. Hai 365 periodi di fatturazione all'anno. Con l'automazione, questo non è un problema.

Sembra che il tuo metodo per la creazione delle fatture dovrebbe funzionare (una buona cattura da parte di @jonnyboats per non utilizzare la data in cui le fatture sono state create come data di fatturazione). Dato che stai salvando la data di scadenza, se dovessi apportare una correzione a una fattura (in particolare la data), devi assicurarti che questa data venga aggiornata dopo ogni rettifica. È possibile interrogare questa data in base all'ultima data di fatturazione per l'articolo di questo cliente nelle fatture, pertanto qualsiasi rettifica verrà presa in considerazione. Il tuo metodo migliora le prestazioni.

Datevi la possibilità di impostare un parametro Date di esecuzione (predefinito su time ()). Se la corsa della scorsa notte è fallita, vuoi la possibilità di eseguirla manualmente impostando l'ora di ieri. I fine settimana e le vacanze hanno il loro insieme di problemi.

    
risposta data 20.01.2012 - 15:20
fonte
1

Definizione del problema

Le fatture devono essere generate sulla base di un ciclo temporale. I dati vengono memorizzati in una tabella, ad esempio In fattura, con i campi ID utente, ID prodotto, Ciclo di fatturazione e Data ultimo pagamento. In base al campo del ciclo di fatturazione e al timestamp dell'ultima data di scadenza, le fatture devono essere generate quotidianamente e in anticipo (10 giorni).

Le mie ipotesi

  • Ultima data di fine è un timestamp generato al momento della puchase di un prodotto in base al ciclo di fatturazione. Pertanto, se il tempo in cui i dati vengono generati è il 20 gennaio 2012 e il ciclo di fatturazione è mensile, l'ultima data di scadenza sarà ~ 20 FEB 2012
  • Per ogni riga nella tabella A fattura, c'è una tabella corrispondente collegata a questa tabella che contiene quantità e valore del prodotto, ad esempio Prodotto. Speriamo che ci siano anche delle tabelle che contengano l'indirizzo di fatturazione e altre informazioni, ad esempio il Fornitore.
  • Le fatture devono essere generate quotidianamente
  • Le fatture devono essere generate 10 giorni prima della data di scadenza
  • Ogni riga nella tabella A fattura deve avere una fattura separata
  • Non parleremo dei pagamenti

Soluzione proposta

  • Viene eseguito un cron job.
  • Questo lavoro analizza la tabella A fattura, confronta la data di scadenza con la data attuale e lo stato di timestamp di output (passato o futuro), mesi e giorni e in base a questi dati e al ciclo di fatturazione, decide se generare la fattura oppure no
  • La fattura viene quindi generata in base ai dati nelle tabelle di prodotti e fornitori

Questa è la mia comprensione della tua domanda. Se questo è il requisito reale, allora c'è un grande difetto nel design. Non esiste un modo esplicito per monitorare se un prodotto è stato fatturato o meno. Ovviamente, per principio, possiamo sempre confrontare la data di scadenza con quella attuale per ottenere un elenco di prodotti non fatturati ma praticamente non è possibile perché per rendere ciò possibile, il cron job deve essere eseguito tutti i giorni all'ora specificata senza errori e il lavoro deve creare tutte le fatture senza interruzioni. Entrambi sono praticamente impossibili. Inoltre, un secondo difetto è che le fatture non possono essere modificate facilmente con questo design. Molte fatture possono essere cancellate (nel mondo reale) e con il design esistente, è necessario aggiornare manualmente il timestamp di quei prodotti che devono essere nuovamente fatturati. In terzo luogo, sebbene non sia un difetto, questo disegno non sembra essere facilmente estensibile. Supponiamo che venga aggiunto un altro ciclo bimestrale e che alcuni dei prodotti che devono essere fatturati trimestralmente vengano fatturati bimestralmente. Quindi, è necessario eseguire un gran numero di calcoli per apportare modifiche.

Sulla base delle osservazioni di cui sopra, suggerisco la seguente soluzione

  • Invece di salvare la data di scadenza nella tabella A fattura, salva l'ora in cui viene generata la voce (il tempo di acquisto), consente di chiamare la data / ora del prodotto
  • Aggiungi un valore Booleano archiviato per verificare se il prodotto è stato fatturato o meno con il valore predefinito False
  • Ora, il tempo presente verrà confrontato con la data / ora del prodotto e insieme al ciclo di fatturazione e se deve essere fatturato, sarà fatturato e il campo è fatturato come aggiornato.
  • Nel caso in cui la fattura venga annullata, basta modificare il campo isInvoiced in False, il programma genererà automaticamente una fattura alla successiva esecuzione del cron job.

Per illustrare, diciamo che un prodotto è stato acquistato il 1 ° gennaio 2012 con un ciclo di fatturazione di 1 mese. È previsto il 31 gennaio per il quale è necessario presentare una fattura il 21 gennaio (10 giorni prima). Se il cron job non riesce a essere eseguito il 21st e viene eseguito solo il 22, genererà comunque una fattura perché saprà che il prodotto non viene fatturato controllando il campo isInvoiced e poiché il ciclo di fatturazione è di 30 giorni e la differenza tra la data di scadenza (timestamp del prodotto + tempo di ciclo di fatturazione) e la data / ora del prodotto sono inferiori a 10 giorni. La stessa tecnica funziona anche per fatture annullate, purché il campo isInvoiced sia impostato su zero. Suggerirei inoltre di mantenere il tempo di ciclo in giorni in quanto è più facile da capire e calcolare.

Mantenendo la struttura di cui sopra, il lavoro cron potrebbe essere facilmente automatizzato con una query SQL e quasi tutti i database forniscono questo tipo di query

    
risposta data 21.01.2012 - 10:24
fonte

Leggi altre domande sui tag