ProviderController.php 160 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228
  1. <?php
  2. /*
  3. Desarrollador: Ing. Jean Jairo Benitez Meza
  4. Ultima Modificación: 11/04/2023
  5. Módulo: Gestión de Adquisiciones
  6. */
  7. namespace App\Http\Controllers;
  8. use App\Http\Controllers\Controller;
  9. use App\Http\Controllers\ResponseController;
  10. use App\Http\Controllers\EncryptionController;
  11. use Illuminate\Http\Request;
  12. use Illuminate\Support\Carbon;
  13. use Illuminate\Support\Facades\DB;
  14. use Illuminate\Support\Facades\Validator;
  15. use \Mpdf\Mpdf as PDF;
  16. use PhpOffice\PhpSpreadsheet\Calculation\Category;
  17. use PhpOffice\PhpSpreadsheet\Spreadsheet;
  18. use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
  19. use PhpOffice\PhpSpreadsheet\IOFactory;
  20. use PhpOffice\PhpSpreadsheet\Worksheet\Table;
  21. use PhpOffice\PhpSpreadsheet\Worksheet\Table\TableStyle;
  22. class ProviderController extends Controller{
  23. private $responseController;
  24. private $encController;
  25. private $resourcesController;
  26. private $arrAlphabet = array("A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","U","V","W","X","Y","Z");
  27. private $arrHeader = array(
  28. array(
  29. 'POSITION' => 'A',
  30. 'CODE' => 'ARTI_IDAR',
  31. 'COLUMN' => 'ID Artículo',
  32. 'OBLIGATORY' => true
  33. ),
  34. array(
  35. 'POSITION' => 'B',
  36. 'CODE' => 'ARTI_NOMB',
  37. 'COLUMN' => 'Artículo',
  38. 'OBLIGATORY' => true
  39. ),
  40. array(
  41. 'POSITION' => 'C',
  42. 'CODE' => 'FAMI_NOMB',
  43. 'COLUMN' => 'Familia',
  44. 'OBLIGATORY' => true
  45. ),
  46. array(
  47. 'POSITION' => 'D',
  48. 'CODE' => 'SUBF_NOMB',
  49. 'COLUMN' => 'Subfamilia',
  50. 'OBLIGATORY' => true
  51. ),
  52. array(
  53. 'POSITION' => 'E',
  54. 'CODE' => 'ARTI_CODI',
  55. 'COLUMN' => 'Código de Barra',
  56. 'OBLIGATORY' => true
  57. ),
  58. array(
  59. 'POSITION' => 'F',
  60. 'CODE' => 'DEAR_COWE',
  61. 'COLUMN' => 'Compra Web',
  62. 'OBLIGATORY' => true
  63. ),
  64. array(
  65. 'POSITION' => 'G',
  66. 'CODE' => 'DEAR_IDUN',
  67. 'COLUMN' => 'Tipo de Unidad',
  68. 'OBLIGATORY' => true
  69. ),
  70. array(
  71. 'POSITION' => 'H',
  72. 'CODE' => 'DEAR_DESC',
  73. 'COLUMN' => 'Descripción',
  74. 'OBLIGATORY' => true
  75. ),
  76. array(
  77. 'POSITION' => 'I',
  78. 'CODE' => 'DEAR_CARA',
  79. 'COLUMN' => 'Características',
  80. 'OBLIGATORY' => false
  81. ),
  82. );
  83. private $arrHeaderDetails = array(
  84. array(
  85. 'POSITION' => 'A',
  86. 'CODE' => 'INAR_IDIN',
  87. 'COLUMN' => 'ID Detalle',
  88. 'OBLIGATORY' => true,
  89. ),
  90. array(
  91. 'POSITION' => 'B',
  92. 'CODE' => 'INAR_CODI',
  93. 'COLUMN' => 'Código',
  94. 'OBLIGATORY' => true,
  95. ),
  96. array(
  97. 'POSITION' => 'C',
  98. 'CODE' => 'INAR_MODE',
  99. 'COLUMN' => 'Modelo',
  100. 'OBLIGATORY' => true,
  101. ),
  102. array(
  103. 'POSITION' => 'D',
  104. 'CODE' => 'INAR_PREC',
  105. 'COLUMN' => 'Precio',
  106. 'OBLIGATORY' => true,
  107. ),
  108. array(
  109. 'POSITION' => 'E',
  110. 'CODE' => 'INAR_MONE',
  111. 'COLUMN' => 'Moneda',
  112. 'OBLIGATORY' => true,
  113. ),
  114. array(
  115. 'POSITION' => 'F',
  116. 'CODE' => 'INAR_MOMI',
  117. 'COLUMN' => 'Monto Mínimo',
  118. 'OBLIGATORY' => true,
  119. ),
  120. array(
  121. 'POSITION' => 'G',
  122. 'CODE' => 'INAR_CARA',
  123. 'COLUMN' => 'Características',
  124. 'OBLIGATORY' => true,
  125. ),
  126. );
  127. public function __construct() {
  128. $this->responseController = new ResponseController();
  129. $this->encController = new EncryptionController();
  130. $this->resourcesController = new ResourcesController();
  131. }
  132. public function getAllProvider($line){
  133. try {
  134. $arrProvider = DB::table('S002V01TPROV')
  135. ->where('PROV_NULI', '=', $line)
  136. ->get([
  137. 'PROV_NUPR AS NUMERO_PROVEEDOR',
  138. 'PROV_NOCO AS RAZON_SOCIAL',
  139. 'PROV_NOMB AS NOMBRE',
  140. 'PROV_APPA AS PRIMER_APELLIDO',
  141. 'PROV_APMA AS SEGUNDO_APELLIDO',
  142. 'PROV_CORR AS CORREO',
  143. 'PROV_LAD1 AS LADA1',
  144. 'PROV_TEL1 AS TELEFONO1',
  145. 'PROV_LAD2 AS LADA2',
  146. 'PROV_TEL2 AS TELEFONO2',
  147. 'PROV_XRFC AS RFC',
  148. 'PROV_XTAX AS TAXID',
  149. 'PROV_CORF AS REGIMEN_FISCAL',
  150. 'PROV_TIPO AS TIPO_EMPRESA',
  151. 'PROV_SIWE AS SITIO_WEB',
  152. 'PROV_MEPA AS METODO_PAGO',
  153. 'PROV_ESTA AS ESTADO',
  154. 'PROV_USRE AS USUARIO_REGISTRA',
  155. 'PROV_FERE AS FECHA_REGISTRA',
  156. 'PROV_USMO AS USUARIO_MODIFICA',
  157. 'PROV_FEMO AS FECHA_MODIFICA',
  158. ]);
  159. $arrResponse = array();
  160. foreach ($arrProvider as $provider) {
  161. $provider = (array) $provider;
  162. $provider['SEGUNDO_APELLIDO'] = $provider['SEGUNDO_APELLIDO'] == null ? '' : $provider['SEGUNDO_APELLIDO'];
  163. $arrReferences = DB::table('S002V01TPRRE')
  164. ->where('PRRE_NULI', '=', $line)
  165. ->where('PRRE_ESTA', '=', 'Activo')
  166. ->where('PRRE_NUPR', '=', $provider['NUMERO_PROVEEDOR'])
  167. ->get([
  168. 'PRRE_IDRE AS NUMERO_REFERENCIA',
  169. 'PRRE_EMPR AS EMPRESA',
  170. 'PRRE_CORR AS CORREO',
  171. 'PRRE_LADA AS LADA',
  172. 'PRRE_TELE AS TELEFONO',
  173. 'PRRE_XRFC AS RFC',
  174. 'PRRE_DIRE AS DIRECCION',
  175. 'PRRE_ESTA AS ESTADO',
  176. 'PRRE_USRE AS USUARIO_REGISTRA',
  177. 'PRRE_FERE AS FECHA_REGISTRA',
  178. 'PRRE_USMO AS USUARIO_MODIFICA',
  179. 'PRRE_FEMO AS FECHA_MODIFICA',
  180. ]);
  181. $arrContacts = DB::table('S002V01TPRCO')
  182. ->where('PRCO_NULI', '=', $line)
  183. ->where('PRCO_ESTA', '=', 'Activo')
  184. ->where('PRCO_NUPR', '=', $provider['NUMERO_PROVEEDOR'])
  185. ->get([
  186. 'PRCO_IDCP AS NUMERO_CONTACTO',
  187. 'PRCO_NOMB AS NOMBRE_CONTACTO',
  188. 'PRCO_TIPO AS TIPO_CONTACTO',
  189. 'PRCO_CALL AS CALLE',
  190. 'PRCO_NUEX AS NUMERO_EXTERIOR',
  191. 'PRCO_NUIN AS NUMERO_INTERIOR',
  192. 'PRCO_COPO AS CODIGO_POSTAL',
  193. 'PRCO_COLO AS COLONIA',
  194. 'PRCO_MUNI AS MUNICIPIO',
  195. 'PRCO_ENTI AS ENTIDAD',
  196. 'PRCO_PAIS AS PAIS',
  197. 'PRCO_LAD1 AS LADA1',
  198. 'PRCO_TEL1 AS TELEFONO1',
  199. 'PRCO_LAD2 AS LADA2',
  200. 'PRCO_TEL2 AS TELEFONO2',
  201. 'PRCO_COR1 AS CORREO1',
  202. 'PRCO_COR2 AS CORREO2',
  203. 'PRCO_OBSE AS OBSERVACIONES',
  204. 'PRCO_ESTA AS ESTADO',
  205. 'PRCO_USRE AS USUARIO_REGISTRA',
  206. 'PRCO_FERE AS FECHA_REGISTRA',
  207. 'PRCO_USMO AS USUARIO_MODIFICA',
  208. 'PRCO_FEMO AS FECHA_MODIFICA',
  209. ]);
  210. $arrConditions = DB::table('S002V01TPRCN')
  211. ->where('PRCN_NULI', '=', $line)
  212. ->where('PRCN_ESTA', '=', 'Activo')
  213. ->where('PRCN_NUPR', '=', $provider['NUMERO_PROVEEDOR'])
  214. ->get([
  215. 'PRCN_IDCM AS NUMERO_CONDICION',
  216. 'PRCN_TIPO AS TIPO_CONDICION',
  217. 'PRCN_INFO AS INFORMACION',
  218. 'PRCN_ESTA AS ESTADO',
  219. 'PRCN_USRE AS USUARIO_REGISTRA',
  220. 'PRCN_FERE AS FECHA_REGISTRA',
  221. 'PRCN_USMO AS USUARIO_MODIFICA',
  222. 'PRCN_FEMO AS FECHA_MODIFICA',
  223. ]);
  224. $arrCatalogs = DB::table('S002V01TPRCE')
  225. ->where('PRCE_NULI', '=', $line)
  226. ->where('PRCE_ESTA', '=', 'Activo')
  227. ->where('PRCE_NUPR', '=', $provider['NUMERO_PROVEEDOR'])
  228. ->get([
  229. 'PRCE_IDCE AS NUMERO_CATALAGO',
  230. 'PRCE_CATA AS CATALAGO',
  231. 'PRCE_DESC AS DESCRIPCION',
  232. 'PRCE_XURL AS URL_CATALAGO',
  233. 'PRCE_ESTA AS ESTADO',
  234. 'PRCE_USRE AS USUARIO_REGISTRA',
  235. 'PRCE_FERE AS FECHA_REGISTRA',
  236. 'PRCE_USMO AS USUARIO_MODIFICA',
  237. 'PRCE_FEMO AS FECHA_MODIFICA',
  238. ]);
  239. $arrPayment = json_decode($provider['METODO_PAGO']);
  240. $arrPaymentFormat = array();
  241. foreach ($arrPayment as $key => $payment) {
  242. $arrPaymentFormat[] = [
  243. 'name' => $key,
  244. 'completed' => $payment,
  245. ];
  246. }
  247. $provider['REFERENCIAS'] = $arrReferences;
  248. $provider['CONTACTOS'] = $arrContacts;
  249. $provider['CONDICIONES'] = $arrConditions;
  250. $provider['CATALAGOS'] = $arrCatalogs;
  251. $provider['METODOS_PAGO'] = $arrPaymentFormat;
  252. $arrResponse[] = $provider;
  253. }
  254. } catch (\Throwable $th) {
  255. return $this->responseController->makeResponse(true, "ERR_PROVIDER_GET000: No se pudo realizar la consulta a la base.", $th->getMessage(), 500);
  256. }
  257. return $this->responseController->makeResponse(false, "ÉXITO: Consulta Exitosa", $arrResponse);
  258. }
  259. public function getProvidersActives($line) {
  260. try {
  261. $arrProvider = DB::table('S002V01TPROV')
  262. ->where('PROV_ESTA', '=', 'Activo')
  263. ->where('PROV_NULI', '=', $line)
  264. ->get([
  265. 'PROV_NUPR AS NUMERO_PROVEEDOR',
  266. 'PROV_NOCO AS RAZON_SOCIAL',
  267. 'PROV_NOMB AS NOMBRE',
  268. 'PROV_APPA AS PRIMER_APELLIDO',
  269. 'PROV_APMA AS SEGUNDO_APELLIDO',
  270. 'PROV_CORR AS CORREO',
  271. 'PROV_LAD1 AS LADA1',
  272. 'PROV_TEL1 AS TELEFONO1',
  273. 'PROV_LAD2 AS LADA2',
  274. 'PROV_TEL2 AS TELEFONO2',
  275. 'PROV_XRFC AS RFC',
  276. 'PROV_XTAX AS TAXID',
  277. 'PROV_CORF AS REGIMEN_FISCAL',
  278. 'PROV_TIPO AS TIPO_EMPRESA',
  279. 'PROV_SIWE AS SITIO_WEB',
  280. 'PROV_MEPA AS METODO_PAGO',
  281. 'PROV_USRE AS USUARIO_REGISTRA',
  282. 'PROV_FERE AS FECHA_REGISTRA',
  283. 'PROV_USMO AS USUARIO_MODIFICA',
  284. 'PROV_FEMO AS FECHA_MODIFICA',
  285. ]);
  286. } catch (\Throwable $th) {
  287. return $this->responseController->makeResponse(true, "ERR_PROVIDER_GET000: No se pudo realizar la consulta a la base.", $th->getMessage(), 500);
  288. }
  289. return $this->responseController->makeResponse(false, "ÉXITO: Consulta Exitosa", $arrProvider);
  290. }
  291. public function getProvidersByNumber($provider, $line) {
  292. try {
  293. $arrProvider = DB::table('S002V01TPROV')
  294. ->where('PROV_NUPR', '=', $provider)
  295. ->where('PROV_ESTA', '=', 'Activo')
  296. ->where('PROV_NULI', '=', $line)
  297. ->first([
  298. 'PROV_NUPR AS NUMERO_PROVEEDOR',
  299. 'PROV_NOCO AS RAZON_SOCIAL',
  300. 'PROV_NOMB AS NOMBRE',
  301. 'PROV_APPA AS PRIMER_APELLIDO',
  302. 'PROV_APMA AS SEGUNDO_APELLIDO',
  303. 'PROV_CORR AS CORREO',
  304. 'PROV_LAD1 AS LADA1',
  305. 'PROV_TEL1 AS TELEFONO1',
  306. 'PROV_LAD2 AS LADA2',
  307. 'PROV_TEL2 AS TELEFONO2',
  308. 'PROV_XRFC AS RFC',
  309. 'PROV_XTAX AS TAXID',
  310. 'PROV_CORF AS REGIMEN_FISCAL',
  311. 'PROV_TIPO AS TIPO_EMPRESA',
  312. 'PROV_SIWE AS SITIO_WEB',
  313. 'PROV_MEPA AS METODO_PAGO',
  314. 'PROV_USRE AS USUARIO_REGISTRA',
  315. 'PROV_FERE AS FECHA_REGISTRA',
  316. 'PROV_USMO AS USUARIO_MODIFICA',
  317. 'PROV_FEMO AS FECHA_MODIFICA',
  318. ]);
  319. } catch (\Throwable $th) {
  320. return $this->responseController->makeResponse(true, "ERR_PROVIDER_GET000: No se pudo realizar la consulta a la base.", $th->getMessage(), 500);
  321. }
  322. return $this->responseController->makeResponse(false, "ÉXITO: Consulta Exitosa", $arrProvider);
  323. }
  324. public function updateProvider(Request $request) {
  325. $validator = Validator::make($request->all(), [
  326. 'line' => 'required|string',
  327. 'user' => 'required|string',
  328. 'obj_response' => 'required|string',
  329. ]);
  330. if ($validator->fails()) {
  331. return $this->responseController->makeResponse(
  332. true,
  333. "ERR_PROVIDER_MOD000: Se encontraron uno o más errores.",
  334. $this->responseController->makeErrors($validator->errors()->messages()),
  335. 401
  336. );
  337. }
  338. DB::beginTransaction();
  339. $requestData = $request->all();
  340. $line = $requestData['line'];
  341. try {
  342. $user = $this->encController->decrypt($request['user']);
  343. } catch (\Throwable $th) {
  344. DB::rollBack();
  345. return $this->responseController->makeResponse(true, "ERR_PROVIDER_MOD001: No se pudo obtener el usuario.", $th->getMessage(), 500);
  346. }
  347. try {
  348. $obj_response = json_decode($requestData['obj_response']);
  349. } catch (\Throwable $th) {
  350. DB::rollBack();
  351. return $this->responseController->makeResponse(true, "ERR_PROVIDER_MOD002: Ocurrió un error al obtener los datos del proveedor.", $th->getMessage(), 500);
  352. }
  353. $arrInformationPersonal = (array) $obj_response->INFORMACION;
  354. $arrReferences = (array) $obj_response->REFERENCIAS;
  355. $arrContacts = (array) $obj_response->CONTACTOS;
  356. $arrConditions = (array) $obj_response->CONDICIONES;
  357. $arrPaymentMedia = (array) $obj_response->METODOS_PAGO;
  358. $arrCatalogs = (array) $obj_response->CATALAGOS;
  359. $numeroProveedor = $arrInformationPersonal['NUMERO_PROVEEDOR'];
  360. $currentDate = Carbon::now()->timezone('America/Mazatlan')->toDateTimeString();
  361. $arrPaymentTemp = array();
  362. foreach ($arrPaymentMedia as $payment) {
  363. $arrPaymentTemp[$payment->name] = $payment->completed;
  364. }
  365. try {
  366. $strPayment = json_encode($arrPaymentTemp);
  367. } catch (\Throwable $th) {
  368. DB::rollBack();
  369. return $this->responseController->makeResponse(true, "ERR_PROVIDER_MOD003: Ocurrió un error al obtener los datos del método de pago.", $th->getMessage(), 500);
  370. }
  371. $updatePersonal = [
  372. 'PROV_NOCO' => $arrInformationPersonal['RAZON_SOCIAL'],
  373. 'PROV_NOMB' => $arrInformationPersonal['NOMBRE'],
  374. 'PROV_APPA' => $arrInformationPersonal['PRIMER_APELLIDO'],
  375. 'PROV_APMA' => $arrInformationPersonal['SEGUNDO_APELLIDO'] != '' ? $arrInformationPersonal['SEGUNDO_APELLIDO'] : null,
  376. 'PROV_CORR' => $arrInformationPersonal['CORREO'],
  377. 'PROV_LAD1' => $arrInformationPersonal['LADA1'],
  378. 'PROV_TEL1' => $arrInformationPersonal['TELEFONO1'],
  379. 'PROV_LAD2' => $arrInformationPersonal['LADA2'] != '' ? $arrInformationPersonal['LADA2'] : null,
  380. 'PROV_TEL2' => $arrInformationPersonal['TELEFONO2'] != '' ? $arrInformationPersonal['TELEFONO2'] : null,
  381. 'PROV_XRFC' => $arrInformationPersonal['RFC'],
  382. 'PROV_XTAX' => $arrInformationPersonal['TAXID'] != '' ? $arrInformationPersonal['TAXID'] : null,
  383. 'PROV_CORF' => $arrInformationPersonal['REGIMEN_FISCAL'],
  384. 'PROV_TIPO' => $arrInformationPersonal['TIPO_EMPRESA'],
  385. 'PROV_SIWE' => $arrInformationPersonal['SITIO_WEB'],
  386. 'PROV_MEPA' => $strPayment,
  387. 'PROV_USMO' => $user,
  388. 'PROV_FEMO' => $currentDate,
  389. 'PROV_FEAR' => DB::raw('CURRENT_TIMESTAMP')
  390. ];
  391. try {
  392. $resp = DB::table('S002V01TPROV')->where('PROV_NUPR', '=', $numeroProveedor)->where('PROV_NULI', '=', $line)->update($updatePersonal);
  393. if (!$resp) {
  394. DB::rollBack();
  395. return $this->responseController->makeResponse(true, "ERR_PROVIDER_MOD004: Ocurrió un error al obtener el contenido.", [], 500);
  396. }
  397. } catch (\Throwable $th) {
  398. DB::rollBack();
  399. return $this->responseController->makeResponse(true, "ERR_PROVIDER_MOD005: Ocurrió un error al obtener el contenido.", $th->getMessage(), 500);
  400. }
  401. foreach ($arrReferences as $references) {
  402. if ($references->ESTADO == 'Activo' || $references->ESTADO == 'Modificado') {
  403. $updateReferences = [
  404. 'PRRE_EMPR' => $references->EMPRESA,
  405. 'PRRE_CORR' => $references->CORREO,
  406. 'PRRE_LADA' => $references->LADA,
  407. 'PRRE_TELE' => $references->TELEFONO,
  408. 'PRRE_XRFC' => $references->RFC,
  409. 'PRRE_DIRE' => $references->DIRECCION,
  410. 'PRRE_USMO' => $user,
  411. 'PRRE_FEMO' => $currentDate,
  412. 'PRRE_FEAR' => DB::raw('CURRENT_TIMESTAMP')
  413. ];
  414. try {
  415. $resp = DB::table('S002V01TPRRE')
  416. ->where('PRRE_IDRE', '=', $references->NUMERO_REFERENCIA)
  417. ->where('PRRE_NUPR', '=', $numeroProveedor)
  418. ->where('PRRE_NULI', '=', $line)
  419. ->update($updateReferences);
  420. if (!$resp) {
  421. DB::rollBack();
  422. return $this->responseController->makeResponse(true, "ERR_PROVIDER_MOD006: Ocurrió un error al obtener el contenido. ", [], 500);
  423. }
  424. } catch (\Throwable $th) {
  425. DB::rollBack();
  426. return $this->responseController->makeResponse(true, "ERR_PROVIDER_MOD007: Ocurrió un error al obtener el contenido.", $th->getMessage(), 500);
  427. }
  428. }else if($references->ESTADO == 'Nuevo') {
  429. $insertReferences = [
  430. 'PRRE_NUPR' => $numeroProveedor,
  431. 'PRRE_EMPR' => $references->EMPRESA,
  432. 'PRRE_CORR' => $references->CORREO,
  433. 'PRRE_LADA' => $references->LADA,
  434. 'PRRE_TELE' => $references->TELEFONO,
  435. 'PRRE_XRFC' => $references->RFC,
  436. 'PRRE_DIRE' => $references->DIRECCION,
  437. 'PRRE_NULI' => $line,
  438. 'PRRE_USRE' => $user,
  439. 'PRRE_FERE' => $currentDate,
  440. 'PRRE_FEAR' => DB::raw('CURRENT_TIMESTAMP')
  441. ];
  442. try {
  443. $resp = DB::table('S002V01TPRRE')->insert($insertReferences);
  444. if (!$resp) {
  445. DB::rollBack();
  446. return $this->responseController->makeResponse(true, "ERR_PROVIDER_MOD008: Ocurrió un error al obtener el contenido.", [], 500);
  447. }
  448. } catch (\Throwable $th) {
  449. DB::rollBack();
  450. return $this->responseController->makeResponse(true, "ERR_PROVIDER_MOD009: Ocurrió un error al obtener el contenido.", $th->getMessage(), 500);
  451. }
  452. } else if($references->ESTADO == 'Eliminado'){
  453. $updateReferences = [
  454. 'PRRE_ESTA' => 'Eliminado',
  455. 'PRRE_USMO' => $user,
  456. 'PRRE_FEMO' => $currentDate,
  457. 'PRRE_FEAR' => DB::raw('CURRENT_TIMESTAMP')
  458. ];
  459. try {
  460. $resp = DB::table('S002V01TPRRE')
  461. ->where('PRRE_IDRE', '=', $references->NUMERO_REFERENCIA)
  462. ->where('PRRE_NUPR', '=', $numeroProveedor)
  463. ->where('PRRE_NULI', '=', $line)
  464. ->update($updateReferences);
  465. if (!$resp) {
  466. DB::rollBack();
  467. return $this->responseController->makeResponse(true, "ERR_PROVIDER_MOD010: Ocurrió un error al obtener el contenido.", [], 500);
  468. }
  469. } catch (\Throwable $th) {
  470. DB::rollBack();
  471. return $this->responseController->makeResponse(true, "ERR_PROVIDER_MOD011: Ocurrió un error al obtener el contenido.", $th->getMessage(), 500);
  472. }
  473. }
  474. }
  475. foreach ($arrContacts as $contacts) {
  476. if ($contacts->ESTADO == 'Activo' && $contacts->ESTADO == 'Modificado') {
  477. $updateContacts = [
  478. 'PRCO_NOMB' => $contacts->NOMBRE_CONTACTO,
  479. 'PRCO_TIPO' => $contacts->TIPO_CONTACTO,
  480. 'PRCO_CALL' => $contacts->CALLE,
  481. 'PRCO_NUEX' => $contacts->NUMERO_EXTERIOR,
  482. 'PRCO_NUIN' => $contacts->NUMERO_INTERIOR != '' ? $contacts->NUMERO_INTERIOR : null,
  483. 'PRCO_COPO' => $contacts->CODIGO_POSTAL,
  484. 'PRCO_COLO' => $contacts->SUBURB,
  485. 'PRCO_MUNI' => $contacts->MUNICIPIO,
  486. 'PRCO_ENTI' => $contacts->ENTIDAD,
  487. 'PRCO_PAIS' => $contacts->PAIS,
  488. 'PRCO_TEL1' => $contacts->TELEFONO1,
  489. 'PRCO_TEL2' => $contacts->TELEFONO2 != '' ? $contacts->TELEFONO2 : null,
  490. 'PRCO_COR1' => $contacts->CORREO1,
  491. 'PRCO_COR2' => $contacts->CORREO2 != '' ? $contacts->CORREO2 : null,
  492. 'PRCO_OBSE' => $contacts->OBSERVACIONES,
  493. 'PRCO_USMO' => $user,
  494. 'PRCO_FEMO' => $currentDate,
  495. 'PRCO_FEAR' => DB::raw('CURRENT_TIMESTAMP')
  496. ];
  497. try {
  498. $resp = DB::table('S002V01TPRCO')
  499. ->where('PRCO_IDCP', '=', $contacts->NUMERO_CONTACTO)
  500. ->where('PRCO_NUPR', '=', $numeroProveedor)
  501. ->where('PRCO_NULI', '=', $line)
  502. ->update($updateContacts);
  503. if (!$resp) {
  504. DB::rollBack();
  505. return $this->responseController->makeResponse(true, "ERR_PROVIDER_MOD012: Ocurrió un error al obtener el contenido.", [], 500);
  506. }
  507. } catch (\Throwable $th) {
  508. DB::rollBack();
  509. return $this->responseController->makeResponse(true, "ERR_PROVIDER_MOD013: Ocurrió un error al obtener el contenido.", $th->getMessage(), 500);
  510. }
  511. }else if($contacts->ESTADO == 'Nuevo'){
  512. $insertContacts = [
  513. 'PRCO_NUPR' => $numeroProveedor,
  514. 'PRCO_NOMB' => $contacts->NOMBRE_CONTACTO,
  515. 'PRCO_TIPO' => $contacts->TIPO_CONTACTO,
  516. 'PRCO_CALL' => $contacts->CALLE,
  517. 'PRCO_NUEX' => $contacts->NUMERO_EXTERIOR,
  518. 'PRCO_NUIN' => $contacts->NUMERO_INTERIOR != '' ? $contacts->NUMERO_INTERIOR : null,
  519. 'PRCO_COPO' => $contacts->CODIGO_POSTAL,
  520. 'PRCO_COLO' => $contacts->COLONIA,
  521. 'PRCO_MUNI' => $contacts->MUNICIPIO,
  522. 'PRCO_ENTI' => $contacts->ENTIDAD,
  523. 'PRCO_PAIS' => $contacts->PAIS,
  524. 'PRCO_LAD1' => $contacts->LADA1,
  525. 'PRCO_TEL1' => $contacts->TELEFONO1,
  526. 'PRCO_LAD2' => $contacts->LADA2 != '' ? $contacts->LADA2 : null,
  527. 'PRCO_TEL2' => $contacts->TELEFONO2 != '' ? $contacts->TELEFONO2 : null,
  528. 'PRCO_COR1' => $contacts->CORREO1,
  529. 'PRCO_COR2' => $contacts->CORREO2 != '' ? $contacts->CORREO2 : null,
  530. 'PRCO_OBSE' => $contacts->OBSERVACIONES,
  531. 'PRCO_NULI' => $line,
  532. 'PRCO_USRE' => $user,
  533. 'PRCO_FERE' => $currentDate,
  534. 'PRCO_FEAR' => DB::raw('CURRENT_TIMESTAMP')
  535. ];
  536. try {
  537. $resp = DB::table('S002V01TPRCO')->insert($insertContacts);
  538. if (!$resp) {
  539. DB::rollBack();
  540. return $this->responseController->makeResponse(true, "ERR_PROVIDER_MOD014: Ocurrió un error al obtener el contenido.", [], 500);
  541. }
  542. } catch (\Throwable $th) {
  543. DB::rollBack();
  544. return $this->responseController->makeResponse(true, "ERR_PROVIDER_MOD015: Ocurrió un error al obtener el contenido.", $th->getMessage(), 500);
  545. }
  546. }else if($contacts->ESTADO == 'Eliminado'){
  547. $updateContacts = [
  548. 'PRCO_ESTA' => 'Eliminado',
  549. 'PRCO_USMO' => $user,
  550. 'PRCO_FEMO' => $currentDate,
  551. 'PRCO_FEAR' => DB::raw('CURRENT_TIMESTAMP')
  552. ];
  553. try {
  554. $resp = DB::table('S002V01TPRCO')
  555. ->where('PRCO_IDCP', '=', $contacts->NUMERO_CONTACTO)
  556. ->where('PRCO_NUPR', '=', $numeroProveedor)
  557. ->where('PRCO_NULI', '=', $line)
  558. ->update($updateContacts);
  559. if (!$resp) {
  560. DB::rollBack();
  561. return $this->responseController->makeResponse(true, "ERR_PROVIDER_MOD016: Ocurrió un error al obtener el contenido.", [], 500);
  562. }
  563. } catch (\Throwable $th) {
  564. DB::rollBack();
  565. return $this->responseController->makeResponse(true, "ERR_PROVIDER_MOD017: Ocurrió un error al obtener el contenido.", $th->getMessage(), 500);
  566. }
  567. }
  568. }
  569. foreach ($arrConditions as $conditions) {
  570. if ($conditions->ESTADO == 'Activo' && $conditions->ESTADO == 'Modificado') {
  571. $updateConditions = [
  572. 'PRCN_TIPO' => $conditions->TIPO_CONDICION,
  573. 'PRCN_INFO' => $conditions->INFORMACION,
  574. 'PRCN_USMO' => $user,
  575. 'PRCN_FEMO' => $currentDate,
  576. 'PRCN_FEAR' => DB::raw('CURRENT_TIMESTAMP')
  577. ];
  578. try {
  579. $resp = DB::table('S002V01TPRCN')
  580. ->where('PRCN_IDCM', '=', $conditions->NUMERO_CONDICION)
  581. ->where('PRCN_NUPR', '=', $numeroProveedor)
  582. ->where('PRCN_NULI', '=', $line)
  583. ->update($updateConditions);
  584. if (!$resp) {
  585. DB::rollBack();
  586. return $this->responseController->makeResponse(true, "ERR_PROVIDER_MOD018: Ocurrió un error al obtener el contenido.", [], 500);
  587. }
  588. } catch (\Throwable $th) {
  589. DB::rollBack();
  590. return $this->responseController->makeResponse(true, "ERR_PROVIDER_MOD019: Ocurrió un error al obtener el contenido.", $th->getMessage(), 500);
  591. }
  592. }else if($conditions->ESTADO == 'Nuevo'){
  593. $insertConditions = [
  594. 'PRCN_NUPR' => $numeroProveedor,
  595. 'PRCN_TIPO' => $conditions->TIPO_CONDICION,
  596. 'PRCN_INFO' => $conditions->INFORMACION,
  597. 'PRCN_NULI' => $line,
  598. 'PRCN_USRE' => $user,
  599. 'PRCN_FERE' => $currentDate,
  600. 'PRCN_FEAR' => DB::raw('CURRENT_TIMESTAMP')
  601. ];
  602. try {
  603. $resp = DB::table('S002V01TPRCN')->insert($insertConditions);
  604. if (!$resp) {
  605. DB::rollBack();
  606. return $this->responseController->makeResponse(true, "ERR_PROVIDER_MOD020: Ocurrió un error al obtener el contenido.", [], 500);
  607. }
  608. } catch (\Throwable $th) {
  609. DB::rollBack();
  610. return $this->responseController->makeResponse(true, "ERR_PROVIDER_MOD021: Ocurrió un error al obtener el contenido.", $th->getMessage(), 500);
  611. }
  612. }else if ($conditions->ESTADO == 'Eliminado'){
  613. $updateConditions = [
  614. 'PRCN_ESTA' => 'Eliminado',
  615. 'PRCN_USMO' => $user,
  616. 'PRCN_FEMO' => $currentDate,
  617. 'PRCN_FEAR' => DB::raw('CURRENT_TIMESTAMP')
  618. ];
  619. try {
  620. $resp = DB::table('S002V01TPRCN')
  621. ->where('PRCN_IDCM', '=', $conditions->NUMERO_CONDICION)
  622. ->where('PRCN_NUPR', '=', $numeroProveedor)
  623. ->where('PRCN_NULI', '=', $line)
  624. ->update($updateConditions);
  625. if (!$resp) {
  626. DB::rollBack();
  627. return $this->responseController->makeResponse(true, "ERR_PROVIDER_MOD022: Ocurrió un error al obtener el contenido.", [], 500);
  628. }
  629. } catch (\Throwable $th) {
  630. DB::rollBack();
  631. return $this->responseController->makeResponse(true, "ERR_PROVIDER_MOD023: Ocurrió un error al obtener el contenido.", $th->getMessage(), 500);
  632. }
  633. }
  634. }
  635. foreach ($arrCatalogs as $catalogs) {
  636. if ($catalogs->ESTADO == 'Activo' || $catalogs->ESTADO == 'Modificado') {
  637. $updateCatalogs = [
  638. 'PRCE_CATA' => $catalogs->CATALAGO,
  639. 'PRCE_DESC' => $catalogs->DESCRIPCION,
  640. 'PRCE_XURL' => $catalogs->URL_CATALAGO,
  641. 'PRCE_USMO' => $user,
  642. 'PRCE_FEMO' => $currentDate,
  643. 'PRCE_FEAR' => DB::raw('CURRENT_TIMESTAMP')
  644. ];
  645. try {
  646. $resp = DB::table('S002V01TPRCE')
  647. ->where('PRCE_IDCE', '=', $catalogs->NUMERO_CATALAGO)
  648. ->where('PRCE_NUPR', '=', $numeroProveedor)
  649. ->where('PRCE_NULI', '=', $line)
  650. ->update($updateCatalogs);
  651. if (!$resp) {
  652. DB::rollBack();
  653. return $this->responseController->makeResponse(true, "ERR_PROVIDER_MOD024: Ocurrió un error al obtener el contenido.", [], 500);
  654. }
  655. } catch (\Throwable $th) {
  656. DB::rollBack();
  657. return $this->responseController->makeResponse(true, "ERR_PROVIDER_MOD025: Ocurrió un error al obtener el contenido.", $th->getMessage(), 500);
  658. }
  659. }else if($catalogs->ESTADO == 'Nuevo'){
  660. $insertCatalogs = [
  661. 'PRCE_NUPR' => $numeroProveedor,
  662. 'PRCE_CATA' => $catalogs->CATALAGO,
  663. 'PRCE_DESC' => $catalogs->DESCRIPCION,
  664. 'PRCE_XURL' => $catalogs->URL_CATALAGO,
  665. 'PRCE_NULI' => $line,
  666. 'PRCE_USRE' => $user,
  667. 'PRCE_FERE' => $currentDate,
  668. 'PRCE_FEAR' => DB::raw('CURRENT_TIMESTAMP')
  669. ];
  670. try {
  671. $resp = DB::table('S002V01TPRCE')->insert($insertCatalogs);
  672. if (!$resp) {
  673. DB::rollBack();
  674. return $this->responseController->makeResponse(true, "ERR_PROVIDER_MOD026: Ocurrió un error al obtener el contenido.", [], 500);
  675. }
  676. } catch (\Throwable $th) {
  677. DB::rollBack();
  678. return $this->responseController->makeResponse(true, "ERR_PROVIDER_MOD027: Ocurrió un error al obtener el contenido.", $th->getMessage(), 500);
  679. }
  680. }else if($catalogs->ESTADO == 'Eliminado'){
  681. $updateCatalogs = [
  682. 'PRCE_ESTA' => 'Eliminado',
  683. 'PRCE_USMO' => $user,
  684. 'PRCE_FEMO' => $currentDate,
  685. 'PRCE_FEAR' => DB::raw('CURRENT_TIMESTAMP')
  686. ];
  687. try {
  688. $resp = DB::table('S002V01TPRCE')
  689. ->where('PRCE_IDCE', '=', $catalogs->NUMERO_CATALAGO)
  690. ->where('PRCE_NUPR', '=', $numeroProveedor)
  691. ->where('PRCE_NULI', '=', $line)
  692. ->update($updateCatalogs);
  693. if (!$resp) {
  694. DB::rollBack();
  695. return $this->responseController->makeResponse(true, "ERR_PROVIDER_MOD028: Ocurrió un error al obtener el contenido.", [], 500);
  696. }
  697. } catch (\Throwable $th) {
  698. DB::rollBack();
  699. return $this->responseController->makeResponse(true, "ERR_PROVIDER_MOD029: Ocurrió un error al obtener el contenido.", $th->getMessage(), 500);
  700. }
  701. }
  702. }
  703. DB::commit();
  704. return $this->responseController->makeResponse(false, "EXITO: Modificación Exitosa");
  705. }
  706. public function registerProvider(Request $request) {
  707. $validator = Validator::make($request->all(), [
  708. 'line' => 'required|string',
  709. 'user' => 'required|string',
  710. 'obj_response' => 'required|string',
  711. ]);
  712. if ($validator->fails()) {
  713. return $this->responseController->makeResponse(
  714. true,
  715. "ERR_PROVIDER_REG000: Se encontraron uno o más errores.",
  716. $this->responseController->makeErrors($validator->errors()->messages()),
  717. 401
  718. );
  719. }
  720. DB::beginTransaction();
  721. $requestData = $request->all();
  722. $line = $requestData['line'];
  723. try {
  724. $user = $this->encController->decrypt($requestData['user']);
  725. } catch (\Throwable $th) {
  726. DB::rollBack();
  727. return $this->responseController->makeResponse(true, "ERR_PROVIDER_REG001: Ocurrió un error al obtener el usuario.", $th->getMessage(), 500);
  728. }
  729. try {
  730. $obj_response = json_decode($requestData['obj_response']);
  731. } catch (\Throwable $th) {
  732. DB::rollBack();
  733. return $this->responseController->makeResponse(true, "ERR_PROVIDER_REG002: Ocurrió un error al obtener los datos del proveedor.", $th->getMessage(), 500);
  734. }
  735. $arrInformationPersonal = (array) $obj_response->INFORMACION;
  736. $arrReferences = (array) $obj_response->REFERENCIAS;
  737. $arrContacts = (array) $obj_response->CONTACTOS;
  738. $arrConditions = (array) $obj_response->CONDICIONES;
  739. $arrPaymentMedia = (array) $obj_response->METODOS_PAGO;
  740. $arrCatalogs = (array) $obj_response->CATALAGOS;
  741. $currentDate = Carbon::now()->timezone('America/Mazatlan')->toDateTimeString();
  742. $arrPaymentTemp = array();
  743. foreach ($arrPaymentMedia as $payment) {
  744. $arrPaymentTemp[$payment->name] = $payment->completed;
  745. }
  746. try {
  747. $strPayment = json_encode($arrPaymentTemp);
  748. } catch (\Throwable $th) {
  749. DB::rollBack();
  750. return $this->responseController->makeResponse(true, "ERR_PROVIDER_REG003: Ocurrió un error al obtener los métodos de pago del proveedor.", $th->getMessage(), 500);
  751. }
  752. $insertPersonal = [
  753. 'PROV_NOCO' => $arrInformationPersonal['RAZON_SOCIAL'],
  754. 'PROV_NOMB' => $arrInformationPersonal['NOMBRE'],
  755. 'PROV_APPA' => $arrInformationPersonal['PRIMER_APELLIDO'],
  756. 'PROV_APMA' => $arrInformationPersonal['SEGUNDO_APELLIDO'] != '' ? $arrInformationPersonal['SEGUNDO_APELLIDO'] : null,
  757. 'PROV_CORR' => $arrInformationPersonal['CORREO'],
  758. 'PROV_LAD1' => $arrInformationPersonal['LADA1'],
  759. 'PROV_TEL1' => $arrInformationPersonal['TELEFONO1'],
  760. 'PROV_LAD2' => $arrInformationPersonal['LADA2'] != '' ? $arrInformationPersonal['LADA2'] : null,
  761. 'PROV_TEL2' => $arrInformationPersonal['TELEFONO2'] != '' ? $arrInformationPersonal['TELEFONO2'] : null,
  762. 'PROV_XRFC' => $arrInformationPersonal['RFC'],
  763. 'PROV_XTAX' => $arrInformationPersonal['TAXID'] != '' ? $arrInformationPersonal['TAXID'] : null,
  764. 'PROV_CORF' => $arrInformationPersonal['REGIMEN_FISCAL'],
  765. 'PROV_TIPO' => $arrInformationPersonal['TIPO_EMPRESA'],
  766. 'PROV_SIWE' => $arrInformationPersonal['SITIO_WEB'],
  767. 'PROV_MEPA' => $strPayment,
  768. 'PROV_NULI' => $line,
  769. 'PROV_USRE' => $user,
  770. 'PROV_FERE' => $currentDate,
  771. 'PROV_FEAR' => DB::raw('CURRENT_TIMESTAMP')
  772. ];
  773. try {
  774. $idProdiver = DB::table('S002V01TPROV')->insertGetId($insertPersonal);
  775. } catch (\Throwable $th) {
  776. DB::rollBack();
  777. return $this->responseController->makeResponse(true, "ERR_PROVIDER_REG004: Ocurrió un error al obtener el contenido.", $th->getMessage(), 500);
  778. }
  779. foreach ($arrReferences as $references) {
  780. if ($references->ESTADO == 'Activo' || $references->ESTADO == 'Nuevo') {
  781. $insertReferences = [
  782. 'PRRE_NUPR' => $idProdiver,
  783. 'PRRE_EMPR' => $references->EMPRESA,
  784. 'PRRE_CORR' => $references->CORREO,
  785. 'PRRE_LADA' => $references->LADA,
  786. 'PRRE_TELE' => $references->TELEFONO,
  787. 'PRRE_XRFC' => $references->RFC,
  788. 'PRRE_DIRE' => $references->DIRECCION,
  789. 'PRRE_NULI' => $line,
  790. 'PRRE_USRE' => $user,
  791. 'PRRE_FERE' => $currentDate,
  792. 'PRRE_FEAR' => DB::raw('CURRENT_TIMESTAMP')
  793. ];
  794. try {
  795. $resp = DB::table('S002V01TPRRE')->insert($insertReferences);
  796. if (!$resp) {
  797. DB::rollBack();
  798. return $this->responseController->makeResponse(true, "ERR_PROVIDER_REG005: Ocurrió un error al obtener el contenido.", [], 500);
  799. }
  800. } catch (\Throwable $th) {
  801. DB::rollBack();
  802. return $this->responseController->makeResponse(true, "ERR_PROVIDER_REG006: Ocurrió un error al obtener el contenido.", $th->getMessage(), 500);
  803. }
  804. }
  805. }
  806. foreach ($arrContacts as $contacts) {
  807. if ($contacts->ESTADO == 'Activo' || $contacts->ESTADO == 'Nuevo') {
  808. $insertContacts = [
  809. 'PRCO_NUPR' => $idProdiver,
  810. 'PRCO_NOMB' => $contacts->NOMBRE_CONTACTO,
  811. 'PRCO_TIPO' => $contacts->TIPO_CONTACTO,
  812. 'PRCO_CALL' => $contacts->CALLE,
  813. 'PRCO_NUEX' => $contacts->NUMERO_EXTERIOR,
  814. 'PRCO_NUIN' => $contacts->NUMERO_INTERIOR != '' ? $contacts->NUMERO_INTERIOR : null,
  815. 'PRCO_COPO' => $contacts->CODIGO_POSTAL,
  816. 'PRCO_COLO' => $contacts->COLONIA,
  817. 'PRCO_MUNI' => $contacts->MUNICIPIO,
  818. 'PRCO_ENTI' => $contacts->ENTIDAD,
  819. 'PRCO_PAIS' => $contacts->PAIS,
  820. 'PRCO_LAD1' => $contacts->LADA1,
  821. 'PRCO_TEL1' => $contacts->TELEFONO1,
  822. 'PRCO_LAD2' => $contacts->LADA2 != '' ? $contacts->LADA2 : null,
  823. 'PRCO_TEL2' => $contacts->TELEFONO2 != '' ? $contacts->TELEFONO2 : null,
  824. 'PRCO_COR1' => $contacts->CORREO1,
  825. 'PRCO_COR2' => $contacts->CORREO2 != '' ? $contacts->CORREO2 : null,
  826. 'PRCO_OBSE' => $contacts->OBSERVACIONES,
  827. 'PRCO_NULI' => $line,
  828. 'PRCO_USRE' => $user,
  829. 'PRCO_FERE' => $currentDate,
  830. 'PRCO_FEAR' => DB::raw('CURRENT_TIMESTAMP')
  831. ];
  832. try {
  833. $resp = DB::table('S002V01TPRCO')->insert($insertContacts);
  834. if (!$resp) {
  835. DB::rollBack();
  836. return $this->responseController->makeResponse(true, "ERR_PROVIDER_REG007: Ocurrió un error al obtener el contenido.", [], 500);
  837. }
  838. } catch (\Throwable $th) {
  839. DB::rollBack();
  840. return $this->responseController->makeResponse(true, "ERR_PROVIDER_REG008: Ocurrió un error al obtener el contenido.", $th->getMessage(), 500);
  841. }
  842. }
  843. }
  844. foreach ($arrConditions as $conditions) {
  845. if ($conditions->ESTADO == 'Activo') {
  846. $insertConditions = [
  847. 'PRCN_NUPR' => $idProdiver,
  848. 'PRCN_TIPO' => $conditions->TIPO_CONDICION,
  849. 'PRCN_INFO' => $conditions->INFORMACION,
  850. 'PRCN_NULI' => $line,
  851. 'PRCN_USRE' => $user,
  852. 'PRCN_FERE' => $currentDate,
  853. 'PRCN_FEAR' => DB::raw('CURRENT_TIMESTAMP')
  854. ];
  855. try {
  856. $resp = DB::table('S002V01TPRCN')->insert($insertConditions);
  857. if (!$resp) {
  858. DB::rollBack();
  859. return $this->responseController->makeResponse(true, "ERR_PROVIDER_REG009: Ocurrió un error al obtener el contenido.", [], 500);
  860. }
  861. } catch (\Throwable $th) {
  862. DB::rollBack();
  863. return $this->responseController->makeResponse(true, "ERR_PROVIDER_REG010: Ocurrió un error al obtener el contenido.", $th->getMessage(), 500);
  864. }
  865. }
  866. }
  867. foreach ($arrCatalogs as $catalogs) {
  868. if ($catalogs->ESTADO == 'Activo' || $catalogs->ESTADO == 'Nuevo') {
  869. $insertCatalogs = [
  870. 'PRCE_NUPR' => $idProdiver,
  871. 'PRCE_CATA' => $catalogs->CATALAGO,
  872. 'PRCE_DESC' => $catalogs->DESCRIPCION,
  873. 'PRCE_XURL' => $catalogs->URL_CATALAGO,
  874. 'PRCE_NULI' => $line,
  875. 'PRCE_USRE' => $user,
  876. 'PRCE_FERE' => $currentDate,
  877. 'PRCE_FEAR' => DB::raw('CURRENT_TIMESTAMP')
  878. ];
  879. try {
  880. $resp = DB::table('S002V01TPRCE')->insert($insertCatalogs);
  881. if (!$resp) {
  882. DB::rollBack();
  883. return $this->responseController->makeResponse(true, "ERR_PROVIDER_REG011: Ocurrió un error al obtener el contenido.", [], 500);
  884. }
  885. } catch (\Throwable $th) {
  886. DB::rollBack();
  887. return $this->responseController->makeResponse(true, "ERR_PROVIDER_REG012: Ocurrió un error al obtener el contenido.", $th->getMessage(), 500);
  888. }
  889. }
  890. }
  891. DB::commit();
  892. return $this->responseController->makeResponse(false, "EXITO: Registro Exitoso");
  893. }
  894. public function deleteProvider(Request $request) {
  895. $validator = Validator::make($request->all(), [
  896. 'line' => 'required|string',
  897. 'user' => 'required|string',
  898. 'numero_proveedor' => 'required|string'
  899. ]);
  900. if ($validator->fails()) {
  901. return $this->responseController->makeResponse(
  902. true,
  903. "ERR_PROVIDER_DEL000: Se encontraron uno o más errores.",
  904. $this->responseController->makeErrors($validator->errors()->messages()),
  905. 401
  906. );
  907. }
  908. DB::beginTransaction();
  909. $requestData = $request->all();
  910. $currentDate = Carbon::now()->timezone('America/Mazatlan')->toDateTimeString();
  911. $line = $requestData['line'];
  912. try {
  913. $numeroProveedor = $this->encController->decrypt($requestData['numero_proveedor']);
  914. } catch (\Throwable $th) {
  915. DB::rollBack();
  916. return $this->responseController->makeResponse(true, "ERR_PROVIDER_DEL001: Ocurrió un error al obtener el número del proveedor.", $th->getMessage(), 500);
  917. }
  918. try {
  919. $user = $this->encController->decrypt($requestData['user']);
  920. } catch (\Throwable $th) {
  921. DB::rollBack();
  922. return $this->responseController->makeResponse(true, "ERR_PROVIDER_DEL002: Ocurrió un error al obtener el contenido.", $th->getMessage(), 500);
  923. }
  924. $update = [
  925. 'PROV_ESTA' => 'Eliminado',
  926. 'PROV_USMO' => $user,
  927. 'PROV_FEMO' => $currentDate,
  928. 'PROV_FEAR' => DB::raw('CURRENT_TIMESTAMP')
  929. ];
  930. try {
  931. $resp = DB::table('S002V01TPROV')->where('PROV_NUPR', '=', $numeroProveedor)->where('PROV_NULI', '=', $line)->update($update);
  932. if (!$resp) {
  933. DB::rollBack();
  934. return $this->responseController->makeResponse(true, "ERR_PROVIDER_DEL003: Ocurrió un error al obtener el contenido. ", [], 500);
  935. }
  936. } catch (\Throwable $th) {
  937. DB::rollBack();
  938. return $this->responseController->makeResponse(true, "ERR_PROVIDER_DEL004: Ocurrió un error al obtener el contenido.", $th->getMessage(), 500);
  939. }
  940. $update = [
  941. 'PRRE_ESTA' => 'Eliminado',
  942. 'PRRE_USMO' => $user,
  943. 'PRRE_FEMO' => $currentDate,
  944. 'PRRE_FEAR' => DB::raw('CURRENT_TIMESTAMP')
  945. ];
  946. try {
  947. $resp = DB::table('S002V01TPRRE')->where('PRRE_NUPR', '=', $numeroProveedor)->where('PRRE_NULI', '=', $line)->update($update);
  948. if (!$resp) {
  949. DB::rollBack();
  950. return $this->responseController->makeResponse(true, "ERR_PROVIDER_DEL005: Ocurrió un error al obtener el contenido. ", [], 500);
  951. }
  952. } catch (\Throwable $th) {
  953. DB::rollBack();
  954. return $this->responseController->makeResponse(true, "ERR_PROVIDER_DEL006: Ocurrió un error al obtener el contenido.", $th->getMessage(), 500);
  955. }
  956. $update = [
  957. 'PRCO_ESTA' => 'Eliminado',
  958. 'PRCO_USMO' => $user,
  959. 'PRCO_FEMO' => $currentDate,
  960. 'PRCO_FEAR' => DB::raw('CURRENT_TIMESTAMP')
  961. ];
  962. try {
  963. $resp = DB::table('S002V01TPRCO')->where('PRCO_NUPR', '=', $numeroProveedor)->where('PRCO_NULI', '=', $line)->update($update);
  964. if (!$resp) {
  965. DB::rollBack();
  966. return $this->responseController->makeResponse(true, "ERR_PROVIDER_DEL007: Ocurrió un error al obtener el contenido. ", [], 500);
  967. }
  968. } catch (\Throwable $th) {
  969. DB::rollBack();
  970. return $this->responseController->makeResponse(true, "ERR_PROVIDER_DEL008: Ocurrió un error al obtener el contenido.", $th->getMessage(), 500);
  971. }
  972. $update = [
  973. 'PRCN_ESTA' => 'Eliminado',
  974. 'PRCN_USMO' => $user,
  975. 'PRCN_FEMO' => $currentDate,
  976. 'PRCN_FEAR' => DB::raw('CURRENT_TIMESTAMP')
  977. ];
  978. try {
  979. $resp = DB::table('S002V01TPRCN')->where('PRCN_NUPR', '=', $numeroProveedor)->where('PRCN_NULI', '=', $line)->update($update);
  980. if (!$resp) {
  981. DB::rollBack();
  982. return $this->responseController->makeResponse(true, "ERR_PROVIDER_DEL009: Ocurrió un error al obtener el contenido. ", [], 500);
  983. }
  984. } catch (\Throwable $th) {
  985. DB::rollBack();
  986. return $this->responseController->makeResponse(true, "ERR_PROVIDER_DEL010: Ocurrió un error al obtener el contenido.", $th->getMessage(), 500);
  987. }
  988. $update = [
  989. 'PRCE_ESTA' => 'Eliminado',
  990. 'PRCE_USMO' => $user,
  991. 'PRCE_FEMO' => $currentDate,
  992. 'PRCE_FEAR' => DB::raw('CURRENT_TIMESTAMP')
  993. ];
  994. try {
  995. $resp = DB::table('S002V01TPRCE')->where('PRCE_NUPR', '=', $numeroProveedor)->where('PRCE_NULI', '=', $line)->update($update);
  996. if (!$resp) {
  997. DB::rollBack();
  998. return $this->responseController->makeResponse(true, "ERR_PROVIDER_DEL011: Ocurrió un error al obtener el contenido. ", [], 500);
  999. }
  1000. } catch (\Throwable $th) {
  1001. DB::rollBack();
  1002. return $this->responseController->makeResponse(true, "ERR_PROVIDER_DEL012: Ocurrió un error al obtener el contenido.", $th->getMessage(), 500);
  1003. }
  1004. DB::commit();
  1005. return $this->responseController->makeResponse(false, "EXITO: Eliminación correcta",);
  1006. }
  1007. public function getProviderByArtitle(Request $request) {
  1008. $validator = Validator::make($request->all(), [
  1009. 'NUMERO_ARTICULO' => 'required|string',
  1010. 'NUMERO_LINEA' => 'required|string',
  1011. ]);
  1012. if ($validator->fails()) {
  1013. return $this->responseController->makeResponse(
  1014. true,
  1015. "ERR_PROVIDER_MOD000: Se encontraron uno o más errores.",
  1016. $this->responseController->makeErrors($validator->errors()->messages()),
  1017. 401
  1018. );
  1019. }
  1020. $response = $request->all();
  1021. $numeroArticulo = $this->encController->decrypt($response['NUMERO_ARTICULO']);
  1022. try {
  1023. $arrDescription = DB::table('S002V01TDEAR')
  1024. ->where('DEAR_ESTA', '=', 'Activo')
  1025. ->where('DEAR_IDAR', '=', $numeroArticulo)
  1026. ->join('S002V01TPROV', 'DEAR_NUPR', '=', 'PROV_NUPR')
  1027. ->get([
  1028. 'DEAR_IDDE AS NUMERO_DESCRIPTION',
  1029. 'PROV_NUPR AS NUMERO_PROVEEDOR',
  1030. 'PROV_NOCO AS RAZON_SOCIAL',
  1031. 'PROV_NOMB AS NOMBRE',
  1032. 'PROV_APPA AS PRIMER_APELLIDO',
  1033. 'PROV_APMA AS SEGUNDO_APELLIDO',
  1034. 'PROV_CORR AS CORREO',
  1035. 'PROV_LAD1 AS LADA1',
  1036. 'PROV_TEL1 AS TELEFONO1',
  1037. 'PROV_LAD2 AS LADA2',
  1038. 'PROV_TEL2 AS TELEFONO2',
  1039. 'PROV_XRFC AS RFC',
  1040. 'PROV_XTAX AS TAXID',
  1041. 'PROV_CORF AS REGIMEN_FISCAL',
  1042. 'PROV_TIPO AS TIPO_EMPRESA',
  1043. 'PROV_SIWE AS SITIO_WEB',
  1044. 'PROV_MEPA AS METODO_PAGO',
  1045. 'PROV_ESTA AS ESTADO',
  1046. 'PROV_USRE AS USUARIO_REGISTRA',
  1047. 'PROV_FERE AS FECHA_REGISTRA',
  1048. 'PROV_USMO AS USUARIO_MODIFICA',
  1049. 'PROV_FEMO AS FECHA_MODIFICA',
  1050. ]);
  1051. } catch (\Throwable $th) {
  1052. return $this->responseController->makeResponse(true, "ERR_PROVIDER_GET000: No se pudo realizar la consulta a la base.", $th->getMessage(), 500);
  1053. }
  1054. return $this->responseController->makeResponse(false, "ÉXITO", $arrDescription);
  1055. }
  1056. public function generateSheetProvider($encProvider, $encUser, $line) {
  1057. try {
  1058. $provider = $this->encController->decrypt($encProvider);
  1059. } catch (\Throwable $th) {
  1060. return $this->responseController->makeResponse(true, "ERR_GENERATE_SHEET_REG000: Ocurrió un error al obtener la ordens.", $th->getMessage(), 500);
  1061. }
  1062. try {
  1063. $user = $this->encController->decrypt($encUser);
  1064. } catch (\Throwable $th) {
  1065. return $this->responseController->makeResponse(true, "ERR_GENERATE_SHEET_REG001: Ocurrió un error al obtener la ordens.", $th->getMessage(), 500);
  1066. }
  1067. try {
  1068. $getProvider = (array) DB::table('S002V01TPROV')
  1069. ->where('PROV_NUPR', '=', $provider)
  1070. ->first([
  1071. 'PROV_NOCO',
  1072. 'PROV_NOMB',
  1073. 'PROV_APPA',
  1074. 'PROV_APMA',
  1075. 'PROV_CORR',
  1076. 'PROV_LAD1',
  1077. 'PROV_TEL1',
  1078. 'PROV_LAD2',
  1079. 'PROV_TEL2',
  1080. 'PROV_XRFC',
  1081. 'PROV_XTAX',
  1082. 'PROV_CORF',
  1083. 'PROV_TIPO',
  1084. 'PROV_SIWE',
  1085. 'PROV_MEPA',
  1086. 'PROV_USRE',
  1087. 'PROV_FERE',
  1088. 'PROV_USMO',
  1089. 'PROV_FEMO',
  1090. ]);
  1091. } catch (\Throwable $th) {
  1092. return $this->responseController->makeResponse(true, "ERR_GENERATE_SHEET_REG002: Ocurrió un error al obtener la ordens.", $th->getMessage(), 500);
  1093. }
  1094. try {
  1095. $getProviderReferences = DB::table('S002V01TPRRE')
  1096. ->where('PRRE_NUPR', '=', $provider)
  1097. ->where('PRRE_ESTA', '=', 'Activo')
  1098. ->where('PRRE_NULI', '=', $line)
  1099. ->get([
  1100. 'PRRE_IDRE',
  1101. 'PRRE_EMPR',
  1102. 'PRRE_CORR',
  1103. 'PRRE_LADA',
  1104. 'PRRE_TELE',
  1105. 'PRRE_XRFC',
  1106. 'PRRE_DIRE',
  1107. ]);
  1108. } catch (\Throwable $th) {
  1109. return $this->responseController->makeResponse(true, "ERR_GENERATE_SHEET_REG003: Ocurrió un error al obtener la ordens.", $th->getMessage(), 500);
  1110. }
  1111. $getProviderReferences = json_decode(json_encode($getProviderReferences), true);
  1112. try {
  1113. $getProviderCondiciones = DB::table('S002V01TPRCN')
  1114. ->where('PRCN_NUPR', '=', $provider)
  1115. ->where('PRCN_ESTA', '=', 'Activo')
  1116. ->where('PRCN_NULI', '=', $line)
  1117. ->get([
  1118. 'PRCN_IDCM',
  1119. 'PRCN_TIPO',
  1120. 'PRCN_INFO',
  1121. ]);
  1122. } catch (\Throwable $th) {
  1123. return $this->responseController->makeResponse(true, "ERR_GENERATE_SHEET_REG004: Ocurrió un error al obtener la ordens.", $th->getMessage(), 500);
  1124. }
  1125. $getProviderCondiciones = json_decode(json_encode($getProviderCondiciones), true);
  1126. try {
  1127. $getProviderCatalog = DB::table('S002V01TPRCE')
  1128. ->where('PRCE_NUPR', '=', $provider)
  1129. ->where('PRCE_ESTA', '=', 'Activo')
  1130. ->where('PRCE_NULI', '=', $line)
  1131. ->get([
  1132. 'PRCE_IDCE',
  1133. 'PRCE_CATA',
  1134. 'PRCE_DESC',
  1135. 'PRCE_XURL',
  1136. ]);
  1137. } catch (\Throwable $th) {
  1138. return $this->responseController->makeResponse(true, "ERR_GENERATE_SHEET_REG005: Ocurrió un error al obtener la ordens.", $th->getMessage(), 500);
  1139. }
  1140. $getProviderCatalog = json_decode(json_encode($getProviderCatalog), true);
  1141. try {
  1142. $getProviderContacto = DB::table('S002V01TPRCO')
  1143. ->where('PRCO_NUPR', '=', $provider)
  1144. ->where('PRCO_ESTA', '=', 'Activo')
  1145. ->where('PRCO_NULI', '=', $line)
  1146. ->get([
  1147. 'PRCO_IDCP',
  1148. 'PRCO_NOMB',
  1149. 'PRCO_TIPO',
  1150. 'PRCO_CALL',
  1151. 'PRCO_NUEX',
  1152. 'PRCO_NUIN',
  1153. 'PRCO_COPO',
  1154. 'PRCO_COLO',
  1155. 'PRCO_MUNI',
  1156. 'PRCO_ENTI',
  1157. 'PRCO_PAIS',
  1158. 'PRCO_LAD1',
  1159. 'PRCO_TEL1',
  1160. 'PRCO_LAD2',
  1161. 'PRCO_TEL2',
  1162. 'PRCO_COR1',
  1163. 'PRCO_COR2',
  1164. 'PRCO_OBSE',
  1165. ]);
  1166. } catch (\Throwable $th) {
  1167. return $this->responseController->makeResponse(true, "ERR_GENERATE_SHEET_REG006: Ocurrió un error al obtener la ordens.", $th->getMessage(), 500);
  1168. }
  1169. $getProviderContacto = json_decode(json_encode($getProviderContacto), true);
  1170. $mpdf = new PDF( [
  1171. 'mode' => 'utf-8',
  1172. 'format' => 'A4',
  1173. 'margin_header' => '3',
  1174. 'margin_top' => '20',
  1175. 'margin_bottom' => '20',
  1176. 'margin_footer' => '2',
  1177. ]);
  1178. $mpdf->SetHTMLHeader('
  1179. <div style="display:flex; align-items: center; text-align: right;">
  1180. <img src="data:image/png;base64,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" width="100">
  1181. </div>
  1182. ');
  1183. $mpdf->WriteHTML('<b>Número de Proveedor:</b> '.$provider);
  1184. $mpdf->WriteHTML('<b>Nombre Comercial:</b> '.$getProvider['PROV_NOCO']);
  1185. $mpdf->WriteHTML('<b>Encargado:</b> '.$getProvider['PROV_NOMB'].' '.$getProvider['PROV_APPA'].' '.$getProvider['PROV_APMA']);
  1186. $mpdf->WriteHTML('<b>Correo Electrónico:</b> '.$getProvider['PROV_CORR']);
  1187. $mpdf->WriteHTML('<b>Teléfono Principal:</b> +'.$getProvider['PROV_LAD1'].' '.$getProvider['PROV_TEL1']);
  1188. if ($getProvider['PROV_LAD2'] != null) {
  1189. $mpdf->WriteHTML('<b>Teléfono Secundario:</b> +'.$getProvider['PROV_LAD2'].' '.$getProvider['PROV_TEL2']);
  1190. }
  1191. if ($getProvider['PROV_XRFC'] != null) {
  1192. $mpdf->WriteHTML('<b>R.F.C.:</b> '.$getProvider['PROV_XRFC']);
  1193. }
  1194. if ($getProvider['PROV_XTAX'] != null) {
  1195. $mpdf->WriteHTML('<b>TAX ID:</b> '.$getProvider['PROV_XTAX']);
  1196. }
  1197. $mpdf->WriteHTML('<b>Regimen Fiscal:</b> '.$getProvider['PROV_CORF']);
  1198. $mpdf->WriteHTML('<b>Tipo de Proveedor:</b> '.$getProvider['PROV_TIPO']);
  1199. $mpdf->WriteHTML('<b>Sitio Web:</b> '.$getProvider['PROV_SIWE']);
  1200. $mpdf->WriteHTML('<hr>');
  1201. $mpdf->WriteHTML('<b>Métodos de Pago Aceptados:</b>');
  1202. $arrMethod = json_decode($getProvider['PROV_MEPA'], true);
  1203. $htmlList = '<ul style="margin: 0;">';
  1204. foreach ($arrMethod as $keyMethod => $isHabilited) {
  1205. if ($isHabilited) {
  1206. $htmlList .= '<li>';
  1207. $htmlList .= $keyMethod;
  1208. $htmlList .= '</li>';
  1209. }
  1210. }
  1211. $htmlList .= '</ul>';
  1212. $mpdf->WriteHTML($htmlList);
  1213. $mpdf->WriteHTML('<hr>');
  1214. $htmlReferences = '<b>Contactos del Proveedor</b><br>
  1215. <table border="1" style="margin-top: 12px;">
  1216. <thead>
  1217. <tr>
  1218. <th style="font-size: 8pt;">No</th>
  1219. <th style="font-size: 8pt;">Nombre Empleado</th>
  1220. <th style="font-size: 8pt;">Dirección</th>
  1221. <th style="font-size: 8pt;">Teléfono 1</th>
  1222. <th style="font-size: 8pt;">Teléfono 2</th>
  1223. <th style="font-size: 8pt;">Correo Electrónico 1</th>
  1224. <th style="font-size: 8pt;">Correo Electrónico 2</th>
  1225. <th style="font-size: 8pt;">Observaciones</th>
  1226. </tr>
  1227. </thead>
  1228. <tbody>';
  1229. foreach ($getProviderContacto as $key => $providerContacto) {
  1230. $htmlReferences .= '<tr>';
  1231. // No
  1232. $htmlReferences .='<td style="font-size: 8pt;">'.$providerContacto['PRCO_IDCP'].'</td>';
  1233. // Nombre Empleado
  1234. $htmlReferences .='<td style="font-size: 8pt;">'.$providerContacto['PRCO_NOMB'].'</td>';
  1235. // Direccion
  1236. $direction = $providerContacto['PRCO_CALL'].' '.$providerContacto['PRCO_NUEX'].' '.$providerContacto['PRCO_NUIN'].' '.$providerContacto['PRCO_COPO'].' '.
  1237. $providerContacto['PRCO_MUNI'].' '.$providerContacto['PRCO_ENTI'].' '.$providerContacto['PRCO_PAIS'];
  1238. $htmlReferences .='<td style="font-size: 8pt;">'.$direction.'</td>';
  1239. // Teléfono 1
  1240. $htmlReferences .='<td style="font-size: 8pt;">+'.$providerContacto['PRCO_LAD1'].' '.$providerContacto['PRCO_TEL1'].'</td>';
  1241. // Teléfono 2
  1242. if ($providerContacto['PRCO_LAD2'] != null) {
  1243. $htmlReferences .='<td style="font-size: 8pt;">+'.$providerContacto['PRCO_LAD2'].' '.$providerContacto['PRCO_TEL2'].'</td>';
  1244. } else {
  1245. $htmlReferences .= '<td>-</td>';
  1246. }
  1247. // Correo 1
  1248. $htmlReferences .='<td style="font-size: 8pt;">'.$providerContacto['PRCO_COR1'].'</td>';
  1249. // Correo 2
  1250. if ($providerContacto['PRCO_COR2'] != null) {
  1251. $htmlReferences .='<td style="font-size: 8pt;">'.$providerContacto['PRCO_COR2'].'</td>';
  1252. } else {
  1253. $htmlReferences .= '<td>-</td>';
  1254. }
  1255. // Observaciones
  1256. if ($providerContacto['PRCO_OBSE'] != null) {
  1257. $htmlReferences .='<td style="font-size: 8pt;">'.$providerContacto['PRCO_OBSE'].'</td>';
  1258. } else {
  1259. $htmlReferences .= '<td>-</td>';
  1260. }
  1261. $htmlReferences .= '</tr>';
  1262. }
  1263. $htmlReferences .= '</tbody></table>';
  1264. $mpdf->WriteHTML($htmlReferences);
  1265. $mpdf->WriteHTML('<hr>');
  1266. $htmlReferences = '<b>Referencias del Proveedor</b><br>
  1267. <table border="1" style="margin-top: 12px;">
  1268. <thead>
  1269. <tr>
  1270. <th style="font-size: 8pt;">No</th>
  1271. <th style="font-size: 8pt;">Empresa</th>
  1272. <th style="font-size: 8pt;">Correo Electrónico</th>
  1273. <th style="font-size: 8pt;">Teléfono</th>
  1274. <th style="font-size: 8pt;">R.F.C.</th>
  1275. <th style="font-size: 8pt;">Dirección</th>
  1276. </tr>
  1277. </thead>
  1278. <tbody>';
  1279. foreach ($getProviderReferences as $key => $providerReferences) {
  1280. $htmlReferences .= '<tr>';
  1281. $htmlReferences .='<td style="font-size: 8pt;">'.$providerReferences['PRRE_IDRE'].'</td>';
  1282. $htmlReferences .='<td style="font-size: 8pt;">'.$providerReferences['PRRE_EMPR'].'</td>';
  1283. $htmlReferences .='<td style="font-size: 8pt;">'.$providerReferences['PRRE_CORR'].'</td>';
  1284. $htmlReferences .='<td style="font-size: 8pt;">+'.$providerReferences['PRRE_LADA'].' '.$providerReferences['PRRE_TELE'].'</td>';
  1285. $htmlReferences .='<td style="font-size: 8pt;">'.$providerReferences['PRRE_XRFC'].'</td>';
  1286. $htmlReferences .='<td style="font-size: 8pt;">'.$providerReferences['PRRE_DIRE'].'</td>';
  1287. $htmlReferences .= '</tr>';
  1288. }
  1289. $htmlReferences .= '</tbody></table>';
  1290. $mpdf->WriteHTML($htmlReferences);
  1291. $mpdf->WriteHTML('<hr>');
  1292. $htmlCondition = '<b>Condiciones del Proveedor</b><br>';
  1293. foreach ($getProviderCondiciones as $key => $providerCondiciones) {
  1294. $htmlCondition .= '<b>Tipo de Condición</b>: '.$providerCondiciones['PRCN_TIPO'];
  1295. $htmlCondition .= '<p>'.$providerCondiciones['PRCN_INFO'].'</p>';
  1296. }
  1297. $mpdf->WriteHTML($htmlCondition);
  1298. $contentFile = $mpdf->Output('', "S");
  1299. $base64File = base64_encode($contentFile);
  1300. try {
  1301. $arrResponse = $this->resourcesController->saveDocument($base64File, 'GEAD','FICHA_PROVEEDOR_'.$provider.'.pdf','IN',$line);
  1302. } catch (\Throwable $th) {
  1303. return $this->responseController->makeResponse(true, "ERR_GENERATE_SHEET_REG008: Ocurrió un error al obtener la información.", $th->getMessage(), 500);
  1304. }
  1305. if ($arrResponse['error']) {
  1306. return $this->responseController->makeResponse(true, "ERR_GENERATE_SHEET_REG009: Ocurrió un error al obtener la información.", [], 500);
  1307. }
  1308. try {
  1309. $validateInsert = DB::table('S002V01TPRDO')->insert([
  1310. 'PRDO_NUPR' => $provider,
  1311. 'PRDO_CODU' => $arrResponse['response'],
  1312. 'PRDO_DESC' => 'Ficha',
  1313. 'PRDO_TIPO' => 'IN',
  1314. 'PRDO_NULI' => $line,
  1315. 'PRDO_USRE' => $user,
  1316. 'PRDO_FERE' => Carbon::now()->timezone('America/Mazatlan')->toDateTimeString(),
  1317. 'PRDO_FEAR' => DB::raw('CURRENT_TIMESTAMP'),
  1318. ]);
  1319. } catch (\Throwable $th) {
  1320. return $this->responseController->makeResponse(true, "ERR_GENERATE_SHEET_REG010: Ocurrió un error al ingresar la ficha.", $th->getMessage(), 500);
  1321. }
  1322. if (!$validateInsert) {
  1323. return $this->responseController->makeResponse(true, "ERR_GENERATE_SHEET_REG011: No se pudo ingresar la ficha.", [], 500);
  1324. }
  1325. return $this->responseController->makeResponse(false, "ÉXITO: Ficha Exitosa", $arrResponse['response']);
  1326. }
  1327. public function getArtitlesByProvider($encProvider, $line) {
  1328. DB::beginTransaction();
  1329. // Se obtiene el número del proveedor
  1330. try {
  1331. $provider = $this->encController->decrypt($encProvider);
  1332. } catch (\Throwable $th) {
  1333. DB::rollBack();
  1334. return $this->responseController->makeResponse(true, "ERR_ARTITLES_PROVIDER_GET000: Ocurrió un error al obtener el número del proveedor.", $th->getMessage(), 500);
  1335. }
  1336. // Verifica su existe el proveedor
  1337. try {
  1338. $validateExist = DB::table('S002V01TPROV')
  1339. ->where('PROV_NUPR', '=', $provider)
  1340. ->where('PROV_NULI', '=', $line)
  1341. ->exists();
  1342. } catch (\Throwable $th) {
  1343. DB::rollBack();
  1344. return $this->responseController->makeResponse(true, "ERR_ARTITLES_PROVIDER_GET001: Ocurrió un error al identificar el proveedor.", $th->getMessage(), 500);
  1345. }
  1346. // Valida si existe el proveedor
  1347. if (!$validateExist) {
  1348. DB::rollBack();
  1349. return $this->responseController->makeResponse(true, "ERR_ARTITLES_PROVIDER_GET002: El proveedor no existe", [], 500);
  1350. }
  1351. // Obtiene todos las descripciones de los artículos del proveedor
  1352. try {
  1353. $getDescriptionArtitles = DB::table('S002V01TDEAR')
  1354. ->where('DEAR_NUPR', '=', $provider)
  1355. ->where('DEAR_NULI', '=', $line)
  1356. ->where('DEAR_ESTA', '=', 'Activo')
  1357. ->get([
  1358. 'DEAR_IDDE', # Identificador de la descripción
  1359. 'DEAR_IMAG', # Imagenes de los artículos
  1360. 'DEAR_DESC', # Descripción del artículo
  1361. 'DEAR_CARA', # Características del artículo
  1362. 'DEAR_COWE', # Compra web
  1363. 'DEAR_IDUN', # Identificador del tipo de unidad
  1364. 'DEAR_IDAR', # Identificador del artículo principal
  1365. 'DEAR_USRE', # Usuario de registro
  1366. 'DEAR_FERE', # Fecha de registro
  1367. 'DEAR_USMO', # Usuario de modificación
  1368. 'DEAR_FEMO', # Fecha de modificación
  1369. ]);
  1370. } catch (\Throwable $th) {
  1371. DB::rollBack();
  1372. return $this->responseController->makeResponse(true, "ERR_ARTITLES_PROVIDER_GET003: El proveedor no existe", $th->getMessage(), 500);
  1373. }
  1374. // El resultado pasa a ser un arreglo
  1375. $arrDescriptionArtitles = json_decode(json_encode($getDescriptionArtitles), true);
  1376. $arrDescription = array();
  1377. foreach ($arrDescriptionArtitles as $keyDescription => $descriptionArtitle) {
  1378. // Obtiene las imagenes y las pasa a un arreglo
  1379. $descriptionArtitle['DEAR_IMAG'] = json_decode($descriptionArtitle['DEAR_IMAG']);
  1380. $descriptionArtitle['DEAR_IMAG'] = json_decode($descriptionArtitle['DEAR_IMAG']);
  1381. // Obtiene la información principal del artículo
  1382. try {
  1383. $objArtitle = DB::table('S002V01TARTI')
  1384. ->where('ARTI_IDAR', '=', $descriptionArtitle['DEAR_IDAR'])
  1385. ->where('ARTI_NULI', '=', $line)
  1386. ->where('ARTI_ESTA', '=', 'Activo')
  1387. ->join('S002V01TFAMI', 'ARTI_IDFA', '=', 'FAMI_IDFA')
  1388. ->join('S002V01TSUBF', 'ARTI_IDSU', '=', 'SUBF_IDSU')
  1389. ->first([
  1390. 'ARTI_IDAR', # Identificador del artículo
  1391. 'ARTI_IDFA', # Identificador de la familia del artículo
  1392. 'FAMI_NOMB', # Nombre de la familia del artículo
  1393. 'ARTI_IDSU', # Identificador de la subfamilia del artículo
  1394. 'SUBF_NOMB', # Nombre de la subfamilia del artículo
  1395. 'ARTI_CODI', # Código de barras del artículo
  1396. 'ARTI_NOMB', # Nombre principal del artículo
  1397. // 'ARTI_USRE', # Usuario de registro
  1398. // 'ARTI_FERE', # Fecha de registro
  1399. // 'ARTI_USMO', # Usuario de modificación
  1400. // 'ARTI_FEMO', # Fecha de modificación
  1401. ]);
  1402. } catch (\Throwable $th) {
  1403. DB::rollBack();
  1404. return $this->responseController->makeResponse(true, "ERR_ARTITLES_PROVIDER_GET004: Ocurrió un error al obtener la información del artículo.", $th->getMessage(), 500);
  1405. }
  1406. // La información es guardada en el arreglo de respuesta
  1407. foreach ($objArtitle as $keyArtitle => $artitle) {
  1408. $descriptionArtitle[$keyArtitle] = $artitle;
  1409. }
  1410. // Se obtiene la unidad del artículo
  1411. try {
  1412. $objUnit = DB::table('S002V01TUNID')
  1413. ->where('UNID_IDUN', '=', $descriptionArtitle['DEAR_IDUN'])
  1414. ->where('UNID_NULI', '=', $line)
  1415. ->where('UNID_ESTA', '=', 'Activo')
  1416. ->first([
  1417. 'UNID_IDUN', # Identificador de la unidad
  1418. 'UNID_NOMB', # Nombre de la unidad
  1419. 'UNID_ACRO', # Acrónimo de la unidad
  1420. 'UNID_USRE', # Usuario de registro
  1421. 'UNID_FERE', # Fecha de registro
  1422. 'UNID_USMO', # Usuario de modificación
  1423. 'UNID_FEMO', # Fecha de modificación
  1424. ]);
  1425. } catch (\Throwable $th) {
  1426. DB::rollBack();
  1427. return $this->responseController->makeResponse(true, "ERR_ARTITLES_PROVIDER_GET005: Ocurrió un error al obtener el tipo de unidad.", $th->getMessage(), 500);
  1428. }
  1429. // La información es guardada en el arreglo de respuesta
  1430. $descriptionArtitle['DEAR_IDUN'] = $objUnit;
  1431. // Se obtienen los detalles de la descripción
  1432. try {
  1433. $getDetailsDescription = DB::table('S002V01TINAR')
  1434. ->where('INAR_IDDE', '=', $descriptionArtitle['DEAR_IDDE'])
  1435. ->where('INAR_NULI', '=', $line)
  1436. ->where('INAR_ESTA', '=', 'Activo')
  1437. ->get([
  1438. 'INAR_IDIN', # Identificador de los detalles
  1439. 'INAR_CODI', # Código del artículo
  1440. 'INAR_MODE', # Módelo del artículo
  1441. 'INAR_MONE', # Tipo de moneda
  1442. 'INAR_PREC', # Precio unitario del artículo
  1443. 'INAR_MOMI', # Mónto mínimo
  1444. 'INAR_CARA', # Características
  1445. 'INAR_USRE', # Usuario de registro
  1446. 'INAR_FERE', # Fecha de registro
  1447. 'INAR_USMO', # Usuario de modificación
  1448. 'INAR_FEMO', # Fecha de modificación
  1449. ]);
  1450. } catch (\Throwable $th) {
  1451. DB::rollBack();
  1452. return $this->responseController->makeResponse(true, "ERR_ARTITLES_PROVIDER_GET007: Ocurrió un error al obtener los detalles de la descripción del artículo.", $th->getMessage(), 500);
  1453. }
  1454. // La información es guardada en el arreglo de respuesta
  1455. $descriptionArtitle['DETAILS'] = $getDetailsDescription;
  1456. // Se almacen el arreglo de respuesta en el arreglo principal
  1457. $arrDescription[] = $descriptionArtitle;
  1458. }
  1459. DB::commit(); # Para guardar los cambios en la base de datos
  1460. return $this->responseController->makeResponse(false, "ÉXITO: Consulta exitosa", $arrDescription);
  1461. }
  1462. public function downloadArtitlesByProvider(Request $request) {
  1463. $validator = Validator::make($request->all(), [
  1464. 'PROVIDER' => 'required|string',
  1465. 'USER' => 'required|string',
  1466. 'LINE_NUMBER' => 'required|string',
  1467. 'DOWNLOAD' => 'required|array',
  1468. ]);
  1469. if ($validator->fails()) {
  1470. return $this->responseController->makeResponse(
  1471. true,
  1472. "ERR_DOWNLOAD_ARTITLE_DOW000: Se encontraron uno o más errores.",
  1473. $this->responseController->makeErrors($validator->errors()->messages()),
  1474. 401
  1475. );
  1476. }
  1477. $responseData = $request->all();
  1478. try {
  1479. $user = $this->encController->decrypt($responseData['USER']);
  1480. } catch (\Throwable $th) {
  1481. DB::rollBack();
  1482. return $this->responseController->makeResponse(true, "ERR_DOWNLOAD_ARTITLE_DOW001: No se pudo obtener los datos del usuario", $th->getMessage(), 500);
  1483. }
  1484. // Verifica su existe el proveedor
  1485. try {
  1486. $validateExist = DB::table('S002V01TPROV')->where('PROV_NUPR', '=', $responseData['PROVIDER'])->where('PROV_NULI', '=', $responseData['LINE_NUMBER'])->exists();
  1487. } catch (\Throwable $th) {
  1488. DB::rollBack();
  1489. return $this->responseController->makeResponse(true, "ERR_DOWNLOAD_ARTITLE_DOW002: Ocurrió un error al identificar el proveedor.", $th->getMessage(), 500);
  1490. }
  1491. // Valida si existe el proveedor
  1492. if (!$validateExist) {
  1493. DB::rollBack();
  1494. return $this->responseController->makeResponse(true, "ERR_DOWNLOAD_ARTITLE_DOW003: El proveedor no existe", [], 500);
  1495. }
  1496. $arrDescriptionId = $responseData['DOWNLOAD'];
  1497. $arrDataArtitles = array();
  1498. foreach ($arrDescriptionId as $keyId => $idDescription) {
  1499. // Obtiene todos las descripciones de los artículos del proveedor
  1500. try {
  1501. $getDescriptionArtitles = DB::table('S002V01TDEAR')
  1502. ->where('DEAR_IDDE', '=', $idDescription)
  1503. ->where('DEAR_NUPR', '=', $responseData['PROVIDER'])
  1504. ->where('DEAR_NULI', '=', $responseData['LINE_NUMBER'])
  1505. ->where('DEAR_ESTA', '=', 'Activo')
  1506. ->first([
  1507. 'DEAR_IDDE', # Identificador de la descripción
  1508. 'DEAR_IMAG', # Imagenes de los artículos
  1509. 'DEAR_DESC', # Descripción del artículo
  1510. 'DEAR_CARA', # Características del artículo
  1511. 'DEAR_COWE', # Compra web
  1512. 'DEAR_IDUN', # Identificador del tipo de unidad
  1513. 'DEAR_IDAR', # Identificador del artículo principal
  1514. 'DEAR_USRE', # Usuario de registro
  1515. 'DEAR_FERE', # Fecha de registro
  1516. 'DEAR_USMO', # Usuario de modificación
  1517. 'DEAR_FEMO', # Fecha de modificación
  1518. ]);
  1519. } catch (\Throwable $th) {
  1520. DB::rollBack();
  1521. return $this->responseController->makeResponse(true, "ERR_DOWNLOAD_ARTITLE_DOW004: El proveedor no existe", $th->getMessage(), 500);
  1522. }
  1523. $arrDescriptionArtitles = (array) $getDescriptionArtitles;
  1524. // Obtiene la información principal del artículo
  1525. try {
  1526. $objArtitle = DB::table('S002V01TARTI')
  1527. ->where('ARTI_IDAR', '=', $arrDescriptionArtitles['DEAR_IDAR'])
  1528. ->where('ARTI_NULI', '=', $responseData['LINE_NUMBER'])
  1529. ->where('ARTI_ESTA', '=', 'Activo')
  1530. ->join('S002V01TFAMI', 'ARTI_IDFA', '=', 'FAMI_IDFA')
  1531. ->join('S002V01TSUBF', 'ARTI_IDSU', '=', 'SUBF_IDSU')
  1532. ->first([
  1533. 'ARTI_IDAR', # Identificador del artículo
  1534. 'ARTI_IDFA', # Identificador de la familia del artículo
  1535. 'FAMI_NOMB', # Nombre de la familia del artículo
  1536. 'ARTI_IDSU', # Identificador de la subfamilia del artículo
  1537. 'SUBF_NOMB', # Nombre de la subfamilia del artículo
  1538. 'ARTI_CODI', # Código de barras del artículo
  1539. 'ARTI_NOMB', # Nombre principal del artículo
  1540. ]);
  1541. } catch (\Throwable $th) {
  1542. DB::rollBack();
  1543. return $this->responseController->makeResponse(true, "ERR_DOWNLOAD_ARTITLE_DOW005: Ocurrió un error al obtener la información del artículo.", $th->getMessage(), 500);
  1544. }
  1545. $objArtitle = (array) $objArtitle;
  1546. // La información es guardada en el arreglo de respuesta
  1547. foreach ($objArtitle as $keyArtitle => $artitle) {
  1548. $arrDescriptionArtitles[$keyArtitle] = $artitle;
  1549. }
  1550. // Se obtiene la unidad del artículo
  1551. try {
  1552. $objUnit = DB::table('S002V01TUNID')
  1553. ->where('UNID_IDUN', '=', $arrDescriptionArtitles['DEAR_IDUN'])
  1554. ->where('UNID_NULI', '=', $responseData['LINE_NUMBER'])
  1555. ->where('UNID_ESTA', '=', 'Activo')
  1556. ->first([
  1557. 'UNID_IDUN', # Identificador de la unidad
  1558. 'UNID_NOMB', # Nombre de la unidad
  1559. 'UNID_ACRO', # Acrónimo de la unidad
  1560. ]);
  1561. } catch (\Throwable $th) {
  1562. DB::rollBack();
  1563. return $this->responseController->makeResponse(true, "ERR_DOWNLOAD_ARTITLE_DOW006: Ocurrió un error al obtener el tipo de unidad.", $th->getMessage(), 500);
  1564. }
  1565. // La información es guardada en el arreglo de respuesta
  1566. $arrDescriptionArtitles['DEAR_IDUN'] = $objUnit;
  1567. // Se obtienen los detalles de la descripción
  1568. try {
  1569. $getDetailsDescription = DB::table('S002V01TINAR')
  1570. ->where('INAR_IDDE', '=', $idDescription)
  1571. ->where('INAR_NULI', '=', $responseData['LINE_NUMBER'])
  1572. ->where('INAR_ESTA', '=', 'Activo')
  1573. ->get([
  1574. 'INAR_IDIN', # Identificador de los detalles
  1575. 'INAR_CODI', # Código del artículo
  1576. 'INAR_MODE', # Módelo del artículo
  1577. 'INAR_MONE', # Tipo de moneda
  1578. 'INAR_PREC', # Precio unitario del artículo
  1579. 'INAR_MOMI', # Mónto mínimo
  1580. 'INAR_CARA', # Características
  1581. 'INAR_USRE', # Usuario de registro
  1582. 'INAR_FERE', # Fecha de registro
  1583. 'INAR_USMO', # Usuario de modificación
  1584. 'INAR_FEMO', # Fecha de modificación
  1585. ]);
  1586. } catch (\Throwable $th) {
  1587. DB::rollBack();
  1588. return $this->responseController->makeResponse(true, "ERR_DOWNLOAD_ARTITLE_DOW007: Ocurrió un error al obtener los detalles de la descripción del artículo.", $th->getMessage(), 500);
  1589. }
  1590. $arrDetailsDescription = json_decode(json_encode($getDetailsDescription), true);
  1591. $arrDescriptionArtitles['DETAILS'] = $arrDetailsDescription;
  1592. $arrDataArtitles[] = $arrDescriptionArtitles;
  1593. }
  1594. // Se inicializa el nombre del documento
  1595. $nameDocument = "CONTENT_ARTITLE_BY_".$responseData['PROVIDER'].".xlsx";
  1596. // Se crea el documento y se obtiene el base64 del documento
  1597. $base64Document = $this->createDocument($arrDataArtitles);
  1598. // Se guarda el documento y se genera el código del documento
  1599. $arrResponseDocument = $this->resourcesController->saveDocument($base64Document, 'GEAD', $nameDocument, 'IN', $responseData['LINE_NUMBER']);
  1600. if ( $arrResponseDocument['error'] ) {
  1601. DB::rollBack();
  1602. return $this->responseController->makeResponse(true, 'ERR_DOWNLOAD_ARTITLE_DOW008:'.$arrResponseDocument['msg'], $arrResponseDocument['response'], 500);
  1603. }
  1604. // Se obtiene el código del documento
  1605. $codeDocument = $arrResponseDocument['response'];
  1606. try {
  1607. $validaeInsert = DB::table('S002V01TPRDO')->insert([
  1608. 'PRDO_NUPR' => $responseData['PROVIDER'],
  1609. 'PRDO_CODU' => $codeDocument,
  1610. 'PRDO_TIPO' => 'IN',
  1611. 'PRDO_DESC' => 'GENERACIÓN DE DOCUMENTO DE ARTÍCULOS POR PROVEEDOR',
  1612. 'PRDO_NULI' => $responseData['LINE_NUMBER'],
  1613. 'PRDO_USRE' => $user,
  1614. 'PRDO_FERE' => Carbon::now()->timezone('America/Mazatlan')->toDateTimeString(),
  1615. 'PRDO_FEAR' => DB::raw('CURRENT_TIMESTAMP'),
  1616. ]);
  1617. } catch (\Throwable $th) {
  1618. DB::rollBack();
  1619. return $this->responseController->makeResponse(true, "ERR_DOWNLOAD_ARTITLE_DOW009: Ocurrió un error al registrar el documento.", $th->getMessage(), 500);
  1620. }
  1621. if (!$validaeInsert) {
  1622. DB::rollBack();
  1623. return $this->responseController->makeResponse(true, "ERR_DOWNLOAD_ARTITLE_DOW010: No se pudo registrar el documento en la base de datos", [], 500);
  1624. }
  1625. DB::commit(); # Para guardar los cambios en la base de datos
  1626. return $this->responseController->makeResponse(false, "ÉXITO: Se genero correctamente.", $codeDocument);
  1627. }
  1628. public function uploadArtitlesByProvider(Request $request) {
  1629. $validator = Validator::make($request->all(), [
  1630. 'PROVIDER' => 'required|string',
  1631. 'USER' => 'required|string',
  1632. 'LINE_NUMBER' => 'required|string',
  1633. 'DOCUMENT' => 'required|string',
  1634. ]);
  1635. if ($validator->fails()) {
  1636. return $this->responseController->makeResponse(
  1637. true,
  1638. "ERR_UPLOAD_ARTITLE_UPL000: Se encontraron uno o más errores.",
  1639. $this->responseController->makeErrors($validator->errors()->messages()),
  1640. 401
  1641. );
  1642. }
  1643. DB::beginTransaction();
  1644. $responseData = $request->all();
  1645. try {
  1646. $user = $this->encController->decrypt($responseData['USER']);
  1647. } catch (\Throwable $th) {
  1648. DB::rollBack();
  1649. return $this->responseController->makeResponse(true, "ERR_UPLOAD_ARTITLE_UPL001: No se pudo obtener los datos del usuario", $th->getMessage(), 500);
  1650. }
  1651. $nameDocument = "UPLOAD_".$responseData['PROVIDER']."_".date('YmdHms').".xlsx";
  1652. // Se guarda el documento y se genera el código del documento
  1653. $arrResponseDocument = $this->resourcesController->saveDocument($responseData['DOCUMENT'], 'GEAD', $nameDocument, 'IN', $responseData['LINE_NUMBER']);
  1654. if ( $arrResponseDocument['error'] ) {
  1655. DB::rollBack();
  1656. return $this->responseController->makeResponse(true, 'ERR_UPLOAD_ARTITLE_UPL002:'.$arrResponseDocument['msg'], $arrResponseDocument['response'], 500);
  1657. }
  1658. // Se obtiene el código del documento
  1659. $codeDocument = $arrResponseDocument['response'];
  1660. // Se obtiene la ruta en donde se guardará el archivo
  1661. $routeSaveDocument = "/app/public/GEAD/";
  1662. // Se obtiene la ruta completa del archivo a guardar
  1663. $pathRoute = storage_path().$routeSaveDocument.$codeDocument;
  1664. if(!file_exists($pathRoute)){
  1665. DB::rollBack();
  1666. return $this->responseController->makeResponse(true, "ERR_UPLOAD_ARTITLE_UPL003: No se pudo obtener el documento.", [], 500);
  1667. }
  1668. $reader = new \PhpOffice\PhpSpreadsheet\Reader\Xlsx;
  1669. $spreadsheet = $reader->load($pathRoute);
  1670. $sheet = $spreadsheet->getSheetByName('ART');
  1671. $maxRow = $sheet->getHighestRow();
  1672. $maxColumn = $sheet->getHighestColumn();
  1673. try {
  1674. $arrDataArtitle = array();
  1675. for ($positionRow=2; $positionRow <= $maxRow; $positionRow++) {
  1676. $arrContentRow = array();
  1677. for ($positionColumn = 0; $positionColumn <= array_search($maxColumn, $this->arrAlphabet); $positionColumn++) {
  1678. $data = $sheet->getCell($this->arrAlphabet[$positionColumn].$positionRow)->getValue();
  1679. // $code = $this->arrHeader[array_search($this->arrAlphabet[$positionColumn], $this->arrAlphabet)]['CODE'];
  1680. $infoHeader = $this->arrHeader[array_search($this->arrAlphabet[$positionColumn], $this->arrAlphabet)];
  1681. $data = trim($data);
  1682. if ($data == '' && $infoHeader['OBLIGATORY']) {
  1683. $position = $this->arrAlphabet[$positionColumn].$positionRow;
  1684. return $this->responseController->makeResponse(true, 'ERR_UPLOAD_ARTITLE_UPL004: El campo "'.$position.'" de la hoja ART es obligatorio.', [], 500);
  1685. } else if ($data == '') {
  1686. $data = null;
  1687. }
  1688. $arrContentRow[$infoHeader['CODE']] = $data;
  1689. }
  1690. $arrDataArtitle[] = $arrContentRow;
  1691. }
  1692. } catch (\Throwable $th) {
  1693. DB::rollBack();
  1694. return $this->responseController->makeResponse(true, "ERR_UPLOAD_ARTITLE_UPL005: No se pudieron obtener los datos. Verifique que el formato de su documento sea correcto.", $th->getMessage(), 500);
  1695. }
  1696. $arrIdDetails = array();
  1697. foreach ($arrDataArtitle as $keyArtitle => $artitle) {
  1698. foreach ($this->arrHeader as $keyHeader => $header) {
  1699. if (!array_key_exists($header['CODE'], $artitle)) {
  1700. DB::rollBack();
  1701. return $this->responseController->makeResponse(true, 'ERR_UPLOAD_ARTITLE_UPL006: El campo "'.$header['COLUMN'].'" no existe en los encabezados.', [], 500);
  1702. }
  1703. }
  1704. try {
  1705. $validateExistArtitle = DB::table('S002V01TARTI')
  1706. ->where('ARTI_IDAR', '=', $artitle['ARTI_IDAR'])
  1707. ->where('ARTI_NULI', '=', $responseData['LINE_NUMBER'])
  1708. ->where('ARTI_ESTA', '=', 'Activo')
  1709. ->exists();
  1710. } catch (\Throwable $th) {
  1711. DB::rollBack();
  1712. return $this->responseController->makeResponse(true, 'ERR_UPLOAD_ARTITLE_UPL007: Ocurrió un error al validar los artículos', $th->getMessage(), 500);
  1713. }
  1714. if (!$validateExistArtitle) {
  1715. DB::rollBack();
  1716. return $this->responseController->makeResponse(true, 'ERR_UPLOAD_ARTITLE_UPL008: El artículo con el número '.$artitle['ARTI_IDAR'].' no existe.', [], 500);
  1717. }
  1718. try {
  1719. $validateExistDetails = (array) DB::table('S002V01TDEAR')
  1720. ->where('DEAR_IDAR', '=', $artitle['ARTI_IDAR'])
  1721. ->where('DEAR_NUPR', '=', $responseData['PROVIDER'])
  1722. ->where('DEAR_ESTA', '=', 'Activo')
  1723. ->exists();
  1724. } catch (\Throwable $th) {
  1725. DB::rollBack();
  1726. return $this->responseController->makeResponse(true, 'ERR_UPLOAD_ARTITLE_UPL009: Ocurrió un error al validar la descripción', $th->getMessage(), 500);
  1727. }
  1728. if (!$validateExistDetails) {
  1729. DB::rollBack();
  1730. return $this->responseController->makeResponse(true, 'ERR_UPLOAD_ARTITLE_UPL010: La descripción del artículo no pudo ser encontrada.', [], 500);
  1731. }
  1732. // $arrIdDetails[] = $arrDescription['DEAR_IDDE'];
  1733. try {
  1734. $arrFamily = (array) DB::table('S002V01TFAMI')
  1735. ->where('FAMI_NULI', '=', $responseData['LINE_NUMBER'])
  1736. ->where('FAMI_ESTA', '=', 'Activo')
  1737. ->where('FAMI_NOMB', '=', $artitle['FAMI_NOMB'])
  1738. ->first();
  1739. } catch (\Throwable $th) {
  1740. DB::rollBack();
  1741. return $this->responseController->makeResponse(true, 'ERR_UPLOAD_ARTITLE_UPL011: Ocurrió un error al validar la descripción.', $th->getMessage(), 500);
  1742. }
  1743. if (count($arrFamily) == 0) {
  1744. DB::rollBack();
  1745. $indexHeader = array_search('FAMI_NOMB', array_column($this->arrHeader, 'CODE'));
  1746. $header = $this->arrHeader[$indexHeader]['COLUMN'];
  1747. return $this->responseController->makeResponse(true, 'ERR_UPLOAD_ARTITLE_UPL012: El valor del campo "'.$header.'" no es válido.', [], 500);
  1748. }
  1749. try {
  1750. $arrSubfamily = (array) DB::table('S002V01TSUBF')
  1751. ->where('SUBF_NULI', '=', $responseData['LINE_NUMBER'])
  1752. ->where('SUBF_ESTA', '=', 'Activo')
  1753. ->where('SUBF_NOMB', '=', $artitle['SUBF_NOMB'])
  1754. ->first();
  1755. } catch (\Throwable $th) {
  1756. DB::rollBack();
  1757. return $this->responseController->makeResponse(true, 'ERR_UPLOAD_ARTITLE_UPL013: Ocurrió un error al validar la descripción.', $th->getMessage(), 500);
  1758. }
  1759. if (count($arrSubfamily) == 0) {
  1760. DB::rollBack();
  1761. $indexHeader = array_search('SUBF_NOMB', array_column($this->arrHeader, 'CODE'));
  1762. $header = $this->arrHeader[$indexHeader]['COLUMN'];
  1763. return $this->responseController->makeResponse(true, 'ERR_UPLOAD_ARTITLE_UPL014: El valor del campo "'.$header.'" no es válido.', [], 500);
  1764. }
  1765. try {
  1766. $validateUpdate = DB::table('S002V01TARTI')
  1767. ->where('ARTI_IDAR', '=', $artitle['ARTI_IDAR'])
  1768. ->where('ARTI_NULI', '=', $responseData['LINE_NUMBER'])
  1769. ->update([
  1770. 'ARTI_IDFA' => $arrFamily['FAMI_IDFA'],
  1771. 'ARTI_IDSU' => $arrSubfamily['SUBF_IDSU'],
  1772. 'ARTI_CODI' => $artitle['ARTI_CODI'],
  1773. 'ARTI_NOMB' => $artitle['ARTI_NOMB'],
  1774. 'ARTI_USMO' => $user,
  1775. 'ARTI_FEMO' => Carbon::now()->timezone('America/Mazatlan')->toDateTimeString(),
  1776. ]);
  1777. } catch (\Throwable $th) {
  1778. DB::rollBack();
  1779. return $this->responseController->makeResponse(true, 'ERR_UPLOAD_ARTITLE_UPL015: Ocurrió un error al actualizar los artículos.', $th->getMessage(), 500);
  1780. }
  1781. if (!$validateUpdate) {
  1782. DB::rollBack();
  1783. return $this->responseController->makeResponse(true, 'ERR_UPLOAD_ARTITLE_UPL016: No se pudieron actualizar los artículos.', [], 500);
  1784. }
  1785. if ($artitle['DEAR_COWE'] == 'Si') {
  1786. $webPurchase = 1;
  1787. }else if ($artitle['DEAR_COWE'] == 'No') {
  1788. $webPurchase = 0;
  1789. } else {
  1790. DB::rollBack();
  1791. $indexHeader = array_search('DEAR_COWE', array_column($this->arrHeader, 'CODE'));
  1792. $header = $this->arrHeader[$indexHeader]['COLUMN'];
  1793. return $this->responseController->makeResponse(true, 'ERR_UPLOAD_ARTITLE_UPL017: El valor del campo "'.$header.'" no es válido.', [], 500);
  1794. }
  1795. try {
  1796. $arrUnid = (array) DB::table('S002V01TUNID')
  1797. ->where('UNID_NULI', '=', $responseData['LINE_NUMBER'])
  1798. ->where('UNID_ESTA', '=', 'Activo')
  1799. ->where('UNID_NOMB', '=', $artitle['DEAR_IDUN'])
  1800. ->first();
  1801. } catch (\Throwable $th) {
  1802. DB::rollBack();
  1803. return $this->responseController->makeResponse(true, 'ERR_UPLOAD_ARTITLE_UPL018: Ocurrió un error al obtener las unidades.', $th->getMessage(), 500);
  1804. }
  1805. if (count($arrUnid) == 0) {
  1806. DB::rollBack();
  1807. $indexHeader = array_search('DEAR_IDUN', array_column($this->arrHeader, 'CODE'));
  1808. $header = $this->arrHeader[$indexHeader]['COLUMN'];
  1809. return $this->responseController->makeResponse(true, 'ERR_UPLOAD_ARTITLE_UPL019: El valor del campo "'.$header.'" no es válido.', [], 500);
  1810. }
  1811. try {
  1812. $validateUpdate = DB::table('S002V01TDEAR')
  1813. ->where('DEAR_NUPR', '=', $responseData['PROVIDER'])
  1814. ->where('DEAR_IDAR', '=', $artitle['ARTI_IDAR'])
  1815. ->where('DEAR_ESTA', '=', 'Activo')
  1816. ->where('DEAR_NULI', '=', $responseData['LINE_NUMBER'])
  1817. ->update([
  1818. 'DEAR_DESC' => $artitle['DEAR_DESC'],
  1819. 'DEAR_CARA' => $artitle['DEAR_CARA'],
  1820. 'DEAR_COWE' => $webPurchase,
  1821. 'DEAR_IDUN' => $arrUnid['UNID_IDUN'],
  1822. 'DEAR_USMO' => $user,
  1823. 'DEAR_FEMO' => Carbon::now()->timezone('America/Mazatlan')->toDateTimeString(),
  1824. 'DEAR_FEAR' => DB::raw('CURRENT_TIMESTAMP'),
  1825. ]);
  1826. } catch (\Throwable $th) {
  1827. DB::rollBack();
  1828. return $this->responseController->makeResponse(true, 'ERR_UPLOAD_ARTITLE_UPL020: Ocurrió un error al actualizar las descripciones de los artículos.', $th->getMessage(), 500);
  1829. }
  1830. if (!$validateUpdate) {
  1831. DB::rollBack();
  1832. return $this->responseController->makeResponse(true, 'ERR_UPLOAD_ARTITLE_UPL021: No se pudieron actualizar las descripciones de los.', [], 500);
  1833. }
  1834. $arrIdDetails[] = $artitle['ARTI_IDAR'];
  1835. }
  1836. foreach ($arrIdDetails as $idDetails) {
  1837. $readerDetails = new \PhpOffice\PhpSpreadsheet\Reader\Xlsx;
  1838. $spreadsheet = $readerDetails->load($pathRoute);
  1839. $sheet = $spreadsheet->getSheetByName('ARTDET-'.$idDetails);
  1840. $maxRow = $sheet->getHighestRow();
  1841. $maxColumn = $sheet->getHighestColumn();
  1842. try {
  1843. $arrDataDetails = array();
  1844. for ($positionRow=2; $positionRow <= $maxRow; $positionRow++) {
  1845. $arrContentRow = array();
  1846. for ($positionColumn = 0; $positionColumn <= array_search($maxColumn, $this->arrAlphabet); $positionColumn++) {
  1847. $data = $sheet->getCell($this->arrAlphabet[$positionColumn].$positionRow)->getValue();
  1848. $infoHeader = $this->arrHeaderDetails[array_search($this->arrAlphabet[$positionColumn], $this->arrAlphabet)];
  1849. $data = trim($data);
  1850. if ($data == '' && $infoHeader['OBLIGATORY']) {
  1851. $position = $this->arrAlphabet[$positionColumn].$positionRow;
  1852. return $this->responseController->makeResponse(true, 'ERR_UPLOAD_ARTITLE_UPL022: El campo "'.$position.'" de la hoja ARTDET-'.$idDetails.' es obligatorio.', [], 500);
  1853. } else if ($data == '') {
  1854. $data = null;
  1855. }
  1856. $arrContentRow[$infoHeader['CODE']] = $data;
  1857. }
  1858. $arrDataDetails[] = $arrContentRow;
  1859. }
  1860. } catch (\Throwable $th) {
  1861. DB::rollBack();
  1862. return $this->responseController->makeResponse(true, "ERR_UPLOAD_ARTITLE_UPL023: No se pudieron obtener los datos. Verifique que el formato de su documento sea correcto.", $th->getMessage(), 500);
  1863. }
  1864. foreach ($arrDataDetails as $keyDetails => $details) {
  1865. foreach ($this->arrHeaderDetails as $keyHeader => $header) {
  1866. if (!array_key_exists($header['CODE'], $details)) {
  1867. DB::rollBack();
  1868. return $this->responseController->makeResponse(true, 'ERR_UPLOAD_ARTITLE_UPL024: El campo "'.$header['COLUMN'].'" no existe en los encabezados.', [], 500);
  1869. }
  1870. }
  1871. try {
  1872. $validateDetails = DB::table('S002V01TINAR')
  1873. ->where('INAR_IDIN', '=', $details['INAR_IDIN'])
  1874. ->where('INAR_ESTA', '=', 'Activo')
  1875. ->where('INAR_NULI', '=', $responseData['LINE_NUMBER'])
  1876. ->exists();
  1877. } catch (\Throwable $th) {
  1878. DB::rollBack();
  1879. return $this->responseController->makeResponse(true, "ERR_UPLOAD_ARTITLE_UPL025: No se pudieron obtener los datos. Verifique que el formato de su documento sea correcto.", $th->getMessage(), 500);
  1880. }
  1881. if (!$validateDetails) {
  1882. DB::rollBack();
  1883. $indexHeader = array_search('INAR_IDIN', array_column($this->arrHeaderDetails, 'CODE'));
  1884. $header = $this->arrHeaderDetails[$indexHeader]['COLUMN'];
  1885. $position = $this->arrHeaderDetails[$indexHeader]['POSITION'];
  1886. $errorPosition = $position.$keyDetails+1;
  1887. return $this->responseController->makeResponse(true, 'ERR_UPLOAD_ARTITLE_UPL026: El valor del campo "'.$header.'" no es válido.', [], 500);
  1888. }
  1889. try {
  1890. $validateUpdate = DB::table('S002V01TINAR')
  1891. ->where('INAR_IDIN', '=', $details['INAR_IDIN'])
  1892. ->where('INAR_NULI', '=', $responseData['LINE_NUMBER'])
  1893. ->where('INAR_ESTA', '=', 'Activo')
  1894. ->update([
  1895. 'INAR_CODI' => $details['INAR_CODI'],
  1896. 'INAR_MODE' => $details['INAR_MODE'],
  1897. 'INAR_MONE' => $details['INAR_MONE'],
  1898. 'INAR_PREC' => $details['INAR_PREC'],
  1899. 'INAR_MOMI' => $details['INAR_MOMI'],
  1900. 'INAR_CARA' => $details['INAR_CARA'],
  1901. 'INAR_USMO' => $user,
  1902. 'INAR_FEMO' => Carbon::now()->timezone('America/Mazatlan')->toDateTimeString(),
  1903. 'INAR_FEAR' => DB::raw('CURRENT_TIMESTAMP'),
  1904. ]
  1905. );
  1906. } catch (\Throwable $th) {
  1907. DB::rollBack();
  1908. return $this->responseController->makeResponse(true, "ERR_UPLOAD_ARTITLE_UPL027: Ocurrió un error al actualizar los detalles del artículo.", $th->getMessage(), 500);
  1909. }
  1910. if (!$validateUpdate) {
  1911. DB::rollBack();
  1912. return $this->responseController->makeResponse(true, 'ERR_UPLOAD_ARTITLE_UPL028: No se pudo actualizar los detalles del artículo.', [], 500);
  1913. }
  1914. }
  1915. }
  1916. DB::commit();
  1917. return $this->responseController->makeResponse(false, "ÉXITO: Actualización Exitosa");
  1918. }
  1919. private function createDocument($arrDescription) {
  1920. // Se inicializa el archivo xlsx
  1921. $spreadsheet = new Spreadsheet();
  1922. // Se crea la primera hoja donde se encontraran todos los artículos del proveedor
  1923. $activeWorksheet = $spreadsheet->getActiveSheet()->setTitle("ART");
  1924. // Se colocan los encabezados de la tabla
  1925. $positionColumn = 0; # Posición de la columna (Empieza en 0 debído al arreglo del abecedario el cual corresponde a la letra A)
  1926. // Se itean la información del encabezado
  1927. foreach ($this->arrHeader as $keyArtitle => $header) {
  1928. // Se ingresa el encabezado en la hoja
  1929. $activeWorksheet->setCellValue($this->arrAlphabet[$positionColumn]."1", $header['COLUMN']);
  1930. // Se incrementa la posición para la siguiente columna
  1931. $positionColumn++;
  1932. }
  1933. // Se ingresa la información de los artículos
  1934. $positionRow = 2; # Posición de la fila (Empieza en 2 debído a que la posición 1 ya la tomó la información del encabezado)
  1935. // Se iteran los artículos del proveedor
  1936. foreach ($arrDescription as $keyDescription => $arrArtitle) {
  1937. $positionColumn = 0; # Siempre se inicializa en 0 por cada información de los artículos para que vuelva a comenzar en la columna A
  1938. // Se itera el objeto que tiene la información del artículo
  1939. foreach ($this->arrHeader as $keyHeader => $header) {
  1940. // Se verifica que el campo obtenido se encuentre en la lista del encabezado
  1941. // Se hace de esta manera para que se ordenen los campos de acuerdo al ordenamiento de los encabezados
  1942. if(array_key_exists($header['CODE'], $arrArtitle)){
  1943. if ($header['CODE'] == 'DEAR_COWE') {
  1944. $arrArtitle[$header['CODE']] = $arrArtitle[$header['CODE']] == 0 ? 'No':'Si';
  1945. }
  1946. if ($header['CODE'] == 'DEAR_IDUN') {
  1947. $arrArtitle[$header['CODE']] = $arrArtitle[$header['CODE']]->UNID_NOMB;
  1948. }
  1949. // Se ingresa la información
  1950. $activeWorksheet->setCellValue($this->arrAlphabet[$positionColumn].$positionRow, $arrArtitle[$header['CODE']]);
  1951. // Se incrementa la posición para la siguiente columna
  1952. $positionColumn++;
  1953. }
  1954. }
  1955. // Al terminar de procesar toda la información, la posición de la fila se incrementa para que pase a la siguiente fila
  1956. $positionRow++;
  1957. // Se verifica que la información obtenida tenga detalles
  1958. if (count($arrArtitle['DETAILS']) > 0) {
  1959. // En caso de ser verdadero, se crea una nueva hoja
  1960. $spreadsheet->createSheet();
  1961. // Se selecciona para trabajar ahora en esa hoja nueva
  1962. $spreadsheet->setActiveSheetIndex($keyDescription + 1);
  1963. // Se ingresa el nombre de la hoja, que es referente a su información perteneciente
  1964. $activeWorksheetDetails = $spreadsheet->getActiveSheet()->setTitle('ARTDET-'.$arrArtitle['ARTI_IDAR']);
  1965. // Se ingresan los encabezados en la nueva hoja
  1966. $positionColumnDetails = 0; # Posición de la columna de los detalles (Empieza en 0 debído al arreglo del abecedario el cual corresponde a la letra A)
  1967. // Se itean la información del encabezado de los detalles
  1968. foreach ($this->arrHeaderDetails as $keyHeaderDetails => $headerDetails) {
  1969. // Se ingresa el encabezado en la hoja de los detalles
  1970. $activeWorksheetDetails->setCellValue($this->arrAlphabet[$positionColumnDetails]."1", $headerDetails['COLUMN']);
  1971. // Se incrementa la posición para la siguiente columna de los detalles
  1972. $positionColumnDetails++;
  1973. }
  1974. // Se ingresa la información de los artículos
  1975. $positionRowDetails = 2; # Posición de la fila de los detalles (Empieza en 2 debído a que la posición 1 ya la tomó la información del encabezado de los detalles)
  1976. // Se itera el objeto que tiene la información del artículo
  1977. foreach ($arrArtitle['DETAILS'] as $key => $details) {
  1978. $positionColumnDetails = 0; # Siempre se inicializa en 0 por cada información de los detalles para que vuelva a comenzar en la columna A
  1979. // Se itera el objeto que tiene la información de los detalles
  1980. foreach ($this->arrHeaderDetails as $keyHeaderDetails => $headerDetails) {
  1981. // Se verifica que el campo obtenido se encuentre en la lista del encabezado de los detalles
  1982. // Se hace de esta manera para que se ordenen los campos de acuerdo al ordenamiento de los encabezados
  1983. if(array_key_exists($headerDetails['CODE'], $details)){
  1984. // Se ingresan los detalles
  1985. $activeWorksheetDetails->setCellValue($this->arrAlphabet[$positionColumnDetails].$positionRowDetails, $details[$headerDetails['CODE']]);
  1986. // Se incrementa la posición para la siguiente columna
  1987. $positionColumnDetails++;
  1988. }
  1989. }
  1990. // Al terminar de procesar toda la información, la posición de la fila se incrementa para que pase a la siguiente fila
  1991. $positionRowDetails++;
  1992. }
  1993. // Se inicializan las posiciones iniciales y finales
  1994. $inicialPositionDetails = "A1";
  1995. $finalPositionDetails = $this->arrAlphabet[$positionColumnDetails-1].$positionRowDetails-1;
  1996. // Se inicializa el formato de la tabla
  1997. $table = new Table("$inicialPositionDetails:$finalPositionDetails", 'Table'.$arrArtitle['ARTI_IDAR']);
  1998. // Se inicializa los estilos de la tabla
  1999. $tableStyle = new TableStyle();
  2000. // Se ingresa el tipo de tabla
  2001. $tableStyle->setTheme(TableStyle::TABLE_STYLE_MEDIUM10);
  2002. // Se ingresa el estilo en la tabla
  2003. $tableStyle->setShowRowStripes(true);
  2004. $table->setStyle($tableStyle);
  2005. $activeWorksheetDetails->addTable($table);
  2006. // Se ajustan las dimensiones de la hoja de detalles
  2007. $positionColumnDetails = 0; # Posición de la columna (Empieza en 0 debído al arreglo del abecedario el cual corresponde a la letra A)
  2008. // Se iteran la información del encabezado de los detalles
  2009. foreach ($this->arrHeaderDetails as $keyHeaderDetails => $headerDetails) {
  2010. if ($headerDetails['CODE'] == 'INAR_CARA') {
  2011. $activeWorksheetDetails->getColumnDimension($this->arrAlphabet[$positionColumnDetails])->setAutoSize(true);
  2012. $activeWorksheetDetails->getStyle($this->arrAlphabet[$positionColumnDetails])->getAlignment()->setWrapText(true);
  2013. } else {
  2014. $activeWorksheetDetails->getColumnDimension($this->arrAlphabet[$positionColumnDetails])->setAutoSize(true);
  2015. }
  2016. // Las columnas son auto ajustadas
  2017. // Se incrementa la posición para la siguiente columna
  2018. $positionColumnDetails++;
  2019. }
  2020. }
  2021. }
  2022. // Se inicializan las posiciones iniciales y finales
  2023. $inicialPosition = "A1";
  2024. $finalPosition = $this->arrAlphabet[$positionColumn-1].$positionRow-1;
  2025. // Se inicializa el formato de la tabla
  2026. $table = new Table("$inicialPosition:$finalPosition", 'Table1');
  2027. // Se inicializa los estilos de la tabla
  2028. $tableStyle = new TableStyle();
  2029. // Se ingresa el tipo de tabla
  2030. $tableStyle->setTheme(TableStyle::TABLE_STYLE_MEDIUM8);
  2031. // Se ingresa el estilo en la tabla
  2032. $tableStyle->setShowRowStripes(true);
  2033. $table->setStyle($tableStyle);
  2034. $activeWorksheet->addTable($table);
  2035. // Se ajustan las dimensiones de la hoja de los artículos
  2036. $positionColumn = 0; # Posición de la columna (Empieza en 0 debído al arreglo del abecedario el cual corresponde a la letra A)
  2037. // Se iteran la información del encabezado
  2038. foreach ($this->arrHeader as $keyHeader => $header) {
  2039. if ($header['CODE'] == 'DEAR_DESC' || $header['CODE'] == 'DEAR_CARA') {
  2040. // Si se obtienen las siguientes columnas, entonces tendrá 40 de dimensión
  2041. $activeWorksheet->getColumnDimension($this->arrAlphabet[$positionColumn])->setWidth(40);
  2042. $activeWorksheet->getStyle($this->arrAlphabet[$positionColumn])->getAlignment()->setWrapText(true);
  2043. } else {
  2044. // Las columnas son auto ajustadas
  2045. $activeWorksheet->getColumnDimension($this->arrAlphabet[$positionColumn])->setAutoSize(true);
  2046. }
  2047. // Se incrementa la posición para la siguiente columna
  2048. $positionColumn++;
  2049. }
  2050. $writer = new Xlsx($spreadsheet);
  2051. ob_start();
  2052. $writer->save('php://output');
  2053. $base64 = base64_encode(ob_get_clean());
  2054. return $base64;
  2055. // $validate = \File::put( storage_path() . '/test.xlsx', base64_decode($base64) );
  2056. }
  2057. }