List of all members | Public Types | Properties | Public Slots | Public Member Functions | Static Public Member Functions | Public Attributes | Protected Slots | Protected Member Functions | Protected Attributes
RecurrenceWidget Class Reference

The RecurrenceWidget gives the user a unified interface for telling the system how often certain events occur. More...

#include <recurrencewidget.h>

Inheritance diagram for RecurrenceWidget:
QWidget Ui::RecurrenceWidget QObject QPaintDevice Ui_RecurrenceWidget Ui_RecurrenceWidget

Public Types

enum  RecurrenceChangePolicy { NoPolicy, IgnoreFuture, ChangeFuture }
 
enum  RecurrencePeriod {
  Never, Minutely, Hourly, Daily,
  Weekly, Monthly, Yearly, Custom
}
 

Properties

 acceptDrops
 
 accessibleDescription
 
 accessibleName
 
 autoFillBackground
 
 baseSize
 
 childrenRect
 
 childrenRegion
 
 contextMenuPolicy
 
 cursor
 
 enabled
 
bool endDateVisible
 Return whether the end date field is visible. More...
 
bool endTimeVisible
 Return whether the end time field is visible. More...
 
 focus
 
 focusPolicy
 
 font
 
 frameGeometry
 
 frameSize
 
 fullScreen
 
 geometry
 
 height
 
 inputMethodHints
 
 isActiveWindow
 
 layoutDirection
 
 locale
 
 maximized
 
 maximumHeight
 
 maximumSize
 
 maximumWidth
 
bool maxVisible
 
 minimized
 
 minimumHeight
 
 minimumSize
 
 minimumSizeHint
 
 minimumWidth
 
RecurrencePeriod minPeriod
 
 modal
 
 mouseTracking
 
 normalGeometry
 
 objectName
 
 palette
 
 pos
 
 rect
 
 size
 
 sizeHint
 
 sizeIncrement
 
 sizePolicy
 
bool startDateVisible
 
bool startTimeVisible
 
 statusTip
 
 styleSheet
 
 toolTip
 
 toolTipDuration
 
 updatesEnabled
 
 visible
 
 whatsThis
 
 width
 
 windowFilePath
 
 windowFlags
 
 windowIcon
 
 windowIconText
 
 windowModality
 
 windowModified
 
 windowOpacity
 
 windowTitle
 
 x
 
 y
 

Public Slots

virtual void clear ()
 Set the RecurrenceWidget to its default state. More...
 
virtual bool save (bool intxn, RecurrenceChangePolicy cp, QString *msg=0)
 
virtual void set (bool recurring=false, int frequency=1, QString period=QString("W"), QDate startDate=QDate::currentDate(), QDate endDate=QDate(), int max=1, QString style="KeepNone")
 
virtual void set (bool recurring, int frequency, QString period, QDateTime startDateTime, QDateTime endDateTime, int max, QString style="KeepNone")
 
virtual void setEndDate (QDate p)
 
virtual void setEndDateTime (QDateTime p)
 
virtual void setEndDateVisible (bool p)
 
virtual void setEndTime (QTime p)
 
virtual void setEndTimeVisible (bool p)
 
virtual void setFrequency (int p)
 
virtual void setMax (int p)
 
virtual void setMaxVisible (bool p)
 
virtual void setMinPeriod (RecurrencePeriod minPeriod)
 
virtual bool setParent (int pid, QString ptype)
 
virtual void setPeriod (RecurrencePeriod p)
 
virtual void setPeriod (QString p)
 
virtual void setRecurring (bool p)
 
virtual void setStartDate (QDate p)
 
virtual void setStartDateTime (QDateTime p)
 
virtual void setStartDateVisible (bool p)
 
virtual void setStartTime (QTime p)
 
virtual void setStartTimeVisible (bool p)
 
virtual void setStyle (QString p)
 

Public Member Functions

 RecurrenceWidget (QWidget *parent=0, const char *name=0)
 
 ~RecurrenceWidget ()
 
bool acceptDrops () const
 
QString accessibleDescription () const
 
QString accessibleName () const
 
QList< QAction * > actions () const
 
void activateWindow ()
 
void addAction (QAction *action)
 
void addActions (const QList< QAction * > &actions)
 
void adjustSize ()
 
bool autoFillBackground () const
 
QPalette::ColorRole backgroundRole () const
 
QBackingStorebackingStore () const
 
QSize baseSize () const
 
bool blockSignals (bool block)
 
QWidgetchildAt (int x, int y) const
 
QWidgetchildAt (const QPoint &p) const
 
const QObjectList & children () const
 
QRect childrenRect () const
 
QRegion childrenRegion () const
 
void clearFocus ()
 
void clearMask ()
 
bool close ()
 
int colorCount () const
 
QMetaObject::Connection connect (const QObject *sender, const char *signal, const char *method, Qt::ConnectionType type) const
 
