diff --git a/db/dump/fixtures.before.sql b/db/dump/fixtures.before.sql
index 2b3de03fa..3e6edf07d 100644
--- a/db/dump/fixtures.before.sql
+++ b/db/dump/fixtures.before.sql
@@ -2562,7 +2562,7 @@ REPLACE INTO `vn`.`invoiceIn`(`id`, `serialNumber`,`serial`, `supplierFk`, `issu
(9, 1009, 'R', 2, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 1242, 0, 442, 1),
(10, 1010, 'R', 2, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 1243, 0, 442, 1);
-INSERT INTO `vn`.`invoiceInConfig` (`id`, `retentionRate`, `retentionName`, `sageWithholdingFk`, `daysAgo`)
+INSERT INTO `vn`.`invoiceInConfig` (`id`, `retentionRate`, `retentionName`, `sageFarmerWithholdingFk`, `daysAgo`)
VALUES
(1, -2, '2% retention', 2, 45);
@@ -3789,4 +3789,6 @@ INSERT INTO vn.workerTeam(id, team, workerFk)
(8, 1, 19);
INSERT INTO vn.workCenter (id, name, payrollCenterFk, counter, warehouseFk, street, geoFk, deliveryManAdjustment)
- VALUES(100, 'workCenterOne', 1, NULL, 1, 'gotham', NULL, NULL);
\ No newline at end of file
+ VALUES(100, 'workCenterOne', 1, NULL, 1, 'gotham', NULL, NULL);
+
+UPDATE vn.locker SET workerFk = 1110 WHERE id = 147;
\ No newline at end of file
diff --git a/db/routines/vn/procedures/item_getBalance.sql b/db/routines/vn/procedures/item_getBalance.sql
index 88583cf00..a4942af6f 100644
--- a/db/routines/vn/procedures/item_getBalance.sql
+++ b/db/routines/vn/procedures/item_getBalance.sql
@@ -9,7 +9,7 @@ BEGIN
* @vItemFk item a buscar
* @vWarehouseFk almacen donde buscar
* @vDate Si la fecha es null, muestra el histórico desde el inventario.
- * Si la fecha no es null, muestra histórico desde la fecha pasada.
+ * Si la fecha no es null, muestra histórico desde la fecha de vDate.
*/
DECLARE vDateInventory DATETIME;
@@ -40,117 +40,154 @@ BEGIN
inventorySupplierFk INT(10)
);
- INSERT INTO tItemDiary
- SELECT tr.landed shipped,
- b.quantity `in`,
- NULL `out`,
- st.alertLevel ,
- st.name stateName,
- s.name `name`,
- e.invoiceNumber reference,
- e.id origin,
- s.id clientFk,
- IF(st.`code` = 'DELIVERED', TRUE, FALSE) isPicked,
- FALSE isTicket,
- b.id lineFk,
- NULL `order`,
- NULL clientType,
- NULL claimFk,
- ec.inventorySupplierFk
- FROM buy b
- JOIN entry e ON e.id = b.entryFk
- JOIN travel tr ON tr.id = e.travelFk
- JOIN supplier s ON s.id = e.supplierFk
- JOIN state st ON st.`code` = IF( tr.landed < util.VN_CURDATE()
- OR (util.VN_CURDATE() AND tr.isReceived),
- 'DELIVERED',
- 'FREE')
- JOIN entryConfig ec
- WHERE tr.landed >= vDateInventory
- AND vWarehouseFk = tr.warehouseInFk
- AND (s.id <> ec.inventorySupplierFk OR vDate IS NULL)
- AND b.itemFk = vItemFk
- AND e.isExcludedFromAvailable = FALSE
- AND e.isRaid = FALSE
- UNION ALL
- SELECT tr.shipped,
- NULL,
- b.quantity,
- st.alertLevel,
- st.name,
- s.name,
- e.invoiceNumber,
- e.id,
- s.id,
- IF(st.`code` = 'DELIVERED' , TRUE, FALSE),
- FALSE,
- b.id,
- NULL,
- NULL,
- NULL,
- ec.inventorySupplierFk
- FROM buy b
- JOIN entry e ON e.id = b.entryFk
- JOIN travel tr ON tr.id = e.travelFk
- JOIN warehouse w ON w.id = tr.warehouseOutFk
- JOIN supplier s ON s.id = e.supplierFk
- JOIN state st ON st.`code` = IF(tr.shipped < util.VN_CURDATE()
+ INSERT INTO tItemDiary
+ WITH entriesIn AS (
+ SELECT tr.landed shipped,
+ b.quantity `in`,
+ NULL `out`,
+ st.alertLevel ,
+ st.name stateName,
+ s.name `name`,
+ e.invoiceNumber reference,
+ e.id origin,
+ s.id clientFk,
+ IF(st.`code` = 'DELIVERED', TRUE, FALSE) isPicked,
+ FALSE isTicket,
+ b.id lineFk,
+ NULL `order`,
+ NULL clientType,
+ NULL claimFk,
+ ec.inventorySupplierFk
+ FROM vn.buy b
+ JOIN vn.entry e ON e.id = b.entryFk
+ JOIN vn.travel tr ON tr.id = e.travelFk
+ JOIN vn.supplier s ON s.id = e.supplierFk
+ JOIN vn.state st ON st.`code` = IF( tr.landed < util.VN_CURDATE()
+ OR (util.VN_CURDATE() AND tr.isReceived),
+ 'DELIVERED',
+ 'FREE')
+ JOIN vn.entryConfig ec
+ WHERE tr.landed >= vDateInventory
+ AND vWarehouseFk = tr.warehouseInFk
+ AND (s.id <> ec.inventorySupplierFk OR vDate IS NULL)
+ AND b.itemFk = vItemFk
+ AND NOT e.isExcludedFromAvailable
+ AND NOT e.isRaid
+ ), entriesOut AS (
+ SELECT tr.shipped,
+ NULL,
+ b.quantity,
+ st.alertLevel,
+ st.name stateName,
+ s.name ,
+ e.invoiceNumber,
+ e.id entryFk,
+ s.id supplierFk,
+ IF(st.`code` = 'DELIVERED' , TRUE, FALSE),
+ FALSE isTicket,
+ b.id,
+ NULL `order`,
+ NULL clientType,
+ NULL claimFk,
+ ec.inventorySupplierFk
+ FROM vn.buy b
+ JOIN vn.entry e ON e.id = b.entryFk
+ JOIN vn.travel tr ON tr.id = e.travelFk
+ JOIN vn.warehouse w ON w.id = tr.warehouseOutFk
+ JOIN vn.supplier s ON s.id = e.supplierFk
+ JOIN vn.state st ON st.`code` = IF(tr.shipped < util.VN_CURDATE()
OR (tr.shipped = util.VN_CURDATE() AND tr.isReceived),
- 'DELIVERED',
- 'FREE')
- JOIN entryConfig ec
- WHERE tr.shipped >= vDateInventory
- AND vWarehouseFk = tr.warehouseOutFk
- AND (s.id <> ec.inventorySupplierFk OR vDate IS NULL)
- AND b.itemFk = vItemFk
- AND e.isExcludedFromAvailable = FALSE
- AND w.isFeedStock = FALSE
- AND e.isRaid = FALSE
- UNION ALL
- SELECT DATE(t.shipped),
- NULL,
- s.quantity,
- st2.alertLevel,
- st2.name,
- t.nickname,
- t.refFk,
- t.id,
- t.clientFk,
- stk.id,
- TRUE,
- s.id,
- st.`order`,
- c.typeFk,
- cb.claimFk,
- NULL
- FROM sale s
- JOIN ticket t ON t.id = s.ticketFk
- LEFT JOIN ticketState ts ON ts.ticketFk = t.id
- LEFT JOIN state st ON st.`code` = ts.`code`
- JOIN client c ON c.id = t.clientFk
- JOIN state st2 ON st2.`code` = IF(t.shipped < util.VN_CURDATE(),
- 'DELIVERED',
- IF (t.shipped > util.dayEnd(util.VN_CURDATE()),
- 'FREE',
- IFNULL(ts.code, 'FREE')))
- LEFT JOIN state stPrep ON stPrep.`code` = 'PREPARED'
- LEFT JOIN saleTracking stk ON stk.saleFk = s.id
- AND stk.stateFk = stPrep.id
- LEFT JOIN claimBeginning cb ON s.id = cb.saleFk
- WHERE t.shipped >= vDateInventory
- AND s.itemFk = vItemFk
- AND vWarehouseFk =t.warehouseFk
- ORDER BY shipped,
- (inventorySupplierFk = clientFk) DESC,
- alertLevel DESC,
- isTicket,
- `order` DESC,
- isPicked DESC,
- `in` DESC,
- `out` DESC;
+ 'DELIVERED',
+ 'FREE')
+ JOIN vn.entryConfig ec
+ WHERE tr.shipped >= vDateInventory
+ AND vWarehouseFk = tr.warehouseOutFk
+ AND (s.id <> ec.inventorySupplierFk OR vDate IS NULL)
+ AND b.itemFk = vItemFk
+ AND NOT e.isExcludedFromAvailable
+ AND NOT w.isFeedStock
+ AND NOT e.isRaid
+ ), sales AS (
+ SELECT DATE(t.shipped) shipped,
+ s.quantity,
+ st2.alertLevel,
+ st2.name,
+ t.nickname,
+ t.refFk,
+ t.id ticketFk,
+ t.clientFk,
+ s.id saleFk,
+ st.`order`,
+ c.typeFk,
+ cb.claimFk
+ FROM vn.sale s
+ JOIN vn.ticket t ON t.id = s.ticketFk
+ LEFT JOIN vn.ticketState ts ON ts.ticketFk = t.id
+ LEFT JOIN vn.state st ON st.`code` = ts.`code`
+ JOIN vn.client c ON c.id = t.clientFk
+ JOIN vn.state st2 ON st2.`code` = IF(t.shipped < util.VN_CURDATE(),
+ 'DELIVERED',
+ IF (t.shipped > util.dayEnd(util.VN_CURDATE()),
+ 'FREE',
+ IFNULL(ts.code, 'FREE')))
+ LEFT JOIN vn.claimBeginning cb ON s.id = cb.saleFk
+ WHERE t.shipped >= vDateInventory
+ AND s.itemFk = vItemFk
+ AND vWarehouseFk = t.warehouseFk
+ ),sale AS (
+ SELECT s.shipped,
+ NULL `in`,
+ s.quantity,
+ s.alertLevel,
+ s.name,
+ s.nickname,
+ s.refFk,
+ s.ticketFk,
+ s.clientFk,
+ IF(stk.saleFk, TRUE, NULL),
+ TRUE,
+ s.saleFk,
+ s.`order`,
+ s.typeFk,
+ s.claimFk,
+ NULL
+ FROM sales s
+ LEFT JOIN vn.state stPrep ON stPrep.`code` = 'PREPARED'
+ LEFT JOIN vn.saleTracking stk ON stk.saleFk = s.saleFk
+ AND stk.stateFk = stPrep.id
+ GROUP BY s.saleFk
+ ) SELECT shipped,
+ `in`,
+ `out`,
+ alertLevel,
+ stateName,
+ `name`,
+ reference,
+ origin,
+ clientFk,
+ isPicked,
+ isTicket,
+ lineFk,
+ `order`,
+ clientType,
+ claimFk,
+ inventorySupplierFk
+ FROM entriesIn
+ UNION ALL
+ SELECT * FROM entriesOut
+ UNION ALL
+ SELECT * FROM sale
+ ORDER BY shipped,
+ (inventorySupplierFk = clientFk) DESC,
+ alertLevel DESC,
+ isTicket,
+ `order` DESC,
+ isPicked DESC,
+ `in` DESC,
+ `out` DESC;
IF vDate IS NULL THEN
-
+
SET @a := 0;
SET @currentLineFk := 0;
SET @shipped := '';
@@ -220,7 +257,7 @@ BEGIN
FROM tItemDiary
WHERE shipped >= vDate;
END IF;
-
+
DROP TEMPORARY TABLE tItemDiary;
END$$
DELIMITER ;
diff --git a/db/routines/vn/procedures/packageInvoicing.sql b/db/routines/vn/procedures/packageInvoicing.sql
deleted file mode 100644
index 7dae8dcf2..000000000
--- a/db/routines/vn/procedures/packageInvoicing.sql
+++ /dev/null
@@ -1,121 +0,0 @@
-DELIMITER $$
-CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`packageInvoicing`(
- IN vClient INT,
- IN vDate DATE,
- IN vCompany INT,
- IN vIsAllInvoiceable BOOLEAN,
- OUT vNewTicket INT(11)
- )
-BEGIN
-
- DECLARE vGraceDays INT;
- DECLARE vDateStart DATE DEFAULT '2017-11-21';
- DECLARE vIsInvoiceable BOOLEAN;
- DECLARE vWarehouse INT DEFAULT 13;
- DECLARE vComponentCost INT DEFAULT 28;
- DECLARE vGraceDate DATE;
- DECLARE vDateEnd DATE;
-
- SET vGraceDays = IF(vIsAllInvoiceable ,0, 30);
- SET vGraceDate = TIMESTAMPADD(DAY, - vGraceDays, vDate);
-
- /* Clientes especiales:
- 3240 MADEFLOR
- 992 JAVIER FELIU
- 4 TONI VENDRELL
- */
-
- IF vClient IN (992, 3240, 4) THEN
-
- SET vGraceDays = 365;
-
- END IF;
- /* Fin clientes especiales */
-
- SET vDateEnd = DATE_ADD(vDate, INTERVAL 1 DAY);
-
- DROP TEMPORARY TABLE IF EXISTS tmp.packageToInvoice;
-
- CREATE TEMPORARY TABLE tmp.packageToInvoice
- SELECT p.itemFk,
- tp.packagingFk,
- IF(tp.quantity < 0 OR t.shipped < vGraceDate, tp.quantity, 0) quantity,
- tp.ticketFk,
- p.price
- FROM ticketPackaging tp
- JOIN packaging p ON p.id = tp.packagingFk
- JOIN ticket t ON t.id = tp.ticketFk
- WHERE t.shipped BETWEEN vDateStart AND vDateEnd
- AND t.clientFk = vClient;
-
- DROP TEMPORARY TABLE IF EXISTS tmp.packageToInvoicePositives;
-
- CREATE TEMPORARY TABLE tmp.packageToInvoicePositives
- SELECT itemFk, sum(quantity) as totalQuantity
- FROM tmp.packageToInvoice
- GROUP BY itemFk
- HAVING totalQuantity > 0;
-
- SELECT COUNT(*)
- INTO vIsInvoiceable
- FROM tmp.packageToInvoicePositives;
-
- IF vIsInvoiceable THEN
-
- CALL ticket_add(vClient,
- vDateEnd,
- vWarehouse,
- vCompany,
- NULL,
- NULL,
- NULL,
- vDateEnd,
- account.myUser_getId(),
- TRUE,
- vNewTicket);
-
- INSERT INTO ticketPackaging(
- ticketFk,
- packagingFk,
- quantity,
- pvp)
- SELECT vNewTicket,
- pti.packagingFk,
- - SUM(pti.quantity) AS totalQuantity,
- pti.price
- FROM tmp.packageToInvoice pti
- LEFT JOIN tmp.packageToInvoicePositives ptip ON pti.itemFk = ptip.itemFk
- WHERE ptip.itemFK IS NOT NULL
- OR vIsAllInvoiceable
- GROUP BY packagingFk
- HAVING totalQuantity;
-
- INSERT INTO sale(
- ticketFk,
- itemFk,
- concept,
- quantity,
- price
- )
- SELECT vNewTicket,
- pti.itemFk,
- i.name as concept,
- sum(pti.quantity) as totalQuantity,
- pti.price
- FROM tmp.packageToInvoice pti
- JOIN item i ON i.id = pti.itemFk
- LEFT JOIN tmp.packageToInvoicePositives ptip ON pti.itemFk = ptip.itemFk
- WHERE ptip.itemFK IS NOT NULL
- OR vIsAllInvoiceable
- GROUP BY pti.itemFk
- HAVING totalQuantity;
-
- INSERT INTO saleComponent(saleFk, componentFk, value)
- SELECT id, vComponentCost, price
- FROM sale
- WHERE ticketFk = vNewTicket;
-
- END IF;
-
-END$$
-DELIMITER ;
diff --git a/db/routines/vn/procedures/workerDisable.sql b/db/routines/vn/procedures/workerDisable.sql
index 4b10cb7fa..04612a6dc 100644
--- a/db/routines/vn/procedures/workerDisable.sql
+++ b/db/routines/vn/procedures/workerDisable.sql
@@ -28,5 +28,9 @@ mainLabel:BEGIN
UPDATE `client` c
SET c.salesPersonFk = null
WHERE c.salesPersonFk = vUserId;
+
+ UPDATE locker l
+ SET l.workerFk = NULL
+ WHERE l.workerFk = vUserId;
END$$
DELIMITER ;
diff --git a/db/routines/vn2008/views/Proveedores.sql b/db/routines/vn2008/views/Proveedores.sql
index b5d3d3684..203d4295f 100644
--- a/db/routines/vn2008/views/Proveedores.sql
+++ b/db/routines/vn2008/views/Proveedores.sql
@@ -6,7 +6,6 @@ AS SELECT `s`.`id` AS `Id_Proveedor`,
`s`.`account` AS `cuenta`,
`s`.`countryFk` AS `pais_id`,
`s`.`nif` AS `NIF`,
- `s`.`isFarmer` AS `Agricola`,
`s`.`phone` AS `Telefono`,
`s`.`retAccount` AS `cuentaret`,
`s`.`commission` AS `ComisionProveedor`,
diff --git a/db/versions/11019-grayDendro/00-locker.sql b/db/versions/11019-grayDendro/00-locker.sql
new file mode 100644
index 000000000..7e63e06fa
--- /dev/null
+++ b/db/versions/11019-grayDendro/00-locker.sql
@@ -0,0 +1,60 @@
+-- Eliminar locker
+ALTER TABLE `vn`.`worker` DROP COLUMN `locker`;
+
+CREATE TABLE `vn`.`locker` (
+ `id` int(100) auto_increment,
+ `code` varchar(10) DEFAULT NULL,
+ `gender` ENUM('M','F') DEFAULT NULL,
+ `workerFk` int(10) unsigned DEFAULT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `code` (`code`),
+ UNIQUE KEY `workerFk` (`workerFk`),
+ CONSTRAINT `locker_ibfk_1` FOREIGN KEY (`workerFk`) REFERENCES `worker` (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci;
+
+ALTER TABLE `vn`.`workerLog`
+ MODIFY COLUMN changedModel enum('Worker','Calendar','WorkerTimeControlMail','Business','WorkerDms','WorkerTimeControl', 'Locker') NOT NULL DEFAULT 'Worker';
+
+-- Insertar taquillas disponibles para hombres (1A - 73A / 1B - 73B)
+INSERT INTO `vn`.`locker` (code, gender, workerFk) VALUES
+ ('1A', 'M', NULL), ('2A', 'M', NULL), ('3A', 'M', NULL), ('4A', 'M', NULL), ('5A', 'M', NULL),
+ ('6A', 'M', NULL), ('7A', 'M', NULL), ('8A', 'M', NULL), ('9A', 'M', NULL), ('10A', 'M', NULL),
+ ('11A', 'M', NULL), ('12A', 'M', NULL), ('13A', 'M', NULL), ('14A', 'M', NULL), ('15A', 'M', NULL),
+ ('16A', 'M', NULL), ('17A', 'M', NULL), ('18A', 'M', NULL), ('19A', 'M', NULL), ('20A', 'M', NULL),
+ ('21A', 'M', NULL), ('22A', 'M', NULL), ('23A', 'M', NULL), ('24A', 'M', NULL), ('25A', 'M', NULL),
+ ('26A', 'M', NULL), ('27A', 'M', NULL), ('28A', 'M', NULL), ('29A', 'M', NULL), ('30A', 'M', NULL),
+ ('31A', 'M', NULL), ('32A', 'M', NULL), ('33A', 'M', NULL), ('34A', 'M', NULL), ('35A', 'M', NULL),
+ ('36A', 'M', NULL), ('37A', 'M', NULL), ('38A', 'M', NULL), ('39A', 'M', NULL), ('40A', 'M', NULL),
+ ('41A', 'M', NULL), ('42A', 'M', NULL), ('43A', 'M', NULL), ('44A', 'M', NULL), ('45A', 'M', NULL),
+ ('46A', 'M', NULL), ('47A', 'M', NULL), ('48A', 'M', NULL), ('49A', 'M', NULL), ('50A', 'M', NULL),
+ ('51A', 'M', NULL), ('52A', 'M', NULL), ('53A', 'M', NULL), ('54A', 'M', NULL), ('55A', 'M', NULL),
+ ('56A', 'M', NULL), ('57A', 'M', NULL), ('58A', 'M', NULL), ('59A', 'M', NULL), ('60A', 'M', NULL),
+ ('61A', 'M', NULL), ('62A', 'M', NULL), ('63A', 'M', NULL), ('64A', 'M', NULL), ('65A', 'M', NULL),
+ ('66A', 'M', NULL), ('67A', 'M', NULL), ('68A', 'M', NULL), ('69A', 'M', NULL), ('70A', 'M', NULL),
+ ('71A', 'M', NULL), ('72A', 'M', NULL), ('73A', 'M', NULL),
+ ('1B', 'M', NULL), ('2B', 'M', NULL), ('3B', 'M', NULL), ('4B', 'M', NULL), ('5B', 'M', NULL),
+ ('6B', 'M', NULL), ('7B', 'M', NULL), ('8B', 'M', NULL), ('9B', 'M', NULL), ('10B', 'M', NULL),
+ ('11B', 'M', NULL), ('12B', 'M', NULL), ('13B', 'M', NULL), ('14B', 'M', NULL), ('15B', 'M', NULL),
+ ('16B', 'M', NULL), ('17B', 'M', NULL), ('18B', 'M', NULL), ('19B', 'M', NULL), ('20B', 'M', NULL),
+ ('21B', 'M', NULL), ('22B', 'M', NULL), ('23B', 'M', NULL), ('24B', 'M', NULL), ('25B', 'M', NULL),
+ ('26B', 'M', NULL), ('27B', 'M', NULL), ('28B', 'M', NULL), ('29B', 'M', NULL), ('30B', 'M', NULL),
+ ('31B', 'M', NULL), ('32B', 'M', NULL), ('33B', 'M', NULL), ('34B', 'M', NULL), ('35B', 'M', NULL),
+ ('36B', 'M', NULL), ('37B', 'M', NULL), ('38B', 'M', NULL), ('39B', 'M', NULL), ('40B', 'M', NULL),
+ ('41B', 'M', NULL), ('42B', 'M', NULL), ('43B', 'M', NULL), ('44B', 'M', NULL), ('45B', 'M', NULL),
+ ('46B', 'M', NULL), ('47B', 'M', NULL), ('48B', 'M', NULL), ('49B', 'M', NULL), ('50B', 'M', NULL),
+ ('51B', 'M', NULL), ('52B', 'M', NULL), ('53B', 'M', NULL), ('54B', 'M', NULL), ('55B', 'M', NULL),
+ ('56B', 'M', NULL), ('57B', 'M', NULL), ('58B', 'M', NULL), ('59B', 'M', NULL), ('60B', 'M', NULL),
+ ('61B', 'M', NULL), ('62B', 'M', NULL), ('63B', 'M', NULL), ('64B', 'M', NULL), ('65B', 'M', NULL),
+ ('66B', 'M', NULL), ('67B', 'M', NULL), ('68B', 'M', NULL), ('69B', 'M', NULL), ('70B', 'M', NULL),
+ ('71B', 'M', NULL), ('72B', 'M', NULL), ('73B', 'M', NULL);
+
+-- Insertar taquillas disponibles para mujeres (200A - 217A / 200B - 217B)
+INSERT INTO `vn`.`locker` (code, gender, workerFk) VALUES
+('200A', 'F', NULL), ('201A', 'F', NULL), ('202A', 'F', NULL), ('203A', 'F', NULL), ('204A', 'F', NULL),
+('205A', 'F', NULL), ('206A', 'F', NULL), ('207A', 'F', NULL), ('208A', 'F', NULL), ('209A', 'F', NULL),
+('210A', 'F', NULL), ('211A', 'F', NULL), ('212A', 'F', NULL), ('213A', 'F', NULL), ('214A', 'F', NULL),
+('215A', 'F', NULL), ('216A', 'F', NULL), ('217A', 'F', NULL),
+('200B', 'F', NULL), ('201B', 'F', NULL), ('202B', 'F', NULL), ('203B', 'F', NULL), ('204B', 'F', NULL),
+('205B', 'F', NULL), ('206B', 'F', NULL), ('207B', 'F', NULL), ('208B', 'F', NULL), ('209B', 'F', NULL),
+('210B', 'F', NULL), ('211B', 'F', NULL), ('212B', 'F', NULL), ('213B', 'F', NULL), ('214B', 'F', NULL),
+('215B', 'F', NULL), ('216B', 'F', NULL), ('217B', 'F', NULL);
\ No newline at end of file
diff --git a/db/versions/11019-grayDendro/01-aclLocker.sql b/db/versions/11019-grayDendro/01-aclLocker.sql
new file mode 100644
index 000000000..7bc8b12a0
--- /dev/null
+++ b/db/versions/11019-grayDendro/01-aclLocker.sql
@@ -0,0 +1,6 @@
+INSERT INTO `salix`.`ACL` (`model`, `property`, `accessType`, `permission`, `principalType`, `principalId`)
+ VALUES ('Locker', '__get__codes', 'READ', 'ALLOW', 'ROLE', 'employee'),
+ ('Locker', '*', '*', 'ALLOW', 'ROLE', 'hr'),
+ ('Locker', '*', '*', 'ALLOW', 'ROLE', 'productionBoss'),
+ ('Worker', '__get__locker', 'READ', 'ALLOW', 'ROLE', 'hr'),
+ ('Worker', '__get__locker', 'READ', 'ALLOW', 'ROLE', 'productionBoss');
diff --git a/db/versions/11029-tealAnthurium/00-firstScript.sql b/db/versions/11029-tealAnthurium/00-firstScript.sql
deleted file mode 100644
index b54e7a3b5..000000000
--- a/db/versions/11029-tealAnthurium/00-firstScript.sql
+++ /dev/null
@@ -1,2 +0,0 @@
--- Place your SQL code here
-ALTER TABLE vn.productionConfig ADD defaultSectorFk INT UNSIGNED DEFAULT 37 NOT NULL COMMENT 'Default sector';
diff --git a/db/versions/11044-blueOrchid/00-firstScript.sql b/db/versions/11044-blueOrchid/00-firstScript.sql
new file mode 100644
index 000000000..29162820c
--- /dev/null
+++ b/db/versions/11044-blueOrchid/00-firstScript.sql
@@ -0,0 +1,3 @@
+ALTER TABLE vn.invoiceInConfig CHANGE sageWithholdingFk sageFarmerWithholdingFk smallint(6) NOT NULL;
+ALTER TABLE vn.supplier CHANGE isFarmer isFarmer__ tinyint(1) DEFAULT 0 NOT NULL COMMENT 'refs #7345 @deprecated 2024-05-10 - Utilizar withholdingSageFk';
+ALTER TABLE vn.supplier MODIFY COLUMN isFarmer__ tinyint(1) DEFAULT 0 NOT NULL COMMENT 'refs #7345 @deprecated 2024-05-10 - Utilizar withholdingSageFk';
diff --git a/db/versions/11046-maroonCamellia/00-firstScript.sql b/db/versions/11046-maroonCamellia/00-firstScript.sql
new file mode 100644
index 000000000..5e7faad35
--- /dev/null
+++ b/db/versions/11046-maroonCamellia/00-firstScript.sql
@@ -0,0 +1,3 @@
+ALTER TABLE vn.item
+MODIFY nonRecycledPlastic DECIMAL(10,2) DEFAULT NULL NULL,
+MODIFY recycledPlastic DECIMAL(10,2) DEFAULT NULL NULL;
diff --git a/e2e/paths/03-worker/02_basicData.spec.js b/e2e/paths/03-worker/02_basicData.spec.js
index 381375dc7..66a597dd1 100644
--- a/e2e/paths/03-worker/02_basicData.spec.js
+++ b/e2e/paths/03-worker/02_basicData.spec.js
@@ -25,7 +25,6 @@ describe('Worker basic data path', () => {
await page.overwrite(selectors.workerBasicData.name, 'David C.');
await page.overwrite(selectors.workerBasicData.surname, 'H.');
await page.overwrite(selectors.workerBasicData.phone, '444332211');
- await page.overwrite(selectors.workerBasicData.locker, '1');
await page.click(selectors.workerBasicData.saveButton);
const message = await page.waitForSnackbar();
@@ -37,6 +36,5 @@ describe('Worker basic data path', () => {
expect(await page.waitToGetProperty(selectors.workerBasicData.name, 'value')).toEqual('David C.');
expect(await page.waitToGetProperty(selectors.workerBasicData.surname, 'value')).toEqual('H.');
expect(await page.waitToGetProperty(selectors.workerBasicData.phone, 'value')).toEqual('444332211');
- expect(await page.waitToGetProperty(selectors.workerBasicData.locker, 'value')).toEqual('1');
});
});
diff --git a/modules/invoiceIn/back/models/invoice-in-config.json b/modules/invoiceIn/back/models/invoice-in-config.json
index c0236e654..638a97fa3 100644
--- a/modules/invoiceIn/back/models/invoice-in-config.json
+++ b/modules/invoiceIn/back/models/invoice-in-config.json
@@ -26,7 +26,7 @@
"sageWithholding": {
"type": "belongsTo",
"model": "SageWithholding",
- "foreignKey": "sageWithholdingFk"
+ "foreignKey": "sageFarmerWithholdingFk"
}
},
"acls": [{
diff --git a/modules/invoiceIn/front/descriptor/index.html b/modules/invoiceIn/front/descriptor/index.html
index c4330fbf0..97eeaafb7 100644
--- a/modules/invoiceIn/front/descriptor/index.html
+++ b/modules/invoiceIn/front/descriptor/index.html
@@ -1,7 +1,7 @@
diff --git a/modules/invoiceIn/front/descriptor/index.js b/modules/invoiceIn/front/descriptor/index.js
index e005211a3..8fe270fa0 100644
--- a/modules/invoiceIn/front/descriptor/index.js
+++ b/modules/invoiceIn/front/descriptor/index.js
@@ -112,7 +112,7 @@ class Controller extends Descriptor {
}
isAgricultural() {
- return this.invoiceIn.supplier.sageWithholdingFk == this.config[0].sageWithholdingFk;
+ return this.invoiceIn.supplier.sageWithholdingFk == this.config[0].sageFarmerWithholdingFk;
}
}
diff --git a/modules/worker/back/methods/worker-time-control/resendWeeklyHourEmail.js b/modules/worker/back/methods/worker-time-control/resendWeeklyHourEmail.js
index 896458455..885637118 100644
--- a/modules/worker/back/methods/worker-time-control/resendWeeklyHourEmail.js
+++ b/modules/worker/back/methods/worker-time-control/resendWeeklyHourEmail.js
@@ -1,3 +1,5 @@
+const moment = require('moment');
+
module.exports = Self => {
Self.remoteMethodCtx('resendWeeklyHourEmail', {
description: 'Send the records for the week of the date provided',
@@ -31,7 +33,8 @@ module.exports = Self => {
Object.assign(myOptions, options);
const yearNumber = dated.getFullYear();
- const weekNumber = getWeekNumber(dated);
+ const weekNumber = moment(dated).isoWeek();
+
const workerTimeControlMail = await models.WorkerTimeControlMail.findOne({
where: {
workerFk: workerId,
@@ -54,15 +57,4 @@ module.exports = Self => {
return false;
};
-
- function getWeekNumber(date) {
- const tempDate = new Date(date);
- let dayOfWeek = tempDate.getDay();
- dayOfWeek = (dayOfWeek === 0) ? 7 : dayOfWeek;
- const firstDayOfWeek = new Date(tempDate.getFullYear(), tempDate.getMonth(), tempDate.getDate() - (dayOfWeek - 1));
- const firstDayOfYear = new Date(tempDate.getFullYear(), 0, 1);
- const differenceInMilliseconds = firstDayOfWeek.getTime() - firstDayOfYear.getTime();
- const weekNumber = Math.floor(differenceInMilliseconds / (1000 * 60 * 60 * 24 * 7)) + 1;
- return weekNumber;
- }
};
diff --git a/modules/worker/back/model-config.json b/modules/worker/back/model-config.json
index e1a47b7e9..b7c355511 100644
--- a/modules/worker/back/model-config.json
+++ b/modules/worker/back/model-config.json
@@ -121,6 +121,9 @@
},
"Operator": {
"dataSource": "vn"
+ },
+ "Locker": {
+ "dataSource": "vn"
}
}
diff --git a/modules/worker/back/models/locker.js b/modules/worker/back/models/locker.js
new file mode 100644
index 000000000..4475c2cd1
--- /dev/null
+++ b/modules/worker/back/models/locker.js
@@ -0,0 +1,21 @@
+module.exports = Self => {
+ Self.observe('before save', async ctx => {
+ const models = Self.app.models;
+ const changes = ctx.data || ctx.instance;
+ const instance = ctx.currentInstance;
+
+ const workerFk = changes?.workerFk || instance?.workerFk;
+ if (workerFk) {
+ const locker = await models.Locker.findOne({
+ where: {workerFk}
+ }, ctx.options);
+
+ if (locker) {
+ await Self.rawSql(
+ 'UPDATE locker SET workerFk = NULL where workerFk = ?',
+ [workerFk],
+ ctx.options);
+ }
+ }
+ });
+};
diff --git a/modules/worker/back/models/locker.json b/modules/worker/back/models/locker.json
new file mode 100644
index 000000000..335fca5a9
--- /dev/null
+++ b/modules/worker/back/models/locker.json
@@ -0,0 +1,23 @@
+{
+ "name": "Locker",
+ "base": "VnModel",
+ "description": "Worker's locker",
+ "options": {
+ "mysql": {
+ "table": "locker"
+ }
+ },
+ "properties": {
+ "code": {
+ "type": "string"
+ },
+ "gender": {
+ "type": "string"
+ }
+ },
+ "scopes": {
+ "codes": {
+ "fields": ["id","code"]
+ }
+ }
+}
diff --git a/modules/worker/back/models/specs/locker.spec.js b/modules/worker/back/models/specs/locker.spec.js
new file mode 100644
index 000000000..32abb830e
--- /dev/null
+++ b/modules/worker/back/models/specs/locker.spec.js
@@ -0,0 +1,56 @@
+const {models} = require('vn-loopback/server/server');
+
+describe('locker model ', () => {
+ const productionBossId = 50;
+ const hrBuyerId = 124;
+ const hrId = 37;
+ const jessicaJonesId = 1110;
+ const bruceBannerId = 1109;
+ const lockerMaleId = 1;
+ const lockerFemaleId = 147;
+ let ctx;
+ let options;
+ let tx;
+
+ beforeEach(async() => {
+ ctx = {
+ req: {
+ accessToken: {userId: hrId},
+ headers: {origin: 'http://localhost'}
+ },
+ };
+ options = {transaction: tx};
+ tx = await models.Locker.beginTransaction({});
+ options.transaction = tx;
+ });
+
+ afterEach(async() => {
+ await tx.rollback();
+ });
+
+ it('should allocate a locker', async() => {
+ ctx.req.accessToken.userId = productionBossId;
+
+ const locker = await models.Locker.findById(lockerMaleId, null, options);
+ await locker.updateAttributes({workerFk: bruceBannerId}, options);
+
+ expect(locker.workerFk).toEqual(bruceBannerId);
+ });
+
+ it('should take away a locker', async() => {
+ ctx.req.accessToken.userId = hrBuyerId;
+ const locker = await models.Locker.findById(lockerFemaleId, null, options);
+ await locker.updateAttributes({workerFk: null}, options);
+
+ expect(locker.workerFk).toEqual(null);
+ });
+
+ it('should change a locker', async() => {
+ const locker = await models.Locker.findById(148, null, options);
+ await locker.updateAttributes({workerFk: jessicaJonesId}, options);
+ const oldLocker = await models.Locker.findById(lockerFemaleId, null, options);
+
+ expect(locker.workerFk).toEqual(jessicaJonesId);
+ expect(oldLocker.workerFk).toEqual(null);
+ });
+});
diff --git a/modules/worker/back/models/worker.js b/modules/worker/back/models/worker.js
index b475bf26e..076f2eaab 100644
--- a/modules/worker/back/models/worker.js
+++ b/modules/worker/back/models/worker.js
@@ -21,10 +21,6 @@ module.exports = Self => {
require('../methods/worker/isAuthorized')(Self);
require('../methods/worker/setPassword')(Self);
- Self.validatesUniquenessOf('locker', {
- message: 'This locker has already been assigned'
- });
-
Self.validateAsync('fi', tinIsValid, {
message: 'Invalid TIN'
});
diff --git a/modules/worker/back/models/worker.json b/modules/worker/back/models/worker.json
index 1f2b6be27..adfe2c58e 100644
--- a/modules/worker/back/models/worker.json
+++ b/modules/worker/back/models/worker.json
@@ -48,9 +48,6 @@
"code": {
"type" : "string"
},
- "locker": {
- "type" : "number"
- },
"fi": {
"type" : "string"
},
@@ -60,6 +57,9 @@
"isF11Allowed": {
"type" : "boolean"
},
+ "sex": {
+ "type" : "string"
+ },
"isFreelance": {
"type" : "boolean"
}
@@ -94,6 +94,20 @@
"type": "hasMany",
"model": "WorkerTeamCollegues",
"foreignKey": "workerFk"
+ },
+ "locker": {
+ "type": "hasMany",
+ "model": "Locker",
+ "foreignKey": "workerFk"
}
- }
+ },
+ "acls":[
+ {
+ "property": "__get__locker",
+ "accessType": "READ",
+ "permission": "ALLOW",
+ "principalType": "ROLE",
+ "principalId": "$owner"
+ }
+ ]
}
diff --git a/modules/worker/front/basic-data/index.html b/modules/worker/front/basic-data/index.html
index 2d85d018d..aa3f6ca79 100644
--- a/modules/worker/front/basic-data/index.html
+++ b/modules/worker/front/basic-data/index.html
@@ -75,11 +75,6 @@
ng-model="$ctrl.worker.SSN"
rule>
-
-
diff --git a/package.json b/package.json
index a7415f2f9..906b86dff 100644
--- a/package.json
+++ b/package.json
@@ -39,6 +39,7 @@
"loopback-context": "^3.5.2",
"loopback-datasource-juggler": "3.36.1",
"md5": "^2.2.1",
+ "moment": "^2.30.1",
"mysql": "2.18.1",
"node-ssh": "^11.0.0",
"object.pick": "^1.3.0",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index d3959ac03..c4425d3dc 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -83,6 +83,9 @@ dependencies:
md5:
specifier: ^2.2.1
version: 2.3.0
+ moment:
+ specifier: ^2.30.1
+ version: 2.30.1
mysql:
specifier: 2.18.1
version: 2.18.1
@@ -10202,6 +10205,10 @@ packages:
to-iso-string: 0.0.2
dev: false
+ /moment@2.30.1:
+ resolution: {integrity: sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==}
+ dev: false
+
/ms@0.7.1:
resolution: {integrity: sha512-lRLiIR9fSNpnP6TC4v8+4OU7oStC01esuNowdQ34L+Gk8e5Puoc88IqJ+XAY/B3Mn2ZKis8l8HX90oU8ivzUHg==}
dev: false