LINUX.ORG.RU

MyCompany 6.0

 , , ,

MyCompany 6.0

0

1

Опубликован выпуск 6.0 MyCompany – бесплатного и открытого программного обеспечения для автоматизации малого и среднего бизнеса, основанного на платформе lsFusion. Исходный код доступен на GitHub под лицензией Apache 2.0, что позволяет разработчикам адаптировать и распространять решения под собственной торговой маркой.

В новой версии добавлены модули «Проекты», «Кадры» и «CRM», а также реализован переход на шестую версию платформы lsFusion, которая предлагает улучшенный дизайн и расширенные возможности.

  • Модуль «Проекты» предоставляет инструменты для планирования и отслеживания выполнения задач, назначения сотрудников, учета времени и ресурсов. Задачи можно классифицировать, приоритизировать и визуализировать с помощью канбан-доски и диаграммы Ганта.

  • Модуль «Кадры» включает функциональность подбора персонала, расчета заработной платы и учета рабочего времени. Система позволяет регистрировать анкеты кандидатов, отслеживать взаимодействие с ними и автоматизировать процесс найма.

  • Модуль «CRM» обеспечивает управление взаимодействием с клиентами, включая регистрацию обращений, планирование действий и анализ эффективности коммуникаций.

  • Также были существенно доработаны существующие модули Склад, Расчеты, Закупка, Продажа, Розница и Производство.

Почти весь исходный код написан на встроенном высокоуровневом языке платформы lsFusion, что позволяет легко и быстро дорабатывать систему под конкретные задачи.

MyCompany устанавливается на «чистую» виртуальную машину (apt-based) одним скриптом и не требует никаких лицензий или регистраций :

source <(curl -s https://download.lsfusion.org/solutions/install-mycompany-ubuntu18-ru.sh)

Демо-версию приложения можно попробовать без регистрации по ссылке: https://demo.lsfusion.org/mycompany-ru.

>>> Подробнее в блоге компании на habr.com

>>> Полный список изменений на GitHub



Проверено: dataman ()
Последнее исправление: dataman (всего исправлений: 2)

Прекратите называть программным обеспечением веб-браузерные скрипты. Программное обеспечение это самодостаточная программа, которая запускается самостоятельно не в окне веб-браузера.

Hangover
()

Это бизнесовая часть управления компанией, ну хорошо и нужно. А есть какая-то интеграция с неким аналогом Джиры и прочим таск-менеджментом? Интересно может получиться, интеграция «процесса сверху» и «процесса снизу». Не знаю, нужно ли это кому?

gns ★★★★★
()
Ответ на: комментарий от Hangover

Утечки в криокамере!

Утечки в криокамере!

special-k ★★★★
()
Ответ на: комментарий от Hangover

программным обеспечением веб-браузерные скрипты

скрипты - сами по себе есть программа/программный продукт.
другое дело, что они являются «некомпилируемыми» (*) и исполняются на стороне сервера - но суть от этого не меняется.
(*) - да и не факт, что данный скрипт не «обработан» :о)

sunjob ★★★★★
()
Последнее исправление: sunjob (всего исправлений: 1)
Ответ на: комментарий от gns

Встроенной какой-то общей интеграции пока, к сожалению, нет. Обычно делаются интеграции через JSON API на внутреннем языке lsFusion.

Но там есть своя встроенная логика работы с задачами (понятно, что не такая мощная, как в Jira, но все же). Там есть и канбан, и отметка времени и диаграмма Ганта.

CrushBy
() автор топика
// Заголовок модуля
MODULE LanguageExample;

REQUIRE System;

NAMESPACE Example;

// Тело модуля

// Объявление классов
CLASS Employee;
CLASS Company;

// Объявление свойств
name(employee) = DATA BPSTRING[100](Employee);
age(employee) = DATA INTEGER(Employee);
company(employee) = DATA Company(Employee);

name(company) = DATA BPSTRING[100](Company);

