1 /***************************************************************************
2                  docposition.h  - a position in a document
3                              -------------------
4     begin                : Fri Jan 20 2006
5     copyright            : (C) 2006 by Klaas Freitag
6     email                : freitag@kde.org
7  ***************************************************************************/
8 
9 /***************************************************************************
10  *                                                                         *
11  *   This program is free software; you can redistribute it and/or modify  *
12  *   it under the terms of the GNU General Public License as published by  *
13  *   the Free Software Foundation; either version 2 of the License, or     *
14  *   (at your option) any later version.                                   *
15  *                                                                         *
16  ***************************************************************************/
17 #ifndef DOCPOSITION_H
18 #define DOCPOSITION_H
19 
20 // include files for Qt
21 #include <QPointer>
22 #include <QObject>
23 
24 #include <QList>
25 
26 // application specific includes
27 #include "dbids.h"
28 #include "calcpart.h"
29 #include "attribute.h"
30 #include "einheit.h"
31 
32 /**
33 @author Klaas Freitag
34 */
35 class QString;
36 class QDomElement;
37 class QDomDocument;
38 class Geld;
39 class dbID;
40 class QLocale;
41 class PositionViewWidget;
42 
43 class DocPositionBase : public QObject
44 {
45   public:
46   enum PositionType { Position, ExtraDiscount };
47   enum TaxType { TaxInvalid = 0, TaxNone = 1, TaxReduced = 2, TaxFull = 3, TaxIndividual = 4 };
48 
49     DocPositionBase();
50     DocPositionBase( const PositionType& );
~DocPositionBase()51     ~DocPositionBase() {}
52 
53     DocPositionBase(const DocPositionBase&);
54 
setDbId(int id)55     void setDbId( int id ) { m_dbId = id; }
dbId()56     dbID dbId() { return dbID( m_dbId ); }
57 
58     void setAttribute( const Attribute& );
59     void removeAttribute( const QString& );
60     void loadAttributes();
61     QString attribute(const QString& ) const;
62 
63     AttributeMap attributes();
64     void setAttributeMap( AttributeMap );
65 
setText(const QString & string)66     void setText( const QString& string ) { m_text = string; }
text()67     QString text() const { return m_text; }
68 
69     void setTag( const QString& );
70     void removeTag( const QString& );
71     bool hasTag( const QString& );
72     QStringList tags();
73 
74     int taxTypeNumeric();
75     TaxType taxType();
76     void setTaxType( DocPositionBase::TaxType );
77     void setTaxType( int );
78 
79   /**
80    * Position means the number in the document
81    */
positionNumber()82     virtual int positionNumber() { return m_position; }
setPositionNumber(const int & pos)83     virtual void setPositionNumber( const int& pos ) { m_position = pos; }
setToDelete(bool doit)84     virtual void setToDelete( bool doit ) { mToDelete = doit; }
toDelete()85     virtual bool toDelete() { return mToDelete; }
type()86     PositionType type() { return mType; }
87 
88     DocPositionBase& operator=( const DocPositionBase& );
89 
90   protected:
91     int     m_dbId;
92     int     m_position;
93     QString m_text;
94     bool    mToDelete;
95     TaxType mTaxType;
96     PositionType mType;
97     AttributeMap mAttribs;
98 };
99 
100 
101 class DocPosition : public DocPositionBase
102 {
103   public:
104     DocPosition();
105     DocPosition( const PositionType& );
~DocPosition()106     ~DocPosition(){};
107 
108 
setUnit(const Einheit & unit)109     void setUnit( const Einheit& unit ) { m_unit = unit; }
unit()110     Einheit unit() const { return m_unit; }
111 
setUnitPrice(const Geld & g)112     void setUnitPrice( const Geld& g ) { m_unitPrice = g; }
unitPrice()113     Geld unitPrice() const { return m_unitPrice; }
114     Geld overallPrice();
115 
setAmount(double amount)116     void setAmount( double amount ) { m_amount = amount; }
amount()117     double amount() { return m_amount; }
118 
associatedWidget()119     PositionViewWidget* associatedWidget() { return mWidget; }
setAssociatedWidget(PositionViewWidget * w)120     void setAssociatedWidget( PositionViewWidget *w ) { mWidget = w; }
121 
122     static const QString Kind;
123     static const QString Discount;
124     static const QString Tags;
125     static const QString ExtraDiscountTagRequired;
126 
127   private:
128     Einheit m_unit;
129     Geld    m_unitPrice;
130     double  m_amount;
131     PositionViewWidget *mWidget;
132 
133     // No calculation yet
134 
135 };
136 
137 class DocPositionList : public QList<DocPositionBase*>
138 {
139   public:
140     DocPositionList();
141 
142     QDomElement domElement( QDomDocument& );
143     DocPositionBase *positionFromId( int id );
144     QString posNumber( DocPositionBase* );
145 
146     Geld nettoPrice();
147     Geld bruttoPrice( double fullTax, double reducedTax );
148     Geld taxSum(double fullTax, double redTax );
149     Geld fullTaxSum( double fullTax );
150     Geld reducedTaxSum( double reducedTax );
151 
152   protected:
153     int compareItems ( DocPosition *dp1, DocPosition *dp2 );
154 
155   private:
156     QDomElement xmlTextElement( QDomDocument&, const QString& , const QString& );
157 };
158 
159 typedef QListIterator<DocPositionBase*> DocPositionListIterator;
160 
161 typedef QPointer<DocPositionBase> DocPositionGuardedPtr;
162 #endif
163