<?php
/*
    Desarrollador: Ing. Jean Jairo Benitez Meza
    Ultima Modificación: 02/05/2023
    Módulo: Gestión de Adquisiciones
*/
namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Carbon;
use Illuminate\Support\Facades\DB;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Validator;
use App\Http\Controllers\ResponseController;
use App\Http\Controllers\ResourcesController;
use App\Http\Controllers\EncryptionController;
use App\Http\Controllers\DocumentManagementController;
use App\Http\Controllers\FunctionsController;


class ArtitleController extends Controller {

    private $responseController;
    private $encController;
    private $resourcesController;
    private $documentManagementController;
    private $functionsController;

    public function __construct() {
        $this->responseController = new ResponseController();
        $this->encController = new EncryptionController();
        $this->resourcesController = new ResourcesController();
        $this->documentManagementController = new DocumentManagementController();
        $this->functionsController = new FunctionsController();
    }

    // Función para obtener todas las familias
    public function getFamilies() {
        try {
            $arrFamilias = DB::table('S002V01TFAMI')
                ->get([
                    'FAMI_IDFA AS ID_FAMILIA',
                    'FAMI_NOMB AS FAMILIA',
                ]);
        } catch (\Throwable $th) {
            return $this->responseController->makeResponse(true, "ERR_ARTITLE_GETFAMILY000: No se pudo realizar la consulta a la base.", $th->getMessage(), 500);
        }
        return $this->responseController->makeResponse(false, "ÉXITO: Consulta Exitosa", $arrFamilias);
    }

    // Función para obtener todas las familias activas
    public function getFamiliesActives() {
        try {
            $arrFamiliasActives = DB::table('S002V01TFAMI')
                ->where('FAMI_ESTA', '=', 'Activo')
                ->get([
                    'FAMI_IDFA',
                    'FAMI_NOMB',
                ]);
        } catch (\Throwable $th) {
            return $this->responseController->makeResponse(true, "ERR_ARTITLE_GETFAMILIACTIVE000: No se pudo realizar la consulta a la base.", $th->getMessage(), 500);
        }
        return $this->responseController->makeResponse(false, "ÉXITO", $arrFamiliasActives);
    }

    // Función para obtener las familias y las subfamilias activas
    public function getFamiliesAndSubfamilies ($line) {
        try {
            $arrFamilias = DB::table('S002V01TFAMI')
                ->where('FAMI_ESTA', '=', 'Activo')
                ->where('FAMI_NULI', '=', $line)
                ->get([
                    'FAMI_IDFA AS ID_FAMILIA',
                    'FAMI_NOMB AS FAMILIA',
                ]);
        } catch (\Throwable $th) {
            return $this->responseController->makeResponse(true, "ERR_ARTITLE_GETFAMILYS000: No se pudo realizar la consulta de las familias en la base.", $th->getMessage(), 500);
        }
        
        try {
            $arrSubfamilias = DB::table('S002V01TSUBF')
                ->where('SUBF_ESTA', '=', 'Activo')
                ->where('SUBF_NULI', '=', $line)
                ->get([
                    'SUBF_IDSU AS ID_SUBFAMILIA',
                    'SUBF_NOMB AS SUBFAMILIA',
                    'SUBF_IDFA AS ID_FAMILIA',
                ]);
        } catch (\Throwable $th) {
            return $this->responseController->makeResponse(true, "ERR_ARTITLE_GETFAMILYS001: No se pudo realizar la consulta de las subfamilias en la base.", $th->getMessage(), 500);
        }

        $arrFamilasAndSubfamilias = array();
        foreach ($arrFamilias as $keyFamilias => $familias) {
            $familias->SUBFAMILIAS = array();
            foreach ($arrSubfamilias as $keySubfamilias => $subfamilias) {
                if ($familias->ID_FAMILIA == $subfamilias->ID_FAMILIA) {
                    $familias->SUBFAMILIAS[] = array(
                        "ID_SUBFAMILIA" => $subfamilias->ID_SUBFAMILIA,
                        "SUBFAMILIA" => $subfamilias->SUBFAMILIA,
                    );
                }
            }
        }

        return $this->responseController->makeResponse(false, "ÉXITO: Consulta Exitosa", $arrFamilias);
    }

    public function registerFamily(Request $request){
        $valitador = Validator::make($request->all(), [
            'FAMILIA' => 'required|string|max:50',
            'LINE' => 'required|integer',
            'USER' => 'required|string'
        ]);
        if ($valitador->fails()) {
            return $this->responseController->makeResponse(
                true,
                "ERR_FAMILY_REG000: Se encontraron uno o más errores.",
                $this->responseController->makeErrors($valitador->errors()->messages()),
                401
            );
        }

        DB::beginTransaction();
        $response = $request->all();
        try {
            $usuario = $this->encController->decrypt($response['USER']);
        } catch (\Throwable $th) {
            DB::rollBack();
            return $this->responseController->makeResponse(true, "ERR_FAMILY_REG001: Ocurrió un error al desencriptar los datos.", [], 401);
        }

        // $currentDate = Carbon::now()->timezone('America/Mazatlan')->toDateTimeString();
        $now = $this->functionsController->now();
        $currentDate = $now->toDateTimeString();

        $arrInsert = [
            "FAMI_NOMB" => trim($response['FAMILIA']),
            "FAMI_USRE" => $usuario,
            "FAMI_NULI" => $response['LINE'],
            "FAMI_FERE" => $currentDate,
            "FAMI_FEAR" => DB::raw('CURRENT_TIMESTAMP')
        ];

        try {
            $valid = DB::table('S002V01TFAMI')->insert($arrInsert);
        } catch (\Throwable $th) {
            DB::rollBack();
            return $this->responseController->makeResponse(true, "ERR_FAMILY_REG002: Ocurrió un error al ingresar los registros.", [], 401);
        }

        if (!$valid) {
            DB::rollBack();
            return $this->responseController->makeResponse(true, "ERR_FAMILY_REG003: No se pudo ingresar los datos a la base de datos.", [], 401);
        }
        DB::commit();
        return $this->responseController->makeResponse(false, "ÉXITO: Registro Exitoso");
    }

    public function getUnits($line) {
        try {
            $arrFamilias = DB::table('S002V01TUNID')
                ->where('UNID_NULI', '=', $line)
                ->get([
                    'UNID_IDUN AS ID_UNIDAD',
                    'UNID_NOMB AS UNIDAD',
                    'UNID_ESTA AS ESTADO',
                    'UNID_USRE AS USUARIO_REGISTRA',
                    'UNID_FERE AS FECHA_REGISTRA',
                    'UNID_USMO AS USUARIO_MODIFICA',
                    'UNID_FEMO AS FECHA_MODIFICA',
                ]);
        } catch (\Throwable $th) {
            return $this->responseController->makeResponse(true, "ERR_ARTITLE_GETUNITS000: No se pudo realizar la consulta a la base.", [], 500);
        }
        return $this->responseController->makeResponse(false, "ÉXITO", $arrFamilias);
    }

    public function getUnitsActives($line) {
        try {
            $arrFamilias = DB::table('S002V01TUNID')
                ->where('UNID_NULI', '=', $line)
                ->where('UNID_ESTA', '=', 'Activo')
                ->get([
                    'UNID_IDUN AS ID_UNIDAD',
                    'UNID_NOMB AS UNIDAD',
                    'UNID_USRE AS USUARIO_REGISTRA',
                    'UNID_FERE AS FECHA_REGISTRA',
                    'UNID_USMO AS USUARIO_MODIFICA',
                    'UNID_FEMO AS FECHA_MODIFICA',
                ]);
        } catch (\Throwable $th) {
            return $this->responseController->makeResponse(true, "ERR_ARTITLE_GETUNITACTIVE000: No se pudo realizar la consulta a la base.", [], 500);
        }
        return $this->responseController->makeResponse(false, "ÉXITO: Consulta Exitosa", $arrFamilias);
    }