QMargins contentsMargins () const
 
QRect contentsRect () const
 
Qt::ContextMenuPolicy contextMenuPolicy () const
 
QCursor cursor () const
 
void customContextMenuRequested (const QPoint &pos)
 
void deleteLater ()
 
int depth () const
 
void destroyed (QObject *obj)
 
int devicePixelRatio () const
 
bool disconnect (const char *signal, const QObject *receiver, const char *method) const
 
bool disconnect (const QObject *receiver, const char *method) const
 
void dumpObjectInfo ()
 
void dumpObjectTree ()
 
QList< QByteArraydynamicPropertyNames () const
 
WId effectiveWinId () const
 
virtual Q_INVOKABLE QDate endDate () const
 Return the date the recurrence is set to end. More...
 
virtual Q_INVOKABLE QDateTime endDateTime () const
 Return the date and time the recurrence is set to end. More...
 
virtual Q_INVOKABLE bool endDateVisible () const
 
virtual Q_INVOKABLE QTime endTime () const
 Return the time of day the recurrence is set to end. More...
 
virtual Q_INVOKABLE bool endTimeVisible () const
 
void ensurePolished () const
 
virtual bool eventFilter (QObject *watched, QEvent *event)
 
findChild (const QString &name, Qt::FindChildOptions options) const
 
QList< T > findChildren (const QString &name, Qt::FindChildOptions options) const
 
QList< T > findChildren (const QRegExp &regExp, Qt::FindChildOptions options) const
 
QList< T > findChildren (const QRegularExpression &re, Qt::FindChildOptions options) const
 
Qt::FocusPolicy focusPolicy () const
 
QWidgetfocusProxy () const
 
QWidgetfocusWidget () const
 
const QFontfont () const
 
QFontInfo fontInfo () const
 
QFontMetrics fontMetrics () const
 
QPalette::ColorRole foregroundRole () const
 
QRect frameGeometry () const
 
QSize frameSize () const
 
virtual Q_INVOKABLE int frequency () const
 Return the frequency (number of periods) the recurrence is set to run. More...
 
const QRectgeometry () const
 
virtual Q_INVOKABLE RecurrenceChangePolicy getChangePolicy ()
 
void getContentsMargins (int *left, int *top, int *right, int *bottom) const
 
QPixmap grab (const QRect &rectangle)
 
void grabGesture (Qt::GestureType gesture, Qt::GestureFlags flags)
 
void grabKeyboard ()
 
void grabMouse ()
 
void grabMouse (const QCursor &cursor)
 
int grabShortcut (const QKeySequence &key, Qt::ShortcutContext context)
 
QGraphicsEffectgraphicsEffect () const
 
QGraphicsProxyWidgetgraphicsProxyWidget () const
 
bool hasEditFocus () const
 
bool hasFocus () const
 
virtual bool hasHeightForWidth () const
 
bool hasMouseTracking () const
 
int height () const
 
virtual int heightForWidth (int w) const
 
int heightMM () const
 
void hide ()
 
bool inherits (const char *className) const
 
Qt::InputMethodHints inputMethodHints () const
 
virtual QVariant inputMethodQuery (Qt::InputMethodQuery query) const
 
void insertAction (QAction *before, QAction *action)
 
void insertActions (QAction *before, QList< QAction * > actions)
 
void installEventFilter (QObject *filterObj)
 
bool isActiveWindow () const
 
bool isAncestorOf (const QWidget *child) const
 
bool isEnabled () const
 
bool isEnabledTo (const QWidget *ancestor) const
 
bool isEnabledToTLW () const
 
bool isFullScreen () const
 
bool isHidden () const
 
bool isMaximized () const
 
bool isMinimized () const
 
bool isModal () const
 
virtual Q_INVOKABLE bool isRecurring () const
 
bool isTopLevel () const
 
bool isVisible () const
 
bool isVisibleTo (const QWidget *ancestor) const
 
bool isWidgetType () const
 
bool isWindow () const
 
bool isWindowModified () const
 
bool isWindowType () const
 
void killTimer (int id)
 
QLayoutlayout () const
 
Qt::LayoutDirection layoutDirection () const
 
QLocale locale () const
 
int logicalDpiX () const
 
int logicalDpiY () const
 
void lower ()
 
QPoint mapFrom (const QWidget *parent, const QPoint &pos) const
 
QPoint mapFromGlobal (const QPoint &pos) const
 
QPoint mapFromParent (const QPoint &pos) const
 
QPoint mapTo (const QWidget *parent, const QPoint &pos) const
 
QPoint mapToGlobal (const QPoint &pos) const
 
QPoint mapToParent (const QPoint &pos) const
 
QRegion mask () const
 
virtual Q_INVOKABLE int max () const
 
int maximumHeight () const
 
