Òåñòîâîå çàäàíèå: ìîäóëü `factory_bridge` (Drupal + SQLite)

Çàäàíèå çàêðûòî
Ñòîèìîñòü:800 ðóáëåé
Ñðîê âûïîëíåíèÿ:2 äíÿ
Âàðèàíòû îïëàòû:Ïî äîãîâîðåííîñòè
Äàòà ïóáëèêàöèè:2026-01-16 10:36
Îáíîâëåíî:2026-01-21 14:43
Áûë íà ñàéòå:2026-01-22 10:20

Òåñòîâîå çàäàíèå: ìîäóëü `factory_bridge` (Drupal + SQLite)

 
Çàäà÷à

## 1. Î ïðîåêòå è ìîòèâàöèè

Ìû ïåðåíîñèì ïðîèçâîäñòâåííóþ ñèñòåìó ó÷¸òà (èçäåëèÿ, îïåðàöèè, ðàáî÷åå âðåìÿ) íà **Drupal**.
Ñåé÷àñ äàííûå õðàíÿòñÿ âî âíåøíåé **SQLite-áàçå**, â áóäóùåì **Drupal äîëæåí ñòàòü îñíîâíîé ñèñòåìîé** õðàíåíèÿ, ðàñ÷¸òîâ è îòîáðàæåíèÿ äàííûõ.

Òåñòîâîå çàäàíèå — **ðåàëüíàÿ ÷àñòü áóäóùåãî ïðîåêòà**, à íå ó÷åáíûé ïðèìåð.
Ïî åãî ðåçóëüòàòàì ìû âûáèðàåì ðàçðàáîò÷èêà äëÿ **äîëãîñðî÷íîé ðàáîòû** íàä ñèñòåìîé.

---

## 2. Êîðîòêî è ïðîñòûìè ñëîâàìè

Åñëè ñîâñåì ïðîñòî:

Åñòü ñòàðàÿ ñèñòåìà íà SQLite è åñòü Drupal.
Íóæíî íàïèñàòü ìîäóëü, êîòîðûé **ðåãóëÿðíî ïåðåíîñèò äàííûå èç SQLite â Drupal**, ñ÷èòàåò ïîêàçàòåëè ïëàí/ôàêò è ïîêàçûâàåò èõ â âèäå îò÷¸òà.

* SQLite — èñòî÷íèê äàííûõ (òîëüêî ÷òåíèå)
* Drupal — ìîíèòîð è áóäóùèé öåíòð ñèñòåìû
* Îáíîâëåíèå äàííûõ — **ïî cron**, à íå ïðè îòêðûòèè ñòðàíèö

---

## 3. Îáùàÿ ñòðóêòóðà çàäàíèÿ

1. Ïîäêëþ÷åíèå ê SQLite ÷åðåç Drupal Database API
2. Èìïîðò äàííûõ èç SQLite (îãðàíè÷åííûé íàáîð òàáëèö)
3. Ðàñ÷¸òû ïëàí / ôàêò / äå...

Âèäåòü ïîëíóþ èíôîðìàöèþ è îñòàâëÿòü çàÿâêè ìîãóò òîëüêî àâòîðèçîâàííûå ïîëüçîâàòåëè.

Îïòèìèçèðîâàíî è àãðåãèðîâàíî ÈÈ:

Ìû èùåì ðàçðàáîò÷èêà äëÿ ñîçäàíèÿ ìîäóëÿ `factory_bridge` â Drupal, êîòîðûé áóäåò ðåãóëÿðíî ïåðåíîñèòü äàííûå èç âíåøíåé SQLite áàçû äàííûõ â Drupal. Ìîäóëü äîëæåí ïîäêëþ÷àòüñÿ ê SQLite ÷åðåç Drupal Database API, èìïîðòèðîâàòü äàííûå îá èçäåëèÿõ è îïåðàöèÿõ, âûïîëíÿòü ðàñ÷¸òû ïëàí/ôàêò/äåëüòà íà ñòîðîíå PHP, ñîõðàíÿòü ðåçóëüòàòû â áàçå äàííûõ Drupal è îòîáðàæàòü îò÷¸òû â âèäå òàáëèö. Îáíîâëåíèå äàííûõ äîëæíî ïðîèñõîäèòü ïî cron, à íå ïðè îòêðûòèè ñòðàíèö. Âàæíî, ÷òîáû àðõèòåêòóðà ðåøåíèÿ áûëà êîððåêòíîé è ñîîòâåòñòâîâàëà òðåáîâàíèÿì. Äëÿ âûïîëíåíèÿ ýòîãî çàäàíèÿ ïîòðåáóþòñÿ íàâûêè ðàáîòû ñ Drupal (âåðñèè 10 èëè 11), âêëþ÷àÿ ñîçäàíèå ìîäóëåé è ðàáîòó ñ Drupal Database API, à òàêæå îïûò ðàáîòû ñ SQLite. Íåîáõîäèìû çíàíèÿ PHP äëÿ âûïîëíåíèÿ áèçíåñ-ëîãèêè è ðàñ÷¸òîâ, à òàêæå ïîíèìàíèå ðàáîòû cron çàäà÷. Íàâûêè ðàáîòû ñ Twig áóäóò ïîëåçíû äëÿ îòîáðàæåíèÿ äàííûõ.
Çäðàâñòâóéòå! Îçíàêîìèëñÿ ñ òåõíè÷åñêèì çàäàíèåì. Çàäà÷à ìíå ïîëíîñòüþ ïîíÿòíà: ýòî êëàññè÷åñêèé ïðîöåññ ïîñòðîåíèÿ ETL-ñëîÿ (Extract, Transform, Load) âíóòðè Drupal äëÿ ìèãðàöèè äàííûõ èç legacy-ñèñòåìû â ñîâðåìåííóþ àðõèòåêòóðó. Èìåþ áîëüøîé îïûò ðàáîòû ñ Drupal Database API è ñîçäàíèåì êàñòîìíûõ ñóùíîñòåé.
Ìîäóëü factory_bridge - ýòî ìîñò ìåæäó ñòàðîé ïðîèçâîäñòâåííîé ñèñòåìîé íà SQLite è íîâîé ñèñòåìîé íà Drupal. Îí ðåãóëÿðíî èìïîðòèðóåò è àãðåãèðóåò ïðîèçâîäñòâåííûå äàííûå, ðàññ÷èòûâàåò êëþ÷åâûå ïîêàçàòåëè (ïëàí/ôàêò/äåëüòà) è ñîõðàíÿåò èõ â Drupal äëÿ ïîñëåäóþùåãî îòîáðàæåíèÿ â âèäå îò÷¸òîâ.
1. Ìîäóëü factory_bridge îáåñïå÷èâàåò àâòîìàòèçèðîâàííûé ïåðåíîñ è ñèíõðîíèçàöèþ ïðîèçâîäñòâåííûõ äàííûõ èç âíåøíåé SQLite-áàçû (workshop_bot.db) â Drupal, ãäå ýòè äàííûå àãðåãèðóþòñÿ, ðàññ÷èòûâàþòñÿ êëþ÷åâûå ïîêàçàòåëè (ïëàíîâûå è ôàêòè÷åñêèå òðóäîçàòðàòû, äåëüòà) è ñîõðàíÿþòñÿ äëÿ äàëüíåéøåãî àíàëèçà è îòîáðàæåíèÿ. Òàêèì îáðàçîì, ìîäóëü ïðåâðàùàåò Drupal â îñíîâíîé öåíòð õðàíåíèÿ, ðàñ÷¸òîâ è ìîíèòîðèíãà ïðîèçâîäñòâåííûõ ïðîöåññîâ, îáåñïå÷èâàÿ ïëàâíûé ïåðåõîä îò ñòàðîé ñèñòåìû ê íîâîé áåç ïîòåðè äàííûõ è ñ âîçìîæíîñòüþ ðåãóëÿðíîãî îáíîâëåíèÿ èíôîðìàöèè
2. Ìîäóëü ïîëó÷àåò èç SQLite òîëüêî äàííûå èç òð¸õ òàáëèö:
order_items - èçäåëèÿ (ïðîäóêöèÿ, íàä êîòîðîé âåä¸òñÿ ó÷¸ò);
assigned_tasks - îïåðàöèè (òåõíîëîãè÷åñêèå ýòàïû èëè çàäà÷è, ñâÿçàííûå ñ èçäåëèÿìè);
work_sessions - ðàáî÷èå ñåññèè (ó÷¸ò âðåìåíè ðàáîòû ïî îïåðàöèÿì).
Èç ýòèõ òàáëèö èçâëåêàþòñÿ:
èäåíòèôèêàòîðû èçäåëèé è îïåðàöèé,
ïëàíîâûå íîðìû âðåìåíè (applied_norm_hours),
ôàêòè÷åñêèå èíòåðâàëû ðàáîòû (ðàçíèöà ìåæäó end_time è start_time äëÿ çàâåðø¸ííûõ ñåññèé),
è äðóãàÿ íåîáõîäèìàÿ èíôîðìàöèÿ äëÿ ðàñ÷¸òà ïîêàçàòåëåé ïî êàæäîìó èçäåëèþ è îïåðàöèè
3. Èìïîðò è îáíîâëåíèå äàííûõ âûïîëíÿþòñÿ òîëüêî ïî ðàñïèñàíèþ ÷åðåç cron (ñòàíäàðòíûé ìåõàíèçì Drupal èëè îòäåëüíàÿ cron-çàäà÷à ìîäóëÿ).
Ïðè êàæäîì çàïóñêå cron ìîäóëü:
Ïîäêëþ÷àåòñÿ ê SQLite ÷åðåç öåíòðàëèçîâàííûé ñåðâèñ íà áàçå Drupal Database API;
×èòàåò íîâûå è èçìåí¸ííûå äàííûå èç óêàçàííûõ òàáëèö;
Âûïîëíÿåò âñå íåîáõîäèìûå ðàñ÷¸òû (ïëàí, ôàêò, äåëüòà) íà ñòîðîíå PHP;
Ñîõðàíÿåò àãðåãèðîâàííûå ðåçóëüòàòû â ñóùíîñòè Drupal (íàïðèìåð, â êàñòîìíîé content entity);
Íà ñòðàíèöàõ Drupal îòîáðàæàþòñÿ òîëüêî óæå ñîõðàí¸ííûå äàííûå — íèêàêèõ ïðÿìûõ çàïðîñîâ ê SQLite èëè ïåðåñ÷¸òîâ ïðè îòêðûòèè ñòðàíèö íå ïðîèñõîäèò.
Åâãåíèé Ðàòíèêîâ
Îñíîâíàÿ ñïåöèàëèçàöèÿ: Âåá-ðàçðàáîòêà è Ïðîäóêòîâûé äèçàéí
    Çäðàâñòâóéòå. Ìåíÿ çîâóò Åâãåíèé. Îïûò â ïðîãðàììèðîâàíèè - 12 ëåò. Ãîòîâ ðåàëèçîâàòü äàííûé ïðîåêò. Ìîè êîíòàêòû:
    +375259058217 (WhatsApp, Telegram)
    eratnikstudio@gmail.com

    Îòâåòû íà âîïðîñû:
    Ìîäóëü factory_bridge — ýòî ïåðåõîäíûé ìîñò, êîòîðûé ïåðåíîñèò äàííûå èç ñòàðîé ñèñòåìû (SQLite) â íîâóþ (Drupal), ÷òîáû ïîñòåïåííî ïåðåéòè íà Drupal êàê îñíîâíóþ ñèñòåìó.

    ×òî äåëàåò ìîäóëü:
    1. Ñîáèðàåò äàííûå èç òð¸õ òàáëèö SQLite: èçäåëèÿ (order_items), îïåðàöèè (assigned_tasks) è ôàêòè÷åñêîå âðåìÿ ðàáîòû (work_sessions).
    2. Ñ÷èòàåò ïîêàçàòåëè (ïëàí/ôàêò/äåëüòà) íà PHP, èñïîëüçóÿ ïëàíîâûå íîðìî-÷àñû è ôàêòè÷åñêîå âðåìÿ ðàáîò.
    3. Îáíîâëÿåò äàííûå â Drupal ïî cron — ðàç â íåñêîëüêî ÷àñîâ â ôîíå, à íå êîãäà ïîëüçîâàòåëü îòêðûâàåò ñòðàíèöó.

     èòîãå: Ìîäóëü ïîêàçûâàåò ãîòîâûé îò÷¸ò â Drupal èç óæå ñîõðàí¸ííûõ äàííûõ, ÷òîáû ñòðàíèöû îòêðûâàëèñü áûñòðî.
    Ãîòîâ ðàçðàáîòàòü ìîäóëü factory_bridge äëÿ Drupal ñ ïîëíûì ñîáëþäåíèåì òðåáîâàíèé.
    20:52 19.01.26
    Äëÿ òî÷íîé îöåíêè è êîððåêòíîé ðåàëèçàöèè óòî÷íèòå:
    Òðåáîâàíèÿ ê ñóùíîñòè èçäåëèÿ: íóæíî ëè ñîçäàâàòü Node type èëè äîñòàòî÷íî Custom Entity? Êàêèå ïîëÿ äîëæíû áûòü ó ñóùíîñòè ïîìèìî ðàñ÷¸òíûõ äàííûõ (íàçâàíèå, êîä, ñòàòóñ è ò.ä.)?
    Êàê îáðàáàòûâàòü ñèòóàöèè, êîãäà ó îïåðàöèè íåñêîëüêî ðàáî÷èõ ñåññèé? Ñóììèðîâàòü âñå çàâåðø¸ííûå ñåññèè?
    Íóæíà ëè äîïîëíèòåëüíàÿ ëîãèêà: ôèëüòðàöèÿ ïî äàòàì, ó÷¸ò ïåðåðûâîâ, èñêëþ÷åíèå îïðåäåë¸ííûõ òèïîâ îïåðàöèé?
    Êàêàÿ ïåðèîäè÷íîñòü îáíîâëåíèÿ äàííûõ îïòèìàëüíà (åæå÷àñíî, ðàç â äåíü)?
    Íóæåí ëè èíòåðôåéñ àäìèíèñòðàòîðà äëÿ ðó÷íîãî çàïóñêà èìïîðòà?
    Êàê âûáèðàåòñÿ èçäåëèå äëÿ îò÷¸òà (ïî ID, ÷åðåç ôèëüòð, ïîñëåäíåå îáíîâë¸ííîå)?
    Íóæíà ëè ïàãèíàöèÿ/ôèëüòðàöèÿ åñëè îïåðàöèé ìíîãî?
    Åñòü ëè ïðèìåðû SQL-çàïðîñîâ äëÿ âûáîðêè äàííûõ èç SQLite?
    Íóæíà ëè îáðàáîòêà îøèáîê ïîäêëþ÷åíèÿ/èìïîðòà ñ óâåäîìëåíèÿìè?
    Ìîäóëü factory_bridge îáåñïå÷èâàåò èíòåãðàöèþ äàííûõ èç SQLite â Drupal, âêëþ÷àÿ èìïîðò, ðàñ÷¸òû ïëàí ôàêò äåëüòà è îòîáðàæåíèå îò÷¸òîâ äëÿ ïðîèçâîäñòâåííîé ñèñòåìû ó÷¸òà.

    Äàííûå èç òàáëèö order_items (èçäåëèÿ), assigned_tasks (îïåðàöèè) è work_sessions (ðàáî÷èå ñåññèè).

    Îáíîâëåíèå ïðîèñõîäèò àâòîìàòè÷åñêè ïî cron; ñòðàíèöû èñïîëüçóþò òîëüêî ñîõðàí¸ííûå äàííûå.
    Çäðàâñòâóéòå. Ïèøèòå. Ñäåëàþ.
    Çäðàâñòâóéòå ÿ ãîòîâà âàì ïîìî÷ü
    16:43 21.01.26
    Ñêàæèòå, ÷òî íàäî äåëàòü
    Çäðàâñòâóéòå! Îçíàêîìèëñÿ ñ ÒÇ íà ñîçäàíèå ìîäóëÿ èíòåãðàöèè. Ìîé ïîäõîä áàçèðóåòñÿ íà ñîçäàíèè ðàñøèðÿåìîé àðõèòåêòóðû, ñîîòâåòñòâóþùåé ñòàíäàðòàì Drupal (Coding Standards).

    Ñóòü ïðåäëîæåíèÿ: ß ïðåäëàãàþ ðåàëèçîâàòü ìîäóëü factory_bridge êàê ñåðâèñ-îðèåíòèðîâàííîå ðåøåíèå. Äàííûå èç SQLite áóäóò àãðåãèðîâàòüñÿ â Drupal ÷åðåç Custom Entities, ÷òî îáåñïå÷èò ìàêñèìàëüíóþ ïðîèçâîäèòåëüíîñòü è ãèáêîñòü â áóäóùåì (ïîääåðæêà ðåâèçèé, ïðàâ äîñòóïà è ñëîæíûõ îò÷åòîâ ÷åðåç Views).

    Îòâåòû íà îáÿçàòåëüíûå âîïðîñû:

    Çàäà÷à: Ñîçäàíèå ETL-ñëîÿ äëÿ ïåðåíîñà äàííûõ èç èçîëèðîâàííîé SQLite â Drupal ñ ïðåäâàðèòåëüíûì ðàñ÷åòîì ïðîèçâîäñòâåííûõ ìåòðèê.

    Äàííûå: Èçäåëèÿ (order_items), ïëàíîâûå ïîêàçàòåëè (assigned_tasks) è ôàêòè÷åñêîå âðåìÿ èç ñåññèé (work_sessions).

    Îáíîâëåíèå: Ðåãóëÿðíî ïî Cron. PHP-ñåðâèñ çàáèðàåò äàííûå, âû÷èñëÿåò äåëüòó è ñîõðàíÿåò ðåçóëüòàò â Drupal. Ñòðàíèöû îòîáðàæàþò óæå ãîòîâûå äàííûå èç ÁÄ Drupal áåç îáðàùåíèÿ ê âíåøíèì ôàéëàì.

    Òåõíè÷åñêèå äåòàëè:

    Ïîäêëþ÷åíèå âíåøíåé ÁÄ ÷åðåç $databases â settings.php (Drupal Database API).

    Ëîãèêà ðàñ÷åòîâ âûíåñåíà â îòäåëüíûé ñåðâèñ (factory_bridge.calculator).

    Õðàíåíèå àãðåãèðîâàííûõ äàííûõ: Content Entities (ëó÷øå, ÷åì Node, äëÿ ÷èñòîãî ó÷åòà).

    Àëüòåðíàòèâíûå âàðèàíòû (íà îáñóæäåíèå):

    Queue API: Åñëè äàííûõ ñòàíåò ìíîãî, ïåðåíåñó èìïîðò â î÷åðåäè, ÷òîáû Cron íå «ïàäàë» ïî òàéìàóòó ïðè ðàñ÷åòàõ áîëüøèõ îáúåìîâ.

    State API / Key-Value: Äëÿ õðàíåíèÿ ìåòîê âðåìåíè ïîñëåäíåãî óñïåøíîãî èìïîðòà, ÷òîáû îáðàáàòûâàòü òîëüêî íîâûå ñåññèè (èíêðåìåíòàëüíûé èìïîðò), à íå ïåðåñ÷èòûâàòü âñ¸ ñ íóëÿ.

    Views Integration: Âìåñòî æåñòêî çàäàííîãî øàáëîíà òàáëèöû, ÿ ìîãó ïðîáðîñèòü äàííûå â ìîäóëü Views — ýòî ïîçâîëèò âàì â áóäóùåì ìåíÿòü ñòðóêòóðó îò÷åòà (ôèëüòðû, ñîðòèðîâêè) ÷åðåç àäìèíêó áåç ïðàâêè êîäà.

    Íàñòðîåí íà äîëãîñðî÷íîå ñîòðóäíè÷åñòâî. Ãîòîâ ïðèñòóïèòü ê ðåàëèçàöèè òåñòîâîãî çàäàíèÿ ñåãîäíÿ.
    Äàíèèë Äàâûäåíêî
    Îñíîâíàÿ ñïåöèàëèçàöèÿ: Èíæåíåðèÿ è Ïðîåêòèðîâàíèå
      Çäðàâñòâóéòå! Ãîòîâ âûïîëíèòü çà 1 äåíü, îïûò â Drupal è SQL áîëüøîé.

      Îñòàâëÿòü çàÿâêè ìîãóò òîëüêî àâòîðèçîâàííûå ïîëüçîâàòåëè.

      Äðóãèå îòêðûòûå çàäàíèÿ:

      ïîèñê çàäàíèé