    public function registerUnit(Request $request){
        $valitador = Validator::make($request->all(), [
            'UNIDAD' => 'required|string|max:50',
            'LINE' => 'required|integer',
            'USER' => 'required|string'
        ]);
        if ($valitador->fails()) {
            return $this->responseController->makeResponse(
                true,
                "ERR_ARTITLE_REGUNIT000: Se encontraron uno o más errores.",
                $this->responseController->makeErrors($valitador->errors()->messages()),
                401
            );
        }
        DB::beginTransaction();
        $response = $request->all();
        try {
            $usuario = $this->encController->decrypt($response['USER']);
        } catch (\Throwable $th) {
            DB::rollBack();
            return $this->responseController->makeResponse(true, "ERR_ARTITLE_REGUNIT001: Ocurrió un error al desencriptar los datos.", [], 401);
        }

        // $currentDate = Carbon::now()->timezone('America/Mazatlan')->toDateTimeString();
        $now = $this->functionsController->now();
        $currentDate = $now->toDateTimeString();

        $arrInsert = [
            "UNID_NOMB" => trim($response['UNIDAD']),
            "UNID_USRE" => $usuario,
            "UNID_NULI" => $response['LINE'],
            "UNID_FERE" => $currentDate,
            "UNID_FEAR" => DB::raw('CURRENT_TIMESTAMP')
        ];

        try {
            $valid = DB::table('S002V01TUNID')->insert($arrInsert);
        } catch (\Throwable $th) {
            DB::rollBack();
            return $this->responseController->makeResponse(true, "ERR_ARTITLE_REGUNIT002: Ocurrió un error al ingresar los registros.", [], 401);
        }

        if (!$valid) {
            DB::rollBack();
            return $this->responseController->makeResponse(true, "ERR_ARTITLE_REGUNIT003: No se pudo ingresar los datos a la base de datos.", [], 401);
        }
        DB::commit();
        return $this->responseController->makeResponse(false, "ÉXITO: Registro Exitoso");
    }

    public function registerSubfamily(Request $request){
        $valitador = Validator::make($request->all(), [
            'ID_FAMILIA' => 'required|integer',
            'SUBFAMILIA' => 'required|string|max:50',
            'LINE' => 'required|integer',
            'USER' => 'required|string'
        ]);
        if ($valitador->fails()) {
            return $this->responseController->makeResponse(
                true,
                "ERR_SUBFAMILY_REG000: Se encontraron uno o más errores.",
                $this->responseController->makeErrors($valitador->errors()->messages()),
                401
            );
        }

        DB::beginTransaction();
        $response = $request->all();

        try {
            $exist = DB::table('S002V01TFAMI')
                ->where('FAMI_IDFA', '=', trim($response['ID_FAMILIA']))
                ->where('FAMI_ESTA', '=', 'Activo')
                ->where('FAMI_NULI', '=', $response['LINE'])
                ->exists();
        } catch (\Throwable $th) {
            DB::rollBack();
            return $this->responseController->makeResponse(true, "ERR_SUBFAMILY_REG002: Ocurrió al verificar la Familia.", [], 401);
        }
        if (!$exist) {
            return $this->responseController->makeResponse(true, "ERR_SUBFAMILY_REG003: La Familia seleccionada no existe.", [], 401);
        }

        try {
            $user = $this->encController->decrypt($response['USER']);
        } catch (\Throwable $th) {
            DB::rollBack();
            return $this->responseController->makeResponse(true, "ERR_SUBFAMILY_REG001: Ocurrió un error al desencriptar los datos.", [], 401);
        }

        $now = $this->functionsController->now();
        $currentDate = $now->toDateTimeString();
        // $currentDate = Carbon::now()->timezone('America/Mazatlan')->toDateTimeString();

        $arrInsert = [
            "SUBF_IDFA" => $response['ID_FAMILIA'],
            "SUBF_NOMB" => $response['SUBFAMILIA'],
            "SUBF_USRE" => $user,
            "SUBF_NULI" => $response['LINE'],
            "SUBF_FERE" => $currentDate,
            "SUBF_FEAR" => DB::raw('CURRENT_TIMESTAMP')
        ];

        try {
            $valid = DB::table('S002V01TSUBF')->insert($arrInsert);
        } catch (\Throwable $th) {
            DB::rollBack();
            return $this->responseController->makeResponse(true, "ERR_SUBFAMILY_REG004: Ocurrió un error al ingresar los registros.", [], 401);
        }
        if (!$valid) {
            DB::rollBack();
            return $this->responseController->makeResponse(true, "ERR_SUBFAMILY_REG005: No se pudo ingresar los datos a la base de datos.", [], 401);
        }
        DB::commit();
        return $this->responseController->makeResponse(false, "ÉXITO: Registro Exitoso");
    }

    public function getArtitles($line) {
        try {
            $getArtitle = DB::table('S002V01TARTI')
                ->where("ARTI_NULI", "=", $line)
                ->where("FAMI_NULI", "=", $line)
                ->where("SUBF_NULI", "=", $line)
                ->where("DEAR_NULI", "=", $line)
                ->where("PROV_NULI", "=", $line)
                ->where("UNID_NULI", "=", $line)
                ->where("ARTI_ESTA", "=", "Activo")
                ->where("FAMI_ESTA", "=", "Activo")
                ->where("SUBF_ESTA", "=", "Activo")
                ->where("DEAR_ESTA", "=", "Activo")
                ->where("PROV_ESTA", "=", "Activo")
                ->where("UNID_ESTA", "=", "Activo")

                ->join("S002V01TFAMI", "ARTI_IDFA", "=", "FAMI_IDFA")
                ->join("S002V01TSUBF", "ARTI_IDSU", "=", "SUBF_IDSU")
                ->join("S002V01TDEAR", "ARTI_IDAR", "=", "DEAR_IDAR")
                ->join("S002V01TPROV", "DEAR_NUPR", "=", "PROV_NUPR")
                ->join("S002V01TUNID", "DEAR_IDUN", "=", "UNID_IDUN")

                ->get([
                    "DEAR_IDDE AS ID_DESC_ARTI",
                    "ARTI_IDAR AS ID_ARTICULO",
                    "ARTI_NOMB AS MODELO",
                    "FAMI_IDFA AS ID_FAMILIA",
                    "FAMI_NOMB AS FAMILIA",
                    "SUBF_IDSU AS ID_SUBFAMILIA",
                    "SUBF_NOMB AS SUBFAMILIA",
                    "DEAR_DESC AS DESCRIPCION",
                    "DEAR_CARA AS CARACTERISTICAS",
                    "DEAR_COWE AS COMPRA_WEB",
                    "DEAR_IDUN AS TIPO_UNIDAD",
                    "DEAR_IMAG AS URL_IMAGEN",
                    "PROV_NUPR AS ID_PROVEEDOR",
                    "PROV_NOCO AS PROVEEDOR",
                ]);
        } catch (\Throwable $th) {
            return $this->responseController->makeResponse(true, "ERR_ARTITLE_GET000: No se pudo realizar la consulta a la base.", $th->getMessage(), 500);
        }
        
        foreach ($getArtitle as $artitle) {

            $arrImagen = json_decode($artitle->URL_IMAGEN);
            $user = 'SFJKU29aaUtYbWwweFFzcmV4RVd6UEtNbWtlbU9VdkE3Vjg9fEU4N3pWWGFuWm5EbXBJaG1nZVl4RWJQcWtPTGZmT25H';

            $arrUrlImage = array();
            foreach ($arrImagen as $key => $imagen) {
                $responseDocument = $this->documentManagementController->getPublicDocumentURL($imagen, $user, $line);
                
                $arrResponseDocument = json_decode($responseDocument->original, true);
                if ($arrResponseDocument['error']) {
                    return $this->responseController->makeResponse(true, "ERR_ARTITLE_GET003: Ocurrió un error al obtener la URL de la imágen.", [], 500);
                }
                $arrUrlImage[] = $arrResponseDocument['response']['public_uri'];
            }
            $artitle->URL_IMAGEN = $arrUrlImage;
                
        }
        return $this->responseController->makeResponse(false, "ÉXITO: Consulta Exitosa", $getArtitle);
    }