// Объявление формы
FORM employeeForm
    OBJECTS e = Employee
    PROPERTIES(e) name, age, company
;

// Добавление формы в навигатор
NAVIGATOR {
    NEW employeeForm;
}

Ну не знаю… такое чувство, что просто формы сейчас мало кому нужны.

Неужели нельзя воспользоваться существующим языком с мощным синтаксисом, тем же ruby например (js, dart…).

special-k ★★★★
()
Ответ на: комментарий от special-k

Ну не знаю… такое чувство, что просто формы сейчас мало кому нужны.

Так там не только формы. Там вся сложная логика с событиями, статусами и многим другим тоже есть.

Неужели нельзя воспользоваться существующим языком с мощным синтаксисом, тем же ruby например (js, dart…).

Каждый язык описывает и подходит только для своей архитектуры. Использовать синтаксис языков общего назначения для высокоуровневой декларативной «low-code» архитектуры - идея так себе и имеет много минусов. Когда создавали SQL тоже же не взяли C++ подобный синтаксис.

Мы подробно это расписывали вот в этой статье : https://habr.com/ru/companies/lsfusion/articles/539138/

CrushBy
() автор топика

Демо-версию приложения можно попробовать без регистрации по ссылке: https://demo.lsfusion.org/mycompany-ru.

Выделение красным и повторное выделение каким-то темно-бордовым после щелчка мышью поменяйте на что-то менее агрессивное. Черный текст поверх такого выделения совсем не читаем. Лопни мои глаза!

gns ★★★★★
()
Ответ на: комментарий от CrushBy

Да, но есть же DSL, и вот ruby очень применим для DSL. В общем я выступаю всегда за реализацию DSL в рамках языка с развитым синтаксисом и против новых языков и всяких декларативных конструкций (а-ля XML, json).

special-k ★★★★
()
Ответ на: комментарий от CrushBy

Когда создавали SQL тоже же не взяли C++ подобный синтаксис.

Когда создавали SQL, ни C++, ни C ещё не было. Кроме того, идея была в создании языка, близкого к «обычному» английскому языку, чтобы любая кухарка могла управлять государством делать выборки данных.

static_lab ★★★★★
()
Ответ на: комментарий от Hangover

Правильно! Жабоскрипу нет пути! Так победим!

Smacker ★★★★★
()
Ответ на: комментарий от gns

Там особо нет нигде красного и темно-бордового цвета (ну кроме определенных статусов или других одиночных ячеек). Можете сказать на какой форме и что именно, или скрин сделать с этой формы ? Там везде должны быть спокойные цвета.

CrushBy
() автор топика
Ответ на: комментарий от special-k

Да, но есть же DSL, и вот ruby очень применим для DSL. В общем я выступаю всегда за реализацию DSL в рамках языка с развитым синтаксисом и против новых языков и всяких декларативных конструкций (а-ля XML, json).

Дело в том, что классические языки программирования создавались для императивной логики выполнения. То есть там есть последовательность выполнения команд, циклы, ветвления, появления новых переменных в определенных местах. Кроме того, в стандартных синтаксисах ruby и прочих есть вопросы по множественному наследованию и параллелизму по многим параметрам.

А в lsFusion последовательность выполнения есть, но основной принцип задания логики там через декларативность. То есть задаются формулы/правила вычисления (как в математике). И тут нужен был другой синтаксис.

CrushBy
() автор топика
Ответ на: комментарий от static_lab

Кроме того, идея была в создании языка, близкого к «обычному» английскому языку, чтобы любая кухарка могла управлять государством делать выборки данных.

У lsFusion та же идея. Там ниже порог вхождения, и менее квалифицированные люди могут на нем писать. Поэтому и язык ближе к английскому во многих местах.

CrushBy
() автор топика
Ответ на: комментарий от CrushBy

