/private/reminderEmailSend.php

https://github.com/ciniki/customers · PHP · 147 lines · 104 code · 7 blank · 36 comment · 25 complexity · 3709275fe8d1fc2e5da64cba9ce61199 MD5 · raw file

  1. <?php
  2. //
  3. // Description
  4. // -----------
  5. //
  6. // Arguments
  7. // ---------
  8. // ciniki:
  9. // tnid: The ID of the current tenant.
  10. //
  11. // Returns
  12. // ---------
  13. //
  14. function ciniki_customers_reminderEmailSend(&$ciniki, $tnid, $reminder_id) {
  15. //
  16. // Load the tenant settings
  17. //
  18. ciniki_core_loadMethod($ciniki, 'ciniki', 'tenants', 'private', 'intlSettings');
  19. $rc = ciniki_tenants_intlSettings($ciniki, $tnid);
  20. if( $rc['stat'] != 'ok' ) {
  21. return $rc;
  22. }
  23. $intl_timezone = $rc['settings']['intl-default-timezone'];
  24. //
  25. // Load the reminder
  26. //
  27. $strsql = "SELECT reminders.id, "
  28. . "reminders.customer_id, "
  29. . "reminders.reminder_date, "
  30. . "reminders.flags, "
  31. . "reminders.repeat_type, "
  32. . "reminders.repeat_interval, "
  33. . "reminders.repeat_end, "
  34. . "reminders.description, "
  35. . "reminders.category, "
  36. . "reminders.notes, "
  37. . "reminders.email_time, "
  38. . "reminders.email_next_dt, "
  39. . "reminders.email_subject, "
  40. . "reminders.email_html, "
  41. . "customers.display_name, "
  42. . "emails.id AS email_id, "
  43. . "emails.email AS email_address "
  44. . "FROM ciniki_customer_reminders AS reminders "
  45. . "LEFT JOIN ciniki_customers AS customers ON ("
  46. . "reminders.customer_id = customers.id "
  47. . "AND customers.tnid = '" . ciniki_core_dbQuote($ciniki, $tnid) . "' "
  48. . ") "
  49. . "LEFT JOIN ciniki_customer_emails AS emails ON ("
  50. . "reminders.customer_id = emails.customer_id "
  51. . "AND emails.tnid = '" . ciniki_core_dbQuote($ciniki, $tnid) . "' "
  52. . ") "
  53. . "WHERE reminders.tnid = '" . ciniki_core_dbQuote($ciniki, $tnid) . "' "
  54. . "AND reminders.id = '" . ciniki_core_dbQuote($ciniki, $reminder_id) . "' "
  55. . "";
  56. ciniki_core_loadMethod($ciniki, 'ciniki', 'core', 'private', 'dbHashQueryArrayTree');
  57. $rc = ciniki_core_dbHashQueryArrayTree($ciniki, $strsql, 'ciniki.customers', array(
  58. array('container'=>'reminder', 'fname'=>'id',
  59. 'fields'=>array('id', 'customer_id', 'reminder_date', 'flags', 'repeat_type', 'repeat_interval',
  60. 'repeat_end', 'description', 'category', 'notes', 'email_time', 'email_next_dt',
  61. 'email_subject', 'email_html', 'display_name'),
  62. ),
  63. array('container'=>'emails', 'fname'=>'email_id', 'fields'=>array('email_address')),
  64. ));
  65. if( $rc['stat'] != 'ok' ) {
  66. return array('stat'=>'fail', 'err'=>array('code'=>'ciniki.customers.454', 'msg'=>'Unable to load reminders', 'err'=>$rc['err']));
  67. }
  68. if( !isset($rc['reminder'][0]) ) {
  69. return array('stat'=>'fail', 'err'=>array('code'=>'ciniki.customers.470', 'msg'=>'Unable to find requested reminder'));
  70. }
  71. $reminder = $rc['reminder'][0];
  72. //
  73. // Send the email
  74. //
  75. if( isset($reminder['emails']) && count($reminder['emails']) > 0 ) {
  76. ciniki_core_loadMethod($ciniki, 'ciniki', 'mail', 'hooks', 'addMessage');
  77. foreach($reminder['emails'] as $email) {
  78. $rc = ciniki_mail_hooks_addMessage($ciniki, $tnid, array(
  79. 'customer_id'=>$reminder['customer_id'],
  80. 'customer_email'=>$email['email_address'],
  81. 'customer_name'=>$reminder['display_name'],
  82. 'subject'=>$reminder['email_subject'],
  83. 'html_content'=>$reminder['email_html'],
  84. ));
  85. if( $rc['stat'] != 'ok' ) {
  86. return $rc;
  87. }
  88. }
  89. } else {
  90. error_log("CUSTOMER REMINDERS ERROR -- No emails specified for reminder " . $reminder_id);
  91. }
  92. //
  93. // Update the email_next_dt
  94. //
  95. if( $reminder['repeat_type'] > 0 ) {
  96. $dt = new DateTime($reminder['reminder_date'] . ' 12:00:00', new DateTimezone($intl_timezone));
  97. ciniki_core_loadMethod($ciniki, 'ciniki', 'customers', 'private', 'reminderRepeatNextDate');
  98. $rc = ciniki_customers_reminderRepeatNextDate($ciniki, $tnid, $reminder, $dt);
  99. if( $rc['stat'] != 'ok' ) {
  100. return array('stat'=>'fail', 'err'=>array('code'=>'ciniki.customers.472', 'msg'=>'Unable to calculate next reminder date', 'err'=>$rc['err']));
  101. }
  102. if( $reminder['repeat_end'] != '0000-00-00' ) {
  103. $end_dt = new DateTime($reminder['repeat_end'] . ' 23:59:59', new DateTimezone($intl_timezone));
  104. }
  105. //
  106. // Mark the reminder as sent, don't advance the date
  107. //
  108. if( isset($end_dt) && $end_dt < $rc['next_dt'] ) {
  109. $update_args['flags'] = ($reminder['flags'] | 0x02); // Mark as sent
  110. }
  111. //
  112. // Only advance the date if no end date or end date is in future and next date is different
  113. //
  114. elseif( $rc['next_dt']->format('Y-m-d') != $reminder['reminder_date'] ) {
  115. $update_args['reminder_date'] = $rc['next_dt']->format('Y-m-d');
  116. }
  117. //
  118. // Setup next email date time
  119. //
  120. if( isset($update_args['reminder_date']) ) {
  121. $dt = new DateTime($update_args['reminder_date'] . ' ' . $reminder['email_time'], new DateTimezone($intl_timezone));
  122. $dt->setTimezone(new DateTimezone('UTC'));
  123. $update_args['email_next_dt'] = $dt->format('Y-m-d H:i:s');
  124. }
  125. } else {
  126. $update_args = array('flags' => ($reminder['flags'] | 0x02));
  127. }
  128. if( isset($update_args) && count($update_args) > 0 ) {
  129. //
  130. // Update the reminder
  131. //
  132. ciniki_core_loadMethod($ciniki, 'ciniki', 'core', 'private', 'objectUpdate');
  133. $rc = ciniki_core_objectUpdate($ciniki, $tnid, 'ciniki.customers.reminder', $reminder['id'], $update_args, 0x04);
  134. if( $rc['stat'] != 'ok' ) {
  135. return array('stat'=>'fail', 'err'=>array('code'=>'ciniki.customers.457', 'msg'=>'Unable to update the reminder'));
  136. }
  137. }
  138. return array('stat'=>'ok');
  139. }
  140. ?>