    public function getArtitlesByProvider(Request $request) {
        $validator = Validator::make($request->all(), [
            'lineNumber' => 'required|integer',
            'idArtitle' => 'required|string',
            'idProvider' => 'required|string'
        ]);
        if ($validator->fails()) {
            return $this->responseController->makeResponse(
                true,
                "ERR_ARTITLE_GETBYPROVIDER000: Se encontraron uno o más errores.",
                $this->responseController->makeErrors($validator->errors()->messages()),
                401
            );
        }

        $dataRequest = $request->all();
        $idArtitle = $this->encController->decrypt( $dataRequest['idArtitle'] );
        $idProvider = $this->encController->decrypt( $dataRequest['idProvider'] );
        
        try {
            $objArtitle = (array) DB::table('S002V01TDEAR')
                ->where("ARTI_NULI", "=", $dataRequest['lineNumber'])
                ->where("DEAR_IDDE", "=", $idArtitle)
                ->where("DEAR_NUPR", "=", $idProvider)
                ->join("S002V01TARTI", "ARTI_IDAR", "=", "DEAR_IDAR")
                ->join("S002V01TFAMI", "ARTI_IDFA", "=", "FAMI_IDFA")
                ->join("S002V01TSUBF", "ARTI_IDSU", "=", "SUBF_IDSU")
                ->join("S002V01TPROV", "DEAR_NUPR", "=", "PROV_NUPR")
                ->join("S002V01TUNID", "DEAR_IDUN", "=", "UNID_IDUN")
                ->first([
                    "DEAR_IDDE AS ID_DESC_ARTI",
                    "ARTI_IDAR AS ID_ARTICULO",
                    // "ARTI_CODI AS CODIGO",
                    "ARTI_NOMB AS MODELO",
                    "FAMI_IDFA AS ID_FAMILIA",
                    "FAMI_NOMB AS FAMILIA",
                    "SUBF_IDSU AS ID_SUBFAMILIA",
                    "SUBF_NOMB AS SUBFAMILIA",
                    "DEAR_DESC AS DESCRIPCION",
                    "DEAR_CARA AS CARACTERISTICAS",
                    "DEAR_COWE AS COMPRA_WEB",
                    "UNID_IDUN AS ID_UNIDAD",
                    "UNID_NOMB AS UNIDAD",
                    // "DEAR_INPR AS INFO_PRODUCTO",
                    "DEAR_IMAG AS URL_IMAGEN",
                    "PROV_NUPR AS ID_PROVEEDOR",
                    "PROV_NOCO AS PROVEEDOR",
                ]);
        } catch (\Throwable $th) {
            return $this->responseController->makeResponse(true, "ERR_ARTITLE_GETBYPROVIDER001: No se pudo realizar la consulta a la base.", $th->getMessage(), 500);
        }

        
        if ( empty($objArtitle) ) {
            return $this->responseController->makeResponse(true, "ERR_ARTITLE_GETBYPROVIDER002: No se encontró el resultado deseado.", [], 500);
        }
        
        $objArtitle['URL_IMAGEN'] = json_decode($objArtitle['URL_IMAGEN']);

        try {
            $arrInformation = DB::table('S002V01TINAR')
                ->where('INAR_ESTA', '=', 'Activo')
                ->where('INAR_NULI', '=', $dataRequest['lineNumber'])
                ->where('INAR_IDDE', '=', $objArtitle['ID_DESC_ARTI'])
                ->join('S002V01TCAMO', 'CAMO_COMO', '=', 'INAR_COMO')
                ->get([
                    'INAR_IDIN AS NUMERO_INFORMACION',
                    'INAR_CODI AS CODIGO',
                    'INAR_MODE AS MODELO',
                    // DB::raw('CONCAT("(", CAMO_COMO, ") ", CAMO_DESC) AS MONEDA'),
                    'CAMO_COMO AS MONEDA',
                    'CAMO_DESC AS MONEDA_DESCRIPCION',
                    'INAR_PREC AS PRECIO',
                    'INAR_MOMI AS MONTO_MINIMO',
                    'INAR_CARA AS CARACTERISTICAS',
                ]);
        } catch (\Throwable $th) {
            return $this->responseController->makeResponse(true, "ERR_ARTITLE_GETBYPROVIDER003: No se pudo realizar la consulta a la base.", $th->getMessage(), 500);
        }

        $objArtitle['INFO_PRODUCTO'] = json_encode($arrInformation);
        return $this->responseController->makeResponse(false, "ÉXITO: Consulta Exitosa", $objArtitle);
    }