QSize maximumSize () const
 
int maximumWidth () const
 
virtual bool maxVisible () const
 
virtual const QMetaObjectmetaObject () const
 
int minimumHeight () const
 
QSize minimumSize () const
 
virtual QSize minimumSizeHint () const
 
int minimumWidth () const
 
virtual Q_INVOKABLE RecurrencePeriod minPeriod () const
 
virtual Q_INVOKABLE bool modified () const
 
void move (int x, int y)
 
void move (const QPoint &)
 
void moveToThread (QThread *targetThread)
 
QWidgetnativeParentWidget () const
 
QWidgetnextInFocusChain () const
 
QRect normalGeometry () const
 
QString objectName () const
 
void objectNameChanged (const QString &objectName)
 
void overrideWindowFlags (Qt::WindowFlags flags)
 
virtual QPaintEnginepaintEngine () const
 
bool paintingActive () const
 
const QPalettepalette () const
 
QObjectparent () const
 
virtual Q_INVOKABLE int parentId () const
 
virtual Q_INVOKABLE QString parentType () const
 
QWidgetparentWidget () const
 
virtual Q_INVOKABLE RecurrencePeriod period () const
 
virtual Q_INVOKABLE QString periodCode () const
 
int physicalDpiX () const
 
int physicalDpiY () const
 
QPoint pos () const
 
QWidgetpreviousInFocusChain () const
 
QVariant property (const char *name) const
 
void raise ()
 
QRect rect () const
 
void releaseKeyboard ()
 
void releaseMouse ()
 
void releaseShortcut (int id)
 
void removeAction (QAction *action)
 
void removeEventFilter (QObject *obj)
 
void render (QPaintDevice *target, const QPoint &targetOffset, const QRegion &sourceRegion, RenderFlags renderFlags)
 
void render (QPainter *painter, const QPoint &targetOffset, const QRegion &sourceRegion, RenderFlags renderFlags)
 
void repaint ()
 
void repaint (int x, int y, int w, int h)
 
void repaint (const QRect &rect)
 
void repaint (const QRegion &rgn)
 
void resize (int w, int h)
 
void resize (const QSize &)
 
bool restoreGeometry (const QByteArray &geometry)
 
void retranslateUi (QWidget *RecurrenceWidget)
 
void retranslateUi (QWidget *RecurrenceWidget)
 
QByteArray saveGeometry () const
 
void scroll (int dx, int dy)
 
void scroll (int dx, int dy, const QRect &r)
 
void setAcceptDrops (bool on)
 
void setAccessibleDescription (const QString &description)
 
void setAccessibleName (const QString &name)
 
void setAttribute (Qt::WidgetAttribute attribute, bool on)
 
void setAutoFillBackground (bool enabled)
 
void setBackgroundRole (QPalette::ColorRole role)
 
void setBaseSize (const QSize &)
 
void setBaseSize (int basew, int baseh)
 
void setContentsMargins (const QMargins &margins)
 
void setContentsMargins (int left, int top, int right, int bottom)
 
void setContextMenuPolicy (Qt::ContextMenuPolicy policy)
 
void setCursor (const QCursor &)
 
void setDisabled (bool disable)
 
void setEditFocus (bool enable)
 
void setEnabled (bool)
 
void setFixedHeight (int h)
 
void setFixedSize (const QSize &s)
 
void setFixedSize (int w, int h)
 
void setFixedWidth (int w)
 
void setFocus ()
 
void setFocus (Qt::FocusReason reason)
 
void setFocusPolicy (Qt::FocusPolicy policy)
 
void setFocusProxy (QWidget *w)
 
void setFont (const QFont &)
 
void setForegroundRole (QPalette::ColorRole role)
 
void setGeometry (int x, int y, int w, int h)
 
void setGeometry (const QRect &)
 
void setGraphicsEffect (QGraphicsEffect *effect)
 
void setHidden (bool hidden)
 
void setInputMethodHints (Qt::InputMethodHints hints)
 
void setLayout (QLayout *layout)
 
void setLayoutDirection (Qt::LayoutDirection direction)
 
void setLocale (const QLocale &locale)
 
void setMask (const QBitmap &bitmap)
 
void setMask (const QRegion &region)
 
void setMaximumHeight (int maxh)
 
void setMaximumSize (const QSize &)
 
void setMaximumSize (int maxw, int maxh)
 
void setMaximumWidth (int maxw)
 
void setMinimumHeight (int minh)
 
void setMinimumSize (const QSize &)
 
void setMinimumSize (int minw, int minh)
 
void setMinimumWidth (int minw)
 
void setMouseTracking (bool enable)
 
void setObjectName (const QString &name)
 
void setPalette (const QPalette &)
 
void setParent (QWidget *parent, Qt::WindowFlags f)
 
void setParent (QObject *parent)
 
