###############################################################################
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.
###############################################################################

# NOTE: This property file is now deprecated, you should instead configure your email template
# using the EmailTemplateSetting entity with the emailTemplateSettingId of "WEFF_EVENT_REMINDER".
# An example can be found in applications/workeffort/data/WorkEffortTypeData.xml

# The "from" address for emailed calendar event reminders
eventReminders.emailFromAddress=ofbiz-test@example.com
# The screen widget used for emailed calendar event reminders. The parameters Map
# passed to the screen widget will contain the workEffortId, the event date/time,
# the locale, and the time zone specified in the reminder.
eventReminders.emailScreenWidgetLocation=component://workeffort/widget/WorkEffortScreens.xml#WorkEffortEventReminderEmail
