Commit 08ecfb7c by Mac Stephens

Add submitter confirmation emails; split contact vs demo logging into separate…

Add submitter confirmation emails; split contact vs demo logging into separate tagged log files; remove subject/submitted-on from confirmation; update text on forms
parent 0b809c28
...@@ -22,7 +22,6 @@ const ...@@ -22,7 +22,6 @@ const
' </a>' + ' </a>' +
' </div>' + ' </div>' +
' <div class="col-lg-4">' + ' <div class="col-lg-4">' +
' <div class="h6 mb-2">Explore</div>' +
' <ul class="list-unstyled mb-0 small">' + ' <ul class="list-unstyled mb-0 small">' +
' <li class="mb-1"><a href="#FHome" id="homefooter" class="link-light text-decoration-none">Home</a></li>' + ' <li class="mb-1"><a href="#FHome" id="homefooter" class="link-light text-decoration-none">Home</a></li>' +
' <li class="mb-1"><a href="#FAboutUs" id="aboutusfooter" class="link-light text-decoration-none">About Us</a></li>' + ' <li class="mb-1"><a href="#FAboutUs" id="aboutusfooter" class="link-light text-decoration-none">About Us</a></li>' +
......
...@@ -28,9 +28,9 @@ const ...@@ -28,9 +28,9 @@ const
' <li class="nav-item dropdown">' + ' <li class="nav-item dropdown">' +
' <a class="nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown" aria-expanded="false">What We Do</a>' + ' <a class="nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown" aria-expanded="false">What We Do</a>' +
' <ul class="dropdown-menu">' + ' <ul class="dropdown-menu">' +
' <li><a class="dropdown-item" href="#FPublicSafety">Public Safety Software</a></li>' +
' <li><a class="dropdown-item" href="#FRecordsManagement">Records Management Notification</a></li>' +
' <li><a class="dropdown-item" href="#FCustomSoftware">Custom Software</a></li>' + ' <li><a class="dropdown-item" href="#FCustomSoftware">Custom Software</a></li>' +
' <li><a class="dropdown-item" href="#FPublicSafety">Public Safety</a></li>' +
' <li><a class="dropdown-item" href="#FRecordsManagement">Records Management</a></li>' +
' </ul>' + ' </ul>' +
' </li>' + ' </li>' +
' <li class="nav-item"><a class="nav-link" href="#FContactUs">Contact Us</a></li>' + ' <li class="nav-item"><a class="nav-link" href="#FContactUs">Contact Us</a></li>' +
......
<div class="d-flex flex-column min-vh-100"> <div class="d-flex flex-column min-vh-100">
<div id="site_nav"></div> <div id="site_nav"></div>
<div class="container-fluid px-0"> <div class="container-fluid px-0">
<div class="hero-section-aboutus bg-dark text-white text-center"> <div class="hero-section-aboutus bg-dark text-white text-center">
<img src="images/niagara.jpg" alt="Our Story Image" class="img-fluid hero-image-aboutus"> <img src="images/niagara.jpg" alt="Our Story Image" class="img-fluid hero-image-aboutus">
<div class="hero-overlay-aboutus"> <div class="hero-overlay-aboutus">
<div class="row justify-content-center"> <div class="row justify-content-center">
<div class="col-md-8 col-lg-6"> <!-- Adjust the column sizes as needed --> <div class="col-md-8 col-lg-6"> <!-- Adjust the column sizes as needed -->
<div class="text-wrapper-aboutus mx-auto p-3 p-md-5 rounded shadow"> <div class="text-wrapper-aboutus mx-auto p-3 p-md-5 rounded shadow">
<h2>Our Story</h2> <h2>Our Story</h2>
<p class="fs-6"> <p class="fs-6">
EM Systems was established in the early 1990s as a software development group. Over the last Located in Buffalo, New York, EM Systems has designed and delivered a wide range of custom software
two decades, EM Systems have developed a vast array of custom software applications for a variety of solutions across multiple industries, with the strongest emphasis on Public Safety Systems. Today, more
industries with a primary focus on the Public Safety and Healthcare fields. Currently, over 75 than 75 organizations throughout New York State depend on EM Systems applications to support their
organizations across New York State rely on EM Systems applications to meet the needs of their communities and agencies.
communities and
customers. EM Systems prides itself in its ability to create custom software solutions to meet the EM Systems is distinguished by its ability to develop tailored software solutions that address the
specific needs of unique requirements of each client. Our mission is to deliver reliable, efficient software that enhances
our customers. Our goal is to create software which facilitates and enhances current business practices and streamlines existing business or agency operations. In addition to deep expertise in software
in a development, we bring extensive experience in analyzing, refining, and improving operational workflows
reliable and efficient manner. Not only do we offer expert software development knowledge and skills but to drive greater efficiency and effectiveness.
we are also experienced in understanding and improving efficiency in current business processes and </p>
practice.
</p>
</div>
</div>
</div> </div>
</div> </div>
</div> </div>
</div>
</div> </div>
</div>
<div id="site_footer"></div> <div id="site_footer"></div>
</div> </div>
<div class="d-flex flex-column min-vh-100"> <div class="d-flex flex-column min-vh-100">
<div id="site_nav"></div> <div id="site_nav"></div>
<!-- HERO SECTION --> <!-- HERO SECTION -->
<div class="container-fluid px-0"> <div class="container-fluid px-0">
<div class="page-hero-section bg-dark text-white text-center"> <div class="page-hero-section bg-dark text-white text-center">
<img src="images\computer_code.jpg" alt="Hero Image" class="img-fluid hero-image"> <img src="images\computer_code.jpg" alt="Hero Image" class="img-fluid hero-image">
<div class="hero-overlay d-flex justify-content-center align-items-center"> <div class="hero-overlay d-flex justify-content-center align-items-center">
<div class="text-wrapper"> <div class="text-wrapper">
<h1 class="display-4">Custom Software</h1> <h1 class="display-4">Custom Software</h1>
</div>
</div> </div>
</div> </div>
</div> </div>
</div>
<!--MAIN CONTAINER-->
<div class="container-main">
<div class="learn-boxes">
<!-- CUSTOM SOFTWARE BOX 1 -->
<div class="row mb-4 g-4 align-items-center bg-white shadow-sm rounded">
<div class="col-md-12">
<div class="p-3">
<div class="text-center">
<h2>CJIS Compliance Commitment</h2>
<p class="mx-auto" style="max-width: 850px;">EM Systems is fully committed to meeting and exceeding CJIS
requirements across every component of the Public Safety Software programs, providing agencies with
secure, compliant, and reliable solutions that can be trusted to support mission-critical operations.
</p>
</div>
<!--MAIN CONTAINER--> <div class="container">
<div class="container-main"> <h3 class="text-center">List of Programs</h3>
<div class="learn-boxes py-5"> <div class="row justify-content-center">
<!-- CUSTOM SOFTWARE BOX 1 --> <div class="col-sm-6 col-md-auto mb-2 border-top pt-3" style="max-width: 350px;">
<div class="row mb-4 g-4 align-items-center bg-white shadow-sm rounded"> <ul class="text-start">
<div class="col-md-12"> <li>Computer Aided Dispatch (CAD) - Police, Fire &amp; EMS</li>
<div class="p-3 text-center"> <li>Mapping w/GPS tracking &amp; AVL</li>
<h2>AutoPark</h2> <li>Records Management System (RMS)</li>
<p class="mx-auto" style="max-width: 850px;">AutoPark is our parking ticket management system. It streamlines and coordinates the process and procedures of managing a parking area. From parking tags, tickets and bills to payments and appeals, this solution has it all when it comes to parking management.</p> <li>Mobile Data System (MDS) w/Police Reports &amp; Arrest</li>
<li>Livescan Fingerprinting w/ Booking and Civil submissions</li>
</ul>
</div>
<div class="col-sm-6 col-md-auto text-md-start border-top pt-3" style="max-width: 350px;">
<ul>
<li>Jail Management System (JMS)</li>
<li>iPhone &amp; Android Apps - CAD Monitor &amp; Data Access</li>
<li>FireRMS w/NERIS reporting</li>
<li>Summons &amp; Accidents MDS modules (Tracs replacement)</li>
<li>Discovery module w/Interface to DEMS</li>
<li>Interfaces to State &amp; Federal Systems</li>
</ul>
</div>
</div>
</div> </div>
</div> </div>
</div> </div>
<!-- CUSTOM SOFTWARE BOX 2 --> </div>
<div class="row mb-4 g-4 align-items-center bg-gray shadow-sm rounded"> <!-- CUSTOM SOFTWARE BOX 2 -->
<div class="col-md-12"> <div class="row mb-4 g-4 align-items-center bg-grey shadow-sm rounded">
<div class="p-3 text-center"> <div class="col-md-12">
<h2>Document Scanning Tools</h2> <div class="p-3 text-center">
<p class="mx-auto" style="max-width: 850px;">Scan and transmit paper documents with ease. This software provides an easy way to scan and organize paper documents and send them electronically to a variety of configurable destinations including HL7, FTPS, HTTPS, CIFS and more.</p> <h2>AutoPark</h2>
</div> <p class="mx-auto" style="max-width: 850px;">AutoPark is our parking ticket management system. It
streamlines and coordinates the process and procedures of managing a parking area. From parking tags,
tickets and bills to payments and appeals, this solution has it all when it comes to parking management.
</p>
</div> </div>
</div> </div>
<!-- CUSTOM SOFTWARE BOX 3 --> </div>
<div class="row mb-4 g-4 align-items-center bg-white shadow-sm rounded"> <!-- CUSTOM SOFTWARE BOX 3 -->
<div class="col-md-12"> <div class="row mb-4 g-4 align-items-center bg-white shadow-sm rounded">
<div class="p-3 text-center"> <div class="col-md-12">
<h2>Document Management System</h2> <div class="p-3 text-center">
<p class="mx-auto" style="max-width: 850px;">Very easily scan and store all of your paper documents securely and safely and retrieve any of them instantly at any time. This software can save countless hours for document imaging projects and can be customized to fit specific needs.</p> <h2>Document Scanning Tools</h2>
</div> <p class="mx-auto" style="max-width: 850px;">Scan and transmit paper documents with ease. This software
provides an easy way to scan and organize paper documents and send them electronically to a variety of
configurable destinations including HL7, FTPS, HTTPS, CIFS and more.</p>
</div> </div>
</div> </div>
<!-- CUSTOM SOFTWARE BOX 4 --> </div>
<div class="row mb-4 g-4 align-items-center bg-gray shadow-sm rounded"> <!-- CUSTOM SOFTWARE BOX 4 -->
<div class="col-md-12"> <div class="row mb-4 g-4 align-items-center bg-grey shadow-sm rounded">
<div class="p-3 text-center"> <div class="col-md-12">
<h2>Pawn Shop Pro</h2> <div class="p-3 text-center">
<p class="mx-auto" style="max-width: 850px;">This is a pawn shop management system that will simplify record keeping, billing, and inventory management. If there is something specific that you need for your pawn shop the software can be modified to suit your needs.</p> <h2>Document Management System</h2>
</div> <p class="mx-auto" style="max-width: 850px;">Very easily scan and store all of your paper documents securely
and safely and retrieve any of them instantly at any time. This software can save countless hours for
document imaging projects and can be customized to fit specific needs.</p>
</div> </div>
</div> </div>
<!-- CUSTOM SOFTWARE BOX 5 --> </div>
<div class="row mb-4 g-4 align-items-center bg-white shadow-sm rounded"> <!-- CUSTOM SOFTWARE BOX 5 -->
<div class="col-md-12"> <div class="row mb-4 g-4 align-items-center bg-white shadow-sm rounded">
<div class="p-3 text-center"> <div class="col-md-12">
<h2>Employee Time Tracking</h2> <div class="p-3 text-center">
<p class="mx-auto" style="max-width: 850px;">This software is an easy and useful way to track customers, projects, tasks, and resources over time and create reports from this information.</p> <h2>Pawn Shop Pro</h2>
</div> <p class="mx-auto" style="max-width: 850px;">This is a pawn shop management system that will simplify record
keeping, billing, and inventory management. If there is something specific that you need for your pawn
shop the software can be modified to suit your needs.</p>
</div>
</div>
</div>
<!-- CUSTOM SOFTWARE BOX 6 -->
<div class="row mb-4 g-4 align-items-center bg-grey shadow-sm rounded">
<div class="col-md-12">
<div class="p-3 text-center">
<h2>Employee Time Tracking</h2>
<p class="mx-auto" style="max-width: 850px;">This software is an easy and useful way to track customers,
projects, tasks, and resources over time and create reports from this information.</p>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div>
<div id="site_footer"></div> <div id="site_footer"></div>
</div> </div>
<div class="d-flex flex-column min-vh-100"> <div class="d-flex flex-column min-vh-100">
<div id="site_nav"></div> <div id="site_nav"></div>
<!-- HERO SECTION --> <!-- HERO SECTION -->
<div class="container-fluid px-0"> <div class="container-fluid px-0">
<div class="hero-section bg-dark text-white text-center"> <div class="hero-section bg-dark text-white text-center">
<img src="images\table_with_computers.jpg" alt="Hero Image" class="img-fluid hero-image"> <img src="images\table_with_computers.jpg" alt="Hero Image" class="img-fluid hero-image">
<div class="hero-overlay d-flex justify-content-center align-items-center"> <div class="hero-overlay d-flex justify-content-center align-items-center">
<div class="text-wrapper"> <div class="text-wrapper">
<h1 class="display-4">Custom Software, Comprehensive Support</h1> <h1 class="display-4">Custom Software, Comprehensive Support</h1>
<!-- Constrain only the paragraph width --> <div class="mx-auto" style="max-width: 540px;">
<div class="mx-auto" style="max-width: 540px;"> <p class="lead fs-3 mb-0">Real connections. Reliable support. Software made for you.</p>
<p class="lead fs-3 mb-0">Real connections. Reliable support. Software made for you.</p> </div>
</div>
<!-- Button sits outside the max-width block --> <div class="mt-5">
<div class="mt-5"> <button type="button" id="btn_demo"
<button type="button" class="btn btn-lg rounded-pill fw-semibold text-white shadow px-4 px-sm-5 py-2"
id="btn_demo" onclick="window.location.hash='#FRequestDemo';">
class="btn btn-lg rounded-pill fw-semibold text-white shadow px-4 px-sm-5 py-2"
onclick="window.location.hash='#FRequestDemo';">
Request a Demo Request a Demo
</button> </button>
</div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div>
<!--MAIN CONTAINER--> <!--MAIN CONTAINER-->
<div class="container-main"> <div class="container-main">
<!-- LEARN BOXES -->
<div class="learn-boxes"> <!-- LEARN BOXES -->
<div class="row mb-4 g-4 align-items-center bg-white shadow-sm rounded"> <div class="learn-boxes">
<div class="col-md-6"> <div class="row mb-4 g-4 align-items-center bg-white shadow-sm rounded">
<a href="#FPublicSafety" class="d-block"> <div class="col-md-6">
<img src="images\honeycomb-new.png" alt="Logistics Image" class="img-fluid rounded"> <a href="#FPublicSafety" class="d-block">
</a> <img src="images\honeycomb-new.png" alt="Logistics Image" class="img-fluid rounded">
</div> </a>
<div class="col-md-6">
<div class="p-3 text-center">
<h2>Integrated Public Safety Software</h2>
<p>EM Systems maintains a full suite of proven integrated systems that can be tailored to fit the specific needs of your organization. Seeking to move from an older outdated, or more expensive solution? Facilitate a smooth transition and don’t lose a thing. Ask us about data conversion and training programs.</p>
<a href="#FPublicSafety" id="publicsafetylearn" class="btn btn-primary btn-black">Learn More</a>
</div>
</div>
</div> </div>
<div class="row mb-4 g-4 align-items-center bg-gray shadow-sm rounded flex-md-row-reverse"> <div class="col-md-6">
<div class="col-md-6"> <div class="p-3 text-center">
<a href="#FRecordsManagement" class="d-block"> <h2>Integrated Public Safety Software</h2>
<img src="images\bookshelves.jpg" alt="Storage Image" class="img-fluid rounded"> <p>EM Systems maintains a full suite of proven integrated public safety systems that can be tailored to fit
</a> the specific needs of your organization. If you are seeking to move from an older outdated or more
</div> expensive solution, we will facilitate a smooth transition to our customizable proven solutions. Ask us
<div class="col-md-6"> about data conversion and training programs.</p>
<div class="p-3 text-center"> <a href="#FPublicSafety" id="publicsafetylearn" class="btn btn-primary btn-black">Learn More</a>
<h2>Records Management Notification System</h2>
<p>EM Systems has several new records and information management systems which incorporate modern paradigms in the field. Thinking of integrating electronic medical records with public safety systems? We can help. Feel free to contact us any time.</p>
<a href="#FRecordsManagement" id="recordsmanagementlearn" class="btn btn-primary btn-black">Learn More</a>
</div>
</div> </div>
</div> </div>
<div class="row mb-4 g-4 align-items-center bg-white shadow-sm rounded"> </div>
<div class="col-md-6"> <div class="row mb-4 g-4 align-items-center bg-gray shadow-sm rounded flex-md-row-reverse">
<a href="#FCustomSoftware" class="d-block"> <div class="col-md-6">
<img src="images\laptop.jpg" alt="Computer Image" class="img-fluid rounded"> <a href="#FRecordsManagement" class="d-block">
</a> <img src="images\bookshelves.jpg" alt="Storage Image" class="img-fluid rounded">
</a>
</div>
<div class="col-md-6">
<div class="p-3 text-center">
<h2>Records Management Notification System</h2>
<p>EM Systems has a suite of new records and information management solutions which incorporate modern
paradigms in the field. Learn about simplifying the management of your information through notification
processes and never miss a task by using this built in task related notification alerting system.</p>
<a href="#FRecordsManagement" id="recordsmanagementlearn" class="btn btn-primary btn-black">Learn More</a>
</div> </div>
<div class="col-md-6"> </div>
<div class="p-3 text-center"> </div>
<h2>Custom Software Development</h2> <div class="row mb-4 g-4 align-items-center bg-white shadow-sm rounded">
<p>EM Systems has great talent when it comes to working with customers to develop software solutions designed and tailored to their specific needs. Over the years we have created hundreds of custom solutions that have worked wonders for our customers.</p> <div class="col-md-6">
<a href="#FCustomSoftware" id="customsoftwarelearn" class="btn btn-primary btn-black">Learn More</a> <a href="#FCustomSoftware" class="d-block">
</div> <img src="images\laptop.jpg" alt="Computer Image" class="img-fluid rounded">
</a>
</div>
<div class="col-md-6">
<div class="p-3 text-center">
<h2>Custom Software Development</h2>
<p>EM Systems brings exceptional expertise by partnering with customers to design software solutions
tailored to specific needs. We have developed hundreds of custom solutions that have delivered outstanding
results for our customers. Learn more about some of the custom solutions we have developed through
successful partnerships and collaboration with our clients.</p>
<a href="#FCustomSoftware" id="customsoftwarelearn" class="btn btn-primary btn-black">Learn More</a>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div>
<div id="site_footer"></div> <div id="site_footer"></div>
</div> </div>
<div class="d-flex flex-column min-vh-100"> <div class="d-flex flex-column min-vh-100">
<div id="site_nav"></div> <div id="site_nav"></div>
<!-- HERO SECTION --> <!-- HERO SECTION -->
<div class="container-fluid px-0"> <div class="container-fluid px-0">
<div class="page-hero-section bg-dark text-white text-center"> <div class="page-hero-section bg-dark text-white text-center">
<img src="images\computer_code.jpg" alt="Hero Image" class="img-fluid hero-image"> <img src="images\computer_code.jpg" alt="Hero Image" class="img-fluid hero-image">
<div class="hero-overlay d-flex justify-content-center align-items-center"> <div class="hero-overlay d-flex justify-content-center align-items-center">
<div class="text-wrapper"> <div class="text-wrapper">
<h1 class="display-4">Integrated Public Safety</h1> <h1 class="display-4">Integrated Public Safety Software</h1>
</div>
</div> </div>
</div> </div>
</div> </div>
</div>
<!--MAIN CONTAINER--> <!--MAIN CONTAINER-->
<div class="container-main"> <div class="container-main">
<div class="learn-boxes py-5"> <div class="learn-boxes">
<!-- PUBLIC SAFETY BOX 1 --> <!-- PUBLIC SAFETY BOX 1 -->
<div class="row mb-4 g-4 align-items-center bg-white shadow-sm rounded"> <div class="row mb-4 g-4 align-items-center bg-white shadow-sm rounded">
<div class="col-md-12"> <div class="col-md-12">
<div class="p-3"> <div class="p-3">
<div class="text-center"> <div class="text-center">
<h2>Computer Aided Dispatch</h2> <h2>CJIS Compliance Commitment</h2>
<p class="mx-auto" style="max-width: 850px;">EM Systems’ CAD program is designed for use by an unlimited number of police, fire, and emergency medical <p class="mx-auto" style="max-width: 850px;">EM Systems is fully committed to meeting and exceeding CJIS
services (EMS) agencies in a single or multi-agency environment. The system provides complaint and incident requirements across every component of the Public Safety Software programs, providing agencies with
mapping, real-time tracking of vehicles, field communications, and alerts to potential hazards at an secure, compliant, and reliable solutions that can be trusted to support mission-critical operations.
address.</p> </p>
</div>
<div class="container">
<h3 class="text-center">List of Programs</h3>
<div class="row justify-content-center">
<div class="col-sm-6 col-md-auto mb-2 border-top pt-3" style="max-width: 350px;">
<ul class="text-start">
<li>Computer Aided Dispatch (CAD) - Police, Fire &amp; EMS</li>
<li>Mapping w/GPS tracking &amp; AVL</li>
<li>Records Management System (RMS)</li>
<li>Mobile Data System (MDS) w/Police Reports &amp; Arrest</li>
<li>Livescan Fingerprinting w/ Booking and Civil submissions</li>
</ul>
</div>
<div class="col-sm-6 col-md-auto text-md-start border-top pt-3" style="max-width: 350px;">
<ul>
<li>Jail Management System (JMS)</li>
<li>iPhone &amp; Android Apps - CAD Monitor &amp; Data Access</li>
<li>FireRMS w/NERIS reporting</li>
<li>Summons &amp; Accidents MDS modules (Tracs replacement)</li>
<li>Discovery module w/Interface to DEMS</li>
<li>Interfaces to State &amp; Federal Systems</li>
</ul>
</div>
</div> </div>
<div class="container"> </div>
<h3 class="text-center">System Features</h3> </div>
<div class="row justify-content-center"> </div>
<div class="col-sm-6 col-md-auto mb-2 border-top pt-3" style="max-width: 250px;"> </div>
<ul class="text-start"> <!-- PUBLIC SAFETY BOX 2 -->
<li>Real-time Call Taking / Dispatching</li> <div class="row mb-4 g-4 align-items-center bg-grey shadow-sm rounded">
<li>Complaint and Incident Mapping</li> <div class="col-md-12">
<li>911 Interface</li> <div class="p-3">
<li>Field Communications</li> <div class="text-center">
</ul> <h2>Computer Aided Dispatch</h2>
</div> <p class="mx-auto" style="max-width: 850px;">EM Systems CAD solution is a powerful, scalable platform
<div class="col-sm-6 col-md-auto text-md-start border-top pt-3" style="max-width: 250px;"> <!-- Set max-width and use Bootstrap's sizing --> designed to support an unlimited number of police, fire, and emergency medical services (EMS) agencies
<ul> in both single-agency and multi-agency environments. Built to enhance operational awareness and
<li>Messaging and Bulletin Boards</li> responder safety, the system delivers advanced incident mapping, real-time vehicle tracking, seamless
<li>Alerts and Hazards Notification</li> field communications, and proactive alerts for potential hazards at specific locations.</p>
<li>Supports Silent Dispatch</li> </div>
<li>Integration with LEMS</li> <div class="container">
</ul> <h3 class="text-center">System Features</h3>
</div> <div class="row justify-content-center">
<div class="col-sm-6 col-md-auto mb-2 border-top pt-3" style="max-width: 250px;">
<ul class="text-start">
<li>Real-time Call Taking / Dispatching</li>
<li>Complaint and Incident Mapping</li>
<li>911 Interface</li>
<li>Field Communications</li>
</ul>
</div>
<div class="col-sm-6 col-md-auto text-md-start border-top pt-3" style="max-width: 250px;">
<!-- Set max-width and use Bootstrap's sizing -->
<ul>
<li>Messaging and Bulletin Boards</li>
<li>Alerts and Hazards Notification</li>
<li>Supports Silent Dispatch</li>
<li>Integration with LEMS</li>
</ul>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<!-- PUBLIC SAFETY BOX 2 --> </div>
<div class="row mb-4 g-4 align-items-center bg-gray shadow-sm rounded"> <!-- PUBLIC SAFETY BOX 3 -->
<div class="col-md-12"> <div class="row mb-4 g-4 align-items-center bg-white shadow-sm rounded">
<div class="p-3"> <div class="col-md-12">
<div class="text-center"> <div class="p-3">
<div class="text-center">
<h2>Record Management System</h2> <h2>Record Management System</h2>
<p class="mx-auto" style="max-width: 850px;">Our Records Management System (RMS) is a powerful menu-driven database system than can be used to track <p class="mx-auto" style="max-width: 850px;">Our Records Management System (RMS) is a powerful menu-driven
everything from arrest / booking information to court records (e.g., orders of protection, summons, etc.), database system than can be used to track
everything from arrest / booking information to court records (e.g., orders of protection, summons,
etc.),
and personnel information (e.g., training, promotions, etc.). The system provides for enhanced patrol, and personnel information (e.g., training, promotions, etc.). The system provides for enhanced patrol,
investigative, and administrative processes and provides a wealth of valuable analysis information. Users investigative, and administrative processes and provides a wealth of valuable analysis information.
can create reports based on data from any field in the software to help prevent and solve crimes, allocate Users
can create reports based on data from any field in the software to help prevent and solve crimes,
allocate
resources, and much more.</p> resources, and much more.</p>
</div> </div>
<div class="container"> <div class="container">
<h3 class="text-center">System Features</h3> <h3 class="text-center">System Features</h3>
<div class="row justify-content-center"> <div class="row justify-content-center">
<div class="col-sm-6 col-md-auto mb-2 border-top pt-3" style="max-width: 250px;"> <!-- Set max-width and use Bootstrap's sizing --> <div class="col-sm-6 col-md-auto mb-2 border-top pt-3" style="max-width: 250px;">
<ul class="text-start"> <!-- Set max-width and use Bootstrap's sizing -->
<li>Master Name including detailed data on persons, addresses, vehicles, etc.</li> <ul class="text-start">
<li>Tracking incident activity <li>Master Name including detailed data on persons, addresses, vehicles, etc.</li>
</li> <li>Tracking incident activity
<li>Search and audit capabilities </li>
</li> <li>Search and audit capabilities
<li>Investigations / case management </li>
</li> <li>Investigations / case management
</ul> </li>
</div> </ul>
<div class="col-sm-6 col-md-auto text-md-start border-top pt-3" style="max-width: 250px;"> <!-- Set max-width and use Bootstrap's sizing --> </div>
<ul> <div class="col-sm-6 col-md-auto text-md-start border-top pt-3" style="max-width: 250px;">
<li>Crime analysis</li> <!-- Set max-width and use Bootstrap's sizing -->
<li>Personnel information / management <ul>
</li> <li>Crime analysis</li>
<li>Narrative with spell check <li>Personnel information / management
</li> </li>
<li>Reporting capabilities <li>Narrative with spell check
</li> </li>
</ul> <li>Reporting capabilities
</div> </li>
</ul>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<!-- PUBLIC SAFETY BOX 3 --> </div>
<div class="row mb-4 g-4 align-items-center bg-white shadow-sm rounded"> <!-- PUBLIC SAFETY BOX 4 -->
<div class="col-md-12"> <div class="row mb-4 g-4 align-items-center bg-grey shadow-sm rounded">
<div class="p-3"> <div class="col-md-12">
<div class="text-center"> <div class="p-3">
<div class="text-center">
<h2>Mobile Data System</h2> <h2>Mobile Data System</h2>
<p class="mx-auto" style="max-width: 850px;">The Mobile Data System (MDS) we created provides multi-agency mobile data communications interoperability. <p class="mx-auto" style="max-width: 850px;">The Mobile Data System (MDS) we created provides multi-agency
The system provides mobile users the ability to perform onsite data checks, including plate checks, driver mobile data communications interoperability.
The system provides mobile users the ability to perform onsite data checks, including plate checks,
driver
checks, vehicle data checks, and name checks. The system also provides detailed information on the checks, vehicle data checks, and name checks. The system also provides detailed information on the
complaint, allows the user to view all units and their status, and enables the user to send and receive complaint, allows the user to view all units and their status, and enables the user to send and receive
messages from other users.</p> messages from other users.</p>
</div> </div>
<div class="container"> <div class="container">
<h3 class="text-center">System Features</h3> <h3 class="text-center">System Features</h3>
<div class="row justify-content-center"> <div class="row justify-content-center">
<div class="col-sm-6 col-md-auto mb-2 border-top pt-3" style="max-width: 250px;"> <!-- Set max-width and use Bootstrap's sizing --> <div class="col-sm-6 col-md-auto mb-2 border-top pt-3" style="max-width: 250px;">
<ul class="text-start"> <!-- Set max-width and use Bootstrap's sizing -->
<li>Wireless multi-agency interoperable data communications of real-time dispatch and complaint <ul class="text-start">
information <li>Wireless multi-agency interoperable data communications of real-time dispatch and complaint
</li> information
<li>Onsite data checks (including name, plate, driver, vehicle, warrants) </li>
</li> <li>Onsite data checks (including name, plate, driver, vehicle, warrants)
<li>Police reporting module to enter information into RMS from the field </li>
</li> <li>Police reporting module to enter information into RMS from the field
</ul> </li>
</div> </ul>
<div class="col-sm-6 col-md-auto text-md-start border-top pt-3" style="max-width: 250px;"> <!-- Set max-width and use Bootstrap's sizing --> </div>
<ul> <div class="col-sm-6 col-md-auto text-md-start border-top pt-3" style="max-width: 250px;">
<li>View all available units and their status <!-- Set max-width and use Bootstrap's sizing -->
</li> <ul>
<li>Send and receive messages from other units / agencies</li> <li>View all available units and their status
<li>Supports AirCard and / or Packet Radio Modem RF Technology</li> </li>
<li>Dispatch link (complaint and status updates)</li> <li>Send and receive messages from other units / agencies</li>
</ul> <li>Supports AirCard and / or Packet Radio Modem RF Technology</li>
</div> <li>Dispatch link (complaint and status updates)</li>
</ul>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<!-- PUBLIC SAFETY BOX 4 --> </div>
<div class="row mb-4 g-4 align-items-center bg-gray shadow-sm rounded"> <!-- PUBLIC SAFETY BOX 5 -->
<div class="col-md-12"> <div class="row mb-4 g-4 align-items-center bg-white shadow-sm rounded">
<div class="p-3"> <div class="col-md-12">
<div class="text-center"> <div class="p-3">
<div class="text-center">
<h2>Automated Vehicle Location System</h2> <h2>Automated Vehicle Location System</h2>
<p class="mx-auto" style="max-width: 850px;">Our AVL System is a real-time automatic vehicle location system used to pinpoint the location of equipped <p class="mx-auto" style="max-width: 850px;">Our AVL System is a real-time automatic vehicle location
vehicles and track their movement. The system allows you to visually see the location of units in the field, system used to pinpoint the location of equipped
vehicles and track their movement. The system allows you to visually see the location of units in the
field,
enhance dispatch operations, and increase officer safety.</p> enhance dispatch operations, and increase officer safety.</p>
</div> </div>
<div class="container"> <div class="container">
<h3 class="text-center">System Features</h3> <h3 class="text-center">System Features</h3>
<div class="row justify-content-center"> <div class="row justify-content-center">
<div class="col-sm-6 col-md-auto mb-2 border-top pt-3" style="max-width: 250px;"> <!-- Set max-width and use Bootstrap's sizing --> <div class="col-sm-6 col-md-auto mb-2 border-top pt-3" style="max-width: 250px;">
<ul class="text-start"> <!-- Set max-width and use Bootstrap's sizing -->
<li>Real-time GPS Vehicle Tracking</li> <ul class="text-start">
<li>Mapping Application for Dispatch and Mobile</li> <li>Real-time GPS Vehicle Tracking</li>
</ul> <li>Mapping Application for Dispatch and Mobile</li>
</div> </ul>
<div class="col-sm-6 col-md-auto text-md-start border-top pt-3" style="max-width: 250px;"> <!-- Set max-width and use Bootstrap's sizing --> </div>
<ul> <div class="col-sm-6 col-md-auto text-md-start border-top pt-3" style="max-width: 250px;">
<li>XML-based Communications</li> <!-- Set max-width and use Bootstrap's sizing -->
<li>Complaint and Crime Mapping</li> <ul>
</ul> <li>XML-based Communications</li>
</div> <li>Complaint and Crime Mapping</li>
</ul>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<!-- PUBLIC SAFETY BOX 5 --> </div>
<div class="row mb-4 g-4 align-items-center bg-white shadow-sm rounded"> <!-- PUBLIC SAFETY BOX 6 -->
<div class="col-md-12"> <div class="row mb-4 g-4 align-items-center bg-grey shadow-sm rounded">
<div class="p-3"> <div class="col-md-12">
<div class="text-center"> <div class="p-3">
<h2>Jail Management System</h2> <div class="text-center">
<p class="mx-auto" style="max-width: 850px;">EM Systems’ Jail Management System (JMS) is designed to effectively assist in the management of a <h2>Jail Management System</h2>
detention <p class="mx-auto" style="max-width: 850px;">EM Systems’ Jail Management System (JMS) is designed to
facility of any size. The system can operate independently or as a component of EM Systems’ Law effectively assist in the management of a
Enforcement detention
Management System (LEMS). It can also be integrated with other justice information systems from facility of any size. The system can operate independently or as a component of EM Systems’ Law
third-party Enforcement
vendors. As with all EM Systems’ software, the JMS can be customized to meet the unique needs of your Management System (LEMS). It can also be integrated with other justice information systems from
agency.</p> third-party
</div> vendors. As with all &nbsp;&nbsp;EM Systems’ software, the JMS can be customized to meet the unique needs of your
<div class="container"> agency.</p>
<h3 class="text-center">System Features</h3> </div>
<div class="row justify-content-center"> <div class="container">
<div class="col-sm-6 col-md-auto mb-2 border-top pt-3" style="max-width: 250px;"> <!-- Set max-width and use Bootstrap's sizing --> <h3 class="text-center">System Features</h3>
<ul class="text-start"> <div class="row justify-content-center">
<li>Facilitates booking procedures</li> <div class="col-sm-6 col-md-auto mb-2 border-top pt-3" style="max-width: 250px;">
<li>Access to historical data</li> <!-- Set max-width and use Bootstrap's sizing -->
<li>Medical and suicide screening</li> <ul class="text-start">
<li>Release date calculations and processing</li> <li>Facilitates booking procedures</li>
</ul> <li>Access to historical data</li>
</div> <li>Medical and suicide screening</li>
<div class="col-sm-6 col-md-auto text-md-start border-top pt-3" style="max-width: 250px;"> <!-- Set max-width and use Bootstrap's sizing --> <li>Release date calculations and processing</li>
<ul> </ul>
<li>Property and custody management</li> </div>
<li>Powerful search capabilities</li> <div class="col-sm-6 col-md-auto text-md-start border-top pt-3" style="max-width: 250px;">
<li>Automated reporting</li> <!-- Set max-width and use Bootstrap's sizing -->
</ul> <ul>
</div> <li>Property and custody management</li>
<li>Powerful search capabilities</li>
<li>Automated reporting</li>
</ul>
</div> </div>
</div> </div>
</div> </div>
...@@ -204,6 +261,7 @@ ...@@ -204,6 +261,7 @@
</div> </div>
</div> </div>
</div> </div>
</div>
<div id="site_footer"></div> <div id="site_footer"></div>
</div> </div>
<div class="d-flex flex-column min-vh-100"> <div class="d-flex flex-column min-vh-100">
<div id="site_nav"></div> <div id="site_nav"></div>
<!-- HERO SECTION --> <!-- HERO SECTION -->
<div class="container-fluid px-0"> <div class="container-fluid px-0">
<div class="page-hero-section bg-dark text-white text-center" id="FRecordsManagement" tabindex="-1"> <div class="page-hero-section bg-dark text-white text-center" id="FRecordsManagement" tabindex="-1">
<img src="images\computer_code.jpg" alt="Hero Image" class="img-fluid hero-image"> <img src="images\computer_code.jpg" alt="Hero Image" class="img-fluid hero-image">
<div class="hero-overlay d-flex justify-content-center align-items-center"> <div class="hero-overlay d-flex justify-content-center align-items-center">
<div class="text-wrapper"> <div class="text-wrapper">
<h1 class="display-4">Records Management Notification System</h1> <h1 class="display-4">Records Management Notification System</h1>
</div>
</div> </div>
</div> </div>
</div> </div>
</div>
<!--MAIN CONTAINER-->
<div class="container-main">
<div class="learn-boxes">
<!-- RECORDS MANAGEMENT BOX 1 -->
<div class="row mb-4 g-4 align-items-center bg-white shadow-sm rounded">
<div class="col-md-12">
<div class="p-3 text-center">
<h2>Records Retention Notification</h2>
<p class="mx-auto" style="max-width: 850px;">With multi departmental government organizations constantly in
a state of flux, the Records Management Notification System is designed to provide consistent and informed
alerts to aid governments in following records management best practices.
This system is designed to help Town Clerk’s, Police Departments, and Records Managers fulfill records
retention mandates by providing alerts to complete standard records management practices. This software
will aid in the management of day-to-day records and help local government meet records retention
requirements.
<!--MAIN CONTAINER--> The Records Retention RMNS is fully aligned with the New York State LG-1 schedule, integrating
<div class="container-main"> comprehensive retention and disposition policies that streamline the management of both electronic and
<div class="learn-boxes py-5"> paper records through a task-based notification system.
<!-- RECORDS MANAGEMENT BOX 1 --> </p>
<div class="row mb-4 g-4 align-items-center bg-white shadow-sm rounded">
<div class="col-md-12">
<div class="p-3 text-center">
<h2>Records Retention Notification</h2>
<p class="mx-auto" style="max-width: 850px;">Emergent.MD is an easy-to-use, full-featured, state-of-the-art Electronic Medical Records System. It works
with just about any practice. It interfaces with your existing Practice Management System. And, we’ll tailor
it to fit your unique workflow requirements. It will improve efficiency and save money for your practice.
</p>
</div>
</div> </div>
</div> </div>
<!-- RECORDS MANAGEMENT BOX 2 --> </div>
<div class="row mb-4 g-4 align-items-center bg-gray shadow-sm rounded"> <!-- RECORDS MANAGEMENT BOX 2 -->
<div class="col-md-12"> <div class="row mb-4 g-4 align-items-center bg-gray shadow-sm rounded">
<div class="p-3 text-center"> <div class="col-md-12">
<h2>Legal Hold Notices</h2> <div class="p-3 text-center">
<p class="mx-auto" style="max-width: 850px;">TeleCare Connex is a completely integrated telemonitoring solution that includes wireless mobile devices <h2>Legal Hold Notices</h2>
for remote vital sign collection, and a web application for technicians and monitors to setup, enroll, and <p class="mx-auto" style="max-width: 850px;">The Legal Holds Notices RMNS module is designed to notify
actively or passively track patient status and provide health information accordingly. This helps to reduce government officials and records managers of a current obligation to preserve evidence and ensure critical
hospititalizations, promote good health with its participants and saves money.</p> information remains intact and accessible for review under a legal hold. The notification will remind key
</div> stakeholders that legal holds are current and in place; preventing governments from receiving penalties
for non-compliance.</p>
</div> </div>
</div> </div>
<!-- RECORDS MANAGEMENT BOX 3 --> </div>
<div class="row mb-4 g-4 align-items-center bg-white shadow-sm rounded"> <!-- RECORDS MANAGEMENT BOX 3 -->
<div class="col-md-12"> <div class="row mb-4 g-4 align-items-center bg-white shadow-sm rounded">
<div class="p-3 text-center"> <div class="col-md-12">
<h2>Freedom of Information Law (FOIL)</h2> <div class="p-3 text-center">
<p class="mx-auto" style="max-width: 850px;">Dictation Notepad is a simple app for dictating and sending notes using an android powered device. It <h2>Freedom of Information Law (FOIL)</h2>
leverages speech recognition technology to accurately transform speech to text and it allows formatting and <p class="mx-auto" style="max-width: 850px;">The FOIL Requests RMNS module provides automated notifications
editing of the text using voice commands. The audio is recorded and encoded to a small file size and saved to government employees when a FOIL request is received and alerts users to the required tasks and steps
along with the text. The text (in html format) and audio can be configured to send to variety of destination necessary to maintain compliance with the Freedom of Information Law. The system issues reminders to
protocols (SMTP, FTP/S, HTTP/S) with a user specified host.</p> ensure requests are properly filed, delivers automatic status updates, and audits completed tasks to
</div> support ongoing compliance and accountability.</p>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div>
<div id="site_footer"></div> <div id="site_footer"></div>
</div> </div>
...@@ -238,7 +238,7 @@ begin ...@@ -238,7 +238,7 @@ begin
radReqEmail.Checked := True; radReqEmail.Checked := True;
wcbInterest.ItemIndex := -1; wcbInterest.ItemIndex := -1;
ShowNotificationModal('Your demo request has been sent successfully. We will reach out shortly.'); ShowNotificationModal('Your demo request has been submitted. Please check your email for confirmation. If you did not recieve an email, reach out directly.');
end); end);
end; end;
......
[Settings] [Settings]
memoLogLevel=3 memoLogLevel=3
fileLogLevel=4 fileLogLevel=4
LogFileNum=44 LogFileNum=49
webClientVersion=1.0.1 webClientVersion=1.0.1
[SMTP] [SMTP]
......
...@@ -40,6 +40,19 @@ type ...@@ -40,6 +40,19 @@ type
procedure Send(logLevel: Integer; Log: ILog); procedure Send(logLevel: Integer; Log: ILog);
end; end;
TTaggedFileLogAppender = class( TInterfacedObject, ILogAppender )
private
FLogLevel: Integer;
FFilename: string;
FLogDirectory: string;
FTagPrefix: string;
FCriticalSection: TCriticalSection;
public
constructor Create(ALogLevel: Integer; AFilename: string; ATagPrefix: string);
destructor Destroy; override;
procedure Send(logLevel: Integer; Log: ILog);
end;
{ TMemoLogAppender } { TMemoLogAppender }
constructor TMemoLogAppender.Create(ALogLevel: Integer; ALogMemo: TMemo); constructor TMemoLogAppender.Create(ALogLevel: Integer; ALogMemo: TMemo);
begin begin
...@@ -71,7 +84,7 @@ begin ...@@ -71,7 +84,7 @@ begin
FormattedMessage := FormattedMessage + '[' + IntToStr(logLevel) +'] ' + LogMsg; FormattedMessage := FormattedMessage + '[' + IntToStr(logLevel) +'] ' + LogMsg;
if logLevel <= FLogLevel then if logLevel <= FLogLevel then
FLogMemo.Lines.Add( FormattedMessage ); FLogMemo.Lines.Add(FormattedMessage);
finally finally
FCriticalSection.Release; FCriticalSection.Release;
end; end;
...@@ -89,11 +102,11 @@ begin ...@@ -89,11 +102,11 @@ begin
if not DirectoryExists(FLogDirectory) then if not DirectoryExists(FLogDirectory) then
CreateDir(FLogDirectory); CreateDir(FLogDirectory);
iniFile := TIniFile.Create( ChangeFileExt(Application.ExeName, '.ini') ); iniFile := TIniFile.Create(ChangeFileExt(Application.ExeName, '.ini'));
try try
fileNum := iniFile.ReadInteger( 'Settings', 'LogFileNum', 0 ); fileNum := iniFile.ReadInteger('Settings', 'LogFileNum', 0);
FFilename := AFilename + Format( '%.4d', [fileNum] ); FFilename := AFilename + Format('%.4d', [fileNum]);
iniFile.WriteInteger( 'Settings', 'LogFileNum', fileNum + 1 ); iniFile.WriteInteger('Settings', 'LogFileNum', fileNum + 1);
finally finally
iniFile.Free; iniFile.Free;
end; end;
...@@ -116,7 +129,6 @@ begin ...@@ -116,7 +129,6 @@ begin
FCriticalSection.Acquire; FCriticalSection.Acquire;
try try
LogTime := Now; LogTime := Now;
// LogFile := ExtractFilePath(Application.ExeName) + FFilename + '.log';
LogFile := FLogDirectory + FFilename + '.log'; LogFile := FLogDirectory + FFilename + '.log';
FormattedMessage := FormatDateTime('[yyyy-mm-dd HH:nn:ss.zzz]', LogTime); FormattedMessage := FormatDateTime('[yyyy-mm-dd HH:nn:ss.zzz]', LogTime);
...@@ -127,14 +139,14 @@ begin ...@@ -127,14 +139,14 @@ begin
FormattedMessage := FormattedMessage + '[' + IntToStr(logLevel) +'] ' + LogMsg; FormattedMessage := FormattedMessage + '[' + IntToStr(logLevel) +'] ' + LogMsg;
try try
AssignFile( FLogFile, LogFile ); AssignFile(FLogFile, LogFile);
if logLevel <= FLogLevel then if logLevel <= FLogLevel then
begin begin
if FileExists(LogFile) then if FileExists(LogFile) then
Append( FLogFile ) Append(FLogFile)
else else
ReWrite( FLogFile ); Rewrite(FLogFile);
WriteLn( FLogFile, FormattedMessage ); WriteLn(FLogFile, FormattedMessage);
end; end;
finally finally
CloseFile(FLogFile); CloseFile(FLogFile);
...@@ -144,6 +156,67 @@ begin ...@@ -144,6 +156,67 @@ begin
end; end;
end; end;
{ TTaggedFileLogAppender }
constructor TTaggedFileLogAppender.Create(ALogLevel: Integer; AFilename: string; ATagPrefix: string);
begin
FLogLevel := ALogLevel;
FTagPrefix := ATagPrefix;
FCriticalSection := TCriticalSection.Create;
FLogDirectory := ExtractFilePath(Application.ExeName) + 'logs\';
if not DirectoryExists(FLogDirectory) then
CreateDir(FLogDirectory);
FFilename := AFilename;
end;
destructor TTaggedFileLogAppender.Destroy;
begin
FCriticalSection.Free;
inherited;
end;
procedure TTaggedFileLogAppender.Send(logLevel: Integer; Log: ILog);
var
FormattedMessage: string;
LogFile: string;
LogTime: TDateTime;
LogMsg: string;
FLogFile: TextFile;
begin
if logLevel > FLogLevel then
Exit;
LogMsg := Log.GetMessage;
if LogMsg.IsEmpty then
Exit;
if (FTagPrefix <> '') and (Copy(LogMsg, 1, Length(FTagPrefix)) <> FTagPrefix) then
Exit;
FCriticalSection.Acquire;
try
LogTime := Now;
LogFile := FLogDirectory + FFilename + '.log';
FormattedMessage := FormatDateTime('[yyyy-mm-dd HH:nn:ss.zzz]', LogTime);
FormattedMessage := FormattedMessage + '[' + IntToStr(logLevel) +'] ' + LogMsg;
try
AssignFile(FLogFile, LogFile);
if FileExists(LogFile) then
Append(FLogFile)
else
Rewrite(FLogFile);
WriteLn(FLogFile, FormattedMessage);
finally
CloseFile(FLogFile);
end;
finally
FCriticalSection.Release;
end;
end;
{$R *.res} {$R *.res}
var var
...@@ -156,7 +229,7 @@ begin ...@@ -156,7 +229,7 @@ begin
Application.Initialize; Application.Initialize;
Application.MainFormOnTaskbar := True; Application.MainFormOnTaskbar := True;
Application.CreateForm(TFMain, FMain); Application.CreateForm(TFMain, FMain);
// Read INI for log levels
IniFile := TIniFile.Create(ChangeFileExt(Application.ExeName, '.ini')); IniFile := TIniFile.Create(ChangeFileExt(Application.ExeName, '.ini'));
try try
memoLogLevel := IniFile.ReadInteger('Settings', 'memoLogLevel', 3); memoLogLevel := IniFile.ReadInteger('Settings', 'memoLogLevel', 3);
...@@ -168,6 +241,9 @@ begin ...@@ -168,6 +241,9 @@ begin
Logger.AddAppender(TMemoLogAppender.Create(memoLogLevel, FMain.memoInfo)); Logger.AddAppender(TMemoLogAppender.Create(memoLogLevel, FMain.memoInfo));
Logger.AddAppender(TFileLogAppender.Create(fileLogLevel, 'emSystemsWebServer')); Logger.AddAppender(TFileLogAppender.Create(fileLogLevel, 'emSystemsWebServer'));
Logger.AddAppender(TTaggedFileLogAppender.Create(fileLogLevel, 'contact', '[CONTACT]'));
Logger.AddAppender(TTaggedFileLogAppender.Create(fileLogLevel, 'demo', '[DEMO]'));
Application.Run; Application.Run;
end. end.
...@@ -6,7 +6,7 @@ uses ...@@ -6,7 +6,7 @@ uses
XData.Server.Module, XData.Server.Module,
XData.Service.Common, XData.Service.Common,
IdSMTP, IdMessage, IdSSLOpenSSL, IdText, IdExplicitTLSClientServerBase, IdSMTP, IdMessage, IdSSLOpenSSL, IdText, IdExplicitTLSClientServerBase, System.NetEncoding,
IdIOHandlerSocket, IdException, IdSSL, IdSMTPBase, IdGlobal, IdStack, IdWinsock2, IdIOHandlerSocket, IdException, IdSSL, IdSMTPBase, IdGlobal, IdStack, IdWinsock2,
IdStackConsts, IdIOHandler, IdIOHandlerStack, IdBaseComponent, System.JSON, IdStackConsts, IdIOHandler, IdIOHandlerStack, IdBaseComponent, System.JSON,
IdComponent, IdTCPConnection, IdTCPClient, IdMessageClient, VCL.Forms, Api.Service; IdComponent, IdTCPConnection, IdTCPClient, IdMessageClient, VCL.Forms, Api.Service;
...@@ -30,39 +30,89 @@ uses ...@@ -30,39 +30,89 @@ uses
function TApiService.SendEmail(Name, Email, Subject, Body: string): string; function TApiService.SendEmail(Name, Email, Subject, Body: string): string;
var var
SMTP: TIdSMTP; smtp: TIdSMTP;
Message: TIdMessage; message: TIdMessage;
SSL: TIdSSLIOHandlerSocketOpenSSL; confirmMsg: TIdMessage;
IniFile: TIniFile; ssl: TIdSSLIOHandlerSocketOpenSSL;
IniPath, HtmlBody: string; iniFile: TIniFile;
iniPath: string;
fromEmail: string;
recipientEmail: string;
safeSenderEmail: string;
safeSubject: string;
safeName: string;
submittedOn: string;
logPrefix: string;
htmlBody: string;
confirmHtml: string;
bodyHtml: string;
textPart: TIdText;
htmlPart: TIdText;
confirmTextPart: TIdText;
confirmHtmlPart: TIdText;
confirmSubject: string;
bodyLines: TArray<string>;
i: Integer;
begin begin
IniPath := ChangeFileExt(Application.ExeName, '.ini'); iniPath := ChangeFileExt(Application.ExeName, '.ini');
IniFile := TIniFile.Create(IniPath); iniFile := TIniFile.Create(iniPath);
try try
SMTP := TIdSMTP.Create(nil); fromEmail := iniFile.ReadString('SMTP', 'EmailWebsiteUses', '');
Message := TIdMessage.Create(nil); recipientEmail := iniFile.ReadString('SMTP', 'RecipientEmail', '');
SSL := TIdSSLIOHandlerSocketOpenSSL.Create(SMTP);
safeSenderEmail := Email.Replace(#13, '').Replace(#10, '').Trim;
safeSubject := Subject.Replace(#13, '').Replace(#10, '').Trim;
safeName := Name.Trim;
if SameText(safeSubject, 'Demo Request') then
logPrefix := '[DEMO]'
else
logPrefix := '[CONTACT]';
Logger.Log(2, logPrefix + ' ----------------------------------------');
Logger.Log(2, Format('%s SubmittedOn=%s', [logPrefix, FormatDateTime('yyyy-mm-dd HH:nn:ss', Now)]));
Logger.Log(2, Format('%s Name=%s', [logPrefix, safeName]));
Logger.Log(2, Format('%s Email=%s', [logPrefix, safeSenderEmail]));
Logger.Log(2, Format('%s Subject=%s', [logPrefix, safeSubject]));
Logger.Log(2, logPrefix + ' Body:');
bodyLines := Body.Replace(#13#10, #10).Replace(#13, #10).Split([#10]);
for i := 0 to High(bodyLines) do
Logger.Log(2, logPrefix + ' ' + bodyLines[i]);
smtp := TIdSMTP.Create(nil);
message := TIdMessage.Create(nil);
confirmMsg := TIdMessage.Create(nil);
ssl := TIdSSLIOHandlerSocketOpenSSL.Create(smtp);
try try
SMTP.IOHandler := SSL; smtp.IOHandler := ssl;
SMTP.UseTLS := utUseExplicitTLS; smtp.UseTLS := utUseExplicitTLS;
SMTP.AuthType := satDefault; smtp.AuthType := satDefault;
smtp.Host := iniFile.ReadString('SMTP', 'Host', '');
smtp.Port := iniFile.ReadInteger('SMTP', 'Port', 0);
smtp.Username := iniFile.ReadString('SMTP', 'Username', '');
smtp.Password := iniFile.ReadString('SMTP', 'Password', '');
SMTP.Host := IniFile.ReadString('SMTP', 'Host', ''); ssl.SSLOptions.Method := sslvTLSv1_2;
SMTP.Port := IniFile.ReadInteger('SMTP', 'Port', 0); ssl.SSLOptions.SSLVersions := [sslvTLSv1_2];
SMTP.Username := IniFile.ReadString('SMTP', 'Username', '');
SMTP.Password := IniFile.ReadString('SMTP', 'Password', '');
SSL.SSLOptions.Method := sslvTLSv1_2; submittedOn := FormatDateTime('yyyy-mm-dd hh:nn AM/PM', Now);
SSL.SSLOptions.SSLVersions := [sslvTLSv1_2];
Message.From.Address := IniFile.ReadString('SMTP', 'EmailWebsiteUses', ''); bodyHtml := TNetEncoding.HTML.Encode(Body);
Message.Recipients.EmailAddresses := IniFile.ReadString('SMTP', 'RecipientEmail', ''); bodyHtml := bodyHtml.Replace(#13#10, '<br>').Replace(#10, '<br>').Replace(#13, '<br>');
Message.Subject := Subject;
HtmlBody := Format( htmlBody := Format(
'<html>' + '<html>' +
'<body style="font-family: Arial, sans-serif; font-size: 14px; color:#222;">' + '<body style="font-family: Arial, sans-serif; font-size: 14px; color:#222;">' +
'<h2 style="color: #2E86C1; margin: 0 0 12px 0;">New "%s" message from EM Systems Website</h2>' + '<h2 style="color: #2E86C1; margin: 0 0 12px 0;">New %s message from EM Systems Website</h2>' +
'<p style="margin: 0 0 6px 0;"><strong>Submitted On:</strong> %s</p>' + '<p style="margin: 0 0 6px 0;"><strong>Submitted On:</strong> %s</p>' +
'<p style="margin: 0 0 6px 0;"><strong>From:</strong> %s &lt;%s&gt;</p>' + '<p style="margin: 0 0 6px 0;"><strong>From:</strong> %s &lt;%s&gt;</p>' +
'<p style="margin: 0 0 14px 0;"><strong>Subject:</strong> %s</p>' + '<p style="margin: 0 0 14px 0;"><strong>Subject:</strong> %s</p>' +
...@@ -72,39 +122,114 @@ begin ...@@ -72,39 +122,114 @@ begin
'</body>' + '</body>' +
'</html>', '</html>',
[ [
Subject, TNetEncoding.HTML.Encode(safeSubject),
FormatDateTime('yyyy-mm-dd hh:nn AM/PM', Now), submittedOn,
Name, TNetEncoding.HTML.Encode(safeName),
Email, TNetEncoding.HTML.Encode(safeSenderEmail),
Subject, TNetEncoding.HTML.Encode(safeSubject),
Body.Replace(#13#10, '<br>').Replace(#10, '<br>').Replace(#13, '<br>') bodyHtml
] ]
); );
Message.Body.Text := HtmlBody; message.Clear;
Message.ContentType := 'text/html'; message.From.Address := fromEmail;
message.Recipients.EmailAddresses := recipientEmail;
if safeSenderEmail <> '' then
message.ReplyTo.EmailAddresses := safeSenderEmail;
message.Subject := safeSubject;
message.MessageParts.Clear;
message.ContentType := 'multipart/alternative';
textPart := TIdText.Create(message.MessageParts, nil);
textPart.ContentType := 'text/plain; charset=utf-8';
textPart.Body.Text :=
'New message from EM Systems Website' + sLineBreak +
'Submitted On: ' + submittedOn + sLineBreak +
'From: ' + safeName + ' <' + safeSenderEmail + '>' + sLineBreak +
'Subject: ' + safeSubject + sLineBreak +
sLineBreak +
Body;
SMTP.Connect; htmlPart := TIdText.Create(message.MessageParts, nil);
htmlPart.ContentType := 'text/html; charset=utf-8';
htmlPart.Body.Text := htmlBody;
smtp.Connect;
try try
SMTP.Send(Message); smtp.Send(message);
Logger.Log(2, Format('%s InternalNotificationSent to=%s', [logPrefix, recipientEmail]));
if (safeSenderEmail <> '') and (Pos('@', safeSenderEmail) > 1) then
begin
if SameText(safeSubject, 'Demo Request') then
confirmSubject := 'We received your demo request'
else
confirmSubject := 'We received your message';
confirmHtml := Format(
'<html>' +
'<body style="font-family: Arial, sans-serif; font-size: 14px; color:#222;">' +
'<p style="margin:0 0 10px 0;">Hi %s,</p>' +
'<p style="margin:0 0 10px 0;">Thanks for reaching out. This is a quick confirmation that we received your message.</p>' +
'<p style="margin:0 0 10px 0;"><strong>Subject:</strong> %s</p>' +
'<p style="margin:0 0 10px 0;"><strong>Submitted On:</strong> %s</p>' +
'<p style="margin:0;">Well reply as soon as we can.</p>' +
'</body>' +
'</html>',
[
TNetEncoding.HTML.Encode(safeName),
TNetEncoding.HTML.Encode(safeSubject),
submittedOn
]
);
confirmMsg.Clear;
confirmMsg.From.Address := fromEmail;
confirmMsg.Recipients.EmailAddresses := safeSenderEmail;
confirmMsg.Subject := confirmSubject;
confirmMsg.ExtraHeaders.Values['Auto-Submitted'] := 'auto-replied';
confirmMsg.ExtraHeaders.Values['X-Auto-Response-Suppress'] := 'All';
confirmMsg.MessageParts.Clear;
confirmMsg.ContentType := 'multipart/alternative';
confirmTextPart := TIdText.Create(confirmMsg.MessageParts, nil);
confirmTextPart.ContentType := 'text/plain; charset=utf-8';
confirmTextPart.Body.Text :=
'Hi ' + safeName + ',' + sLineBreak +
sLineBreak +
'Thanks for reaching out. We have received your message and will be in touch soon.' + sLineBreak +
sLineBreak +
'-EM Systems Team';
confirmHtmlPart := TIdText.Create(confirmMsg.MessageParts, nil);
confirmHtmlPart.ContentType := 'text/html; charset=utf-8';
confirmHtmlPart.Body.Text := confirmHtml;
smtp.Send(confirmMsg);
Logger.Log(2, Format('%s ConfirmationSent to=%s', [logPrefix, safeSenderEmail]));
end
else
Logger.Log(2, logPrefix + ' ConfirmationSkipped: invalid sender email');
finally finally
SMTP.Disconnect; smtp.Disconnect;
end; end;
Logger.Log(1, Format('Contact form submitted. Name: %s, Email: %s, Subject: %s, Message: %s', [Name, Email, Subject, Body]));
finally finally
SSL.Free; ssl.Free;
Message.Free; confirmMsg.Free;
SMTP.Free; message.Free;
smtp.Free;
end; end;
finally finally
IniFile.Free; iniFile.Free;
end; end;
Result := 'Email sent successfully'; Result := 'Email sent successfully';
end; end;
function TApiService.VerifyVersion(ClientVersion: string): TJSONObject; function TApiService.VerifyVersion(ClientVersion: string): TJSONObject;
var var
iniFile: TIniFile; iniFile: TIniFile;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment