feat(MemberOrders): implement member orders feature

- Added new models and routes for managing member orders and order history.
- Updated server.js to include member order routes and sync functionality.
- Enhanced frontend with new components and dialogs for viewing and managing orders.
- Integrated internationalization support for order-related texts across multiple languages.
- Updated navigation and views to include access to the new orders feature, improving user experience.
This commit is contained in:
Torsten Schulz (local)
2026-03-24 17:01:57 +01:00
parent e55ee0f88a
commit 02f1bed452
32 changed files with 1743 additions and 0 deletions

View File

@@ -0,0 +1,64 @@
import { DataTypes } from 'sequelize';
import sequelize from '../database.js';
const MemberOrder = sequelize.define('MemberOrder', {
id: {
type: DataTypes.INTEGER,
primaryKey: true,
autoIncrement: true,
allowNull: false
},
memberId: {
type: DataTypes.INTEGER,
allowNull: false,
field: 'member_id'
},
clubId: {
type: DataTypes.INTEGER,
allowNull: false,
field: 'club_id'
},
item: {
type: DataTypes.STRING,
allowNull: false
},
status: {
type: DataTypes.ENUM('requested', 'ordered', 'arrived', 'handed_over'),
allowNull: false,
defaultValue: 'requested'
},
orderDate: {
type: DataTypes.DATE,
allowNull: false,
defaultValue: DataTypes.NOW,
field: 'order_date'
},
statusDate: {
type: DataTypes.DATE,
allowNull: false,
defaultValue: DataTypes.NOW,
field: 'status_date'
},
cost: {
type: DataTypes.DECIMAL(10, 2),
allowNull: false,
defaultValue: 0
},
paidAmount: {
type: DataTypes.DECIMAL(10, 2),
allowNull: false,
defaultValue: 0,
field: 'paid_amount'
}
}, {
underscored: true,
tableName: 'member_orders',
timestamps: true,
indexes: [
{ fields: ['member_id'] },
{ fields: ['club_id'] },
{ fields: ['status'] }
]
});
export default MemberOrder;

View File

@@ -0,0 +1,63 @@
import { DataTypes } from 'sequelize';
import sequelize from '../database.js';
const MemberOrderHistory = sequelize.define('MemberOrderHistory', {
id: {
type: DataTypes.INTEGER,
primaryKey: true,
autoIncrement: true,
allowNull: false
},
memberOrderId: {
type: DataTypes.INTEGER,
allowNull: false,
field: 'member_order_id'
},
memberId: {
type: DataTypes.INTEGER,
allowNull: false,
field: 'member_id'
},
clubId: {
type: DataTypes.INTEGER,
allowNull: false,
field: 'club_id'
},
item: {
type: DataTypes.STRING,
allowNull: false
},
status: {
type: DataTypes.ENUM('requested', 'ordered', 'arrived', 'handed_over'),
allowNull: false
},
changedAt: {
type: DataTypes.DATE,
allowNull: false,
defaultValue: DataTypes.NOW,
field: 'changed_at'
},
cost: {
type: DataTypes.DECIMAL(10, 2),
allowNull: false,
defaultValue: 0
},
paidAmount: {
type: DataTypes.DECIMAL(10, 2),
allowNull: false,
defaultValue: 0,
field: 'paid_amount'
}
}, {
underscored: true,
tableName: 'member_order_history',
timestamps: true,
indexes: [
{ fields: ['member_order_id'] },
{ fields: ['member_id'] },
{ fields: ['club_id'] },
{ fields: ['changed_at'] }
]
});
export default MemberOrderHistory;

View File

@@ -49,6 +49,8 @@ import MemberTransferConfig from './MemberTransferConfig.js';
import MemberContact from './MemberContact.js';
import MemberImage from './MemberImage.js';
import MemberTtrHistory from './MemberTtrHistory.js';
import MemberOrder from './MemberOrder.js';
import MemberOrderHistory from './MemberOrderHistory.js';
import TrainingGroup from './TrainingGroup.js';
import MemberTrainingGroup from './MemberTrainingGroup.js';
import ClubDisabledPresetGroup from './ClubDisabledPresetGroup.js';
@@ -94,6 +96,13 @@ MemberNote.belongsTo(Member, { foreignKey: 'memberId' });
Member.hasMany(MemberTtrHistory, { as: 'ttrHistoryEntries', foreignKey: 'memberId' });
MemberTtrHistory.belongsTo(Member, { as: 'member', foreignKey: 'memberId' });
Member.hasMany(MemberOrder, { as: 'orders', foreignKey: 'memberId' });
MemberOrder.belongsTo(Member, { as: 'member', foreignKey: 'memberId' });
Club.hasMany(MemberOrder, { as: 'memberOrders', foreignKey: 'clubId' });
MemberOrder.belongsTo(Club, { as: 'club', foreignKey: 'clubId' });
MemberOrder.hasMany(MemberOrderHistory, { as: 'historyEntries', foreignKey: 'memberOrderId' });
MemberOrderHistory.belongsTo(MemberOrder, { as: 'order', foreignKey: 'memberOrderId' });
DiaryDate.hasMany(DiaryNote, { as: 'diaryNotes', foreignKey: 'diaryDateId' });
DiaryNote.belongsTo(DiaryDate, { foreignKey: 'diaryDateId' });
@@ -422,6 +431,8 @@ export {
MemberContact,
MemberImage,
MemberTtrHistory,
MemberOrder,
MemberOrderHistory,
TrainingGroup,
MemberTrainingGroup,
ClubDisabledPresetGroup,