    public function getArtitleById($encIdArtitle, $line) {
        
        $idArtitle = $this->encController->decrypt($encIdArtitle);
        try {
            $arrArtitle = DB::table('S002V01TARTI')
                ->where('ARTI_IDAR', '=', $idArtitle)
                ->where('ARTI_ESTA', '=', 'Activo')
                ->where('ARTI_NULI', '=', $line)
                ->join("S002V01TFAMI", "ARTI_IDFA", "=", "FAMI_IDFA")
                ->join("S002V01TSUBF", "ARTI_IDSU", "=", "SUBF_IDSU")
                ->first([
                    'ARTI_IDAR AS NUMERO_ARTICULO',
                    'ARTI_CODI AS CODIGO',
                    "FAMI_IDFA AS ID_FAMILIA",
                    "FAMI_NOMB AS FAMILIA",
                    "SUBF_IDSU AS ID_SUBFAMILIA",
                    "SUBF_NOMB AS SUBFAMILIA",
                    'ARTI_NOMB AS ARTICULO',
                ]);

        } catch (\Throwable $th) {
            return $this->responseController->makeResponse(true, "ERR_ARTITLE_GET001: No se pudo realizar la consulta a la base.", $th->getMessage(), 500);
        }

        try {
            $arrDescription = DB::table('S002V01TDEAR')
                ->where('DEAR_IDAR', '=', $idArtitle)
                ->where('DEAR_ESTA', '=', 'Activo')
                ->where('DEAR_NULI', '=', $line)
                ->join("S002V01TUNID", "DEAR_IDUN", "=", "UNID_IDUN")
                ->get([
                    'DEAR_IDDE AS ID_DESCRIPCION',
                    'DEAR_DESC AS DESCRIPCION',
                    'DEAR_CARA AS CARACTERISTICAS',
                    'DEAR_COWE AS COMPRA_WEB',
                    'DEAR_IDUN AS TIPO_UNIDAD',
                    'DEAR_IMAG AS IMAGEN',
                    'DEAR_NUPR AS PROVEEDOR',
                    'DEAR_ESTA AS ESTADO',
                ]);
        } catch (\Throwable $th) {
            return $this->responseController->makeResponse(true, "ERR_ARTITLE_GET002: No se pudo realizar la consulta a la base.", $th->getMessage(), 500);
        }
        if ( empty($arrDescription) ) {
            return $this->responseController->makeResponse(true, "ERR_ARTITLE_GET003: No se encontró ninguna descripción.", [], 500);
        }
        // Se obtienen las URL de las imagenes de los artículos
        foreach ($arrDescription as $description) {
            $arrImagen = json_decode($description->IMAGEN);
            $user = 'SFJKU29aaUtYbWwweFFzcmV4RVd6UEtNbWtlbU9VdkE3Vjg9fEU4N3pWWGFuWm5EbXBJaG1nZVl4RWJQcWtPTGZmT25H';
            
            $arrUrlImage = array();
            foreach ($arrImagen as $key => $imagen) {
                $responseDocument = $this->documentManagementController->getPublicDocumentURL($imagen, $user, $line);
                
                $arrResponseDocument = json_decode($responseDocument->original, true);
                if ($arrResponseDocument['error']) {
                    return $this->responseController->makeResponse(true, "ERR_ARTITLE_GET003: Ocurrió un error al obtener la URL de la imágen.", [], 500);
                }
                $arrUrlImage[] = $arrResponseDocument['response']['public_uri'];
            }
            $description->IMAGEN = $arrUrlImage;
        }

        foreach ($arrDescription as $description) {
            try {
                $arrDetails = DB::table('S002V01TINAR')
                    ->where('INAR_IDDE', '=', $description->ID_DESCRIPCION)
                    ->where('INAR_ESTA', '=', 'Activo')
                    ->where('INAR_NULI', '=', $line)
                    ->join('S002V01TCAMO', 'CAMO_COMO', '=', 'INAR_COMO')
                    ->get([
                        'INAR_IDIN AS NUMERO_DETALLE',
                        'INAR_CODI AS CODIGO',
                        'INAR_MODE AS MODELO',
                        DB::raw('CONCAT("(", CAMO_COMO, ") ", CAMO_DESC) AS MONEDA'),
                        'INAR_PREC AS PRECIO',
                        'INAR_MOMI AS MONTO_MINIMO',
                        // 'INAR_CANT AS CANTIDAD',
                        'INAR_CARA AS CARACTERISTICAS',
                        'INAR_ESTA AS ESTADO',
                    ]);
            } catch (\Throwable $th) {
                return $this->responseController->makeResponse(true, "ERR_ARTITLE_GET004: No se pudo realizar la consulta a la base.", $th->getMessage(), 500);
            }

            $description->DETALLES = $arrDetails;
            try {
                $objProdiver = DB::table('S002V01TPROV')
                    ->where('PROV_NUPR', '=', $description->PROVEEDOR)
                    ->where('PROV_ESTA', '=', 'Activo')
                    ->where('PROV_NULI', '=', $line)
                    ->first([
                        'PROV_NUPR AS NUMERO_PROVEEDOR',
                        'PROV_NOCO AS RAZON_SOCIAL',
                        'PROV_NOMB AS NOMBRE',
                        'PROV_APPA AS PRIMER_APELLIDO',
                        'PROV_APMA AS SEGUNDO_APELLIDO',
                        'PROV_CORR AS CORREO',
                        'PROV_LAD1 AS LADA1',
                        'PROV_TEL1 AS TELEFONO1',
                        'PROV_LAD2 AS LADA2',
                        'PROV_TEL2 AS TELEFONO2',
                        'PROV_XRFC AS RFC',
                        'PROV_XTAX AS TAXID',
                        'PROV_CRFI AS GIRO_EMPRESA',
                        'PROV_TIPO AS TIPO_EMPRESA',
                        'PROV_SIWE AS SITIO_WEB',
                        'PROV_MEPA AS METODO_PAGO',
                        'PROV_USRE AS USUARIO_REGISTRA',
                        'PROV_FERE AS FECHA_REGISTRA',
                        'PROV_USMO AS USUARIO_MODIFICA',
                        'PROV_FEMO AS FECHA_MODIFICA',
                    ]);
            $description->PROVEEDOR = $objProdiver;
            } catch (\Throwable $th) {
                return $this->responseController->makeResponse(true, "ERR_ARTITLE_GET005: No se pudo realizar la consulta a la base.", $th->getMessage(), 500);
            }
        }

        $arrArtitle->INFORMACION = $arrDescription;

        return $this->responseController->makeResponse(false, "ÉXITO: Consulta Exitosa", $arrArtitle);
    }

    public function getAllArtitles($line) {
        try {
            $resp = DB::table('S002V01TARTI')
                ->where("ARTI_NULI", "=", $line)
                ->join("S002V01TFAMI", "ARTI_IDFA", "=", "FAMI_IDFA")
                ->join("S002V01TSUBF", "ARTI_IDSU", "=", "SUBF_IDSU")
                ->get([
                    "ARTI_IDAR AS ID_ARTICULO",
                    "ARTI_NOMB AS MODELO",
                    "FAMI_IDFA AS ID_FAMILIA",
                    "FAMI_NOMB AS FAMILIA",
                    "SUBF_IDSU AS ID_SUBFAMILIA",
                    "SUBF_NOMB AS SUBFAMILIA",
                    "ARTI_ESTA AS ESTADO",
                    "ARTI_USRE AS USUARIO_REGISTRA",
                    "ARTI_FERE AS FECHA_REGISTRA",
                    "ARTI_USMO AS USUARIO_MODIFICA",
                    "ARTI_FEMO AS FECHA_MODIFICA",
                ]);
        } catch (\Throwable $th) {
            return $this->responseController->makeResponse(true, "ERR_ARTITLE_GETALL000: No se pudo realizar la consulta a la base.", [], 500);
        }
        return $this->responseController->makeResponse(false, "ÉXITO: Consulta Exitosa", $resp);
    }

