F
Fand_igor

Internal CRM/ERP Platform for Furniture Production and Inventory Management

Brief Description

Developed an internal system on Yii2 for managing company registries, employees, counterparties, and inventory movement. This was a domain model of an internal CRM/ERP platform for furniture production and related processes: HR block, legal entities, counterparties, access rights, inventory, arrivals, transfers, returns, and write-offs.

The project was an internal working system with several domain modules and a custom interface architecture based on my own Yii2 plugins.

What the project solved

The project was needed to move away from fragmented tracking of employees, companies, equipment, and inventory documents. The system was designed to provide a unified workspace where one could:

  • manage employees, roles, and access;
  • store data on companies, counterparties, departments, and requisites;
  • track inventory and equipment;
  • record arrival, transfer, return, and write-off of goods;
  • see who has what, where it is, and what condition the tool or property is in;
  • differentiate access and data by roles, companies, and responsible persons.

Key System Modules

  • security - users, roles, access rights, and RBAC structure.
  • staff - employees, profiles, positions, departments, contact data.
  • counterparty - companies, counterparties, departments, functions, bank data, and accounts.
  • gds - main inventory tracking circuit: catalog, inventory cards, manufacturers, locations, movement documents.
  • data - service registries and general data, e.g., phones and file entities.
  • company - prepared CRM entities for leads, clients, contractors, partners, and suppliers.

What has been implemented

  • Internal Yii2 application with a modular structure and separation of domain zones by business functions.
  • User system linked to employee profiles, roles, and access rights.
  • RBAC model with roles for administrators, managers, and application users.
  • Employee tracking linked to company, counterparty, department, and function.
  • Storage of additional HR data, including employee passport data and contact phones.
  • Registries of legal entities, counterparties, departments, bank data, and accounts.
  • Inventory tracking circuit with inventory cards, serial numbers, manufacturers, cost, warranty, condition, and availability.
  • Hierarchical inventory catalog and location registries.
  • Document circuit for inventory movement including arrivals, transfers, returns, and write-offs.
  • Tracking of the recipient or transfer location: employee, site, object, company, or service.
  • Display of the current holder and current inventory location based on the latest movement document.
  • Filtering and restriction of data by user company and access roles.
  • System statuses of entities: active, blocked, deleted, irrelevant, processed, and unprocessed.
  • Audit of changes through created_by, updated_by, checked_by, timestamps, and document statuses.
  • Prepared user history and settings, indicating a move toward a more mature internal platform.

Technical Web Highlights

  • Built the application as a modular Yii2 system, where each subject area is in its own module with its own models, controllers, views, and search models.
  • Configured a unified application interface based on AdminLTE and my own Yii2 plugins for navigation, tables, dynamic grids, modal forms, and catalog trees.
  • Implemented internal navigation at the ERP level: employees, legal entities, counterparties, bank data, HR tracking, inventory catalog, and movement documents.
  • Used expanded tables and dynamic grids for work lists with filtering, column settings, export, and improved internal user workflow.
  • Integrated hierarchical structures for catalogs and registries via a tree/jstree approach.
  • Implemented forms for creating and changing entities with different model usage scenarios.
  • Configured ru/en multi-language support, pretty URLs, custom date and number formatter, and interface theming.
  • Linked user actions with the access rights system so different roles see only permitted sections and data of their company.
  • Built navigation and work scenarios for real internal roles: IT, administration, procurement, accounting, design block, and managers.

Technical Business Logic Highlights

  • Implemented ActiveRecord models with a large number of domain links between employees, companies, counterparties, inventory, and movement documents.
  • Used TimestampBehavior and BlameableBehavior for automatic change auditing.
  • Built model scenarios for creation, editing, search, and specific actions on entities.
  • Implemented calculated states and views for inventory: status, condition, availability, holder, location, warranty, and system status.
  • Provided different assignment types in movement documents: transfer to employee, to site, to object, to company, or to repair/service.
  • Restricted data access at the query level depending on the user's role and company affiliation.
  • Prepared high-level CRM entities for leads, clients, contractors, partners, and suppliers, showing system development beyond just a warehouse/inventory circuit.
  • Inventory movement was designed not as a single general status, but as a full document circuit with detailed operations and separate entities for documents and document lines.

Use of Own Libraries

Crucially, the project utilized my own Yii2 packages:

  • igor162/yii2-adminlte
  • igor162/yii2-nav
  • igor162/yii2-grid
  • igor162/yii2-dynagrid
  • igor162/yii2-modal
  • igor162/yii2-multiselect
  • igor162/yii2-removebutton-widget
  • igor162/yii2-jstree-input
  • igor162/yii2-jstree-widget
  • igor162/yii2-tag-dependency-helper

The project was not only an application system but also an environment where my own reusable components were used in a real internal product.

My role

My role was comprehensive: from designing the architecture of internal modules and user interface to implementing models, controllers, registries, inventory tracking, movement documents, and integrating my own Yii2 plugins into a working system.

Practical value of the project

This case demonstrates experience in:

  • developing an internal CRM/ERP system, rather than just separate pages or CRUD;
  • designing modular architecture on Yii2;
  • building roles and access differentiation;
  • automating inventory tracking and movement;
  • developing interfaces for internal users;
  • using and developing own reusable components in a real project.