---

$$      Nombre                                              Valor Actual        Activo Desde       
eDIT    PORCENTAJE DE SEGURO DE SALUD REGIMEN AGRRARIOE

->>
Porcentaje de seguro salid regimen a gtario

Nuevo Valor        Activo Desde
[           ]      [            ]       [ GUAR2DAR ]
-----------------------------------------------------
[ Valor     Desde           Hasta       ESSTADO ]
0.08        2025-06-01                  ACTIVO
0.06        2025-05-15      2025-06-01  INACTIVO


* Listar Variables  [ ]
* Ver Detalles [ variable ]
* Guardar Nuevo Valor       [ nuevo valor | fecha ]


INSERT INTO `permiso` (`cod_permiso`, `es_menu_interfaz`, `titulo_interfaz`, `url`, `estado`, `icono_interfaz`, `padre`, `n_orden`, `estado_mrcb`) VALUES (NULL, '1', 'Config. Variables Globales', '../mant-variables-globales', 'A', NULL, '2', '4', '1');

La estructura interna de cada archivo de Kárdex es como sigue:

-Kárdex detallado por producto (Hojas color verde de rubros principales: Insumos, Guano, Gasohol, Petroleo, Lubricantes y Materiales).
-Hojas R_XXXXX: Resúmenes mensuales para HT_Asiento (Recogen la información de los Rubros Principales).
-Hoja HT_Asiento: Resumen ordenado de las cuentas a utilizar en el asiento de consumos (Recogen la información de las Hojas R_XXXXX.
-Hoja Asiento: Asientos contables a importar en el Sistema CONCAR.
-Hoja Inv.Actual: Resumen de Stock general de la Sede.

Los objetivos son:

-Elaborar Asientos Contables de consumos de materia prima y auxiliar mensuales a importar en el Sistema CONCAR.
-Generar los respectivos Libros de Kárdex de Inventario Permanente en Unidades Físicas y Valorizados (Formatos 12.1 y 13.1).
-Mantener por cada Sede un Inventario General actualizado.

Cualquier consulta o duda nos comunicas.

Atte.

Milton Hurtado Cortez

Contabilidad Agricasa>>

orden_compra
guia_remision
factura

cabecera de insumo

reestrutuacion

unidad produccion

almacen 
    => unidad produccion

Producto
Maquinaria

item unidad produccion
maquinaria unidad produccion
insumos unidad produccion

almacen_unidad_produccion


item => 

Rubros
Almacenes
Anexos
Marcas
Maquinaria
Tipo de Insumo
Productos


MISION :

mantenimiento catalogos?
==================
items
machinery
insumos_type
brands
anexos
rubros
warehouses
cost_centers
=======================


creacion de voucher
ver inventario


Flujo

=>registro massivos

=>

items => 
    UP

warehouses
    => UP

insumo_types
    => UP
    => account

machinery
    => UP
    => accounts


cost_center => UP

item_warehouse_up => [ stockable ]

movement => 
    item
    pu
    warehouse
    date
    kind

truncate table items;
truncate table `warehouses`;
truncate table `warehouses_production_unit`;
truncate table `machinery_production_unit`;
truncate table `machinery_account`;
truncate table `machinery`;
truncate table `accounts`;

rubros => categoría

UPO => 


--------------------------
[UP]  [tipo movimiento] FECHA  ALMACEN  
DOC REC     ORDER   SHIPPING
Comentario | Moneda | exchange rate
STATUS  (draft, approved, void)

insumo o maquinaria => 

item | item_id | rubro | insumo / machinery | qty | cost_center_id| unit cost_ override | remark (detail)

Total
1.- get Unidad produccion,
2.- get almacen -> unidad produccion
3.- get rubros 
4.- get Productos -> rubro

=> Guardar

-> ingreso
->stock.qty_on_had += qty
->usamos WAV => avg_cost => old_qt * old_cost + qt * unitCos / (oldQty + qty)
->insert movements- > recalcula balancq_qty y balancecost

SELECT up.code, w.name as almacen, m.date, 
i.name as producto,
m.kind, 
dt.name as documento, 
ot.name as operacion, 
CONCAT(m.serie,'-',m.number) as num_doc, 
in_qty, in_unit_cost, in_total_cost, 
out_qty, out_unit_cost, out_total_cost, 
stock_qty, stock_unit_cost, stock_total_cost 
FROM `movements` m 
INNER JOIN items i ON i.id = m.item_id 
INNER JOIN warehouses w ON w.id = m.warehouse_id 
INNER JOIN unidad_produccion up ON up.id_unidad_produccion = m.production_unit_id 
INNER JOIN document_types dt ON dt.id = m.document_type_id 
INNER JOIN operation_types ot ON ot.id = m.operation_type_id
WHERE m.item_id = 5;



DRAFT --> BORRADOR
PENDING --> PENDIENTE
APPROVED --> APROBADO
VOID --> ANULADO

1.- Definir tabla inventory_periods
    * Nos ayuda a controlar kardex producto / periodo.
    * Checa i está desordenado
    * Fecha de desorden
    * Checa si está cerrado
    * Fecha de cierre.
    * Fecha last reapertura
    * Checa si ha sido reprocesado.

2.- Al cerrar periodo simple me marca este registro
        Todos los productos que existan hasta este momento se cierrean, si no existen se crean

3.- Al crear un voucher 
        -> mont_year + getproducts + inventory_periods closed
            if(sí)
                => No puedo registrar este voucher, el almacen para productos: XXXX XXXX está cerrado.
                => break
        -> afecta vouchers
        -> crea movimiento
        -> if(fecha movimiento <= fecha movimiento max)
            -> is dirty
            -> fecha dirty
        -> Calcular in/out con lo que se tenga en el mes
        -> Stock Update
    
4.- Al reabrir periodo -> se marca como reabierto
        Todos los productos+inveotryperio que existan hasta este momento se cierrean

5.- Reprocessamiento de almacen
    UP => 
        foeach(almacenes)
            productos en invetNory_periods  no cerrados
                P01 2025 10 ALM1
                P01 2025 09 ALM2
                P01 2025 08 ALM1
                P01 2025 08 ALM3

                foreach linea
                    get from movements where year, month, period, alm  ORDER BY movment date, id
                    itemsto_process
                        exists 16 in itemstoprocess ?
                            no, crear.

                        DELETE itemsto_process from db
                        foreach item for itemsto_process
                            ejecutar calculo y registro.                    
                        => crear 16 para el siguiente mes

                        ajust stock

                        commit()!

6.- Procesamiento para kardex sunat
    -> Nueva tabla:
        Solo OK si el kardex regular está limpio (inventory_periods)
        Se llena basado en el kardex regular
    UP => 
        foeach(almacenes)
            productos en inventory_periods  no cerrados group by product year month + up
                P01 2025 10
                P02 2025 09
                P02 2025 08

                get frm movements  where year, month, period, up  ORDER BY movment date, id
                itemsto_process
                    exists 16 in itemstoprocess ?
                        no, crear.

                    DELETE itemsto_process from db
                    foreach item for itemsto_process
                        ejecutar calculo y registro.                    
                    => crear 16 para el siguiente mes

                    commit()!

  
==========================================================

1.- Voucher => default DRAFT
2.- Cambiar Estado:
    DRAFT -> PENDING     
    PENDING => modifiable by admin
    PENDING => non modify by user creator
3.- PENDING -> APPROVED
    APPROVED => non modifiable
    When approved -> 
        Executes Movements
        Executes Stock Update
4.- APPROVED -> PENDING
        Reverse Stock
        Delete Movement
        only by admin
        markd as dirty
5.- APPROVED -> DRAFT  
        Reverse Stock
        Delete Movement 
        only by admin
        markd as dirty
6.- APPROVED -> VOID
        Reverse Stock
        Soft Delete Movement
        markd as dirty
7.- DRAFT / PENDING -> delete -> 
        Delete Voucher

Tipo de Usuario
    es_admin_kardex         -> ADMIN en almacen
    es_registra_vouchers_kardex      -> ASISTENTE en almacen
    Records:
    CONTABLE                ->es admin_kardex = true, es registra_voucher_kardex = true
    ASISTENTE CONTABLE      ->es admin_karex = false, es es_registra_vouchers_kardex = true
    -> Dentro de las funciones debe estar la validacion de tipo usuario

8.- Editando servicio
    => cargar el modal de registro pero con datos precargados.

    Cierre Periodos de Almacenes
- Año  -Mes  -Up    [Consultar]
Existe 18 productos con desajustes.                             * 
No se puede cerrar el periodo consultado. 
¿Desea reajustar el periodo consultado? [ REAJUSTAR ]
-> Este proceso puede tomar varios minutos.
--------------------------------------------------
Todos los productos están correctos.
¿Desea cerra el periodo consultad? [ CERRAR ]
--------------------------------------------------
El periodo está CERRADO.
¿Desear reabrir el periodo? [ REABRIR ]
===================================================================
Generación Kardex por Unidad Producción
- Año  -Mes  -Up    [consultar]
El periodo aún NO está CERRADO.
Cierre el periodo para continuar.
------------------------
El período está CERRADO. 
¿Desea generar el periodo consultado? [ GENERAR ]
-------------------------------------
El período está GENERADO.

===============
onReajustar(
    anio
    mes
    up
)

onReabrir(
    anio,
    mes,
    up
)

onCerrar(
    anio
    mes
    up
)
=============
onGenerar(
    anio
    mes
    up
)

=========================
-- al registrar salida de productos con maquinaria => debo marca ceco y es prioritario
Verificar que registre correctamnet elos productos

Producto

TipoInsumo -> UP
Producto -> UP


1.- ver si hay salidas
2.- ver si hay otros ingresos
3.- solo saldos iniciales? ajuste fast
4.- si solo entradas, podemos reconstruir


* Registrar productos individualmente


============
- Se corrigió el tema de la edición fácil.
- Explicación del flujo
- Agregada Celda de Maquinaria
- Agregada ajuste de celdas dobles
- Ajusta de costo total vs p.u. promedio

* Registro Manual
    items
        id
        SKU
        name
        uom
        category
        rubro code
        insumo_type_type
    
    agregar sede
    [ sede 1 ]     [ rubro ]   [ tipo_insumo ]
    rubro -> sede 1 


    insumo_types
        => por SEDE
        => incluye type

    


* Registro Salidas
/////////=========
UPDATE `items`
set uom = 'GLI'
where name like '%SPIRAX S4 10W-30 TXM BAL X 5 GL%';
==

LUB_00000029  
=> ACEITE SHEL RIMULA 25W50  (GLI) (STOCK INICIAL) MULTI ES EL NUEVO PRODUCTO, ESTE SI ES LTR

LUB_00000044 (LTR)
Reemplazar el id producto de 00029 a 00044

//5072 -> 5252

///
SELECT * FROM `items` where name LIKE 'ACEITE 15W-40 BL%'; => eLIMINAR DEL ASISENTO INICIAL (y toiros mvtos) => 
LUB_00000021 | 5064
REemplazar esto por el nuevo => 
SELECT * FROM `items` where name LIKE 'ACEITE SHELL RIMULA 15W-40';

//5064 -> 5257 

Tablas de productos
SELECT * FROM `inventory_movements` WHERE item_id = 5064;
SELECT * FROM `inventory_movements_up`
where production_unit_id = 1 AND item_id = 5064;
SELECT * FROM `inventory_product_periods` where product_id = 5064;

SELECT * FROM `inventory_stocks` WHERE item_id = 5064;
SELECT * FROM `item_production_unit` where item_id = 5064;

=== Actulizar tipo de cultivos ((HECHO))
UPDATE cost_centers cc
JOIN lote l ON cc.code = l.cod_ceco
SET cc.cultivo_id = l.idcultivo;

UPDATE cost_centers cc JOIN lote l ON cc.code = l.cod_ceco AND l.estado_mrcb = 1 JOIN `lote_cultivo` lc ON lc.id_lote = l.idlote AND lc.estado_mrcb = 1 AND lc.id_cultivo <> 0 set cc.cultivo_id = lc.id_cultivo;

====
ALTER TABLE `vouchers` ADD `numero_concar` VARCHAR(15) NULL DEFAULT NULL AFTER `status`;
===============

tRANSFERENCIA OBLIGATORIA DE UPC => UPO
ADAPTADOR 1 PVC AGUA	27/01/2026	TRANSFERENCIA	SALIDA UPO	MAT. FERRET. CAMPO	SALIDA UPO	0	613210	OTROS	5.00  *TRANSFERENCIA ENTRE ALMACENES

tRANSFERENCIA OBLIGATORIA DE UPO => UPC
DAIPAS IND UPO	27/01/2026	TTT3-0001325	SALIDA UPC	DAIPAS IND	SALIDA UPC	0	613102	 11000 		*TRANSFERENCIA ENTRE ALMACENES
BENTONITA SODICA	24/01/2026	TRANSFERENCIA	TTT3-1313	SALIDA UPC	0			0	0	0	60	*TRANSFERENCIA ENTRE ALMACENES


====
tenemo que cruzar correctamente =>  
    
Los productos pueden salir con un tipo de movimiento
    Esto en el voucher

    =>
    Generación de asientos
        se basa en el moviminto + el tipo de producto las salidas deben reflejar dicho movimiento (incluyendo el tipo de salida)

PRIMERO introducir la dinámica de asientos
=>
agregar  tabla y  mantenimiento base
    account_grouper
        id serial
        account_number strng(6)
        description strng(150)

agrear columna a tabla insumo_types
    id_account_grouper => refleja  la asociación con el grupo de cuentas

agregar columna periodo a table insumo_types

nuevo mantenimiento de cuentas (plan general de cuentas( inventario ))

[ CUENTA ] [ DESCRIPCION ]  [INGRESEO (COMPRA)] [ EGRESO (SALIDA PRODUCCION)] [ EGRESO (VENTA) ]
account grouper
[EDIT] - - ---------------------------------------------------------------------
- 
- 
-
-
-

[
    OTROS FERTIIZANATES UPC         - F. Inicio  [ ------  ]

    cuenta [        ]  cuenta [        ]   cuenta [        ]  
    cuenta [        ]  cuenta [        ]
    cuenta [        ]   cuenta [        ]  
    
    Valores Históricos



]

===========
ALTER TABLE `vouchers` ADD `accounting_posted` BOOLEAN NOT NULL DEFAULT FALSE AFTER `numero_concar`;
ALTER TABLE `vouchers` ADD `journal_entry_id` INT NULL DEFAULT NULL AFTER `accounting_posted`;
    

CREATE TABLE `accounting_templates` (
  `id` bigint(20) UNSIGNED NOT NULL,
  `name` varchar(150) NOT NULL,
  `operation_type` varchar(20) NOT NULL,
  `insumo_type_id` int(10) UNSIGNED NOT NULL,
  `account_code` varchar(6) NOT NULL,
  `created_at` timestamp NOT NULL DEFAULT current_timestamp(),
  `updated_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
  `deleted_at` timestamp NULL DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

ALTER TABLE `accounting_templates`
  ADD PRIMARY KEY (`id`),
  ADD UNIQUE KEY `id` (`id`);

ALTER TABLE `accounting_templates`
  MODIFY `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT;
COMMIT;


CREATE TABLE `accounting_template_lines` (
  `id` bigint(20) UNSIGNED NOT NULL,
  `template_id` int(10) UNSIGNED NOT NULL,
  `account_code` varchar(6) NOT NULL,
  `entry_type` varchar(6) NOT NULL COMMENT 'debit, credit'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

ALTER TABLE `accounting_template_lines`
  ADD PRIMARY KEY (`id`),
  ADD UNIQUE KEY `id` (`id`);

ALTER TABLE `accounting_template_lines`
  MODIFY `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT;
COMMIT;

ALTER TABLE `accounting_templates`
  ADD PRIMARY KEY (`id`),
  ADD UNIQUE KEY `id` (`id`);

ALTER TABLE `accounting_templates`
  MODIFY `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT;
COMMIT;

ALTER TABLE `accounting_template_lines` CHANGE `template_id` `template_id` BIGINT(20) UNSIGNED NOT NULL;

ALTER TABLE `accounting_template_lines` ADD CONSTRAINT `fk_template_id` FOREIGN KEY (`template_id`) REFERENCES `accounting_templates`(`id`) ON DELETE RESTRICT ON UPDATE RESTRICT;

ALTER TABLE `accounting_templates` CHANGE `operation_type` `operation_type_id` CHAR(2) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL;


CREATE TABLE `journal_entries` (
  `id` bigint(20) UNSIGNED NOT NULL,
  `date` date DEFAULT NULL,
  `description` varchar(150) NOT NULL,
  `reference_voucher_id` int(11) DEFAULT NULL,
  `created_by` varchar(20) DEFAULT NULL,
  `updated_by` varchar(20) DEFAULT NULL,
  `deleted_by` varchar(20) DEFAULT NULL,
  `created_at` timestamp NOT NULL DEFAULT current_timestamp(),
  `updated_at` timestamp NOT NULL DEFAULT current_timestamp(),
  `deleted_at` timestamp NULL DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;


ALTER TABLE `journal_entries`
  ADD PRIMARY KEY (`id`),
  ADD UNIQUE KEY `id` (`id`);

--
-- AUTO_INCREMENT de las tablas volcadas
--
-- AUTO_INCREMENT de la tabla `journal_entries`
--
ALTER TABLE `journal_entries`
  MODIFY `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT;
COMMIT;

ALTER TABLE `journal_entries` ADD `period` CHAR(6) NULL DEFAULT NULL AFTER `id`;


CREATE TABLE `journal_entry_lines` (
  `id` bigint(20) UNSIGNED NOT NULL,
  `journal_entry_id` int(11) NOT NULL,
  `account_code` varchar(6) NOT NULL,
  `debit` decimal(16,4) NOT NULL DEFAULT 0.0000,
  `credit` decimal(16,4) NOT NULL DEFAULT 0.0000
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

--
-- Índices para tablas volcadas
--

--
-- Indices de la tabla `journal_entry_lines`
--
ALTER TABLE `journal_entry_lines`
  ADD PRIMARY KEY (`id`),
  ADD UNIQUE KEY `id` (`id`);

--
-- AUTO_INCREMENT de las tablas volcadas
--

--
-- AUTO_INCREMENT de la tabla `journal_entry_lines`
--
ALTER TABLE `journal_entry_lines`
  MODIFY `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT;
COMMIT;


ALTER TABLE `journal_entry_lines` ADD `cost_center_id` INT NULL DEFAULT NULL AFTER `account_code`, ADD `machinery_id` INT NULL DEFAULT NULL AFTER `cost_center_id`;
ALTER TABLE `journal_entry_lines` ADD INDEX(`cost_center_id`);
ALTER TABLE `journal_entry_lines` ADD INDEX(`machinery_id`);


ALTER TABLE `journal_entries` ADD INDEX(`date`);
ALTER TABLE `journal_entries` ADD INDEX(`period`);
ALTER TABLE `journal_entries` ADD INDEX(`reference_voucher_id`);

ALTER TABLE `accounting_templates` ADD `production_unit_id` INT NULL DEFAULT NULL AFTER `insumo_type_id`, ADD INDEX (`production_unit_id`);

update machinery set name = REPLACE(name, 'MOTOGUADA?A', 'MOTOGUADAÑA') where name like '%MOTOGUADA?A%';
UPDATE `machinery` SET `deleted_at` = NULL WHERE `machinery`.`observation` = 'M29-926';


INSERT INTO `document_series` (`document_type_id`, `serie`, `operation_type_id`, `number`, `created_by`, `updated_by`, `deleted_by`, `created_at`, `updated_at`, `deleted_at`) VALUES ('00', 'SPS0', '10', '1', '1', NULL, NULL, '2025-12-22 15:08:11', NULL, NULL);

===
limpiar para reversión

UPDATE document_series set number = 1 WHERE serie = 'SPS0';
DELETE FROM voucher_lines WHERE voucher_id IN (
    SELECT id FROM vouchers WHERE serie = 'SPS0'
);
DELETE FROM vouchers WHERE serie = 'SPS0';

==== catálogo de cuentas

cuenta 61
cuent

Todos los productos
Misma operación (10)

cuenta debe => arriba

61312 DESCRIPCION   =>  

cuenta haber => abajo


accounts_catalog
=======================
id
account_code
name
parent_code ( NULL)
nature  | inventory, expense ( NULL )
insumo_type_id ( NULL)
=======================

613102 DAIPAS UPO   61  inventory   58
251102 DAIPAS UPO   61  expense     58

Salida de produccion (10)
Todos los productos en catalogo disponible

Asientos Consumo por rubro


=====================

--- recalcular totales


UPDATE vouchers SET STATUS = 'APPROVED' WHERE serie = 'SPS0';
UPDATE vouchers SET STATUS = 'APPROVED'  WHERE deleted_at IS NULL AND date < '2026-04-01';

=====

[Año] [ Production ]  [ Almacen ] [   Producto  ] [Hasta Fecha] [  VER  ]
[ ----- | --------- | --------- | ----------- | ---------- | ------- | -------- ]
[ Total | Page 1 of 10 ]                            [ Ant |       ]
=====
* estandarizar proceso de asiento HECHO
    -> ingreso saldos internos
        (totalizador, aprobados, ingresos enero)
    (ingresa saldos enero)
    -> fix prices
    http://localhost/control-upo/controlador/fix.items.precio_unitario.php
    ( reajuste vouchers en todos los aprobaos)
    -> reconstruir kardex
    ( reconstruye el kardex )
* filtros para movements warehouse
* interfaz para revisión kardex