    public function registerArtitles(Request $request) {
        $validator = Validator::make($request->all(), [
            'CODIGO' => 'required|string',
            'ARTICULO' => 'required|string',
            'FAMILIA' => 'required|integer',
            'SUBFAMILIA' => 'required|integer',
            'INFORMATION' => 'required|array',
            'USUARIO' => 'required|string',
            'NUMERO_LINEA' => 'required|string',
        ]);
        if ($validator->fails()) {
            return $this->responseController->makeResponse(
                true,
                "ERR_ARTITLE_REG000: Se encontraron uno o más errores.",
                $this->responseController->makeErrors($validator->errors()->messages()),
                401
            );
        }
        DB::beginTransaction();
        $requestData = $request->all();

        foreach ($requestData['INFORMATION'] as $information) {
            $validator = Validator::make($information, [
                'NO' => 'required|string',
                'IMAGEN' => 'required|array',
                'DESCRIPCION' => 'required|string',
                // 'CARACTERISTICAS' => '|string',
                'TIPO_UNIDAD' => 'required|integer',
                'PROVEEDOR' => 'required|string',
                'COMPRA_WEB' => 'required|boolean',
                'ESTADO' => 'required|string',
                'DETAILS' => 'required|array',
            ]);
            if ($validator->fails()) {
                return $this->responseController->makeResponse(
                    true,
                    "ERR_ARTITLE_REG001: Se encontraron uno o más errores.",
                    $this->responseController->makeErrors($validator->errors()->messages()),
                    401
                );
            }


            foreach ($information['DETAILS'] as $details) {
                $validator = Validator::make($details, [
                    'NO' => 'required|string',
                    'CODIGO' => 'required|string',
                    'MODELO' => 'required|string',
                    'MONEDA' => 'required|string',
                    'PRECIO' => 'required|string',
                    'MONTO_MINIMO' => 'required|string',
                    'ESTADO' => 'required|string',
                    'CARACTERISTICAS' => 'required|string',
                ]);
                if ($validator->fails()) {
                    return $this->responseController->makeResponse(
                        true,
                        "ERR_ARTITLE_REG002: Se encontraron uno o más errores.",
                        $this->responseController->makeErrors($validator->errors()->messages()),
                        401
                    );
                }
            }

            foreach ($information['IMAGEN'] as $key => $imagen) {
                if (gettype($imagen) != 'string') {
                    return $this->responseController->makeResponse(
                        true,
                        "ERR_ARTITLE_REG003: Se encontraron uno o más errores.",
                        "Se se obtuvieron los ID de los archivos.",
                        401
                    );
                }
            }
        }

        try {
            $usuario = $this->encController->decrypt($requestData['USUARIO']);
        } catch (\Throwable $th) {
            DB::rollBack();
            return $this->responseController->makeResponse(true, "ERR_ARTITLE_REG004: No se pudo obtener los datos del usuario", $th->getMessage(), 500);
        }

        // $currentDate = Carbon::now()->timezone('America/Mazatlan')->toDateTimeString();
        $now = $this->functionsController->now();
        $currentDate = $now->toDateTimeString();

        try {
            $idArtitle = DB::table('S002V01TARTI')->insertGetId([
                'ARTI_CODI' => $requestData['CODIGO'],
                'ARTI_IDFA' => $requestData['FAMILIA'],
                'ARTI_IDSU' => $requestData['SUBFAMILIA'],
                'ARTI_NOMB' => $requestData['ARTICULO'],
                'ARTI_NULI' => $requestData['NUMERO_LINEA'],
                'ARTI_USRE' => $usuario,
                'ARTI_FERE' => $currentDate,
                'ARTI_FEAR' => DB::raw('CURRENT_TIMESTAMP')
            ]);
        } catch (\Throwable $th) {
            DB::rollBack();
            return $this->responseController->makeResponse(true, "ERR_ARTITLE_REG005: No se pudo realizar la consulta a la base.", $th->getMessage(), 500);
        }

        foreach ($requestData['INFORMATION'] as $keyInformation => $information) {

            $arrCodeImages = array();
            foreach ($information['IMAGEN'] as $key => $encIdFile) {

                $idFile = $this->encController->decrypt($encIdFile);
                $tempFile = DB::table('S002V01TARTE')->where([
                    ['ARTE_NULI', '=', $requestData['NUMERO_LINEA']],
                    ['ARTE_IDAR', '=', $idFile],
                ])->first();

                if(is_null($tempFile)){
                    return $this->responseController->makeResponse(true, 'ERR_ARTITLE_REG006: El archivo consultado no está registrado', [], 404);
                }else if($tempFile->ARTE_ESTA == 'Eliminado'){
                    return $this->responseController->makeResponse(true, 'ERR_ARTITLE_REG007: El archivo consultado está eliminado', [], 404);
                }
                $fileResponse = $this->documentManagementController->moveFinalFile(
                    intval($requestData['NUMERO_LINEA']),
                    'GEAD',
                    'FO',
                    $tempFile,
                    $usuario,
                );
                if(!$fileResponse[0]){
                    return $this->responseController->makeResponse(true, 'ERR_ARTITLE_REG008: '.$fileResponse[1], [], 400);
                }
                $arrCodeImages[] = $this->encController->encrypt($fileResponse[1]);
            }
            $jsonImages = json_encode($arrCodeImages);

            try {
                $idDescription = DB::table('S002V01TDEAR')->insertGetId([
                    'DEAR_DESC' => $information['DESCRIPCION'],
                    'DEAR_CARA' => $information['CARACTERISTICAS'],
                    'DEAR_COWE' => $information['COMPRA_WEB'],
                    'DEAR_IDUN' => $information['TIPO_UNIDAD'],
                    'DEAR_IMAG' => $jsonImages,
                    'DEAR_NUPR' => $information['PROVEEDOR'],
                    'DEAR_IDAR' => $idArtitle,
                    'DEAR_NULI' => $requestData['NUMERO_LINEA'],
                    'DEAR_USRE' => $usuario,
                    'DEAR_FERE' => $currentDate,
                    'DEAR_FEAR' => DB::raw('CURRENT_TIMESTAMP')
                ]);
            } catch (\Throwable $th) {
                DB::rollBack();
                return $this->responseController->makeResponse(true, "ERR_ARTITLE_REG009: Ocurrió un error al insertar los datos de la información del artículo.", $th->getMessage(), 500);
            }
            $arrDetails = $information['DETAILS'];

            foreach ($arrDetails as $keyDetails => $details) {
                $insertDetails = [
                    'INAR_IDDE' => $idDescription,
                    'INAR_CODI' => $details['CODIGO'],
                    'INAR_MODE' => $details['MODELO'],
                    'INAR_COMO' => $details['MONEDA'],
                    'INAR_PREC' => $details['PRECIO'],
                    'INAR_MOMI' => $details['MONTO_MINIMO'],
                    // 'INAR_CANT' => $details['CANTIDAD'],
                    'INAR_CARA' => $details['CARACTERISTICAS'],
                    'INAR_NULI' => $requestData['NUMERO_LINEA'],
                    'INAR_USRE' => $usuario,
                    'INAR_FERE' => $currentDate,
                    'INAR_FEAR' => DB::raw('CURRENT_TIMESTAMP')
                ];
                try {
                    $validateDetails = DB::table('S002V01TINAR')->insert($insertDetails);
                } catch (\Throwable $th) {
                    DB::rollBack();
                    return $this->responseController->makeResponse(true, "ERR_ARTITLE_REG010: Ocurrió un error al insertar los datos de los detalles del artículo.", $th->getMessage(), 500);
                }

                if (!$validateDetails) {
                    DB::rollBack();
                    return $this->responseController->makeResponse(true, "ERR_ARTITLE_REG011: No se pudo insertar los datos de los detalles.", [], 500);
                }
            }
        }
        DB::commit();
        return $this->responseController->makeResponse(false, "ÉXITO: Registro Exitoso");
    }