Ну скрин мне положить особо некуда, а сюда картинки не вставляются. Идем на демо-страницу по ссылке, открываем вкладку «Задачи». Появляется канбан-доска. В окне с канбан-доской еще три вкладки:«Канбан», «Задачи», «Диаграммы Ганта». Щелкаем по вкладке «Задачи», видим часть задач, засвеченных красным. Щелкаем по любой колонке в красной строке. Наслаждаемся.

gns ★★★★★
()
Ответ на: комментарий от CrushBy
CLASS Company;
name(company) = DATA BPSTRING[100](Company);

///

amount 'Amount' = ABSTRACT NUMERIC[14,2] (SalesLedger, SalesAccount) MATERIALIZED;

///

apiGetPBX 'Get PBX' () {
    NEWSESSION {
        apiGet('/v1/pbx/internal/', '');

        IMPORT getPBX JSON FROM apiResponse();

        pbxID() <- pbx_id();
        FOR imported(INTEGER number) AND NOT pbxNumber(numbers(number)) DO NEW p = PBXNumber {
            id(p) <- numbers(number);
        }
        
        APPLY;
    }
}

Мне не кажется, что этот язык ближе к английскому, чем SQL, и что у этого языка ниже порог вхождения — тут довольно много концепций, с которыми неспециалисты не знакомы.

static_lab ★★★★★
()
Ответ на: комментарий от DrRulez

А что вы хотите от сервер-клиентского решения? Вот внёс ты изменения, обновил сайт и всё работает. А если это приложение, то его скачать, заново установить надо, а если кто-то продолжает на старом работать, будут ещё и проблемы какиенить. И приложения-то нонче всё в электрон запихутые.

R_He_Po6oT ★★★★★
()
Ответ на: комментарий от static_lab

Да, но если взять человека, который не знает ruby/python, а будет изучать с нуля, то такой синтаксис все равно будет понятнее, чем на классических языках программирования.

Первый пример кода - это простое объявление полей. Параметры там можно писать как слева, так и справа. Разница в том, что классы - «открытые». То есть можно объявить класс где угодно, и поля где угодно. Ключевое отличие, что поля можно объявлять сразу для нескольких классов. То есть, например, остаток для склада/товара (в классическом программировании вообще непонятно куда его запихивать - то ли в класс Склад, то ли в Склад товар. Да и то придется Map’ы делать). Все это гораздо менее понятно, чем onHand (Stock, Item) = DATA NUMERIC; или onHand = DATA NUMERIC (Stock, Item);

Второй пример - это абстрактное объявление свойства (типа абстрактного метода) с возможностью позднее для определенных классов задать свою «реализацию» (способ расчета, например).

Третий же пример показывает лаконичность языка. Там открывается новая «сессия изменений», затем делается HTTP запрос к внешнему сервису, разбор полученного JSON, а потом создание новых внутренних номеров АТС, если их еще нет в базе. А потом APPLY - начинает транзакцию и применяет все изменения в базу (до этого они пишутся во временные таблицы).

Даже, если бы это было в синтаксисе ruby, то даже для опытного разработчика это бы не сильно помогло в изучении самой архитектуры платформы.

CrushBy
() автор топика
Ответ на: комментарий от CrushBy

Но в идиоматичном Ruby это выглядело бы условно как-то так:

class PBXApi < BaseApi
  def self.get_internal_pbx
    get_json('/v1/pbx/internal/')
  end
end

def get_pbx
  data = PBXApi.get_internal_pbx
  numbers = data['numbers']

  ActiveRecord::Base.transaction do
    numbers.each do |number|
      PBXNumber.find_or_create_by!(id: number)
    end
  end
end

Я думаю, что это сильно проще, нагляднее и понятнее даже для незнакомого с архитектурой вашей платформы человека.

Не перевёл на ruby только строку pbxID() <- pbx_id(); Вообще выглядит так, что в коде у вас активно применяются какие-то контекстные сущности типа imported(), apiResponse(), которые изменяются неявно при исполнении вышележащего кода. Это не очень хорошо в общем случае. Что, если вам необходимо обратиться сразу к двум апишкам?

