/*
** Verwaltung der Rechnung
**
** Copyright (C) 1996 by Stefan Scherer.
**
** Permission to use, copy, modify, and distribute this software and its
** documentation for non-commerical use and without fee is hereby granted,
** provided that the above copyright notice appear in all copies and that
** both that copyright notice and this permission notice appear in
** supporting documentation.  This software is provided "as is" without
** express or implied warranty.
*/

#ifndef RECHNUNGEN_H
#define RECHNUNGEN_H

#include "LocaleSupport.h"
#include "Kunden.h"
#include "Artikel.h"

#define MAX_INV_LEN 100


/* allgemeine Daten, wie sie auch für die Liste benötigt werden, können
** auf einen Schlag geholt und gesetzt werden
*/

struct MinInvoice
  {
    UWORD invoiceNumber;	/* Rechnungsnummer */
    UWORD invoiceYear;
    char invoiceDate[12];	/* Rechnungsdatum */
    char Kunde[100];		/* erste Zeile der Kundenanschrift = Name */
    UWORD orderNumber;		/* Auftragsnummer */
    UWORD orderYear;
    char orderDate[12];		/* Auftragsdatum */
    double payment;		/* gezahlter Betrag */
    double sum;			/* Rechnungssumme */
    char payDate[12];		/* Datum der (letzten) Zahlung */
    char printDate[12];		/* Datum des (letzten) Ausdrucks */
  };



/*** o-functions ***/

int ConstructInvoice (void);
void DestructInvoice (void);
int I_NewInvoice (void);

/* Funktionen, die die Einträge in der Rechnung ändern */

int I_AddInvoiceItem (struct MinArticle *item);
int I_DelInvoiceItem (void);
int I_ChangeInvoiceItem (struct MinArticle *item);
int I_SetCurrentItemNumber (UWORD number);

/* Funktionen zum setzen allgemeiner Daten der Rechnung */

void I_SetInvoiceAddress (struct MinCustomer *cust);
void I_SetInvoiceMode (UWORD mode);
void I_SetInvoiceNumber (STRPTR buffer);
void I_SetInvoiceDate (STRPTR date);
void I_SetPrintDate (STRPTR date);
void I_SetPayment (double amount, STRPTR date, UWORD mode);
void I_SetOrderNumber (STRPTR buffer);
void I_SetOrderDate (STRPTR date);
void I_SetMwSt (double mwst1, double mwst2);

/* Dateizugriffe mit dieser Rechnung */

int I_LoadInvoice (STRPTR filename, BOOL);
int I_SaveInvoice (STRPTR filename, BOOL);


/*** v-functions ***/

/* Funktionen, die allgemeine Daten der Rechnung auslesen */

void I_GetInvoiceAddress (struct MinCustomer *cust);
UWORD I_GetInvoiceMode (void);
void I_GetInvoiceNumber (STRPTR buffer);
void I_GetInvoiceDate (STRPTR date);
void I_GetPrintDate (STRPTR date);
void I_GetPayment (double *amount, STRPTR date, UWORD * mode);
void I_GetOrderNumber (STRPTR buffer);
void I_GetOrderDate (STRPTR date);
double I_GetMwSt (UWORD preistab);
BOOL I_GetStatus (void);

/* Funktionen, die die Einträge der Rechung auslesen */

int I_GetInvoiceItem (UWORD num, struct MinArticle *item);
int I_GetDummyInvoiceItem (UWORD num, struct MinArticle *item);
int I_GetCurrentItem (struct MinArticle *item);
int I_GetCurrentItemNumber (void);
int I_GetInvoiceItemCount (void);
void I_GetInvoiceSum (double *netto1, double *netto2, double *summwst1,
		      double *summwst2, double *brutto);
void I_GetMinInvoice (struct MinInvoice *mininvoice);
STRPTR I_GetErrorMsg (void);


/* Fehlercodes der Funktionen */

enum
  {
    ERR_INV_OK,			/* kein Fehler */
    ERR_INV_NOPOOL,		/* kein Memory-Pool vorhanden */
    ERR_INV_NOMEM,		/* nicht genügend Speicher vorhanden */
    ERR_INV_LISTEMPTY,		/* Liste ist leer */
    ERR_INV_NOITEM,		/* Eintrag ist nicht in der Liste vorhanden */
    ERR_INV_FILENOTFOUND,	/* File nicht gefunden */
    ERR_INV_CANTCREATEFILE,	/* File konnte nicht erzeugt werden */
    ERR_INV_LOAD,		/* Fehler beim laden */
    ERR_INV_SAVE,		/* Fehler beim speichern */
  };

/*
   ** mögliche Modi für eine 'Rechnung'
 */

enum
  {
    MODE_INVOICE,		/* eine echte Rechnung */
    MODE_DELIVERY,		/* Lieferschein */
    MODE_ORDER,			/* Bestellung */
    MODE_CONFIRMATION,		/* Auftragsbestätigung */
    MODE_OFFER,			/* Angebot */
    MODE_MAX
  };

/*
   ** mögliche Modi für die Bezahlung
 */

enum
  {
    PAY_BAR,			/* Barzahlung */
    PAY_BANK,			/* per Bank */
    PAY_NACHNAHME,		/* per Nachnahme */
    PAY_LIEFERSCHEIN,		/* per Lieferschein */
    PAY_MAX
  };

#endif /* RECHNUNGEN_H */