    public function updateArtitles(Request $request) {
        $validator = Validator::make($request->all(), [
            'NO' => 'required|string',
            'CODIGO' => 'required|string',
            'ARTICULO' => 'required|string',
            'FAMILIA' => 'required|integer',
            'SUBFAMILIA' => 'required|integer',
            'USUARIO' => 'required|string',
            'NUMERO_LINEA' => 'required|string',
            'INFORMATION' => 'required',
        ]);
        if ($validator->fails()) {
            return $this->responseController->makeResponse(
                true,
                "ERR_ARTITLE_MOD000: Se encontraron uno o más errores.",
                $this->responseController->makeErrors($validator->errors()->messages()),
                401
            );
        }
        DB::beginTransaction(); # Para impedir que las actualizaciones queden a incompletas
        $requestData = $request->all();
        foreach ($requestData['INFORMATION'] as $information) {
            $validator = Validator::make($information, [
                'NO' => 'required|integer',
                'IMAGEN' => 'required|array',
                'DESCRIPCION' => 'required|string',
                // 'CARACTERISTICAS' => '|string',
                'TIPO_UNIDAD' => 'required|integer',
                'PROVEEDOR' => 'required|string',
                'COMPRA_WEB' => 'required|boolean',
                'ESTADO' => 'required|string',
                'DETAILS' => 'required|array',
            ]);
            if ($validator->fails()) {
                return $this->responseController->makeResponse(
                    true,
                    "ERR_ARTITLE_MOD001: Se encontraron uno o más errores.",
                    $this->responseController->makeErrors($validator->errors()->messages()),
                    401
                );
            }


            foreach ($information['DETAILS'] as $details) {
                $validator = Validator::make($details, [
                    'NO' => 'required|string',
                    'CODIGO' => 'required|string',
                    'MODELO' => 'required|string',
                    'MONEDA' => 'required|string',
                    'PRECIO' => 'required|string',
                    'MONTO_MINIMO' => 'required|string',
                    'ESTADO' => 'required|string',
                    'CARACTERISTICAS' => 'required|string',
                ]);
                if ($validator->fails()) {
                    return $this->responseController->makeResponse(
                        true,
                        "ERR_ARTITLE_MOD002: Se encontraron uno o más errores.",
                        $this->responseController->makeErrors($validator->errors()->messages()),
                        401
                    );
                }
            }

            foreach ($information['IMAGEN'] as $key => $imagen) {
                if (gettype($imagen) != 'string') {
                    return $this->responseController->makeResponse(
                        true,
                        "ERR_ARTITLE_MOD003: Se encontraron uno o más errores.",
                        "Se se obtuvieron los ID de los archivos.",
                        401
                    );
                }
            }
        }

        try {
            $usuario = $this->encController->decrypt($requestData['USUARIO']);
        } catch (\Throwable $th) {
            DB::rollBack();
            return $this->responseController->makeResponse(true, "ERR_ARTITLE_MOD004: Ocurrió un error al desencriptar el usuario.", [], 500);
        }
        
        $now = $this->functionsController->now();
        $currentDate = $now->toDateTimeString();

        $numeroArticulo = $requestData['NO'];
        try {
            $validateUpdate = DB::table('S002V01TARTI')
                ->where('ARTI_IDAR', '=', $numeroArticulo)
                ->where('ARTI_NULI', '=', $requestData['NUMERO_LINEA'])
                ->update([
                    'ARTI_CODI' => $requestData['CODIGO'],
                    'ARTI_IDFA' => $requestData['FAMILIA'],
                    'ARTI_IDSU' => $requestData['SUBFAMILIA'],
                    'ARTI_NOMB' => $requestData['ARTICULO'],
                    'ARTI_USMO' => $usuario,
                    'ARTI_FEMO' => $currentDate,
                    'ARTI_FEAR' => DB::raw('CURRENT_TIMESTAMP'),
                ]);
            
        } catch (\Throwable $th) {
            DB::rollBack();
            return $this->responseController->makeResponse(true, "ERR_ARTITLE_MOD005: Ocurrió un error al modificar el registro.", [], 500);
        }
        if (!$validateUpdate) {
            DB::rollBack();
            return $this->responseController->makeResponse(true, "ERR_ARTITLE_MOD0006: Ocurrió un error al modificar en la tabla.", [], 500);
        }

        $arrInformation = $requestData['INFORMATION'];
        foreach ($arrInformation as $keyInformation => $information) {
            // Número de ID de información
            $numeroInformation = $information['NO'];

            // Se verifica si la información ya está registrado o no
            if ($information['ESTADO'] === 'Modificado' || $information['ESTADO'] === 'Activo') {
                $arrCodeImages = array();
                foreach ($information['IMAGEN'] as $key => $encIdFile) {

                    $idFile = $this->encController->decrypt($encIdFile);
                    // var_dump($idFile);
                    $arrCode = explode('=', $idFile);
                    
                    if ( count($arrCode) == 3 ) {
                        
                        $arrStrucuteCode = explode("-", $arrCode[0]);
                        $nameCode = explode(".", $arrCode[2]);

                        $validateImage = DB::table('S002V01TAFAL')->where([
                            ['AFAL_NULI', '=', $requestData['NUMERO_LINEA']],
                            ['AFAL_COMO', '=', $arrStrucuteCode['1']],
                            ['AFAL_CLDO', '=', $arrStrucuteCode['2']],
                            ['AFAL_NOAR', '=', $nameCode[0]],
                            ['AFAL_EXTE', '=', $nameCode[1]],
                        ])->orderBy('AFAL_NUVE', 'desc')->exists();

                        if (!$validateImage) {
                            DB::rollBack();
                            return $this->responseController->makeResponse(true, "ERR_ARTITLE_MOD007ERR_ARTITLE_MOD007: : La imagen con el código $idFile no existe.", [], 500);
                        }

                        $arrCodeImages[] = $this->encController->encrypt($idFile);

                    } else {
                        $tempFile = DB::table('S002V01TARTE')->where([
                            ['ARTE_NULI', '=', $requestData['NUMERO_LINEA']],
                            ['ARTE_IDAR', '=', $idFile],
                        ])->first();
    
                        if(is_null($tempFile)){
                            return $this->responseController->makeResponse(true, 'ERR_ARTITLE_MOD008: El archivo consultado no está registrado', [], 404);
                        }else if($tempFile->ARTE_ESTA == 'Eliminado'){
                            return $this->responseController->makeResponse(true, 'ERR_ARTITLE_MOD009: El archivo consultado está eliminado', [], 404);
                        }

                        $fileResponse = $this->documentManagementController->moveFinalFile(
                            intval($requestData['NUMERO_LINEA']),
                            'GEAD',
                            'FO',
                            $tempFile,
                            $usuario,
                        );
    
                        if(!$fileResponse[0]){
                            return $this->responseController->makeResponse(true, "ERR_ARTITLE_MOD010: ".$fileResponse[1], [], 400);
                        }
                        $arrCodeImages[] = $this->encController->encrypt($fileResponse[1]);
                        // $arrCodeImages[] = $fileResponse[1];
                    }
                }
                $jsonImages = json_encode($arrCodeImages);

                // exit;
                try {
                    $validate = DB::table('S002V01TDEAR')->where('DEAR_IDDE', '=', $numeroInformation)->update([
                        'DEAR_DESC' => $information['DESCRIPCION'],
                        'DEAR_CARA' => $information['CARACTERISTICAS'],
                        'DEAR_COWE' => $information['COMPRA_WEB'],
                        'DEAR_IDUN' => $information['TIPO_UNIDAD'],
                        'DEAR_IMAG' => $jsonImages,
                        'DEAR_NUPR' => $information['PROVEEDOR'],
                        'DEAR_USMO' => $usuario,
                        'DEAR_FEMO' => $currentDate,
                        'DEAR_FEAR' => DB::raw('CURRENT_TIMESTAMP'),
                    ]);
                    
                } catch (\Throwable $th) {
                    DB::rollBack();
                    return $this->responseController->makeResponse(true, "ERR_ARTITLE_MOD011: Ocurrió un error al obtener el contenido.", [], 500);
                }
                if (!$validate) {
                    DB::rollBack();
                    return $this->responseController->makeResponse(true, "ERR_ARTITLE_MOD012: Ocurrió un error al modificar en la tabla.", [], 500);
                }

                $arrDetails = $information['DETAILS'];
                foreach ($arrDetails as $keyDetails => $details) {
                    $numeroDetails = $details['NO'];
                    if ( $details['ESTADO'] === 'Modificado' || $details['ESTADO'] === 'Activo') {
                        try {
                            $validate = DB::table('S002V01TINAR')->where('INAR_IDIN', '=', $numeroDetails)->update([
                                'INAR_CODI' => $details['CODIGO'],
                                'INAR_MODE' => $details['MODELO'],
                                'INAR_COMO' => $details['MONEDA'],
                                'INAR_PREC' => $details['PRECIO'],
                                'INAR_MOMI' => $details['MONTO_MINIMO'],
                                // 'INAR_CANT' => $details['CANTIDAD'],
                                'INAR_CARA' => $details['CARACTERISTICAS'],
                                'INAR_USMO' => $usuario,
                                'INAR_FEMO' => $currentDate,
                                'INAR_FEAR' => DB::raw('CURRENT_TIMESTAMP'),
                            ]);
                        } catch (\Throwable $th) {
                            DB::rollBack();
                            return $this->responseController->makeResponse(true, "ERR_ARTITLE_MOD013: Ocurrió un error al obtener el contenido.", $th->getMessage(), 500);
                        }
                        if (!$validate) {
                            DB::rollBack();
                            return $this->responseController->makeResponse(true, "ERR_ARTITLE_MOD014: Ocurrió un error al modificar en la tabla.", [], 500);
                        }
                    } else if ($details['ESTADO'] === 'Nuevo') {
                        try {
                            $validate = DB::table('S002V01TINAR')->insertGetId([
                                'INAR_IDDE' => $numeroInformation,
                                'INAR_CODI' => $details['CODIGO'],
                                'INAR_MODE' => $details['MODELO'],
                                'INAR_COMO' => $details['MONEDA'],
                                'INAR_PREC' => $details['PRECIO'],
                                'INAR_MOMI' => $details['MONTO_MINIMO'],
                                // 'INAR_CANT' => $details['CANTIDAD'],
                                'INAR_CARA' => $details['CARACTERISTICAS'],
                                'INAR_NULI' => $requestData['NUMERO_LINEA'],
                                'INAR_USRE' => $usuario,
                                'INAR_FERE' => $currentDate,
                                'INAR_FEAR' => DB::raw('CURRENT_TIMESTAMP')
                            ]);
                        } catch (\Throwable $th) {
                            DB::rollBack();
                            return $this->responseController->makeResponse(true, "ERR_ARTITLE_MOD015: Ocurrió un error al obtener el contenido.", [], 500);
                        }
                        if (!$validate) {
                            DB::rollBack();
                            return $this->responseController->makeResponse(true, "ERR_ARTITLE_MOD016: Ocurrió un error al modificar en la tabla.", [], 500);
                        }
                    } else if ($details['ESTADO'] === 'Eliminado') {
                        try {
                            $validate = DB::table('S002V01TINAR')->where('INAR_IDIN', '=', $numeroDetails)->update([
                                'INAR_ESTA' => 'Eliminado',
                                'INAR_USMO' => $usuario,
                                'INAR_FEMO' => $currentDate,
                                'INAR_FEAR' => DB::raw('CURRENT_TIMESTAMP'),
                            ]);
                        } catch (\Throwable $th) {
                            DB::rollBack();
                            return $this->responseController->makeResponse(true, "ERR_ARTITLE_MOD017: Ocurrió un error al obtener el contenido.", [], 500);
                        }
                        if (!$validate) {
                            DB::rollBack();
                            return $this->responseController->makeResponse(true, "ERR_ARTITLE_MOD018: Ocurrió un error al modificar en la tabla.", [], 500);
                        }
                    }
                }
            } else if ($information['ESTADO'] === 'Nuevo') {

                $arrCodeImages = array();
                foreach ($information['IMAGEN'] as $key => $encIdFile) {
                    $idFile = $this->encController->decrypt($encIdFile);
                    $arrCode = explode('=', $idFile);
                    if ( count($arrCode) == 3 ) {

                        $arrStrucuteCode = explode("-", $arrCode[0]);
                        $nameCode = explode(".", $arrCode[2]);

                        $validateImage = DB::table('S002V01TAFAL')->where([
                            ['AFAL_NULI', '=', $requestData['NUMERO_LINEA']],
                            ['AFAL_COMO', '=', $arrStrucuteCode['1']],
                            ['AFAL_CLDO', '=', $arrStrucuteCode['2']],
                            ['AFAL_NOAR', '=', $nameCode[0]],
                            ['AFAL_EXTE', '=', $nameCode[1]],
                        ])->orderBy('AFAL_NUVE', 'desc')->exists();

                        if (!$validateImage) {
                            DB::rollBack();
                            return $this->responseController->makeResponse(true, "ERR_ARTITLE_MOD019: La imagen con el código $idFile no existe.", [], 500);
                        }

                        $arrCodeImages[] = $this->encController->encrypt($idFile);
                        // $arrCodeImages[] = $idFile;

                    } else {
                        $tempFile = DB::table('S002V01TARTE')->where([
                            ['ARTE_NULI', '=', $requestData['NUMERO_LINEA']],
                            ['ARTE_IDAR', '=', $idFile],
                        ])->first();
    
                
                        if(is_null($tempFile)){
                            return $this->responseController->makeResponse(true, 'ERR_ARTITLE_MOD020: El archivo consultado no está registrado', [], 404);
                        }else if($tempFile->ARTE_ESTA == 'Eliminado'){
                            return $this->responseController->makeResponse(true, 'ERR_ARTITLE_MOD021: El archivo consultado está eliminado', [], 404);
                        }
    
                        $fileResponse = $this->documentManagementController->moveFinalFile(
                            intval($requestData['NUMERO_LINEA']),
                            'GEAD',
                            'FO',
                            $tempFile,
                            $usuario,
                        );
    
                        if(!$fileResponse[0]){
                            return $this->responseController->makeResponse(true, 'ERR_ARTITLE_MOD022: '.$fileResponse[1], [], 400);
                        }
    
                        $arrCodeImages[] = $this->encController->encrypt($fileResponse[1]);
                        // $arrCodeImages[] = $fileResponse[1];
                    }
                }
                $jsonImages = json_encode($arrCodeImages);

                try {
                    $numeroInformation = DB::table('S002V01TDEAR')->insertGetId([
                        'DEAR_DESC' => $information['DESCRIPCION'],
                        'DEAR_CARA' => $information['CARACTERISTICAS'],
                        'DEAR_COWE' => $information['COMPRA_WEB'],
                        'DEAR_IDUN' => $information['TIPO_UNIDAD'],
                        'DEAR_IMAG' => $jsonImages,
                        'DEAR_NUPR' => $information['PROVEEDOR'],
                        'DEAR_IDAR' => $numeroArticulo,
                        'DEAR_NULI' => $requestData['NUMERO_LINEA'],
                        'DEAR_USRE' => $usuario,
                        'DEAR_FERE' => $currentDate,
                        'DEAR_FEAR' => DB::raw('CURRENT_TIMESTAMP')
                    ]);
                } catch (\Throwable $th) {
                    DB::rollBack();
                    return $this->responseController->makeResponse(true, "ERR_ARTITLE_MOD023: Ocurrió un error al insertar los datos de la información del artículo.", [], 500);
                }
                $arrDetails = $information['DETAILS'];
                foreach ($arrDetails as $keyDetails => $details) {
                    try {
                        DB::table('S002V01TINAR')->insertGetId([
                            'INAR_IDDE' => $numeroInformation,
                            'INAR_CODI' => $details['CODIGO'],
                            'INAR_MODE' => $details['MODELO'],
                            'INAR_COMO' => $details['MONEDA'],
                            'INAR_PREC' => $details['PRECIO'],
                            'INAR_MOMI' => $details['MONTO_MINIMO'],
                            // 'INAR_CANT' => $details['CANTIDAD'],
                            'INAR_CARA' => $details['CARACTERISTICAS'],
                            'INAR_NULI' => $requestData['NUMERO_LINEA'],
                            'INAR_USRE' => $usuario,
                            'INAR_FERE' => $currentDate,
                            'INAR_FEAR' => DB::raw('CURRENT_TIMESTAMP')
                        ]);
                    } catch (\Throwable $th) {
                        DB::rollBack();
                        return $this->responseController->makeResponse(true, "ERR_ARTITLE_MOD024: Ocurrió un error al insertar los datos de los detalles del artículo.", [], 500);
                    }
                }
            } else if ($information['ESTADO'] === 'Eliminado') {
                try {
                    $validate = DB::table('S002V01TDEAR')->where('DEAR_IDDE', '=', $numeroInformation)->update([
                        'DEAR_ESTA' => 'Eliminado',
                        'DEAR_USMO' => $usuario,
                        'DEAR_FEMO' => $currentDate,
                        'DEAR_FEAR' => DB::raw('CURRENT_TIMESTAMP'),
                    ]);                    
                } catch (\Throwable $th) {
                    DB::rollBack();
                    return $this->responseController->makeResponse(true, "ERR_ARTITLE_MOD025: Ocurrió un error al obtener el contenido.", [], 500);
                }
                if (!$validate) {
                    DB::rollBack();
                    return $this->responseController->makeResponse(true, "ERR_ARTITLE_MOD026: Ocurrió un error al modificar en la tabla.", [], 500);
                }
            }
        }

        DB::commit(); # Para guardar los cambios en la base de datos
        return $this->responseController->makeResponse(false, "ÉXITO: Modificación Exitosa");
    }