void setParent (QWidget *parent)
 
bool setProperty (const char *name, const QVariant &value)
 
void setShortcutAutoRepeat (int id, bool enable)
 
void setShortcutEnabled (int id, bool enable)
 
void setSizeIncrement (int w, int h)
 
void setSizeIncrement (const QSize &)
 
void setSizePolicy (QSizePolicy)
 
void setSizePolicy (QSizePolicy::Policy horizontal, QSizePolicy::Policy vertical)
 
void setStatusTip (const QString &)
 
void setStyle (QStyle *style)
 
void setStyleSheet (const QString &styleSheet)
 
void setToolTip (const QString &)
 
void setToolTipDuration (int msec)
 
void setUpdatesEnabled (bool enable)
 
void setupUi (QWidget *widget)
 
void setupUi (QWidget *RecurrenceWidget)
 
virtual void setVisible (bool visible)
 
void setWhatsThis (const QString &)
 
void setWindowFilePath (const QString &filePath)
 
void setWindowFlags (Qt::WindowFlags type)
 
void setWindowIcon (const QIcon &icon)
 
void setWindowIconText (const QString &)
 
void setWindowModality (Qt::WindowModality windowModality)
 
void setWindowModified (bool)
 
void setWindowOpacity (qreal level)
 
void setWindowRole (const QString &role)
 
void setWindowState (Qt::WindowStates windowState)
 
void setWindowTitle (const QString &)
 
void show ()
 
void showFullScreen ()
 
void showMaximized ()
 
void showMinimized ()
 
void showNormal ()
 
bool signalsBlocked () const
 
QSize size () const
 
virtual QSize sizeHint () const
 
QSize sizeIncrement () const
 
QSizePolicy sizePolicy () const
 
void stackUnder (QWidget *w)
 
virtual Q_INVOKABLE QDate startDate () const
 
virtual Q_INVOKABLE QDateTime startDateTime () const
 
virtual bool startDateVisible () const
 
virtual Q_INVOKABLE QTime startTime () const
 
int startTimer (int interval, Qt::TimerType timerType)
 
virtual Q_INVOKABLE bool startTimeVisible () const
 
QString statusTip () const
 
virtual Q_INVOKABLE RecurrencePeriod stringToPeriod (QString p) const
 Convert a string representation of the period to a RecurrencePeriod. More...
 
virtual Q_INVOKABLE QString style () const
 
QString styleSheet () const
 
bool testAttribute (Qt::WidgetAttribute attribute) const
 
QThreadthread () const
 
QString toolTip () const
 
int toolTipDuration () const
 
QWidgettopLevelWidget () const
 
bool underMouse () const
 
void ungrabGesture (Qt::GestureType gesture)
 
void unsetCursor ()
 
void unsetLayoutDirection ()
 
void unsetLocale ()
 
void update ()
 
void update (int x, int y, int w, int h)
 
void update (const QRect &rect)
 
void update (const QRegion &rgn)
 
void updateGeometry ()
 
bool updatesEnabled () const
 
QRegion visibleRegion () const
 
QString whatsThis () const
 
int width () const
 
int widthMM () const
 
QWidgetwindow () const
 
QString windowFilePath () const
 
Qt::WindowFlags windowFlags () const
 
QWindowwindowHandle () const
 
QIcon windowIcon () const
 
void windowIconChanged (const QIcon &icon)
 
QString windowIconText () const
 
void windowIconTextChanged (const QString &iconText)
 
Qt::WindowModality windowModality () const
 
qreal windowOpacity () const
 
QString windowRole () const
 
Qt::WindowStates windowState () const
 
QString windowTitle () const
 
void windowTitleChanged (const QString &title)
 
Qt::WindowType windowType () const
 
WId winId () const
 
int x () const
 
int y () const
 

Static Public Member Functions

