Nicolás Pujia

Programmer and student from Argentina.

Siderplast S.A.

Overview

The official website of the Siderplast S.A. company, including both the e‑commerce and the ERP, completely made by myself.

This is the first project that I've made for a third party, and because it cannot fail in production, it's fully covered with automated tests.

Besides all the technologies that appear below, during the development of this project I have learned plenty of significant skills, such as handling large projects, matching clients needs, and designing a UI & UX targeted to real customers and admins.

Screenshots

Index About Contact Article list Article detail Cart

Online store / e‑commerce website

Checkout

Real money payments via bank transfer, Mercado Pago, or cash

Admin panel

Admin panel

Modules

The ERP is splitted into several modules (there will be more in the future as it's still in progress):

Store

This is the main module, which contains the logic for most operations. Therefore, it is further divided into different sections:

Inventory

Articles change list

It contains the articles and its related models needed to work. Some worth-mentioning features are:

Sales

It has orders, messages, banners, and budgets functionalities. As a cool feature, here's an example of an automatically-generated invoice:

Example invoice

People

This section groups all the models related to people, i.e., clients and suppliers, and in the UI it's showed up together with Django's User and Group models.

Clients may have exclusive discounts which are then applied to the prices when they buy through the website or ask for a budget.

Common logic

It wouldn't be a single app if these sections didn't shared features. For that, I created custom ModelAdmin mixins, abstract models, and other kinds of utilities to refactor my code and make it more scalable.

For example, and I'll get a bit more technical now, instead of writing a display method for every relation field (e.g. ForeignKeyField) to convert them into a link to the related object, I created a mixin that once applied to the ModelAdmin it detects all those types of fields and displays them as links. And because there were other types of fields that I wanted to render in a common way (like ImageFields as img tags, TextFields shortened to a maximum of words, etc.), I abstracted away the shared logic of all these mixins into a base mixin, resulting in my ModelAdmins and mixins written in much more cleaner way.

Like the example above I have a bunch more, but if I get into the details of every elegant part of the code this entry would become infinite, so let's continue with the next module.

Wave

Wave being used by the company

Wave, where data flows

An independent module to dynamically create tables with custom columns, made in replacement of the well-known Monday.com to reduce the company's costs.

Column creation of custom data type and name

System

System information and configuration

A secondary module for backups, logs, configuration and system information.