    public function deleteArtitle(Request $request) {
        $validator = Validator::make($request->all(), [
            'NUMERO_ARTITULO' => 'required|string',
            'NUMERO_LINEA' => 'required|string',
            'USUARIO' => 'required|string',
        ]);
        if ($validator->fails()) {
            return $this->responseController->makeResponse(
                true,
                "ERR_ARTITLE_DEL000: Se encontraron uno o más errores.",
                $this->responseController->makeErrors($validator->errors()->messages()),
                401
            );
        }

        $response = $request->all();
        $numeroLinea = $response['NUMERO_LINEA'];
        $numeroArticulo = $this->encController->decrypt($response['NUMERO_ARTITULO']);
        $usuario = $this->encController->decrypt($response['USUARIO']);

        DB::beginTransaction();

        // $currentDate = Carbon::now()->timezone('America/Mazatlan')->toDateTimeString();
        $now = $this->functionsController->now();
        $currentDate = $now->toDateTimeString();

        try {
            $resp = DB::table('S002V01TARTI')
                ->where('ARTI_IDAR', '=', $numeroArticulo)
                ->where('ARTI_NULI', '=', $numeroLinea)
                ->update([
                    'ARTI_ESTA' => 'Eliminado',
                    'ARTI_USMO' => $usuario,
                    'ARTI_FEMO' => $currentDate,
                    'ARTI_FEAR' => DB::raw('CURRENT_TIMESTAMP'),
                ]);
            if (!$resp) {
                return $this->responseController->makeResponse(true, "ERR_ARTITLE_DEL001: Ocurrió un error al modificar en la tabla.", [], 500);
            }
        } catch (\Throwable $th) {
            DB::rollBack();
            return $this->responseController->makeResponse(true, "ERR_ARTITLE_DEL002: Ocurrió un error al modificar el registro.", [], 500);
        }
        try {
            $arrDescription = DB::table('S002V01TDEAR')->where('DEAR_IDAR', '=', $numeroArticulo)->get([ 'DEAR_IDDE AS NUMERO_DESCRIPCION' ]);
        } catch (\Throwable $th) {
            DB::rollBack();
            return $this->responseController->makeResponse(true, "ERR_ARTITLE_DEL003: Ocurrió un error al obtener los datos de la descripción del artículo", [], 500);
        }

        foreach ($arrDescription as $keyDescription => $description) {
            $numeroDescripcion = $description->NUMERO_DESCRIPCION;
            try {
                $resp = DB::table('S002V01TDEAR')->where('DEAR_IDDE', '=', $numeroDescripcion)->where('DEAR_NULI', '=', $numeroLinea)->update([
                    'DEAR_ESTA' => 'Eliminado',
                    'DEAR_USMO' => $usuario,
                    'DEAR_FEMO' => $currentDate,
                    'DEAR_FEAR' => DB::raw('CURRENT_TIMESTAMP'),
                ]);
                if (!$resp) {
                    DB::rollBack();
                    return $this->responseController->makeResponse(true, "ERR_ARTITLE_DEL004: Ocurrió un error al modificar en la tabla.", [], 500);
                }
            } catch (\Throwable $th) {
                DB::rollBack();
                return $this->responseController->makeResponse(true, "ERR_ARTITLE_DEL005: Ocurrió un error al modificar el registro.", [], 500);
            }

            try {
                $resp = DB::table('S002V01TINAR')->where('INAR_IDDE', '=', $numeroDescripcion)->where('INAR_NULI', '=', $numeroLinea)->update([
                    'INAR_ESTA' => 'Eliminado',
                    'INAR_USMO' => $usuario,
                    'INAR_FEMO' => $currentDate,
                    'INAR_FEAR' => DB::raw('CURRENT_TIMESTAMP'),
                ]);
                if (!$resp) {
                    DB::rollBack();
                    return $this->responseController->makeResponse(true, "ERR_ARTITLE_DEL006: Ocurrió un error al modificar en la tabla.", [], 500);
                }
            } catch (\Throwable $th) {
                DB::rollBack();
                return $this->responseController->makeResponse(true, "ERR_ARTITLE_DEL007: Ocurrió un error al modificar el registro.", [], 500);
            }
        }
        DB::commit(); # Para guardar los cambios en la base de datos
        return $this->responseController->makeResponse(false, "ÉXITO: Eliminación Exitosa");
    }