static_lab ★★★★★
()
Ответ на: комментарий от CrushBy

Разница в том, что классы - «открытые». То есть можно объявить класс где угодно, и поля где угодно. Ключевое отличие, что поля можно объявлять сразу для нескольких классов.

В ruby тоже так можно: создаёшь модуль, объявляешь там поля, бизнес-правила для них, необходимые функции, затем инклюдишь в нужные сущности.

static_lab ★★★★★
()
Ответ на: комментарий от AleksK

Не открывается без vpn.

Добро пожаловать в интернет.

В общем бесполезная байда типа odoo.

Работал с ним - интерфейс какие-то инопланетяне делали.

zabbal ★★★★★
()
Ответ на: комментарий от static_lab

Там все осложняется в то, что это все нужно транслировать в plain SQL. То есть в lsFusion никаких вычислений на сервере приложений не идет вообще, а все компилируется в SQL запросы и выполняется на сервере БД. У этого есть свои как преимущества, так и недостатки. Преимущества в том, что там можно вставлять в середине MATERIALIZED и прозрачно балансировать запись/чтение. Вот тут было подробно описано как это сделано : https://habr.com/ru/companies/lsfusion/articles/459066/

В общем, ruby скомпилировать в SQL - нереально. А вот этот язык - прекрасно компилируется.

Вообще выглядит так, что в коде у вас активно применяются какие-то контекстные сущности типа imported(), apiResponse()

Там важно понимать логику «сессий», которые создаются NEWSESSION. У вас может быть объявлена одно свойство типа imported или apiResponse, но если обращаться к ним внутри разных NEWSESSION { }, то их значения и поведения будут целиком независимы. Более того, можно в разных сессиях писать в обычные поля, и пока не произойдет APPLY, они будут писаться в разные временные таблицы и не будут видеть друг другу.

Тут все больше станет на свои места, если рассматривать lsFusion как расширение именно РСУБД в сторону платформы для разработки, а не расширение классических императивных языков программирования.

CrushBy
() автор топика
Ответ на: комментарий от static_lab

Внутри любого действия можно объявлять также свои внутренние LOCAL «переменные» (которые на самом деле временные таблицы) и записывать значения туда-сюда (это будет фактически INSERT INTO FROM SELECT). Но опять же, всегда в каждом API можно использовать свои собственные «свойства» (типа pbx_id), учитывая, что в каждом модуле есть свой NAMESPACE. Можете сделать миллион модулей, в которых будут «свойства» с именем abc, но с разными пространствами имен.

В целом, тут важно понимать, что в продакшене решения на lsFusion используются уже 10 лет. Только у нас человек 20 на нем пишут очень сложные проекты (ERP для розницы с тысячами одновременного работающих пользователей), коммитят каждый день много кода. Все «детские» проблемы платформы уже давно решены. Да, есть свои нюансы, но и во всех других технологиях их полно.

CrushBy
() автор топика
Ответ на: комментарий от static_lab

Когда создавали SQL, ни C++, ни C ещё не было.

С++ не было, а вот C уже был.

hobbit ★★★★★
()
Ответ на: комментарий от special-k

Неужели нельзя воспользоваться существующим языком с мощным синтаксисом, тем же ruby например (js, dart…).

Это DSL, такие языки в принципе созданы, потому что на языках с «мощным синтаксисом» ты затрахаешься такое писать.

bdrbt
()
Ответ на: комментарий от gobot

А какая программа самодостаточная? Даже если на ц напишешь, все равно нужна оболочка bash

Самодостаточная сам веб-браузер, а то, что запускается в нём, не является самодостаточной программой.

Hangover
()

А какие есть аналоги языку lsfusion ? Там же под языком postgresql, по идее должны быть похожие проекты по мапингу функций на sql.

Nohack
()
Ответ на: комментарий от Hangover