QMetaObject::Connection connect (const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
 
QMetaObject::Connection connect (const QObject *sender, const QMetaMethod &signal, const QObject *receiver, const QMetaMethod &method, Qt::ConnectionType type)
 
QMetaObject::Connection connect (const QObject *sender, PointerToMemberFunction signal, const QObject *receiver, PointerToMemberFunction method, Qt::ConnectionType type)
 
QMetaObject::Connection connect (const QObject *sender, PointerToMemberFunction signal, Functor functor)
 
QMetaObject::Connection connect (const QObject *sender, PointerToMemberFunction signal, const QObject *context, Functor functor, Qt::ConnectionType type)
 
QWidgetcreateWindowContainer (QWindow *window, QWidget *parent, Qt::WindowFlags flags)
 
bool disconnect (const QObject *sender, PointerToMemberFunction signal, const QObject *receiver, PointerToMemberFunction method)
 
bool disconnect (const QMetaObject::Connection &connection)
 
bool disconnect (const QObject *sender, const char *signal, const QObject *receiver, const char *method)
 
bool disconnect (const QObject *sender, const QMetaMethod &signal, const QObject *receiver, const QMetaMethod &method)
 
QWidgetfind (WId id)
 
QWidgetkeyboardGrabber ()
 
QWidgetmouseGrabber ()
 
void setTabOrder (QWidget *first, QWidget *second)
 
QString tr (const char *sourceText, const char *disambiguation, int n)
 
QString trUtf8 (const char *sourceText, const char *disambiguation, int n)
 

Public Attributes

QRadioButton_all
 
DateCluster_dates
 
QTimeEdit_endTime
 
XSpinBox_frequency
 
QLabel_frequencyLit
 
QSpacerItem_hspacer
 
XSpinBox_max
 
XLabel_maxLit
 
QRadioButton_none
 
QRadioButton_one
 
XComboBox_period
 
QGroupBox_recurring
 
QTimeEdit_startTime
 
QGridLayoutgridLayout
 
QGridLayoutgridLayout_2
 
typedef RenderFlags
 
QSpacerItemverticalSpacer
 

Protected Slots

virtual void languageChange ()
 

Protected Member Functions

virtual void actionEvent (QActionEvent *event)
 
virtual void changeEvent (QEvent *event)
 
virtual void childEvent (QChildEvent *event)
 
virtual void closeEvent (QCloseEvent *event)
 
virtual void connectNotify (const QMetaMethod &signal)
 
virtual void contextMenuEvent (QContextMenuEvent *event)
 
void create (WId window, bool initializeWindow, bool destroyOldWindow)
 
virtual void customEvent (QEvent *event)
 
void destroy (bool destroyWindow, bool destroySubWindows)
 
virtual void disconnectNotify (const QMetaMethod &signal)
 
virtual void dragEnterEvent (QDragEnterEvent *event)
 
virtual void dragLeaveEvent (QDragLeaveEvent *event)
 
virtual void dragMoveEvent (QDragMoveEvent *event)
 
virtual void dropEvent (QDropEvent *event)
 
virtual void enterEvent (QEvent *event)
 
virtual bool event (QEvent *event)
 
virtual void focusInEvent (QFocusEvent *event)
 
bool focusNextChild ()
 
virtual bool focusNextPrevChild (bool next)
 
virtual void focusOutEvent (QFocusEvent *event)
 
bool focusPreviousChild ()
 
virtual void hideEvent (QHideEvent *event)
 
virtual void initPainter (QPainter *painter) const
 
virtual void inputMethodEvent (QInputMethodEvent *event)
 
bool isSignalConnected (const QMetaMethod &signal) const
 
virtual void keyPressEvent (QKeyEvent *event)
 
virtual void keyReleaseEvent (QKeyEvent *event)
 
virtual void leaveEvent (QEvent *event)
 
virtual int metric (PaintDeviceMetric m) const
 
virtual void mouseDoubleClickEvent (QMouseEvent *event)
 
virtual void mouseMoveEvent (QMouseEvent *event)
 
virtual void mousePressEvent (QMouseEvent *event)
 
virtual void mouseReleaseEvent (QMouseEvent *event)
 
virtual void moveEvent (QMoveEvent *event)
 
virtual bool nativeEvent (const QByteArray &eventType, void *message, long *result)
 
virtual void paintEvent (QPaintEvent *event)
 
int receivers (const char *signal) const
 
virtual void resizeEvent (QResizeEvent *event)
 
QObjectsender () const
 
int senderSignalIndex () const
 
virtual void showEvent (QShowEvent *event)
 
virtual void tabletEvent (QTabletEvent *event)
 
virtual void timerEvent (QTimerEvent *event)
 
void updateMicroFocus ()
 
virtual void wheelEvent (QWheelEvent *event)
 

Protected Attributes

QDateTime _eot
 
int _id
 
int _parentId
 
QString _parentType
 
QDateTime _prevEndDateTime
 
int _prevFrequency
 
int _prevMax
 
int _prevParentId
 
QString _prevParentType
 
RecurrencePeriod _prevPeriod
 
bool _prevRecurring
 
QDateTime _prevStartDateTime
 
QString _prevStyle
 

Detailed Description

The RecurrenceWidget gives the user a unified interface for telling the system how often certain events occur.

In general recurrences are stored in the recur table, but this is not required. Two basic values describe a recurrence:

A recurrence with the period set to W (= week) and frequency of 3 will repeat once every three weeks.

In addition, there are three options for how to handle recurrences if a recurrence is missed (this can happen by having the client closed when a scheduled action was supposed to occur, or by having a long-running action fail to finish before another scheduled action is supposed to occur). If a recurrence is missed, upon running the next one will be scheduled for the first time that it would have run that is after the current time (For example, if an event is scheduled to occur every 5 minutes and runs at 4:10 PM, but the application is closed at 4:11 PM and not reopened until 4:53 PM, the next one will be scheduled at 4:55 PM). If there are multiple recurrences scheduled in the series for times that have also past, the three ways to handle them are -Keep None: Delete all of them, and schedule events from using the given interval from the current time -Keep One: Delete all but the most recent, reschedule it for the current time, and schedule the rest from the current time -Keep All: Reschedule all passed events to the current time, and schedule the next one using the interval from the current time

To add a new kind of recurring event or item, you need to change data in the database, stored procedures, triggers, and application code. We'll use Invoice in the examples here, with 'I' as the internal code value, even though invoices already use this mechanism (xTuple ERP 3.5.1 and later).

Add a column to the parent table to track the recurrence parent/child relationship. The column name must follow this pattern: [tablename]_recurring_[tablename]_id , e.g. invchead_recurring_invchead_id :

ALTER TABLE invchead ADD COLUMN invchead_recurring_invchead_id INTEGER;
COMMENT ON COLUMN invchead.invchead_recurring_invchead_id IS 'The first invchead record in the series if this is a recurring Invoice. If the invchead_recurring_invchead_id is the same as the invchead_id, this record is the first in the series.';

Add a RecurrenceWidget to the .ui for the window that will maintain data of this type (e.g. invoice.ui).

Initialize the widget in the window's constructor:

_recur->setParent(-1, 'I');

Update the widget again when the window gets an id for the object. This usually happens in either the set(), save(), or sSave() method for new objects, depending on the class, and in populate() when editing existing objects:

// cNew case in invoice::set()
_recur->setParent(_invcheadid, 'I');
...
// invoice::populate()
_recur->setParent(q.value("invchead_recurring_invchead_id").toInt(), "I");

Ask the user how to handle existing recurrences before saving the data and before starting a transaction. getChangePolicy will return RecurrenceWidget::NoPolicy) if the user chooses to cancel. Then when preparing to insert or update the main record, make sure to set the recurrence parentage. Finally, after the insert/update, save the recurrence and check for errors:

bool %save()
{
// error checking
RecurrenceWidget::ChangePolicy cp = _recur->getChangePolicy();
return false;
XSqlQuery beginq("BEGIN;");
XSqlQuery qry;
...
// set up qry to insert or update
if (_recur->isRecurring())
qry.bindValue(":invchead_recurring_invchead_id", _recur->parentId());
...
// execute the insert/update
...
QString errmsg;
if (! _recur->save(true, cp, &errmsg))
{
rollbackq.exec();
systemError(this, errmsg, __FILE__, __LINE__);
return false;
}
...
// finish processing
XSqlQuery commitq("COMMIT;");
return true;
}

To maintain the recurrence relationships, there must be a function that copies an existing record based on its id and gives the copy a different timestamp or date. It must have a function signature like one of these:

  1. copy[tablename](INTEGER, TIMESTAMP WITH TIME ZONE)
  2. copy[tablename](INTEGER, TIMESTAMP WITHOUT TIME ZONE)
  3. copy[tablename](INTEGER, DATE)

The copy function can take additional arguments as well, but they will be ignored by the recurrence maintenance functions. The data type of each argument must be listed in the recurtype table's recurtype_copyargs column (see below) so the appropriate casting can be done for the date or timestamp and an appropriate number of NULL arguments can be passed. The copy function must copy the [tablename]_recurring_[tablename]_id column.

There can be a function to delete records of this type as well. If there is one, it must accept a single integer id of the record to delete.

Add a row to the recurtype table to describe how the recurrence stored procedures interact with the events/items of this type ('I' == Invoice).

INSERT INTO recurtype (recurtype_type, recurtype_table, recurtype_donecheck,
recurtype_schedcol, recurtype_limit,
recurtype_copyfunc, recurtype_copyargs, recurtype_delfunc
) VALUES ('I', 'invchead', 'invchead_posted',
'invchead_invcdate', NULL,
'copyinvoice', '{integer,date}', 'deleteinvoice');

If there isn't a delete function, set the recurtype_delfunc to NULL. Existing records will be deleted when necessary with an SQL DELETE statement.

The DELETE trigger on the table should clean up the recurrence information:

CREATE OR REPLACE FUNCTION _invcheadBeforeTrigger() RETURNS "trigger" AS $$
DECLARE
_recurid INTEGER;
_newparentid INTEGER;
BEGIN
IF (TG_OP = 'DELETE') THEN
-- after other stuff not having to do with recurrence
SELECT recur_id INTO _recurid
FROM recur
WHERE ((recur_parent_id=OLD.invchead_id)
AND (recur_parent_type='I'));
IF (_recurid IS NOT NULL) THEN
SELECT invchead_id INTO _newparentid
FROM invchead
WHERE ((invchead_recurring_invchead_id=OLD.invchead_id)
AND (invchead_id!=OLD.invchead_id))
ORDER BY invchead_invcdate
LIMIT 1;
IF (_newparentid IS NULL) THEN
DELETE FROM recur WHERE recur_id=_recurid;
ELSE
UPDATE recur SET recur_parent_id=_newparentid
WHERE recur_id=_recurid;
UPDATE invchead SET invchead_recurring_invchead_id=_newparentid
WHERE invchead_recurring_invchead_id=OLD.invchead_id
AND invchead_id!=OLD.invchead_id;
END IF;
END IF;
RETURN OLD;
END IF;
RETURN NEW;
END;
$$ LANGUAGE 'plpgsql';
Todo:
Simplify this so the developer of a new recurring item/event doesn't have to work so hard. There should be a way to (1) have the recurrence widget update the [tablename]_recurring_[tablename]_id column when saving the recurrence (this would save a couple of lines) and (2) there should be a way to simplify or eliminate the code in the DELETE triggers. Some of this stuff really belongs in an AFTER trigger instead of a before trigger.
See also
_invcheadBeforeTrigger
copyInvoice
createRecurringItems
deleteInvoice
deleteOpenRecurringItems
invoice
openRecurringItems
recur
recurtype
splitRecurrence

Member Enumeration Documentation

Enumerator
NoPolicy 
IgnoreFuture 
ChangeFuture 
Enumerator
Never 
Minutely 
Hourly 
Daily 
Weekly 
Monthly 
Yearly 
Custom 

Property Documentation

bool RecurrenceWidget::endDateVisible
readwrite

Return whether the end date field is visible.

bool RecurrenceWidget::endTimeVisible
readwrite

Return whether the end time field is visible.

bool RecurrenceWidget::maxVisible
readwrite
RecurrenceWidget::RecurrencePeriod RecurrenceWidget::minPeriod
readwrite
bool RecurrenceWidget::startDateVisible
readwrite
bool RecurrenceWidget::startTimeVisible
readwrite

Constructor & Destructor Documentation

RecurrenceWidget::RecurrenceWidget ( QWidget parent = 0,
const char *  name = 0 
)
RecurrenceWidget::~RecurrenceWidget ( )

Member Function Documentation

void RecurrenceWidget::clear ( )
virtualslot

Set the RecurrenceWidget to its default state.

QDate RecurrenceWidget::endDate ( ) const
virtual

Return the date the recurrence is set to end.

QDateTime RecurrenceWidget::endDateTime ( ) const
virtual

Return the date and time the recurrence is set to end.

virtual Q_INVOKABLE bool RecurrenceWidget::endDateVisible ( ) const
virtual
QTime RecurrenceWidget::endTime ( ) const
virtual

Return the time of day the recurrence is set to end.

virtual Q_INVOKABLE bool RecurrenceWidget::endTimeVisible ( ) const
virtual
int RecurrenceWidget::frequency ( ) const
virtual

Return the frequency (number of periods) the recurrence is set to run.

