bgerp/bgerp — Issue #117: email_Sent - клас за изпращане на писма
Author: milengg
Created: 2011-11-15 10:55:20+00:00
State: open

Този клас ще е в основата на изпращането на писма от системата. Той има за цел да:

1. Осигури изпращането на документи, които поддържат интерфейса `emai_DocumentIntf` към електронна поща
2. Поддържането на лог-информация, кой документ към кой пощенски адрес е изпратен и кога;
3. Даването на възможност чрез специален линк прикрепен в началото на текстовата част на изпратения документ да се отваря оригинала на документа, както е на сървъра (линк Ako ne ce chete, vizhte tuk: ..... )

Интерфейса `emai_DocumentIntf` трябва да има следните методи:

1. getEmailText($id, $emailTo, $subject, $boxFrom);
2. getEmailHtml($id, $emailTo, $subject, $boxFrom);
3. getEmailAttachments($id); // Масив от прикачените файлове
4. getDefaultSubject($id); // Какъв да е събджекта на писмото по подразбиране
5. getDefaultEmailTo($id); // До кой е-мейл или списък с е-мейли трябва да се изпрати писмото
5. getDefaultBoxFrom($id); // Id на пощенска кутия от нашата система
5. getInReplayTo($id); // msgId на писмото на което в отговор е направен този постинг

На този етап се предвижда да се изпращат следните документи по е-майл, т.е. да имат интерфейса `emai_DocumentIntf`:

1. `email_Messages` - водящи писма;
2. `doc_Posting` - документ с общо предназначение в системата. Текстова информация
3. `blast_Email` - документ - циркулярно писмо
4. `doc_Inquiry` - запитване в свободен формат
5. `sales_Quotation` - оферта

Останалите документи ще се изпращат по следния начин:
Документа има бутон *Емейл , който като се натисне се създава документ `doc_Posting`. Новосъздадения документ има няколко изречения и линк за отваряне на съществуващия документ.

За удобство, `doc_ThreadDocuments` трябва да реализират метод `doc_ThreadDocuments::getEmailDocument($threadDocumentId)`, който да връща обект, със вътрешно състояние - `id`-то на документа (от неговия мениджър), и с методи - същите, като на интерфейса, само че без параметъра `$id`.

Основнитите методи на `еmail_Sent` ще бъдат:

1. `$email_Sent->send($threadDocumentId, $emailTo, $subject = NULL, $boxFrom = NULL, $options = array())` . При задействането му, ще се изпълняват следните действия:

// `$options` е списък, съставен от следните елементи:
// - `no_thread_hnd` - не добавя идентификатор на треда от който е изпратено писмото в `subject`-а
// - `attach` - добавя прикачените файлове към писмото. Иначе те са само линкнати в html и txt частта
// - `ascii` - конвертира текстовата част до ascii символи
$options = arr::make($options, TRUE);

// Вземаме интерфейса doc_DocumenInterface за дадения документ (този метод още не е реализиран)
$emlDoc= doc_ThreadDocuments::getEmailDocument($threadDocumentId);
$html = $emlDoc->getEmailHtml($emailTo, $subject, $boxFrom);
$text = $emlDoc->getEmailText($emailTo, $subject, $boxFrom);
if( $options['attach']) $attachments = $emlDoc->getAttachments();

// Трябва да се добави`<манипулатор_на_треда>` към subject-a
if(empty($options['no_thread_hnd']) $this->subjectDecorate($subject, $threadDocumentId);

// Трябва да вземем евентуално messageId-то на писмото, на което е отговор настоящия документ
// Това е за да сме съвместими с външни системи за организация на писма, като gMail
// $inReplayTo = $emlDoc->getInReplayTo();

// $mid - трябва да генерираме уникален случаен манипулатор на изпратеното съобщение
$mit = str::getUniqId() // Тук трябва цикъл, който да проверява дали вече не сме го използвали

// Трябва да заместим в $text и $html [#mid#] => $mid

Вече имаме всички данни да изпратим писмото и да запишем в лога:
- threadId - index
- threadDocumentId
- mid - unique
- emailTo
- subject ( 255)
- fromBox
- createdOn - index
- createdBy
- returnedOn
- receivedOn
- receivedByIp