Прекратите называть программным обеспечением скрипты. Программное обеспечение это самодостаточная программа, которая запускается самостоятельно не в операционной системе.

usermod
()
Ответ на: комментарий от Hangover

Любой скрипт является программой по определению.

А несамодостаточными можно назвать и бинарники для java-машины, и сишный код, исполняемый некоторым си-интерпретатором, и машинный код другой платформы, исполняемый в эмуляторе.

static_lab ★★★★★
()
Последнее исправление: static_lab (всего исправлений: 1)

Интересный продукт. Продукт, видно, немолодой. Это чувствуется по подходам.

Пара вопросов. Почему скрипт на убунту, а не докеры? Ведь так гораздо проще разворачивать, обновлять и сопровождать продукт?

С ходу не понял, как развернуть ганта на страницу. Полэкрана занимают фильтры. Причем расширить их можно, а вот сделать меньше нет.

Зачем в карточку контрагента засунули статистику продаж? Отчеты не для этого?

Как реализована (если есть) обратная связь с браузером? Например, как уведомляется, что товар кончился в процессе его покупки? Через вебсокеты? Или все через перезагруку страницы в поаент записи изменений?

usermod
()
Ответ на: комментарий от CrushBy

Если с DSL для логики все понятно то что насчет BPMN и визуального редактора для «разработки» бизнес-процессов на основе уже имеющихся «кубиков»?

exception13 ★★★★★
()

я все с kimai слезть не могу, слишком уж удобно для аутсорса на нескольких клиентов

bernd ★★★★★
()
Ответ на: комментарий от usermod

Пара вопросов. Почему скрипт на убунту, а не докеры? Ведь так гораздо проще разворачивать, обновлять и сопровождать продукт?

Есть и докер : https://download.lsfusion.org/solutions/mycompany-docker/

С ходу не понял, как развернуть ганта на страницу. Полэкрана занимают фильтры. Причем расширить их можно, а вот сделать меньше нет.

Есть такой нюанс, что у всех контейнеров есть минимальный размер. К сожалению, полностью его убрать нельзя, так как там при уменьшении размера формы идет перенос контейнеров и у нее должна быть какая-то ширина. В общем там специфика архитектуры построения дизайна. Но действительно, там слишком широко (просто лично у меня много место на экране и это не критично). Поправим.

Зачем в карточку контрагента засунули статистику продаж? Отчеты не для этого?

Можно и через статистику. История продаж может быть полезна. Просто в lsFusion это делается в пару строк и особо никак на производительность не влияет.

Как реализована (если есть) обратная связь с браузером? Например, как уведомляется, что товар кончился в процессе его покупки? Через вебсокеты? Или все через перезагруку страницы в поаент записи изменений?

Там single-page application. Идет постоянное общение клиента с сервером (запросами - можно увидеть в network), и в случае чего с сервера на клиент шлётся необходимая информация (изменения на форме, уведомления и т.д.).

CrushBy
() автор топика
Ответ на: комментарий от exception13

Нет BPMN нет в платформе и визуальной настройки пока тоже соответственно нет. Может когда-то сделаем, но пока не в приоритете. По сути логика процессов делается в коде (тоже несложно, но пользователь не сможет этого сделать).

CrushBy
() автор топика
Ответ на: комментарий от gns

Интеграции даже в крупных ERP типа SAP, Oracle FA, Axapta, и т.д. c «неким аналогом Джиры и прочим таск-менеджментом» обычно пишется под определенного Заказчика за счет его средств, как говорится - «любой каприз за ваши деньги». Или вариант 2 - Заказчик сам пишет интеграцию за счет собственного времени и квалификации. Я думаю, с бесплатным приложением, коим является MyCompany - это нормально и честно. И такая интеграция для большинства ларьков, мелких магазинчиков и т.д. - то есть тех, кто относится к целевой аудитории, а не фрилансеров в общем-то не особо и нужна.

BrIg
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.