RecurrenceWidget::RecurrenceChangePolicy RecurrenceWidget::getChangePolicy ( )
virtual
bool RecurrenceWidget::isRecurring ( ) const
virtual
void RecurrenceWidget::languageChange ( )
protectedvirtualslot
int RecurrenceWidget::max ( ) const
virtual
virtual bool RecurrenceWidget::maxVisible ( ) const
virtual
virtual Q_INVOKABLE RecurrencePeriod RecurrenceWidget::minPeriod ( ) const
virtual
bool RecurrenceWidget::modified ( ) const
virtual
int RecurrenceWidget::parentId ( ) const
virtual
QString RecurrenceWidget::parentType ( ) const
virtual
RecurrenceWidget::RecurrencePeriod RecurrenceWidget::period ( ) const
virtual
QString RecurrenceWidget::periodCode ( ) const
virtual
void Ui_RecurrenceWidget::retranslateUi ( QWidget RecurrenceWidget)
inlineinherited
void Ui_RecurrenceWidget::retranslateUi ( QWidget RecurrenceWidget)
inlineinherited
bool RecurrenceWidget::save ( bool  intxn,
RecurrenceChangePolicy  cp,
QString msg = 0 
)
virtualslot
void RecurrenceWidget::set ( bool  recurring = false,
int  frequency = 1,
QString  period = QString("W"),
QDate  startDate = QDate::currentDate(),
QDate  endDate = QDate(),
int  max = 1,
QString  style = "KeepNone" 
)
virtualslot
void RecurrenceWidget::set ( bool  recurring,
int  frequency,
QString  period,
QDateTime  startDateTime,
QDateTime  endDateTime,
int  max,
QString  style = "KeepNone" 
)
virtualslot
void RecurrenceWidget::setEndDate ( QDate  p)
virtualslot
void RecurrenceWidget::setEndDateTime ( QDateTime  p)
virtualslot
void RecurrenceWidget::setEndDateVisible ( bool  p)
virtualslot
void RecurrenceWidget::setEndTime ( QTime  p)
virtualslot
void RecurrenceWidget::setEndTimeVisible ( bool  p)
virtualslot
void RecurrenceWidget::setFrequency ( int  p)
virtualslot
void RecurrenceWidget::setMax ( int  p)
virtualslot
void RecurrenceWidget::setMaxVisible ( bool  p)
virtualslot
void RecurrenceWidget::setMinPeriod ( RecurrencePeriod  minPeriod)
virtualslot
bool RecurrenceWidget::setParent ( int  pid,
QString  ptype 
)
virtualslot
void RecurrenceWidget::setPeriod ( RecurrencePeriod  p)
virtualslot
void RecurrenceWidget::setPeriod ( QString  p)
virtualslot
void RecurrenceWidget::setRecurring ( bool  p)
virtualslot
void RecurrenceWidget::setStartDate ( QDate  p)
virtualslot
void RecurrenceWidget::setStartDateTime ( QDateTime  p)
virtualslot
void RecurrenceWidget::setStartDateVisible ( bool  p)
virtualslot
void RecurrenceWidget::setStartTime ( QTime  p)
virtualslot
void RecurrenceWidget::setStartTimeVisible ( bool  p)
virtualslot
void RecurrenceWidget::setStyle ( QString  p)
virtualslot
void Ui_RecurrenceWidget::setupUi ( QWidget RecurrenceWidget)
inlineinherited
QDate RecurrenceWidget::startDate ( ) const
virtual
QDateTime RecurrenceWidget::startDateTime ( ) const
virtual
virtual bool RecurrenceWidget::startDateVisible ( ) const
virtual
QTime RecurrenceWidget::startTime ( ) const
virtual
virtual Q_INVOKABLE bool RecurrenceWidget::startTimeVisible ( ) const
virtual
RecurrenceWidget::RecurrencePeriod RecurrenceWidget::stringToPeriod ( QString  p) const
virtual

Convert a string representation of the period to a RecurrencePeriod.

This is used to convert between the values stored in the recur table and the enumerated values used internally by the RecurrenceWidget. It also accepts human-readable values, such as "Minutes" and "Hours".

Parameters
pThe recur_period or human-readable period name to convert. This is case-sensitive. Currently accepted values are m or Minutes, H or Hours, D or Days, W or Weeks, M or Months, Y or Years, C or Custom. If current translation includes the period names, the translations are also accepted.
Returns
The RecurrencePeriod that matches the input or Never if no match was found.
QString RecurrenceWidget::style ( ) const
virtual

Member Data Documentation

QRadioButton * Ui_RecurrenceWidget::_all
inherited
DateCluster * Ui_RecurrenceWidget::_dates
inherited
QTimeEdit * Ui_RecurrenceWidget::_endTime
inherited
QDateTime RecurrenceWidget::_eot
protected
XSpinBox * Ui_RecurrenceWidget::_frequency
inherited
QLabel * Ui_RecurrenceWidget::_frequencyLit
inherited
QSpacerItem * Ui_RecurrenceWidget::_hspacer
inherited
int RecurrenceWidget::_id
protected
XSpinBox * Ui_RecurrenceWidget::_max
inherited
XLabel * Ui_RecurrenceWidget::_maxLit
inherited
QRadioButton * Ui_RecurrenceWidget::_none
inherited
QRadioButton * Ui_RecurrenceWidget::_one
inherited
int RecurrenceWidget::_parentId
protected
QString RecurrenceWidget::_parentType
protected
XComboBox * Ui_RecurrenceWidget::_period
inherited
QDateTime RecurrenceWidget::_prevEndDateTime
protected
int RecurrenceWidget::_prevFrequency
protected
int RecurrenceWidget::_prevMax
protected
int RecurrenceWidget::_prevParentId
protected
QString RecurrenceWidget::_prevParentType
protected
RecurrencePeriod RecurrenceWidget::_prevPeriod
protected
bool RecurrenceWidget::_prevRecurring
protected
QDateTime RecurrenceWidget::_prevStartDateTime
protected
QString RecurrenceWidget::_prevStyle
protected
QGroupBox * Ui_RecurrenceWidget::_recurring
inherited
QTimeEdit * Ui_RecurrenceWidget::_startTime
inherited
QGridLayout * Ui_RecurrenceWidget::gridLayout
inherited
QGridLayout * Ui_RecurrenceWidget::gridLayout_2
inherited
QSpacerItem * Ui_RecurrenceWidget::verticalSpacer
inherited

The documentation for this class was generated from the following files:

Generated on Fri Aug 11 2017 xTuple ERP Programmer Reference, Version 4.11.0 doxygen 1.8.10