    public function generateArtitles(Request $request) {
        $validator = Validator::make($request->all(), [
            'FILE_ZIP' => 'required',
            'NUMERO_LINEA' => 'required',
            'USUARIO' => 'required',
        ]);
        if ($validator->fails()) {
            return $this->responseController->makeResponse(
                true,
                "ERR_ARTITLE_MOD000: Se encontraron uno o más errores.",
                $this->responseController->makeErrors($validator->errors()->messages()),
                401
            );
        }
    }

    public function getArtitleByInformation($information, $line) {
        try {
            $objInformation = (array) DB::table('S002V01TINAR')
                ->where('INAR_IDIN', '=', $information)
                ->where('INAR_ESTA', '=', 'Activo')
                ->where('DEAR_ESTA', '=', 'Activo')
                ->where('ARTI_ESTA', '=', 'Activo')
                ->where('FAMI_ESTA', '=', 'Activo')
                ->where('SUBF_ESTA', '=', 'Activo')
                ->where('UNID_ESTA', '=', 'Activo')
                ->where('PROV_ESTA', '=', 'Activo')
                ->join('S002V01TDEAR', 'DEAR_IDDE', '=', 'INAR_IDDE')
                ->join('S002V01TARTI', 'ARTI_IDAR', '=', 'DEAR_IDAR')
                ->join('S002V01TFAMI', 'FAMI_IDFA', '=', 'ARTI_IDFA')
                ->join('S002V01TSUBF', 'SUBF_IDSU', '=', 'ARTI_IDSU')
                ->join('S002V01TUNID', 'UNID_IDUN', '=', 'DEAR_IDUN')
                ->join('S002V01TPROV', 'PROV_NUPR', '=', 'DEAR_NUPR')
                ->join('S002V01TCAMO', 'CAMO_COMO', '=', 'INAR_COMO')
                ->first([
                    'INAR_IDIN', // Identificador de Información del artículo
                    'INAR_CODI', // Código del artículo
                    'INAR_MODE', // Modelo del artículo
                    // 'INAR_MONE', // Moneda
                    DB::raw('CONCAT("(", CAMO_COMO, ") ", CAMO_DESC) AS CAMO_COMO'),
                    'INAR_PREC', // Precio
                    // 'INAR_CANT', // Cantidad
                    'INAR_CARA', // Características

                    'DEAR_IDDE', // Identificador de la descripción del artículo
                    'DEAR_DESC', // Descripción del artículo
                    'DEAR_CARA', // Características del artículo
                    'DEAR_COWE', // Compra web
                    'DEAR_IMAG', // Imagen
                    'DEAR_IDUN', // Identificador de la unidad
                    'UNID_NOMB', // Nombre de la unidad
                    'UNID_ACRO', // Acrónimo de la familia
                    'DEAR_NUPR', // Número del proveedor

                    'ARTI_IDAR', // Identificador del artículo
                    'ARTI_IDFA', // Identificador de la familia
                    'FAMI_NOMB', // Nombre de la familia
                    'ARTI_IDSU', // Identificador de la subfamilia
                    'SUBF_NOMB', // Nombre de la subfamilia
                    'ARTI_CODI', // Código del artículo
                    'ARTI_NOMB', // Nombre del artículo

                    'PROV_NOCO', // Nombre comercial
                    'PROV_NOMB', // Nombre del proveedor
                    'PROV_APPA', // Apellido paterno del proveedor
                    'PROV_APMA', // Apellido materno del proveedor
                    'PROV_CORR', // Correo electrónico
                    'PROV_LAD1', // Lada 1
                    'PROV_TEL1', // Teléfono 1
                    'PROV_LAD2', // Lada 2
                    'PROV_TEL2', // Teléfono 2
                    'PROV_XRFC', // R.F.C
                    'PROV_XTAX', // TAX ID
                    'PROV_GIRO', // Giro empresarial
                    'PROV_TIPO', // Tipo
                    'PROV_SIWE', // Sitio Web
                    'PROV_MEPA', // Metodos de pago

                ]);
        } catch (\Throwable $th) {
            return $this->responseController->makeResponse(true, "ERR_ARTITLE_GETBYINFORMATION000: No se pudo realizar la consulta a la base.", $th->getMessage(), 500);
        }
        
        $objInformation['DEAR_IMAG'] = json_decode($objInformation['DEAR_IMAG']);

        return $this->responseController->makeResponse(false, "ÉXITO: Consulta Exitosa", $objInformation);
    }
}


